diff --git a/src/plugins/qmldesigner/components/formeditor/abstractcustomtool.cpp b/src/plugins/qmldesigner/components/formeditor/abstractcustomtool.cpp new file mode 100644 index 0000000000000000000000000000000000000000..8bda149a7de7824e90aa8718221ae3815e8d2f15 --- /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 0000000000000000000000000000000000000000..f375b2e4d9e50582a05418e57f37cf802e95cc1f --- /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 0ed61fcf9c1321203ddb9a919141da0a3413ba5a..94ec91745c73bdfd99f9eb2b9a0055943e022c48 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 c66e65f83cbf0118f86c1bd8604786fb74e9fe4d..05c1b460d4c687b6a9980bee19d572c80a560eb5 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 f2ca8013c963ea4a99fc3274f50882d53a13c5ed..8977752eb4d5a40732af72d6dd6fa8ed27264de7 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 14800d0aab0af46a3699ad85ebb8a06eb32b690a..afdfc20cc01c068e743067f1fde9875e552b1435 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 045e1d629306d0442222caf6125ef1392c63cbee..b29084f9617839043fb35563133f6643f890f31c 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 0afe9fc378ef2a63f82d946fc88e9464a30eed18..47c6edbb7c5e64165781bb9a36982777fb56ff1a 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 cdeca6a1ffb2d71e7907d96624c892854f964db5..fd70c264bf940da73bfcd0f42d18ad0944f0b7e4 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); }