rsx/overlays: Improvements for some containers

This commit is contained in:
kd-11 2026-03-09 02:53:15 +03:00 committed by kd-11
parent 23eb67badc
commit 7d92198ef0
6 changed files with 66 additions and 2 deletions

View file

@ -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<overlay_element>& 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())

View file

@ -235,6 +235,22 @@ namespace rsx
bool auto_resize = true;
virtual overlay_element* add_element(std::unique_ptr<overlay_element>&, int = -1) = 0;
template<typename T>
requires std::is_base_of_v<overlay_element, T>
T* add_element(std::unique_ptr<T>& ptr, int offset = -1)
{
auto _ptr = ensure(dynamic_cast<overlay_element*>(ptr.release()));
std::unique_ptr<overlay_element> e{ _ptr };
return static_cast<T*>(add_element(e, offset));
}
overlay_element* add_element()
{
auto ptr = std::make_unique<overlay_element>();
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<overlay_element>& 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<overlay_element>& 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<overlay_element>& item, int offset = -1) override;
u16 get_scroll_offset_px() override { return 0; }
};
// Controls
struct spacer : public overlay_element
{

View file

@ -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())

View file

@ -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;
};

View file

@ -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<list_view*>(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;
}

View file

@ -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;