From 7d92198ef0e96cfe215dc36c853febf198bef126 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Mon, 9 Mar 2026 02:53:15 +0300 Subject: [PATCH] rsx/overlays: Improvements for some containers --- rpcs3/Emu/RSX/Overlays/overlay_controls.cpp | 17 +++++++++++-- rpcs3/Emu/RSX/Overlays/overlay_controls.h | 25 ++++++++++++++++++++ rpcs3/Emu/RSX/Overlays/overlay_list_view.cpp | 13 ++++++++++ rpcs3/Emu/RSX/Overlays/overlay_list_view.hpp | 1 + rpcs3/Emu/RSX/Overlays/overlay_tabs.cpp | 11 +++++++++ rpcs3/Emu/RSX/Overlays/overlay_tabs.h | 1 + 6 files changed, 66 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/RSX/Overlays/overlay_controls.cpp b/rpcs3/Emu/RSX/Overlays/overlay_controls.cpp index 96ffaac93d..103981e1cf 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_controls.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_controls.cpp @@ -860,8 +860,8 @@ namespace rsx continue; } - const s32 item_x_limit = s32{item->x} + item->w - scroll_offset_value - w; - const s32 item_x_base = s32{item->x} - scroll_offset_value - w; + const s32 item_x_limit = s32{item->x} + item->w - scroll_offset_value - x; + const s32 item_x_base = s32{item->x} - scroll_offset_value - x; if (item_x_base > w) { @@ -899,6 +899,19 @@ namespace rsx return scroll_offset_value; } + overlay_element* box_layout::add_element(std::unique_ptr& item, int offset) + { + if (offset < 0) + { + m_items.push_back(std::move(item)); + return m_items.back().get(); + } + + overlay_element* result = item.get(); + m_items.insert(m_items.begin() + offset, std::move(item)); + return result; + } + compiled_resource& image_view::get_compiled() { if (is_compiled()) diff --git a/rpcs3/Emu/RSX/Overlays/overlay_controls.h b/rpcs3/Emu/RSX/Overlays/overlay_controls.h index 7b95ce4950..01a5a4487d 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_controls.h +++ b/rpcs3/Emu/RSX/Overlays/overlay_controls.h @@ -235,6 +235,22 @@ namespace rsx bool auto_resize = true; virtual overlay_element* add_element(std::unique_ptr&, int = -1) = 0; + + template + requires std::is_base_of_v + T* add_element(std::unique_ptr& ptr, int offset = -1) + { + auto _ptr = ensure(dynamic_cast(ptr.release())); + std::unique_ptr e{ _ptr }; + return static_cast(add_element(e, offset)); + } + + overlay_element* add_element() + { + auto ptr = std::make_unique(); + return add_element(ptr); + } + void clear_items(); layout_container(); @@ -252,6 +268,7 @@ namespace rsx struct vertical_layout : public layout_container { + using layout_container::add_element; overlay_element* add_element(std::unique_ptr& item, int offset = -1) override; compiled_resource& get_compiled() override; u16 get_scroll_offset_px() override; @@ -259,11 +276,19 @@ namespace rsx struct horizontal_layout : public layout_container { + using layout_container::add_element; overlay_element* add_element(std::unique_ptr& item, int offset = -1) override; compiled_resource& get_compiled() override; u16 get_scroll_offset_px() override; }; + struct box_layout : public layout_container + { + using layout_container::add_element; + overlay_element* add_element(std::unique_ptr& item, int offset = -1) override; + u16 get_scroll_offset_px() override { return 0; } + }; + // Controls struct spacer : public overlay_element { diff --git a/rpcs3/Emu/RSX/Overlays/overlay_list_view.cpp b/rpcs3/Emu/RSX/Overlays/overlay_list_view.cpp index 2ff654254c..eb312e14b5 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_list_view.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_list_view.cpp @@ -262,6 +262,19 @@ namespace rsx } } + void list_view::set_size(u16 w, u16 h) + { + vertical_layout::set_size(w, h); + + m_scroll_indicator_top->w = w; + m_scroll_indicator_bottom->w = w; + m_highlight_box->w = w; + + m_scroll_indicator_top->refresh(); + m_scroll_indicator_bottom->refresh(); + m_highlight_box->refresh(); + } + compiled_resource& list_view::get_compiled() { if (is_compiled()) diff --git a/rpcs3/Emu/RSX/Overlays/overlay_list_view.hpp b/rpcs3/Emu/RSX/Overlays/overlay_list_view.hpp index 57e2d94a32..b50baf7ad4 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_list_view.hpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_list_view.hpp @@ -45,6 +45,7 @@ namespace rsx void set_cancel_only(bool cancel_only); void translate(s16 _x, s16 _y) override; + void set_size(u16 w, u16 h) override; compiled_resource& get_compiled() override; }; diff --git a/rpcs3/Emu/RSX/Overlays/overlay_tabs.cpp b/rpcs3/Emu/RSX/Overlays/overlay_tabs.cpp index 0a0248ad2c..3d6cbf8647 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_tabs.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_tabs.cpp @@ -54,6 +54,16 @@ namespace rsx::overlays reflow_layout(); } + void tabbed_container::set_headers_background_color(const color4f& color) + { + if (!m_tab_headers) + { + reflow_layout(); + } + + m_tab_headers->back_color = color; + } + void tabbed_container::set_headers_pulse_effect(bool pulse) { if (!m_tab_headers) @@ -87,6 +97,7 @@ namespace rsx::overlays auto ptr = horizontal_layout::add_element(tab_headers); m_tab_headers = ensure(dynamic_cast(ptr)); m_tab_headers->set_pos(x, y); + m_tab_headers->advance_pos = 16; m_tab_headers->hide_prompt_buttons(); m_tab_headers->back_color.a = 0.95f; } diff --git a/rpcs3/Emu/RSX/Overlays/overlay_tabs.h b/rpcs3/Emu/RSX/Overlays/overlay_tabs.h index 7d9993c4d1..0c5e58ac56 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_tabs.h +++ b/rpcs3/Emu/RSX/Overlays/overlay_tabs.h @@ -15,6 +15,7 @@ namespace rsx::overlays virtual void set_size(u16 _w, u16 _h) override; virtual void set_headers_width(u16 size); + void set_headers_background_color(const color4f& color); overlay_element* set_selected_tab(u32 index); overlay_element* get_selected() const;