@@ -122,7 +122,10 @@ void MainWindow::ShutdownControllers()

void MainWindow::InitCoreCallbacks()
{
Core::SetOnStoppedCallback([this] { emit EmulationStopped(); });
connect(&Settings::Instance(), &Settings::EmulationStateChanged, this, [=](Core::State state) {
if (state == Core::State::Uninitialized)
OnStopComplete();
});
installEventFilter(this);
m_render_widget->installEventFilter(this);
}
@@ -151,11 +154,6 @@ void MainWindow::CreateComponents()
m_log_widget = new LogWidget(this);
m_log_config_widget = new LogConfigWidget(this);

connect(this, &MainWindow::EmulationStarted, m_settings_window,
&SettingsWindow::EmulationStarted);
connect(this, &MainWindow::EmulationStopped, m_settings_window,
&SettingsWindow::EmulationStopped);

#if defined(HAVE_XRANDR) && HAVE_XRANDR
m_graphics_window = new GraphicsWindow(
new X11Utils::XRRConfiguration(
@@ -232,17 +230,9 @@ void MainWindow::ConnectMenuBar()

connect(m_menu_bar, &MenuBar::ShowAboutDialog, this, &MainWindow::ShowAboutDialog);

connect(this, &MainWindow::EmulationStarted, m_menu_bar, &MenuBar::EmulationStarted);
connect(this, &MainWindow::EmulationPaused, m_menu_bar, &MenuBar::EmulationPaused);
connect(this, &MainWindow::EmulationStopped, m_menu_bar, &MenuBar::EmulationStopped);
connect(m_game_list, &GameList::SelectionChanged, m_menu_bar, &MenuBar::SelectionChanged);
connect(this, &MainWindow::ReadOnlyModeChanged, m_menu_bar, &MenuBar::ReadOnlyModeChanged);
connect(this, &MainWindow::RecordingStatusChanged, m_menu_bar, &MenuBar::RecordingStatusChanged);

connect(this, &MainWindow::EmulationStarted, this,
[=]() { m_controllers_window->OnEmulationStateChanged(true); });
connect(this, &MainWindow::EmulationStopped, this,
[=]() { m_controllers_window->OnEmulationStateChanged(false); });
}

void MainWindow::ConnectHotkeys()
@@ -283,20 +273,12 @@ void MainWindow::ConnectToolBar()
connect(m_tool_bar, &ToolBar::SettingsPressed, this, &MainWindow::ShowSettingsWindow);
connect(m_tool_bar, &ToolBar::ControllersPressed, this, &MainWindow::ShowControllersWindow);
connect(m_tool_bar, &ToolBar::GraphicsPressed, this, &MainWindow::ShowGraphicsWindow);

connect(this, &MainWindow::EmulationStarted, m_tool_bar, &ToolBar::EmulationStarted);
connect(this, &MainWindow::EmulationPaused, m_tool_bar, &ToolBar::EmulationPaused);
connect(this, &MainWindow::EmulationStopped, m_tool_bar, &ToolBar::EmulationStopped);

connect(this, &MainWindow::EmulationStopped, this, &MainWindow::OnStopComplete);
}

void MainWindow::ConnectGameList()
{
connect(m_game_list, &GameList::GameSelected, this, &MainWindow::Play);
connect(m_game_list, &GameList::NetPlayHost, this, &MainWindow::NetPlayHost);
connect(this, &MainWindow::EmulationStarted, m_game_list, &GameList::EmulationStarted);
connect(this, &MainWindow::EmulationStopped, m_game_list, &GameList::EmulationStopped);
}

void MainWindow::ConnectRenderWidget()
@@ -340,7 +322,6 @@ void MainWindow::Play()
if (Core::GetState() == Core::State::Paused)
{
Core::SetState(Core::State::Running);
emit EmulationStarted();
}
else
{
@@ -367,7 +348,6 @@ void MainWindow::Play()
void MainWindow::Pause()
{
Core::SetState(Core::State::Paused);
emit EmulationPaused();
}

void MainWindow::OnStopComplete()
@@ -457,8 +437,7 @@ void MainWindow::Reset()

void MainWindow::FrameAdvance()
{
Movie::DoFrameStep();
EmulationPaused();
Core::DoFrameStep();
}

void MainWindow::FullScreen()
@@ -503,7 +482,6 @@ void MainWindow::StartGame(std::unique_ptr<BootParameters>&& parameters)
return;
}
ShowRenderWidget();
emit EmulationStarted();

