overlays: fix and optimize layout exit loops

This commit is contained in:
Megamouse 2025-02-28 21:05:23 +01:00
parent 1dc3ebf891
commit fad6335131
7 changed files with 40 additions and 20 deletions

View file

@ -121,6 +121,7 @@ namespace rsx
m_list->set_pos(20, 85);
m_message_box = std::make_shared<home_menu_message_box>(20, 85, virtual_width - 2 * 20, 540);
m_message_box->visible = false;
m_description = std::make_unique<label>();
m_description->set_font("Arial", 20);
@ -156,7 +157,7 @@ namespace rsx
{
if (fade_animation.active) return;
if (m_message_box && m_message_box->visible())
if (m_message_box && m_message_box->visible)
{
const page_navigation navigation = m_message_box->handle_button_press(button_press);
if (navigation != page_navigation::stay)
@ -210,7 +211,7 @@ namespace rsx
}
}
if (!selected_username.empty() && m_message_box && !m_message_box->visible())
if (!selected_username.empty() && m_message_box && !m_message_box->visible)
{
m_message_box->show(get_localized_string(localized_string_id::HOME_MENU_FRIENDS_REMOVE_USER_MSG, selected_username.c_str()), [this, selected_username]()
{
@ -247,7 +248,7 @@ namespace rsx
user_index++;
}
if (!selected_username.empty() && m_message_box && !m_message_box->visible())
if (!selected_username.empty() && m_message_box && !m_message_box->visible)
{
if (user_index < m_friend_data.requests_received.size())
{
@ -291,7 +292,7 @@ namespace rsx
}
}
if (!selected_username.empty() && m_message_box && !m_message_box->visible())
if (!selected_username.empty() && m_message_box && !m_message_box->visible)
{
m_message_box->show(get_localized_string(localized_string_id::HOME_MENU_FRIENDS_UNBLOCK_USER_MSG, selected_username.c_str()), []()
{
@ -392,7 +393,7 @@ namespace rsx
m_last_page.store(m_current_page);
}
if (m_message_box && m_message_box->visible())
if (m_message_box && m_message_box->visible)
{
result.add(m_message_box->get_compiled());
}

View file

@ -61,13 +61,13 @@ namespace rsx
m_label.set_text(text);
m_label.auto_resize();
m_label.set_pos(x + (w - m_label.w) / 2, y + (h - m_label.h) / 2);
m_visible = true;
visible = true;
refresh();
}
void home_menu_message_box::hide()
{
m_visible = false;
visible = false;
refresh();
}

View file

@ -14,10 +14,8 @@ namespace rsx
void show(const std::string& text, std::function<void()> on_accept = nullptr, std::function<void()> on_cancel = nullptr);
void hide();
page_navigation handle_button_press(pad_button button_press);
bool visible() const { return m_visible; }
private:
bool m_visible = false;
label m_label{};
image_button m_accept_btn;
image_button m_cancel_btn;

View file

@ -119,7 +119,7 @@ namespace rsx
void home_menu_page::show_dialog(const std::string& text, std::function<void()> on_accept, std::function<void()> on_cancel)
{
if (m_message_box && !m_message_box->visible())
if (m_message_box && !m_message_box->visible)
{
rsx_log.notice("home_menu_page::show_dialog: page='%s', text='%s'", title, text);
m_message_box->show(text, std::move(on_accept), std::move(on_cancel));
@ -129,7 +129,7 @@ namespace rsx
page_navigation home_menu_page::handle_button_press(pad_button button_press, bool is_auto_repeat, u64 auto_repeat_interval_ms)
{
if (m_message_box && m_message_box->visible())
if (m_message_box && m_message_box->visible)
{
const page_navigation navigation = m_message_box->handle_button_press(button_press);
if (navigation != page_navigation::stay)
@ -270,7 +270,7 @@ namespace rsx
{
compiled_resources = list_view::get_compiled();
if (m_message_box && m_message_box->visible())
if (m_message_box && m_message_box->visible)
{
compiled_resources.add(m_message_box->get_compiled());
}

View file

@ -735,14 +735,20 @@ namespace rsx
{
if (!item)
{
rsx_log.error("Found null item in overlay_controls");
rsx_log.error("Found null item in overlay_controls::vertical_layout");
continue;
}
const s32 item_y_limit = s32{item->y} + item->h - scroll_offset_value - y;
const s32 item_y_base = s32{item->y} - scroll_offset_value - y;
if (item_y_limit < 0 || item_y_base > h)
if (item_y_base > h)
{
// Out of bounds. The following items will be too.
break;
}
if (item_y_limit < 0)
{
// Out of bounds
continue;
@ -809,15 +815,28 @@ namespace rsx
for (auto &item : m_items)
{
if (!item)
{
rsx_log.error("Found null item in overlay_controls::horizontal_layout");
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;
if (item_x_limit < 0 || item_x_base > h)
if (item_x_base > w)
{
// Out of bounds. The following items will be too.
break;
}
if (item_x_limit < 0)
{
// Out of bounds
continue;
}
else if (item_x_limit > h || item_x_base < 0)
if (item_x_limit > w || item_x_base < 0)
{
// Partial render
areaf clip_rect = static_cast<areaf>(areai{x, y, (x + w), (y + h)});

View file

@ -167,6 +167,8 @@ namespace rsx
compiled_resource compiled_resources;
bool is_compiled = false;
bool visible = true;
u16 padding_left = 0;
u16 padding_right = 0;
u16 padding_top = 0;

View file

@ -80,16 +80,16 @@ namespace rsx
const usz current_index = static_cast<usz>(m_selected_entry) * (m_use_separators ? 2 : 1);
if (m_items.size() <= current_index)
if (current_index >= m_items.size())
{
return; // Ideally unreachable but it should still be possible to recover by user interaction.
}
auto current_element = m_items[current_index].get();
const auto current_element = m_items[current_index].get();
// Calculate bounds
auto min_y = current_element->y - y;
auto max_y = current_element->y + current_element->h + pack_padding + 2 - y;
const auto min_y = current_element->y - y;
const auto max_y = current_element->y + current_element->h + pack_padding + 2 - y;
if (min_y < scroll_offset_value)
{