From 54da43784a1d9e3b23d7781fc164c9c734e21852 Mon Sep 17 00:00:00 2001 From: Marco Bubke <marco.bubke@digia.com> Date: Mon, 18 Mar 2013 15:52:36 +0100 Subject: [PATCH] QmlDesigner: Add custom tool interface Change-Id: I71a1063a1de3e4bb445bf9f8faa5553da3b5c4ab Reviewed-by: Thomas Hartmann <Thomas.Hartmann@digia.com> --- .../formeditor/abstractcustomtool.cpp | 18 ++++++++++++ .../formeditor/abstractcustomtool.h | 20 +++++++++++++ .../formeditor/abstractformeditortool.cpp | 5 +++- .../formeditor/abstractformeditortool.h | 4 ++- .../components/formeditor/formeditor.pri | 6 ++-- .../components/formeditor/formeditorview.cpp | 29 +++++++++++++++++-- .../components/formeditor/formeditorview.h | 7 +++-- .../designercore/include/viewmanager.h | 2 +- .../designercore/model/viewmanager.cpp | 2 +- 9 files changed, 81 insertions(+), 12 deletions(-) create mode 100644 src/plugins/qmldesigner/components/formeditor/abstractcustomtool.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/abstractcustomtool.h diff --git a/src/plugins/qmldesigner/components/formeditor/abstractcustomtool.cpp b/src/plugins/qmldesigner/components/formeditor/abstractcustomtool.cpp new file mode 100644 index 00000000000..8bda149a7de --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/abstractcustomtool.cpp @@ -0,0 +1,18 @@ +#include "abstractcustomtool.h" + +#include "formeditorview.h" + +namespace QmlDesigner { + +AbstractCustomTool::AbstractCustomTool(FormEditorView* view) + : AbstractFormEditorTool(view) +{ +} + +void AbstractCustomTool::selectedItemsChanged(const QList<FormEditorItem *> &itemList) +{ + view()->changeToSelectionTool(); +} + + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/formeditor/abstractcustomtool.h b/src/plugins/qmldesigner/components/formeditor/abstractcustomtool.h new file mode 100644 index 00000000000..f375b2e4d9e --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/abstractcustomtool.h @@ -0,0 +1,20 @@ +#ifndef QMLDESIGNER_ABSTRACTSINGLESELECTIONTOOL_H +#define QMLDESIGNER_ABSTRACTSINGLESELECTIONTOOL_H + +#include "abstractformeditortool.h" + +namespace QmlDesigner { + +class QMLDESIGNERCORE_EXPORT AbstractCustomTool : public QmlDesigner::AbstractFormEditorTool +{ +public: + AbstractCustomTool(FormEditorView* view); + + void selectedItemsChanged(const QList<FormEditorItem *> &itemList); + + virtual bool wantHandleItem(const ModelNode &modelNode) const = 0; +}; + +} // namespace QmlDesigner + +#endif // QMLDESIGNER_ABSTRACTSINGLESELECTIONTOOL_H diff --git a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp index 0ed61fcf9c1..94ec91745c7 100644 --- a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp @@ -204,8 +204,11 @@ void AbstractFormEditorTool::mouseReleaseEvent(const QList<QGraphicsItem*> & /*i } } -void AbstractFormEditorTool::mouseDoubleClickEvent(const QList<QGraphicsItem*> &, QGraphicsSceneMouseEvent *) +void AbstractFormEditorTool::mouseDoubleClickEvent(const QList<QGraphicsItem*> &itemList, QGraphicsSceneMouseEvent *) { + FormEditorItem *formEditorItem = topFormEditorItem(itemList); + if (formEditorItem) + view()->changeToCustomTool(formEditorItem->qmlItemNode().modelNode()); } void AbstractFormEditorTool::showContextMenu(QGraphicsSceneMouseEvent *event) diff --git a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.h b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.h index c66e65f83cb..05c1b460d4c 100644 --- a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.h +++ b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.h @@ -32,6 +32,8 @@ #include "formeditoritem.h" +#include <qmldesignercorelib_global.h> + QT_BEGIN_NAMESPACE class QGraphicsItem; QT_END_NAMESPACE @@ -40,7 +42,7 @@ namespace QmlDesigner { class FormEditorView; -class AbstractFormEditorTool +class QMLDESIGNERCORE_EXPORT AbstractFormEditorTool { public: diff --git a/src/plugins/qmldesigner/components/formeditor/formeditor.pri b/src/plugins/qmldesigner/components/formeditor/formeditor.pri index f2ca8013c96..8977752eb4d 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditor.pri +++ b/src/plugins/qmldesigner/components/formeditor/formeditor.pri @@ -33,7 +33,8 @@ SOURCES += formeditoritem.cpp \ formeditorgraphicsview.cpp \ numberseriesaction.cpp \ lineeditaction.cpp \ - formeditorcrumblebar.cpp + formeditorcrumblebar.cpp \ + abstractcustomtool.cpp HEADERS += formeditorscene.h \ formeditorwidget.h \ formeditoritem.h \ @@ -65,5 +66,6 @@ HEADERS += formeditorscene.h \ formeditorgraphicsview.h \ numberseriesaction.h \ lineeditaction.h \ - formeditorcrumblebar.h + formeditorcrumblebar.h \ + abstractcustomtool.h RESOURCES += formeditor.qrc diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp index 14800d0aab0..afdfc20cc01 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp @@ -37,6 +37,7 @@ #include "formeditoritem.h" #include "formeditorscene.h" #include "toolbox.h" +#include "abstractcustomtool.h" #include <designmodecontext.h> #include <rewritertransaction.h> @@ -96,7 +97,7 @@ FormEditorView::~FormEditorView() delete m_dragTool; m_dragTool = 0; - qDeleteAll(m_toolList); + qDeleteAll(m_customToolList); // delete scene after tools to prevent double deletion // of items @@ -413,9 +414,31 @@ void FormEditorView::changeToTransformTools() changeToSelectionTool(); } -void FormEditorView::registerTool(AbstractFormEditorTool *tool) +void FormEditorView::changeToCustomTool(const ModelNode &modelNode) { - m_toolList.append(tool); + int handlingRank = 0; + AbstractCustomTool *selectedCustomTool; + + foreach (AbstractCustomTool *customTool, m_customToolList) { + if (customTool->wantHandleItem(modelNode) > handlingRank) { + handlingRank = customTool->wantHandleItem(modelNode); + selectedCustomTool = customTool; + } + + } + + if (handlingRank > 0) { + m_scene->updateAllFormEditorItems(); + m_currentTool->clear(); + m_currentTool = selectedCustomTool; + m_currentTool->clear(); + m_currentTool->setItems(scene()->itemsForQmlItemNodes(selectedQmlItemNodes())); + } +} + +void FormEditorView::registerTool(AbstractCustomTool *tool) +{ + m_customToolList.append(tool); } void FormEditorView::nodeSlidedToIndex(const NodeListProperty &listProperty, int /*newIndex*/, int /*oldIndex*/) diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.h b/src/plugins/qmldesigner/components/formeditor/formeditorview.h index 045e1d62930..b29084f9617 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorview.h +++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.h @@ -49,6 +49,7 @@ class FormEditorScene; class NodeInstanceView; class AbstractFormEditorTool; +class AbstractCustomTool; class MoveTool; class SelectionTool; class ResizeTool; @@ -98,9 +99,9 @@ public: void changeToSelectionTool(QGraphicsSceneMouseEvent *event); void changeToResizeTool(); void changeToTransformTools(); + void changeToCustomTool(const ModelNode &modelNode); - - void registerTool(AbstractFormEditorTool *tool); + void registerTool(AbstractCustomTool *tool); void nodeSlidedToIndex(const NodeListProperty &listProperty, int newIndex, int oldIndex); void auxiliaryDataChanged(const ModelNode &node, const PropertyName &name, const QVariant &data) QTC_OVERRIDE; @@ -140,7 +141,7 @@ private: //functions private: //variables QWeakPointer<FormEditorWidget> m_formEditorWidget; QWeakPointer<FormEditorScene> m_scene; - QList<AbstractFormEditorTool*> m_toolList; + QList<AbstractCustomTool*> m_customToolList; MoveTool *m_moveTool; SelectionTool *m_selectionTool; ResizeTool *m_resizeTool; diff --git a/src/plugins/qmldesigner/designercore/include/viewmanager.h b/src/plugins/qmldesigner/designercore/include/viewmanager.h index 0afe9fc378e..47c6edbb7c5 100644 --- a/src/plugins/qmldesigner/designercore/include/viewmanager.h +++ b/src/plugins/qmldesigner/designercore/include/viewmanager.h @@ -72,7 +72,7 @@ public: void resetPropertyEditorView(); - void registerFormEditorTool(AbstractFormEditorTool *tool); // takes ownership + void registerFormEditorTool(AbstractCustomTool *tool); // takes ownership void registerView(AbstractView *view); QList<WidgetInfo> widgetInfos(); diff --git a/src/plugins/qmldesigner/designercore/model/viewmanager.cpp b/src/plugins/qmldesigner/designercore/model/viewmanager.cpp index cdeca6a1ffb..fd70c264bf9 100644 --- a/src/plugins/qmldesigner/designercore/model/viewmanager.cpp +++ b/src/plugins/qmldesigner/designercore/model/viewmanager.cpp @@ -89,7 +89,7 @@ void ViewManager::resetPropertyEditorView() m_propertyEditorView.resetView(); } -void ViewManager::registerFormEditorTool(AbstractFormEditorTool *tool) +void ViewManager::registerFormEditorTool(AbstractCustomTool *tool) { m_formEditorView.registerTool(tool); } -- GitLab