#ifdef Q_OS_WIN
// Prevents Windows from sleeping, turning off the display, or idling
@@ -680,7 +658,6 @@ void MainWindow::NetPlayInit()
static_cast<void (MainWindow::*)(const QString&)>(&MainWindow::StartGame));
connect(m_netplay_dialog, &NetPlayDialog::Stop, this, &MainWindow::RequestStop);
connect(m_netplay_dialog, &NetPlayDialog::rejected, this, &MainWindow::NetPlayQuit);
connect(this, &MainWindow::EmulationStopped, m_netplay_dialog, &NetPlayDialog::EmulationStopped);
connect(m_netplay_setup_dialog, &NetPlaySetupDialog::Join, this, &MainWindow::NetPlayJoin);
connect(m_netplay_setup_dialog, &NetPlaySetupDialog::Host, this, &MainWindow::NetPlayHost);
}
@@ -41,9 +41,6 @@ class MainWindow final : public QMainWindow
bool eventFilter(QObject* object, QEvent* event) override;

signals:
void EmulationStarted();
void EmulationPaused();
void EmulationStopped();
void ReadOnlyModeChanged(bool read_only);
void RecordingStatusChanged(bool recording);

@@ -38,64 +38,42 @@ MenuBar::MenuBar(QWidget* parent) : QMenuBar(parent)
AddViewMenu();
AddHelpMenu();

EmulationStopped();
connect(&Settings::Instance(), &Settings::EmulationStateChanged, this,
[=](Core::State state) { OnEmulationStateChanged(state); });
OnEmulationStateChanged(Core::GetState());

connect(this, &MenuBar::SelectionChanged, this, &MenuBar::OnSelectionChanged);
connect(this, &MenuBar::RecordingStatusChanged, this, &MenuBar::OnRecordingStatusChanged);
connect(this, &MenuBar::ReadOnlyModeChanged, this, &MenuBar::OnReadOnlyModeChanged);
}

void MenuBar::EmulationStarted()
void MenuBar::OnEmulationStateChanged(Core::State state)
{
// Emulation
m_play_action->setEnabled(false);
m_play_action->setVisible(false);
m_pause_action->setEnabled(true);
m_pause_action->setVisible(true);
m_stop_action->setEnabled(true);
m_reset_action->setEnabled(true);
m_fullscreen_action->setEnabled(true);
m_frame_advance_action->setEnabled(true);
m_screenshot_action->setEnabled(true);
m_state_load_menu->setEnabled(true);
m_state_save_menu->setEnabled(true);

// Movie
m_recording_read_only->setEnabled(true);
m_recording_play->setEnabled(false);
bool running = state != Core::State::Uninitialized;
bool playing = running && state != Core::State::Paused;

UpdateStateSlotMenu();
UpdateToolsMenu(true);
}
void MenuBar::EmulationPaused()
{
m_play_action->setEnabled(true);
m_play_action->setVisible(true);
m_pause_action->setEnabled(false);
m_pause_action->setVisible(false);
}
void MenuBar::EmulationStopped()
{
// Emulation
m_play_action->setEnabled(true);
m_play_action->setVisible(true);
m_pause_action->setEnabled(false);
m_pause_action->setVisible(false);
m_stop_action->setEnabled(false);
m_reset_action->setEnabled(false);
m_fullscreen_action->setEnabled(false);
m_frame_advance_action->setEnabled(false);
m_screenshot_action->setEnabled(false);
m_state_load_menu->setEnabled(false);
m_state_save_menu->setEnabled(false);
m_play_action->setEnabled(!playing);
m_play_action->setVisible(!playing);
m_pause_action->setEnabled(playing);
m_pause_action->setVisible(playing);
m_stop_action->setEnabled(running);
m_stop_action->setVisible(running);
m_reset_action->setEnabled(running);
m_fullscreen_action->setEnabled(running);
m_frame_advance_action->setEnabled(running);
m_screenshot_action->setEnabled(running);
m_state_load_menu->setEnabled(running);
m_state_save_menu->setEnabled(running);

// Movie
m_recording_read_only->setEnabled(false);
m_recording_stop->setEnabled(false);
m_recording_play->setEnabled(false);
m_recording_read_only->setEnabled(running);
if (!running)
m_recording_stop->setEnabled(false);
m_recording_play->setEnabled(!running);

UpdateStateSlotMenu();
UpdateToolsMenu(false);
UpdateToolsMenu(running);
}

