From 0a39ca25a9a51dcf42e0022952a429a6847dd39f Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Thu, 26 Apr 2012 17:12:56 -0700 Subject: [PATCH] Pressing 'm' in tree view brings up a move dialog --- spec/extensions/tree-view-spec.coffee | 45 +++++++++++++++++++++++++++ src/app/keymaps/tree-view.coffee | 1 + src/extensions/tree-view.coffee | 27 ++++++++++++++++ static/tree-view.css | 9 ++++++ 4 files changed, 82 insertions(+) diff --git a/spec/extensions/tree-view-spec.coffee b/spec/extensions/tree-view-spec.coffee index c144ec6f2..2edba773b 100644 --- a/spec/extensions/tree-view-spec.coffee +++ b/spec/extensions/tree-view-spec.coffee @@ -276,6 +276,51 @@ describe "TreeView", -> rootDirectoryView.trigger 'tree-view:open-selected-entry' expect(rootView.activeEditor()).toBeUndefined() + describe "file modification", -> + [fileElement, rootDirPath, dirPath, filePath] = [] + + beforeEach -> + treeView.deactivate() + + rootDirPath = "/tmp/atom-tests" + dirPath = fs.join(rootDirPath, "test-dir") + filePath = fs.join(dirPath, "test-file.txt") + fs.makeDirectory(rootDirPath) + fs.makeDirectory(dirPath) + fs.write(filePath, "doesn't matter") + + rootView = new RootView(pathToOpen: rootDirPath) + project = rootView.project + treeView = new TreeView(rootView) + dirView = treeView.root.entries.find('.directory:contains(test-dir)').view() + dirView.expand() + fileElement = treeView.find('.file:contains(test-file.txt)') + + afterEach -> + fs.remove(rootDirPath) + + describe "tree-view:move", -> + describe "when a file is selected", -> + moveDialog = null + + beforeEach -> + fileElement.click() + treeView.trigger "tree-view:move" + moveDialog = treeView.find(".move-dialog").view() + + it "opens a move dialog with the file's current path populated", -> + expect(moveDialog).toExist() + expect(moveDialog.editor.getText()).toBe(project.relativize(filePath)) + expect(moveDialog.editor.getSelectedText()).toBe fs.base(filePath) + expect(moveDialog.editor.isFocused).toBeTruthy() + + describe "when the move dialog's editor loses focus", -> + it "removes the dialog", -> + treeView.attachToDom() + treeView.focus() + expect(moveDialog.parent()).not.toExist() + + describe "file system events", -> temporaryFilePath = null diff --git a/src/app/keymaps/tree-view.coffee b/src/app/keymaps/tree-view.coffee index a68092bb6..afeab4e8f 100644 --- a/src/app/keymaps/tree-view.coffee +++ b/src/app/keymaps/tree-view.coffee @@ -2,4 +2,5 @@ window.keymap.bindKeys '.tree-view' 'right': 'tree-view:expand-directory' 'left': 'tree-view:collapse-directory' 'enter': 'tree-view:open-selected-entry' + 'm': 'tree-view:move' diff --git a/src/extensions/tree-view.coffee b/src/extensions/tree-view.coffee index f33abc1a4..96d83317b 100644 --- a/src/extensions/tree-view.coffee +++ b/src/extensions/tree-view.coffee @@ -25,6 +25,7 @@ class TreeView extends View @on 'tree-view:expand-directory', => @expandDirectory() @on 'tree-view:collapse-directory', => @collapseDirectory() @on 'tree-view:open-selected-entry', => @openSelectedEntry() + @on 'tree-view:move', => @move() @rootView.on 'active-editor-path-change', => @selectActiveFile() deactivate: -> @@ -70,6 +71,15 @@ class TreeView extends View else if selectedEntry.is('.file') @rootView.open(selectedEntry.attr('path')) + move: -> + entry = @selectedEntry() + dialog = new MoveDialog(@rootView.project, entry.attr('path')) + @append dialog + + dialog.css + top: entry.position().top + entry.outerHeight() + @scrollTop() + left: 0 + selectedEntry: -> @find('.selected') @@ -144,3 +154,20 @@ class DirectoryView extends View view = $(this).view() view.entryStates = childEntryStates view.expand() + +Editor = require 'editor' +fs = require 'fs' +class MoveDialog extends View + @content: -> + @div class: 'move-dialog', => + @subview 'editor', new Editor(mini: true) + + initialize: (@project, path) -> + @editor.focus() + @editor.on 'focusout', => @remove() + + relativePath = @project.relativize(path) + @editor.setText(relativePath) + baseName = fs.base(path) + range = [[0, relativePath.length - baseName.length], [0, relativePath.length]] + @editor.setSelectionBufferRange(range) \ No newline at end of file diff --git a/static/tree-view.css b/static/tree-view.css index fd542c8a0..5f7f0bff0 100644 --- a/static/tree-view.css +++ b/static/tree-view.css @@ -1,4 +1,5 @@ .tree-view { + position: relative; height: 100%; background: black; color: white; @@ -34,3 +35,11 @@ color: black; } +.move-dialog { + position: absolute; + width: 100%; + + background-color: #444; + border: 2px solid #222; + -webkit-box-shadow: 0 0 3px 3px rgba(0, 0, 0, .5); +} \ No newline at end of file