From f5e53fd13d9cd37920ff0e952038e310a29d6eb2 Mon Sep 17 00:00:00 2001 From: zhenyan121 <3367366583@qq.com> Date: Mon, 13 Jul 2026 14:52:35 +0800 Subject: [PATCH] feat(ui): introduce anchor-based widget positioning system Replace set_position with anchor and offset for relative positioning. Add parent pointer to widget hierarchy. Remove manual resize logic in UI managers. --- include/Cubed/debug_collector.hpp | 3 +- include/Cubed/ui/anchor.hpp | 15 +++++ include/Cubed/ui/button.hpp | 16 ++--- include/Cubed/ui/image.hpp | 2 +- include/Cubed/ui/label.hpp | 4 +- include/Cubed/ui/widget.hpp | 22 +++--- src/debug_collector.cpp | 108 +++++++++++++++++++++++------- src/render/renderer.cpp | 6 +- src/ui/button.cpp | 42 ++++++------ src/ui/image.cpp | 2 +- src/ui/label.cpp | 4 +- src/ui/main_menu_ui_manager.cpp | 22 ++---- src/ui/widget.cpp | 89 +++++++++++++++++++++--- src/ui/world_ui_manager.cpp | 20 ++---- 14 files changed, 241 insertions(+), 114 deletions(-) create mode 100644 include/Cubed/ui/anchor.hpp diff --git a/include/Cubed/debug_collector.hpp b/include/Cubed/debug_collector.hpp index a6cb5ac..ce6d253 100644 --- a/include/Cubed/debug_collector.hpp +++ b/include/Cubed/debug_collector.hpp @@ -13,8 +13,9 @@ public: DebugCollector(); void report(const std::string& name, std::string_view content); - void init_text(); + void init(int width, int height); Widget& get_widget(); + bool handle_event(const Event& e); private: Widget m_widget; diff --git a/include/Cubed/ui/anchor.hpp b/include/Cubed/ui/anchor.hpp new file mode 100644 index 0000000..95fd298 --- /dev/null +++ b/include/Cubed/ui/anchor.hpp @@ -0,0 +1,15 @@ +#pragma once + +enum class Anchor { + TOP_LEFT, + TOP_CENTER, + TOP_RIGHT, + + CENTER_LEFT, + CENTER, + CENTER_RIGHT, + + BOTTOM_LEFT, + BOTTOM_CENTER, + BOTTOM_RIGHT, +}; \ No newline at end of file diff --git a/include/Cubed/ui/button.hpp b/include/Cubed/ui/button.hpp index 0e32cfd..251b585 100644 --- a/include/Cubed/ui/button.hpp +++ b/include/Cubed/ui/button.hpp @@ -9,7 +9,7 @@ namespace Cubed { class Button : public Widget { public: - Button(); + Button(Widget* parent); Button(const Button&) = delete; Button(Button&&) = delete; @@ -21,10 +21,11 @@ public: bool handle_mouse_move_event(const MouseMoveEvent& e) override; bool handle_mouse_button_event(const MouseButtonEvent& e) override; - - Widget& set_position(const glm::vec2& pos) override; - Widget& set_position(float x, float y) override; + void set_window_size(int width, int height) override; Button& set_scale(float scale); + Widget& set_anchor(Anchor anchor) override; + Widget& set_offset(glm::ivec2 offset) override; + glm::vec2 pos() const override; float width() const override; float height() const override; float scale() const; @@ -34,16 +35,17 @@ public: } template T& set_background(Args&&... args) { - auto w = std::make_unique(std::forward(args)...); + auto w = std::make_unique(std::forward(args)..., m_parent); T& ref = *w; m_background = std::move(w); return ref; } template T& set_foreground(Args&&... args) { - auto w = std::make_unique(std::forward(args)...); + auto w = std::make_unique(std::forward(args)..., this); T& ref = *w; m_foreground = std::move(w); + m_foreground->set_anchor(Anchor::CENTER); return ref; } @@ -52,7 +54,5 @@ private: std::unique_ptr m_background; std::unique_ptr