From 886e2caa52549b16239f7cf167f688ecc598864f Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Mon, 7 May 2012 10:39:36 -0700 Subject: [PATCH] TreeView scrolls to selected path when move-down or move-up are triggered --- Atom/src/native_handler.mm | 2 +- spec/extensions/tree-view-spec.coffee | 19 +++++++++++++++++ .../tree-view/directory-view.coffee | 3 ++- src/extensions/tree-view/tree-view.coffee | 21 ++++++++++++++++--- 4 files changed, 40 insertions(+), 5 deletions(-) diff --git a/Atom/src/native_handler.mm b/Atom/src/native_handler.mm index 26bd98839..90ddfb609 100644 --- a/Atom/src/native_handler.mm +++ b/Atom/src/native_handler.mm @@ -16,7 +16,7 @@ NSString *stringFromCefV8Value(const CefRefPtr& value) { NativeHandler::NativeHandler() : CefV8Handler() { m_object = CefV8Value::CreateObject(NULL, NULL); - const char *functionNames[] = {"exists", "read", "write", "absolute", "list", "isFile", "isDirectory", "remove", "asyncList", "open", "openDialog", "quit", "writeToPasteboard", "readFromPasteboard", "showDevTools", "newWindow", "saveDialog", "exit", "watchPath", "unwatchPath", "makeDirectory", "move", "moveToTrash"}; + const char *functionNames[] = {"exists", "alert", "read", "write", "absolute", "list", "isFile", "isDirectory", "remove", "asyncList", "open", "openDialog", "quit", "writeToPasteboard", "readFromPasteboard", "showDevTools", "newWindow", "saveDialog", "exit", "watchPath", "unwatchPath", "makeDirectory", "move", "moveToTrash"}; NSUInteger arrayLength = sizeof(functionNames) / sizeof(const char *); for (NSUInteger i = 0; i < arrayLength; i++) { const char *functionName = functionNames[i]; diff --git a/spec/extensions/tree-view-spec.coffee b/spec/extensions/tree-view-spec.coffee index 2b0875ce2..0d5b8d780 100644 --- a/spec/extensions/tree-view-spec.coffee +++ b/spec/extensions/tree-view-spec.coffee @@ -1,3 +1,5 @@ +$ = require 'jquery' +_ = require 'underscore' TreeView = require 'tree-view' RootView = require 'root-view' Directory = require 'directory' @@ -232,6 +234,23 @@ describe "TreeView", -> treeView.trigger 'move-up' expect(treeView.root).toHaveClass 'selected' + describe "movement outside of viewable region", -> + it "scrolls the tree view to the selected item", -> + treeView.height(100) + treeView.attachToDom() + $(element).view().expand() for element in treeView.find('.directory') + expect(treeView.prop('scrollHeight')).toBeGreaterThan treeView.outerHeight() + + treeView.moveDown() + expect(treeView.scrollTop()).toBe 0 + + entryCount = treeView.find(".entry").length + _.times entryCount, -> treeView.moveDown() + expect(treeView.scrollBottom()).toBe treeView.prop('scrollHeight') + + _.times entryCount, -> treeView.moveUp() + expect(treeView.scrollTop()).toBe 0 + describe "tree-view:expand-directory", -> describe "when a directory entry is selected", -> it "expands the current directory", -> diff --git a/src/extensions/tree-view/directory-view.coffee b/src/extensions/tree-view/directory-view.coffee index d78f708ea..9f0d330be 100644 --- a/src/extensions/tree-view/directory-view.coffee +++ b/src/extensions/tree-view/directory-view.coffee @@ -7,12 +7,13 @@ module.exports = class DirectoryView extends View @content: ({directory, isExpanded}) -> @li class: 'directory entry', => - @div class: 'header', => + @div outlet: 'header', class: 'header', => @span '▸', class: 'disclosure-arrow', outlet: 'disclosureArrow' @span directory.getName(), class: 'name' directory: null entries: null + header: null initialize: ({@directory, isExpanded}) -> @expand() if isExpanded diff --git a/src/extensions/tree-view/tree-view.coffee b/src/extensions/tree-view/tree-view.coffee index aa6d61b12..6c5cb3602 100644 --- a/src/extensions/tree-view/tree-view.coffee +++ b/src/extensions/tree-view/tree-view.coffee @@ -76,12 +76,15 @@ class TreeView extends View selectedEntry = @selectedEntry() if selectedEntry if selectedEntry.is('.expanded.directory') - return if @selectEntry(selectedEntry.find('.entry:first')) - return if @selectEntry(selectedEntry.next()) - return if @selectEntry(selectedEntry.closest('.directory').next()) + @selectEntry(selectedEntry.find('.entry:first')) + else + if not @selectEntry(selectedEntry.next()) + @selectEntry(selectedEntry.closest('.directory').next()) else @selectEntry(@root) + @scollToEntry(@selectedEntry()) + moveUp: -> selectedEntry = @selectedEntry() if selectedEntry @@ -93,6 +96,8 @@ class TreeView extends View else @selectEntry(@find('.entry').last()) + @scollToEntry(@selectedEntry()) + expandDirectory: -> selectedEntry = @selectedEntry() selectedEntry.view().expand() if (selectedEntry instanceof DirectoryView) @@ -125,3 +130,13 @@ class TreeView extends View @find('.selected').removeClass('selected') entry.addClass('selected') + scollToEntry: (entry) -> + displayElement = if (entry instanceof DirectoryView) then entry.header else entry + + top = @scrollTop() + displayElement.position().top + bottom = top + displayElement.outerHeight() + + if bottom > @scrollBottom() + @scrollBottom(bottom) + if top < @scrollTop() + @scrollTop(top)