diff --git a/main.js b/main.js index 1a6a43f..967cd7c 100644 --- a/main.js +++ b/main.js @@ -34,6 +34,39 @@ define(function (require, exports, module) { SVG: require("src/languages/XML") }; + var editor_lines = 0; + + var onKeyActivity = function ($event, editor, event) { + selectCurrentFunction(editor); + } + + var onCursorActivity = function ($event, editor) { + selectCurrentFunction(editor); + } + + function selectCurrentFunction(editor) { + var pos = editor.getCursorPos(); + + if (editor_lines != editor.getLastVisibleLine()) + { + console.log('changed'); + createList(); + } + editor_lines = editor.getLastVisibleLine(); + + var remove_entries = $("#outline-list ul li"); + remove_entries.removeClass('active'); + + var entry = $("#outline-list ul li").filter(function() { + var id = $(this)[0].id; + var splitted = id.split('_'); + var line_start = splitted[splitted.length-2]; + var line_eind = splitted[splitted.length-1]; + return line_start <= pos.line && line_eind >= pos.line; + }); + entry.addClass('active'); + } + function getOutline() { var $outline = Mustache.render(ListTemplate, { Strings: Strings @@ -57,6 +90,18 @@ define(function (require, exports, module) { } function updateOutline() { + + var currentEditor = EditorManager.getActiveEditor(); + $(currentEditor).on('keyup', onKeyActivity); + $(currentEditor).on('cursorActivity', onCursorActivity); + $(currentEditor).on('cursorActivity', onCursorActivity); + + showOutline(); + + createList(); + } + + function createList() { var doc = DocumentManager.getCurrentDocument(); if (!doc) { hideOutline(); @@ -69,8 +114,6 @@ define(function (require, exports, module) { return; } - showOutline(); - var lines = doc.getText(false).split("\n"); var list = lang.getOutlineList(lines, prefs.get("args"), prefs.get("unnamed")); @@ -78,16 +121,29 @@ define(function (require, exports, module) { list.sort(lang.compare); } + list.reverse(); + + var last_line = 999999999; + list.forEach(function (entry) { + entry.end_line = last_line; + last_line = entry.line - 1; + }); + + list.reverse(); + + $("#outline-list ul li").remove(); list.forEach(function (entry) { var $entry = $(document.createElement("li")); $entry.addClass("outline-entry"); $entry.addClass(entry.classes); $entry.append(entry.$html); + $entry[0].id = 'outline_line_' + entry.line + '_' + entry.end_line; $entry.click({ line: entry.line, ch: entry.ch }, goToLine); $("#outline-list ul").append($entry); + last_line = entry.line; }); } @@ -141,6 +197,7 @@ define(function (require, exports, module) { $("#outline-toolbar-icon").addClass("enabled"); EditorManager.on("activeEditorChange", updateOutline); DocumentManager.on("documentSaved", updateOutline); + updateOutline(); } @@ -186,4 +243,4 @@ define(function (require, exports, module) { if (prefs.get("enabled")) { enableOutline(); } -}); +}); \ No newline at end of file diff --git a/styles/styles.css b/styles/styles.css index 569afe4..8788d07 100644 --- a/styles/styles.css +++ b/styles/styles.css @@ -20,6 +20,11 @@ background-position: 0 -24px; } +.outline-entry.active { + background: #0F1114; + font-weight: 700; +} + /* ==== Outline List ==== */