|
|
|
@ -83,6 +83,7 @@
|
|
|
|
|
#include "core/savestate.h"
|
|
|
|
|
#include "core/settings.h"
|
|
|
|
|
#include "game_list_p.h"
|
|
|
|
|
#include "ui_main.h"
|
|
|
|
|
#include "video_core/renderer_base.h"
|
|
|
|
|
#include "video_core/video_core.h"
|
|
|
|
|
|
|
|
|
@ -147,7 +148,9 @@ static void InitializeLogging() {
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
GMainWindow::GMainWindow() : config(new Config()), emu_thread(nullptr) {
|
|
|
|
|
GMainWindow::GMainWindow()
|
|
|
|
|
: config(std::make_unique<Config>()), emu_thread(nullptr),
|
|
|
|
|
ui(std::make_unique<Ui::MainWindow>()) {
|
|
|
|
|
InitializeLogging();
|
|
|
|
|
Debugger::ToggleConsole();
|
|
|
|
|
Settings::LogSettings();
|
|
|
|
@ -160,7 +163,7 @@ GMainWindow::GMainWindow() : config(new Config()), emu_thread(nullptr) {
|
|
|
|
|
|
|
|
|
|
Pica::g_debug_context = Pica::DebugContext::Construct();
|
|
|
|
|
setAcceptDrops(true);
|
|
|
|
|
ui.setupUi(this);
|
|
|
|
|
ui->setupUi(this);
|
|
|
|
|
statusBar()->hide();
|
|
|
|
|
|
|
|
|
|
default_theme_paths = QIcon::themeSearchPaths();
|
|
|
|
@ -201,12 +204,12 @@ GMainWindow::GMainWindow() : config(new Config()), emu_thread(nullptr) {
|
|
|
|
|
ShowTelemetryCallout();
|
|
|
|
|
|
|
|
|
|
// make sure menubar has the arrow cursor instead of inheriting from this
|
|
|
|
|
ui.menubar->setCursor(QCursor());
|
|
|
|
|
ui->menubar->setCursor(QCursor());
|
|
|
|
|
statusBar()->setCursor(QCursor());
|
|
|
|
|
|
|
|
|
|
mouse_hide_timer.setInterval(default_mouse_timeout);
|
|
|
|
|
connect(&mouse_hide_timer, &QTimer::timeout, this, &GMainWindow::HideMouseCursor);
|
|
|
|
|
connect(ui.menubar, &QMenuBar::hovered, this, &GMainWindow::ShowMouseCursor);
|
|
|
|
|
connect(ui->menubar, &QMenuBar::hovered, this, &GMainWindow::ShowMouseCursor);
|
|
|
|
|
|
|
|
|
|
if (UISettings::values.check_for_update_on_start) {
|
|
|
|
|
CheckForUpdates();
|
|
|
|
@ -229,21 +232,21 @@ GMainWindow::~GMainWindow() {
|
|
|
|
|
|
|
|
|
|
void GMainWindow::InitializeWidgets() {
|
|
|
|
|
#ifdef CITRA_ENABLE_COMPATIBILITY_REPORTING
|
|
|
|
|
ui.action_Report_Compatibility->setVisible(true);
|
|
|
|
|
ui->action_Report_Compatibility->setVisible(true);
|
|
|
|
|
#endif
|
|
|
|
|
render_window = new GRenderWindow(this, emu_thread.get());
|
|
|
|
|
render_window->hide();
|
|
|
|
|
|
|
|
|
|
game_list = new GameList(this);
|
|
|
|
|
ui.horizontalLayout->addWidget(game_list);
|
|
|
|
|
ui->horizontalLayout->addWidget(game_list);
|
|
|
|
|
|
|
|
|
|
game_list_placeholder = new GameListPlaceholder(this);
|
|
|
|
|
ui.horizontalLayout->addWidget(game_list_placeholder);
|
|
|
|
|
ui->horizontalLayout->addWidget(game_list_placeholder);
|
|
|
|
|
game_list_placeholder->setVisible(false);
|
|
|
|
|
|
|
|
|
|
loading_screen = new LoadingScreen(this);
|
|
|
|
|
loading_screen->hide();
|
|
|
|
|
ui.horizontalLayout->addWidget(loading_screen);
|
|
|
|
|
ui->horizontalLayout->addWidget(loading_screen);
|
|
|
|
|
connect(loading_screen, &LoadingScreen::Hidden, [&] {
|
|
|
|
|
loading_screen->Clear();
|
|
|
|
|
if (emulation_running) {
|
|
|
|
@ -252,8 +255,8 @@ void GMainWindow::InitializeWidgets() {
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
multiplayer_state = new MultiplayerState(this, game_list->GetModel(), ui.action_Leave_Room,
|
|
|
|
|
ui.action_Show_Room);
|
|
|
|
|
multiplayer_state = new MultiplayerState(this, game_list->GetModel(), ui->action_Leave_Room,
|
|
|
|
|
ui->action_Show_Room);
|
|
|
|
|
multiplayer_state->setVisible(false);
|
|
|
|
|
|
|
|
|
|
// Setup updater
|
|
|
|
@ -298,17 +301,17 @@ void GMainWindow::InitializeWidgets() {
|
|
|
|
|
setStyleSheet(QStringLiteral("QStatusBar::item{border: none;}"));
|
|
|
|
|
|
|
|
|
|
QActionGroup* actionGroup_ScreenLayouts = new QActionGroup(this);
|
|
|
|
|
actionGroup_ScreenLayouts->addAction(ui.action_Screen_Layout_Default);
|
|
|
|
|
actionGroup_ScreenLayouts->addAction(ui.action_Screen_Layout_Single_Screen);
|
|
|
|
|
actionGroup_ScreenLayouts->addAction(ui.action_Screen_Layout_Large_Screen);
|
|
|
|
|
actionGroup_ScreenLayouts->addAction(ui.action_Screen_Layout_Side_by_Side);
|
|
|
|
|
actionGroup_ScreenLayouts->addAction(ui->action_Screen_Layout_Default);
|
|
|
|
|
actionGroup_ScreenLayouts->addAction(ui->action_Screen_Layout_Single_Screen);
|
|
|
|
|
actionGroup_ScreenLayouts->addAction(ui->action_Screen_Layout_Large_Screen);
|
|
|
|
|
actionGroup_ScreenLayouts->addAction(ui->action_Screen_Layout_Side_by_Side);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GMainWindow::InitializeDebugWidgets() {
|
|
|
|
|
connect(ui.action_Create_Pica_Surface_Viewer, &QAction::triggered, this,
|
|
|
|
|
connect(ui->action_Create_Pica_Surface_Viewer, &QAction::triggered, this,
|
|
|
|
|
&GMainWindow::OnCreateGraphicsSurfaceViewer);
|
|
|
|
|
|
|
|
|
|
QMenu* debug_menu = ui.menu_View_Debugging;
|
|
|
|
|
QMenu* debug_menu = ui->menu_View_Debugging;
|
|
|
|
|
|
|
|
|
|
#if MICROPROFILE_ENABLED
|
|
|
|
|
microProfileDialog = new MicroProfileDialog(this);
|
|
|
|
@ -386,16 +389,16 @@ void GMainWindow::InitializeRecentFileMenuActions() {
|
|
|
|
|
actions_recent_files[i]->setVisible(false);
|
|
|
|
|
connect(actions_recent_files[i], &QAction::triggered, this, &GMainWindow::OnMenuRecentFile);
|
|
|
|
|
|
|
|
|
|
ui.menu_recent_files->addAction(actions_recent_files[i]);
|
|
|
|
|
ui->menu_recent_files->addAction(actions_recent_files[i]);
|
|
|
|
|
}
|
|
|
|
|
ui.menu_recent_files->addSeparator();
|
|
|
|
|
ui->menu_recent_files->addSeparator();
|
|
|
|
|
QAction* action_clear_recent_files = new QAction(this);
|
|
|
|
|
action_clear_recent_files->setText(tr("Clear Recent Files"));
|
|
|
|
|
connect(action_clear_recent_files, &QAction::triggered, this, [this] {
|
|
|
|
|
UISettings::values.recent_files.clear();
|
|
|
|
|
UpdateRecentFiles();
|
|
|
|
|
});
|
|
|
|
|
ui.menu_recent_files->addAction(action_clear_recent_files);
|
|
|
|
|
ui->menu_recent_files->addAction(action_clear_recent_files);
|
|
|
|
|
|
|
|
|
|
UpdateRecentFiles();
|
|
|
|
|
}
|
|
|
|
@ -405,28 +408,28 @@ void GMainWindow::InitializeSaveStateMenuActions() {
|
|
|
|
|
actions_load_state[i] = new QAction(this);
|
|
|
|
|
actions_load_state[i]->setData(i + 1);
|
|
|
|
|
connect(actions_load_state[i], &QAction::triggered, this, &GMainWindow::OnLoadState);
|
|
|
|
|
ui.menu_Load_State->addAction(actions_load_state[i]);
|
|
|
|
|
ui->menu_Load_State->addAction(actions_load_state[i]);
|
|
|
|
|
|
|
|
|
|
actions_save_state[i] = new QAction(this);
|
|
|
|
|
actions_save_state[i]->setData(i + 1);
|
|
|
|
|
connect(actions_save_state[i], &QAction::triggered, this, &GMainWindow::OnSaveState);
|
|
|
|
|
ui.menu_Save_State->addAction(actions_save_state[i]);
|
|
|
|
|
ui->menu_Save_State->addAction(actions_save_state[i]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
connect(ui.action_Load_from_Newest_Slot, &QAction::triggered, [this] {
|
|
|
|
|
connect(ui->action_Load_from_Newest_Slot, &QAction::triggered, [this] {
|
|
|
|
|
UpdateSaveStates();
|
|
|
|
|
if (newest_slot != 0) {
|
|
|
|
|
actions_load_state[newest_slot - 1]->trigger();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
connect(ui.action_Save_to_Oldest_Slot, &QAction::triggered, [this] {
|
|
|
|
|
connect(ui->action_Save_to_Oldest_Slot, &QAction::triggered, [this] {
|
|
|
|
|
UpdateSaveStates();
|
|
|
|
|
actions_save_state[oldest_slot - 1]->trigger();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
connect(ui.menu_Load_State->menuAction(), &QAction::hovered, this,
|
|
|
|
|
connect(ui->menu_Load_State->menuAction(), &QAction::hovered, this,
|
|
|
|
|
&GMainWindow::UpdateSaveStates);
|
|
|
|
|
connect(ui.menu_Save_State->menuAction(), &QAction::hovered, this,
|
|
|
|
|
connect(ui->menu_Save_State->menuAction(), &QAction::hovered, this,
|
|
|
|
|
&GMainWindow::UpdateSaveStates);
|
|
|
|
|
|
|
|
|
|
UpdateSaveStates();
|
|
|
|
@ -443,24 +446,24 @@ void GMainWindow::InitializeHotkeys() {
|
|
|
|
|
const QString toggle_status_bar = QStringLiteral("Toggle Status Bar");
|
|
|
|
|
const QString fullscreen = QStringLiteral("Fullscreen");
|
|
|
|
|
|
|
|
|
|
ui.action_Show_Filter_Bar->setShortcut(
|
|
|
|
|
ui->action_Show_Filter_Bar->setShortcut(
|
|
|
|
|
hotkey_registry.GetKeySequence(main_window, toggle_filter_bar));
|
|
|
|
|
ui.action_Show_Filter_Bar->setShortcutContext(
|
|
|
|
|
ui->action_Show_Filter_Bar->setShortcutContext(
|
|
|
|
|
hotkey_registry.GetShortcutContext(main_window, toggle_filter_bar));
|
|
|
|
|
|
|
|
|
|
ui.action_Show_Status_Bar->setShortcut(
|
|
|
|
|
ui->action_Show_Status_Bar->setShortcut(
|
|
|
|
|
hotkey_registry.GetKeySequence(main_window, toggle_status_bar));
|
|
|
|
|
ui.action_Show_Status_Bar->setShortcutContext(
|
|
|
|
|
ui->action_Show_Status_Bar->setShortcutContext(
|
|
|
|
|
hotkey_registry.GetShortcutContext(main_window, toggle_status_bar));
|
|
|
|
|
|
|
|
|
|
connect(hotkey_registry.GetHotkey(main_window, load_file, this), &QShortcut::activated,
|
|
|
|
|
ui.action_Load_File, &QAction::trigger);
|
|
|
|
|
ui->action_Load_File, &QAction::trigger);
|
|
|
|
|
|
|
|
|
|
connect(hotkey_registry.GetHotkey(main_window, stop_emulation, this), &QShortcut::activated,
|
|
|
|
|
ui.action_Stop, &QAction::trigger);
|
|
|
|
|
ui->action_Stop, &QAction::trigger);
|
|
|
|
|
|
|
|
|
|
connect(hotkey_registry.GetHotkey(main_window, exit_citra, this), &QShortcut::activated,
|
|
|
|
|
ui.action_Exit, &QAction::trigger);
|
|
|
|
|
ui->action_Exit, &QAction::trigger);
|
|
|
|
|
|
|
|
|
|
connect(
|
|
|
|
|
hotkey_registry.GetHotkey(main_window, QStringLiteral("Continue/Pause Emulation"), this),
|
|
|
|
@ -480,21 +483,21 @@ void GMainWindow::InitializeHotkeys() {
|
|
|
|
|
BootGame(QString(game_path));
|
|
|
|
|
});
|
|
|
|
|
connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Swap Screens"), render_window),
|
|
|
|
|
&QShortcut::activated, ui.action_Screen_Layout_Swap_Screens, &QAction::trigger);
|
|
|
|
|
&QShortcut::activated, ui->action_Screen_Layout_Swap_Screens, &QAction::trigger);
|
|
|
|
|
connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Rotate Screens Upright"),
|
|
|
|
|
render_window),
|
|
|
|
|
&QShortcut::activated, ui.action_Screen_Layout_Upright_Screens, &QAction::trigger);
|
|
|
|
|
&QShortcut::activated, ui->action_Screen_Layout_Upright_Screens, &QAction::trigger);
|
|
|
|
|
connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Toggle Screen Layout"),
|
|
|
|
|
render_window),
|
|
|
|
|
&QShortcut::activated, this, &GMainWindow::ToggleScreenLayout);
|
|
|
|
|
connect(hotkey_registry.GetHotkey(main_window, fullscreen, render_window),
|
|
|
|
|
&QShortcut::activated, ui.action_Fullscreen, &QAction::trigger);
|
|
|
|
|
&QShortcut::activated, ui->action_Fullscreen, &QAction::trigger);
|
|
|
|
|
connect(hotkey_registry.GetHotkey(main_window, fullscreen, render_window),
|
|
|
|
|
&QShortcut::activatedAmbiguously, ui.action_Fullscreen, &QAction::trigger);
|
|
|
|
|
&QShortcut::activatedAmbiguously, ui->action_Fullscreen, &QAction::trigger);
|
|
|
|
|
connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Exit Fullscreen"), this),
|
|
|
|
|
&QShortcut::activated, this, [&] {
|
|
|
|
|
if (emulation_running) {
|
|
|
|
|
ui.action_Fullscreen->setChecked(false);
|
|
|
|
|
ui->action_Fullscreen->setChecked(false);
|
|
|
|
|
ToggleFullscreen();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
@ -552,18 +555,18 @@ void GMainWindow::InitializeHotkeys() {
|
|
|
|
|
UpdateStatusBar();
|
|
|
|
|
});
|
|
|
|
|
connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Toggle Frame Advancing"), this),
|
|
|
|
|
&QShortcut::activated, ui.action_Enable_Frame_Advancing, &QAction::trigger);
|
|
|
|
|
&QShortcut::activated, ui->action_Enable_Frame_Advancing, &QAction::trigger);
|
|
|
|
|
connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Advance Frame"), this),
|
|
|
|
|
&QShortcut::activated, ui.action_Advance_Frame, &QAction::trigger);
|
|
|
|
|
&QShortcut::activated, ui->action_Advance_Frame, &QAction::trigger);
|
|
|
|
|
connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Load Amiibo"), this),
|
|
|
|
|
&QShortcut::activated, this, [&] {
|
|
|
|
|
if (ui.action_Load_Amiibo->isEnabled()) {
|
|
|
|
|
if (ui->action_Load_Amiibo->isEnabled()) {
|
|
|
|
|
OnLoadAmiibo();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Remove Amiibo"), this),
|
|
|
|
|
&QShortcut::activated, this, [&] {
|
|
|
|
|
if (ui.action_Remove_Amiibo->isEnabled()) {
|
|
|
|
|
if (ui->action_Remove_Amiibo->isEnabled()) {
|
|
|
|
|
OnRemoveAmiibo();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
@ -574,14 +577,14 @@ void GMainWindow::InitializeHotkeys() {
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Load from Newest Slot"), this),
|
|
|
|
|
&QShortcut::activated, ui.action_Load_from_Newest_Slot, &QAction::trigger);
|
|
|
|
|
&QShortcut::activated, ui->action_Load_from_Newest_Slot, &QAction::trigger);
|
|
|
|
|
connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Save to Oldest Slot"), this),
|
|
|
|
|
&QShortcut::activated, ui.action_Save_to_Oldest_Slot, &QAction::trigger);
|
|
|
|
|
&QShortcut::activated, ui->action_Save_to_Oldest_Slot, &QAction::trigger);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GMainWindow::ShowUpdaterWidgets() {
|
|
|
|
|
ui.action_Check_For_Updates->setVisible(UISettings::values.updater_found);
|
|
|
|
|
ui.action_Open_Maintenance_Tool->setVisible(UISettings::values.updater_found);
|
|
|
|
|
ui->action_Check_For_Updates->setVisible(UISettings::values.updater_found);
|
|
|
|
|
ui->action_Open_Maintenance_Tool->setVisible(UISettings::values.updater_found);
|
|
|
|
|
|
|
|
|
|
connect(updater, &Updater::CheckUpdatesDone, this, &GMainWindow::OnUpdateFound);
|
|
|
|
|
}
|
|
|
|
@ -606,24 +609,24 @@ void GMainWindow::RestoreUIState() {
|
|
|
|
|
microProfileDialog->restoreGeometry(UISettings::values.microprofile_geometry);
|
|
|
|
|
microProfileDialog->setVisible(UISettings::values.microprofile_visible);
|
|
|
|
|
#endif
|
|
|
|
|
ui.action_Cheats->setEnabled(false);
|
|
|
|
|
ui->action_Cheats->setEnabled(false);
|
|
|
|
|
|
|
|
|
|
game_list->LoadInterfaceLayout();
|
|
|
|
|
|
|
|
|
|
ui.action_Single_Window_Mode->setChecked(UISettings::values.single_window_mode);
|
|
|
|
|
ui->action_Single_Window_Mode->setChecked(UISettings::values.single_window_mode);
|
|
|
|
|
ToggleWindowMode();
|
|
|
|
|
|
|
|
|
|
ui.action_Fullscreen->setChecked(UISettings::values.fullscreen);
|
|
|
|
|
ui->action_Fullscreen->setChecked(UISettings::values.fullscreen);
|
|
|
|
|
SyncMenuUISettings();
|
|
|
|
|
|
|
|
|
|
ui.action_Display_Dock_Widget_Headers->setChecked(UISettings::values.display_titlebar);
|
|
|
|
|
OnDisplayTitleBars(ui.action_Display_Dock_Widget_Headers->isChecked());
|
|
|
|
|
ui->action_Display_Dock_Widget_Headers->setChecked(UISettings::values.display_titlebar);
|
|
|
|
|
OnDisplayTitleBars(ui->action_Display_Dock_Widget_Headers->isChecked());
|
|
|
|
|
|
|
|
|
|
ui.action_Show_Filter_Bar->setChecked(UISettings::values.show_filter_bar);
|
|
|
|
|
game_list->setFilterVisible(ui.action_Show_Filter_Bar->isChecked());
|
|
|
|
|
ui->action_Show_Filter_Bar->setChecked(UISettings::values.show_filter_bar);
|
|
|
|
|
game_list->setFilterVisible(ui->action_Show_Filter_Bar->isChecked());
|
|
|
|
|
|
|
|
|
|
ui.action_Show_Status_Bar->setChecked(UISettings::values.show_status_bar);
|
|
|
|
|
statusBar()->setVisible(ui.action_Show_Status_Bar->isChecked());
|
|
|
|
|
ui->action_Show_Status_Bar->setChecked(UISettings::values.show_status_bar);
|
|
|
|
|
statusBar()->setVisible(ui->action_Show_Status_Bar->isChecked());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GMainWindow::OnAppFocusStateChanged(Qt::ApplicationState state) {
|
|
|
|
@ -634,11 +637,11 @@ void GMainWindow::OnAppFocusStateChanged(Qt::ApplicationState state) {
|
|
|
|
|
state != Qt::ApplicationActive) {
|
|
|
|
|
LOG_DEBUG(Frontend, "ApplicationState unusual flag: {} ", state);
|
|
|
|
|
}
|
|
|
|
|
if (ui.action_Pause->isEnabled() &&
|
|
|
|
|
if (ui->action_Pause->isEnabled() &&
|
|
|
|
|
(state & (Qt::ApplicationHidden | Qt::ApplicationInactive))) {
|
|
|
|
|
auto_paused = true;
|
|
|
|
|
OnPauseGame();
|
|
|
|
|
} else if (ui.action_Start->isEnabled() && auto_paused && state == Qt::ApplicationActive) {
|
|
|
|
|
} else if (ui->action_Start->isEnabled() && auto_paused && state == Qt::ApplicationActive) {
|
|
|
|
|
auto_paused = false;
|
|
|
|
|
OnStartGame();
|
|
|
|
|
}
|
|
|
|
@ -674,116 +677,117 @@ void GMainWindow::ConnectWidgetEvents() {
|
|
|
|
|
|
|
|
|
|
void GMainWindow::ConnectMenuEvents() {
|
|
|
|
|
// File
|
|
|
|
|
connect(ui.action_Load_File, &QAction::triggered, this, &GMainWindow::OnMenuLoadFile);
|
|
|
|
|
connect(ui.action_Install_CIA, &QAction::triggered, this, &GMainWindow::OnMenuInstallCIA);
|
|
|
|
|
connect(ui.action_Exit, &QAction::triggered, this, &QMainWindow::close);
|
|
|
|
|
connect(ui.action_Load_Amiibo, &QAction::triggered, this, &GMainWindow::OnLoadAmiibo);
|
|
|
|
|
connect(ui.action_Remove_Amiibo, &QAction::triggered, this, &GMainWindow::OnRemoveAmiibo);
|
|
|
|
|
connect(ui->action_Load_File, &QAction::triggered, this, &GMainWindow::OnMenuLoadFile);
|
|
|
|
|
connect(ui->action_Install_CIA, &QAction::triggered, this, &GMainWindow::OnMenuInstallCIA);
|
|
|
|
|
connect(ui->action_Exit, &QAction::triggered, this, &QMainWindow::close);
|
|
|
|
|
connect(ui->action_Load_Amiibo, &QAction::triggered, this, &GMainWindow::OnLoadAmiibo);
|
|
|
|
|
connect(ui->action_Remove_Amiibo, &QAction::triggered, this, &GMainWindow::OnRemoveAmiibo);
|
|
|
|
|
|
|
|
|
|
// Emulation
|
|
|
|
|
connect(ui.action_Start, &QAction::triggered, this, &GMainWindow::OnStartGame);
|
|
|
|
|
connect(ui.action_Pause, &QAction::triggered, this, &GMainWindow::OnPauseGame);
|
|
|
|
|
connect(ui.action_Stop, &QAction::triggered, this, &GMainWindow::OnStopGame);
|
|
|
|
|
connect(ui.action_Restart, &QAction::triggered, this, [this] { BootGame(QString(game_path)); });
|
|
|
|
|
connect(ui.action_Report_Compatibility, &QAction::triggered, this,
|
|
|
|
|
connect(ui->action_Start, &QAction::triggered, this, &GMainWindow::OnStartGame);
|
|
|
|
|
connect(ui->action_Pause, &QAction::triggered, this, &GMainWindow::OnPauseGame);
|
|
|
|
|
connect(ui->action_Stop, &QAction::triggered, this, &GMainWindow::OnStopGame);
|
|
|
|
|
connect(ui->action_Restart, &QAction::triggered, this,
|
|
|
|
|
[this] { BootGame(QString(game_path)); });
|
|
|
|
|
connect(ui->action_Report_Compatibility, &QAction::triggered, this,
|
|
|
|
|
&GMainWindow::OnMenuReportCompatibility);
|
|
|
|
|
connect(ui.action_Configure, &QAction::triggered, this, &GMainWindow::OnConfigure);
|
|
|
|
|
connect(ui.action_Cheats, &QAction::triggered, this, &GMainWindow::OnCheats);
|
|
|
|
|
connect(ui->action_Configure, &QAction::triggered, this, &GMainWindow::OnConfigure);
|
|
|
|
|
connect(ui->action_Cheats, &QAction::triggered, this, &GMainWindow::OnCheats);
|
|
|
|
|
|
|
|
|
|
// View
|
|
|
|
|
connect(ui.action_Single_Window_Mode, &QAction::triggered, this,
|
|
|
|
|
connect(ui->action_Single_Window_Mode, &QAction::triggered, this,
|
|
|
|
|
&GMainWindow::ToggleWindowMode);
|
|
|
|
|
connect(ui.action_Display_Dock_Widget_Headers, &QAction::triggered, this,
|
|
|
|
|
connect(ui->action_Display_Dock_Widget_Headers, &QAction::triggered, this,
|
|
|
|
|
&GMainWindow::OnDisplayTitleBars);
|
|
|
|
|
connect(ui.action_Show_Filter_Bar, &QAction::triggered, this, &GMainWindow::OnToggleFilterBar);
|
|
|
|
|
connect(ui.action_Show_Status_Bar, &QAction::triggered, statusBar(), &QStatusBar::setVisible);
|
|
|
|
|
connect(ui->action_Show_Filter_Bar, &QAction::triggered, this, &GMainWindow::OnToggleFilterBar);
|
|
|
|
|
connect(ui->action_Show_Status_Bar, &QAction::triggered, statusBar(), &QStatusBar::setVisible);
|
|
|
|
|
|
|
|
|
|
// Multiplayer
|
|
|
|
|
connect(ui.action_View_Lobby, &QAction::triggered, multiplayer_state,
|
|
|
|
|
connect(ui->action_View_Lobby, &QAction::triggered, multiplayer_state,
|
|
|
|
|
&MultiplayerState::OnViewLobby);
|
|
|
|
|
connect(ui.action_Start_Room, &QAction::triggered, multiplayer_state,
|
|
|
|
|
connect(ui->action_Start_Room, &QAction::triggered, multiplayer_state,
|
|
|
|
|
&MultiplayerState::OnCreateRoom);
|
|
|
|
|
connect(ui.action_Leave_Room, &QAction::triggered, multiplayer_state,
|
|
|
|
|
connect(ui->action_Leave_Room, &QAction::triggered, multiplayer_state,
|
|
|
|
|
&MultiplayerState::OnCloseRoom);
|
|
|
|
|
connect(ui.action_Connect_To_Room, &QAction::triggered, multiplayer_state,
|
|
|
|
|
connect(ui->action_Connect_To_Room, &QAction::triggered, multiplayer_state,
|
|
|
|
|
&MultiplayerState::OnDirectConnectToRoom);
|
|
|
|
|
connect(ui.action_Show_Room, &QAction::triggered, multiplayer_state,
|
|
|
|
|
connect(ui->action_Show_Room, &QAction::triggered, multiplayer_state,
|
|
|
|
|
&MultiplayerState::OnOpenNetworkRoom);
|
|
|
|
|
|
|
|
|
|
ui.action_Fullscreen->setShortcut(
|
|
|
|
|
ui->action_Fullscreen->setShortcut(
|
|
|
|
|
hotkey_registry
|
|
|
|
|
.GetHotkey(QStringLiteral("Main Window"), QStringLiteral("Fullscreen"), this)
|
|
|
|
|
->key());
|
|
|
|
|
ui.action_Screen_Layout_Swap_Screens->setShortcut(
|
|
|
|
|
ui->action_Screen_Layout_Swap_Screens->setShortcut(
|
|
|
|
|
hotkey_registry
|
|
|
|
|
.GetHotkey(QStringLiteral("Main Window"), QStringLiteral("Swap Screens"), this)
|
|
|
|
|
->key());
|
|
|
|
|
ui.action_Screen_Layout_Swap_Screens->setShortcutContext(Qt::WidgetWithChildrenShortcut);
|
|
|
|
|
ui.action_Screen_Layout_Upright_Screens->setShortcut(
|
|
|
|
|
ui->action_Screen_Layout_Swap_Screens->setShortcutContext(Qt::WidgetWithChildrenShortcut);
|
|
|
|
|
ui->action_Screen_Layout_Upright_Screens->setShortcut(
|
|
|
|
|
hotkey_registry
|
|
|
|
|
.GetHotkey(QStringLiteral("Main Window"), QStringLiteral("Rotate Screens Upright"),
|
|
|
|
|
this)
|
|
|
|
|
->key());
|
|
|
|
|
ui.action_Screen_Layout_Upright_Screens->setShortcutContext(Qt::WidgetWithChildrenShortcut);
|
|
|
|
|
connect(ui.action_Fullscreen, &QAction::triggered, this, &GMainWindow::ToggleFullscreen);
|
|
|
|
|
connect(ui.action_Screen_Layout_Default, &QAction::triggered, this,
|
|
|
|
|
ui->action_Screen_Layout_Upright_Screens->setShortcutContext(Qt::WidgetWithChildrenShortcut);
|
|
|
|
|
connect(ui->action_Fullscreen, &QAction::triggered, this, &GMainWindow::ToggleFullscreen);
|
|
|
|
|
connect(ui->action_Screen_Layout_Default, &QAction::triggered, this,
|
|
|
|
|
&GMainWindow::ChangeScreenLayout);
|
|
|
|
|
connect(ui.action_Screen_Layout_Single_Screen, &QAction::triggered, this,
|
|
|
|
|
connect(ui->action_Screen_Layout_Single_Screen, &QAction::triggered, this,
|
|
|
|
|
&GMainWindow::ChangeScreenLayout);
|
|
|
|
|
connect(ui.action_Screen_Layout_Large_Screen, &QAction::triggered, this,
|
|
|
|
|
connect(ui->action_Screen_Layout_Large_Screen, &QAction::triggered, this,
|
|
|
|
|
&GMainWindow::ChangeScreenLayout);
|
|
|
|
|
connect(ui.action_Screen_Layout_Side_by_Side, &QAction::triggered, this,
|
|
|
|
|
connect(ui->action_Screen_Layout_Side_by_Side, &QAction::triggered, this,
|
|
|
|
|
&GMainWindow::ChangeScreenLayout);
|
|
|
|
|
connect(ui.action_Screen_Layout_Swap_Screens, &QAction::triggered, this,
|
|
|
|
|
connect(ui->action_Screen_Layout_Swap_Screens, &QAction::triggered, this,
|
|
|
|
|
&GMainWindow::OnSwapScreens);
|
|
|
|
|
connect(ui.action_Screen_Layout_Upright_Screens, &QAction::triggered, this,
|
|
|
|
|
connect(ui->action_Screen_Layout_Upright_Screens, &QAction::triggered, this,
|
|
|
|
|
&GMainWindow::OnRotateScreens);
|
|
|
|
|
|
|
|
|
|
// Movie
|
|
|
|
|
connect(ui.action_Record_Movie, &QAction::triggered, this, &GMainWindow::OnRecordMovie);
|
|
|
|
|
connect(ui.action_Play_Movie, &QAction::triggered, this, &GMainWindow::OnPlayMovie);
|
|
|
|
|
connect(ui.action_Stop_Recording_Playback, &QAction::triggered, this,
|
|
|
|
|
connect(ui->action_Record_Movie, &QAction::triggered, this, &GMainWindow::OnRecordMovie);
|
|
|
|
|
connect(ui->action_Play_Movie, &QAction::triggered, this, &GMainWindow::OnPlayMovie);
|
|
|
|
|
connect(ui->action_Stop_Recording_Playback, &QAction::triggered, this,
|
|
|
|
|
&GMainWindow::OnStopRecordingPlayback);
|
|
|
|
|
connect(ui.action_Enable_Frame_Advancing, &QAction::triggered, this, [this] {
|
|
|
|
|
connect(ui->action_Enable_Frame_Advancing, &QAction::triggered, this, [this] {
|
|
|
|
|
if (emulation_running) {
|
|
|
|
|
Core::System::GetInstance().frame_limiter.SetFrameAdvancing(
|
|
|
|
|
ui.action_Enable_Frame_Advancing->isChecked());
|
|
|
|
|
ui.action_Advance_Frame->setEnabled(ui.action_Enable_Frame_Advancing->isChecked());
|
|
|
|
|
ui->action_Enable_Frame_Advancing->isChecked());
|
|
|
|
|
ui->action_Advance_Frame->setEnabled(ui->action_Enable_Frame_Advancing->isChecked());
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
connect(ui.action_Advance_Frame, &QAction::triggered, this, [this] {
|
|
|
|
|
connect(ui->action_Advance_Frame, &QAction::triggered, this, [this] {
|
|
|
|
|
if (emulation_running) {
|
|
|
|
|
ui.action_Enable_Frame_Advancing->setChecked(true);
|
|
|
|
|
ui.action_Advance_Frame->setEnabled(true);
|
|
|
|
|
ui->action_Enable_Frame_Advancing->setChecked(true);
|
|
|
|
|
ui->action_Advance_Frame->setEnabled(true);
|
|
|
|
|
Core::System::GetInstance().frame_limiter.SetFrameAdvancing(true);
|
|
|
|
|
Core::System::GetInstance().frame_limiter.AdvanceFrame();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
connect(ui.action_Capture_Screenshot, &QAction::triggered, this,
|
|
|
|
|
connect(ui->action_Capture_Screenshot, &QAction::triggered, this,
|
|
|
|
|
&GMainWindow::OnCaptureScreenshot);
|
|
|
|
|
|
|
|
|
|
#ifdef ENABLE_FFMPEG_VIDEO_DUMPER
|
|
|
|
|
connect(ui.action_Dump_Video, &QAction::triggered, [this] {
|
|
|
|
|
if (ui.action_Dump_Video->isChecked()) {
|
|
|
|
|
connect(ui->action_Dump_Video, &QAction::triggered, [this] {
|
|
|
|
|
if (ui->action_Dump_Video->isChecked()) {
|
|
|
|
|
OnStartVideoDumping();
|
|
|
|
|
} else {
|
|
|
|
|
OnStopVideoDumping();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
#else
|
|
|
|
|
ui.action_Dump_Video->setEnabled(false);
|
|
|
|
|
ui->action_Dump_Video->setEnabled(false);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
// Help
|
|
|
|
|
connect(ui.action_Open_Citra_Folder, &QAction::triggered, this,
|
|
|
|
|
connect(ui->action_Open_Citra_Folder, &QAction::triggered, this,
|
|
|
|
|
&GMainWindow::OnOpenCitraFolder);
|
|
|
|
|
connect(ui.action_FAQ, &QAction::triggered, []() {
|
|
|
|
|
connect(ui->action_FAQ, &QAction::triggered, []() {
|
|
|
|
|
QDesktopServices::openUrl(QUrl(QStringLiteral("https://citra-emu.org/wiki/faq/")));
|
|
|
|
|
});
|
|
|
|
|
connect(ui.action_About, &QAction::triggered, this, &GMainWindow::OnMenuAboutCitra);
|
|
|
|
|
connect(ui.action_Check_For_Updates, &QAction::triggered, this,
|
|
|
|
|
connect(ui->action_About, &QAction::triggered, this, &GMainWindow::OnMenuAboutCitra);
|
|
|
|
|
connect(ui->action_Check_For_Updates, &QAction::triggered, this,
|
|
|
|
|
&GMainWindow::OnCheckForUpdates);
|
|
|
|
|
connect(ui.action_Open_Maintenance_Tool, &QAction::triggered, this,
|
|
|
|
|
connect(ui->action_Open_Maintenance_Tool, &QAction::triggered, this,
|
|
|
|
|
&GMainWindow::OnOpenUpdater);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1038,7 +1042,7 @@ void GMainWindow::BootGame(const QString& filename) {
|
|
|
|
|
|
|
|
|
|
// Update the GUI
|
|
|
|
|
registersWidget->OnDebugModeEntered();
|
|
|
|
|
if (ui.action_Single_Window_Mode->isChecked()) {
|
|
|
|
|
if (ui->action_Single_Window_Mode->isChecked()) {
|
|
|
|
|
game_list->hide();
|
|
|
|
|
game_list_placeholder->hide();
|
|
|
|
|
}
|
|
|
|
@ -1047,7 +1051,7 @@ void GMainWindow::BootGame(const QString& filename) {
|
|
|
|
|
if (UISettings::values.hide_mouse) {
|
|
|
|
|
mouse_hide_timer.start();
|
|
|
|
|
setMouseTracking(true);
|
|
|
|
|
ui.centralwidget->setMouseTracking(true);
|
|
|
|
|
ui->centralwidget->setMouseTracking(true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// show and hide the render_window to create the context
|
|
|
|
@ -1058,7 +1062,7 @@ void GMainWindow::BootGame(const QString& filename) {
|
|
|
|
|
loading_screen->show();
|
|
|
|
|
|
|
|
|
|
emulation_running = true;
|
|
|
|
|
if (ui.action_Fullscreen->isChecked()) {
|
|
|
|
|
if (ui->action_Fullscreen->isChecked()) {
|
|
|
|
|
ShowFullscreen();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1071,7 +1075,7 @@ void GMainWindow::BootGame(const QString& filename) {
|
|
|
|
|
QMessageBox::critical(
|
|
|
|
|
this, tr("Citra"),
|
|
|
|
|
tr("Could not start video dumping.<br>Refer to the log for details."));
|
|
|
|
|
ui.action_Dump_Video->setChecked(false);
|
|
|
|
|
ui->action_Dump_Video->setChecked(false);
|
|
|
|
|
}
|
|
|
|
|
video_dumping_on_start = false;
|
|
|
|
|
video_dumping_path.clear();
|
|
|
|
@ -1084,7 +1088,7 @@ void GMainWindow::ShutdownGame() {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (ui.action_Fullscreen->isChecked()) {
|
|
|
|
|
if (ui->action_Fullscreen->isChecked()) {
|
|
|
|
|
HideFullscreen();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1126,19 +1130,19 @@ void GMainWindow::ShutdownGame() {
|
|
|
|
|
disconnect(render_window, &GRenderWindow::Closed, this, &GMainWindow::OnStopGame);
|
|
|
|
|
|
|
|
|
|
// Update the GUI
|
|
|
|
|
ui.action_Start->setEnabled(false);
|
|
|
|
|
ui.action_Start->setText(tr("Start"));
|
|
|
|
|
ui.action_Pause->setEnabled(false);
|
|
|
|
|
ui.action_Stop->setEnabled(false);
|
|
|
|
|
ui.action_Restart->setEnabled(false);
|
|
|
|
|
ui.action_Cheats->setEnabled(false);
|
|
|
|
|
ui.action_Load_Amiibo->setEnabled(false);
|
|
|
|
|
ui.action_Remove_Amiibo->setEnabled(false);
|
|
|
|
|
ui.action_Report_Compatibility->setEnabled(false);
|
|
|
|
|
ui.action_Enable_Frame_Advancing->setEnabled(false);
|
|
|
|
|
ui.action_Enable_Frame_Advancing->setChecked(false);
|
|
|
|
|
ui.action_Advance_Frame->setEnabled(false);
|
|
|
|
|
ui.action_Capture_Screenshot->setEnabled(false);
|
|
|
|
|
ui->action_Start->setEnabled(false);
|
|
|
|
|
ui->action_Start->setText(tr("Start"));
|
|
|
|
|
ui->action_Pause->setEnabled(false);
|
|
|
|
|
ui->action_Stop->setEnabled(false);
|
|
|
|
|
ui->action_Restart->setEnabled(false);
|
|
|
|
|
ui->action_Cheats->setEnabled(false);
|
|
|
|
|
ui->action_Load_Amiibo->setEnabled(false);
|
|
|
|
|
ui->action_Remove_Amiibo->setEnabled(false);
|
|
|
|
|
ui->action_Report_Compatibility->setEnabled(false);
|
|
|
|
|
ui->action_Enable_Frame_Advancing->setEnabled(false);
|
|
|
|
|
ui->action_Enable_Frame_Advancing->setChecked(false);
|
|
|
|
|
ui->action_Advance_Frame->setEnabled(false);
|
|
|
|
|
ui->action_Capture_Screenshot->setEnabled(false);
|
|
|
|
|
render_window->hide();
|
|
|
|
|
loading_screen->hide();
|
|
|
|
|
loading_screen->Clear();
|
|
|
|
@ -1149,7 +1153,7 @@ void GMainWindow::ShutdownGame() {
|
|
|
|
|
game_list->setFilterFocus();
|
|
|
|
|
|
|
|
|
|
setMouseTracking(false);
|
|
|
|
|
ui.centralwidget->setMouseTracking(false);
|
|
|
|
|
ui->centralwidget->setMouseTracking(false);
|
|
|
|
|
|
|
|
|
|
// Disable status bar updates
|
|
|
|
|
status_bar_update_timer.stop();
|
|
|
|
@ -1203,19 +1207,19 @@ void GMainWindow::UpdateRecentFiles() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Enable the recent files menu if the list isn't empty
|
|
|
|
|
ui.menu_recent_files->setEnabled(num_recent_files != 0);
|
|
|
|
|
ui->menu_recent_files->setEnabled(num_recent_files != 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GMainWindow::UpdateSaveStates() {
|
|
|
|
|
if (!Core::System::GetInstance().IsPoweredOn()) {
|
|
|
|
|
ui.menu_Load_State->setEnabled(false);
|
|
|
|
|
ui.menu_Save_State->setEnabled(false);
|
|
|
|
|
ui->menu_Load_State->setEnabled(false);
|
|
|
|
|
ui->menu_Save_State->setEnabled(false);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ui.menu_Load_State->setEnabled(true);
|
|
|
|
|
ui.menu_Save_State->setEnabled(true);
|
|
|
|
|
ui.action_Load_from_Newest_Slot->setEnabled(false);
|
|
|
|
|
ui->menu_Load_State->setEnabled(true);
|
|
|
|
|
ui->menu_Save_State->setEnabled(true);
|
|
|
|
|
ui->action_Load_from_Newest_Slot->setEnabled(false);
|
|
|
|
|
|
|
|
|
|
oldest_slot = newest_slot = 0;
|
|
|
|
|
oldest_slot_time = std::numeric_limits<u64>::max();
|
|
|
|
@ -1241,7 +1245,7 @@ void GMainWindow::UpdateSaveStates() {
|
|
|
|
|
actions_load_state[savestate.slot - 1]->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) {
|
|
|
|
|
newest_slot = savestate.slot;
|
|
|
|
@ -1414,7 +1418,7 @@ void GMainWindow::OnGameListAddDirectory() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GMainWindow::OnGameListShowList(bool show) {
|
|
|
|
|
if (emulation_running && ui.action_Single_Window_Mode->isChecked())
|
|
|
|
|
if (emulation_running && ui->action_Single_Window_Mode->isChecked())
|
|
|
|
|
return;
|
|
|
|
|
game_list->setVisible(show);
|
|
|
|
|
game_list_placeholder->setVisible(!show);
|
|
|
|
@ -1448,7 +1452,7 @@ void GMainWindow::OnMenuInstallCIA() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GMainWindow::InstallCIA(QStringList filepaths) {
|
|
|
|
|
ui.action_Install_CIA->setEnabled(false);
|
|
|
|
|
ui->action_Install_CIA->setEnabled(false);
|
|
|
|
|
game_list->setDirectoryWatcherEnabled(false);
|
|
|
|
|
progress_bar->show();
|
|
|
|
|
progress_bar->setMaximum(INT_MAX);
|
|
|
|
@ -1504,7 +1508,7 @@ void GMainWindow::OnCIAInstallFinished() {
|
|
|
|
|
progress_bar->hide();
|
|
|
|
|
progress_bar->setValue(0);
|
|
|
|
|
game_list->setDirectoryWatcherEnabled(true);
|
|
|
|
|
ui.action_Install_CIA->setEnabled(true);
|
|
|
|
|
ui->action_Install_CIA->setEnabled(true);
|
|
|
|
|
game_list->PopulateAsync(UISettings::values.game_dirs);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1541,17 +1545,17 @@ void GMainWindow::OnStartGame() {
|
|
|
|
|
qRegisterMetaType<std::string>("std::string");
|
|
|
|
|
connect(emu_thread.get(), &EmuThread::ErrorThrown, this, &GMainWindow::OnCoreError);
|
|
|
|
|
|
|
|
|
|
ui.action_Start->setEnabled(false);
|
|
|
|
|
ui.action_Start->setText(tr("Continue"));
|
|
|
|
|
ui->action_Start->setEnabled(false);
|
|
|
|
|
ui->action_Start->setText(tr("Continue"));
|
|
|
|
|
|
|
|
|
|
ui.action_Pause->setEnabled(true);
|
|
|
|
|
ui.action_Stop->setEnabled(true);
|
|
|
|
|
ui.action_Restart->setEnabled(true);
|
|
|
|
|
ui.action_Cheats->setEnabled(true);
|
|
|
|
|
ui.action_Load_Amiibo->setEnabled(true);
|
|
|
|
|
ui.action_Report_Compatibility->setEnabled(true);
|
|
|
|
|
ui.action_Enable_Frame_Advancing->setEnabled(true);
|
|
|
|
|
ui.action_Capture_Screenshot->setEnabled(true);
|
|
|
|
|
ui->action_Pause->setEnabled(true);
|
|
|
|
|
ui->action_Stop->setEnabled(true);
|
|
|
|
|
ui->action_Restart->setEnabled(true);
|
|
|
|
|
ui->action_Cheats->setEnabled(true);
|
|
|
|
|
ui->action_Load_Amiibo->setEnabled(true);
|
|
|
|
|
ui->action_Report_Compatibility->setEnabled(true);
|
|
|
|
|
ui->action_Enable_Frame_Advancing->setEnabled(true);
|
|
|
|
|
ui->action_Capture_Screenshot->setEnabled(true);
|
|
|
|
|
|
|
|
|
|
discord_rpc->Update();
|
|
|
|
|
|
|
|
|
@ -1561,10 +1565,10 @@ void GMainWindow::OnStartGame() {
|
|
|
|
|
void GMainWindow::OnPauseGame() {
|
|
|
|
|
emu_thread->SetRunning(false);
|
|
|
|
|
Camera::QtMultimediaCameraHandler::StopCameras();
|
|
|
|
|
ui.action_Start->setEnabled(true);
|
|
|
|
|
ui.action_Pause->setEnabled(false);
|
|
|
|
|
ui.action_Stop->setEnabled(true);
|
|
|
|
|
ui.action_Capture_Screenshot->setEnabled(false);
|
|
|
|
|
ui->action_Start->setEnabled(true);
|
|
|
|
|
ui->action_Pause->setEnabled(false);
|
|
|
|
|
ui->action_Stop->setEnabled(true);
|
|
|
|
|
ui->action_Capture_Screenshot->setEnabled(false);
|
|
|
|
|
|
|
|
|
|
AllowOSSleep();
|
|
|
|
|
}
|
|
|
|
@ -1592,7 +1596,7 @@ void GMainWindow::ToggleFullscreen() {
|
|
|
|
|
if (!emulation_running) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (ui.action_Fullscreen->isChecked()) {
|
|
|
|
|
if (ui->action_Fullscreen->isChecked()) {
|
|
|
|
|
ShowFullscreen();
|
|
|
|
|
} else {
|
|
|
|
|
HideFullscreen();
|
|
|
|
@ -1600,9 +1604,9 @@ void GMainWindow::ToggleFullscreen() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GMainWindow::ShowFullscreen() {
|
|
|
|
|
if (ui.action_Single_Window_Mode->isChecked()) {
|
|
|
|
|
if (ui->action_Single_Window_Mode->isChecked()) {
|
|
|
|
|
UISettings::values.geometry = saveGeometry();
|
|
|
|
|
ui.menubar->hide();
|
|
|
|
|
ui->menubar->hide();
|
|
|
|
|
statusBar()->hide();
|
|
|
|
|
showFullScreen();
|
|
|
|
|
} else {
|
|
|
|
@ -1612,9 +1616,9 @@ void GMainWindow::ShowFullscreen() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GMainWindow::HideFullscreen() {
|
|
|
|
|
if (ui.action_Single_Window_Mode->isChecked()) {
|
|
|
|
|
statusBar()->setVisible(ui.action_Show_Status_Bar->isChecked());
|
|
|
|
|
ui.menubar->show();
|
|
|
|
|
if (ui->action_Single_Window_Mode->isChecked()) {
|
|
|
|
|
statusBar()->setVisible(ui->action_Show_Status_Bar->isChecked());
|
|
|
|
|
ui->menubar->show();
|
|
|
|
|
showNormal();
|
|
|
|
|
restoreGeometry(UISettings::values.geometry);
|
|
|
|
|
} else {
|
|
|
|
@ -1624,10 +1628,10 @@ void GMainWindow::HideFullscreen() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GMainWindow::ToggleWindowMode() {
|
|
|
|
|
if (ui.action_Single_Window_Mode->isChecked()) {
|
|
|
|
|
if (ui->action_Single_Window_Mode->isChecked()) {
|
|
|
|
|
// Render in the main window...
|
|
|
|
|
render_window->BackupGeometry();
|
|
|
|
|
ui.horizontalLayout->addWidget(render_window);
|
|
|
|
|
ui->horizontalLayout->addWidget(render_window);
|
|
|
|
|
render_window->setFocusPolicy(Qt::StrongFocus);
|
|
|
|
|
if (emulation_running) {
|
|
|
|
|
render_window->setVisible(true);
|
|
|
|
@ -1637,7 +1641,7 @@ void GMainWindow::ToggleWindowMode() {
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
// Render in a separate window...
|
|
|
|
|
ui.horizontalLayout->removeWidget(render_window);
|
|
|
|
|
ui->horizontalLayout->removeWidget(render_window);
|
|
|
|
|
render_window->setParent(nullptr);
|
|
|
|
|
render_window->setFocusPolicy(Qt::NoFocus);
|
|
|
|
|
if (emulation_running) {
|
|
|
|
@ -1651,13 +1655,13 @@ void GMainWindow::ToggleWindowMode() {
|
|
|
|
|
void GMainWindow::ChangeScreenLayout() {
|
|
|
|
|
Settings::LayoutOption new_layout = Settings::LayoutOption::Default;
|
|
|
|
|
|
|
|
|
|
if (ui.action_Screen_Layout_Default->isChecked()) {
|
|
|
|
|
if (ui->action_Screen_Layout_Default->isChecked()) {
|
|
|
|
|
new_layout = Settings::LayoutOption::Default;
|
|
|
|
|
} else if (ui.action_Screen_Layout_Single_Screen->isChecked()) {
|
|
|
|
|
} else if (ui->action_Screen_Layout_Single_Screen->isChecked()) {
|
|
|
|
|
new_layout = Settings::LayoutOption::SingleScreen;
|
|
|
|
|
} else if (ui.action_Screen_Layout_Large_Screen->isChecked()) {
|
|
|
|
|
} else if (ui->action_Screen_Layout_Large_Screen->isChecked()) {
|
|
|
|
|
new_layout = Settings::LayoutOption::LargeScreen;
|
|
|
|
|
} else if (ui.action_Screen_Layout_Side_by_Side->isChecked()) {
|
|
|
|
|
} else if (ui->action_Screen_Layout_Side_by_Side->isChecked()) {
|
|
|
|
|
new_layout = Settings::LayoutOption::SideScreen;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1689,12 +1693,12 @@ void GMainWindow::ToggleScreenLayout() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GMainWindow::OnSwapScreens() {
|
|
|
|
|
Settings::values.swap_screen = ui.action_Screen_Layout_Swap_Screens->isChecked();
|
|
|
|
|
Settings::values.swap_screen = ui->action_Screen_Layout_Swap_Screens->isChecked();
|
|
|
|
|
Settings::Apply();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GMainWindow::OnRotateScreens() {
|
|
|
|
|
Settings::values.upright_screen = ui.action_Screen_Layout_Upright_Screens->isChecked();
|
|
|
|
|
Settings::values.upright_screen = ui->action_Screen_Layout_Upright_Screens->isChecked();
|
|
|
|
|
Settings::Apply();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1746,11 +1750,11 @@ void GMainWindow::OnConfigure() {
|
|
|
|
|
config->Save();
|
|
|
|
|
if (UISettings::values.hide_mouse && emulation_running) {
|
|
|
|
|
setMouseTracking(true);
|
|
|
|
|
ui.centralwidget->setMouseTracking(true);
|
|
|
|
|
ui->centralwidget->setMouseTracking(true);
|
|
|
|
|
mouse_hide_timer.start();
|
|
|
|
|
} else {
|
|
|
|
|
setMouseTracking(false);
|
|
|
|
|
ui.centralwidget->setMouseTracking(false);
|
|
|
|
|
ui->centralwidget->setMouseTracking(false);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
Settings::values.input_profiles = old_input_profiles;
|
|
|
|
@ -1799,7 +1803,7 @@ void GMainWindow::LoadAmiibo(const QString& filename) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
nfc->LoadAmiibo(amiibo_data);
|
|
|
|
|
ui.action_Remove_Amiibo->setEnabled(true);
|
|
|
|
|
ui->action_Remove_Amiibo->setEnabled(true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GMainWindow::OnRemoveAmiibo() {
|
|
|
|
@ -1811,7 +1815,7 @@ void GMainWindow::OnRemoveAmiibo() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
nfc->RemoveAmiibo();
|
|
|
|
|
ui.action_Remove_Amiibo->setEnabled(false);
|
|
|
|
|
ui->action_Remove_Amiibo->setEnabled(false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GMainWindow::OnOpenCitraFolder() {
|
|
|
|
@ -1820,8 +1824,8 @@ void GMainWindow::OnOpenCitraFolder() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GMainWindow::OnToggleFilterBar() {
|
|
|
|
|
game_list->setFilterVisible(ui.action_Show_Filter_Bar->isChecked());
|
|
|
|
|
if (ui.action_Show_Filter_Bar->isChecked()) {
|
|
|
|
|
game_list->setFilterVisible(ui->action_Show_Filter_Bar->isChecked());
|
|
|
|
|
if (ui->action_Show_Filter_Bar->isChecked()) {
|
|
|
|
|
game_list->setFilterFocus();
|
|
|
|
|
} else {
|
|
|
|
|
game_list->clearFilter();
|
|
|
|
@ -1859,9 +1863,9 @@ void GMainWindow::OnRecordMovie() {
|
|
|
|
|
QMessageBox::information(this, tr("Record Movie"),
|
|
|
|
|
tr("Recording will start once you boot a game."));
|
|
|
|
|
}
|
|
|
|
|
ui.action_Record_Movie->setEnabled(false);
|
|
|
|
|
ui.action_Play_Movie->setEnabled(false);
|
|
|
|
|
ui.action_Stop_Recording_Playback->setEnabled(true);
|
|
|
|
|
ui->action_Record_Movie->setEnabled(false);
|
|
|
|
|
ui->action_Play_Movie->setEnabled(false);
|
|
|
|
|
ui->action_Stop_Recording_Playback->setEnabled(true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool GMainWindow::ValidateMovie(const QString& path, u64 program_id) {
|
|
|
|
@ -1953,9 +1957,9 @@ void GMainWindow::OnPlayMovie() {
|
|
|
|
|
Core::Movie::GetInstance().StartPlayback(path.toStdString(), [this] {
|
|
|
|
|
QMetaObject::invokeMethod(this, "OnMoviePlaybackCompleted");
|
|
|
|
|
});
|
|
|
|
|
ui.action_Record_Movie->setEnabled(false);
|
|
|
|
|
ui.action_Play_Movie->setEnabled(false);
|
|
|
|
|
ui.action_Stop_Recording_Playback->setEnabled(true);
|
|
|
|
|
ui->action_Record_Movie->setEnabled(false);
|
|
|
|
|
ui->action_Play_Movie->setEnabled(false);
|
|
|
|
|
ui->action_Stop_Recording_Playback->setEnabled(true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GMainWindow::OnStopRecordingPlayback() {
|
|
|
|
@ -1971,9 +1975,9 @@ void GMainWindow::OnStopRecordingPlayback() {
|
|
|
|
|
tr("The movie is successfully saved."));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
ui.action_Record_Movie->setEnabled(true);
|
|
|
|
|
ui.action_Play_Movie->setEnabled(true);
|
|
|
|
|
ui.action_Stop_Recording_Playback->setEnabled(false);
|
|
|
|
|
ui->action_Record_Movie->setEnabled(true);
|
|
|
|
|
ui->action_Play_Movie->setEnabled(true);
|
|
|
|
|
ui->action_Stop_Recording_Playback->setEnabled(false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GMainWindow::OnCaptureScreenshot() {
|
|
|
|
@ -1996,7 +2000,7 @@ void GMainWindow::OnCaptureScreenshot() {
|
|
|
|
|
void GMainWindow::OnStartVideoDumping() {
|
|
|
|
|
DumpingDialog dialog(this);
|
|
|
|
|
if (dialog.exec() != QDialog::DialogCode::Accepted) {
|
|
|
|
|
ui.action_Dump_Video->setChecked(false);
|
|
|
|
|
ui->action_Dump_Video->setChecked(false);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
const auto path = dialog.GetFilePath();
|
|
|
|
@ -2007,7 +2011,7 @@ void GMainWindow::OnStartVideoDumping() {
|
|
|
|
|
QMessageBox::critical(
|
|
|
|
|
this, tr("Citra"),
|
|
|
|
|
tr("Could not start video dumping.<br>Refer to the log for details."));
|
|
|
|
|
ui.action_Dump_Video->setChecked(false);
|
|
|
|
|
ui->action_Dump_Video->setChecked(false);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
video_dumping_on_start = true;
|
|
|
|
@ -2016,7 +2020,7 @@ void GMainWindow::OnStartVideoDumping() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GMainWindow::OnStopVideoDumping() {
|
|
|
|
|
ui.action_Dump_Video->setChecked(false);
|
|
|
|
|
ui->action_Dump_Video->setChecked(false);
|
|
|
|
|
|
|
|
|
|
if (video_dumping_on_start) {
|
|
|
|
|
video_dumping_on_start = false;
|
|
|
|
@ -2180,7 +2184,7 @@ void GMainWindow::closeEvent(QCloseEvent* event) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!ui.action_Fullscreen->isChecked()) {
|
|
|
|
|
if (!ui->action_Fullscreen->isChecked()) {
|
|
|
|
|
UISettings::values.geometry = saveGeometry();
|
|
|
|
|
UISettings::values.renderwindow_geometry = render_window->saveGeometry();
|
|
|
|
|
}
|
|
|
|
@ -2189,11 +2193,11 @@ void GMainWindow::closeEvent(QCloseEvent* event) {
|
|
|
|
|
UISettings::values.microprofile_geometry = microProfileDialog->saveGeometry();
|
|
|
|
|
UISettings::values.microprofile_visible = microProfileDialog->isVisible();
|
|
|
|
|
#endif
|
|
|
|
|
UISettings::values.single_window_mode = ui.action_Single_Window_Mode->isChecked();
|
|
|
|
|
UISettings::values.fullscreen = ui.action_Fullscreen->isChecked();
|
|
|
|
|
UISettings::values.display_titlebar = ui.action_Display_Dock_Widget_Headers->isChecked();
|
|
|
|
|
UISettings::values.show_filter_bar = ui.action_Show_Filter_Bar->isChecked();
|
|
|
|
|
UISettings::values.show_status_bar = ui.action_Show_Status_Bar->isChecked();
|
|
|
|
|
UISettings::values.single_window_mode = ui->action_Single_Window_Mode->isChecked();
|
|
|
|
|
UISettings::values.fullscreen = ui->action_Fullscreen->isChecked();
|
|
|
|
|
UISettings::values.display_titlebar = ui->action_Display_Dock_Widget_Headers->isChecked();
|
|
|
|
|
UISettings::values.show_filter_bar = ui->action_Show_Filter_Bar->isChecked();
|
|
|
|
|
UISettings::values.show_status_bar = ui->action_Show_Status_Bar->isChecked();
|
|
|
|
|
UISettings::values.first_start = false;
|
|
|
|
|
|
|
|
|
|
game_list->SaveInterfaceLayout();
|
|
|
|
@ -2275,7 +2279,7 @@ bool GMainWindow::ConfirmChangeGame() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GMainWindow::filterBarSetChecked(bool state) {
|
|
|
|
|
ui.action_Show_Filter_Bar->setChecked(state);
|
|
|
|
|
ui->action_Show_Filter_Bar->setChecked(state);
|
|
|
|
|
emit(OnToggleFilterBar());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -2339,19 +2343,19 @@ void GMainWindow::OnLanguageChanged(const QString& locale) {
|
|
|
|
|
|
|
|
|
|
UISettings::values.language = locale;
|
|
|
|
|
LoadTranslation();
|
|
|
|
|
ui.retranslateUi(this);
|
|
|
|
|
ui->retranslateUi(this);
|
|
|
|
|
RetranslateStatusBar();
|
|
|
|
|
UpdateWindowTitle();
|
|
|
|
|
|
|
|
|
|
if (emulation_running)
|
|
|
|
|
ui.action_Start->setText(tr("Continue"));
|
|
|
|
|
ui->action_Start->setText(tr("Continue"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GMainWindow::OnMoviePlaybackCompleted() {
|
|
|
|
|
QMessageBox::information(this, tr("Playback Completed"), tr("Movie playback completed."));
|
|
|
|
|
ui.action_Record_Movie->setEnabled(true);
|
|
|
|
|
ui.action_Play_Movie->setEnabled(true);
|
|
|
|
|
ui.action_Stop_Recording_Playback->setEnabled(false);
|
|
|
|
|
ui->action_Record_Movie->setEnabled(true);
|
|
|
|
|
ui->action_Play_Movie->setEnabled(true);
|
|
|
|
|
ui->action_Stop_Recording_Playback->setEnabled(false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GMainWindow::UpdateWindowTitle() {
|
|
|
|
@ -2365,16 +2369,16 @@ void GMainWindow::UpdateWindowTitle() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GMainWindow::SyncMenuUISettings() {
|
|
|
|
|
ui.action_Screen_Layout_Default->setChecked(Settings::values.layout_option ==
|
|
|
|
|
ui->action_Screen_Layout_Default->setChecked(Settings::values.layout_option ==
|
|
|
|
|
Settings::LayoutOption::Default);
|
|
|
|
|
ui.action_Screen_Layout_Single_Screen->setChecked(Settings::values.layout_option ==
|
|
|
|
|
ui->action_Screen_Layout_Single_Screen->setChecked(Settings::values.layout_option ==
|
|
|
|
|
Settings::LayoutOption::SingleScreen);
|
|
|
|
|
ui.action_Screen_Layout_Large_Screen->setChecked(Settings::values.layout_option ==
|
|
|
|
|
ui->action_Screen_Layout_Large_Screen->setChecked(Settings::values.layout_option ==
|
|
|
|
|
Settings::LayoutOption::LargeScreen);
|
|
|
|
|
ui.action_Screen_Layout_Side_by_Side->setChecked(Settings::values.layout_option ==
|
|
|
|
|
ui->action_Screen_Layout_Side_by_Side->setChecked(Settings::values.layout_option ==
|
|
|
|
|
Settings::LayoutOption::SideScreen);
|
|
|
|
|
ui.action_Screen_Layout_Swap_Screens->setChecked(Settings::values.swap_screen);
|
|
|
|
|
ui.action_Screen_Layout_Upright_Screens->setChecked(Settings::values.upright_screen);
|
|
|
|
|
ui->action_Screen_Layout_Swap_Screens->setChecked(Settings::values.swap_screen);
|
|
|
|
|
ui->action_Screen_Layout_Upright_Screens->setChecked(Settings::values.upright_screen);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GMainWindow::RetranslateStatusBar() {
|
|
|
|
|