diff --git a/src/plugins/texteditor/ioutlinewidget.h b/src/plugins/texteditor/ioutlinewidget.h index ff0efa37b5e..92958143676 100644 --- a/src/plugins/texteditor/ioutlinewidget.h +++ b/src/plugins/texteditor/ioutlinewidget.h @@ -41,6 +41,8 @@ public: virtual QList filterMenuActions() const = 0; virtual void setCursorSynchronization(bool syncWithCursor) = 0; + virtual void setSorted(bool /*sorted*/) {} + virtual bool isSorted() const { return false; } virtual void restoreSettings(const QVariantMap & /*map*/) { } virtual QVariantMap settings() const { return QVariantMap(); } @@ -55,6 +57,7 @@ public: ~IOutlineWidgetFactory() override; virtual bool supportsEditor(Core::IEditor *editor) const = 0; + virtual bool supportsSorting() const { return false; } virtual IOutlineWidget *createWidget(Core::IEditor *editor) = 0; static void updateOutline(); diff --git a/src/plugins/texteditor/outlinefactory.cpp b/src/plugins/texteditor/outlinefactory.cpp index e09fa0a5ae1..87a162e0d10 100644 --- a/src/plugins/texteditor/outlinefactory.cpp +++ b/src/plugins/texteditor/outlinefactory.cpp @@ -64,7 +64,8 @@ namespace Internal { OutlineWidgetStack::OutlineWidgetStack(OutlineFactory *factory) : QStackedWidget(), m_factory(factory), - m_syncWithEditor(true) + m_syncWithEditor(true), + m_sorted(false) { QLabel *label = new QLabel(tr("No outline available"), this); label->setAlignment(Qt::AlignCenter); @@ -95,6 +96,13 @@ OutlineWidgetStack::OutlineWidgetStack(OutlineFactory *factory) : m_filterMenu = new QMenu(m_filterButton); m_filterButton->setMenu(m_filterMenu); + m_toggleSort = new QToolButton(this); + m_toggleSort->setIcon(Utils::Icons::SORT_ALPHABETICALLY_TOOLBAR.icon()); + m_toggleSort->setCheckable(true); + m_toggleSort->setChecked(false); + m_toggleSort->setToolTip(tr("Sort Alphabetically")); + connect(m_toggleSort, &QAbstractButton::clicked, this, &OutlineWidgetStack::toggleSort); + connect(Core::EditorManager::instance(), &Core::EditorManager::currentEditorChanged, this, &OutlineWidgetStack::updateEditor); connect(factory, &OutlineFactory::updateOutline, @@ -114,6 +122,11 @@ QToolButton *OutlineWidgetStack::filterButton() return m_filterButton; } +QToolButton *OutlineWidgetStack::sortButton() +{ + return m_toggleSort; +} + void OutlineWidgetStack::saveSettings(QSettings *settings, int position) { const QString baseKey = QStringLiteral("Outline.%1.").arg(position); @@ -158,6 +171,13 @@ void OutlineWidgetStack::toggleCursorSynchronization() outlineWidget->setCursorSynchronization(m_syncWithEditor); } +void OutlineWidgetStack::toggleSort() +{ + m_sorted = !m_sorted; + if (auto outlineWidget = qobject_cast(currentWidget())) + outlineWidget->setSorted(m_sorted); +} + void OutlineWidgetStack::updateFilterMenu() { m_filterMenu->clear(); @@ -182,6 +202,7 @@ void OutlineWidgetStack::updateEditor(Core::IEditor *editor) for (IOutlineWidgetFactory *widgetFactory : qAsConst(g_outlineWidgetFactories)) { if (widgetFactory->supportsEditor(editor)) { newWidget = widgetFactory->createWidget(editor); + m_toggleSort->setVisible(widgetFactory->supportsSorting()); break; } } @@ -199,6 +220,7 @@ void OutlineWidgetStack::updateEditor(Core::IEditor *editor) if (newWidget) { newWidget->restoreSettings(m_widgetSettings); newWidget->setCursorSynchronization(m_syncWithEditor); + m_toggleSort->setChecked(newWidget->isSorted()); addWidget(newWidget); setCurrentWidget(newWidget); setFocusProxy(newWidget); @@ -223,6 +245,7 @@ Core::NavigationView OutlineFactory::createWidget() auto placeHolder = new OutlineWidgetStack(this); n.widget = placeHolder; n.dockToolBarWidgets.append(placeHolder->filterButton()); + n.dockToolBarWidgets.append(placeHolder->sortButton()); n.dockToolBarWidgets.append(placeHolder->toggleSyncButton()); return n; } diff --git a/src/plugins/texteditor/outlinefactory.h b/src/plugins/texteditor/outlinefactory.h index 375caf02ac5..83d6e00522f 100644 --- a/src/plugins/texteditor/outlinefactory.h +++ b/src/plugins/texteditor/outlinefactory.h @@ -46,6 +46,7 @@ public: QToolButton *toggleSyncButton(); QToolButton *filterButton(); + QToolButton *sortButton(); void saveSettings(QSettings *settings, int position); void restoreSettings(QSettings *settings, int position); @@ -55,6 +56,7 @@ private: QWidget *dummyWidget() const; void updateFilterMenu(); void toggleCursorSynchronization(); + void toggleSort(); void updateEditor(Core::IEditor *editor); void updateCurrentEditor(); @@ -62,9 +64,11 @@ private: OutlineFactory *m_factory; QToolButton *m_toggleSync; QToolButton *m_filterButton; + QToolButton *m_toggleSort; QMenu *m_filterMenu; QVariantMap m_widgetSettings; bool m_syncWithEditor; + bool m_sorted; }; class OutlineFactory : public Core::INavigationWidgetFactory