overlays: Fix bug with list view element count calculation and selection wrap-around

This commit is contained in:
kd-11
2026-03-15 23:51:00 +03:00
committed by kd-11
parent 2fd5b1b4be
commit f9af53f215
4 changed files with 27 additions and 14 deletions
@@ -139,16 +139,13 @@ namespace rsx
} }
// Center vertically if necessary // Center vertically if necessary
if (total_height < h) if (total_height < h && center_vertically)
{ {
if (center_vertically) advance_pos = (h - ::narrow<u16>(total_height)) / 2;
{ }
advance_pos = (h - ::narrow<u16>(total_height)) / 2; else
} {
else advance_pos = menu_entry_margin;
{
advance_pos = menu_entry_margin;
}
} }
for (auto& entry : m_entries) for (auto& entry : m_entries)
@@ -271,9 +268,12 @@ namespace rsx
case pad_button::dpad_up: case pad_button::dpad_up:
case pad_button::ls_up: case pad_button::ls_up:
{ {
if (!is_auto_repeat && get_selected_index() <= 0) if (get_selected_index() <= 0)
{ {
select_entry(get_elements_count() - 1); if (!is_auto_repeat)
{
select_entry(get_elements_count() - 1);
}
break; break;
} }
@@ -283,9 +283,12 @@ namespace rsx
case pad_button::dpad_down: case pad_button::dpad_down:
case pad_button::ls_down: case pad_button::ls_down:
{ {
if (!is_auto_repeat && get_selected_index() >= (get_elements_count() - 1)) if (get_selected_index() >= (get_elements_count() - 1))
{ {
select_entry(0); if (!is_auto_repeat)
{
select_entry(0);
}
break; break;
} }
+1 -1
View File
@@ -264,7 +264,7 @@ namespace rsx
return add_element(ptr); return add_element(ptr);
} }
void clear_items(); virtual void clear_items();
layout_container(); layout_container();
@@ -189,6 +189,15 @@ namespace rsx
update_selection(); update_selection();
} }
void list_view::clear_items()
{
layout_container::clear_items();
m_elements_height = 0;
m_selected_entry = -1;
m_elements_count = 0;
}
u16 list_view::get_elements_count() const u16 list_view::get_elements_count() const
{ {
return m_elements_count; return m_elements_count;
@@ -42,6 +42,7 @@ namespace rsx
} }
void add_entry(std::unique_ptr<overlay_element>& entry); void add_entry(std::unique_ptr<overlay_element>& entry);
void clear_items() override;
u16 get_elements_count() const; u16 get_elements_count() const;
s32 get_selected_index() const; s32 get_selected_index() const;