Qt: Add Option for storing video captures per-games

This commit is contained in:
KamFretoZ
2026-03-23 00:45:25 +07:00
committed by Ty
parent 5cb7abf10c
commit ade5762a45
5 changed files with 57 additions and 32 deletions
+3 -3
View File
@@ -2,12 +2,9 @@
// SPDX-License-Identifier: GPL-3.0+
#include "FolderSettingsWidget.h"
#include "pcsx2/GS/GS.h"
#include "SettingWidgetBinder.h"
#include "SettingsWindow.h"
#include <QtWidgets/QMessageBox>
FolderSettingsWidget::FolderSettingsWidget(SettingsWindow* settings_dialog, QWidget* parent)
: SettingsWidget(settings_dialog, parent)
{
@@ -20,12 +17,15 @@ FolderSettingsWidget::FolderSettingsWidget(SettingsWindow* settings_dialog, QWid
SettingWidgetBinder::BindWidgetToFolderSetting(sif, m_ui.covers, m_ui.coversBrowse, m_ui.coversOpen, m_ui.coversReset, "Folders", "Covers", Path::Combine(EmuFolders::DataRoot, "covers"));
SettingWidgetBinder::BindWidgetToFolderSetting(sif, m_ui.snapshots, m_ui.snapshotsBrowse, m_ui.snapshotsOpen, m_ui.snapshotsReset, "Folders", "Snapshots", Path::Combine(EmuFolders::DataRoot, "snaps"));
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.organizeSnapshotsByGame, "EmuCore/GS", "OrganizeScreenshotsByGame", false);
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.organizeVideoDumpByGame, "EmuCore/GS", "OrganizeVideoCaptureByGame", false);
SettingWidgetBinder::BindWidgetToFolderSetting(sif, m_ui.saveStates, m_ui.saveStatesBrowse, m_ui.saveStatesOpen, m_ui.saveStatesReset,
"Folders", "SaveStates", Path::Combine(EmuFolders::DataRoot, "sstates"));
SettingWidgetBinder::BindWidgetToFolderSetting(sif, m_ui.videoDumpingDirectory, m_ui.videoDumpingDirectoryBrowse, m_ui.videoDumpingDirectoryOpen, m_ui.videoDumpingDirectoryReset,
"Folders", "Videos", Path::Combine(EmuFolders::DataRoot, "videos"));
dialog()->registerWidgetHelp(m_ui.organizeSnapshotsByGame, tr("Organize Snapshots by Game"), tr("Unchecked"),
tr("Saves snapshots to per-game subfolders instead of a shared folder."));
dialog()->registerWidgetHelp(m_ui.organizeVideoDumpByGame, tr("Organize Video Recordings by Game"), tr("Unchecked"),
tr("Saves video recordings to per-game subfolders instead of a shared folder."));
}
FolderSettingsWidget::~FolderSettingsWidget() = default;
+30 -23
View File
@@ -46,12 +46,12 @@
<property name="text">
<string>Used for storing shaders, game list, and achievement data.</string>
</property>
<property name="textInteractionFlags">
<set>Qt::TextInteractionFlag::TextBrowserInteraction</set>
</property>
<property name="buddy">
<cstring>cache</cstring>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
</widget>
</item>
</layout>
@@ -92,12 +92,12 @@
<property name="text">
<string>Used for storing .pnach files containing game cheats.</string>
</property>
<property name="textInteractionFlags">
<set>Qt::TextInteractionFlag::TextBrowserInteraction</set>
</property>
<property name="buddy">
<cstring>cheats</cstring>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
</widget>
</item>
</layout>
@@ -139,7 +139,7 @@
<string>Used for saving screenshots and GS dumps.</string>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
<set>Qt::TextInteractionFlag::TextBrowserInteraction</set>
</property>
<property name="buddy">
<cstring>snapshots</cstring>
@@ -167,12 +167,12 @@
<property name="text">
<string>Used for storing save states.</string>
</property>
<property name="textInteractionFlags">
<set>Qt::TextInteractionFlag::TextBrowserInteraction</set>
</property>
<property name="buddy">
<cstring>saveStates</cstring>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
</widget>
</item>
<item row="1" column="1">
@@ -237,12 +237,12 @@
<property name="text">
<string>Used for storing covers in the game grid/Big Picture UIs.</string>
</property>
<property name="textInteractionFlags">
<set>Qt::TextInteractionFlag::TextBrowserInteraction</set>
</property>
<property name="buddy">
<cstring>covers</cstring>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
</widget>
</item>
</layout>
@@ -251,7 +251,7 @@
<item>
<widget class="QGroupBox" name="videoDumpDirectory">
<property name="title">
<string>Video Dumping Directory</string>
<string>Video Recording Directory</string>
</property>
<layout class="QGridLayout" name="gridLayout_7">
<item row="3" column="2">
@@ -271,6 +271,19 @@
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="videoDumpLabel">
<property name="text">
<string>Used for storing video recordings.</string>
</property>
<property name="textInteractionFlags">
<set>Qt::TextInteractionFlag::TextBrowserInteraction</set>
</property>
<property name="buddy">
<cstring>videoDumpingDirectory</cstring>
</property>
</widget>
</item>
<item row="3" column="3">
<widget class="QPushButton" name="videoDumpingDirectoryReset">
<property name="text">
@@ -278,16 +291,10 @@
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="videoDumpLabel">
<item row="4" column="0">
<widget class="QCheckBox" name="organizeVideoDumpByGame">
<property name="text">
<string>Used for storing video captures.</string>
</property>
<property name="buddy">
<cstring>videoDumpingDirectory</cstring>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
<string>Save Video Recording in Game-Specific Folders</string>
</property>
</widget>
</item>
+2 -1
View File
@@ -830,7 +830,8 @@ struct Pcsx2Config
VideoCaptureAutoResolution : 1,
EnableAudioCapture : 1,
EnableAudioCaptureParameters : 1,
OrganizeSnapshotsByGame : 1;
OrganizeSnapshotsByGame : 1,
OrganizeVideoCaptureByGame : 1;
};
};
+17 -1
View File
@@ -908,7 +908,8 @@ std::string GSGetBaseSnapshotFilename()
// If organize by game is enabled, use or create a game-specific folder.
if (GSConfig.OrganizeSnapshotsByGame)
{
std::string game_name = VMManager::GetTitle(true);
const bool prefer_english = Host::GetBaseBoolSettingValue("UI", "PreferEnglishGameList", false);
std::string game_name = VMManager::GetTitle(prefer_english);
if (!game_name.empty())
{
Path::SanitizeFileName(&game_name);
@@ -925,6 +926,21 @@ std::string GSGetBaseSnapshotFilename()
std::string GSGetBaseVideoFilename()
{
// If organize by game is enabled, use or create a game-specific folder.
if (GSConfig.OrganizeVideoCaptureByGame)
{
const bool prefer_english = Host::GetBaseBoolSettingValue("UI", "PreferEnglishGameList", false);
std::string game_name = VMManager::GetTitle(prefer_english);
if (!game_name.empty())
{
Path::SanitizeFileName(&game_name);
const std::string game_dir = Path::Combine(EmuFolders::Videos, game_name);
// Make sure the per-game directory exists or that we can successfully create it.
if (FileSystem::DirectoryExists(game_dir.c_str()) || FileSystem::CreateDirectoryPath(game_dir.c_str(), false))
return Path::Combine(game_dir, GSGetBaseFilename());
}
}
// prepend video directory
return Path::Combine(EmuFolders::Videos, GSGetBaseFilename());
}
+1
View File
@@ -934,6 +934,7 @@ void Pcsx2Config::GSOptions::LoadSave(SettingsWrapper& wrap)
SettingsWrapIntEnumEx(ScreenshotFormat, "ScreenshotFormat");
SettingsWrapEntry(ScreenshotQuality);
SettingsWrapBitBoolEx(OrganizeSnapshotsByGame, "OrganizeScreenshotsByGame");
SettingsWrapBitBoolEx(OrganizeVideoCaptureByGame, "OrganizeVideoCaptureByGame");
SettingsWrapEntry(StretchY);
SettingsWrapEntryEx(Crop[0], "CropLeft");
SettingsWrapEntryEx(Crop[1], "CropTop");