void MenuBar::AddFileMenu()
@@ -9,23 +9,25 @@
#include <QMenu>
#include <QMenuBar>

#include "DolphinQt2/GameList/GameFile.h"

namespace Core
{
enum class State;
}

namespace DiscIO
{
enum class Region;
};

#include "DolphinQt2/GameList/GameFile.h"

class MenuBar final : public QMenuBar
{
Q_OBJECT

public:
explicit MenuBar(QWidget* parent = nullptr);

void EmulationStarted();
void EmulationPaused();
void EmulationStopped();
void UpdateStateSlotMenu();
void UpdateToolsMenu(bool emulation_started);

@@ -88,6 +90,8 @@ class MenuBar final : public QMenuBar
void ReadOnlyModeChanged(bool read_only);

private:
void OnEmulationStateChanged(Core::State state);

void AddFileMenu();

void AddEmulationMenu();
@@ -188,8 +188,8 @@ void NetPlayDialog::ConnectWidgets()
}
});

connect(this, &NetPlayDialog::EmulationStopped, this, [this] {
if (isVisible())
connect(&Settings::Instance(), &Settings::EmulationStateChanged, this, [=](Core::State state) {
if (state == Core::State::Uninitialized && isVisible())
GameStatusChanged(false);
});
}
@@ -54,7 +54,6 @@ class NetPlayDialog : public QDialog, public NetPlayUI
void SetMD5Result(int pid, const std::string& result) override;
void AbortMD5() override;
signals:
void EmulationStopped();
void Boot(const QString& filename);
void Stop();

@@ -11,11 +11,16 @@
#include "Common/FileUtil.h"
#include "Common/StringUtil.h"
#include "Core/ConfigManager.h"
#include "Core/Core.h"
#include "DolphinQt2/GameList/GameListModel.h"
#include "DolphinQt2/Settings.h"
#include "InputCommon/InputConfig.h"

Settings::Settings() = default;
Settings::Settings()
{
Core::SetOnStateChangedCallback(
[this](Core::State new_state) { emit EmulationStateChanged(new_state); });
}

Settings& Settings::Instance()
{
@@ -12,6 +12,11 @@
#include "Core/NetPlayClient.h"
#include "Core/NetPlayServer.h"

namespace Core
{
enum class State;
}

namespace DiscIO
{
enum class Language;
@@ -76,6 +81,7 @@ class Settings final : public QObject
GameListModel* GetGameListModel() const;

signals:
void EmulationStateChanged(Core::State new_state);
void ThemeChanged();
void PathAdded(const QString&);
void PathRemoved(const QString&);
@@ -18,6 +18,7 @@

#include "AudioCommon/AudioCommon.h"
#include "Core/ConfigManager.h"
#include "Core/Core.h"
#include "DolphinQt2/Config/SettingsWindow.h"
#include "DolphinQt2/Settings.h"

@@ -28,6 +29,8 @@ AudioPane::AudioPane()
ConnectWidgets();

connect(&Settings::Instance(), &Settings::VolumeChanged, this, &AudioPane::OnVolumeChanged);
connect(&Settings::Instance(), &Settings::EmulationStateChanged, this,
[=](Core::State state) { OnEmulationStateChanged(state != Core::State::Uninitialized); });
}

void AudioPane::CreateWidgets()
@@ -21,15 +21,14 @@ class AudioPane final : public QWidget
public:
explicit AudioPane();

void OnEmulationStateChanged(bool running);

private:
void CreateWidgets();
void ConnectWidgets();

void LoadSettings();
void SaveSettings();

void OnEmulationStateChanged(bool running);
void OnBackendChanged();
void OnVolumeChanged(int volume);

@@ -4,6 +4,7 @@

#include <QIcon>

#include "Core/Core.h"
#include "DolphinQt2/QtUtils/ActionHelper.h"
#include "DolphinQt2/Resources.h"
#include "DolphinQt2/Settings.h"
@@ -22,40 +23,24 @@ ToolBar::ToolBar(QWidget* parent) : QToolBar(parent)
connect(&Settings::Instance(), &Settings::ThemeChanged, this, &ToolBar::UpdateIcons);
UpdateIcons();

EmulationStopped();
connect(&Settings::Instance(), &Settings::EmulationStateChanged, this,
[this](Core::State state) { OnEmulationStateChanged(state); });
OnEmulationStateChanged(Core::GetState());
}

void ToolBar::EmulationStarted()
void ToolBar::OnEmulationStateChanged(Core::State state)
{
m_play_action->setEnabled(false);
m_play_action->setVisible(false);
m_pause_action->setEnabled(true);
m_pause_action->setVisible(true);
m_stop_action->setEnabled(true);
m_stop_action->setVisible(true);
m_fullscreen_action->setEnabled(true);
m_screenshot_action->setEnabled(true);
}

void ToolBar::EmulationPaused()
{
m_play_action->setEnabled(true);
m_play_action->setVisible(true);
m_pause_action->setEnabled(false);
m_pause_action->setVisible(false);
m_stop_action->setEnabled(true);
m_stop_action->setVisible(true);
}

void ToolBar::EmulationStopped()
{
m_play_action->setEnabled(true);
m_play_action->setVisible(true);
m_pause_action->setEnabled(false);
m_pause_action->setVisible(false);
m_stop_action->setEnabled(false);
m_fullscreen_action->setEnabled(false);
m_screenshot_action->setEnabled(false);
bool running = state != Core::State::Uninitialized;
m_stop_action->setEnabled(running);
m_stop_action->setVisible(running);
m_fullscreen_action->setEnabled(running);
m_screenshot_action->setEnabled(running);

bool playing = running && state != Core::State::Paused;
m_play_action->setEnabled(!playing);
m_play_action->setVisible(!playing);
m_pause_action->setEnabled(playing);
m_pause_action->setVisible(playing);
}

void ToolBar::MakeActions()
@@ -8,18 +8,18 @@
#include <QLineEdit>
#include <QToolBar>

namespace Core
{
enum class State;
}

class ToolBar final : public QToolBar
{
Q_OBJECT

public:
explicit ToolBar(QWidget* parent = nullptr);

public slots:
void EmulationStarted();
void EmulationPaused();
void EmulationStopped();

signals:
void OpenPressed();
void PlayPressed();
@@ -33,6 +33,8 @@ public slots:
void GraphicsPressed();

private:
void OnEmulationStateChanged(Core::State state);

void MakeActions();
void UpdateIcons();

@@ -530,8 +530,9 @@ void CFrame::InitializeCoreCallbacks()
});

