rsx/overlays: Replace home menu with a sidebar

This commit is contained in:
kd-11 2026-03-08 20:31:01 +03:00 committed by kd-11
parent 3c16105c3b
commit d5928d99d7
6 changed files with 158 additions and 52 deletions

View file

@ -56,6 +56,8 @@ namespace rsx
m_time_display.auto_resize();
last_time = std::move(new_time);
}
m_main_menu.update(timestamp_us);
}
void home_menu_dialog::on_button_pressed(pad_button button_press, bool is_auto_repeat)
@ -88,6 +90,11 @@ namespace rsx
std::string path = page->title;
for (home_menu_page* parent = page->parent; parent; parent = parent->parent)
{
if (parent->title.empty())
{
break;
}
path = parent->title + " > " + path;
}
m_description.set_text(path);

View file

@ -19,7 +19,7 @@ namespace rsx
namespace overlays
{
home_menu_main_menu::home_menu_main_menu(s16 x, s16 y, u16 width, u16 height, bool use_separators, home_menu_page* parent)
: home_menu_page(x, y, width, height, use_separators, parent, get_localized_string(localized_string_id::HOME_MENU_TITLE))
: home_menu_page(x, y, width, height, use_separators, parent, "")
{
is_current_page = true;
@ -28,8 +28,15 @@ namespace rsx
m_config_changed = std::make_shared<bool>(g_backup_cfg.to_string() != g_cfg.to_string());
std::unique_ptr<overlay_element> resume = std::make_unique<home_menu_entry>(get_localized_string(localized_string_id::HOME_MENU_RESUME), width);
add_item(resume, [](pad_button btn) -> page_navigation
m_sidebar = std::make_unique<list_view>(350, height, false);
m_sidebar->set_pos(x, y);
m_sidebar->hide_prompt_buttons();
m_sidebar->back_color = color4f(0.15f, 0.15f, 0.15f, 0.85f);
m_sliding_animation.duration_sec = 0.5f;
m_sliding_animation.type = animation_type::ease_in_out_cubic;
add_item(get_localized_string(localized_string_id::HOME_MENU_RESUME), [](pad_button btn) -> page_navigation
{
if (btn != pad_button::cross) return page_navigation::stay;
@ -41,8 +48,7 @@ namespace rsx
if (rsx::overlays::friends_list_dialog::rpcn_configured())
{
std::unique_ptr<overlay_element> friends = std::make_unique<home_menu_entry>(get_localized_string(localized_string_id::HOME_MENU_FRIENDS), width);
add_item(friends, [](pad_button btn) -> page_navigation
add_item(get_localized_string(localized_string_id::HOME_MENU_FRIENDS), [](pad_button btn) -> page_navigation
{
if (btn != pad_button::cross) return page_navigation::stay;
@ -76,8 +82,7 @@ namespace rsx
}
if (!trop_name.empty())
{
std::unique_ptr<overlay_element> trophies = std::make_unique<home_menu_entry>(get_localized_string(localized_string_id::HOME_MENU_TROPHIES), width);
add_item(trophies, [trop_name = std::move(trop_name)](pad_button btn) -> page_navigation
add_item(get_localized_string(localized_string_id::HOME_MENU_TROPHIES), [trop_name = std::move(trop_name)](pad_button btn) -> page_navigation
{
if (btn != pad_button::cross) return page_navigation::stay;
@ -93,8 +98,7 @@ namespace rsx
});
}
std::unique_ptr<overlay_element> screenshot = std::make_unique<home_menu_entry>(get_localized_string(localized_string_id::HOME_MENU_SCREENSHOT), width);
add_item(screenshot, [](pad_button btn) -> page_navigation
add_item(get_localized_string(localized_string_id::HOME_MENU_SCREENSHOT), [](pad_button btn) -> page_navigation
{
if (btn != pad_button::cross) return page_navigation::stay;
@ -102,8 +106,7 @@ namespace rsx
return page_navigation::exit_for_screenshot;
});
std::unique_ptr<overlay_element> recording = std::make_unique<home_menu_entry>(get_localized_string(localized_string_id::HOME_MENU_RECORDING), width);
add_item(recording, [](pad_button btn) -> page_navigation
add_item(get_localized_string(localized_string_id::HOME_MENU_RECORDING), [](pad_button btn) -> page_navigation
{
if (btn != pad_button::cross) return page_navigation::stay;
@ -112,8 +115,7 @@ namespace rsx
return page_navigation::exit;
});
std::unique_ptr<overlay_element> fullscreen = std::make_unique<home_menu_entry>(get_localized_string(localized_string_id::HOME_MENU_TOGGLE_FULLSCREEN), width);
add_item(fullscreen, [](pad_button btn) -> page_navigation
add_item(get_localized_string(localized_string_id::HOME_MENU_TOGGLE_FULLSCREEN), [](pad_button btn) -> page_navigation
{
if (btn != pad_button::cross)
return page_navigation::stay;
@ -125,8 +127,7 @@ namespace rsx
add_page(std::make_shared<home_menu_savestate>(x, y, width, height, use_separators, this));
std::unique_ptr<overlay_element> restart = std::make_unique<home_menu_entry>(get_localized_string(localized_string_id::HOME_MENU_RESTART), width);
add_item(restart, [](pad_button btn) -> page_navigation
add_item(get_localized_string(localized_string_id::HOME_MENU_RESTART), [](pad_button btn) -> page_navigation
{
if (btn != pad_button::cross) return page_navigation::stay;
@ -141,8 +142,7 @@ namespace rsx
return page_navigation::exit;
});
std::unique_ptr<overlay_element> exit_game = std::make_unique<home_menu_entry>(get_localized_string(localized_string_id::HOME_MENU_EXIT_GAME), width);
add_item(exit_game, [](pad_button btn) -> page_navigation
add_item(get_localized_string(localized_string_id::HOME_MENU_EXIT_GAME), [](pad_button btn) -> page_navigation
{
if (btn != pad_button::cross) return page_navigation::stay;
@ -156,5 +156,77 @@ namespace rsx
apply_layout();
}
void home_menu_main_menu::add_sidebar_entry(std::string_view title)
{
std::unique_ptr<overlay_element> label_widget = std::make_unique<label>(title.data());
label_widget->set_size(m_sidebar->w, 60);
label_widget->set_font("Arial", 18);
label_widget->back_color.a = 0.f;
label_widget->set_padding(16, 4, 16, 4);
m_sidebar->add_entry(label_widget);
}
void home_menu_main_menu::add_item(std::string_view title, std::function<page_navigation(pad_button)> callback)
{
add_sidebar_entry(title);
home_menu_page::add_item(title, callback);
}
void home_menu_main_menu::add_page(std::shared_ptr<home_menu_page> page)
{
add_sidebar_entry(page->title);
home_menu_page::add_page(page);
}
void home_menu_main_menu::select_entry(s32 entry)
{
m_sidebar->select_entry(entry);
list_view::select_entry(entry);
}
void home_menu_main_menu::select_next(u16 count)
{
m_sidebar->select_next(count);
list_view::select_next(count);
}
void home_menu_main_menu::select_previous(u16 count)
{
m_sidebar->select_previous(count);
list_view::select_previous(count);
}
void home_menu_main_menu::update(u64 timestamp_us)
{
if (m_animation_timer == 0)
{
m_animation_timer = timestamp_us;
m_sliding_animation.current = { -f32(m_sidebar->x + m_sidebar->w), 0, 0 };
m_sliding_animation.end = {};
m_sliding_animation.active = true;
m_sliding_animation.update(0);
return;
}
if (m_sliding_animation.active)
{
m_sliding_animation.update(timestamp_us);
}
}
compiled_resource& home_menu_main_menu::get_compiled()
{
m_is_compiled = true;
if (home_menu_page* page = get_current_page(false))
{
return page->get_compiled();
}
compiled_resources = m_sidebar->get_compiled();
m_sliding_animation.apply(compiled_resources);
return compiled_resources;
}
}
}

View file

@ -1,6 +1,7 @@
#pragma once
#include "overlay_home_menu_page.h"
#include "../overlay_animation.h"
namespace rsx
{
@ -9,6 +10,23 @@ namespace rsx
struct home_menu_main_menu : public home_menu_page
{
home_menu_main_menu(s16 x, s16 y, u16 width, u16 height, bool use_separators, home_menu_page* parent);
void select_entry(s32 entry) override;
void select_next(u16 count = 1) override;
void select_previous(u16 count = 1) override;
compiled_resource& get_compiled() override;
void update(u64 timestamp_us) override;
private:
void add_page(std::shared_ptr<home_menu_page> page) override;
void add_item(std::string_view title, std::function<page_navigation(pad_button)> callback) override;
void add_sidebar_entry(std::string_view title);
u64 m_animation_timer = 0;
animation_translate m_sliding_animation;
std::unique_ptr<list_view> m_sidebar; // Render proxy
};
}
}

View file

@ -108,6 +108,12 @@ namespace rsx
m_entries.push_back(std::move(element));
}
void home_menu_page::add_item(std::string_view title, std::function<page_navigation(pad_button)> callback)
{
std::unique_ptr<overlay_element> title_element = std::make_unique<home_menu_entry>(title.data(), w);
add_item(title_element, callback);
}
void home_menu_page::apply_layout(bool center_vertically)
{
if (!m_items.empty())
@ -308,40 +314,41 @@ namespace rsx
compiled_resource& home_menu_page::get_compiled()
{
if (!is_compiled() || (m_message_box && !m_message_box->is_compiled()))
if (m_message_box && !m_message_box->is_compiled())
{
m_is_compiled = false;
if (home_menu_page* page = get_current_page(false))
{
compiled_resources = page->get_compiled();
}
else if (visible)
{
compiled_resources = list_view::get_compiled();
if (m_message_box && m_message_box->visible)
{
compiled_resources.add(m_message_box->get_compiled());
}
else
{
if (show_reset_button())
{
compiled_resources.add(m_reset_btn.get_compiled());
}
if (m_config_changed && *m_config_changed)
{
compiled_resources.add(m_save_btn.get_compiled());
compiled_resources.add(m_discard_btn.get_compiled());
}
}
}
m_is_compiled = true;
}
if (is_compiled())
{
return compiled_resources;
}
if (home_menu_page* page = get_current_page(false))
{
compiled_resources = page->get_compiled();
}
else if (is_visible())
{
compiled_resources = list_view::get_compiled();
if (m_message_box && m_message_box->is_visible())
{
compiled_resources.add(m_message_box->get_compiled());
}
else if (m_config_changed && *m_config_changed)
{
if (show_reset_button())
{
compiled_resources.add(m_reset_btn.get_compiled());
}
compiled_resources.add(m_save_btn.get_compiled());
compiled_resources.add(m_discard_btn.get_compiled());
}
}
m_is_compiled = true;
return compiled_resources;
}
}

View file

@ -24,6 +24,7 @@ namespace rsx
void on_activate();
void on_deactivate();
virtual void update(u64 timestamp_us) {}
virtual bool show_reset_button() const { return false; }
bool is_current_page = false;
@ -34,8 +35,9 @@ namespace rsx
std::shared_ptr<bool> m_config_changed;
protected:
void add_page(std::shared_ptr<home_menu_page> page);
void add_item(std::unique_ptr<overlay_element>& element, std::function<page_navigation(pad_button)> callback);
virtual void add_page(std::shared_ptr<home_menu_page> page);
virtual void add_item(std::unique_ptr<overlay_element>& element, std::function<page_navigation(pad_button)> callback);
virtual void add_item(std::string_view, std::function<page_navigation(pad_button)> callback);
void apply_layout(bool center_vertically = true);
void show_dialog(const std::string& text, std::function<void()> on_accept = nullptr, std::function<void()> on_cancel = nullptr);

View file

@ -28,9 +28,9 @@ namespace rsx
void update_selection();
void select_entry(s32 entry);
void select_next(u16 count = 1);
void select_previous(u16 count = 1);
virtual void select_entry(s32 entry);
virtual void select_next(u16 count = 1);
virtual void select_previous(u16 count = 1);
void add_entry(std::unique_ptr<overlay_element>& entry);