diff options
author | Eike Ziller <eike.ziller@qt.io> | 2020-05-26 13:13:37 +0200 |
---|---|---|
committer | Eike Ziller <eike.ziller@qt.io> | 2020-05-27 06:54:54 +0000 |
commit | 6d97c1fcb1f0a8c712d902065a887f8b74c61cf4 (patch) | |
tree | 2a01bdaabb65253a21baf5ade023e9cc9ad064df | |
parent | fcbbcc74654770175650b6b46b39eddebd6358e1 (diff) | |
download | qt-creator-6d97c1fcb1f0a8c712d902065a887f8b74c61cf4.tar.gz |
Unregister deleted IContext objects automatically
Change-Id: I7b84c02c8fe1e7201431116e3d993792370fb942
Reviewed-by: hjk <hjk@qt.io>
-rw-r--r-- | doc/qtcreatordev/src/actionmanager.qdoc | 5 | ||||
-rw-r--r-- | src/plugins/coreplugin/icontext.cpp | 6 | ||||
-rw-r--r-- | src/plugins/coreplugin/icore.cpp | 1 | ||||
-rw-r--r-- | src/plugins/coreplugin/mainwindow.cpp | 24 | ||||
-rw-r--r-- | src/plugins/coreplugin/mainwindow.h | 6 |
5 files changed, 27 insertions, 15 deletions
diff --git a/doc/qtcreatordev/src/actionmanager.qdoc b/doc/qtcreatordev/src/actionmanager.qdoc index 194d0eefdf..49c57d6818 100644 --- a/doc/qtcreatordev/src/actionmanager.qdoc +++ b/doc/qtcreatordev/src/actionmanager.qdoc @@ -124,8 +124,9 @@ Core::ICore::addContextObject(contextObj); \endcode - You also have to unregister the IContext object with - Core::ICore::removeContextObject() when you do not need it anymore. + IContext instances are automatically unregistered when they are deleted. + Use Core::ICore::removeContextObject() if you need to unregister an IContext + instance manually. Some constructs in \QC automatically have an associated context, like Core::IEditor and Core::IMode. diff --git a/src/plugins/coreplugin/icontext.cpp b/src/plugins/coreplugin/icontext.cpp index 30dbf87059..300fe62704 100644 --- a/src/plugins/coreplugin/icontext.cpp +++ b/src/plugins/coreplugin/icontext.cpp @@ -179,8 +179,10 @@ QDebug operator<<(QDebug debug, const Core::Context &context) Core::ICore::addContextObject() to have an effect. For many subclasses of IContext, like Core::IEditor and Core::IMode, this is done automatically. But instances of IContext can be created manually to associate a context - and context help for an arbitrary widget, too. Mind that IContext instances - must be unregistered with Core::ICore::removeContextObject() as well. + and context help for an arbitrary widget, too. IContext instances are + automatically unregistered when they are deleted. Use + Core::ICore::removeContextObject() if you need to unregister an IContext + instance manually. Whenever the widget is part of the application wide focus widget's parent chain, the associated context list is made active. This makes actions active diff --git a/src/plugins/coreplugin/icore.cpp b/src/plugins/coreplugin/icore.cpp index b5986bd67c..cf3e2907d6 100644 --- a/src/plugins/coreplugin/icore.cpp +++ b/src/plugins/coreplugin/icore.cpp @@ -569,6 +569,7 @@ void ICore::addContextObject(IContext *context) /*! Unregisters a \a context object from the list of know contexts. + IContext instances are automatically removed when they are deleted. \sa addContextObject(), updateAdditionalContexts(), currentContextObject() */ diff --git a/src/plugins/coreplugin/mainwindow.cpp b/src/plugins/coreplugin/mainwindow.cpp index 2a9d4edeee..2109dc27e6 100644 --- a/src/plugins/coreplugin/mainwindow.cpp +++ b/src/plugins/coreplugin/mainwindow.cpp @@ -917,9 +917,10 @@ void MainWindow::openFileWith() } } -IContext *MainWindow::contextObject(QWidget *widget) +IContext *MainWindow::contextObject(QWidget *widget) const { - return m_contextWidgets.value(widget); + const auto it = m_contextWidgets.find(widget); + return it == m_contextWidgets.end() ? nullptr : it->second; } void MainWindow::addContextObject(IContext *context) @@ -927,10 +928,11 @@ void MainWindow::addContextObject(IContext *context) if (!context) return; QWidget *widget = context->widget(); - if (m_contextWidgets.contains(widget)) + if (m_contextWidgets.find(widget) != m_contextWidgets.end()) return; - m_contextWidgets.insert(widget, context); + m_contextWidgets.insert(std::make_pair(widget, context)); + connect(context, &QObject::destroyed, this, [this, context] { removeContextObject(context); }); } void MainWindow::removeContextObject(IContext *context) @@ -938,11 +940,17 @@ void MainWindow::removeContextObject(IContext *context) if (!context) return; - QWidget *widget = context->widget(); - if (!m_contextWidgets.contains(widget)) + disconnect(context, &QObject::destroyed, this, nullptr); + + const auto it = std::find_if(m_contextWidgets.cbegin(), + m_contextWidgets.cend(), + [context](const std::pair<QWidget *, IContext *> &v) { + return v.second == context; + }); + if (it == m_contextWidgets.cend()) return; - m_contextWidgets.remove(widget); + m_contextWidgets.erase(it); if (m_activeContext.removeAll(context) > 0) updateContextObject(m_activeContext); } @@ -959,7 +967,7 @@ void MainWindow::updateFocusWidget(QWidget *old, QWidget *now) if (QWidget *p = QApplication::focusWidget()) { IContext *context = nullptr; while (p) { - context = m_contextWidgets.value(p); + context = contextObject(p); if (context) newContext.append(context); p = p->parentWidget(); diff --git a/src/plugins/coreplugin/mainwindow.h b/src/plugins/coreplugin/mainwindow.h index 554e7b6206..78ec6495d6 100644 --- a/src/plugins/coreplugin/mainwindow.h +++ b/src/plugins/coreplugin/mainwindow.h @@ -31,10 +31,10 @@ #include <utils/appmainwindow.h> #include <utils/dropsupport.h> -#include <QMap> #include <QColor> #include <functional> +#include <unordered_map> QT_BEGIN_NAMESPACE class QPrinter; @@ -82,7 +82,7 @@ public: void extensionsInitialized(); void aboutToShutdown(); - IContext *contextObject(QWidget *widget); + IContext *contextObject(QWidget *widget) const; void addContextObject(IContext *context); void removeContextObject(IContext *context); @@ -164,7 +164,7 @@ private: QList<IContext *> m_activeContext; - QMap<QWidget *, IContext *> m_contextWidgets; + std::unordered_map<QWidget *, IContext *> m_contextWidgets; GeneralSettings *m_generalSettings = nullptr; SystemSettings *m_systemSettings = nullptr; |