From 97533a60c60769473f9c73b04173a86a0701d7d6 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 10 Dec 2012 09:50:07 -0800 Subject: [PATCH 01/12] Update status bar when window receives focus This is common when a different app is switched to to perform a branch checkout or a commit and so the status icon and current branch should be updated when the window regains focus. --- spec/app/status-bar-spec.coffee | 8 ++++++++ src/app/status-bar.coffee | 2 ++ 2 files changed, 10 insertions(+) diff --git a/spec/app/status-bar-spec.coffee b/spec/app/status-bar-spec.coffee index a12af57b6..c3a4bc657 100644 --- a/spec/app/status-bar-spec.coffee +++ b/spec/app/status-bar-spec.coffee @@ -158,3 +158,11 @@ describe "StatusBar", -> fs.write(path, originalPathText) rootView.getActiveEditor().getBuffer().trigger 'git-status-change' expect(statusBar.gitStatusIcon).toHaveText('') + + it "updates when the window receives focus", -> + fs.write(path, "i've changed for the worse") + rootView.open(path) + expect(statusBar.gitStatusIcon).toHaveText('\uf26d') + fs.write(path, originalPathText) + $(window).trigger 'focus' + expect(statusBar.gitStatusIcon).toHaveText('') diff --git a/src/app/status-bar.coffee b/src/app/status-bar.coffee index c3a368e91..556f9345d 100644 --- a/src/app/status-bar.coffee +++ b/src/app/status-bar.coffee @@ -1,5 +1,6 @@ _ = require 'underscore' {View, $$} = require 'space-pen' +$ = require 'jquery' module.exports = class StatusBar extends View @@ -36,6 +37,7 @@ class StatusBar extends View @updateCursorPositionText() @editor.on 'cursor-move', => @updateCursorPositionText() + $(window).on 'focus', => @updateStatusBar() @subscribeToBuffer() From 6954edd8a224cdfd40f56a5655f7e27a2e098534 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 10 Dec 2012 10:28:53 -0800 Subject: [PATCH 02/12] Show status icon for staged changes --- src/app/git.coffee | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/app/git.coffee b/src/app/git.coffee index 6d29f1b53..d300de60a 100644 --- a/src/app/git.coffee +++ b/src/app/git.coffee @@ -35,11 +35,16 @@ class Git isPathModified: (path) -> modifiedFlags = @statusFlags.working_dir_modified | @statusFlags.working_dir_delete | - @statusFlags.working_dir_typechange + @statusFlags.working_dir_typechange | + @statusFlags.index_modified | + @statusFlags.index_deleted | + @statusFlags.index_typechange (@getPathStatus(path) & modifiedFlags) > 0 isPathNew: (path) -> - (@getPathStatus(path) & @statusFlags.working_dir_new) > 0 + newFlags = @statusFlags.working_dir_new | + @statusFlags.index_new + (@getPathStatus(path) & newFlags) > 0 relativize: (path) -> workingDirectory = @getWorkingDirectory() From c78ccf3ede8f9685ce67a184a047720bcf549ca8 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 10 Dec 2012 11:47:26 -0800 Subject: [PATCH 03/12] Read index before checking status --- native/v8_extensions/git.mm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/native/v8_extensions/git.mm b/native/v8_extensions/git.mm index 3f677454b..5ac5f23b7 100644 --- a/native/v8_extensions/git.mm +++ b/native/v8_extensions/git.mm @@ -65,6 +65,12 @@ public: return CefV8Value::CreateInt(0); } + git_index* index; + if (git_repository_index(&index, repo) == GIT_OK) { + git_index_read(index); + git_index_free(index); + } + unsigned int status = 0; if (git_status_file(&status, repo, path) == GIT_OK) { return CefV8Value::CreateInt(status); From 8ea568df2f404731a76eb7beb3dda8c97a3a6989 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 10 Dec 2012 17:04:18 -0800 Subject: [PATCH 04/12] :lipstick: --- src/extensions/tree-view/src/tree-view.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/extensions/tree-view/src/tree-view.coffee b/src/extensions/tree-view/src/tree-view.coffee index c5d762650..b7e5aae6b 100644 --- a/src/extensions/tree-view/src/tree-view.coffee +++ b/src/extensions/tree-view/src/tree-view.coffee @@ -201,9 +201,9 @@ class TreeView extends ScrollView openSelectedEntry: (changeFocus) -> selectedEntry = @selectedEntry() - if (selectedEntry instanceof DirectoryView) + if selectedEntry instanceof DirectoryView selectedEntry.view().toggleExpansion() - else if (selectedEntry instanceof FileView) + else if selectedEntry instanceof FileView @rootView.open(selectedEntry.getPath(), { changeFocus }) moveSelectedEntry: -> From 471d512844fa1ac7a69039abf175baae86e89eda Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 10 Dec 2012 17:16:08 -0800 Subject: [PATCH 05/12] :lipstick: --- src/extensions/tree-view/src/tree-view.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/extensions/tree-view/src/tree-view.coffee b/src/extensions/tree-view/src/tree-view.coffee index b7e5aae6b..9552af321 100644 --- a/src/extensions/tree-view/src/tree-view.coffee +++ b/src/extensions/tree-view/src/tree-view.coffee @@ -111,7 +111,7 @@ class TreeView extends ScrollView switch e.originalEvent?.detail ? 1 when 1 @selectEntry(entry) - @openSelectedEntry(false) if (entry instanceof FileView) + @openSelectedEntry(false) if entry instanceof FileView when 2 if entry.is('.selected.file') @rootView.getActiveEditor().focus() @@ -282,7 +282,7 @@ class TreeView extends ScrollView entry.addClass('selected') scrollToEntry: (entry) -> - displayElement = if (entry instanceof DirectoryView) then entry.header else entry + displayElement = if entry instanceof DirectoryView then entry.header else entry top = @scrollTop() + displayElement.position().top bottom = top + displayElement.outerHeight() From 1c47423044d33e76ad32d65ba1f37e01089f9cb5 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 10 Dec 2012 17:44:17 -0800 Subject: [PATCH 06/12] :lipstick: --- src/extensions/tree-view/src/tree-view.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/extensions/tree-view/src/tree-view.coffee b/src/extensions/tree-view/src/tree-view.coffee index 9552af321..03b06d40e 100644 --- a/src/extensions/tree-view/src/tree-view.coffee +++ b/src/extensions/tree-view/src/tree-view.coffee @@ -191,7 +191,7 @@ class TreeView extends ScrollView expandDirectory: -> selectedEntry = @selectedEntry() - selectedEntry.view().expand() if (selectedEntry instanceof DirectoryView) + selectedEntry.view().expand() if selectedEntry instanceof DirectoryView collapseDirectory: -> selectedEntry = @selectedEntry() From 50e4602f7c7262689e0b5e4f4d349f2920eeb75f Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 10 Dec 2012 17:44:55 -0800 Subject: [PATCH 07/12] Use getPath() internally --- src/app/git.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/git.coffee b/src/app/git.coffee index d300de60a..ea4127744 100644 --- a/src/app/git.coffee +++ b/src/app/git.coffee @@ -19,7 +19,7 @@ class Git getPath: -> @repo.getPath() getWorkingDirectory: -> - repoPath = @repo.getPath() + repoPath = @getPath() if repoPath repoPath.substring(0, repoPath.length - 5) From 339f3e55b76aeeac86841d63542c0ffa68ecfa29 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 10 Dec 2012 17:46:59 -0800 Subject: [PATCH 08/12] :lipstick: --- src/extensions/tree-view/src/directory-view.coffee | 1 - 1 file changed, 1 deletion(-) diff --git a/src/extensions/tree-view/src/directory-view.coffee b/src/extensions/tree-view/src/directory-view.coffee index 2e09e7857..777395d1a 100644 --- a/src/extensions/tree-view/src/directory-view.coffee +++ b/src/extensions/tree-view/src/directory-view.coffee @@ -88,4 +88,3 @@ class DirectoryView extends View view = $(this).view() view.entryStates = childEntryStates view.expand() - From 0e40580a28c07e9ac14be97031764e3e452a5a98 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 11 Dec 2012 09:56:38 -0800 Subject: [PATCH 09/12] Use internal getPath() method --- src/extensions/tree-view/src/file-view.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/extensions/tree-view/src/file-view.coffee b/src/extensions/tree-view/src/file-view.coffee index 850a9625a..6fb40540a 100644 --- a/src/extensions/tree-view/src/file-view.coffee +++ b/src/extensions/tree-view/src/file-view.coffee @@ -10,7 +10,7 @@ class FileView extends View file: null initialize: (@file) -> - @addClass('ignored') if new Git(@file.getPath()).isPathIgnored(@file.getPath()) + @addClass('ignored') if new Git(@getPath()).isPathIgnored(@getPath()) getPath: -> @file.path From 43658ddc52bea416bc66d3487f7d40baf0c54e72 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 11 Dec 2012 15:38:11 -0800 Subject: [PATCH 10/12] Center position where cursor is being set to --- src/extensions/outline-view/src/outline-view.coffee | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/extensions/outline-view/src/outline-view.coffee b/src/extensions/outline-view/src/outline-view.coffee index 22725703c..f4c08ec4b 100644 --- a/src/extensions/outline-view/src/outline-view.coffee +++ b/src/extensions/outline-view/src/outline-view.coffee @@ -50,7 +50,11 @@ class OutlineView extends SelectList confirmed : ({position, name}) -> @cancel() - @rootView.getActiveEditor().setCursorBufferPosition(position) + editor = @rootView.getActiveEditor() + screenPosition = editor.screenPositionForBufferPosition(position) + pixelPosition = editor.pixelPositionForScreenPosition(screenPosition) + editor.scrollTo(pixelPosition, center: true) + editor.setCursorBufferPosition(position) cancelled: -> @miniEditor.setText('') From b84837942040ea6fce38fff9aae71eea1c839e5f Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 11 Dec 2012 15:54:01 -0800 Subject: [PATCH 11/12] Support scrolling to buffer and screen positions --- spec/app/editor-spec.coffee | 12 ++++++------ src/app/editor.coffee | 15 ++++++++++++--- .../outline-view/src/outline-view.coffee | 4 +--- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/spec/app/editor-spec.coffee b/spec/app/editor-spec.coffee index 355f234bd..34b78d86f 100644 --- a/spec/app/editor-spec.coffee +++ b/spec/app/editor-spec.coffee @@ -1005,12 +1005,12 @@ describe "Editor", -> editor.addCursorAtBufferPosition([6,50]) [cursor1, cursor2] = editor.getCursors() - spyOn(editor, 'scrollTo') + spyOn(editor, 'scrollToPixelPosition') cursor1.setScreenPosition([10, 10]) - expect(editor.scrollTo).not.toHaveBeenCalled() + expect(editor.scrollToPixelPosition).not.toHaveBeenCalled() cursor2.setScreenPosition([11, 11]) - expect(editor.scrollTo).toHaveBeenCalled() + expect(editor.scrollToPixelPosition).toHaveBeenCalled() describe "when the last cursor exceeds the upper or lower scroll margins", -> describe "when the editor is taller than twice the vertical scroll margin", -> @@ -1396,7 +1396,7 @@ describe "Editor", -> describe "when lines are added", -> beforeEach -> editor.attachToDom(heightInLines: 5) - spyOn(editor, "scrollTo") + spyOn(editor, "scrollToPixelPosition") describe "when the change precedes the first rendered row", -> it "inserts and removes rendered lines to account for upstream change", -> @@ -1448,7 +1448,7 @@ describe "Editor", -> describe "when lines are removed", -> beforeEach -> editor.attachToDom(heightInLines: 5) - spyOn(editor, "scrollTo") + spyOn(editor, "scrollToPixelPosition") it "sets the rendered screen line's width to either the max line length or the scollView's width (whichever is greater)", -> maxLineLength = editor.maxScreenLineLength() @@ -1614,7 +1614,7 @@ describe "Editor", -> describe "when lines are inserted", -> it "re-renders the correct line number range in the gutter", -> - spyOn(editor, 'scrollTo') + spyOn(editor, 'scrollToPixelPosition') editor.scrollTop(3 * editor.lineHeight) expect(editor.gutter.find('.line-number:first').text()).toBe '2' expect(editor.gutter.find('.line-number:last').text()).toBe '11' diff --git a/src/app/editor.coffee b/src/app/editor.coffee index ad40e03ac..5fd94b04c 100644 --- a/src/app/editor.coffee +++ b/src/app/editor.coffee @@ -497,7 +497,13 @@ class Editor extends View scrollToBottom: -> @scrollBottom(@screenLineCount() * @lineHeight) - scrollTo: (pixelPosition, options) -> + scrollToBufferPosition: (bufferPosition, options) -> + @scrollToPixelPosition(@pixelPositionForBufferPosition(bufferPosition), options) + + scrollToScreenPosition: (screenPosition, options) -> + @scrollToPixelPosition(@pixelPositionForScreenPosition(screenPosition), options) + + scrollToPixelPosition: (pixelPosition, options) -> return unless @attached @scrollVertically(pixelPosition, options) @scrollHorizontally(pixelPosition) @@ -800,11 +806,11 @@ class Editor extends View autoscroll: (options={}) -> for cursorView in @getCursorViews() when cursorView.needsAutoscroll() - @scrollTo(cursorView.getPixelPosition()) unless options.suppressAutoScroll + @scrollToPixelPosition(cursorView.getPixelPosition()) unless options.suppressAutoScroll cursorView.autoscrolled() for selectionView in @getSelectionViews() when selectionView.needsAutoscroll() - @scrollTo(selectionView.getCenterPixelPosition(), center: true) + @scrollToPixelPosition(selectionView.getCenterPixelPosition(), center: true) selectionView.autoscrolled() updateRenderedLines: -> @@ -1025,6 +1031,9 @@ class Editor extends View @renderedLines.find('.line').each (n) -> console.log n, $(this).text() + pixelPositionForBufferPosition: (position) -> + @pixelPositionForScreenPosition(@screenPositionForBufferPosition(position)) + pixelPositionForScreenPosition: (position) -> position = Point.fromObject(position) { top: position.row * @lineHeight, left: position.column * @charWidth } diff --git a/src/extensions/outline-view/src/outline-view.coffee b/src/extensions/outline-view/src/outline-view.coffee index f4c08ec4b..2b9b688ba 100644 --- a/src/extensions/outline-view/src/outline-view.coffee +++ b/src/extensions/outline-view/src/outline-view.coffee @@ -51,9 +51,7 @@ class OutlineView extends SelectList confirmed : ({position, name}) -> @cancel() editor = @rootView.getActiveEditor() - screenPosition = editor.screenPositionForBufferPosition(position) - pixelPosition = editor.pixelPositionForScreenPosition(screenPosition) - editor.scrollTo(pixelPosition, center: true) + editor.scrollToBufferPosition(position, center: true) editor.setCursorBufferPosition(position) cancelled: -> From 339eeac0d89c2cf9167e3004ac5167aee67261a7 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 11 Dec 2012 15:58:59 -0800 Subject: [PATCH 12/12] Remove unneeded spyOn calls --- spec/app/editor-spec.coffee | 3 --- 1 file changed, 3 deletions(-) diff --git a/spec/app/editor-spec.coffee b/spec/app/editor-spec.coffee index 34b78d86f..0c7459a70 100644 --- a/spec/app/editor-spec.coffee +++ b/spec/app/editor-spec.coffee @@ -1396,7 +1396,6 @@ describe "Editor", -> describe "when lines are added", -> beforeEach -> editor.attachToDom(heightInLines: 5) - spyOn(editor, "scrollToPixelPosition") describe "when the change precedes the first rendered row", -> it "inserts and removes rendered lines to account for upstream change", -> @@ -1448,7 +1447,6 @@ describe "Editor", -> describe "when lines are removed", -> beforeEach -> editor.attachToDom(heightInLines: 5) - spyOn(editor, "scrollToPixelPosition") it "sets the rendered screen line's width to either the max line length or the scollView's width (whichever is greater)", -> maxLineLength = editor.maxScreenLineLength() @@ -1614,7 +1612,6 @@ describe "Editor", -> describe "when lines are inserted", -> it "re-renders the correct line number range in the gutter", -> - spyOn(editor, 'scrollToPixelPosition') editor.scrollTop(3 * editor.lineHeight) expect(editor.gutter.find('.line-number:first').text()).toBe '2' expect(editor.gutter.find('.line-number:last').text()).toBe '11'