diff --git a/src/plugins/coreplugin/designmode.cpp b/src/plugins/coreplugin/designmode.cpp index 9932fe3f032..64c4bb14558 100644 --- a/src/plugins/coreplugin/designmode.cpp +++ b/src/plugins/coreplugin/designmode.cpp @@ -181,7 +181,7 @@ void DesignMode::currentEditorChanged(IEditor *editor) if (!mimeEditorAvailable) { setActiveContext(Context()); - if (ModeManager::currentMode() == id()) + if (ModeManager::currentModeId() == id()) ModeManager::activateMode(Constants::MODE_EDIT); setEnabled(false); d->m_currentEditor = nullptr; @@ -214,7 +214,7 @@ void DesignMode::setActiveContext(const Context &context) if (d->m_activeContext == context) return; - if (ModeManager::currentMode() == id()) + if (ModeManager::currentModeId() == id()) ICore::updateAdditionalContexts(d->m_activeContext, context); d->m_activeContext = context; diff --git a/src/plugins/coreplugin/editormanager/editorwindow.cpp b/src/plugins/coreplugin/editormanager/editorwindow.cpp index 28cf1f95259..83b87071318 100644 --- a/src/plugins/coreplugin/editormanager/editorwindow.cpp +++ b/src/plugins/coreplugin/editormanager/editorwindow.cpp @@ -29,6 +29,7 @@ #include "editormanager_p.h" #include +#include #include #include #include @@ -67,7 +68,10 @@ EditorWindow::EditorWindow(QWidget *parent) : resize(QSize(800, 600)); static int windowId = 0; - ICore::registerWindow(this, Context(Id("EditorManager.ExternalWindow.").withSuffix(++windowId))); + + ICore::registerWindow(this, + Context(Id("EditorManager.ExternalWindow.").withSuffix(++windowId), + Constants::C_EDITORMANAGER)); connect(m_area, &EditorArea::windowTitleNeedsUpdate, this, &EditorWindow::updateWindowTitle); diff --git a/src/plugins/coreplugin/icore.cpp b/src/plugins/coreplugin/icore.cpp index 6bb0779ec68..f88f0f8df44 100644 --- a/src/plugins/coreplugin/icore.cpp +++ b/src/plugins/coreplugin/icore.cpp @@ -531,6 +531,11 @@ QWidget *ICore::currentContextWidget() return context ? context->widget() : nullptr; } +IContext *ICore::contextObject(QWidget *widget) +{ + return m_mainwindow->contextObject(widget); +} + QMainWindow *ICore::mainWindow() { diff --git a/src/plugins/coreplugin/icore.h b/src/plugins/coreplugin/icore.h index a01a660eeb3..37ce9b05dd8 100644 --- a/src/plugins/coreplugin/icore.h +++ b/src/plugins/coreplugin/icore.h @@ -112,6 +112,7 @@ public: static IContext *currentContextObject(); static QWidget *currentContextWidget(); + static IContext *contextObject(QWidget *widget); // Adds and removes additional active contexts, these contexts are appended // to the currently active contexts. static void updateAdditionalContexts(const Context &remove, const Context &add, diff --git a/src/plugins/coreplugin/modemanager.cpp b/src/plugins/coreplugin/modemanager.cpp index dac3ae80230..be693383729 100644 --- a/src/plugins/coreplugin/modemanager.cpp +++ b/src/plugins/coreplugin/modemanager.cpp @@ -125,7 +125,7 @@ ModeManager::~ModeManager() m_instance = nullptr; } -Id ModeManager::currentMode() +Id ModeManager::currentModeId() { int currentIndex = d->m_modeStack->currentIndex(); if (currentIndex < 0) @@ -222,7 +222,7 @@ void ModeManagerPrivate::enabledStateChanged(IMode *mode) d->m_modeStack->setTabEnabled(index, mode->isEnabled()); // Make sure we leave any disabled mode to prevent possible crashes: - if (mode->id() == ModeManager::currentMode() && !mode->isEnabled()) { + if (mode->id() == ModeManager::currentModeId() && !mode->isEnabled()) { // This assumes that there is always at least one enabled mode. for (int i = 0; i < d->m_modes.count(); ++i) { if (d->m_modes.at(i) != mode && @@ -298,7 +298,7 @@ void ModeManager::currentTabChanged(int index) void ModeManager::setFocusToCurrentMode() { - IMode *mode = findMode(currentMode()); + IMode *mode = findMode(currentModeId()); QTC_ASSERT(mode, return); QWidget *widget = mode->widget(); if (widget) { @@ -336,4 +336,10 @@ ModeManager *ModeManager::instance() return m_instance; } +IMode *ModeManager::currentMode() +{ + const int currentIndex = d->m_modeStack->currentIndex(); + return currentIndex < 0 ? nullptr : d->m_modes.at(currentIndex); +} + } // namespace Core diff --git a/src/plugins/coreplugin/modemanager.h b/src/plugins/coreplugin/modemanager.h index 66ff7af7fcd..889731b49ef 100644 --- a/src/plugins/coreplugin/modemanager.h +++ b/src/plugins/coreplugin/modemanager.h @@ -54,7 +54,8 @@ public: static ModeManager *instance(); - static Id currentMode(); + static IMode *currentMode(); + static Id currentModeId(); static void addAction(QAction *action, int priority); static void addProjectSelector(QAction *action); diff --git a/src/plugins/coreplugin/outputpane.cpp b/src/plugins/coreplugin/outputpane.cpp index 96398963483..b6d118d6b69 100644 --- a/src/plugins/coreplugin/outputpane.cpp +++ b/src/plugins/coreplugin/outputpane.cpp @@ -68,7 +68,7 @@ OutputPanePlaceHolder::OutputPanePlaceHolder(Id mode, QSplitter *parent) this, &OutputPanePlaceHolder::currentModeChanged); // if this is part of a lazily created mode widget, // we need to check if this is the current placeholder - currentModeChanged(ModeManager::currentMode()); + currentModeChanged(ModeManager::currentModeId()); } OutputPanePlaceHolder::~OutputPanePlaceHolder() diff --git a/src/plugins/coreplugin/statusbarmanager.cpp b/src/plugins/coreplugin/statusbarmanager.cpp index c653928ad83..e71e7450777 100644 --- a/src/plugins/coreplugin/statusbarmanager.cpp +++ b/src/plugins/coreplugin/statusbarmanager.cpp @@ -25,8 +25,10 @@ #include "statusbarmanager.h" +#include "imode.h" #include "mainwindow.h" #include "minisplitter.h" +#include "modemanager.h" #include @@ -45,6 +47,17 @@ static QPointer m_splitter; static QList> m_statusBarWidgets; static QList> m_contexts; +/*! + Context that always returns the context of the active's mode widget (if available). +*/ +class StatusBarContext : public IContext +{ +public: + StatusBarContext(QObject *parent); + + Context context() const final; +}; + static QWidget *createWidget(QWidget *parent) { QWidget *w = new QWidget(parent); @@ -85,6 +98,10 @@ static void createStatusBarManager() bar->insertPermanentWidget(1, rightCornerWidget); m_statusBarWidgets.append(rightCornerWidget); + auto context = new StatusBarContext(bar); + context->setWidget(bar); + ICore::addContextObject(context); + QObject::connect(ICore::instance(), &ICore::saveSettingsRequested, [] { QSettings *s = ICore::settings(); s->beginGroup(QLatin1String(kSettingsGroup)); @@ -152,4 +169,20 @@ void StatusBarManager::restoreSettings() m_splitter->setSizes(QList() << leftSplitWidth << (sum - leftSplitWidth)); } +StatusBarContext::StatusBarContext(QObject *parent) + : IContext(parent) +{ +} + +Context StatusBarContext::context() const +{ + IMode *currentMode = ModeManager::currentMode(); + QWidget *modeWidget = currentMode ? currentMode->widget() : nullptr; + if (modeWidget) { + if (IContext *context = ICore::contextObject(modeWidget)) + return context->context(); + } + return Context(); +} + } // Core diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index 41bc2909707..89bac15496d 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -2758,7 +2758,7 @@ void DebuggerPluginPrivate::dumpLog() /*! Activates the previous mode when the current mode is the debug mode. */ void DebuggerPluginPrivate::activatePreviousMode() { - if (ModeManager::currentMode() == MODE_DEBUG && m_previousMode.isValid()) { + if (ModeManager::currentModeId() == MODE_DEBUG && m_previousMode.isValid()) { // If stopping the application also makes Qt Creator active (as the // "previously active application"), doing the switch synchronously // leads to funny effects with floating dock widgets @@ -3390,7 +3390,7 @@ void DebuggerPluginPrivate::onModeChanged(Id mode) void saveModeToRestore() { - dd->m_previousMode = ModeManager::currentMode(); + dd->m_previousMode = ModeManager::currentModeId(); } } // namespace Internal @@ -3522,7 +3522,7 @@ void setPerspectiveEnabled(const QByteArray &perspectiveId, bool enabled) void selectPerspective(const QByteArray &perspectiveId) { - if (ModeManager::currentMode() == MODE_DEBUG + if (ModeManager::currentModeId() == MODE_DEBUG && dd->m_mainWindow->currentPerspective() == perspectiveId) { return; } diff --git a/src/plugins/help/helpplugin.cpp b/src/plugins/help/helpplugin.cpp index 84428fe97b0..405d05bebc3 100644 --- a/src/plugins/help/helpplugin.cpp +++ b/src/plugins/help/helpplugin.cpp @@ -523,7 +523,7 @@ void HelpPluginPrivate::updateSideBarSource(const QUrl &newUrl) void HelpPluginPrivate::setupHelpEngineIfNeeded() { LocalHelpManager::setEngineNeedsUpdate(); - if (ModeManager::currentMode() == m_mode.id() + if (ModeManager::currentModeId() == m_mode.id() || LocalHelpManager::contextHelpOption() == HelpManager::ExternalHelpAlways) LocalHelpManager::setupGuiHelpEngine(); } diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 01e758cef82..37d57d18c72 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -1689,7 +1689,7 @@ void ProjectExplorerPluginPrivate::showSessionManager() updateActions(); - if (ModeManager::currentMode() == Core::Constants::MODE_WELCOME) + if (ModeManager::currentModeId() == Core::Constants::MODE_WELCOME) updateWelcomePage(); } diff --git a/src/plugins/qmldesigner/qmldesignerplugin.cpp b/src/plugins/qmldesigner/qmldesignerplugin.cpp index 140c2ef937e..2c745b2ce88 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.cpp +++ b/src/plugins/qmldesigner/qmldesignerplugin.cpp @@ -93,7 +93,7 @@ QmlDesignerPlugin *QmlDesignerPlugin::m_instance = nullptr; static bool isInDesignerMode() { - return Core::ModeManager::currentMode() == Core::Constants::MODE_DESIGN; + return Core::ModeManager::currentModeId() == Core::Constants::MODE_DESIGN; } static bool checkIfEditorIsQtQuick(Core::IEditor *editor) @@ -106,7 +106,7 @@ static bool checkIfEditorIsQtQuick(Core::IEditor *editor) || document->language() == QmlJS::Dialect::QmlQtQuick2Ui || document->language() == QmlJS::Dialect::Qml; - if (Core::ModeManager::currentMode() == Core::Constants::MODE_DESIGN) { + if (Core::ModeManager::currentModeId() == Core::Constants::MODE_DESIGN) { Core::AsynchronousMessageBox::warning(QmlDesignerPlugin::tr("Cannot Open Design Mode"), QmlDesignerPlugin::tr("The QML file is not currently opened in a QML Editor.")); Core::ModeManager::activateMode(Core::Constants::MODE_EDIT); diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp index bf7c50b9e87..bb9c70f7688 100644 --- a/src/plugins/qmljseditor/qmljseditor.cpp +++ b/src/plugins/qmljseditor/qmljseditor.cpp @@ -1031,7 +1031,7 @@ bool QmlJSEditor::isDesignModePreferred() const alwaysPreferDesignMode = true; // stay in design mode if we are there - Id mode = ModeManager::currentMode(); + Id mode = ModeManager::currentModeId(); return alwaysPreferDesignMode || mode == Core::Constants::MODE_DESIGN; }