Qt: play ICON1.PAM in save data manager details
Some checks are pending
Generate Translation Template / Generate Translation Template (push) Waiting to run
Build RPCS3 / RPCS3 Linux ubuntu-24.04 gcc (push) Waiting to run
Build RPCS3 / RPCS3 Linux ubuntu-24.04-arm clang (push) Waiting to run
Build RPCS3 / RPCS3 Linux ubuntu-24.04 clang (push) Waiting to run
Build RPCS3 / RPCS3 Windows (push) Waiting to run

This commit is contained in:
Megamouse 2025-03-29 12:18:43 +01:00
parent b9e0a36816
commit 01cdc83aeb
9 changed files with 114 additions and 10 deletions

View file

@ -832,6 +832,7 @@
<ClCompile Include="rpcs3qt\vfs_dialog_usb_input.cpp" />
<ClCompile Include="rpcs3qt\vfs_dialog_usb_tab.cpp" />
<ClCompile Include="rpcs3qt\vfs_tool_dialog.cpp" />
<ClCompile Include="rpcs3qt\video_label.cpp" />
<ClCompile Include="rpcs3qt\_discord_utils.cpp" />
<ClCompile Include="rpcs3qt\find_dialog.cpp" />
<ClCompile Include="rpcs3qt\game_compatibility.cpp" />
@ -1671,6 +1672,7 @@
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DHAVE_SDL3 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_WINEXTRAS_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\libsdl-org\SDL\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I$(QTDIR)\mkspecs\win32-msvc2015" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtWinExtras" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg"</Command>
</CustomBuild>
<ClInclude Include="rpcs3qt\uuid.h" />
<ClInclude Include="rpcs3qt\video_label.h" />
<ClInclude Include="rpcs3qt\_discord_utils.h" />
<CustomBuild Include="rpcs3qt\find_dialog.h">
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>

View file

@ -199,6 +199,9 @@
<Filter Include="Io\video">
<UniqueIdentifier>{2bb5cec5-5acb-40c0-a388-68db05dff305}</UniqueIdentifier>
</Filter>
<Filter Include="Gui\widgets">
<UniqueIdentifier>{149c596b-83e7-43f8-b5db-6108694434ef}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="main.cpp">
@ -1182,6 +1185,9 @@
<ClCompile Include="rpcs3qt\qt_video_source.cpp">
<Filter>Io\video</Filter>
</ClCompile>
<ClCompile Include="rpcs3qt\video_label.cpp">
<Filter>Gui\widgets</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="Input\ds4_pad_handler.h">
@ -1226,9 +1232,6 @@
<ClInclude Include="rpcs3qt\qt_utils.h">
<Filter>Gui\utils</Filter>
</ClInclude>
<ClInclude Include="rpcs3qt\custom_dock_widget.h">
<Filter>Gui</Filter>
</ClInclude>
<ClInclude Include="rpcs3qt\user_account.h">
<Filter>Gui\user accounts</Filter>
</ClInclude>
@ -1394,6 +1397,12 @@
<ClInclude Include="rpcs3qt\qt_video_source.h">
<Filter>Io\video</Filter>
</ClInclude>
<ClInclude Include="rpcs3qt\custom_dock_widget.h">
<Filter>Gui\widgets</Filter>
</ClInclude>
<ClInclude Include="rpcs3qt\video_label.h">
<Filter>Gui\widgets</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<CustomBuild Include="debug\moc_predefs.h.cbt">

View file

