Merge 0a39fde201cd77aac3d62acd282ddd3ef1cfd7e7 into 26ce7e4f2844a445bf77b4b14977d62e6434df08

This commit is contained in:
Kleidis 2025-03-12 11:52:05 +07:00 committed by GitHub
commit 322e931843
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 68 additions and 22 deletions

View File

@ -677,25 +677,36 @@ void GMainWindow::InitializeRecentFileMenuActions() {
void GMainWindow::InitializeSaveStateMenuActions() { void GMainWindow::InitializeSaveStateMenuActions() {
for (u32 i = 0; i < Core::SaveStateSlotCount; ++i) { for (u32 i = 0; i < Core::SaveStateSlotCount; ++i) {
actions_load_state[i] = new QAction(this); actions_load_state[i] = new QAction(this);
actions_load_state[i]->setData(i + 1); actions_load_state[i]->setData(i);
connect(actions_load_state[i], &QAction::triggered, this, &GMainWindow::OnLoadState); connect(actions_load_state[i], &QAction::triggered, this, &GMainWindow::OnLoadState);
ui->menu_Load_State->addAction(actions_load_state[i]); if (i > 0)
ui->menu_Load_State->addAction(actions_load_state[i]);
actions_save_state[i] = new QAction(this); actions_save_state[i] = new QAction(this);
actions_save_state[i]->setData(i + 1); actions_save_state[i]->setData(i);
connect(actions_save_state[i], &QAction::triggered, this, &GMainWindow::OnSaveState); connect(actions_save_state[i], &QAction::triggered, this, &GMainWindow::OnSaveState);
ui->menu_Save_State->addAction(actions_save_state[i]); if (i > 0)
ui->menu_Save_State->addAction(actions_save_state[i]);
} }
connect(ui->action_Load_from_Newest_Slot, &QAction::triggered, this, [this] { connect(ui->action_Load_from_Newest_Slot, &QAction::triggered, this, [this] {
UpdateSaveStates(); UpdateSaveStates();
if (newest_slot != 0) { if (newest_slot != 0) {
actions_load_state[newest_slot - 1]->trigger(); actions_load_state[newest_slot]->trigger();
} }
}); });
connect(ui->action_Save_to_Oldest_Slot, &QAction::triggered, this, [this] { connect(ui->action_Save_to_Oldest_Slot, &QAction::triggered, this, [this] {
UpdateSaveStates(); UpdateSaveStates();
actions_save_state[oldest_slot - 1]->trigger(); actions_save_state[oldest_slot]->trigger();
});
// Quick save / load uses slot
connect(ui->action_Quick_Save, &QAction::triggered, this, [this] {
UpdateSaveStates();
actions_save_state[0]->trigger();
});
connect(ui->action_Quick_Load, &QAction::triggered, this, [this] {
UpdateSaveStates();
actions_load_state[0]->trigger();
}); });
connect(ui->menu_Load_State->menuAction(), &QAction::hovered, this, connect(ui->menu_Load_State->menuAction(), &QAction::hovered, this,
@ -738,8 +749,12 @@ void GMainWindow::InitializeHotkeys() {
link_action_shortcut(ui->action_Screen_Layout_Upright_Screens, link_action_shortcut(ui->action_Screen_Layout_Upright_Screens,
QStringLiteral("Rotate Screens Upright")); QStringLiteral("Rotate Screens Upright"));
link_action_shortcut(ui->action_Advance_Frame, QStringLiteral("Advance Frame")); link_action_shortcut(ui->action_Advance_Frame, QStringLiteral("Advance Frame"));
link_action_shortcut(ui->action_Load_from_Newest_Slot, QStringLiteral("Load from Newest Slot")); link_action_shortcut(ui->action_Load_from_Newest_Slot,
link_action_shortcut(ui->action_Save_to_Oldest_Slot, QStringLiteral("Save to Oldest Slot")); QStringLiteral("Load from Newest Non-Quick Slot"));
link_action_shortcut(ui->action_Save_to_Oldest_Slot,
QStringLiteral("Save to Oldest Non-Quick Slot"));
link_action_shortcut(ui->action_Quick_Save, QStringLiteral("Quick Save"));
link_action_shortcut(ui->action_Quick_Load, QStringLiteral("Quick Load"));
link_action_shortcut(ui->action_View_Lobby, QStringLiteral("Multiplayer Browse Public Rooms")); link_action_shortcut(ui->action_View_Lobby, QStringLiteral("Multiplayer Browse Public Rooms"));
link_action_shortcut(ui->action_Start_Room, QStringLiteral("Multiplayer Create Room")); link_action_shortcut(ui->action_Start_Room, QStringLiteral("Multiplayer Create Room"));
link_action_shortcut(ui->action_Connect_To_Room, link_action_shortcut(ui->action_Connect_To_Room,
@ -1569,7 +1584,7 @@ void GMainWindow::UpdateSaveStates() {
ui->menu_Save_State->setEnabled(true); ui->menu_Save_State->setEnabled(true);
ui->action_Load_from_Newest_Slot->setEnabled(false); ui->action_Load_from_Newest_Slot->setEnabled(false);
oldest_slot = newest_slot = 0; oldest_slot = newest_slot = 1;
oldest_slot_time = std::numeric_limits<u64>::max(); oldest_slot_time = std::numeric_limits<u64>::max();
newest_slot_time = 0; newest_slot_time = 0;
@ -1580,13 +1595,30 @@ void GMainWindow::UpdateSaveStates() {
auto savestates = Core::ListSaveStates(title_id, movie.GetCurrentMovieID()); auto savestates = Core::ListSaveStates(title_id, movie.GetCurrentMovieID());
for (u32 i = 0; i < Core::SaveStateSlotCount; ++i) { for (u32 i = 0; i < Core::SaveStateSlotCount; ++i) {
actions_load_state[i]->setEnabled(false); actions_load_state[i]->setEnabled(false);
actions_load_state[i]->setText(tr("Slot %1").arg(i + 1)); if (i == 0) {
actions_save_state[i]->setText(tr("Slot %1").arg(i + 1)); actions_load_state[i]->setText(tr("Quick Load"));
actions_save_state[i]->setText(tr("Quick Save"));
} else {
actions_load_state[i]->setText(tr("Slot %1").arg(i));
actions_save_state[i]->setText(tr("Slot %1").arg(i));
}
} }
for (const auto& savestate : savestates) { for (const auto& savestate : savestates) {
const bool display_name = const bool display_name =
savestate.status == Core::SaveStateInfo::ValidationStatus::RevisionDismatch && savestate.status == Core::SaveStateInfo::ValidationStatus::RevisionDismatch &&
!savestate.build_name.empty(); !savestate.build_name.empty();
actions_load_state[savestate.slot]->setEnabled(true);
if (savestate.slot == 0) {
const auto text = tr("%2 %3")
.arg(QDateTime::fromSecsSinceEpoch(savestate.time)
.toString(QStringLiteral("yyyy-MM-dd hh:mm:ss")))
.arg(display_name ? QString::fromStdString(savestate.build_name)
: QLatin1String())
.trimmed();
ui->action_Quick_Save->setText(tr("Quick Save - %1").arg(text).trimmed());
ui->action_Quick_Load->setText(tr("Quick Load - %1").arg(text).trimmed());
continue;
}
const auto text = const auto text =
tr("Slot %1 - %2 %3") tr("Slot %1 - %2 %3")
.arg(savestate.slot) .arg(savestate.slot)
@ -1595,12 +1627,10 @@ void GMainWindow::UpdateSaveStates() {
.arg(display_name ? QString::fromStdString(savestate.build_name) : QLatin1String()) .arg(display_name ? QString::fromStdString(savestate.build_name) : QLatin1String())
.trimmed(); .trimmed();
actions_load_state[savestate.slot - 1]->setEnabled(true); actions_load_state[savestate.slot]->setText(text);
actions_load_state[savestate.slot - 1]->setText(text); actions_save_state[savestate.slot]->setText(text);
actions_save_state[savestate.slot - 1]->setText(text);
ui->action_Load_from_Newest_Slot->setEnabled(true); ui->action_Load_from_Newest_Slot->setEnabled(true);
if (savestate.time > newest_slot_time) { if (savestate.time > newest_slot_time) {
newest_slot = savestate.slot; newest_slot = savestate.slot;
newest_slot_time = savestate.time; newest_slot_time = savestate.time;
@ -1610,7 +1640,8 @@ void GMainWindow::UpdateSaveStates() {
oldest_slot_time = savestate.time; oldest_slot_time = savestate.time;
} }
} }
for (u32 i = 0; i < Core::SaveStateSlotCount; ++i) { // Value as 1 because quicksave slot is not used for this calculation
for (u32 i = 1; i < Core::SaveStateSlotCount; ++i) {
if (!actions_load_state[i]->isEnabled()) { if (!actions_load_state[i]->isEnabled()) {
// Prefer empty slot // Prefer empty slot
oldest_slot = i + 1; oldest_slot = i + 1;

View File

@ -54,7 +54,7 @@ const std::array<std::array<int, 5>, Settings::NativeAnalog::NumAnalogs> QtConfi
// 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, 35> QtConfig::default_hotkeys {{ const std::array<UISettings::Shortcut, 37> QtConfig::default_hotkeys {{
{QStringLiteral("Advance Frame"), QStringLiteral("Main Window"), {QStringLiteral(""), Qt::ApplicationShortcut}}, {QStringLiteral("Advance Frame"), QStringLiteral("Main Window"), {QStringLiteral(""), Qt::ApplicationShortcut}},
{QStringLiteral("Audio Mute/Unmute"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+M"), Qt::WindowShortcut}}, {QStringLiteral("Audio Mute/Unmute"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+M"), Qt::WindowShortcut}},
{QStringLiteral("Audio Volume Down"), QStringLiteral("Main Window"), {QStringLiteral(""), Qt::WindowShortcut}}, {QStringLiteral("Audio Volume Down"), QStringLiteral("Main Window"), {QStringLiteral(""), Qt::WindowShortcut}},
@ -70,16 +70,18 @@ const std::array<UISettings::Shortcut, 35> QtConfig::default_hotkeys {{
{QStringLiteral("Increase Speed Limit"), QStringLiteral("Main Window"), {QStringLiteral("+"), Qt::ApplicationShortcut}}, {QStringLiteral("Increase Speed Limit"), QStringLiteral("Main Window"), {QStringLiteral("+"), Qt::ApplicationShortcut}},
{QStringLiteral("Load Amiibo"), QStringLiteral("Main Window"), {QStringLiteral("F2"), Qt::WidgetWithChildrenShortcut}}, {QStringLiteral("Load Amiibo"), QStringLiteral("Main Window"), {QStringLiteral("F2"), Qt::WidgetWithChildrenShortcut}},
{QStringLiteral("Load File"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+O"), Qt::WidgetWithChildrenShortcut}}, {QStringLiteral("Load File"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+O"), Qt::WidgetWithChildrenShortcut}},
{QStringLiteral("Load from Newest Slot"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+V"), Qt::WindowShortcut}}, {QStringLiteral("Load from Newest Non-Quick Slot"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+V"), Qt::WindowShortcut}},
{QStringLiteral("Multiplayer Browse Public Lobby"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+B"), Qt::ApplicationShortcut}}, {QStringLiteral("Multiplayer Browse Public Game Lobby"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+B"), Qt::ApplicationShortcut}},
{QStringLiteral("Multiplayer Create Room"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+N"), Qt::ApplicationShortcut}}, {QStringLiteral("Multiplayer Create Room"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+N"), Qt::ApplicationShortcut}},
{QStringLiteral("Multiplayer Direct Connect to Room"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+Shift"), Qt::ApplicationShortcut}}, {QStringLiteral("Multiplayer Direct Connect to Room"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+Shift"), Qt::ApplicationShortcut}},
{QStringLiteral("Multiplayer Leave Room"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+L"), Qt::ApplicationShortcut}}, {QStringLiteral("Multiplayer Leave Room"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+L"), Qt::ApplicationShortcut}},
{QStringLiteral("Multiplayer Show Current Room"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+R"), Qt::ApplicationShortcut}}, {QStringLiteral("Multiplayer Show Current Room"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+R"), Qt::ApplicationShortcut}},
{QStringLiteral("Quick Save"), QStringLiteral("Main Window"), {QStringLiteral(""), Qt::WindowShortcut}},
{QStringLiteral("Quick Load"), QStringLiteral("Main Window"), {QStringLiteral(""), Qt::WindowShortcut}},
{QStringLiteral("Remove Amiibo"), QStringLiteral("Main Window"), {QStringLiteral("F3"), Qt::ApplicationShortcut}}, {QStringLiteral("Remove Amiibo"), QStringLiteral("Main Window"), {QStringLiteral("F3"), Qt::ApplicationShortcut}},
{QStringLiteral("Restart Emulation"), QStringLiteral("Main Window"), {QStringLiteral("F6"), Qt::WindowShortcut}}, {QStringLiteral("Restart Emulation"), QStringLiteral("Main Window"), {QStringLiteral("F6"), Qt::WindowShortcut}},
{QStringLiteral("Rotate Screens Upright"), QStringLiteral("Main Window"), {QStringLiteral("F8"), Qt::WindowShortcut}}, {QStringLiteral("Rotate Screens Upright"), QStringLiteral("Main Window"), {QStringLiteral("F8"), Qt::WindowShortcut}},
{QStringLiteral("Save to Oldest Slot"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+C"), Qt::WindowShortcut}}, {QStringLiteral("Save to Oldest Non-Quick Slot"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+C"), Qt::WindowShortcut}},
{QStringLiteral("Stop Emulation"), QStringLiteral("Main Window"), {QStringLiteral("F5"), Qt::WindowShortcut}}, {QStringLiteral("Stop Emulation"), QStringLiteral("Main Window"), {QStringLiteral("F5"), Qt::WindowShortcut}},
{QStringLiteral("Swap Screens"), QStringLiteral("Main Window"), {QStringLiteral("F9"), Qt::WindowShortcut}}, {QStringLiteral("Swap Screens"), QStringLiteral("Main Window"), {QStringLiteral("F9"), Qt::WindowShortcut}},
{QStringLiteral("Toggle 3D"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+3"), Qt::ApplicationShortcut}}, {QStringLiteral("Toggle 3D"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+3"), Qt::ApplicationShortcut}},

View File

@ -26,7 +26,7 @@ public:
static const std::array<int, Settings::NativeButton::NumButtons> default_buttons; static const std::array<int, Settings::NativeButton::NumButtons> default_buttons;
static const std::array<std::array<int, 5>, Settings::NativeAnalog::NumAnalogs> default_analogs; static const std::array<std::array<int, 5>, Settings::NativeAnalog::NumAnalogs> default_analogs;
static const std::array<UISettings::Shortcut, 35> default_hotkeys; static const std::array<UISettings::Shortcut, 37> default_hotkeys;
private: private:
void Initialize(const std::string& config_name); void Initialize(const std::string& config_name);

View File

@ -100,6 +100,7 @@
<string>Save State</string> <string>Save State</string>
</property> </property>
<addaction name="action_Save_to_Oldest_Slot"/> <addaction name="action_Save_to_Oldest_Slot"/>
<addaction name="action_Quick_Save"/>
<addaction name="separator"/> <addaction name="separator"/>
</widget> </widget>
<widget class="QMenu" name="menu_Load_State"> <widget class="QMenu" name="menu_Load_State">
@ -107,6 +108,8 @@
<string>Load State</string> <string>Load State</string>
</property> </property>
<addaction name="action_Load_from_Newest_Slot"/> <addaction name="action_Load_from_Newest_Slot"/>
<addaction name="action_Quick_Load"/>
<addaction name="separator"/> <addaction name="separator"/>
</widget> </widget>
<addaction name="action_Pause"/> <addaction name="action_Pause"/>
@ -343,11 +346,21 @@
<string>Save to Oldest Slot</string> <string>Save to Oldest Slot</string>
</property> </property>
</action> </action>
<action name="action_Quick_Save">
<property name="text">
<string>Quick Save</string>
</property>
</action>
<action name="action_Load_from_Newest_Slot"> <action name="action_Load_from_Newest_Slot">
<property name="text"> <property name="text">
<string>Load from Newest Slot</string> <string>Load from Newest Slot</string>
</property> </property>
</action> </action>
<action name="action_Quick_Load">
<property name="text">
<string>Quick Load</string>
</property>
</action>
<action name="action_Configure"> <action name="action_Configure">
<property name="text"> <property name="text">
<string>Configure...</string> <string>Configure...</string>