deargui-vpl/applications/nodehub/core/graph_state.h
2026-02-03 18:25:25 +01:00

79 lines
2.5 KiB
C++

#pragma once
#include "../types.h"
#include "../containers/root_container.h"
#include <map>
#include <vector>
#include <string>
namespace ed = ax::NodeEditor;
// Forward declarations
class App;
/**
* GraphState - Pure graph data structure (no rendering, no UI dependencies)
*
* Manages:
* - Node and link storage (indexed by ID)
* - Container hierarchy
* - ID generation
* - Graph data lookups
*/
class GraphState
{
public:
GraphState();
~GraphState();
// ID generation
int GetNextId();
ed::LinkId GetNextLinkId();
// Node/Link/Pin lookups
Node* FindNode(ed::NodeId id);
Link* FindLink(ed::LinkId id);
// Note: FindPin requires App* for container lookup, so it's kept in App class
// Node/Link management
Node* AddNode(const Node& node);
bool RemoveNode(ed::NodeId id);
Link* AddLink(const Link& link);
bool RemoveLink(ed::LinkId id);
// Container management
RootContainer* GetActiveRootContainer() const { return m_ActiveRootContainer; }
RootContainer* AddRootContainer(const std::string& filename);
void RemoveRootContainer(RootContainer* container);
void SetActiveRootContainer(RootContainer* container);
Container* FindContainerForNode(ed::NodeId nodeId); // Search all root containers
// Graph data access - nodes/links are owned by containers, not stored here
// GraphState provides unified lookup interface that searches all containers
const std::vector<RootContainer*>& GetRootContainers() const { return m_RootContainers; }
// Iteration helpers
std::vector<Node*> GetAllNodes() const;
std::vector<Link*> GetAllLinks() const;
// Validation
bool IsPinLinked(ed::PinId id) const;
bool IsLinkDuplicate(ed::PinId startPinId, ed::PinId endPinId) const;
Link* FindLinkConnectedToPin(ed::PinId pinId) const;
// Graph persistence (will be moved here from App)
void SaveGraph(const std::string& filename, App* app);
void LoadGraph(const std::string& filename, App* app);
private:
// Note: Nodes and Links are owned by RootContainer objects, not stored here
// GraphState provides unified lookup that searches all containers
// Container hierarchy
std::vector<RootContainer*> m_RootContainers;
RootContainer* m_ActiveRootContainer = nullptr;
// ID generation (shared across all containers)
int m_NextId = 1;
};