@ -113,6 +113,7 @@ add_library(rpcs3_ui STATIC
vfs_dialog_usb_input.cpp
vfs_dialog_usb_tab.cpp
vfs_tool_dialog.cpp
video_label.cpp
welcome_dialog.cpp
about_dialog.ui

View file

@ -21,10 +21,16 @@ void qt_video_source::set_video_path(const std::string& path)
void qt_video_source::set_active(bool active)
{
if (!m_active.exchange(active) && active)
if (m_active.exchange(active) == active) return;
if (active)
{
start_movie();
}
else
{
stop_movie();
}
}
void qt_video_source::image_change_callback() const

View file

@ -23,7 +23,7 @@ public:
void get_image(std::vector<u8>& data, int& w, int& h, int& ch, int& bpp) override;
bool has_new() const override { return m_has_new; }
void set_active(bool active);
virtual void set_active(bool active);
[[nodiscard]] bool get_active() const
{
return m_active;

View file

@ -2,11 +2,13 @@
#include "custom_table_widget_item.h"
#include "qt_utils.h"
#include "qt_video_source.h"
#include "gui_application.h"
#include "gui_settings.h"
#include "persistent_settings.h"
#include "game_list_delegate.h"
#include "progress_dialog.h"
#include "video_label.h"
#include "Emu/System.h"
#include "Emu/system_utils.hpp"
@ -107,7 +109,7 @@ void save_manager_dialog::Init()
push_close->setAutoDefault(true);
// Details
m_details_icon = new QLabel(this);
m_details_icon = new video_label(this);
m_details_icon->setMinimumSize(320, 176);
m_details_title = new QLabel(tr("Select an item to view details"), this);
m_details_title->setWordWrap(true);
@ -640,7 +642,9 @@ void save_manager_dialog::UpdateDetails()
{
if (const int selected = m_list->selectionModel()->selectedRows().size(); selected != 1)
{
m_details_icon->setPixmap(QPixmap());
m_details_icon->set_thumbnail({});
m_details_icon->set_active(false);
m_details_subtitle->setText("");
m_details_modified->setText("");
m_details_details->setText("");
@ -664,7 +668,7 @@ void save_manager_dialog::UpdateDetails()
const int row = m_list->currentRow();
QTableWidgetItem* item = m_list->item(row, SaveColumns::Name);
QTableWidgetItem* icon_item = m_list->item(row, SaveColumns::Icon);
movie_item* icon_item = static_cast<movie_item*>(m_list->item(row, SaveColumns::Icon));
if (!item || !icon_item)
{
@ -674,7 +678,14 @@ void save_manager_dialog::UpdateDetails()
const int idx = item->data(Qt::UserRole).toInt();
const SaveDataEntry& save = ::at32(m_save_entries, idx);
m_details_icon->setPixmap(icon_item->data(Qt::UserRole).value<QPixmap>());
if (!icon_item->video_path().isEmpty())
{
m_details_icon->set_video_path(icon_item->video_path().toStdString());
}
m_details_icon->set_thumbnail(icon_item->data(SaveUserRole::Pixmap).value<QPixmap>());
m_details_icon->set_active(false);
m_details_title->setText(QString::fromStdString(save.title));
m_details_subtitle->setText(QString::fromStdString(save.subtitle));
m_details_modified->setText(tr("Last modified: %1").arg(FormatTimestamp(save.mtime)));

View file

@ -1,6 +1,7 @@
#pragma once
#include "game_list.h"
#include "Emu/Cell/Modules/cellSaveData.h"
#include <QDialog>
@ -11,6 +12,7 @@
class gui_settings;
class persistent_settings;
class video_label;
class save_manager_dialog : public QDialog
{
@ -59,7 +61,7 @@ private:
QSize m_icon_size;
QColor m_icon_color;
QLabel* m_details_icon = nullptr;
video_label* m_details_icon = nullptr;
QLabel* m_details_title = nullptr;
QLabel* m_details_subtitle = nullptr;
QLabel* m_details_modified = nullptr;

View file

@ -0,0 +1,51 @@
#include "stdafx.h"
#include "video_label.h"
video_label::video_label(QWidget* parent)
: QLabel(parent), qt_video_source()
{
}
video_label::~video_label()
{
}
void video_label::set_thumbnail(const QPixmap& pxmap)
{
m_current_pixmap = pxmap;
}
void video_label::set_active(bool active)
{
if (active)
{
set_image_change_callback([this](const QVideoFrame& frame)
{
if (const QPixmap pixmap = get_movie_image(frame); get_active() && !pixmap.isNull())
{
setPixmap(pixmap);
}
});
start_movie();
}
else
{
set_image_change_callback({});
stop_movie();
setPixmap(m_current_pixmap);
}
}
void video_label::enterEvent(QEnterEvent* event)
{
set_active(true);
QLabel::enterEvent(event);
}
void video_label::leaveEvent(QEvent* event)
{
set_active(false);
QLabel::leaveEvent(event);
}

View file

@ -0,0 +1,22 @@
#pragma once
#include "qt_video_source.h"
#include <QLabel>
#include <QEnterEvent>
#include <QPixmap>
class video_label : public QLabel, public qt_video_source
{
public:
video_label(QWidget* parent = nullptr);
virtual ~video_label();
void set_thumbnail(const QPixmap& pxmap);
void set_active(bool active) override;
void enterEvent(QEnterEvent* event) override;
void leaveEvent(QEvent* event) override;
private:
QPixmap m_current_pixmap;
};