diff --git a/src/plugins/coreplugin/designmode.cpp b/src/plugins/coreplugin/designmode.cpp index fbabebb959c93fbfa042009918ede313ebdcfa7b..2568cb5f3b9b312edcf2b1718070f4d0bb68b979 100644 --- a/src/plugins/coreplugin/designmode.cpp +++ b/src/plugins/coreplugin/designmode.cpp @@ -86,6 +86,7 @@ bool DesignModeCoreListener::coreAboutToClose() struct DesignEditorInfo { int widgetIndex; QStringList mimeTypes; + QList<int> context; bool preferredMode; QWidget *widget; }; @@ -100,6 +101,7 @@ struct DesignModePrivate { EditorManager *m_editorManager; QStackedWidget *m_stackWidget; + QList<int> m_activeContext; }; DesignModePrivate::DesignModePrivate(DesignMode *q, EditorManager *editorManager) : @@ -118,6 +120,9 @@ DesignMode::DesignMode(EditorManager *editorManager) : connect(editorManager, SIGNAL(currentEditorChanged(Core::IEditor*)), this, SLOT(currentEditorChanged(Core::IEditor*))); + + connect(ModeManager::instance(), SIGNAL(currentModeChanged(Core::IMode*,Core::IMode*)), + this, SLOT(updateContext(Core::IMode*,Core::IMode*))); } DesignMode::~DesignMode() @@ -169,13 +174,17 @@ QStringList DesignMode::registeredMimeTypes() const return rc; } -void DesignMode::registerDesignWidget(QWidget *widget, const QStringList &mimeTypes, bool preferDesignMode) +void DesignMode::registerDesignWidget(QWidget *widget, + const QStringList &mimeTypes, + const QList<int> &context, + bool preferDesignMode) { int index = d->m_stackWidget->addWidget(widget); DesignEditorInfo *info = new DesignEditorInfo; info->preferredMode = preferDesignMode; info->mimeTypes = mimeTypes; + info->context = context; info->widgetIndex = index; info->widget = widget; d->m_editors.append(info); @@ -206,12 +215,11 @@ void DesignMode::currentEditorChanged(Core::IEditor *editor) if (type && !type.type().isEmpty()) mimeType = type.type(); - - - foreach(DesignEditorInfo *editorInfo, d->m_editors) { - foreach(QString mime, editorInfo->mimeTypes) { + foreach (DesignEditorInfo *editorInfo, d->m_editors) { + foreach (const QString &mime, editorInfo->mimeTypes) { if (mime == mimeType) { d->m_stackWidget->setCurrentIndex(editorInfo->widgetIndex); + setActiveContext(editorInfo->context); mimeEditorAvailable = true; setEnabled(true); if (editorInfo->preferredMode && core->modeManager()->currentMode() != this) { @@ -225,8 +233,10 @@ void DesignMode::currentEditorChanged(Core::IEditor *editor) break; } } - if (!mimeEditorAvailable) + if (!mimeEditorAvailable) { + setActiveContext(QList<int>()); setEnabled(false); + } if (!mimeEditorAvailable && core->modeManager()->currentMode() == this) { @@ -253,4 +263,38 @@ void DesignMode::updateActions() emit actionsUpdated(d->m_currentEditor.data()); } +void DesignMode::updateContext(Core::IMode *newMode, Core::IMode *oldMode) +{ + if (newMode == this) { + // Apply active context + Core::ICore *core = Core::ICore::instance(); + foreach (int contextId, d->m_activeContext) + core->addAdditionalContext(contextId); + core->updateContext(); + } else if (oldMode == this) { + // Remove active context + Core::ICore *core = Core::ICore::instance(); + foreach (int contextId, d->m_activeContext) + core->removeAdditionalContext(contextId); + core->updateContext(); + } +} + +void DesignMode::setActiveContext(const QList<int> &context) +{ + if (d->m_activeContext == context) + return; + + if (ModeManager::instance()->currentMode() == this) { + // Update active context + Core::ICore *core = Core::ICore::instance(); + foreach (int contextId, d->m_activeContext) + core->removeAdditionalContext(contextId); + foreach (int contextId, context) + core->addAdditionalContext(contextId); + core->updateContext(); + } + d->m_activeContext = context; +} + } // namespace Core diff --git a/src/plugins/coreplugin/designmode.h b/src/plugins/coreplugin/designmode.h index 030199a065526b390cfbf97493df32eda659561f..eaeecd99323e7a3efafca89ad46ae7ce74241f42 100644 --- a/src/plugins/coreplugin/designmode.h +++ b/src/plugins/coreplugin/designmode.h @@ -57,7 +57,9 @@ public: explicit DesignMode(EditorManager *editorManager); virtual ~DesignMode(); - void registerDesignWidget(QWidget *widget, const QStringList &mimeTypes, + void registerDesignWidget(QWidget *widget, + const QStringList &mimeTypes, + const QList<int> &context, bool preferDesignMode = false); void unregisterDesignWidget(QWidget *widget); @@ -79,8 +81,11 @@ signals: private slots: void currentEditorChanged(Core::IEditor *editor); void updateActions(); + void updateContext(Core::IMode *newMode, Core::IMode *oldMode); private: + void setActiveContext(const QList<int> &context); + DesignModePrivate *d; friend class Internal::DesignModeCoreListener; }; diff --git a/src/plugins/designer/formeditorw.cpp b/src/plugins/designer/formeditorw.cpp index e42602bbd360be07f0db310a3d31c4a2decaade7..dbc133d29a322bf9b2e841d9c41fbb50caa33243 100644 --- a/src/plugins/designer/formeditorw.cpp +++ b/src/plugins/designer/formeditorw.cpp @@ -176,9 +176,7 @@ FormEditorW::FormEditorW() : QTC_ASSERT(m_fwm, return); Core::UniqueIDManager *idMan = Core::UniqueIDManager::instance(); - m_contexts << idMan->uniqueIdentifier(QLatin1String(Designer::Constants::C_FORMEDITOR)) - << idMan->uniqueIdentifier(QLatin1String(Core::Constants::C_EDITORMANAGER)) - << idMan->uniqueIdentifier(QLatin1String(Core::Constants::C_DESIGN_MODE)); + m_contexts << idMan->uniqueIdentifier(QLatin1String(Designer::Constants::C_FORMEDITOR)); setupActions(); @@ -333,7 +331,7 @@ void FormEditorW::fullInit() m_context = new DesignerContext(m_contexts, m_modeWidget, this); m_core->addContextObject(m_context); - m_designMode->registerDesignWidget(m_modeWidget, QStringList(QLatin1String(FORM_MIMETYPE))); + m_designMode->registerDesignWidget(m_modeWidget, QStringList(QLatin1String(FORM_MIMETYPE)), m_contexts); setupViewActions(); @@ -428,93 +426,90 @@ void FormEditorW::setupActions() command->setAttribute(Core::Command::CA_Hide); medit->addAction(command, Core::Constants::G_EDIT_COPYPASTE); - QList<int> globalcontext; - globalcontext << m_core->uniqueIDManager()->uniqueIdentifier(Core::Constants::C_GLOBAL); - m_actionGroupEditMode = new QActionGroup(this); m_actionGroupEditMode->setExclusive(true); connect(m_actionGroupEditMode, SIGNAL(triggered(QAction*)), this, SLOT(activateEditMode(QAction*))); m_modeActionSeparator = new QAction(this); m_modeActionSeparator->setSeparator(true); - command = am->registerAction(m_modeActionSeparator, QLatin1String("FormEditor.Sep.ModeActions"), globalcontext); + command = am->registerAction(m_modeActionSeparator, QLatin1String("FormEditor.Sep.ModeActions"), m_contexts); medit->addAction(command, Core::Constants::G_EDIT_OTHER); m_toolActionIds.push_back(QLatin1String("FormEditor.WidgetEditor")); - createEditModeAction(m_actionGroupEditMode, globalcontext, am, medit, + createEditModeAction(m_actionGroupEditMode, m_contexts, am, medit, tr("Edit widgets"), m_toolActionIds.back(), EditModeWidgetEditor, QLatin1String("widgettool.png"), tr("F3")); m_toolActionIds.push_back(QLatin1String("FormEditor.SignalsSlotsEditor")); - createEditModeAction(m_actionGroupEditMode, globalcontext, am, medit, + createEditModeAction(m_actionGroupEditMode, m_contexts, am, medit, tr("Edit signals/slots"), m_toolActionIds.back(), EditModeSignalsSlotEditor, QLatin1String("signalslottool.png"), tr("F4")); m_toolActionIds.push_back(QLatin1String("FormEditor.BuddyEditor")); - createEditModeAction(m_actionGroupEditMode, globalcontext, am, medit, + createEditModeAction(m_actionGroupEditMode, m_contexts, am, medit, tr("Edit buddies"), m_toolActionIds.back(), EditModeBuddyEditor, QLatin1String("buddytool.png")); m_toolActionIds.push_back(QLatin1String("FormEditor.TabOrderEditor")); - createEditModeAction(m_actionGroupEditMode, globalcontext, am, medit, + createEditModeAction(m_actionGroupEditMode, m_contexts, am, medit, tr("Edit tab order"), m_toolActionIds.back(), EditModeTabOrderEditor, QLatin1String("tabordertool.png")); //tool actions m_toolActionIds.push_back(QLatin1String("FormEditor.LayoutHorizontally")); const QString horizLayoutShortcut = osMac ? tr("Meta+H") : tr("Ctrl+H"); - addToolAction(m_fwm->actionHorizontalLayout(), am, globalcontext, + addToolAction(m_fwm->actionHorizontalLayout(), am, m_contexts, m_toolActionIds.back(), mformtools, horizLayoutShortcut); m_toolActionIds.push_back(QLatin1String("FormEditor.LayoutVertically")); const QString vertLayoutShortcut = osMac ? tr("Meta+L") : tr("Ctrl+L"); - addToolAction(m_fwm->actionVerticalLayout(), am, globalcontext, + addToolAction(m_fwm->actionVerticalLayout(), am, m_contexts, m_toolActionIds.back(), mformtools, vertLayoutShortcut); m_toolActionIds.push_back(QLatin1String("FormEditor.SplitHorizontal")); - addToolAction(m_fwm->actionSplitHorizontal(), am, globalcontext, + addToolAction(m_fwm->actionSplitHorizontal(), am, m_contexts, m_toolActionIds.back(), mformtools); m_toolActionIds.push_back(QLatin1String("FormEditor.SplitVertical")); - addToolAction(m_fwm->actionSplitVertical(), am, globalcontext, + addToolAction(m_fwm->actionSplitVertical(), am, m_contexts, m_toolActionIds.back(), mformtools); m_toolActionIds.push_back(QLatin1String("FormEditor.LayoutForm")); - addToolAction(m_fwm->actionFormLayout(), am, globalcontext, + addToolAction(m_fwm->actionFormLayout(), am, m_contexts, m_toolActionIds.back(), mformtools); m_toolActionIds.push_back(QLatin1String("FormEditor.LayoutGrid")); const QString gridShortcut = osMac ? tr("Meta+G") : tr("Ctrl+G"); - addToolAction(m_fwm->actionGridLayout(), am, globalcontext, + addToolAction(m_fwm->actionGridLayout(), am, m_contexts, m_toolActionIds.back(), mformtools, gridShortcut); m_toolActionIds.push_back(QLatin1String("FormEditor.LayoutBreak")); - addToolAction(m_fwm->actionBreakLayout(), am, globalcontext, + addToolAction(m_fwm->actionBreakLayout(), am, m_contexts, m_toolActionIds.back(), mformtools); m_toolActionIds.push_back(QLatin1String("FormEditor.LayoutAdjustSize")); const QString adjustShortcut = osMac ? tr("Meta+J") : tr("Ctrl+J"); - addToolAction(m_fwm->actionAdjustSize(), am, globalcontext, + addToolAction(m_fwm->actionAdjustSize(), am, m_contexts, m_toolActionIds.back(), mformtools, adjustShortcut); m_toolActionIds.push_back(QLatin1String("FormEditor.SimplifyLayout")); - addToolAction(m_fwm->actionSimplifyLayout(), am, globalcontext, + addToolAction(m_fwm->actionSimplifyLayout(), am, m_contexts, m_toolActionIds.back(), mformtools); createSeparator(this, am, m_contexts, mformtools, QLatin1String("FormEditor.Menu.Tools.Separator1")); - addToolAction(m_fwm->actionLower(), am, globalcontext, + addToolAction(m_fwm->actionLower(), am, m_contexts, QLatin1String("FormEditor.Lower"), mformtools); - addToolAction(m_fwm->actionRaise(), am, globalcontext, + addToolAction(m_fwm->actionRaise(), am, m_contexts, QLatin1String("FormEditor.Raise"), mformtools); // Commands that do not go into the editor toolbar - createSeparator(this, am, globalcontext, mformtools, QLatin1String("FormEditor.Menu.Tools.Separator2")); + createSeparator(this, am, m_contexts, mformtools, QLatin1String("FormEditor.Menu.Tools.Separator2")); m_actionPreview = m_fwm->actionDefaultPreview(); QTC_ASSERT(m_actionPreview, return); - addToolAction(m_actionPreview, am, globalcontext, + addToolAction(m_actionPreview, am, m_contexts, QLatin1String("FormEditor.Preview"), mformtools, tr("Ctrl+Alt+R")); // Preview in style... @@ -524,19 +519,19 @@ void FormEditorW::setupActions() // Form settings createSeparator(this, am, m_contexts, medit, QLatin1String("FormEditor.Edit.Separator2"), Core::Constants::G_EDIT_OTHER); - createSeparator(this, am, globalcontext, mformtools, QLatin1String("FormEditor.Menu.Tools.Separator3")); + createSeparator(this, am, m_contexts, mformtools, QLatin1String("FormEditor.Menu.Tools.Separator3")); QAction *actionFormSettings = m_fwm->actionShowFormWindowSettingsDialog(); - addToolAction(actionFormSettings, am, globalcontext, QLatin1String("FormEditor.FormSettings"), mformtools); + addToolAction(actionFormSettings, am, m_contexts, QLatin1String("FormEditor.FormSettings"), mformtools); - createSeparator(this, am, globalcontext, mformtools, QLatin1String("FormEditor.Menu.Tools.Separator4")); + createSeparator(this, am, m_contexts, mformtools, QLatin1String("FormEditor.Menu.Tools.Separator4")); m_actionAboutPlugins = new QAction(tr("About Qt Designer plugins...."), this); - addToolAction(m_actionAboutPlugins, am, globalcontext, + addToolAction(m_actionAboutPlugins, am, m_contexts, QLatin1String("FormEditor.AboutPlugins"), mformtools); connect(m_actionAboutPlugins, SIGNAL(triggered()), m_fwm, SLOT(aboutPlugins())); m_actionAboutPlugins->setEnabled(false); // Views. Populated later on. - createSeparator(this, am, globalcontext, mformtools, QLatin1String("FormEditor.Menu.Tools.SeparatorViews")); + createSeparator(this, am, m_contexts, mformtools, QLatin1String("FormEditor.Menu.Tools.SeparatorViews")); m_viewMenu = am->createMenu(QLatin1String(M_FORMEDITOR_VIEWS)); m_viewMenu->menu()->setTitle(tr("Views")); @@ -639,6 +634,7 @@ QAction *FormEditorW::createEditModeAction(QActionGroup *ag, if (!iconName.isEmpty()) rc->setIcon(designerIcon(iconName)); Core::Command *command = am->registerAction(rc, name, context); + command->setAttribute(Core::Command::CA_Hide); if (!keySequence.isEmpty()) command->setDefaultKeySequence(QKeySequence(keySequence)); bindShortcut(command, rc); @@ -715,12 +711,6 @@ void FormEditorW::currentEditorChanged(Core::IEditor *editor) QTC_ASSERT(fw, return) m_editorWidget->setVisibleEditor(xmlEditor); m_fwm->setActiveFormWindow(fw->formWindow()); - m_actionGroupEditMode->setVisible(true); - m_modeActionSeparator->setVisible(true); - } else { - // Deactivate Designer if a non-form is being edited - m_actionGroupEditMode->setVisible(false); - m_modeActionSeparator->setVisible(false); } } diff --git a/src/plugins/qmldesigner/qmldesignerplugin.cpp b/src/plugins/qmldesigner/qmldesignerplugin.cpp index e7cd5fb2175f9d8e663f037a407bcc4eba1afab1..99cf54933bcdc75174c638d1485bd92a7a95dd41 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.cpp +++ b/src/plugins/qmldesigner/qmldesignerplugin.cpp @@ -303,7 +303,7 @@ void BauhausPlugin::extensionsInitialized() m_mimeTypes << "application/x-qml" << "application/javascript" << "application/x-javascript" << "text/javascript"; - m_designMode->registerDesignWidget(m_mainWidget, m_mimeTypes); + m_designMode->registerDesignWidget(m_mainWidget, m_mimeTypes, m_context->context()); connect(m_designMode, SIGNAL(actionsUpdated(Core::IEditor*)), SLOT(updateActions(Core::IEditor*))); }