From cd8796b561d6107dd135f4e5cf64aa4827184b7c Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 5 Aug 2013 11:26:14 -0700 Subject: [PATCH] Add select list to browse and open bookmarks from --- src/packages/bookmarks/keymaps/bookmarks.cson | 1 + .../bookmarks/lib/bookmarks-list-view.coffee | 77 +++++++++++++++++++ .../bookmarks/lib/bookmarks-view.coffee | 8 ++ .../bookmarks/spec/bookmarks-view-spec.coffee | 34 ++++++++ .../bookmarks/stylesheets/bookmarks.less | 8 ++ 5 files changed, 128 insertions(+) create mode 100644 src/packages/bookmarks/lib/bookmarks-list-view.coffee diff --git a/src/packages/bookmarks/keymaps/bookmarks.cson b/src/packages/bookmarks/keymaps/bookmarks.cson index 33d626838..5d32246c2 100644 --- a/src/packages/bookmarks/keymaps/bookmarks.cson +++ b/src/packages/bookmarks/keymaps/bookmarks.cson @@ -1,4 +1,5 @@ '.editor': + 'meta-shift-f2': 'bookmarks:view-all' 'meta-f2': 'bookmarks:toggle-bookmark' 'f2': 'bookmarks:jump-to-next-bookmark' 'shift-f2': 'bookmarks:jump-to-previous-bookmark' diff --git a/src/packages/bookmarks/lib/bookmarks-list-view.coffee b/src/packages/bookmarks/lib/bookmarks-list-view.coffee new file mode 100644 index 000000000..e280801c5 --- /dev/null +++ b/src/packages/bookmarks/lib/bookmarks-list-view.coffee @@ -0,0 +1,77 @@ +path = require 'path' + +{$$} = require 'space-pen' + +SelectList = require 'select-list' + +module.exports = +class BookmarksView extends SelectList + @viewClass: -> "#{super} bookmarks-view overlay from-top" + + filterKey: 'bookmarkFilterText' + + initialize: -> + super + + toggle: -> + if @hasParent() + @cancel() + else + @populateBookmarks() + @attach() + + getFilterText: (bookmark) -> + segments = [] + bookmarkRow = bookmark.getStartPosition().row + segments.push(bookmarkRow) + if bufferPath = bookmark.buffer.getPath() + segments.push(bufferPath) + if lineText = @getLineText(bookmark) + segments.push(lineText) + segments.join(' ') + + getLineText: (bookmark) -> + bookmark.buffer.lineForRow(bookmark.getStartPosition().row)?.trim() + + populateBookmarks: -> + markers = [] + attributes = class: 'bookmark' + for buffer in project.getBuffers() + for marker in buffer.findMarkers(attributes) + marker.bookmarkFilterText = @getFilterText(marker) + markers.push(marker) + @setArray(markers) + + itemForElement: (bookmark) -> + bookmarkRow = bookmark.getStartPosition().row + if filePath = bookmark.buffer.getPath() + bookmarkLocation = "#{path.basename(filePath)}:#{bookmarkRow + 1}" + else + bookmarkLocation = "untitled:#{bookmarkRow + 1}" + lineText = @getLineText(bookmark) + + $$ -> + if lineText + @li class: 'bookmark two-lines', => + @div bookmarkLocation, class: 'primary-line' + @div lineText, class: 'secondary-line line-text' + else + @li class: 'bookmark', => + @div bookmarkLocation, class: 'primary-line' + + getEmptyMessage: (itemCount) -> + if itemCount is 0 + 'No bookmarks found' + else + super + + confirmed : (bookmark) -> + for editor in rootView.getEditors() + if editor.getBuffer() is bookmark.buffer + editor.activeEditSession.setSelectedBufferRange(bookmark.getRange(), autoscroll: true) + + attach: -> + super + + rootView.append(this) + @miniEditor.focus() diff --git a/src/packages/bookmarks/lib/bookmarks-view.coffee b/src/packages/bookmarks/lib/bookmarks-view.coffee index 06cb933ca..9b6d42fee 100644 --- a/src/packages/bookmarks/lib/bookmarks-view.coffee +++ b/src/packages/bookmarks/lib/bookmarks-view.coffee @@ -4,6 +4,14 @@ shell = require 'shell' module.exports = class BookmarksView @activate: -> + bookmarksList = null + + rootView.command 'bookmarks:view-all', -> + unless bookmarksList? + BookmarksListView = require './bookmarks-list-view' + bookmarksList = new BookmarksListView() + bookmarksList.toggle() + rootView.eachEditor (editor) => new BookmarksView(editor) if editor.attached and editor.getPane()? diff --git a/src/packages/bookmarks/spec/bookmarks-view-spec.coffee b/src/packages/bookmarks/spec/bookmarks-view-spec.coffee index 2abccaf4a..51979ec77 100644 --- a/src/packages/bookmarks/spec/bookmarks-view-spec.coffee +++ b/src/packages/bookmarks/spec/bookmarks-view-spec.coffee @@ -133,3 +133,37 @@ describe "Bookmarks package", -> editor.trigger 'bookmarks:jump-to-previous-bookmark' expect(editSession.getCursor().getBufferPosition()).toEqual [10, 0] + + describe "browsing bookmarks", -> + it "displays a select list of all bookmarks", -> + editSession.setCursorBufferPosition([0]) + editor.trigger 'bookmarks:toggle-bookmark' + editSession.setCursorBufferPosition([2]) + editor.trigger 'bookmarks:toggle-bookmark' + editSession.setCursorBufferPosition([4]) + editor.trigger 'bookmarks:toggle-bookmark' + + rootView.trigger 'bookmarks:view-all' + + bookmarks = rootView.find('.bookmarks-view') + expect(bookmarks).toExist() + expect(bookmarks.find('.bookmark').length).toBe 3 + expect(bookmarks.find('.bookmark:eq(0)').find('.primary-line').text()).toBe 'sample.js:1' + expect(bookmarks.find('.bookmark:eq(0)').find('.secondary-line').text()).toBe 'var quicksort = function () {' + expect(bookmarks.find('.bookmark:eq(1)').find('.primary-line').text()).toBe 'sample.js:3' + expect(bookmarks.find('.bookmark:eq(1)').find('.secondary-line').text()).toBe 'if (items.length <= 1) return items;' + expect(bookmarks.find('.bookmark:eq(2)').find('.primary-line').text()).toBe 'sample.js:5' + expect(bookmarks.find('.bookmark:eq(2)').find('.secondary-line').text()).toBe 'while(items.length > 0) {' + + describe "when a bookmark is selected", -> + it "sets the cursor to the location the bookmark", -> + editSession.setCursorBufferPosition([8]) + editor.trigger 'bookmarks:toggle-bookmark' + editSession.setCursorBufferPosition([0]) + + rootView.trigger 'bookmarks:view-all' + + bookmarks = rootView.find('.bookmarks-view') + expect(bookmarks).toExist() + bookmarks.find('.bookmark').mousedown().mouseup() + expect(editSession.getCursorBufferPosition()).toEqual [8, 0] diff --git a/src/packages/bookmarks/stylesheets/bookmarks.less b/src/packages/bookmarks/stylesheets/bookmarks.less index 9b3a07db3..1f81a3968 100644 --- a/src/packages/bookmarks/stylesheets/bookmarks.less +++ b/src/packages/bookmarks/stylesheets/bookmarks.less @@ -3,3 +3,11 @@ content: '\f07b'; visibility: visible; } + +.bookmarks-view { + .bookmark { + .line-text { + font-family: monospace; + } + } +}