1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of Qt Creator.
7 **
8 ** Commercial License Usage
9 ** Licensees holding valid commercial Qt licenses may use this file in
10 ** accordance with the commercial license agreement provided with the
11 ** Software or, alternatively, in accordance with the terms contained in
12 ** a written agreement between you and The Qt Company. For licensing terms
13 ** and conditions see https://www.qt.io/terms-conditions. For further
14 ** information use the contact form at https://www.qt.io/contact-us.
15 **
16 ** GNU General Public License Usage
17 ** Alternatively, this file may be used under the terms of the GNU
18 ** General Public License version 3 as published by the Free Software
19 ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
20 ** included in the packaging of this file. Please review the following
21 ** information to ensure the GNU General Public License requirements will
22 ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
23 **
24 ****************************************************************************/
25 #pragma once
26 
27 #include "formeditoritem.h"
28 
29 #include <qmldesignercorelib_global.h>
30 
31 #include "snapper.h"
32 
33 QT_BEGIN_NAMESPACE
34 class QGraphicsItem;
35 QT_END_NAMESPACE
36 
37 namespace QmlDesigner {
38 
39 class FormEditorView;
40 
41 class QMLDESIGNERCORE_EXPORT AbstractFormEditorTool
42 {
43     friend FormEditorView;
44 
45 public:
46     AbstractFormEditorTool(FormEditorView* view);
47 
48     virtual ~AbstractFormEditorTool();
49 
50     virtual void mousePressEvent(const QList<QGraphicsItem*> &itemList, QGraphicsSceneMouseEvent *event);
51     virtual void mouseMoveEvent(const QList<QGraphicsItem*> &itemList, QGraphicsSceneMouseEvent *event) = 0;
52     virtual void mouseReleaseEvent(const QList<QGraphicsItem*> &itemList, QGraphicsSceneMouseEvent *event);
53     virtual void mouseDoubleClickEvent(const QList<QGraphicsItem*> &itemList, QGraphicsSceneMouseEvent *event);
54 
55     virtual void hoverMoveEvent(const QList<QGraphicsItem*> &itemList, QGraphicsSceneMouseEvent *event) = 0;
56 
57     virtual void dropEvent(const QList<QGraphicsItem*> &itemList, QGraphicsSceneDragDropEvent *event);
58     virtual void dragEnterEvent(const QList<QGraphicsItem*> &itemList, QGraphicsSceneDragDropEvent *event);
59     virtual void dragLeaveEvent(const QList<QGraphicsItem*> &itemList, QGraphicsSceneDragDropEvent *event) = 0;
60     virtual void dragMoveEvent(const QList<QGraphicsItem*> &itemList, QGraphicsSceneDragDropEvent *event) = 0;
61 
62     virtual void keyPressEvent(QKeyEvent *event) = 0;
63     virtual void keyReleaseEvent(QKeyEvent *keyEvent) = 0;
64 
65     virtual void itemsAboutToRemoved(const QList<FormEditorItem*> &itemList) = 0;
66     //    virtual QVariant itemChange(QList<QGraphicsItem*> itemList,
67 //                        QGraphicsItem::GraphicsItemChange change,
68 //                        const QVariant &value ) = 0;
69 //    virtual void update() = 0;
70     virtual void clear();
71     virtual void start();
72 
73     virtual void formEditorItemsChanged(const QList<FormEditorItem*> &itemList) = 0;
74 
75     virtual void instancesCompleted(const QList<FormEditorItem*> &itemList) = 0;
76     virtual void instancesParentChanged(const QList<FormEditorItem*> &itemList) = 0;
77     virtual void instancePropertyChange(const QList<QPair<ModelNode, PropertyName> > &propertyList) = 0;
78 
79     virtual void focusLost() = 0;
80 
81     void setItems(const QList<FormEditorItem*> &itemList);
82     QList<FormEditorItem*> items() const;
83 
84     static QList<FormEditorItem*> toFormEditorItemList(const QList<QGraphicsItem*> &itemList);
85     static QGraphicsItem* topMovableGraphicsItem(const QList<QGraphicsItem*> &itemList);
86     static FormEditorItem* topMovableFormEditorItem(const QList<QGraphicsItem*> &itemList, bool selectOnlyContentItems);
87     bool topItemIsMovable(const QList<QGraphicsItem*> &itemList);
88     bool topSelectedItemIsMovable(const QList<QGraphicsItem*> &itemList);
89     bool selectedItemCursorInMovableArea(const QPointF &pos);
90     bool topItemIsResizeHandle(const QList<QGraphicsItem*> &itemList);
91 
92     QList<FormEditorItem*> filterSelectedModelNodes(const QList<FormEditorItem*> &itemList) const;
93 
94     FormEditorItem *nearestFormEditorItem(const QPointF &point, const QList<QGraphicsItem *> &itemList);
95 
96 protected:
97     virtual void selectedItemsChanged(const QList<FormEditorItem*> &itemList) = 0;
98     virtual void showContextMenu(QGraphicsSceneMouseEvent *event);
99     Snapper::Snapping generateUseSnapping(Qt::KeyboardModifiers keyboardModifier) const;
100     FormEditorItem *containerFormEditorItem(const QList<QGraphicsItem*> &itemUnderMouseList, const QList<FormEditorItem*> &selectedItemList) const;
101 
102     FormEditorView *view() const;
103     void setView(FormEditorView *view);
104     FormEditorScene* scene() const;
105 private:
106     FormEditorView *m_view;
107     QList<FormEditorItem*> m_itemList;
108 };
109 
110 } // namespace QmlDesigner
111