3#include "../../Source/third_party/imgui/imgui.h"
4#include "../../system/system_utils.h"
5#include "../Utilities/CanvasGridRenderer.h"
6#include "../Utilities/ICanvasEditor.h"
14 {
m_renderer = std::make_unique<ComponentNodeRenderer>(); }
28 ImGui::BeginChild(
"##PrefabCanvas",
ImVec2(-1.0f, -1.0f),
true);
31 ImVec2 canvasPos = ImGui::GetCursorScreenPos();
33 ImVec2 canvasSize = ImGui::GetContentRegionAvail();
34 ImVec2 canvasEnd(canvasPos.x + canvasSize.x, canvasPos.y + canvasSize.y);
46 ImGui::IsWindowHovered());
94 std::vector<std::tuple<int, float, float, float, float>> nodeData;
126 nodeData.emplace_back(
127 static_cast<int>(
node.nodeId),
175 ImGui::PopStyleColor();
254 for (
size_t i = 0;
i < nodes.size(); ++
i)
257 if (
m_renderer->IsPointInPort(canvasPos, nodes[
i], portId))
273 for (
size_t i = 0;
i < selectedNodes.size(); ++
i)
340 for (
size_t i = 0;
i < nodes.size(); ++
i)
343 if (
m_renderer->IsPointInPort(canvasPos, nodes[
i], portId))
437 for (
size_t i = 0;
i < nodes.size(); ++
i)
441 return nodes[
i].nodeId;
478 for (
size_t i = 0;
i < nodes.size(); ++
i)
502 for (
size_t i = 0;
i < nodes.size(); ++
i)
512 std::vector<NodeId>
nodesToDelete(selectedNodes.begin(), selectedNodes.end());
536 SYSTEM_LOG <<
"[PrefabCanvas::AddComponentNode] Created node: " << componentName
537 <<
" at canvas pos (" << canvasPos.
x <<
", " << canvasPos.
y <<
")\n";
618 return Vector(0.0f, 0.0f, 0.0f);
655 return Vector(result.x, result.y, 0.0f);
660 ImVec2 canvasPos = ImGui::GetCursorScreenPos();
672 return Vector(result.x, result.y, 0.0f);
677 ImVec2 canvasPos = ImGui::GetCursorScreenPos();
694 ImVec2 canvasPos = ImGui::GetCursorScreenPos();
695 ImVec2 canvasSize = ImGui::GetContentRegionAvail();
738 m_renderer->SetCanvasScreenPos(ImGui::GetCursorScreenPos());
741 ImGui::GetCursorScreenPos(),
742 ImVec2(ImGui::GetCursorScreenPos().x + ImGui::GetContentRegionAvail().x,
743 ImGui::GetCursorScreenPos().y + ImGui::GetContentRegionAvail().y),
749 ImGui::PopClipRect();
766 m_renderer->SetCanvasScreenPos(ImGui::GetCursorScreenPos());
769 ImGui::GetCursorScreenPos(),
770 ImVec2(ImGui::GetCursorScreenPos().x + ImGui::GetContentRegionAvail().x,
771 ImGui::GetCursorScreenPos().y + ImGui::GetContentRegionAvail().y),
777 ImGui::PopClipRect();
783 if (
drawList ==
nullptr) {
return; }
785 ImVec2 debugPos(ImGui::GetCursorScreenPos().x + 10.0f, ImGui::GetCursorScreenPos().y + 10.0f);
793 "Zoom: %.2f | Offset: %.0f, %.0f | Nodes: %zu | Mode: %d | Dragging: %s",
931 if (ImGui::BeginPopup(
"ConnectionContextMenu"))
933 if (ImGui::MenuItem(
"Delete Connection"))
945 ImGui::CloseCurrentPopup();
958 if (
node ==
nullptr) {
return; }
976 if (
node ==
nullptr) {
return; }
989 for (
size_t i = 0;
i < selectedNodes.size(); ++
i)
1073 if (ImGui::IsMouseClicked(1) && ImGui::IsWindowHovered())
1107 ImGui::OpenPopup(
"ConnectionContextMenu");
1118 ImGui::OpenPopup(
"CanvasContextMenu");
1122 if (ImGui::BeginPopup(
"CanvasContextMenu"))
1127 if (ImGui::MenuItem(
"Delete Node"))
1131 ImGui::CloseCurrentPopup();
1136 if (ImGui::MenuItem(
"Select Node"))
1143 ImGui::CloseCurrentPopup();
1149 if (ImGui::MenuItem(
"Clear Selection"))
1152 ImGui::CloseCurrentPopup();
1157 if (ImGui::MenuItem(
"Select All"))
1160 ImGui::CloseCurrentPopup();
1166 if (ImGui::MenuItem(
"Reset View"))
1169 ImGui::CloseCurrentPopup();
ComponentTypeID GetComponentTypeID_Static()
static GridConfig GetStylePreset(GridStylePreset preset)
Get pre-configured grid style (VisualScript/Compact/Spacious)
static void RenderGrid(ImDrawList *drawList, const GridConfig &config)
Render a grid on the given ImDrawList.
const std::vector< NodeId > & GetSelectedNodes() const
void SetDirty(bool dirty)
size_t GetNodeCount() const
bool ConnectNodes(NodeId sourceId, NodeId targetId)
NodeId CreateComponentNode(const std::string &componentType)
void RemoveNode(NodeId nodeId)
ComponentNode * GetNode(NodeId nodeId)
void DeselectNode(NodeId nodeId)
const std::vector< ComponentNode > & GetAllNodes() const
bool DisconnectNodes(NodeId sourceId, NodeId targetId)
const std::vector< std::pair< NodeId, NodeId > > & GetConnections() const
void SelectNode(NodeId nodeId)
Abstract interface for canvas editors with unified pan/zoom/grid management.
virtual void ResetView()=0
Reset both pan and zoom to defaults.
virtual void SetCanvasScreenPos(const ImVec2 &screenPos)=0
Set canvas screen position (call each frame to update)
virtual void SetPan(const ImVec2 &offset)=0
Set pan offset directly.
virtual ImVec2 ScreenToCanvas(const ImVec2 &screenPos) const =0
Transform screen space coordinates to canvas space.
virtual void RenderMinimap()=0
Render minimap overlay.
virtual ImVec2 CanvasToScreen(const ImVec2 &canvasPos) const =0
Transform canvas space coordinates to screen space.
virtual ImVec2 GetPan() const =0
Get current pan offset.
virtual ImVec2 GetZoomLimits() const =0
Get zoom limits (min, max)
virtual void SetZoom(float scale, const ImVec2 *zoomCenter=nullptr)=0
Set zoom level directly.
virtual void UpdateMinimapNodes(const std::vector< std::tuple< int, float, float, float, float > > &nodes, float graphMinX, float graphMaxX, float graphMinY, float graphMaxY)=0
Update minimap with current graph node data.
virtual float GetZoom() const =0
Get current zoom level.
virtual void UpdateMinimapViewport(float viewMinX, float viewMaxX, float viewMinY, float viewMaxY, float graphMinX, float graphMaxX, float graphMinY, float graphMaxY)=0
Update minimap with current viewport bounds.
virtual void SetCanvasSize(const ImVec2 &size)=0
Set canvas size (call each frame to update)
virtual void PanBy(const ImVec2 &delta)=0
Pan by delta amount.
void CompleteConnection(NodeId targetNodeId)
NodeId m_connectionSourceNodeId
void Update(float deltaTime)
Vector m_contextMenuConnectionMousePos
void OnKeyUp(int keyCode)
EntityPrefabGraphDocument * GetDocument() const
void HandleNodeDragStart(NodeId nodeId, float x, float y)
ICanvasEditor * m_canvasEditor
void SetSnapToGrid(bool snap)
void HandlePanStart(float x, float y)
void SetShowDebugInfo(bool show)
bool IsCreatingConnection() const
bool GetShowDebugInfo() const
Vector m_selectionRectEnd
std::unique_ptr< ComponentNodeRenderer > m_renderer
int m_contextMenuConnectionIndex
bool IsNodeDragging() const
void AcceptComponentDropAtScreenPos(const std::string &componentType, const std::string &componentName, float screenX, float screenY)
void StartConnectionCreation(NodeId sourceNodeId)
int m_hoveredConnectionIndex
void SelectNodesInRectangle(const Vector &rectStart, const Vector &rectEnd, bool addToSelection=false)
void HandleNodeDrag(float x, float y)
void RenderSelectionRectangle()
ImVec2 GetCanvasScreenPos() const
void SetCanvasOffset(const Vector &offset)
void SetGridEnabled(bool enabled)
float GetCanvasZoom() const
void CancelConnectionCreation()
void RenderSelectionBox()
void HandleConnectionCreation(float x, float y)
void OnMouseUp(int button, float x, float y)
void SelectNodeAt(float x, float y, bool addToSelection=false)
void RenderConnectionPreview()
void RenderConnectionContextMenu()
void OnMouseMove(float x, float y)
Vector m_selectionRectStart
void SnapNodePositionToGrid(Vector &position)
bool IsGridEnabled() const
void Initialize(EntityPrefabGraphDocument *document)
void UpdateNodePositions()
void SetCanvasZoom(float zoom)
Vector m_connectionPreviewEnd
Vector GetCanvasOffset() const
void DeleteSelectedNodes()
Vector ScreenToCanvas(float screenX, float screenY) const
Vector m_contextMenuMousePos
void HandlePan(float x, float y)
EntityPrefabGraphDocument * m_document
bool IsSnapToGridEnabled() const
CanvasInteractionMode m_interactionMode
void HandleConnectionEnd(float x, float y)
bool m_isSelectingRectangle
void SetGridSpacing(float spacing)
void OnMouseDown(int button, float x, float y)
Vector CanvasToScreen(float canvasX, float canvasY) const
void AddComponentNode(const std::string &componentType, const std::string &componentName, float x, float y)
CanvasInteractionMode GetInteractionMode() const
void SetCanvasEditor(ICanvasEditor *canvasEditor)
NodeId m_contextMenuNodeId
bool m_isCreatingConnection
void OnKeyDown(int keyCode)
void ZoomCanvas(float zoomDelta, float centerX, float centerY)
void PanCanvas(float deltaX, float deltaY)
NodeId GetNodeAtPosition(float x, float y)
float GetGridSpacing() const
bool m_showConnectionContextMenu
NodeId GetConnectionSourceNode() const
void OnMouseScroll(float delta)
< Provides AssetID and INVALID_ASSET_ID
@ Vector
3-component vector (Vector from vector.h)
const PortId InvalidPortId
const NodeId InvalidNodeId
Configuration parameters for grid rendering.