diff --git a/src/packages/command-panel/lib/operation-view.coffee b/src/packages/command-panel/lib/operation-view.coffee index 580c2a037..b4cdb7845 100644 --- a/src/packages/command-panel/lib/operation-view.coffee +++ b/src/packages/command-panel/lib/operation-view.coffee @@ -18,6 +18,7 @@ class OperationView extends View false @on 'mousedown', (e) => @executeOperation() + @previewList.find('.selected').removeClass('selected') @addClass('selected') executeOperation: -> diff --git a/src/packages/command-panel/lib/preview-list.coffee b/src/packages/command-panel/lib/preview-list.coffee index 2620b5cec..04ca0ef21 100644 --- a/src/packages/command-panel/lib/preview-list.coffee +++ b/src/packages/command-panel/lib/preview-list.coffee @@ -4,13 +4,13 @@ ScrollView = require 'scroll-view' _ = require 'underscore' fs = require 'fs' PathView = require './path-view' +OperationView = require './operation-view' module.exports = class PreviewList extends ScrollView @content: -> @ol class: 'preview-list', tabindex: -1 - selectedOperationIndex: 0 operations: null initialize: (@rootView) -> @@ -19,9 +19,6 @@ class PreviewList extends ScrollView @on 'core:move-down', => @selectNextOperation(); false @on 'core:move-up', => @selectPreviousOperation(); false - @on 'mousedown', 'li.operation', (e) => - @setSelectedOperationIndex(parseInt($(e.target).closest('li').data('index'))) - @command 'command-panel:collapse-all', => @collapseAllPaths() @command 'command-panel:expand-all', => @expandAllPaths() @@ -46,8 +43,8 @@ class PreviewList extends ScrollView for path, operations of operationsByPath @append new PathView({path, operations, previewList: this}) - @setSelectedOperationIndex(0) @show() + @find('.operation:first').addClass('selected') @setLineNumberWidth() setLineNumberWidth: -> @@ -58,25 +55,29 @@ class PreviewList extends ScrollView lineNumbers.width(maxWidth) selectNextOperation: -> - @setSelectedOperationIndex(@selectedOperationIndex + 1) + selectedView = @find('.selected').view() + + if selectedView instanceof PathView + nextView = selectedView.find('.operation:first') + else + nextView = selectedView.next().view() ? selectedView.closest('.path').next().view() + if nextView? + selectedView.removeClass('selected') + nextView.addClass('selected') + @scrollToElement(nextView) selectPreviousOperation: -> - @setSelectedOperationIndex(@selectedOperationIndex - 1) + selectedView = @find('.selected').view() - setSelectedOperationIndex: (index, scrollToOperation=true) -> - index = Math.max(0, index) - index = Math.min(@operations.length - 1, index) - @find('li.selected').removeClass('selected') - element = @find("ul.matches li.operation:eq(#{index})") - element.addClass('selected') + if selectedView instanceof PathView + previousView = selectedView.prev().find('.operation:last').view() + else + previousView = selectedView.prev().view() ? selectedView.closest('.path').view() - if scrollToOperation - if index is 0 - @scrollToTop() - else - @scrollToElement(element) - - @selectedOperationIndex = index + if previousView? + selectedView.removeClass('selected') + previousView.addClass('selected') + @scrollToElement(previousView) getPathCount: -> _.keys(_.groupBy(@operations, (operation) -> operation.getPath())).length @@ -89,7 +90,7 @@ class PreviewList extends ScrollView @operations = null getSelectedOperation: -> - @operations[@selectedOperationIndex] + @find('.operation.selected').view()?.operation scrollToElement: (element) -> top = @scrollTop() + element.offset().top - @offset().top @@ -101,9 +102,11 @@ class PreviewList extends ScrollView scrollToBottom: -> super() - @setSelectedOperationIndex(Infinity, false) + @find('.selected').removeClass('selected') + @find('.operation:last').addClass('selected') scrollToTop: -> super() - @setSelectedOperationIndex(0, false) + @find('.selected').removeClass('selected') + @find('.path:first').addClass('selected') diff --git a/src/packages/command-panel/spec/command-panel-spec.coffee b/src/packages/command-panel/spec/command-panel-spec.coffee index 797fc0c33..cd562961c 100644 --- a/src/packages/command-panel/spec/command-panel-spec.coffee +++ b/src/packages/command-panel/spec/command-panel-spec.coffee @@ -395,29 +395,29 @@ describe "CommandPanel", -> expect(previewList.find('li.operation:eq(1)')).toHaveClass 'selected' expect(previewList.getSelectedOperation()).toBe previewList.getOperations()[1] - _.times previewList.getOperations().length - 2, -> previewList.trigger 'core:move-down' + _.times previewList.getOperations().length + previewList.getPathCount(), -> previewList.trigger 'core:move-down' expect(previewList.find("li.operation:last")).toHaveClass 'selected' expect(previewList.getSelectedOperation()).toBe _.last(previewList.getOperations()) expect(previewList.scrollBottom()).toBeCloseTo previewList.prop('scrollHeight'), -1 - _.times previewList.getOperations().length, -> previewList.trigger 'core:move-up' + _.times previewList.getOperations().length + previewList.getPathCount(), -> previewList.trigger 'core:move-up' expect(previewList.scrollTop()).toBe 0 it "doesn't bubble up the event and the command panel text doesn't change", -> rootView.attachToDom() commandPanel.miniEditor.setText "command" previewList.focus() - previewList.trigger 'core:move-up' - expect(previewList.find('li.operation:eq(0)')).toHaveClass 'selected' - expect(commandPanel.miniEditor.getText()).toBe 'command' previewList.trigger 'core:move-down' expect(previewList.find('li.operation:eq(1)')).toHaveClass 'selected' expect(commandPanel.miniEditor.getText()).toBe 'command' + previewList.trigger 'core:move-up' + expect(previewList.find('li.operation:eq(0)')).toHaveClass 'selected' + expect(commandPanel.miniEditor.getText()).toBe 'command' describe "when move-to-top and move-to-bottom are triggered on the preview list", -> - it "selects the first/last operation", -> + it "selects the first path or last operation", -> rootView.attachToDom() expect(previewList.getOperations().length).toBeGreaterThan 0 expect(previewList.find('li.operation:eq(0)')).toHaveClass 'selected' @@ -428,8 +428,8 @@ describe "CommandPanel", -> expect(previewList.getSelectedOperation()).toBe _.last(previewList.getOperations()) previewList.trigger 'core:move-to-top' - expect(previewList.find('li.operation:eq(0)')).toHaveClass 'selected' - expect(previewList.getSelectedOperation()).toBe previewList.getOperations()[0] + expect(previewList.find('li.path:eq(0)')).toHaveClass 'selected' + expect(previewList.getSelectedOperation()).toBeUndefined() describe "when core:confirm is triggered on the preview list", -> it "opens the operation's buffer, selects and scrolls to the search result, and refocuses the preview list", ->