diff --git a/story-editor/CMakeLists.txt b/story-editor/CMakeLists.txt index a949c92..a733d9b 100644 --- a/story-editor/CMakeLists.txt +++ b/story-editor/CMakeLists.txt @@ -143,7 +143,6 @@ set(SRCS # src/node_editor/media_node_widget.cpp src/node_editor/base_node_widget.cpp src/node_editor/node_editor_window.cpp - src/node_editor/call_function_node_widget.cpp src/node_editor/module_node_widget.cpp src/node_editor/variable_node_widget.cpp src/node_editor/operator_node_widget.cpp @@ -185,7 +184,6 @@ set(SRCS ../core/story-manager/src/nodes/compare_node.cpp ../core/story-manager/src/nodes/branch_node.cpp ../core/story-manager/src/nodes/variable_node.cpp - ../core/story-manager/src/nodes/call_function_node.cpp ../core/story-manager/src/nodes/module_node.cpp ../core/story-manager/src/nodes/print_node.cpp ../core/story-manager/src/nodes/syscall_node.cpp diff --git a/story-editor/src/main_window.cpp b/story-editor/src/main_window.cpp index 83af3f6..767bd38 100644 --- a/story-editor/src/main_window.cpp +++ b/story-editor/src/main_window.cpp @@ -34,7 +34,7 @@ #include "print_node_widget.h" #include "syscall_node_widget.h" #include "function_entry_widget.h" -#include "function_exit_widget.h" + MainWindow::MainWindow(ILogger& logger, EventBus& eventBus, AppController& appController) : m_logger(logger) @@ -74,7 +74,6 @@ MainWindow::MainWindow(ILogger& logger, EventBus& eventBus, AppController& appCo m_widgetFactory.registerNode(PrintNodeUuid); m_widgetFactory.registerNode(SyscallNodeUuid); m_widgetFactory.registerNode(FunctionEntryNodeUuid); - m_widgetFactory.registerNode(FunctionExitNodeUuid); m_eventBus.Subscribe([this](const OpenProjectEvent &event) { OpenProject(event.GetUuid()); diff --git a/story-editor/src/node_editor/base_node_widget.cpp b/story-editor/src/node_editor/base_node_widget.cpp index 96055f8..0f4084d 100644 --- a/story-editor/src/node_editor/base_node_widget.cpp +++ b/story-editor/src/node_editor/base_node_widget.cpp @@ -25,4 +25,68 @@ void BaseNodeWidget::Initialize() } +void BaseNodeWidget::DrawSocket(const Nw::Pin &pin) +{ + ImDrawList* draw_list = ImGui::GetWindowDrawList(); + + // Taille du socket + float socket_size = 4.0f; + + // Définir les 5 points du polygone (flèche pointant vers la droite pour Output) + // Pour Input, la flèche pointerait vers la gauche + ImVec2 p1, p2, p3, p4, p5; + + if (pin.pinKind == Nw::PinKind::Output) { + // Flèche pointant vers la droite (→) + p1 = ImVec2(pin.pinPoint.x - socket_size * 1.5f, pin.pinPoint.y - socket_size); + p2 = ImVec2(pin.pinPoint.x - socket_size * 0.5f, pin.pinPoint.y - socket_size); + p3 = ImVec2(pin.pinPoint.x + socket_size * 0.5f, pin.pinPoint.y); // Pointe + p4 = ImVec2(pin.pinPoint.x - socket_size * 0.5f, pin.pinPoint.y + socket_size); + p5 = ImVec2(pin.pinPoint.x - socket_size * 1.5f, pin.pinPoint.y + socket_size); + } else { + // Flèche pointant vers la gauche (←) + p1 = ImVec2(pin.pinPoint.x + socket_size * 1.5f, pin.pinPoint.y - socket_size); + p2 = ImVec2(pin.pinPoint.x + socket_size * 0.5f, pin.pinPoint.y - socket_size); + p3 = ImVec2(pin.pinPoint.x - socket_size * 0.5f, pin.pinPoint.y); // Pointe + p4 = ImVec2(pin.pinPoint.x + socket_size * 0.5f, pin.pinPoint.y + socket_size); + p5 = ImVec2(pin.pinPoint.x + socket_size * 1.5f, pin.pinPoint.y + socket_size); + } + + ImVec2 vertices[] = {p1, p2, p3, p4, p5}; + + // Rectangle pour la détection de hover + ImVec2 tl = pin.pinPoint - ImVec2(socket_size * 1.5f, socket_size); + ImVec2 br = pin.pinPoint + ImVec2(socket_size * 1.5f, socket_size); + + bool hovered = ImGui::IsItemHovered() || ImGui::IsMouseHoveringRect(tl, br); + + // Dessin du socket + if (pin.isConnected) { + // Rempli quand connecté + draw_list->AddConvexPolyFilled(vertices, IM_ARRAYSIZE(vertices), + pin.style.color); + } else { + // Contour seulement quand non connecté + if (hovered) { + draw_list->AddPolyline(vertices, IM_ARRAYSIZE(vertices), + pin.style.color, + ImDrawFlags_Closed, + pin.style.socket_hovered_radius); // Épaisseur au hover + } else { + draw_list->AddPolyline(vertices, IM_ARRAYSIZE(vertices), + pin.style.color, + ImDrawFlags_Closed, + pin.style.socket_thickness); // Épaisseur normale + } + } + + // Optionnel : dessiner la décoration (fond hover) si nécessaire + if (hovered) { + draw_list->AddRectFilled(pin.pos - pin.style.padding, + pin.pos + pin.size + pin.style.padding, + pin.style.bg_hover_color, + pin.style.bg_radius); + } + +} diff --git a/story-editor/src/node_editor/base_node_widget.h b/story-editor/src/node_editor/base_node_widget.h index b84c989..57e121a 100644 --- a/story-editor/src/node_editor/base_node_widget.h +++ b/story-editor/src/node_editor/base_node_widget.h @@ -96,7 +96,7 @@ public: virtual void DrawProperties(std::shared_ptr story) = 0; - virtual void DrawSocket(const Nw::Pin &pin) {} + virtual void DrawSocket(const Nw::Pin &pin); virtual bool HasSync() const { diff --git a/story-editor/src/node_editor/call_function_node_widget.cpp b/story-editor/src/node_editor/call_function_node_widget.cpp deleted file mode 100644 index b475020..0000000 --- a/story-editor/src/node_editor/call_function_node_widget.cpp +++ /dev/null @@ -1,38 +0,0 @@ - -#include -#include "call_function_node_widget.h" - -#include "IconsMaterialDesignIcons.h" -#include "story_project.h" -#include "uuid.h" - -CallFunctionNodeWidget::CallFunctionNodeWidget(IStoryManager &manager, std::shared_ptr node) - : BaseNodeWidget(manager, node) - , m_manager(manager) -{ - m_functionUuid = Uuid().String(); -} - -void CallFunctionNodeWidget::Draw() -{ - ImGui::TextUnformatted(m_functionName.c_str()); - if (ImGui::Button("> Open function")) - { - m_manager.OpenFunction(m_functionUuid, m_functionName); - } -} - -void CallFunctionNodeWidget::Initialize() -{ - BaseNodeWidget::Initialize(); - m_functionName = "Function"; -} - -void CallFunctionNodeWidget::DrawProperties(std::shared_ptr story) -{ - - - -} - - diff --git a/story-editor/src/node_editor/call_function_node_widget.h b/story-editor/src/node_editor/call_function_node_widget.h index fafede6..334705a 100644 --- a/story-editor/src/node_editor/call_function_node_widget.h +++ b/story-editor/src/node_editor/call_function_node_widget.h @@ -1,9 +1,9 @@ +// call_function_node_widget.h #pragma once #include #include -#include -#include +#include #include "base_node_widget.h" #include "i_story_manager.h" @@ -11,22 +11,74 @@ #include "call_function_node.h" #include "gui.h" - class CallFunctionNodeWidget : public BaseNodeWidget { public: - CallFunctionNodeWidget(IStoryManager &manager, std::shared_ptr node); + CallFunctionNodeWidget(IStoryManager &manager, std::shared_ptr node) + : BaseNodeWidget(manager, node) + , m_manager(manager) + { + m_callFunctionNode = std::dynamic_pointer_cast(node); + SetTitle("Call Function"); + } - void Draw() override; + void Initialize() override { + BaseNodeWidget::Initialize(); + m_functionName = m_callFunctionNode->GetFunctionName(); + m_functionUuid = m_callFunctionNode->GetFunctionUuid(); + } - virtual void DrawProperties(std::shared_ptr story) override; - virtual void Initialize() override; + void DrawProperties(std::shared_ptr story) override { + ImGui::AlignTextToFramePadding(); + + // Liste déroulante des fonctions disponibles + if (ImGui::BeginCombo("Function", m_functionName.empty() ? "