From e8166366763bd389030613d3befebf2fd93746aa Mon Sep 17 00:00:00 2001 From: Megamouse Date: Mon, 31 Mar 2025 01:07:23 +0200 Subject: [PATCH] overlays: play ICON1.PAM in save data list if possible --- rpcs3/Emu/Cell/Modules/cellSaveData.cpp | 4 +- rpcs3/Emu/Cell/Modules/cellSaveData.h | 2 +- .../Emu/RSX/Overlays/overlay_save_dialog.cpp | 37 ++++++++++--------- rpcs3/Emu/RSX/Overlays/overlay_save_dialog.h | 11 +++--- rpcs3/rpcs3qt/save_data_dialog.cpp | 4 +- rpcs3/rpcs3qt/save_data_dialog.h | 2 +- rpcs3/rpcs3qt/save_manager_dialog.cpp | 2 +- rpcs3/rpcs3qt/save_manager_dialog.h | 2 +- 8 files changed, 33 insertions(+), 31 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellSaveData.cpp b/rpcs3/Emu/Cell/Modules/cellSaveData.cpp index 8afee44408..db57195a5c 100644 --- a/rpcs3/Emu/Cell/Modules/cellSaveData.cpp +++ b/rpcs3/Emu/Cell/Modules/cellSaveData.cpp @@ -307,7 +307,7 @@ static error_code select_and_delete(ppu_thread& ppu) // Display a blocking Save Data List asynchronously in the GUI thread. if (auto save_dialog = Emu.GetCallbacks().get_save_dialog()) { - selected = save_dialog->ShowSaveDataList(save_entries, focused, SAVEDATA_OP_LIST_DELETE, vm::null, g_fxo->get().enable_overlay); + selected = save_dialog->ShowSaveDataList(base_dir, save_entries, focused, SAVEDATA_OP_LIST_DELETE, vm::null, g_fxo->get().enable_overlay); } // Reschedule after a blocking dialog returns @@ -1183,7 +1183,7 @@ static NEVER_INLINE error_code savedata_op(ppu_thread& ppu, u32 operation, u32 v // Display a blocking Save Data List asynchronously in the GUI thread. if (auto save_dialog = Emu.GetCallbacks().get_save_dialog()) { - selected = save_dialog->ShowSaveDataList(save_entries, focused, operation, listSet, g_fxo->get().enable_overlay); + selected = save_dialog->ShowSaveDataList(base_dir, save_entries, focused, operation, listSet, g_fxo->get().enable_overlay); } else { diff --git a/rpcs3/Emu/Cell/Modules/cellSaveData.h b/rpcs3/Emu/Cell/Modules/cellSaveData.h index 73b0af4f01..0632c2500b 100644 --- a/rpcs3/Emu/Cell/Modules/cellSaveData.h +++ b/rpcs3/Emu/Cell/Modules/cellSaveData.h @@ -361,5 +361,5 @@ class SaveDialogBase public: virtual ~SaveDialogBase(); - virtual s32 ShowSaveDataList(std::vector& save_entries, s32 focused, u32 op, vm::ptr listSet, bool enable_overlay) = 0; + virtual s32 ShowSaveDataList(const std::string& base_dir, std::vector& save_entries, s32 focused, u32 op, vm::ptr listSet, bool enable_overlay) = 0; }; diff --git a/rpcs3/Emu/RSX/Overlays/overlay_save_dialog.cpp b/rpcs3/Emu/RSX/Overlays/overlay_save_dialog.cpp index 1754b3694c..86e9905f2f 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_save_dialog.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_save_dialog.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "overlay_save_dialog.h" +#include "overlay_video.h" #include "Utilities/date_time.h" #include "Emu/System.h" @@ -7,26 +8,18 @@ namespace rsx { namespace overlays { - save_dialog::save_dialog_entry::save_dialog_entry(const std::string& text1, const std::string& text2, const std::string& text3, u8 resource_id, const std::vector& icon_buf) + save_dialog::save_dialog_entry::save_dialog_entry(const std::string& text1, const std::string& text2, const std::string& text3, u8 resource_id, const std::vector& icon_buf, const std::string& video_path) { - std::unique_ptr image = std::make_unique(); + std::unique_ptr image = resource_id != image_resource_id::raw_image + ? std::make_unique(video_path, resource_id) + : !icon_buf.empty() ? std::make_unique(video_path, icon_buf) + : std::make_unique(video_path, resource_config::standard_image_resource::save); // Fallback image->set_size(160, 110); image->set_padding(36, 36, 11, 11); // Square image, 88x88 - if (resource_id != image_resource_id::raw_image) - { - static_cast(image.get())->set_image_resource(resource_id); - } - else if (!icon_buf.empty()) + if (resource_id == image_resource_id::raw_image && !icon_buf.empty()) { image->set_padding(0, 0, 11, 11); // Half sized icon, 320x176->160x88 - icon_data = std::make_unique(icon_buf); - static_cast(image.get())->set_raw_image(icon_data.get()); - } - else - { - // Fallback - static_cast(image.get())->set_image_resource(resource_config::standard_image_resource::save); } std::unique_ptr text_stack = std::make_unique(); @@ -74,10 +67,18 @@ namespace rsx // Pack this->pack_padding = 15; - add_element(image); + m_image = add_element(image); add_element(text_stack); } + void save_dialog::save_dialog_entry::set_selected(bool selected) + { + if (m_image) + { + static_cast(m_image)->set_active(selected); + } + } + save_dialog::save_dialog() { m_dim_background = std::make_unique(); @@ -197,7 +198,7 @@ namespace rsx return result; } - s32 save_dialog::show(std::vector& save_entries, u32 focused, u32 op, vm::ptr listSet, bool enable_overlay) + s32 save_dialog::show(const std::string& base_dir, std::vector& save_entries, u32 focused, u32 op, vm::ptr listSet, bool enable_overlay) { rsx_log.notice("Showing native UI save_dialog (save_entries=%d, focused=%d, op=0x%x, listSet=*0x%x, enable_overlay=%d)", save_entries.size(), focused, op, listSet, enable_overlay); @@ -218,7 +219,7 @@ namespace rsx { const std::string date_and_size = fmt::format("%s %s", entry.date(), entry.data_size()); std::unique_ptr e; - e = std::make_unique(entry.subtitle, date_and_size, entry.details, image_resource_id::raw_image, entry.iconBuf); + e = std::make_unique(entry.subtitle, date_and_size, entry.details, image_resource_id::raw_image, entry.iconBuf, base_dir + entry.dirName + "/ICON1.PAM"); entries.emplace_back(std::move(e)); } @@ -270,7 +271,7 @@ namespace rsx id = image_resource_id::raw_image; } - std::unique_ptr new_stub = std::make_unique(title, get_localized_string(localized_string_id::CELL_SAVEDATA_NEW_SAVED_DATA_SUB_TITLE), "", id, icon); + std::unique_ptr new_stub = std::make_unique(title, get_localized_string(localized_string_id::CELL_SAVEDATA_NEW_SAVED_DATA_SUB_TITLE), "", id, icon, ""); m_list->add_entry(new_stub); } diff --git a/rpcs3/Emu/RSX/Overlays/overlay_save_dialog.h b/rpcs3/Emu/RSX/Overlays/overlay_save_dialog.h index e33119cc72..0c65379153 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_save_dialog.h +++ b/rpcs3/Emu/RSX/Overlays/overlay_save_dialog.h @@ -13,11 +13,12 @@ namespace rsx private: struct save_dialog_entry : horizontal_layout { - private: - std::unique_ptr icon_data; - public: - save_dialog_entry(const std::string& text1, const std::string& text2, const std::string& text3, u8 resource_id, const std::vector& icon_buf); + save_dialog_entry(const std::string& text1, const std::string& text2, const std::string& text3, u8 resource_id, const std::vector& icon_buf, const std::string& video_path); + void set_selected(bool selected) override; + + private: + overlay_element* m_image = nullptr; }; std::unique_ptr m_dim_background; @@ -38,7 +39,7 @@ namespace rsx compiled_resource get_compiled() override; - s32 show(std::vector& save_entries, u32 focused, u32 op, vm::ptr listSet, bool enable_overlay); + s32 show(const std::string& base_dir, std::vector& save_entries, u32 focused, u32 op, vm::ptr listSet, bool enable_overlay); }; } } diff --git a/rpcs3/rpcs3qt/save_data_dialog.cpp b/rpcs3/rpcs3qt/save_data_dialog.cpp index 105fd7d27c..f98f615e54 100644 --- a/rpcs3/rpcs3qt/save_data_dialog.cpp +++ b/rpcs3/rpcs3qt/save_data_dialog.cpp @@ -12,7 +12,7 @@ LOG_CHANNEL(cellSaveData); -s32 save_data_dialog::ShowSaveDataList(std::vector& save_entries, s32 focused, u32 op, vm::ptr listSet, bool enable_overlay) +s32 save_data_dialog::ShowSaveDataList(const std::string& base_dir, std::vector& save_entries, s32 focused, u32 op, vm::ptr listSet, bool enable_overlay) { cellSaveData.notice("ShowSaveDataList(save_entries=%d, focused=%d, op=0x%x, listSet=*0x%x, enable_overlay=%d)", save_entries.size(), focused, op, listSet, enable_overlay); @@ -29,7 +29,7 @@ s32 save_data_dialog::ShowSaveDataList(std::vector& save_entries, { cellSaveData.notice("ShowSaveDataList: Showing native UI dialog"); - const s32 result = manager->create()->show(save_entries, focused, op, listSet, enable_overlay); + const s32 result = manager->create()->show(base_dir, save_entries, focused, op, listSet, enable_overlay); if (result != rsx::overlays::user_interface::selection_code::error) { cellSaveData.notice("ShowSaveDataList: Native UI dialog returned with selection %d", result); diff --git a/rpcs3/rpcs3qt/save_data_dialog.h b/rpcs3/rpcs3qt/save_data_dialog.h index b33b16b77f..e98ee8e4ac 100644 --- a/rpcs3/rpcs3qt/save_data_dialog.h +++ b/rpcs3/rpcs3qt/save_data_dialog.h @@ -6,5 +6,5 @@ class save_data_dialog : public SaveDialogBase { public: - s32 ShowSaveDataList(std::vector& save_entries, s32 focused, u32 op, vm::ptr listSet, bool enable_overlay) override; + s32 ShowSaveDataList(const std::string& base_dir, std::vector& save_entries, s32 focused, u32 op, vm::ptr listSet, bool enable_overlay) override; }; diff --git a/rpcs3/rpcs3qt/save_manager_dialog.cpp b/rpcs3/rpcs3qt/save_manager_dialog.cpp index d3cd03f4ec..ba52bed9ff 100644 --- a/rpcs3/rpcs3qt/save_manager_dialog.cpp +++ b/rpcs3/rpcs3qt/save_manager_dialog.cpp @@ -585,7 +585,7 @@ void save_manager_dialog::OnEntriesRemove() } // Pop-up a small context-menu, being a replacement for save_data_manage_dialog -void save_manager_dialog::ShowContextMenu(const QPoint &pos) +void save_manager_dialog::ShowContextMenu(const QPoint& pos) { const int idx = m_list->currentRow(); if (idx == -1) diff --git a/rpcs3/rpcs3qt/save_manager_dialog.h b/rpcs3/rpcs3qt/save_manager_dialog.h index e685b2b6d5..791ee9a814 100644 --- a/rpcs3/rpcs3qt/save_manager_dialog.h +++ b/rpcs3/rpcs3qt/save_manager_dialog.h @@ -42,7 +42,7 @@ private: void Init(); void UpdateList(); void UpdateIcons(); - void ShowContextMenu(const QPoint &pos); + void ShowContextMenu(const QPoint& pos); void WaitForRepaintThreads(bool abort); void closeEvent(QCloseEvent* event) override;