settings: File selector & other settings
First of all, TASing requires a script to play back. The user can select the parent directory at `System -> Filesystem`, next to an option to pause TAS during loads: This requires a "hacky" setup deeper in the code and will be added in the last commit. Also, Hotkeys are being introduced: CTRL+F5 for playback start/stop, CTRL+F6 for re-reading the script and CTRL+F7 for recording a new script.
This commit is contained in:
		| @@ -116,6 +116,8 @@ private: | |||||||
|         GenerateYuzuPath(YuzuPath::ScreenshotsDir, yuzu_path / SCREENSHOTS_DIR); |         GenerateYuzuPath(YuzuPath::ScreenshotsDir, yuzu_path / SCREENSHOTS_DIR); | ||||||
|         GenerateYuzuPath(YuzuPath::SDMCDir, yuzu_path / SDMC_DIR); |         GenerateYuzuPath(YuzuPath::SDMCDir, yuzu_path / SDMC_DIR); | ||||||
|         GenerateYuzuPath(YuzuPath::ShaderDir, yuzu_path / SHADER_DIR); |         GenerateYuzuPath(YuzuPath::ShaderDir, yuzu_path / SHADER_DIR); | ||||||
|  |  | ||||||
|  |         GenerateYuzuPath(YuzuPath::TASFile, fs::path{""}); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     ~PathManagerImpl() = default; |     ~PathManagerImpl() = default; | ||||||
|   | |||||||
| @@ -23,6 +23,8 @@ enum class YuzuPath { | |||||||
|     ScreenshotsDir, // Where yuzu screenshots are stored. |     ScreenshotsDir, // Where yuzu screenshots are stored. | ||||||
|     SDMCDir,        // Where the emulated SDMC is stored. |     SDMCDir,        // Where the emulated SDMC is stored. | ||||||
|     ShaderDir,      // Where shaders are stored. |     ShaderDir,      // Where shaders are stored. | ||||||
|  |  | ||||||
|  |     TASFile, // Where the current script file is stored. | ||||||
| }; | }; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|   | |||||||
| @@ -550,6 +550,9 @@ struct Values { | |||||||
|     BasicSetting<bool> gamecard_current_game{false, "gamecard_current_game"}; |     BasicSetting<bool> gamecard_current_game{false, "gamecard_current_game"}; | ||||||
|     BasicSetting<std::string> gamecard_path{std::string(), "gamecard_path"}; |     BasicSetting<std::string> gamecard_path{std::string(), "gamecard_path"}; | ||||||
|  |  | ||||||
|  |     // TAS | ||||||
|  |     bool pauseTasOnLoad; | ||||||
|  |  | ||||||
|     // Debugging |     // Debugging | ||||||
|     bool record_frame_times; |     bool record_frame_times; | ||||||
|     BasicSetting<bool> use_gdbstub{false, "use_gdbstub"}; |     BasicSetting<bool> use_gdbstub{false, "use_gdbstub"}; | ||||||
|   | |||||||
| @@ -221,7 +221,7 @@ const std::array<int, Settings::NativeKeyboard::NumKeyboardMods> Config::default | |||||||
| // This must be in alphabetical order according to action name as it must have the same order as | // This must be in alphabetical order according to action name as it must have the same order as | ||||||
| // UISetting::values.shortcuts, which is alphabetically ordered. | // UISetting::values.shortcuts, which is alphabetically ordered. | ||||||
| // clang-format off | // clang-format off | ||||||
| const std::array<UISettings::Shortcut, 18> Config::default_hotkeys{{ | const std::array<UISettings::Shortcut, 21> Config::default_hotkeys{{ | ||||||
|     {QStringLiteral("Capture Screenshot"),       QStringLiteral("Main Window"), {QStringLiteral("Ctrl+P"), Qt::WidgetWithChildrenShortcut}}, |     {QStringLiteral("Capture Screenshot"),       QStringLiteral("Main Window"), {QStringLiteral("Ctrl+P"), Qt::WidgetWithChildrenShortcut}}, | ||||||
|     {QStringLiteral("Change Docked Mode"),       QStringLiteral("Main Window"), {QStringLiteral("F10"), Qt::ApplicationShortcut}}, |     {QStringLiteral("Change Docked Mode"),       QStringLiteral("Main Window"), {QStringLiteral("F10"), Qt::ApplicationShortcut}}, | ||||||
|     {QStringLiteral("Continue/Pause Emulation"), QStringLiteral("Main Window"), {QStringLiteral("F4"), Qt::WindowShortcut}}, |     {QStringLiteral("Continue/Pause Emulation"), QStringLiteral("Main Window"), {QStringLiteral("F4"), Qt::WindowShortcut}}, | ||||||
| @@ -235,6 +235,9 @@ const std::array<UISettings::Shortcut, 18> Config::default_hotkeys{{ | |||||||
|     {QStringLiteral("Mute Audio"),               QStringLiteral("Main Window"), {QStringLiteral("Ctrl+M"), Qt::WindowShortcut}}, |     {QStringLiteral("Mute Audio"),               QStringLiteral("Main Window"), {QStringLiteral("Ctrl+M"), Qt::WindowShortcut}}, | ||||||
|     {QStringLiteral("Restart Emulation"),        QStringLiteral("Main Window"), {QStringLiteral("F6"), Qt::WindowShortcut}}, |     {QStringLiteral("Restart Emulation"),        QStringLiteral("Main Window"), {QStringLiteral("F6"), Qt::WindowShortcut}}, | ||||||
|     {QStringLiteral("Stop Emulation"),           QStringLiteral("Main Window"), {QStringLiteral("F5"), Qt::WindowShortcut}}, |     {QStringLiteral("Stop Emulation"),           QStringLiteral("Main Window"), {QStringLiteral("F5"), Qt::WindowShortcut}}, | ||||||
|  |     {QStringLiteral("TAS Start/Stop"),           QStringLiteral("Main Window"), {QStringLiteral("Ctrl+F5"), Qt::ApplicationShortcut}}, | ||||||
|  |     {QStringLiteral("TAS Reset"),                QStringLiteral("Main Window"), {QStringLiteral("Ctrl+F6"), Qt::ApplicationShortcut}}, | ||||||
|  |     {QStringLiteral("TAS Record"),               QStringLiteral("Main Window"), {QStringLiteral("Ctrl+F7"), Qt::ApplicationShortcut}}, | ||||||
|     {QStringLiteral("Toggle Filter Bar"),        QStringLiteral("Main Window"), {QStringLiteral("Ctrl+F"), Qt::WindowShortcut}}, |     {QStringLiteral("Toggle Filter Bar"),        QStringLiteral("Main Window"), {QStringLiteral("Ctrl+F"), Qt::WindowShortcut}}, | ||||||
|     {QStringLiteral("Toggle Framerate Limit"),   QStringLiteral("Main Window"), {QStringLiteral("Ctrl+U"), Qt::ApplicationShortcut}}, |     {QStringLiteral("Toggle Framerate Limit"),   QStringLiteral("Main Window"), {QStringLiteral("Ctrl+U"), Qt::ApplicationShortcut}}, | ||||||
|     {QStringLiteral("Toggle Mouse Panning"),     QStringLiteral("Main Window"), {QStringLiteral("Ctrl+F9"), Qt::ApplicationShortcut}}, |     {QStringLiteral("Toggle Mouse Panning"),     QStringLiteral("Main Window"), {QStringLiteral("Ctrl+F9"), Qt::ApplicationShortcut}}, | ||||||
| @@ -564,6 +567,9 @@ void Config::ReadControlValues() { | |||||||
|     Settings::values.mouse_panning = false; |     Settings::values.mouse_panning = false; | ||||||
|     ReadBasicSetting(Settings::values.mouse_panning_sensitivity); |     ReadBasicSetting(Settings::values.mouse_panning_sensitivity); | ||||||
|  |  | ||||||
|  |     ReadBasicSetting(Settings::values.tas_enable = false); | ||||||
|  |     ReadBasicSetting(Settings::values.tas_reset = false); | ||||||
|  |  | ||||||
|     ReadGlobalSetting(Settings::values.use_docked_mode); |     ReadGlobalSetting(Settings::values.use_docked_mode); | ||||||
|  |  | ||||||
|     // Disable docked mode if handheld is selected |     // Disable docked mode if handheld is selected | ||||||
| @@ -661,10 +667,21 @@ void Config::ReadDataStorageValues() { | |||||||
|                     QString::fromStdString(FS::GetYuzuPathString(FS::YuzuPath::DumpDir))) |                     QString::fromStdString(FS::GetYuzuPathString(FS::YuzuPath::DumpDir))) | ||||||
|             .toString() |             .toString() | ||||||
|             .toStdString()); |             .toStdString()); | ||||||
|  |     FS::SetYuzuPath( | ||||||
|  |         FS::YuzuPath::TASFile, | ||||||
|  |         qt_config | ||||||
|  |         ->value(QStringLiteral("tas_path"), | ||||||
|  |             QString::fromStdString(FS::GetYuzuPathString(FS::YuzuPath::TASFile))) | ||||||
|  |         .toString() | ||||||
|  |         .toStdString()); | ||||||
|  |  | ||||||
|  |     ReadBasicSetting(Settings::values.pauseTasOnLoad); | ||||||
|  |  | ||||||
|     ReadBasicSetting(Settings::values.gamecard_inserted); |     ReadBasicSetting(Settings::values.gamecard_inserted); | ||||||
|     ReadBasicSetting(Settings::values.gamecard_current_game); |     ReadBasicSetting(Settings::values.gamecard_current_game); | ||||||
|     ReadBasicSetting(Settings::values.gamecard_path); |     ReadBasicSetting(Settings::values.gamecard_path); | ||||||
|    |    | ||||||
|  |  | ||||||
|     qt_config->endGroup(); |     qt_config->endGroup(); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -1215,6 +1232,11 @@ void Config::SaveDataStorageValues() { | |||||||
|     WriteSetting(QStringLiteral("dump_directory"), |     WriteSetting(QStringLiteral("dump_directory"), | ||||||
|                  QString::fromStdString(FS::GetYuzuPathString(FS::YuzuPath::DumpDir)), |                  QString::fromStdString(FS::GetYuzuPathString(FS::YuzuPath::DumpDir)), | ||||||
|                  QString::fromStdString(FS::GetYuzuPathString(FS::YuzuPath::DumpDir))); |                  QString::fromStdString(FS::GetYuzuPathString(FS::YuzuPath::DumpDir))); | ||||||
|  |     WriteSetting(QStringLiteral("tas_path"), | ||||||
|  |         QString::fromStdString(FS::GetYuzuPathString(FS::YuzuPath::TASFile)), | ||||||
|  |         QString::fromStdString(FS::GetYuzuPathString(FS::YuzuPath::TASFile))); | ||||||
|  |     WriteSetting(QStringLiteral("tas_pause_on_load"), Settings::values.pauseTasOnLoad, true); | ||||||
|  |  | ||||||
|     WriteBasicSetting(Settings::values.gamecard_inserted); |     WriteBasicSetting(Settings::values.gamecard_inserted); | ||||||
|     WriteBasicSetting(Settings::values.gamecard_current_game); |     WriteBasicSetting(Settings::values.gamecard_current_game); | ||||||
|     WriteBasicSetting(Settings::values.gamecard_path); |     WriteBasicSetting(Settings::values.gamecard_path); | ||||||
|   | |||||||
| @@ -42,7 +42,7 @@ public: | |||||||
|         default_mouse_buttons; |         default_mouse_buttons; | ||||||
|     static const std::array<int, Settings::NativeKeyboard::NumKeyboardKeys> default_keyboard_keys; |     static const std::array<int, Settings::NativeKeyboard::NumKeyboardKeys> default_keyboard_keys; | ||||||
|     static const std::array<int, Settings::NativeKeyboard::NumKeyboardMods> default_keyboard_mods; |     static const std::array<int, Settings::NativeKeyboard::NumKeyboardMods> default_keyboard_mods; | ||||||
|     static const std::array<UISettings::Shortcut, 18> default_hotkeys; |     static const std::array<UISettings::Shortcut, 21> default_hotkeys; | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     void Initialize(const std::string& config_name); |     void Initialize(const std::string& config_name); | ||||||
|   | |||||||
| @@ -26,6 +26,8 @@ ConfigureFilesystem::ConfigureFilesystem(QWidget* parent) | |||||||
|             [this] { SetDirectory(DirectoryTarget::Dump, ui->dump_path_edit); }); |             [this] { SetDirectory(DirectoryTarget::Dump, ui->dump_path_edit); }); | ||||||
|     connect(ui->load_path_button, &QToolButton::pressed, this, |     connect(ui->load_path_button, &QToolButton::pressed, this, | ||||||
|             [this] { SetDirectory(DirectoryTarget::Load, ui->load_path_edit); }); |             [this] { SetDirectory(DirectoryTarget::Load, ui->load_path_edit); }); | ||||||
|  |     connect(ui->tas_path_button, &QToolButton::pressed, this, | ||||||
|  |             [this] { SetDirectory(DirectoryTarget::TAS, ui->tas_path_edit); }); | ||||||
|  |  | ||||||
|     connect(ui->reset_game_list_cache, &QPushButton::pressed, this, |     connect(ui->reset_game_list_cache, &QPushButton::pressed, this, | ||||||
|             &ConfigureFilesystem::ResetMetadata); |             &ConfigureFilesystem::ResetMetadata); | ||||||
| @@ -49,9 +51,12 @@ void ConfigureFilesystem::setConfiguration() { | |||||||
|         QString::fromStdString(Common::FS::GetYuzuPathString(Common::FS::YuzuPath::DumpDir))); |         QString::fromStdString(Common::FS::GetYuzuPathString(Common::FS::YuzuPath::DumpDir))); | ||||||
|     ui->load_path_edit->setText( |     ui->load_path_edit->setText( | ||||||
|         QString::fromStdString(Common::FS::GetYuzuPathString(Common::FS::YuzuPath::LoadDir))); |         QString::fromStdString(Common::FS::GetYuzuPathString(Common::FS::YuzuPath::LoadDir))); | ||||||
|  |     ui->tas_path_edit->setText( | ||||||
|  |         QString::fromStdString(Common::FS::GetYuzuPathString(Common::FS::YuzuPath::TASFile))); | ||||||
|  |  | ||||||
|     ui->gamecard_inserted->setChecked(Settings::values.gamecard_inserted.GetValue()); |     ui->gamecard_inserted->setChecked(Settings::values.gamecard_inserted.GetValue()); | ||||||
|     ui->gamecard_current_game->setChecked(Settings::values.gamecard_current_game.GetValue()); |     ui->gamecard_current_game->setChecked(Settings::values.gamecard_current_game.GetValue()); | ||||||
|  |     ui->tas_pause_on_load->setChecked(Settings::values.pauseTasOnLoad); | ||||||
|     ui->dump_exefs->setChecked(Settings::values.dump_exefs.GetValue()); |     ui->dump_exefs->setChecked(Settings::values.dump_exefs.GetValue()); | ||||||
|     ui->dump_nso->setChecked(Settings::values.dump_nso.GetValue()); |     ui->dump_nso->setChecked(Settings::values.dump_nso.GetValue()); | ||||||
|  |  | ||||||
| @@ -69,9 +74,11 @@ void ConfigureFilesystem::applyConfiguration() { | |||||||
|                             ui->dump_path_edit->text().toStdString()); |                             ui->dump_path_edit->text().toStdString()); | ||||||
|     Common::FS::SetYuzuPath(Common::FS::YuzuPath::LoadDir, |     Common::FS::SetYuzuPath(Common::FS::YuzuPath::LoadDir, | ||||||
|                             ui->load_path_edit->text().toStdString()); |                             ui->load_path_edit->text().toStdString()); | ||||||
|  |     Common::FS::SetYuzuPath(Common::FS::YuzuPath::TASFile, ui->tas_path_edit->text().toStdString()); | ||||||
|  |  | ||||||
|     Settings::values.gamecard_inserted = ui->gamecard_inserted->isChecked(); |     Settings::values.gamecard_inserted = ui->gamecard_inserted->isChecked(); | ||||||
|     Settings::values.gamecard_current_game = ui->gamecard_current_game->isChecked(); |     Settings::values.gamecard_current_game = ui->gamecard_current_game->isChecked(); | ||||||
|  |     Settings::values.pauseTasOnLoad = ui->tas_pause_on_load->isChecked(); | ||||||
|     Settings::values.dump_exefs = ui->dump_exefs->isChecked(); |     Settings::values.dump_exefs = ui->dump_exefs->isChecked(); | ||||||
|     Settings::values.dump_nso = ui->dump_nso->isChecked(); |     Settings::values.dump_nso = ui->dump_nso->isChecked(); | ||||||
|  |  | ||||||
| @@ -97,6 +104,9 @@ void ConfigureFilesystem::SetDirectory(DirectoryTarget target, QLineEdit* edit) | |||||||
|     case DirectoryTarget::Load: |     case DirectoryTarget::Load: | ||||||
|         caption = tr("Select Mod Load Directory..."); |         caption = tr("Select Mod Load Directory..."); | ||||||
|         break; |         break; | ||||||
|  |     case DirectoryTarget::TAS: | ||||||
|  |         caption = tr("Select TAS Directory..."); | ||||||
|  |         break; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     QString str; |     QString str; | ||||||
|   | |||||||
| @@ -32,6 +32,7 @@ private: | |||||||
|         Gamecard, |         Gamecard, | ||||||
|         Dump, |         Dump, | ||||||
|         Load, |         Load, | ||||||
|  |         TAS, | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     void SetDirectory(DirectoryTarget target, QLineEdit* edit); |     void SetDirectory(DirectoryTarget target, QLineEdit* edit); | ||||||
|   | |||||||
| @@ -219,6 +219,55 @@ | |||||||
|        </layout> |        </layout> | ||||||
|       </widget> |       </widget> | ||||||
|      </item> |      </item> | ||||||
|  |       <item> | ||||||
|  |         <widget class="QGroupBox" name="groupBox"> | ||||||
|  |           <property name="title"> | ||||||
|  |             <string>TAS Directories</string> | ||||||
|  |           </property> | ||||||
|  |           <layout class="QGridLayout" name="gridLayout"> | ||||||
|  |             <item row="0" column="0"> | ||||||
|  |               <widget class="QLabel" name="label"> | ||||||
|  |                 <property name="text"> | ||||||
|  |                   <string>Path</string> | ||||||
|  |                 </property> | ||||||
|  |               </widget> | ||||||
|  |             </item> | ||||||
|  |             <item row="0" column="3"> | ||||||
|  |               <widget class="QToolButton" name="tas_path_button"> | ||||||
|  |                 <property name="text"> | ||||||
|  |                   <string>...</string> | ||||||
|  |                 </property> | ||||||
|  |               </widget> | ||||||
|  |             </item> | ||||||
|  |             <item row="0" column="2"> | ||||||
|  |               <widget class="QLineEdit" name="tas_path_edit"/> | ||||||
|  |             </item> | ||||||
|  |             <item row="0" column="1"> | ||||||
|  |               <spacer name="horizontalSpacer"> | ||||||
|  |                 <property name="orientation"> | ||||||
|  |                   <enum>Qt::Horizontal</enum> | ||||||
|  |                 </property> | ||||||
|  |                 <property name="sizeType"> | ||||||
|  |                   <enum>QSizePolicy::Maximum</enum> | ||||||
|  |                 </property> | ||||||
|  |                 <property name="sizeHint" stdset="0"> | ||||||
|  |                   <size> | ||||||
|  |                     <width>60</width> | ||||||
|  |                     <height>20</height> | ||||||
|  |                   </size> | ||||||
|  |                 </property> | ||||||
|  |               </spacer> | ||||||
|  |             </item> | ||||||
|  |             <item row="1" column="0" colspan="4"> | ||||||
|  |               <widget class="QCheckBox" name="tas_pause_on_load"> | ||||||
|  |                 <property name="text"> | ||||||
|  |                   <string>Pause TAS execution during loads (SMO - 1.3)</string> | ||||||
|  |                 </property> | ||||||
|  |               </widget> | ||||||
|  |             </item> | ||||||
|  |           </layout> | ||||||
|  |         </widget> | ||||||
|  |       </item> | ||||||
|     </layout> |     </layout> | ||||||
|    </item> |    </item> | ||||||
|    <item> |    <item> | ||||||
|   | |||||||
| @@ -1015,6 +1015,19 @@ void GMainWindow::InitializeHotkeys() { | |||||||
|                     render_window->setAttribute(Qt::WA_Hover, true); |                     render_window->setAttribute(Qt::WA_Hover, true); | ||||||
|                 } |                 } | ||||||
|             }); |             }); | ||||||
|  |     connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("TAS Start/Stop"), this), | ||||||
|  |             &QShortcut::activated, this, [&] { | ||||||
|  |                 Settings::values.tas_enable = !Settings::values.tas_enable; | ||||||
|  |                 LOG_INFO(Frontend, "Tas enabled {}", Settings::values.tas_enable); | ||||||
|  |             }); | ||||||
|  |  | ||||||
|  |     connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("TAS Reset"), this), | ||||||
|  |             &QShortcut::activated, this, [&] { Settings::values.tas_reset = true; }); | ||||||
|  |     connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("TAS Record"), this), | ||||||
|  |             &QShortcut::activated, this, [&] { | ||||||
|  |                 Settings::values.tas_record = !Settings::values.tas_record; | ||||||
|  |                 LOG_INFO(Frontend, "Tas recording {}", Settings::values.tas_record); | ||||||
|  |             }); | ||||||
| } | } | ||||||
|  |  | ||||||
| void GMainWindow::SetDefaultUIGeometry() { | void GMainWindow::SetDefaultUIGeometry() { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user