From 607dfb4987288056cce88b82d88808f53b0109f2 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Mon, 23 Apr 2012 15:29:16 -0600 Subject: [PATCH] Expand/collapse directories when their disclosure arrow is clicked --- spec/extensions/tree-view-spec.coffee | 27 ++++++++++++++++++++------- src/extensions/tree-view.coffee | 25 +++++++++++++++++++------ static/tree-view.css | 6 ++++-- 3 files changed, 43 insertions(+), 15 deletions(-) diff --git a/spec/extensions/tree-view-spec.coffee b/spec/extensions/tree-view-spec.coffee index f362035a5..e41b2dc7f 100644 --- a/spec/extensions/tree-view-spec.coffee +++ b/spec/extensions/tree-view-spec.coffee @@ -2,28 +2,41 @@ TreeView = require 'tree-view' Directory = require 'directory' describe "TreeView", -> - [project, treeView] = [] + [project, treeView, rootDirectoryView] = [] beforeEach -> project = new Directory(require.resolve('fixtures/')) treeView = new TreeView(project) + rootDirectoryView = treeView.find('> li:first') describe ".initialize(project)", -> it "renders the root of the project and its contents alphabetically with subdirectories first in a collapsed state", -> - root = treeView.find('> li:first') - expect(root.find('> .disclosure')).toHaveText('▾') - expect(root.find('> .name')).toHaveText('fixtures/') + expect(rootDirectoryView.find('> .disclosure-arrow')).toHaveText('▾') + expect(rootDirectoryView.find('> .name')).toHaveText('fixtures/') - rootEntries = root.find('.entries') + rootEntries = rootDirectoryView.find('.entries') subdir1 = rootEntries.find('> li:eq(0)') - expect(subdir1.find('.disclosure')).toHaveText('▸') + expect(subdir1.find('.disclosure-arrow')).toHaveText('▸') expect(subdir1.find('.name')).toHaveText('dir/') expect(subdir1.find('.entries')).not.toExist() subdir2 = rootEntries.find('> li:eq(1)') - expect(subdir2.find('.disclosure')).toHaveText('▸') + expect(subdir2.find('.disclosure-arrow')).toHaveText('▸') expect(subdir2.find('.name')).toHaveText('zed/') expect(subdir2.find('.entries')).not.toExist() expect(rootEntries.find('> .file:contains(sample.js)')).toExist() expect(rootEntries.find('> .file:contains(sample.txt)')).toExist() + + describe "when a directory's disclosure arrow is clicked", -> + it "expands / collapses the associated directory", -> + subdir = rootDirectoryView.find('.entries > li:contains(dir/)') + + expect(subdir.find('.disclosure-arrow')).toHaveText('▸') + expect(subdir.find('.entries')).not.toExist() + + subdir.find('.disclosure-arrow').click() + + expect(subdir.find('> .disclosure-arrow')).toHaveText('▾') + expect(subdir.find('.entries')).toExist() + diff --git a/src/extensions/tree-view.coffee b/src/extensions/tree-view.coffee index 7b27a400c..d59093b1d 100644 --- a/src/extensions/tree-view.coffee +++ b/src/extensions/tree-view.coffee @@ -16,15 +16,11 @@ class TreeView extends View class DirectoryView extends View @content: ({directory, isExpanded}) -> @li class: 'directory', => - @disclosureArrow(isExpanded) + @span '▸', class: 'disclosure-arrow', outlet: 'disclosureArrow', click: 'toggleExpansion' @span directory.getName() + '/', class: 'name' - @disclosureArrow: (isExpanded) -> - arrowCharacter = if isExpanded then '▾' else '▸' - @span arrowCharacter, class: 'disclosure' - initialize: ({@directory, @isExpanded}) -> - @buildEntries() if @isExpanded + @expand() if @isExpanded buildEntries: -> contents = $$ -> @ol class: 'entries' @@ -34,3 +30,20 @@ class DirectoryView extends View else contents.append $$ -> @li entry.getName(), class: 'file' @append(contents) + + toggleExpansion: -> + if @isExpanded then @collapse() else @expand() + + expand: -> + @disclosureArrow.text('▾') + @buildEntries() + @isExpanded = true + + collapse: -> + @disclosureArrow.text('▸') + @find('.entries').remove() + @isExpanded = false + + + + diff --git a/static/tree-view.css b/static/tree-view.css index 085a31cfc..2247f4cb3 100644 --- a/static/tree-view.css +++ b/static/tree-view.css @@ -4,10 +4,12 @@ color: white; overflow: auto; padding: 0 1em; + cursor: default; } -.tree-view .disclosure { - margin-right: .5em; +.tree-view .disclosure-arrow { + width: 2ex; + display: inline-block; } .tree-view .directory .entries {