diff --git a/addons/symbolviewer/plugin_katesymbolviewer.h b/addons/symbolviewer/plugin_katesymbolviewer.h --- a/addons/symbolviewer/plugin_katesymbolviewer.h +++ b/addons/symbolviewer/plugin_katesymbolviewer.h @@ -118,6 +118,7 @@ QMenu *m_popup; QWidget *m_toolview; QTreeWidget *m_symbols; + QAction *m_treeOn; // FIXME Rename other actions accordingly QAction *m_sort; // m_sortOn etc QAction *m_macro; @@ -125,6 +126,9 @@ QAction *m_func; bool macro_on, struct_on, func_on; // FIXME Remove and replace by m_foo->isChecked(); + int m_firstLine; + int m_lastLine; + bool m_stopSearch; QTimer m_updateTimer; QTimer m_currItemTimer; diff --git a/addons/symbolviewer/plugin_katesymbolviewer.cpp b/addons/symbolviewer/plugin_katesymbolviewer.cpp --- a/addons/symbolviewer/plugin_katesymbolviewer.cpp +++ b/addons/symbolviewer/plugin_katesymbolviewer.cpp @@ -214,12 +214,13 @@ void KatePluginSymbolViewerView::slotDocEdited() { + m_currItemTimer.stop(); // Avoid unneeded update m_updateTimer.start(500); } void KatePluginSymbolViewerView::cursorPositionChanged() { - m_currItemTimer.start(100); + m_currItemTimer.start(200); } void KatePluginSymbolViewerView::updateCurrTreeItem() @@ -235,14 +236,24 @@ if (!doc) { return; } + int currLine = editView->cursorPositionVirtual().line(); + if (currLine >= m_firstLine && currLine <= m_lastLine && m_firstLine != m_lastLine) { + // Gotcha! Nothing to do + return; + } + int newItemLine = 0; QTreeWidgetItem *newItem = nullptr; QTreeWidgetItem *tmp = nullptr; + m_firstLine = std::numeric_limits::max(); + m_lastLine = std::numeric_limits::min(); + m_stopSearch = false; for (int i=0; itopLevelItemCount(); i++) { tmp = newActveItem(newItemLine, currLine, m_symbols->topLevelItem(i)); if (tmp) newItem = tmp; + if (m_stopSearch) break; } if (newItem) { @@ -254,16 +265,28 @@ QTreeWidgetItem *KatePluginSymbolViewerView::newActveItem(int &newItemLine, int currLine, QTreeWidgetItem *item) { + if (m_stopSearch) return nullptr; + QTreeWidgetItem *newItem = nullptr; QTreeWidgetItem *tmp = nullptr; int itemLine = item->data(1, Qt::DisplayRole).toInt(); if ((itemLine <= currLine) && (itemLine > newItemLine)) { newItemLine = itemLine; + m_firstLine = itemLine; + m_lastLine = qMax(m_lastLine, m_firstLine); newItem = item; } + if (itemLine > currLine) { // Nested "if" to avoid unclear cluttered parentheses + if ( ((itemLine - 1) < m_lastLine) || (m_lastLine < currLine) || (m_lastLine == m_firstLine) ) { + m_lastLine = itemLine - 1; + if (m_firstLine == m_lastLine) m_stopSearch = true; + } + } + for (int i=0; ichildCount(); i++) { + if (m_stopSearch) break; tmp = newActveItem(newItemLine, currLine, item->child(i)); if (tmp) newItem = tmp; } @@ -335,7 +358,12 @@ else new QTreeWidgetItem(m_symbols, QStringList(i18n("Sorry. Language not supported yet") ) ); + // To by-pass the check in updateCurrTreeItem() + m_firstLine = std::numeric_limits::max(); + m_lastLine = std::numeric_limits::min(); + updateCurrTreeItem(); + if (m_sort->isChecked()) m_symbols->sortItems(0, Qt::AscendingOrder); }