Add initial outline view

This commit is contained in:
Kevin Sawicki
2012-10-23 13:52:28 -07:00
parent 48bdc75359
commit ad0bbbc72d
5 changed files with 125 additions and 0 deletions

View File

@@ -9,3 +9,4 @@ requireExtension 'snippets'
requireExtension 'status-bar'
requireExtension 'wrap-guide'
requireExtension 'markdown-preview'
requireExtension 'outline-view'

View File

@@ -0,0 +1 @@
module.exports = require 'outline-view/outline-view'

View File

@@ -0,0 +1,2 @@
window.keymap.bindKeys '.editor'
'ctrl-o': 'outline-view:toggle'

View File

@@ -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()

38
static/outline-view.css Normal file
View File

@@ -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);
}