summaryrefslogtreecommitdiff
path: root/src/plugins/cppeditor/cppincludehierarchy.cpp
diff options
context:
space:
mode:
authorAndre Hartmann <aha_1980@gmx.de>2018-09-16 21:34:32 +0200
committerAndré Hartmann <aha_1980@gmx.de>2019-01-22 09:29:30 +0000
commitd89ad246becad9758c17f1fa89766fcd3692f4e9 (patch)
tree3078f674e87fb36e3ea1aba80cf5a7d4b8829199 /src/plugins/cppeditor/cppincludehierarchy.cpp
parent8f7211b1c677b24cfa923d8e9796ad511ef658b6 (diff)
downloadqt-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.cpp90
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"