// Warning: this gets called from the EmuThread
Core::SetOnStoppedCallback([this] {
AddPendingEvent(wxCommandEvent{wxEVT_HOST_COMMAND, IDM_STOPPED});
Core::SetOnStateChangedCallback([this](Core::State state) {
if (state == Core::State::Uninitialized)
AddPendingEvent(wxCommandEvent{wxEVT_HOST_COMMAND, IDM_STOPPED});
});
}

@@ -446,7 +446,7 @@ void CFrame::OnFrameStep(wxCommandEvent& event)
{
bool wasPaused = Core::GetState() == Core::State::Paused;

Movie::DoFrameStep();
Core::DoFrameStep();

bool isPaused = Core::GetState() == Core::State::Paused;
if (isPaused && !wasPaused) // don't update on unpause, otherwise the status would be wrong when
@@ -179,7 +179,7 @@ void Init()
if (s_handle != nullptr)
return;

if (Core::GetState() != Core::State::Uninitialized)
if (Core::GetState() != Core::State::Uninitialized && Core::GetState() != Core::State::Starting)
{
if ((CoreTiming::GetTicks() - s_last_init) < SystemTimers::GetTicksPerSecond())
return;
@@ -195,7 +195,7 @@ void Init()
if (s_fd)
return;

if (Core::GetState() != Core::State::Uninitialized)
if (Core::GetState() != Core::State::Uninitialized && Core::GetState() != Core::State::Starting)
{
if ((CoreTiming::GetTicks() - s_last_init) < SystemTimers::GetTicksPerSecond())
return;