Qt: Add accessors for UI thread view of current game

This commit is contained in:
Stenzek 2024-01-11 18:19:27 +10:00 committed by Connor McLaughlin
parent fa00069068
commit e908bbfae6
3 changed files with 51 additions and 32 deletions

View File

@ -90,6 +90,12 @@ static bool s_use_central_widget = false;
// UI thread VM validity.
static bool s_vm_valid = false;
static bool s_vm_paused = false;
static QString s_current_title;
static QString s_current_elf_override;
static QString s_current_disc_path;
static QString s_current_disc_serial;
static quint32 s_current_disc_crc;
static quint32 s_current_running_crc;
MainWindow::MainWindow()
{
@ -898,9 +904,9 @@ void MainWindow::updateWindowTitle()
{
QString suffix(QtHost::GetAppConfigSuffix());
QString main_title(QtHost::GetAppNameAndVersion() + suffix);
QString display_title(m_current_title + suffix);
QString display_title(s_current_title + suffix);
if (!s_vm_valid || m_current_title.isEmpty())
if (!s_vm_valid || s_current_title.isEmpty())
display_title = main_title;
else if (isRenderingToMain())
main_title = display_title;
@ -1108,7 +1114,7 @@ bool MainWindow::requestShutdown(bool allow_confirm, bool allow_save_to_state, b
return true;
// If we don't have a crc, we can't save state.
allow_save_to_state &= (m_current_disc_crc != 0);
allow_save_to_state &= (s_current_disc_crc != 0);
bool save_state = allow_save_to_state && default_save_to_state;
VMLock lock(pauseAndLockVM());
@ -1407,13 +1413,13 @@ void MainWindow::onChangeDiscMenuAboutToHide()
void MainWindow::onLoadStateMenuAboutToShow()
{
m_ui.menuLoadState->clear();
populateLoadStateMenu(m_ui.menuLoadState, m_current_disc_path, m_current_disc_serial, m_current_disc_crc);
populateLoadStateMenu(m_ui.menuLoadState, s_current_disc_path, s_current_disc_serial, s_current_disc_crc);
}
void MainWindow::onSaveStateMenuAboutToShow()
{
m_ui.menuSaveState->clear();
populateSaveStateMenu(m_ui.menuSaveState, m_current_disc_serial, m_current_disc_crc);
populateSaveStateMenu(m_ui.menuSaveState, s_current_disc_serial, s_current_disc_crc);
}
void MainWindow::onStartFullscreenUITriggered()
@ -1475,36 +1481,36 @@ void MainWindow::onViewGamePropertiesActionTriggered()
return;
// prefer to use a game list entry, if we have one, that way the summary is populated
if (!m_current_disc_path.isEmpty() || !m_current_elf_override.isEmpty())
if (!s_current_disc_path.isEmpty() || !s_current_elf_override.isEmpty())
{
auto lock = GameList::GetLock();
const QString& path = (m_current_elf_override.isEmpty() ? m_current_disc_path : m_current_elf_override);
const QString& path = (s_current_elf_override.isEmpty() ? s_current_disc_path : s_current_elf_override);
const GameList::Entry* entry = GameList::GetEntryForPath(path.toUtf8().constData());
if (entry)
{
SettingsWindow::openGamePropertiesDialog(
entry, entry->title, m_current_elf_override.isEmpty() ? entry->serial : std::string(), entry->crc);
entry, entry->title, s_current_elf_override.isEmpty() ? entry->serial : std::string(), entry->crc);
return;
}
}
// open properties for the current running file (isn't in the game list)
if (m_current_disc_crc == 0)
if (s_current_disc_crc == 0)
{
QMessageBox::critical(this, tr("Game Properties"), tr("Game properties is unavailable for the current game."));
return;
}
// can't use serial for ELFs, because they might have a disc set
if (m_current_elf_override.isEmpty())
if (s_current_elf_override.isEmpty())
{
SettingsWindow::openGamePropertiesDialog(
nullptr, m_current_title.toStdString(), m_current_disc_serial.toStdString(), m_current_disc_crc);
nullptr, s_current_title.toStdString(), s_current_disc_serial.toStdString(), s_current_disc_crc);
}
else
{
SettingsWindow::openGamePropertiesDialog(
nullptr, m_current_title.toStdString(), std::string(), m_current_disc_crc);
nullptr, s_current_title.toStdString(), std::string(), s_current_disc_crc);
}
}
@ -1606,10 +1612,10 @@ void MainWindow::onToolsCoverDownloaderTriggered()
void MainWindow::onToolsEditCheatsPatchesTriggered(bool cheats)
{
if (m_current_disc_serial.isEmpty() || m_current_running_crc == 0)
if (s_current_disc_serial.isEmpty() || s_current_running_crc == 0)
return;
const std::string path = Patch::GetPnachFilename(m_current_disc_serial.toStdString(), m_current_running_crc, cheats);
const std::string path = Patch::GetPnachFilename(s_current_disc_serial.toStdString(), s_current_running_crc, cheats);
if (!FileSystem::FileExists(path.c_str()))
{
if (QMessageBox::question(this, tr("Confirm File Creation"),
@ -1876,12 +1882,12 @@ void MainWindow::onVMStopped()
void MainWindow::onGameChanged(const QString& title, const QString& elf_override, const QString& disc_path,
const QString& serial, quint32 disc_crc, quint32 crc)
{
m_current_title = title;
m_current_elf_override = elf_override;
m_current_disc_path = disc_path;
m_current_disc_serial = serial;
m_current_disc_crc = disc_crc;
m_current_running_crc = crc;
s_current_title = title;
s_current_elf_override = elf_override;
s_current_disc_path = disc_path;
s_current_disc_serial = serial;
s_current_disc_crc = disc_crc;
s_current_running_crc = crc;
updateWindowTitle();
updateGameDependentActions();
}
@ -2645,8 +2651,8 @@ void MainWindow::loadSaveStateFile(const QString& filename, const QString& state
{
if (s_vm_valid)
{
if (!filename.isEmpty() && m_current_disc_path != filename)
g_emu_thread->changeDisc(CDVD_SourceType::Iso, m_current_disc_path);
if (!filename.isEmpty() && s_current_disc_path != filename)
g_emu_thread->changeDisc(CDVD_SourceType::Iso, s_current_disc_path);
g_emu_thread->loadState(state_filename);
}
else
@ -2771,13 +2777,13 @@ void MainWindow::populateSaveStateMenu(QMenu* menu, const QString& serial, quint
void MainWindow::updateGameDependentActions()
{
const bool valid_serial_and_crc = (s_vm_valid && !m_current_disc_serial.isEmpty() && m_current_disc_crc != 0);
const bool valid_serial_and_crc = (s_vm_valid && !s_current_disc_serial.isEmpty() && s_current_disc_crc != 0);
m_ui.menuLoadState->setEnabled(valid_serial_and_crc);
m_ui.actionToolbarLoadState->setEnabled(valid_serial_and_crc);
m_ui.menuSaveState->setEnabled(valid_serial_and_crc);
m_ui.actionToolbarSaveState->setEnabled(valid_serial_and_crc);
const bool can_use_pnach = (s_vm_valid && !m_current_disc_serial.isEmpty() && m_current_running_crc != 0);
const bool can_use_pnach = (s_vm_valid && !s_current_disc_serial.isEmpty() && s_current_running_crc != 0);
m_ui.actionEditCheats->setEnabled(can_use_pnach);
m_ui.actionEditPatches->setEnabled(can_use_pnach);
m_ui.actionReloadPatches->setEnabled(s_vm_valid);
@ -2840,7 +2846,7 @@ void MainWindow::doDiscChange(CDVD_SourceType source, const QString& path)
if (reset_system)
{
// Clearing ELF override will reset the system.
if (!m_current_elf_override.isEmpty())
if (!s_current_elf_override.isEmpty())
g_emu_thread->setELFOverride(QString());
else
g_emu_thread->resetVM();
@ -2959,3 +2965,18 @@ bool QtHost::IsVMPaused()
{
return s_vm_paused;
}
const QString& QtHost::GetCurrentGameTitle()
{
return s_current_title;
}
const QString& QtHost::GetCurrentGameSerial()
{
return s_current_disc_serial;
}
const QString& QtHost::GetCurrentGamePath()
{
return s_current_disc_path;
}

View File

@ -293,13 +293,6 @@ private:
QMenu* m_settings_toolbar_menu = nullptr;
QString m_current_title;
QString m_current_elf_override;
QString m_current_disc_path;
QString m_current_disc_serial;
quint32 m_current_disc_crc;
quint32 m_current_running_crc;
bool m_display_created = false;
bool m_relative_mouse_mode = false;
bool m_hide_mouse_cursor = false;

View File

@ -283,6 +283,11 @@ namespace QtHost
bool IsVMValid();
bool IsVMPaused();
/// Accessors for game information.
const QString& GetCurrentGameTitle();
const QString& GetCurrentGameSerial();
const QString& GetCurrentGamePath();
/// Compare strings in the locale of the current UI language
int LocaleSensitiveCompare(QStringView lhs, QStringView rhs);
} // namespace QtHost