1 /*
2     SPDX-License-Identifier: GPL-2.0-or-later
3     SPDX-FileCopyrightText: 2019-2020 Umbrello UML Modeller Authors <umbrello-devel@kde.org>
4 */
5 
6 #ifndef DIAGRAMPROXYWIDGET_H
7 #define DIAGRAMPROXYWIDGET_H
8 
9 #include <basictypes.h>
10 
11 #include <QPointer>
12 #include <QPointF>
13 #include <QRectF>
14 #include <QGraphicsSceneEvent>
15 
16 class UMLWidget;
17 class UMLScene;
18 class IDChangeLog;
19 class QAction;
20 class QDomDocument;
21 class QDomElement;
22 class QStyleOptionGraphicsItem;
23 class QXmlStreamWriter;
24 
25 class DiagramProxyWidget {
26 public:
27     DiagramProxyWidget(UMLWidget *widget, qreal borderWidth = 5);
~DiagramProxyWidget()28     virtual ~DiagramProxyWidget() {}
29     Uml::ID::Type diagramLink() const;
30     UMLScene *linkedDiagram() const;
31     bool setDiagramLink(const Uml::ID::Type &id);
32     const QRectF &clientRect();
33     const QRectF &sceneRect();
34     void setClientRect(const QRectF &rect);
35 
36     bool isProxyWidget();
37     UMLWidget *getProxiedWidget(const QPointF &p);
38     QPointF mapFromClient(const QPointF &p);
39     QRectF mapFromClient(const QRectF &r);
40     QPointF mapToClient(const QPointF &pos);
41 
42     void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);
43 
44     bool showLinkedDiagram() const;
45     void setShowLinkedDiagram(bool showLinkedDiagram);
46 
47     QRectF iconRect() const;
48     void setIconRect(const QRectF &iconRect);
49 
50 protected:
51     DiagramProxyWidget& operator=(const DiagramProxyWidget& other);
52     bool activate(IDChangeLog* changeLog = 0);
53     bool loadFromXMI1(QDomElement &qElement);
54     void saveToXMI1(QXmlStreamWriter& writer);
55     void setupEvent(QGraphicsSceneMouseEvent &e, QGraphicsSceneMouseEvent *event, const QPointF &pos);
56     void setupEvent(QGraphicsSceneContextMenuEvent &e, QGraphicsSceneContextMenuEvent *event, const QPointF &pos);
57     virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent *event);
58     virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);
59     virtual void mousePressEvent(QGraphicsSceneMouseEvent *event);
60     virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
61     virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
62     void slotMenuSelection(QAction *action);
63 
64 private:
65     Uml::ID::Type m_diagramLinkId; ///< id of linked diagram
66     QPointer<UMLScene> m_linkedDiagram; ///< pointer to linked diagram
67     QRectF m_clientRect; ///< widget area for embedded diagram
68     QRectF m_sceneRect;  ///< scene rectangle used for internal calculations
69     QRectF m_iconRect; ///< widget area for diagram icon
70     UMLWidget *m_widget;
71     qreal m_borderWidth;
72     bool m_showLinkedDiagram;
73 };
74 
75 #endif // DIAGRAMPROXYWIDGET_H
76