Maki
Formally verfied low-code orchestration
Loading...
Searching...
No Matches
canvas.h
1#pragma once
2
3#include <QApplication>
4#include <QDropEvent>
5#include <QGraphicsItem>
6#include <QGraphicsScene>
7#include <QGraphicsView>
8#include <QJsonObject>
9#include <QMouseEvent>
10#include <QPainter>
11#include <QTimer>
12
13#include "elements/node.h"
14#include "json.h"
15#include "node_info.h"
16#include "save_info.h"
17#include "system/focus_properties.h"
18
19class QUndoStack;
20class CanvasView;
21class TransitionItem;
23class EdgeRouter;
24
28class Canvas : public QGraphicsScene
29{
30 Q_OBJECT
31public:
33 {
34 NodeSaveInfo info;
36
37 QJsonObject toJson() const
38 {
39 QJsonObject object;
40 object["info"] = info.toJson();
41 object["position"] = JSON::fromPointF(posRelativeToMouse);
42 return object;
43 }
44
45 static CopiedNode fromJson(const QJsonObject& object)
46 {
47 CopiedNode copied;
48 copied.info = NodeSaveInfo::fromJson(object["info"].toObject());
49 copied.posRelativeToMouse = JSON::toPointF(object["position"].toObject());
50 return copied;
51 }
52 };
53
54 enum class NodeCreation
55 {
56 Dropping,
57 Pasting,
58 Loading,
59 Populating,
60 Inserting
61 };
62
71 Canvas(const QString& canvasId, std::shared_ptr<ConfigurationTable> configTable, std::shared_ptr<EdgeRouter> router, QObject* parent = nullptr);
72
73 ~Canvas();
79 QString id() const;
80
84 void pasteCopiedItems();
85
91 void copySelectedItems(NodeItem* node);
92
97
98 void autoRoute();
99
105 qreal getScale() const;
106
112 QPointF getCenter() const;
113
120 VoidResult loadFromSave(const SaveInfo& info);
121
127 QList<NodeItem*> availableNodes();
128
134 virtual Types::LibraryTypes type() const;
135
141 QUndoStack* undoStack() const;
142
148 void nodeClicked(NodeItem* node);
149
155 void populate(const FlowSaveInfo& flow);
156
160 void themeChanged();
161
162 // Used for undo commands
168 void createNode(const NodeSaveInfo& info, NodeCreation creation);
169
175 void removeNode(const NodeSaveInfo& info);
176
183 void moveNodeTo(const QString& nodeId, const QPointF& position);
184
191 void setNodeSize(const QString& nodeId, const QSizeF& size);
192
198 void createTransition(const TransitionSaveInfo& info);
199
205 void removeTransition(const TransitionSaveInfo& info);
206
214 void requestAlignNodes(const QList<Types::AlignmentNode>& items, Types::AlignmentMode mode, Types::AlignmentDirection direction);
215
224 void alignNodes(const QList<Types::AlignmentNode>& items, Types::AlignmentMode mode, Types::AlignmentDirection direction, bool useGiven);
225
226 void alignSelectedNodes(Types::AlignmentMode mode);
227 void distributeSelectedNodes();
228 void distributeNodesVertically(const QList<Types::AlignmentNode>& nodes);
229 void distributeNodesHorizontally(const QList<Types::AlignmentNode>& nodes);
230
231 std::shared_ptr<EdgeRouter> router() const;
232
233 virtual void suggestCapability(NodeItem* node);
234 virtual void suggestedNodes(NodeItem* node, QStringList consumers, QStringList producers);
235
236protected:
242 void dragEnterEvent(QGraphicsSceneDragDropEvent* event) override;
243
249 void dragMoveEvent(QGraphicsSceneDragDropEvent* event) override;
250
256 void dropEvent(QGraphicsSceneDragDropEvent* event) override;
257
263 void mousePressEvent(QGraphicsSceneMouseEvent* event) override;
264
270 void mouseMoveEvent(QGraphicsSceneMouseEvent* event) override;
271
277 void mouseReleaseEvent(QGraphicsSceneMouseEvent* event) override;
278
284 void contextMenuEvent(QGraphicsSceneContextMenuEvent* event) override;
285
293 virtual void updateParent(NodeItem* node, std::shared_ptr<NodeSaveInfo> storage, bool adding);
294
295signals:
302 void nodeSelected(NodeItem* node, bool selected);
303
309 void nodeAdded(NodeItem* node);
310
317 void nodeRemoved(const QString& nodeId, const QString& parentId);
318
325
332
339
346 void openFlow(Flow* flow, const QString& nodeId, const maki::FocusProperties& properties);
347
354 void flowAdded(Flow* flow, NodeItem* node);
355
362 void flowRemoved(const QString& flowId, NodeItem* node);
363
364public slots:
371 void onFocusNode(const QString& flowId, const QString& nodeId, const maki::FocusProperties& properties);
372
378 void onRemoveNode(const QString& flowId, const QString& nodeId);
379
386 void onFlowSelected(const QString& flowId, const QString& nodeId);
387
394 void onFlowRemoved(const QString& flowId, const QString& nodeId);
395
396protected:
397 std::shared_ptr<ConfigurationTable> mConfigTable;
398 std::shared_ptr<EdgeRouter> mRouter;
399 QUndoStack* mUndoStack = nullptr;
400
401 std::shared_ptr<NodeConfig> getNodeConfig(const QString& key) const;
402 virtual void addedItemNode(NodeItem* node, std::shared_ptr<NodeSaveInfo> info);
403 virtual void addedItemFlow(Flow* flow, NodeItem* node);
404 virtual void onNodeHovered(NodeItem* node, bool entered);
405 virtual void addTransition(TransitionItem* transition);
406 virtual void removeTransition(TransitionItem* transition);
407 virtual bool canAddTransition(NodeItem* node) const;
408 virtual TransitionConfig nextTransition(NodeItem* node) const;
409 virtual QVector<TransitionSaveInfo> transitionsOfNode(const QString& nodeId);
410 virtual QVector<QGraphicsItem*> cleanTransitionsOfNode(const QString& nodeId);
411 virtual void onNodeMoved(const NodeItem* node);
412 virtual void showSimulationControls(NodeItem* node, maki::ControlWidget* controls, const QColor& highlightColor);
413
414 virtual bool insertDroppedNodeOnTransition(TransitionItem* transition, std::shared_ptr<NodeSaveInfo> info);
415
425 NodeItem* createNode(NodeCreation creation, std::shared_ptr<NodeSaveInfo> info, const QPointF& position, NodeItem* parent);
426
432 CanvasView* parentView() const;
433
434private:
435 NodeItem* mHoveredNode = nullptr;
437 NodeItem* mNode = nullptr;
439 bool mDragging = false;
440 bool mMouseDown = false;
441
443 QGraphicsRectItem* mSelectionRect = nullptr;
444
445 const QString mId;
446
447 QList<CopiedNode> mCopiedNodes;
448 QList<NodeItem*> mSelectedNodes;
449
451 QTimer* mSuggestionHideTimer = nullptr;
452
453 void createSuggestedNode(const QString& nodeType, NodeItem* sourceNode);
454
458 void clearCanvas();
459
466 void selectNode(NodeItem* node, bool select);
467
474 NodeItem* findNodeWithId(const QString& id) const;
475 TransitionItem* findTransitionWithId(const QString& id) const;
476
482 QList<NodeItem*> selectedNodes() const;
483
490 void alignNodesHorizontally(const QList<Types::AlignmentNode>& items, Types::AlignmentDirection direction);
491
498 void alignNodesVertically(const QList<Types::AlignmentNode>& items, Types::AlignmentDirection direction);
499
500 // Context menu
501 void createAlignMenu(QMenu* alignMenu, const QList<Types::AlignmentNode>& items);
502
503 QVector<QGraphicsItem*> removeNode(NodeItem* node);
504
505 void clearSelectedNodes();
506 bool isModifierSet(QGraphicsSceneMouseEvent* event, Qt::KeyboardModifier modifier);
507
508 bool nodeClickHandler(QGraphicsSceneMouseEvent* event, QGraphicsItem* item);
509 bool transitionClickHandler(QGraphicsSceneMouseEvent* event, QGraphicsItem* item);
510
511 void createNodeContextMenu(QMenu* menu, NodeItem* node, const QList<NodeItem*>& items);
512 void createTransitionContextMenu(QMenu* menu, const QList<NodeItem*>& items);
513
514 bool isParentSelected(NodeItem* node);
515 void pasteCopiedItems(const QPointF& mousePosition, NodeItem* parentNode, QList<CopiedNode> nodes,
516 bool relative);
517
518 VoidResult loadFromSave(const QVector<std::shared_ptr<INode>>& nodes, NodeItem* parent);
519
520 void onSelectionChanged();
521
522 TransitionItem* transitionAt(const QPointF& scenePos) const;
523 void updateCapabilityDropPreview(const QPointF& scenePos);
524};
525
526inline QDataStream& operator<<(QDataStream& out, const Canvas::CopiedNode& node)
527{
528 out << node.info;
529 out << node.posRelativeToMouse;
530 return out;
531}
532
533inline QDataStream& operator>>(QDataStream& in, Canvas::CopiedNode& node)
534{
535 in >> node.info;
536 in >> node.posRelativeToMouse;
537 return in;
538}
Custom QGraphicsView for a canvas application.
Definition canvas_view.h:15
void themeChanged()
Handles theme change events.
Definition canvas.cpp:1594
void mousePressEvent(QGraphicsSceneMouseEvent *event) override
Handles mouse press events.
Definition canvas.cpp:222
void onFlowRemoved(const QString &flowId, const QString &nodeId)
Handles removal of a flow.
Definition canvas.cpp:1571
void requestAlignNodes(const QList< Types::AlignmentNode > &items, Types::AlignmentMode mode, Types::AlignmentDirection direction)
Requests alignment of nodes.
Definition canvas.cpp:522
void createNodeContextMenu(QMenu *menu, NodeItem *node, const QList< NodeItem * > &items)
Handles transition click events.
Definition canvas.cpp:813
void alignNodesVertically(const QList< Types::AlignmentNode > &items, Types::AlignmentDirection direction)
Aligns nodes vertically based on the given parameters.
Definition canvas.cpp:586
void createNode(const NodeSaveInfo &info, NodeCreation creation)
Creates a node based on save information.
Definition canvas.cpp:1285
void alignNodesHorizontally(const QList< Types::AlignmentNode > &items, Types::AlignmentDirection direction)
Aligns nodes horizontally based on the given parameters.
Definition canvas.cpp:554
QList< NodeItem * > mSelectedNodes
List of copied nodes.
Definition canvas.h:448
void removeNode(const NodeSaveInfo &info)
Removes a node based on save information.
Definition canvas.cpp:1296
bool isParentSelected(NodeItem *node)
Creates a context menu for transitions.
Definition canvas.cpp:1001
QPointF mSelectionStart
Whether the mouse button is pressed.
Definition canvas.h:442
void clearCanvas()
Clears all items from the canvas.
Definition canvas.cpp:1121
virtual Types::LibraryTypes type() const
Returns the type of library this canvas belongs to.
Definition canvas.cpp:66
void pasteCopiedItems()
Pastes copied items onto the canvas.
Definition canvas.cpp:1090
NodeItem * mSuggestionSourceNode
List of currently selected nodes.
Definition canvas.h:450
NodeItem * findNodeWithId(const QString &id) const
Finds a node by its ID.
Definition canvas.cpp:1436
void nodeSelected(NodeItem *node, bool selected)
Emitted when a node is selected.
void copySelectedItems(NodeItem *node)
Copies selected items to the clipboard.
Definition canvas.cpp:1010
NodeItem * mNode
Pointer to the current transition being created.
Definition canvas.h:437
void removeTransition(const TransitionSaveInfo &info)
Removes a transition based on save information.
Definition canvas.cpp:1275
Canvas(const QString &canvasId, std::shared_ptr< ConfigurationTable > configTable, std::shared_ptr< EdgeRouter > router, QObject *parent=nullptr)
Constructs a new Canvas object.
Definition canvas.cpp:41
bool transitionClickHandler(QGraphicsSceneMouseEvent *event, QGraphicsItem *item)
Handles node click events.
Definition canvas.cpp:345
bool isModifierSet(QGraphicsSceneMouseEvent *event, Qt::KeyboardModifier modifier)
Clears all selected nodes.
Definition canvas.cpp:217
bool mMouseDown
Whether a drag operation is in progress.
Definition canvas.h:440
void transitionSelected(TransitionItem *transtion)
Emitted when a transition is selected.
void openFlow(Flow *flow, const QString &nodeId, const maki::FocusProperties &properties)
Emitted when a flow is opened.
void createTransition(const TransitionSaveInfo &info)
Creates a transition based on save information.
Definition canvas.cpp:1243
QList< NodeItem * > availableNodes()
Returns a list of available node items.
Definition canvas.cpp:81
void onSelectionChanged()
Loads nodes and their children from save information.
Definition canvas.cpp:91
CanvasView * parentView() const
Returns the parent view of this canvas.
Definition canvas.cpp:1218
void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override
Handles context menu events.
Definition canvas.cpp:729
void clearSelectedNodes()
Removes a node and its associated connections.
Definition canvas.cpp:1165
qreal getScale() const
Returns the current scale of the canvas.
Definition canvas.cpp:1466
VoidResult loadFromSave(const SaveInfo &info)
Loads the canvas from save information.
Definition canvas.cpp:1201
QList< NodeItem * > selectedNodes() const
Returns a list of currently selected nodes.
Definition canvas.cpp:517
void deleteSelectedItems()
Deletes selected items from the canvas.
Definition canvas.cpp:832
void flowAdded(Flow *flow, NodeItem *node)
Emitted when a flow is added.
void nodeAdded(NodeItem *node)
Emitted when a node is added.
void alignNodes(const QList< Types::AlignmentNode > &items, Types::AlignmentMode mode, Types::AlignmentDirection direction, bool useGiven)
Aligns nodes based on the given parameters.
Definition canvas.cpp:527
void dragMoveEvent(QGraphicsSceneDragDropEvent *event) override
Handles drag move events.
Definition canvas.cpp:114
QPointF mStartDragPosition
Pointer to the currently clicked node.
Definition canvas.h:438
void createEvent(NodeItem *node)
Emitted when an event is created.
std::shared_ptr< EdgeRouter > mRouter
Pointer to the configuration table.
Definition canvas.h:398
void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override
Handles mouse move events.
Definition canvas.cpp:355
void createTransitionContextMenu(QMenu *menu, const QList< NodeItem * > &items)
Creates a context menu for nodes.
Definition canvas.cpp:828
void flowRemoved(const QString &flowId, NodeItem *node)
Emitted when a flow is removed.
bool mDragging
The starting position of a drag operation.
Definition canvas.h:439
void moveNodeTo(const QString &nodeId, const QPointF &position)
Moves a node to a new position.
Definition canvas.cpp:1223
QString id() const
Returns the unique identifier for this canvas.
Definition canvas.cpp:61
TransitionItem * mTransition
Pointer to the hovered node.
Definition canvas.h:436
void onFocusNode(const QString &flowId, const QString &nodeId, const maki::FocusProperties &properties)
Handles focus on a node.
Definition canvas.cpp:1476
void nodeModified(NodeItem *node)
Emitted when a node is modified.
void populate(const FlowSaveInfo &flow)
Populates the canvas with a given flow.
Definition canvas.cpp:1538
std::shared_ptr< NodeConfig > getNodeConfig(const QString &key) const
Pointer to the undo stack.
Definition canvas.cpp:1383
void nodeClicked(NodeItem *node)
Handles node click events.
Definition canvas.cpp:503
void nodeRemoved(const QString &nodeId, const QString &parentId)
Emitted when a node is removed.
QPointF getCenter() const
Returns the center position of the canvas.
Definition canvas.cpp:1471
void onRemoveNode(const QString &flowId, const QString &nodeId)
Handles removal of a node.
Definition canvas.cpp:1532
bool nodeClickHandler(QGraphicsSceneMouseEvent *event, QGraphicsItem *item)
Checks if a specific keyboard modifier is set.
Definition canvas.cpp:295
QList< CopiedNode > mCopiedNodes
Unique identifier for this canvas.
Definition canvas.h:447
void selectNode(NodeItem *node, bool select)
Selects a node and updates its selection state.
Definition canvas.cpp:1153
void setNodeSize(const QString &nodeId, const QSizeF &size)
Sets the size of a node.
Definition canvas.cpp:1232
void onFlowSelected(const QString &flowId, const QString &nodeId)
Handles selection of a flow.
Definition canvas.cpp:1558
virtual void updateParent(NodeItem *node, std::shared_ptr< NodeSaveInfo > storage, bool adding)
Updates the parent of a node.
Definition canvas.cpp:1590
QUndoStack * mUndoStack
Pointer to the system edge router.
Definition canvas.h:399
void dragEnterEvent(QGraphicsSceneDragDropEvent *event) override
Handles drag enter events.
Definition canvas.cpp:103
void dropEvent(QGraphicsSceneDragDropEvent *event) override
Handles drop events.
Definition canvas.cpp:126
QUndoStack * undoStack() const
Returns a pointer to the undo stack associated with this canvas.
Definition canvas.cpp:71
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override
Handles mouse release events.
Definition canvas.cpp:378
Manages a table of configuration settings.
Definition config_table.h:13
Definition edge_router.h:11
Represents a flow in the system.
Definition flow.h:17
static QPointF toPointF(const QJsonObject &value)
Converts a QJsonObject to a QPointF.
Definition json.cpp:79
static QJsonObject fromPointF(const QPointF &value)
Creates a JSON object from a QPointF.
Definition json.cpp:70
Represents a graphical node item in a flowchart.
Definition node.h:26
Represents a node that can be saved and loaded.
Definition node_info.h:17
static NodeSaveInfo fromJson(const QJsonObject &data)
Creates a NodeSaveInfo object from a JSON object.
Definition node_info.cpp:319
Configuration for a transition between nodes.
Definition config.h:44
Represents a transition between two nodes in a graphical representation.
Definition transition.h:15
Definition canvas.h:33
QJsonObject toJson() const
Position relative to the mouse when copying.
Definition canvas.h:37
QPointF posRelativeToMouse
Save information of the copied node.
Definition canvas.h:35
Definition focus_properties.h:17