From 1e06df7d40f8b1462490636b6a9cb98a10517cad Mon Sep 17 00:00:00 2001 From: con <qtc-committer@nokia.com> Date: Tue, 11 Aug 2009 15:32:53 +0200 Subject: [PATCH] Add views menu for form editor. --- .../actionmanager/actionmanager.cpp | 1 - .../coreplugin/actionmanager/command.cpp | 1 + src/plugins/designer/designerconstants.h | 1 + src/plugins/designer/editorwidget.h | 1 + src/plugins/designer/formeditorw.cpp | 113 ++++++++++++++++-- src/plugins/designer/formeditorw.h | 17 ++- src/plugins/designer/formwindoweditor.h | 5 +- 7 files changed, 129 insertions(+), 10 deletions(-) diff --git a/src/plugins/coreplugin/actionmanager/actionmanager.cpp b/src/plugins/coreplugin/actionmanager/actionmanager.cpp index 62476f37309..0f245bc4b0e 100644 --- a/src/plugins/coreplugin/actionmanager/actionmanager.cpp +++ b/src/plugins/coreplugin/actionmanager/actionmanager.cpp @@ -359,7 +359,6 @@ Command *ActionManagerPrivate::registerOverridableAction(QAction *action, const baseAction->setSeparator(action->isSeparator()); baseAction->setShortcutContext(Qt::ApplicationShortcut); baseAction->setEnabled(false); - baseAction->setObjectName(id); baseAction->setParent(m_mainWnd); #ifdef Q_WS_MAC baseAction->setIconVisibleInMenu(false); diff --git a/src/plugins/coreplugin/actionmanager/command.cpp b/src/plugins/coreplugin/actionmanager/command.cpp index adb6f6cae95..07fd00cb37b 100644 --- a/src/plugins/coreplugin/actionmanager/command.cpp +++ b/src/plugins/coreplugin/actionmanager/command.cpp @@ -495,6 +495,7 @@ void OverrideableAction::actionChanged() m_action->setWhatsThis(m_currentAction->whatsThis()); } + m_action->setCheckable(m_currentAction->isCheckable()); bool block = m_action->blockSignals(true); m_action->setChecked(m_currentAction->isChecked()); m_action->blockSignals(block); diff --git a/src/plugins/designer/designerconstants.h b/src/plugins/designer/designerconstants.h index 6896c67a4e8..079705e446d 100644 --- a/src/plugins/designer/designerconstants.h +++ b/src/plugins/designer/designerconstants.h @@ -42,6 +42,7 @@ const char * const SETTINGS_CPP_SETTINGS = QT_TRANSLATE_NOOP("Designer", "Class const char * const C_FORMEDITOR = "FormEditor"; const char * const T_FORMEDITOR = "FormEditor.Toolbar"; const char * const M_FORMEDITOR = "FormEditor.Menu"; +const char * const M_FORMEDITOR_VIEWS = "FormEditor.Menu.Views"; const char * const M_FORMEDITOR_PREVIEW = "FormEditor.Menu.Preview"; // Wizard type diff --git a/src/plugins/designer/editorwidget.h b/src/plugins/designer/editorwidget.h index a18e86166ac..05ae7456f8c 100644 --- a/src/plugins/designer/editorwidget.h +++ b/src/plugins/designer/editorwidget.h @@ -78,6 +78,7 @@ public: explicit EditorWidget(QWidget *formWindow); void setDefaultLayout(); + QDockWidget* const* dockWidgets() const { return m_designerDockWidgets; } static void saveState(QSettings *settings); static void restoreState(QSettings *settings); diff --git a/src/plugins/designer/formeditorw.cpp b/src/plugins/designer/formeditorw.cpp index a3179bcc7ff..c5a93f4936a 100644 --- a/src/plugins/designer/formeditorw.cpp +++ b/src/plugins/designer/formeditorw.cpp @@ -66,6 +66,7 @@ #include <QtGui/QActionGroup> #include <QtGui/QApplication> #include <QtGui/QCursor> +#include <QtGui/QDockWidget> #include <QtGui/QMenu> #include <QtGui/QMainWindow> #include <QtGui/QMessageBox> @@ -158,11 +159,71 @@ static inline void addToolAction(QAction *a, c1->addAction(command); } -// --------- FormEditorW - using namespace Designer::Internal; using namespace Designer::Constants; +// --------- Proxy Action + +ProxyAction::ProxyAction(const QString &defaultText, QObject *parent) + : QAction(defaultText, parent), + m_defaultText(defaultText), + m_action(0) +{ + setEnabled(false); +} + +void ProxyAction::setAction(QAction *action) +{ + if (m_action) { + disconnect(m_action, SIGNAL(changed()), this, SLOT(update())); + disconnect(this, SIGNAL(triggered(bool)), m_action, SIGNAL(triggered(bool))); + disconnect(this, SIGNAL(toggled(bool)), m_action, SLOT(setChecked(bool))); + } + m_action = action; + if (!m_action) { + setEnabled(false); +// if (hasAttribute(CA_Hide)) +// m_action->setVisible(false); +// if (hasAttribute(CA_UpdateText)) { + setText(m_defaultText); +// } + } else { + setCheckable(m_action->isCheckable()); + setSeparator(m_action->isSeparator()); + connect(m_action, SIGNAL(changed()), this, SLOT(update())); + // we want to avoid the toggling semantic on slot trigger(), so we just connect the signals + connect(this, SIGNAL(triggered(bool)), m_action, SIGNAL(triggered(bool))); + // we need to update the checked state, so we connect to setChecked slot, which also fires a toggled signal + connect(this, SIGNAL(toggled(bool)), m_action, SLOT(setChecked(bool))); + update(); + } +} + +void ProxyAction::update() +{ + QTC_ASSERT(m_action, return) + bool block = blockSignals(true); +// if (hasAttribute(CA_UpdateIcon)) { + setIcon(m_action->icon()); + setIconText(m_action->iconText()); +// } +// if (hasAttribute(CA_UpdateText)) { + setText(m_action->text()); + setToolTip(m_action->toolTip()); + setStatusTip(m_action->statusTip()); + setWhatsThis(m_action->whatsThis()); +// } + + setChecked(m_action->isChecked()); + + setEnabled(m_action->isEnabled()); + setVisible(m_action->isVisible()); + blockSignals(block); + emit changed(); +} + +// --------- FormEditorW + FormEditorW *FormEditorW::m_self = 0; FormEditorW::FormEditorW() : @@ -185,6 +246,8 @@ FormEditorW::FormEditorW() : qFill(m_designerSubWindows, m_designerSubWindows + Designer::Constants::DesignerSubWindowCount, static_cast<QWidget *>(0)); + qFill(m_designerSubWindowActions, m_designerSubWindowActions + Designer::Constants::DesignerSubWindowCount, + static_cast<ProxyAction *>(0)); m_formeditor->setTopLevel(qobject_cast<QWidget *>(m_core->editorManager())); m_formeditor->setSettingsManager(new SettingsManager()); @@ -268,26 +331,26 @@ void FormEditorW::initDesignerSubWindows() qFill(m_designerSubWindows, m_designerSubWindows + Designer::Constants::DesignerSubWindowCount, static_cast<QWidget*>(0)); QDesignerWidgetBoxInterface *wb = QDesignerComponents::createWidgetBox(m_formeditor, 0); - wb->setWindowTitle(tr("Designer widgetbox")); + wb->setWindowTitle(tr("Widget Box")); m_formeditor->setWidgetBox(wb); m_designerSubWindows[WidgetBoxSubWindow] = wb; QDesignerObjectInspectorInterface *oi = QDesignerComponents::createObjectInspector(m_formeditor, 0); - oi->setWindowTitle(tr("Object inspector")); + oi->setWindowTitle(tr("Object Inspector")); m_formeditor->setObjectInspector(oi); m_designerSubWindows[ObjectInspectorSubWindow] = oi; QDesignerPropertyEditorInterface *pe = QDesignerComponents::createPropertyEditor(m_formeditor, 0); - pe->setWindowTitle(tr("Property editor")); + pe->setWindowTitle(tr("Property Editor")); m_formeditor->setPropertyEditor(pe); m_designerSubWindows[PropertyEditorSubWindow] = pe; QWidget *se = QDesignerComponents::createSignalSlotEditor(m_formeditor, 0); - se->setWindowTitle(tr("Signals and slots editor")); + se->setWindowTitle(tr("Signals & Slots Editor")); m_designerSubWindows[SignalSlotEditorSubWindow] = se; QDesignerActionEditorInterface *ae = QDesignerComponents::createActionEditor(m_formeditor, 0); - ae->setWindowTitle(tr("Action editor")); + ae->setWindowTitle(tr("Action Editor")); m_formeditor->setActionEditor(ae); m_designerSubWindows[ActionEditorSubWindow] = ae; } @@ -431,6 +494,33 @@ void FormEditorW::setupActions() addToolAction(m_fwm->actionRaise(), am, globalcontext, QLatin1String("FormEditor.Raise"), mformtools); + // Views + createSeparator(this, am, globalcontext, mformtools, QLatin1String("FormEditor.Menu.Tools.SeparatorViews")); + + Core::ActionContainer *mviews = am->createMenu(M_FORMEDITOR_VIEWS); + mviews->menu()->setTitle(tr("Views...")); + mformtools->addMenu(mviews); + + m_designerSubWindowActions[WidgetBoxSubWindow] = new ProxyAction(tr("Widget Box"), this); + addToolAction(m_designerSubWindowActions[WidgetBoxSubWindow], am, globalcontext, + QLatin1String("FormEditor.WidgetBox"), mviews, ""); + + m_designerSubWindowActions[ObjectInspectorSubWindow] = new ProxyAction(tr("Object Inspector"), this); + addToolAction(m_designerSubWindowActions[ObjectInspectorSubWindow], am, globalcontext, + QLatin1String("FormEditor.ObjectInspector"), mviews, ""); + + m_designerSubWindowActions[PropertyEditorSubWindow] = new ProxyAction(tr("Property Editor"), this); + addToolAction(m_designerSubWindowActions[PropertyEditorSubWindow], am, globalcontext, + QLatin1String("FormEditor.PropertyEditor"), mviews, ""); + + m_designerSubWindowActions[SignalSlotEditorSubWindow] = new ProxyAction(tr("Signals & Slots Editor"), this); + addToolAction(m_designerSubWindowActions[SignalSlotEditorSubWindow], am, globalcontext, + QLatin1String("FormEditor.SignalsAndSlotsEditor"), mviews, ""); + + m_designerSubWindowActions[ActionEditorSubWindow] = new ProxyAction(tr("Action Editor"), this); + addToolAction(m_designerSubWindowActions[ActionEditorSubWindow], am, globalcontext, + QLatin1String("FormEditor.ActionEditor"), mviews, ""); + // Commands that do not go into the editor toolbar createSeparator(this, am, globalcontext, mformtools, QLatin1String("FormEditor.Menu.Tools.Separator2")); @@ -582,10 +672,19 @@ void FormEditorW::currentEditorChanged(Core::IEditor *editor) m_fwm->setActiveFormWindow(fw->formWindow()); m_actionGroupEditMode->setVisible(true); m_modeActionSeparator->setVisible(true); + QDockWidget * const*dockWidgets = fw->dockWidgets(); + for (int i = 0; i < Designer::Constants::DesignerSubWindowCount; ++i) { + if (m_designerSubWindowActions[i] != 0 && dockWidgets[i] != 0) + m_designerSubWindowActions[i]->setAction(dockWidgets[i]->toggleViewAction()); + } } else { m_actionGroupEditMode->setVisible(false); m_modeActionSeparator->setVisible(false); m_fwm->setActiveFormWindow(0); + for (int i = 0; i < Designer::Constants::DesignerSubWindowCount; ++i) { + if (m_designerSubWindowActions[i] != 0) + m_designerSubWindowActions[i]->setAction(0); + } } } diff --git a/src/plugins/designer/formeditorw.h b/src/plugins/designer/formeditorw.h index ef29952213b..2d2ae2eca0c 100644 --- a/src/plugins/designer/formeditorw.h +++ b/src/plugins/designer/formeditorw.h @@ -36,6 +36,7 @@ #include <QtCore/QObject> #include <QtCore/QPointer> #include <QtCore/QStringList> +#include <QtGui/QAction> #include "designerconstants.h" @@ -45,7 +46,6 @@ class QDesignerIntegrationInterface; class QDesignerFormEditorInterface; class QDesignerFormWindowInterface; -class QAction; class QActionGroup; class QFocusEvent; @@ -73,6 +73,20 @@ namespace Internal { class FormWindowEditor; class SettingsPage; +class ProxyAction : public QAction +{ + Q_OBJECT +public: + ProxyAction(const QString &defaultText, QObject *parent = 0); + void setAction(QAction *action); + +private slots: + void update(); + +private: + QString m_defaultText; + QPointer<QAction> m_action; +}; /** FormEditorW is a singleton that stores the Designer CoreInterface and * performs centralized operations. The instance() method will return an @@ -151,6 +165,7 @@ private: InitializationStage m_initStage; QWidget *m_designerSubWindows[Designer::Constants::DesignerSubWindowCount]; + ProxyAction *m_designerSubWindowActions[Designer::Constants::DesignerSubWindowCount]; QList<SettingsPage *> m_settingsPages; QActionGroup *m_actionGroupEditMode; diff --git a/src/plugins/designer/formwindoweditor.h b/src/plugins/designer/formwindoweditor.h index 2be6d7c45be..bcea69b3470 100644 --- a/src/plugins/designer/formwindoweditor.h +++ b/src/plugins/designer/formwindoweditor.h @@ -30,10 +30,13 @@ #ifndef FORMWINDOWEDITOR_H #define FORMWINDOWEDITOR_H +#include "editorwidget.h" + #include <coreplugin/editormanager/ieditor.h> #include <QtCore/QByteArray> #include <QtCore/QStringList> +#include <QtGui/QDockWidget> #include "designer_export.h" @@ -54,7 +57,6 @@ namespace Internal { class FormWindowFile; class FormWindowHost; -class EditorWidget; // Master class maintaining a form window editor, // containing file and widget host @@ -91,6 +93,7 @@ public: QWidget *integrationContainer(); void updateFormWindowSelectionHandles(bool state); void setSuggestedFileName(const QString &fileName); + QDockWidget* const* dockWidgets() const { return m_editorWidget->dockWidgets(); } QString contents() const; -- GitLab