#pragma once #include "domain/control_logic_model.h" #include #include class LogicEditorService; struct LogicEditorResult; class QGraphicsPathItem; class QGraphicsScene; class QMouseEvent; class QResizeEvent; class LogicEditorWidget final : public QGraphicsView { Q_OBJECT public: explicit LogicEditorWidget( LogicEditorService &editor_service, QWidget *parent = nullptr); void setLogicId(const std::string &logic_id); void setEditingEnabled(bool enabled); void reloadLogic(); void selectNode(const std::string &node_id); std::string selectedNodeId() const; LogicEditorResult addNode(const LogicNodeConfig &config); LogicEditorResult deleteSelected(); signals: void nodeSelected(const QString &node_id); void nodeChanged(const QString &node_id); void graphChanged(); void editorError(const QString &message); protected: void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; void resizeEvent(QResizeEvent *event) override; private: class NodeItem; class ConnectionItem; void handleSelectionChanged(); void handleNodePositionChanged(const std::string &node_id); void updateConnections(); void updatePreview(const QPointF &scene_position); void clearPreview(); NodeItem *nodeAtPort(const QPointF &scene_position, bool output) const; LogicPoint nextNodePosition() const; void reportFailure(const LogicEditorResult &result); LogicEditorService &editor_service_; QGraphicsScene *scene_ = nullptr; std::string logic_id_; bool editing_enabled_ = true; std::string connecting_from_node_id_; QGraphicsPathItem *preview_item_ = nullptr; };