From ad0bbbc72d1fa166227dd1bd90f014594c6230e8 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 23 Oct 2012 13:52:28 -0700 Subject: [PATCH] Add initial outline view --- .atom/default-config.coffee | 1 + src/extensions/outline-view/index.coffee | 1 + src/extensions/outline-view/keymap.coffee | 2 + .../outline-view/outline-view.coffee | 83 +++++++++++++++++++ static/outline-view.css | 38 +++++++++ 5 files changed, 125 insertions(+) create mode 100644 src/extensions/outline-view/index.coffee create mode 100644 src/extensions/outline-view/keymap.coffee create mode 100644 src/extensions/outline-view/outline-view.coffee create mode 100644 static/outline-view.css diff --git a/.atom/default-config.coffee b/.atom/default-config.coffee index d394e6801..1e243478d 100644 --- a/.atom/default-config.coffee +++ b/.atom/default-config.coffee @@ -9,3 +9,4 @@ requireExtension 'snippets' requireExtension 'status-bar' requireExtension 'wrap-guide' requireExtension 'markdown-preview' +requireExtension 'outline-view' diff --git a/src/extensions/outline-view/index.coffee b/src/extensions/outline-view/index.coffee new file mode 100644 index 000000000..1a19f8519 --- /dev/null +++ b/src/extensions/outline-view/index.coffee @@ -0,0 +1 @@ +module.exports = require 'outline-view/outline-view' diff --git a/src/extensions/outline-view/keymap.coffee b/src/extensions/outline-view/keymap.coffee new file mode 100644 index 000000000..46344df44 --- /dev/null +++ b/src/extensions/outline-view/keymap.coffee @@ -0,0 +1,2 @@ +window.keymap.bindKeys '.editor' + 'ctrl-o': 'outline-view:toggle' diff --git a/src/extensions/outline-view/outline-view.coffee b/src/extensions/outline-view/outline-view.coffee new file mode 100644 index 000000000..c3773194e --- /dev/null +++ b/src/extensions/outline-view/outline-view.coffee @@ -0,0 +1,83 @@ +{View, $$} = require 'space-pen' +SelectList = require 'select-list' +stringScore = require 'stringscore' +fuzzyFilter = require 'fuzzy-filter' +_ = require 'underscore' +Editor = require 'editor' + +module.exports = +class OutlineView extends SelectList + + @activate: (rootView) -> + requireStylesheet 'select-list.css' + requireStylesheet 'outline-view.css' + @instance = new OutlineView(rootView) + rootView.command 'outline-view:toggle', => @instance.toggle() + + @viewClass: -> "#{super} outline-view" + + filterKey: 'name' + + initialize: (@rootView) -> + super + + itemForElement: ({row, name}) -> + $$ -> + @li => + @div name, class: 'function-name' + @div class: 'right', => + @div "Line #{row}", class: 'function-line' + @div class: 'clear-float' + + toggle: -> + if @hasParent() + @cancel() + else + @populate() + @attach() + + populate: -> + editor = @rootView.getActiveEditor() + session = editor.activeEditSession + buffer = session.buffer + language = session.tokenizedBuffer.languageMode + + functions = [] + functionTester = (scope) -> + scope.indexOf('entity.name.function.') is 0 + registerFunction = (row, column, name) -> + return unless name.length > 0 + functions.push + row: row + column: column + name: name + + for row in [0...editor.getLineCount()] + line = buffer.lineForRow(row) + continue unless line.length + {tokens} = language.getLineTokens(line) + name = '' + column = 0 + for token in tokens + if _.find(token.scopes, functionTester) + name += token.value + else + registerFunction(row, column, name) + column += token.value.length + name = '' + registerFunction(row, column, name) + + @setArray(functions) + + confirmed : ({row, column, name}) -> + return unless name.length + @cancel() + @rootView.getActiveEditor().setCursorBufferPosition([row, column]) + + cancelled: -> + @miniEditor.setText('') + @rootView.focus() if @miniEditor.isFocused + + attach: -> + @rootView.append(this) + @miniEditor.focus() diff --git a/static/outline-view.css b/static/outline-view.css new file mode 100644 index 000000000..1b67d9139 --- /dev/null +++ b/static/outline-view.css @@ -0,0 +1,38 @@ +.outline-view { + width: 50%; + margin-left: -25%; +} + +.outline-view ol { + max-height: 300px; +} + +.outline-view ol li { + padding: 2px; + border-bottom: 1px solid rgba(255, 255, 255, .05); +} + +.outline-view ol .function-name { + float: left; + display: inline-block; + margin-right: .5em; + margin: 4px 0; +} + +.outline-view li .right { + float: right; +} + +.outline-view ol .function-line { + display: inline-block; + margin: 4px 0; + margin-right: .5em; + font-size: 90%; + color: #ddd; + -webkit-border-radius: 3px; + padding: 0 4px; +} + +.outline-view ol .function-line { + background: rgba(0, 0, 0, .2); +}