#pragma once #include "domain/control_logic_model.h" #include "services/logic_editor_service.h" #include "services/software_logic_executor.h" #include #include #include class QGraphicsScene; class QResizeEvent; class LogicEditorWidget final : public QGraphicsView { Q_OBJECT public: class NodeItem; class RungItem; explicit LogicEditorWidget( LogicEditorService &editor_service, QWidget *parent = nullptr); void setLogicId(const std::string &logic_id); void setEditingEnabled(bool enabled); void setRuntimeTrace( const LogicTraceSnapshot &trace, const std::string &fault_node_id = {}); void clearRuntimeTrace(); void reloadLogic(); void selectNode(const std::string &node_id); std::string selectedNodeId() const; std::vector selectedNodeIds() const; std::string selectedRungId() const; LogicEditorResult addRung(); LogicEditorResult addCondition(const LogicNodeConfig &config); LogicEditorResult addParallelBranch(const LogicNodeConfig &config); LogicEditorResult setOutput(const LogicNodeConfig &config); LogicEditorResult deleteSelected(); signals: void nodeSelected(const QString &node_id); void graphChanged(); void editorError(const QString &message); protected: void resizeEvent(QResizeEvent *event) override; private: void handleSelectionChanged(); void reportFailure(const LogicEditorResult &result); std::string currentRungId() const; LogicEditorService &editor_service_; QGraphicsScene *scene_ = nullptr; std::string logic_id_; std::string current_rung_id_; LogicTraceSnapshot trace_; std::string fault_node_id_; bool runtime_trace_enabled_ = false; bool editing_enabled_ = true; };