From e367a39c714383e24aafdcb31fda64435165fd05 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 21 Mar 2013 12:51:39 +0100 Subject: [PATCH] QmlDesigner: adding interface to customize toolbar buttons WidgetInfo contains now a factory for the toolbar buttons. The ownership of the factory is taken by the SideBarItem. Change-Id: Iffa32359cd3f0cb5b378abc5371d810aee31649c Reviewed-by: Marco Bubke --- .../components/debugview/debugview.cpp | 2 +- .../components/formeditor/formeditorview.cpp | 2 +- .../itemlibrary/itemlibraryview.cpp | 6 +++- .../components/navigator/navigatorview.cpp | 6 +++- .../propertyeditor/propertyeditor.cpp | 2 +- .../stateseditor/stateseditorview.cpp | 2 +- .../designercore/include/abstractview.h | 36 ++++++++++++++++++- .../designercore/model/abstractview.cpp | 2 ++ src/plugins/qmldesigner/designmodewidget.cpp | 32 +++++++++++------ 9 files changed, 72 insertions(+), 18 deletions(-) diff --git a/src/plugins/qmldesigner/components/debugview/debugview.cpp b/src/plugins/qmldesigner/components/debugview/debugview.cpp index 2a2db625db6..a2ac1cd62b4 100644 --- a/src/plugins/qmldesigner/components/debugview/debugview.cpp +++ b/src/plugins/qmldesigner/components/debugview/debugview.cpp @@ -249,7 +249,7 @@ void DebugView::rewriterEndTransaction() WidgetInfo DebugView::widgetInfo() { - return createWidgetInfo(m_debugViewWidget.data(), QLatin1String("DebugView"), WidgetInfo::LeftPane, 0, tr("Debug View")); + return createWidgetInfo(m_debugViewWidget.data(), 0, QLatin1String("DebugView"), WidgetInfo::LeftPane, 0, tr("Debug View")); } bool DebugView::hasWidget() const diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp index e53a4dfdc10..cf994e80bc3 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp @@ -277,7 +277,7 @@ void FormEditorView::bindingPropertiesChanged(const QList& prop WidgetInfo FormEditorView::widgetInfo() { - return createWidgetInfo(m_formEditorWidget.data(), "FormEditor", WidgetInfo::CentralPane, 0, tr("Form Editor")); + return createWidgetInfo(m_formEditorWidget.data(), 0, "FormEditor", WidgetInfo::CentralPane, 0, tr("Form Editor")); } FormEditorWidget *FormEditorView::formEditorWidget() diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp index 16f59104bf9..f7dfb121c1c 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp @@ -53,7 +53,11 @@ WidgetInfo ItemLibraryView::widgetInfo() if (m_widget.isNull()) m_widget = new ItemLibraryWidget; - return createWidgetInfo(m_widget.data(), QLatin1String("Library"), WidgetInfo::LeftPane, 0); + return createWidgetInfo(m_widget.data(), + new WidgetInfo::ToolBarWidgetDefaultFactory(m_widget.data()), + QLatin1String("Library"), + WidgetInfo::LeftPane, + 0); } void ItemLibraryView::modelAttached(Model *model) diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp index efb47800c56..dbc1ae1bdde 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp @@ -106,7 +106,11 @@ bool NavigatorView::hasWidget() const WidgetInfo NavigatorView::widgetInfo() { - return createWidgetInfo(m_widget.data(), QLatin1String("Navigator"), WidgetInfo::LeftPane, 0); + return createWidgetInfo(m_widget.data(), + new WidgetInfo::ToolBarWidgetDefaultFactory(m_widget.data()), + QLatin1String("Navigator"), + WidgetInfo::LeftPane, + 0); } void NavigatorView::modelAttached(Model *model) diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp index 4a28986b49b..07be74f0468 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp @@ -968,7 +968,7 @@ bool PropertyEditor::hasWidget() const WidgetInfo PropertyEditor::widgetInfo() { - return createWidgetInfo(m_stackedWidget, QLatin1String("Properties"), WidgetInfo::RightPane, 0); + return createWidgetInfo(m_stackedWidget, 0, QLatin1String("Properties"), WidgetInfo::RightPane, 0); } void PropertyEditor::actualStateChanged(const ModelNode &node) diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp index b44965333c5..ffea5bfe2ec 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp @@ -62,7 +62,7 @@ StatesEditorView::StatesEditorView(QObject *parent) : WidgetInfo StatesEditorView::widgetInfo() { - return createWidgetInfo(m_statesEditorWidget.data(), "StatesEditor", WidgetInfo::TopPane, 0, tr("States Editor")); + return createWidgetInfo(m_statesEditorWidget.data(), 0, "StatesEditor", WidgetInfo::TopPane, 0, tr("States Editor")); } void StatesEditorView::removeState(int nodeId) diff --git a/src/plugins/qmldesigner/designercore/include/abstractview.h b/src/plugins/qmldesigner/designercore/include/abstractview.h index b196d209d2e..bcce99a3779 100644 --- a/src/plugins/qmldesigner/designercore/include/abstractview.h +++ b/src/plugins/qmldesigner/designercore/include/abstractview.h @@ -42,6 +42,7 @@ QT_BEGIN_NAMESPACE class QStyle; +class QToolButton; QT_END_NAMESPACE namespace QmlDesigner { @@ -58,7 +59,32 @@ class QmlModelView; class NodeInstanceView; class RewriterView; -struct WidgetInfo { +class WidgetInfo { + +public: + class ToolBarWidgetFactoryInterface { + public: + ToolBarWidgetFactoryInterface() + {} + + virtual QList createToolBarWidgets() = 0; + }; + + template + class ToolBarWidgetDefaultFactory : public ToolBarWidgetFactoryInterface { + public: + ToolBarWidgetDefaultFactory(T *t ) : m_t(t) + {} + + QList createToolBarWidgets() + { + return m_t->createToolBarWidgets(); + } + + private: + T * m_t; + }; + enum PlacementHint { NoPane, LeftPane, @@ -68,11 +94,18 @@ struct WidgetInfo { CentralPane // not used }; + WidgetInfo() + : widget(0), + toolBarWidgetFactory(0) + { + } + QString uniqueId; QString tabName; QWidget *widget; int placementPriority; PlacementHint placementHint; + ToolBarWidgetFactoryInterface *toolBarWidgetFactory; }; @@ -205,6 +238,7 @@ protected: void setModel(Model * model); void removeModel(); static WidgetInfo createWidgetInfo(QWidget *widget = 0, + WidgetInfo::ToolBarWidgetFactoryInterface *toolBarWidgetFactory = 0, const QString &uniqueId = QString(), WidgetInfo::PlacementHint placementHint = WidgetInfo::NoPane, int placementPriority = 0, diff --git a/src/plugins/qmldesigner/designercore/model/abstractview.cpp b/src/plugins/qmldesigner/designercore/model/abstractview.cpp index 6d15f2a521a..9653ed6d8d8 100644 --- a/src/plugins/qmldesigner/designercore/model/abstractview.cpp +++ b/src/plugins/qmldesigner/designercore/model/abstractview.cpp @@ -119,6 +119,7 @@ void AbstractView::removeModel() } WidgetInfo AbstractView::createWidgetInfo(QWidget *widget, + WidgetInfo::ToolBarWidgetFactoryInterface *toolBarWidgetFactory, const QString &uniqueId, WidgetInfo::PlacementHint placementHint, int placementPriority, @@ -127,6 +128,7 @@ WidgetInfo AbstractView::createWidgetInfo(QWidget *widget, WidgetInfo widgetInfo; widgetInfo.widget = widget; + widgetInfo.toolBarWidgetFactory = toolBarWidgetFactory; widgetInfo.uniqueId = uniqueId; widgetInfo.placementHint = placementHint; widgetInfo.placementPriority = placementPriority; diff --git a/src/plugins/qmldesigner/designmodewidget.cpp b/src/plugins/qmldesigner/designmodewidget.cpp index 3c82b3b7189..ad5afb80438 100644 --- a/src/plugins/qmldesigner/designmodewidget.cpp +++ b/src/plugins/qmldesigner/designmodewidget.cpp @@ -149,25 +149,35 @@ QList ItemLibrarySideBarItem::createToolBarWidgets() return qobject_cast(widget())->createToolBarWidgets(); } -class NavigatorSideBarItem : public Core::SideBarItem +class DesignerSideBarItem : public Core::SideBarItem { public: - explicit NavigatorSideBarItem(QWidget *widget, const QString &id); - virtual ~NavigatorSideBarItem(); + explicit DesignerSideBarItem(QWidget *widget, WidgetInfo::ToolBarWidgetFactoryInterface *createToolBarWidgets, const QString &id); + virtual ~DesignerSideBarItem(); virtual QList createToolBarWidgets(); + +private: + WidgetInfo::ToolBarWidgetFactoryInterface *m_toolBarWidgetFactory; + }; -NavigatorSideBarItem::NavigatorSideBarItem(QWidget *widget, const QString &id) : Core::SideBarItem(widget, id) {} - -NavigatorSideBarItem::~NavigatorSideBarItem() +DesignerSideBarItem::DesignerSideBarItem(QWidget *widget, WidgetInfo::ToolBarWidgetFactoryInterface *toolBarWidgetFactory, const QString &id) + : Core::SideBarItem(widget, id) , m_toolBarWidgetFactory(toolBarWidgetFactory) { - } -QList NavigatorSideBarItem::createToolBarWidgets() +DesignerSideBarItem::~DesignerSideBarItem() { - return qobject_cast(widget())->createToolBarWidgets(); + delete m_toolBarWidgetFactory; +} + +QList DesignerSideBarItem::createToolBarWidgets() +{ + if (m_toolBarWidgetFactory) + return m_toolBarWidgetFactory->createToolBarWidgets(); + + return QList(); } void DocumentWarningWidget::goToError() @@ -357,13 +367,13 @@ void DesignModeWidget::setup() foreach (const WidgetInfo &widgetInfo, viewManager().widgetInfos()) { if (widgetInfo.placementHint == widgetInfo.LeftPane) { - Core::SideBarItem *sideBarItem = new NavigatorSideBarItem(widgetInfo.widget, widgetInfo.uniqueId); + Core::SideBarItem *sideBarItem = new DesignerSideBarItem(widgetInfo.widget, widgetInfo.toolBarWidgetFactory, widgetInfo.uniqueId); sideBarItems.append(sideBarItem); leftSideBarItems.append(sideBarItem); } if (widgetInfo.placementHint == widgetInfo.RightPane) { - Core::SideBarItem *sideBarItem = new NavigatorSideBarItem(widgetInfo.widget, widgetInfo.uniqueId); + Core::SideBarItem *sideBarItem = new DesignerSideBarItem(widgetInfo.widget, widgetInfo.toolBarWidgetFactory, widgetInfo.uniqueId); sideBarItems.append(sideBarItem); rightSideBarItems.append(sideBarItem); }