#ifndef NODE_EDITOR_HPP #define NODE_EDITOR_HPP #include #include #include #include "imgui.h" namespace NodeEditor { // Типы портов enum class PortType { Input, Output }; enum class NodeType { Input, Hidden, Output }; // Порт узла struct Port { std::string name; PortType type; int index; // Индекс для множественных портов bool isBranchPort; // true если это порт для выбора ветки (0/1) Port(const std::string& n, PortType t, int idx = 0, bool branch = false) : name(n), type(t), index(idx), isBranchPort(branch) {} }; // Узел графа struct Node { int id; std::string title; NodeType type; ImVec2 pos; ImVec2 size; bool selected; bool dragging; ImVec2 dragOffset; // Данные слоя int layerSize; int layerIndex; // Индекс в ui.layerConfigs std::vector connectedInputs; // IDs узлов, подключенных к входам std::vector connectedOutputs; // IDs узлов, подключенных к выходам // Порты std::vector inputs; std::vector outputs; // Для ветвления int branch; // -1, 0, 1 bool isSplit; // Разделяет ли выход на две ветки Node(int id_, const std::string& title_, NodeType type_) : id(id_), title(title_), type(type_), pos(0,0), size(200,100), selected(false), dragging(false), layerSize(128), layerIndex(-1), branch(-1), isSplit(false) {} ImVec2 GetInputPos(int portIdx) const; ImVec2 GetOutputPos(int portIdx) const; }; // Соединение между портами struct Connection { int fromNode; int fromPort; int toNode; int toPort; Connection(int fn, int fp, int tn, int tp) : fromNode(fn), fromPort(fp), toNode(tn), toPort(tp) {} }; // Состояние редактора struct GraphState { std::vector nodes; std::vector connections; int nextNodeId = 0; int selectedNode = -1; int hoveredPortNode = -1; int hoveredPortIdx = -1; PortType hoveredPortType = PortType::Input; // Для создания соединения bool creatingConnection = false; int connectionStartNode = -1; int connectionStartPort = -1; PortType connectionStartType = PortType::Output; ImVec2 connectionMousePos; // Масштаб и панорамирование float zoom = 1.0f; ImVec2 panOffset; bool panning; ImVec2 panStart; GraphState() : panning(false) {} }; // === API === void Init(GraphState& graph); void DrawGraph(GraphState& graph, const ImVec2& canvasSize); void HandleInput(GraphState& graph, const ImVec2& canvasPos); // Синхронизация с LayerStructure_t void SyncToLayerConfigs(GraphState& graph, std::vector& configs); void SyncFromLayerConfigs(GraphState& graph, const std::vector& configs); // Вспомогательные функции ImVec2 GetPortPos(const Node& node, const Port& port, const ImVec2& canvasOffset); void DrawBezier(ImDrawList* dl, ImVec2 start, ImVec2 end, ImU32 color, float thickness = 2.0f); ImU32 GetNodeColor(NodeType type, bool selected); } // namespace NodeEditor #endif // NODE_EDITOR_HPP