Merge branch 'master' into batch-updates

This commit is contained in:
Antonio Scandurra
2015-02-27 12:46:25 +01:00
12 changed files with 137 additions and 51 deletions

View File

@@ -73,7 +73,7 @@ class Atom extends Model
# Loads and returns the serialized state corresponding to this window
# if it exists; otherwise returns undefined.
@loadState: (mode) ->
statePath = @getStatePath(mode)
statePath = @getStatePath(@getLoadSettings().initialPaths, mode)
if fs.existsSync(statePath)
try
@@ -90,14 +90,13 @@ class Atom extends Model
# Returns the path where the state for the current window will be
# located if it exists.
@getStatePath: (mode) ->
@getStatePath: (paths, mode) ->
switch mode
when 'spec'
filename = 'spec'
when 'editor'
{initialPaths} = @getLoadSettings()
if initialPaths?.length > 0
sha1 = crypto.createHash('sha1').update(initialPaths.join("\n")).digest('hex')
if paths?.length > 0
sha1 = crypto.createHash('sha1').update(paths.slice().sort().join("\n")).digest('hex')
filename = "editor-#{sha1}"
if filename
@@ -773,7 +772,7 @@ class Atom extends Model
saveSync: ->
stateString = JSON.stringify(@state)
if statePath = @constructor.getStatePath(@mode)
if statePath = @constructor.getStatePath(@project?.getPaths(), @mode)
fs.writeFileSync(statePath, stateString, 'utf8')
else
@getCurrentWindow().loadSettings.windowState = stateString

View File

@@ -22,6 +22,7 @@ class AutoUpdateManager
# https://github.com/Squirrel/Squirrel.Windows/issues/132
@feedUrl = 'https://atom.io/api/updates'
else
@iconPath = path.resolve(__dirname, '..', '..', 'resources', 'atom.png')
@feedUrl = "https://atom.io/api/updates?version=#{@version}"
process.nextTick => @setupAutoUpdater()
@@ -89,7 +90,7 @@ class AutoUpdateManager
dialog.showMessageBox
type: 'info'
buttons: ['OK']
icon: path.resolve(__dirname, '..', '..', 'resources', 'atom.png')
icon: @iconPath
message: 'No update available.'
title: 'No Update Available'
detail: "Version #{@version} is the latest version."
@@ -100,7 +101,7 @@ class AutoUpdateManager
dialog.showMessageBox
type: 'warning'
buttons: ['OK']
icon: path.resolve(__dirname, '..', '..', 'resources', 'atom.png')
icon: @iconPath
message: 'There was an error checking for updates.'
title: 'Update Error'
detail: message

View File

@@ -13,12 +13,12 @@ class CursorsComponent
@oldState ?= {cursors: {}}
# update blink class
if newState.blinkCursorsOff isnt @oldState.blinkCursorsOff
if newState.blinkCursorsOff
@domNode.classList.add 'blink-off'
else
if newState.cursorsVisible isnt @oldState.cursorsVisible
if newState.cursorsVisible
@domNode.classList.remove 'blink-off'
@oldState.blinkCursorsOff = newState.blinkCursorsOff
else
@domNode.classList.add 'blink-off'
@oldState.cursorsVisible = newState.cursorsVisible
# remove cursors
for id of @oldState.cursors

View File

@@ -458,7 +458,7 @@ class DisplayBuffer extends Model
width = @width ? @getScrollWidth()
width -= @getVerticalScrollbarWidth()
if width? and @defaultCharWidth > 0
Math.floor(width / @defaultCharWidth)
Math.max(0, Math.floor(width / @defaultCharWidth))
else
@editorWidthInChars

View File

@@ -266,15 +266,25 @@ class Project extends Model
else
undefined
# Public: Make the given path relative to the project directory.
#
# * `fullPath` {String} full path
relativize: (fullPath) ->
@relativizePath(fullPath)[1]
# Public: Get the path to the project directory that contains the given path,
# and the relative path from that project directory to the given path.
#
# * `fullPath` {String} An absolute path.
#
# Returns an {Array} with two elements:
# * `projectPath` The {String} path to the project directory that contains the
# given path, or `null` if none is found.
# * `relativePath` {String} The relative path from the project directory to
# the given path.
relativizePath: (fullPath) ->
return fullPath if fullPath?.match(/[A-Za-z0-9+-.]+:\/\//) # leave path alone if it has a scheme
for rootDirectory in @rootDirectories
relativePath = rootDirectory.relativize(fullPath)
return relativePath if relativePath isnt fullPath
fullPath
return [rootDirectory.getPath(), relativePath] unless relativePath is fullPath
[null, fullPath]
# Public: Determines whether the given path (real or symbolic) is inside the
# project's directory.

View File

@@ -25,7 +25,7 @@ class TextEditorPresenter
@observeModel()
@observeConfig()
@buildState()
@startBlinkingCursors()
@startBlinkingCursors() if @focused
@enterBatchMode()
destroy: ->
@@ -160,7 +160,7 @@ class TextEditorPresenter
hiddenInput: {}
content:
scrollingVertically: false
blinkCursorsOff: false
cursorsVisible: false
lines: {}
highlights: {}
overlays: {}
@@ -619,6 +619,10 @@ class TextEditorPresenter
setFocused: (focused) ->
unless @focused is focused
@focused = focused
if @focused
@startBlinkingCursors()
else
@stopBlinkingCursors(false)
@updateFocusedState()
@updateHiddenInputState()
@@ -1092,18 +1096,22 @@ class TextEditorPresenter
@updateCursorState(cursor)
startBlinkingCursors: ->
@toggleCursorBlinkHandle = setInterval(@toggleCursorBlink.bind(this), @getCursorBlinkPeriod() / 2)
unless @toggleCursorBlinkHandle
@state.content.cursorsVisible = true
@toggleCursorBlinkHandle = setInterval(@toggleCursorBlink.bind(this), @getCursorBlinkPeriod() / 2)
stopBlinkingCursors: ->
clearInterval(@toggleCursorBlinkHandle)
stopBlinkingCursors: (visible) ->
if @toggleCursorBlinkHandle
@state.content.cursorsVisible = visible
clearInterval(@toggleCursorBlinkHandle)
@toggleCursorBlinkHandle = null
toggleCursorBlink: ->
@state.content.blinkCursorsOff = not @state.content.blinkCursorsOff
@state.content.cursorsVisible = not @state.content.cursorsVisible
@emitter.emit 'did-update-state'
pauseCursorBlinking: ->
@state.content.blinkCursorsOff = false
@stopBlinkingCursors()
@stopBlinkingCursors(true)
@startBlinkingCursorsAfterDelay ?= _.debounce(@startBlinkingCursors, @getCursorBlinkResumeDelay())
@startBlinkingCursorsAfterDelay()
@emitter.emit 'did-update-state'