diff options
author | Andre Hartmann <aha_1980@gmx.de> | 2018-09-16 21:34:32 +0200 |
---|---|---|
committer | André Hartmann <aha_1980@gmx.de> | 2019-01-22 09:29:30 +0000 |
commit | d89ad246becad9758c17f1fa89766fcd3692f4e9 (patch) | |
tree | 3078f674e87fb36e3ea1aba80cf5a7d4b8829199 /src/plugins/cppeditor/cppincludehierarchy.cpp | |
parent | 8f7211b1c677b24cfa923d8e9796ad511ef658b6 (diff) | |
download | qt-creator-d89ad246becad9758c17f1fa89766fcd3692f4e9.tar.gz |
Include Hierarchy: Allow refreshing when current document changes
Realized by a "sync with editor" tool button like in the Projects
side panel. Store and restore the current "sync" state in the settings.
Default setting is off.
Fixes: QTCREATORBUG-12022
Change-Id: I567a83a4cf6e3b56e746c682f44573d0b6cc9440
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
Diffstat (limited to 'src/plugins/cppeditor/cppincludehierarchy.cpp')
-rw-r--r-- | src/plugins/cppeditor/cppincludehierarchy.cpp | 90 |
1 files changed, 89 insertions, 1 deletions
diff --git a/src/plugins/cppeditor/cppincludehierarchy.cpp b/src/plugins/cppeditor/cppincludehierarchy.cpp index 27a8cca993..9e5440a172 100644 --- a/src/plugins/cppeditor/cppincludehierarchy.cpp +++ b/src/plugins/cppeditor/cppincludehierarchy.cpp @@ -28,6 +28,7 @@ #include "cppeditor.h" #include "cppeditorwidget.h" #include "cppeditorconstants.h" +#include "cppeditordocument.h" #include "cppeditorplugin.h" #include <coreplugin/editormanager/editormanager.h> @@ -47,11 +48,15 @@ #include <utils/fileutils.h> #include <utils/navigationtreeview.h> #include <utils/qtcassert.h> +#include <utils/utilsicons.h> #include <QCoreApplication> #include <QKeyEvent> #include <QLabel> +#include <QSettings> #include <QStackedWidget> +#include <QTimer> +#include <QToolButton> #include <QVBoxLayout> using namespace Core; @@ -339,7 +344,7 @@ private: class CppIncludeHierarchyWidget : public QWidget { - Q_DECLARE_TR_FUNCTIONS(CppEditor::CppIncludeHierarchy) + Q_OBJECT public: CppIncludeHierarchyWidget(); @@ -347,18 +352,27 @@ public: void perform(); + void saveSettings(QSettings *settings, int position); + void restoreSettings(QSettings *settings, int position); + private: void onItemActivated(const QModelIndex &index); void editorsClosed(QList<IEditor *> editors); void showNoIncludeHierarchyLabel(); void showIncludeHierarchy(); + void syncFromEditorManager(); CppIncludeHierarchyTreeView *m_treeView = nullptr; CppIncludeHierarchyModel m_model; AnnotatedItemDelegate m_delegate; TextEditorLinkLabel *m_inspectedFile = nullptr; QLabel *m_includeHierarchyInfoLabel = nullptr; + QToolButton *m_toggleSync = nullptr; BaseTextEditor *m_editor = nullptr; + QTimer *m_timer = nullptr; + + // CppIncludeHierarchyFactory needs private members for button access + friend class CppIncludeHierarchyFactory; }; CppIncludeHierarchyWidget::CppIncludeHierarchyWidget() @@ -381,6 +395,19 @@ CppIncludeHierarchyWidget::CppIncludeHierarchyWidget() m_includeHierarchyInfoLabel->setBackgroundRole(QPalette::Base); m_includeHierarchyInfoLabel->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); + m_timer = new QTimer(this); + m_timer->setInterval(2000); + m_timer->setSingleShot(true); + connect(m_timer, &QTimer::timeout, + this, &CppIncludeHierarchyWidget::perform); + + m_toggleSync = new QToolButton(this); + m_toggleSync->setIcon(Utils::Icons::LINK_TOOLBAR.icon()); + m_toggleSync->setCheckable(true); + m_toggleSync->setToolTip(tr("Synchronize with Editor")); + connect(m_toggleSync, &QToolButton::clicked, + this, &CppIncludeHierarchyWidget::syncFromEditorManager); + auto layout = new QVBoxLayout(this); layout->setMargin(0); layout->setSpacing(0); @@ -392,6 +419,10 @@ CppIncludeHierarchyWidget::CppIncludeHierarchyWidget() this, &CppIncludeHierarchyWidget::perform); connect(EditorManager::instance(), &EditorManager::editorsClosed, this, &CppIncludeHierarchyWidget::editorsClosed); + connect(EditorManager::instance(), &EditorManager::currentEditorChanged, + this, &CppIncludeHierarchyWidget::syncFromEditorManager); + + syncFromEditorManager(); } void CppIncludeHierarchyWidget::perform() @@ -415,6 +446,18 @@ void CppIncludeHierarchyWidget::perform() showIncludeHierarchy(); } +void CppIncludeHierarchyWidget::saveSettings(QSettings *settings, int position) +{ + const QString key = QString("IncludeHierarchy.%1.SyncWithEditor").arg(position); + settings->setValue(key, m_toggleSync->isChecked()); +} + +void CppIncludeHierarchyWidget::restoreSettings(QSettings *settings, int position) +{ + const QString key = QString("IncludeHierarchy.%1.SyncWithEditor").arg(position); + m_toggleSync->setChecked(settings->value(key).toBool()); +} + void CppIncludeHierarchyWidget::onItemActivated(const QModelIndex &index) { const auto link = index.data(LinkRole).value<Utils::Link>(); @@ -447,6 +490,29 @@ void CppIncludeHierarchyWidget::showIncludeHierarchy() m_includeHierarchyInfoLabel->hide(); } +void CppIncludeHierarchyWidget::syncFromEditorManager() +{ + if (!m_toggleSync->isChecked()) + return; + + auto editor = qobject_cast<CppEditor *>(EditorManager::currentEditor()); + if (!editor) + return; + + auto document = qobject_cast<CppEditorDocument *>(editor->textDocument()); + if (!document) + return; + + // Update the hierarchy immediately after a document change. If the + // document is already parsed, cppDocumentUpdated is not triggered again. + perform(); + + // Use cppDocumentUpdated to catch parsing finished and later file updates. + // The timer limits the amount of hierarchy updates. + connect(document, &CppEditorDocument::cppDocumentUpdated, this, [this]() { + m_timer->start(); + }, Qt::UniqueConnection); +} // CppIncludeHierarchyFactory @@ -466,9 +532,31 @@ NavigationView CppIncludeHierarchyFactory::createWidget() stack->addWidget(hierarchyWidget); NavigationView navigationView; + navigationView.dockToolBarWidgets << hierarchyWidget->m_toggleSync; navigationView.widget = stack; return navigationView; } +static CppIncludeHierarchyWidget *hierarchyWidget(QWidget *widget) +{ + auto stack = qobject_cast<QStackedWidget *>(widget); + Q_ASSERT(stack); + auto hierarchyWidget = qobject_cast<CppIncludeHierarchyWidget *>(stack->currentWidget()); + Q_ASSERT(hierarchyWidget); + return hierarchyWidget; +} + +void CppIncludeHierarchyFactory::saveSettings(QSettings *settings, int position, QWidget *widget) +{ + hierarchyWidget(widget)->saveSettings(settings, position); +} + +void CppIncludeHierarchyFactory::restoreSettings(QSettings *settings, int position, QWidget *widget) +{ + hierarchyWidget(widget)->restoreSettings(settings, position); +} + } // namespace Internal } // namespace CppEditor + +#include "cppincludehierarchy.moc" |