From e8157ab549ecbbfd31e989bd8ea3c5a4626b6def Mon Sep 17 00:00:00 2001 From: zhenyan121 <3367366583@qq.com> Date: Mon, 13 Jul 2026 13:06:09 +0800 Subject: [PATCH] refactor(ui): move scale property to subclasses and fix resize event handling Remove scale from base Widget class and add per-type set_scale/scale methods to Button, Image, and Label. Dispatch separate WindowResizeEvent alongside existing FrameBufferResizeEvent. Correct centering calculations from `+` to `-` in main menu and world UI managers. --- include/Cubed/ui/button.hpp | 4 ++-- include/Cubed/ui/image.hpp | 2 ++ include/Cubed/ui/label.hpp | 3 +++ include/Cubed/ui/widget.hpp | 4 +--- src/app.cpp | 17 +++++++++++++---- src/debug_collector.cpp | 8 ++++---- src/ui/button.cpp | 10 ++++++---- src/ui/image.cpp | 6 +++++- src/ui/label.cpp | 7 +++++-- src/ui/main_menu_ui_manager.cpp | 17 ++++++++++------- src/ui/widget.cpp | 6 ------ src/ui/world_ui_manager.cpp | 14 ++++++++------ 12 files changed, 59 insertions(+), 39 deletions(-) diff --git a/include/Cubed/ui/button.hpp b/include/Cubed/ui/button.hpp index 2b34a28..0e32cfd 100644 --- a/include/Cubed/ui/button.hpp +++ b/include/Cubed/ui/button.hpp @@ -24,10 +24,10 @@ public: Widget& set_position(const glm::vec2& pos) override; Widget& set_position(float x, float y) override; - Widget& set_scale(float scale) override; + Button& set_scale(float scale); float width() const override; float height() const override; - + float scale() const; template Button& set_clicked(F&& f) { m_clicked = std::forward(f); return *this; diff --git a/include/Cubed/ui/image.hpp b/include/Cubed/ui/image.hpp index 4a414b0..7719bde 100644 --- a/include/Cubed/ui/image.hpp +++ b/include/Cubed/ui/image.hpp @@ -16,6 +16,8 @@ public: float width() const override; float height() const override; const Texture* texture() const; + Image& set_scale(float scale); + float scale() const; private: const Texture* m_texture = nullptr; diff --git a/include/Cubed/ui/label.hpp b/include/Cubed/ui/label.hpp index 0435eca..1bc5ea5 100644 --- a/include/Cubed/ui/label.hpp +++ b/include/Cubed/ui/label.hpp @@ -17,6 +17,7 @@ public: Label& set_text(std::string_view text); Label& set_color(Color color); + Label& set_scale(float scale); virtual void update(float dt) override; virtual void render(Renderer& renderer) override; @@ -28,6 +29,7 @@ public: float height() const override; float offset_x() const; float offset_y() const; + float scale() const; protected: virtual void on_update(float dt) override; @@ -40,6 +42,7 @@ private: float m_real_height = 0.0f; float m_offset_x = 0.0f; float m_offset_y = 0.0f; + float m_scale = 1.0f; void update_vertices(); }; } // namespace Cubed \ No newline at end of file diff --git a/include/Cubed/ui/widget.hpp b/include/Cubed/ui/widget.hpp index 64d8eb5..e23f139 100644 --- a/include/Cubed/ui/widget.hpp +++ b/include/Cubed/ui/widget.hpp @@ -18,11 +18,10 @@ public: virtual const std::string& id() const; virtual Widget& set_position(const glm::vec2& pos); virtual Widget& set_position(float x, float y); - virtual Widget& set_scale(float scale); + // Returns the final display size virtual float width() const; virtual float height() const; virtual const glm::vec2& pos() const; - virtual float scale() const; virtual bool handle_key_event(const KeyEvent& e); virtual bool handle_mouse_button_event(const MouseButtonEvent& e); @@ -41,7 +40,6 @@ protected: virtual void on_update(float dt); virtual void on_render(Renderer& renderer); std::string m_id; - float m_scale = 1.0f; // Center is at the top-left corner, position is at the top-left corner glm::vec2 m_pos{0.0f, 0.0f}; diff --git a/src/app.cpp b/src/app.cpp index 2c69610..359ace6 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -677,12 +677,21 @@ void App::run() { // static Gait player_gait = Gait::WALK; void App::update() { glfwPollEvents(); + { + int w, h; + glfwGetFramebufferSize(m_window.get_glfw_window(), &w, &h); - int w, h; - glfwGetFramebufferSize(m_window.get_glfw_window(), &w, &h); + if (w != m_renderer.frame_width() || h != m_renderer.frame_height()) { + dispatch_event(FrameBufferResizeEvent{w, h}); + } + } + { + int w, h; + glfwGetWindowSize(m_window.get_glfw_window(), &w, &h); - if (w != m_renderer.frame_width() || h != m_renderer.frame_height()) { - dispatch_event(FrameBufferResizeEvent{w, h}); + if (w != m_renderer.window_width() || h != m_renderer.window_height()) { + dispatch_event(WindowResizeEvent{w, h}); + } } current_time = glfwGetTime(); diff --git a/src/debug_collector.cpp b/src/debug_collector.cpp index ca183d6..84efd49 100644 --- a/src/debug_collector.cpp +++ b/src/debug_collector.cpp @@ -23,8 +23,8 @@ void DebugCollector::init_text() { #endif version_text.set_color(Color::WHITE) .set_text(version) - .set_position(0.0f, 100.0f) - .set_scale(0.8f); + .set_scale(0.8f) + .set_position(0.0f, 100.0f); m_component.try_emplace(version_text.id(), &version_text); // fps @@ -35,8 +35,8 @@ void DebugCollector::init_text() { // player_pos auto& player_pos_text = m_widget.add_child