mirror of
https://github.com/RetroDECK/Duckstation.git
synced 2024-11-23 06:15:38 +00:00
Qt: Hook up cheat list menus
This commit is contained in:
parent
03f052e12e
commit
b247af535d
|
@ -25,6 +25,8 @@ GeneralSettingsWidget::GeneralSettingsWidget(QtHostInterface* host_interface, QW
|
||||||
"LoadDevicesFromSaveStates", false);
|
"LoadDevicesFromSaveStates", false);
|
||||||
SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.applyGameSettings, "Main", "ApplyGameSettings",
|
SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.applyGameSettings, "Main", "ApplyGameSettings",
|
||||||
true);
|
true);
|
||||||
|
SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.autoLoadCheats, "Main", "AutoLoadCheats",
|
||||||
|
false);
|
||||||
SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.showOSDMessages, "Display", "ShowOSDMessages",
|
SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.showOSDMessages, "Display", "ShowOSDMessages",
|
||||||
true);
|
true);
|
||||||
SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.showFPS, "Display", "ShowFPS", false);
|
SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.showFPS, "Display", "ShowFPS", false);
|
||||||
|
@ -104,7 +106,7 @@ GeneralSettingsWidget::GeneralSettingsWidget(QtHostInterface* host_interface, QW
|
||||||
"to use XInput over SDL2 for compatibility."));
|
"to use XInput over SDL2 for compatibility."));
|
||||||
|
|
||||||
// Since this one is compile-time selected, we don't put it in the .ui file.
|
// Since this one is compile-time selected, we don't put it in the .ui file.
|
||||||
int current_col = 1;
|
int current_col = 0;
|
||||||
int current_row = m_ui.formLayout_4->rowCount() - current_col;
|
int current_row = m_ui.formLayout_4->rowCount() - current_col;
|
||||||
#ifdef WITH_DISCORD_PRESENCE
|
#ifdef WITH_DISCORD_PRESENCE
|
||||||
{
|
{
|
||||||
|
|
|
@ -81,6 +81,13 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="3" column="1">
|
||||||
|
<widget class="QCheckBox" name="autoLoadCheats">
|
||||||
|
<property name="text">
|
||||||
|
<string>Automatically Load Cheats</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|
|
@ -306,6 +306,12 @@ void MainWindow::onChangeDiscFromPlaylistMenuAboutToHide()
|
||||||
m_ui.menuChangeDiscFromPlaylist->clear();
|
m_ui.menuChangeDiscFromPlaylist->clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::onCheatsMenuAboutToShow()
|
||||||
|
{
|
||||||
|
m_ui.menuCheats->clear();
|
||||||
|
m_host_interface->populateCheatsMenu(m_ui.menuCheats);
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::onRemoveDiscActionTriggered()
|
void MainWindow::onRemoveDiscActionTriggered()
|
||||||
{
|
{
|
||||||
m_host_interface->changeDisc(QString());
|
m_host_interface->changeDisc(QString());
|
||||||
|
@ -545,9 +551,11 @@ void MainWindow::updateEmulationActions(bool starting, bool running)
|
||||||
m_ui.actionReset->setDisabled(starting || !running);
|
m_ui.actionReset->setDisabled(starting || !running);
|
||||||
m_ui.actionPause->setDisabled(starting || !running);
|
m_ui.actionPause->setDisabled(starting || !running);
|
||||||
m_ui.actionChangeDisc->setDisabled(starting || !running);
|
m_ui.actionChangeDisc->setDisabled(starting || !running);
|
||||||
|
m_ui.actionCheats->setDisabled(starting || !running);
|
||||||
m_ui.actionScreenshot->setDisabled(starting || !running);
|
m_ui.actionScreenshot->setDisabled(starting || !running);
|
||||||
m_ui.actionViewSystemDisplay->setEnabled(starting || running);
|
m_ui.actionViewSystemDisplay->setEnabled(starting || running);
|
||||||
m_ui.menuChangeDisc->setDisabled(starting || !running);
|
m_ui.menuChangeDisc->setDisabled(starting || !running);
|
||||||
|
m_ui.menuCheats->setDisabled(starting || !running);
|
||||||
|
|
||||||
m_ui.actionSaveState->setDisabled(starting || !running);
|
m_ui.actionSaveState->setDisabled(starting || !running);
|
||||||
m_ui.menuSaveState->setDisabled(starting || !running);
|
m_ui.menuSaveState->setDisabled(starting || !running);
|
||||||
|
@ -622,6 +630,8 @@ void MainWindow::connectSignals()
|
||||||
&MainWindow::onChangeDiscFromPlaylistMenuAboutToShow);
|
&MainWindow::onChangeDiscFromPlaylistMenuAboutToShow);
|
||||||
connect(m_ui.menuChangeDiscFromPlaylist, &QMenu::aboutToHide, this,
|
connect(m_ui.menuChangeDiscFromPlaylist, &QMenu::aboutToHide, this,
|
||||||
&MainWindow::onChangeDiscFromPlaylistMenuAboutToHide);
|
&MainWindow::onChangeDiscFromPlaylistMenuAboutToHide);
|
||||||
|
connect(m_ui.menuCheats, &QMenu::aboutToShow, this, &MainWindow::onCheatsMenuAboutToShow);
|
||||||
|
connect(m_ui.actionCheats, &QAction::triggered, [this] { m_ui.menuCheats->exec(QCursor::pos()); });
|
||||||
connect(m_ui.actionRemoveDisc, &QAction::triggered, this, &MainWindow::onRemoveDiscActionTriggered);
|
connect(m_ui.actionRemoveDisc, &QAction::triggered, this, &MainWindow::onRemoveDiscActionTriggered);
|
||||||
connect(m_ui.actionAddGameDirectory, &QAction::triggered,
|
connect(m_ui.actionAddGameDirectory, &QAction::triggered,
|
||||||
[this]() { getSettingsDialog()->getGameListSettingsWidget()->addSearchDirectory(this); });
|
[this]() { getSettingsDialog()->getGameListSettingsWidget()->addSearchDirectory(this); });
|
||||||
|
|
|
@ -61,6 +61,7 @@ private Q_SLOTS:
|
||||||
void onChangeDiscFromGameListActionTriggered();
|
void onChangeDiscFromGameListActionTriggered();
|
||||||
void onChangeDiscFromPlaylistMenuAboutToShow();
|
void onChangeDiscFromPlaylistMenuAboutToShow();
|
||||||
void onChangeDiscFromPlaylistMenuAboutToHide();
|
void onChangeDiscFromPlaylistMenuAboutToHide();
|
||||||
|
void onCheatsMenuAboutToShow();
|
||||||
void onRemoveDiscActionTriggered();
|
void onRemoveDiscActionTriggered();
|
||||||
void onViewToolbarActionToggled(bool checked);
|
void onViewToolbarActionToggled(bool checked);
|
||||||
void onViewStatusBarActionToggled(bool checked);
|
void onViewStatusBarActionToggled(bool checked);
|
||||||
|
|
|
@ -55,6 +55,15 @@
|
||||||
<addaction name="menuChangeDiscFromPlaylist"/>
|
<addaction name="menuChangeDiscFromPlaylist"/>
|
||||||
<addaction name="actionRemoveDisc"/>
|
<addaction name="actionRemoveDisc"/>
|
||||||
</widget>
|
</widget>
|
||||||
|
<widget class="QMenu" name="menuCheats">
|
||||||
|
<property name="title">
|
||||||
|
<string>Cheats</string>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="resources/icons.qrc">
|
||||||
|
<normaloff>:/icons/actions-tools-wizard.png</normaloff>:/icons/actions-tools-wizard.png</iconset>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
<widget class="QMenu" name="menuLoadState">
|
<widget class="QMenu" name="menuLoadState">
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>Load State</string>
|
<string>Load State</string>
|
||||||
|
@ -82,6 +91,8 @@
|
||||||
<addaction name="actionPause"/>
|
<addaction name="actionPause"/>
|
||||||
<addaction name="menuChangeDisc"/>
|
<addaction name="menuChangeDisc"/>
|
||||||
<addaction name="separator"/>
|
<addaction name="separator"/>
|
||||||
|
<addaction name="menuCheats"/>
|
||||||
|
<addaction name="separator"/>
|
||||||
<addaction name="menuLoadState"/>
|
<addaction name="menuLoadState"/>
|
||||||
<addaction name="menuSaveState"/>
|
<addaction name="menuSaveState"/>
|
||||||
<addaction name="separator"/>
|
<addaction name="separator"/>
|
||||||
|
@ -203,6 +214,7 @@
|
||||||
<addaction name="actionReset"/>
|
<addaction name="actionReset"/>
|
||||||
<addaction name="actionPause"/>
|
<addaction name="actionPause"/>
|
||||||
<addaction name="actionChangeDisc"/>
|
<addaction name="actionChangeDisc"/>
|
||||||
|
<addaction name="actionCheats"/>
|
||||||
<addaction name="actionScreenshot"/>
|
<addaction name="actionScreenshot"/>
|
||||||
<addaction name="separator"/>
|
<addaction name="separator"/>
|
||||||
<addaction name="actionLoadState"/>
|
<addaction name="actionLoadState"/>
|
||||||
|
@ -385,6 +397,15 @@
|
||||||
<string>Change Disc...</string>
|
<string>Change Disc...</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
|
<action name="actionCheats">
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="resources/icons.qrc">
|
||||||
|
<normaloff>:/icons/actions-tools-wizard-32.png</normaloff>:/icons/actions-tools-wizard-32.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Cheats...</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
<action name="actionAudioSettings">
|
<action name="actionAudioSettings">
|
||||||
<property name="icon">
|
<property name="icon">
|
||||||
<iconset resource="resources/icons.qrc">
|
<iconset resource="resources/icons.qrc">
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include "common/file_system.h"
|
#include "common/file_system.h"
|
||||||
#include "common/log.h"
|
#include "common/log.h"
|
||||||
#include "common/string_util.h"
|
#include "common/string_util.h"
|
||||||
|
#include "core/cheats.h"
|
||||||
#include "core/controller.h"
|
#include "core/controller.h"
|
||||||
#include "core/gpu.h"
|
#include "core/gpu.h"
|
||||||
#include "core/system.h"
|
#include "core/system.h"
|
||||||
|
@ -27,6 +28,7 @@
|
||||||
#include <QtCore/QFile>
|
#include <QtCore/QFile>
|
||||||
#include <QtCore/QTimer>
|
#include <QtCore/QTimer>
|
||||||
#include <QtCore/QTranslator>
|
#include <QtCore/QTranslator>
|
||||||
|
#include <QtWidgets/QFileDialog>
|
||||||
#include <QtWidgets/QMenu>
|
#include <QtWidgets/QMenu>
|
||||||
#include <QtWidgets/QMessageBox>
|
#include <QtWidgets/QMessageBox>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
@ -952,6 +954,87 @@ void QtHostInterface::populatePlaylistEntryMenu(QMenu* menu)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QtHostInterface::populateCheatsMenu(QMenu* menu)
|
||||||
|
{
|
||||||
|
Assert(!isOnWorkerThread());
|
||||||
|
if (!System::IsValid())
|
||||||
|
return;
|
||||||
|
|
||||||
|
const bool has_cheat_list = System::HasCheatList();
|
||||||
|
|
||||||
|
QAction* action = menu->addAction(tr("&Load Cheats..."));
|
||||||
|
connect(action, &QAction::triggered, [this]() {
|
||||||
|
QString filename = QFileDialog::getOpenFileName(m_main_window, tr("Select Cheat File"), QString(),
|
||||||
|
tr("PCSXR/Libretro Cheat Files (*.cht);;All Files (*.*)"));
|
||||||
|
if (!filename.isEmpty())
|
||||||
|
loadCheatList(filename);
|
||||||
|
});
|
||||||
|
|
||||||
|
action = menu->addAction(tr("&Save Cheats..."));
|
||||||
|
action->setEnabled(has_cheat_list);
|
||||||
|
connect(action, &QAction::triggered, [this]() {
|
||||||
|
QString filename = QFileDialog::getSaveFileName(m_main_window, tr("Select Cheat File"), QString(),
|
||||||
|
tr("PCSXR/Libretro Cheat Files (*.cht);;All Files (*.*)"));
|
||||||
|
if (!filename.isEmpty())
|
||||||
|
SaveCheatList(filename.toUtf8().constData());
|
||||||
|
});
|
||||||
|
|
||||||
|
QMenu* enabled_menu = menu->addMenu(tr("&Enabled Cheats"));
|
||||||
|
enabled_menu->setEnabled(has_cheat_list);
|
||||||
|
QMenu* apply_menu = menu->addMenu(tr("&Apply Cheats"));
|
||||||
|
apply_menu->setEnabled(has_cheat_list);
|
||||||
|
if (has_cheat_list)
|
||||||
|
{
|
||||||
|
CheatList* cl = System::GetCheatList();
|
||||||
|
for (u32 i = 0; i < cl->GetCodeCount(); i++)
|
||||||
|
{
|
||||||
|
CheatCode& cc = cl->GetCode(i);
|
||||||
|
QString desc(QString::fromStdString(cc.description));
|
||||||
|
action = enabled_menu->addAction(desc);
|
||||||
|
action->setCheckable(true);
|
||||||
|
action->setChecked(cc.enabled);
|
||||||
|
connect(action, &QAction::toggled, [this, i](bool enabled) { setCheatEnabled(i, enabled); });
|
||||||
|
|
||||||
|
action = apply_menu->addAction(desc);
|
||||||
|
connect(action, &QAction::triggered, [this, i]() { applyCheat(i); });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void QtHostInterface::loadCheatList(const QString& filename)
|
||||||
|
{
|
||||||
|
if (!isOnWorkerThread())
|
||||||
|
{
|
||||||
|
QMetaObject::invokeMethod(this, "loadCheatList", Qt::QueuedConnection, Q_ARG(const QString&, filename));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
LoadCheatList(filename.toUtf8().constData());
|
||||||
|
}
|
||||||
|
|
||||||
|
void QtHostInterface::setCheatEnabled(quint32 index, bool enabled)
|
||||||
|
{
|
||||||
|
if (!isOnWorkerThread())
|
||||||
|
{
|
||||||
|
QMetaObject::invokeMethod(this, "setCheatEnabled", Qt::QueuedConnection, Q_ARG(quint32, index),
|
||||||
|
Q_ARG(bool, enabled));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetCheatCodeState(index, enabled, g_settings.auto_load_cheats);
|
||||||
|
}
|
||||||
|
|
||||||
|
void QtHostInterface::applyCheat(u32 index)
|
||||||
|
{
|
||||||
|
if (!isOnWorkerThread())
|
||||||
|
{
|
||||||
|
QMetaObject::invokeMethod(this, "applyCheat", Qt::QueuedConnection, Q_ARG(quint32, index));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ApplyCheatCode(index);
|
||||||
|
}
|
||||||
|
|
||||||
void QtHostInterface::loadState(const QString& filename)
|
void QtHostInterface::loadState(const QString& filename)
|
||||||
{
|
{
|
||||||
if (!isOnWorkerThread())
|
if (!isOnWorkerThread())
|
||||||
|
|
|
@ -90,6 +90,9 @@ public:
|
||||||
/// Fills menu with the current playlist entries. The disc index is marked as checked.
|
/// Fills menu with the current playlist entries. The disc index is marked as checked.
|
||||||
void populatePlaylistEntryMenu(QMenu* menu);
|
void populatePlaylistEntryMenu(QMenu* menu);
|
||||||
|
|
||||||
|
/// Fills menu with the current cheat options.
|
||||||
|
void populateCheatsMenu(QMenu* menu);
|
||||||
|
|
||||||
ALWAYS_INLINE QString getSavePathForInputProfile(const QString& name) const
|
ALWAYS_INLINE QString getSavePathForInputProfile(const QString& name) const
|
||||||
{
|
{
|
||||||
return QString::fromStdString(GetSavePathForInputProfile(name.toUtf8().constData()));
|
return QString::fromStdString(GetSavePathForInputProfile(name.toUtf8().constData()));
|
||||||
|
@ -158,6 +161,9 @@ public Q_SLOTS:
|
||||||
void saveScreenshot();
|
void saveScreenshot();
|
||||||
void redrawDisplayWindow();
|
void redrawDisplayWindow();
|
||||||
void toggleFullscreen();
|
void toggleFullscreen();
|
||||||
|
void loadCheatList(const QString& filename);
|
||||||
|
void setCheatEnabled(quint32 index, bool enabled);
|
||||||
|
void applyCheat(quint32 index);
|
||||||
|
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void doStopThread();
|
void doStopThread();
|
||||||
|
|
BIN
src/duckstation-qt/resources/icons/actions-tools-wizard-32.png
Normal file
BIN
src/duckstation-qt/resources/icons/actions-tools-wizard-32.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.1 KiB |
Binary file not shown.
After Width: | Height: | Size: 5.8 KiB |
BIN
src/duckstation-qt/resources/icons/actions-tools-wizard.png
Normal file
BIN
src/duckstation-qt/resources/icons/actions-tools-wizard.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 762 B |
BIN
src/duckstation-qt/resources/icons/actions-tools-wizard@2x.png
Normal file
BIN
src/duckstation-qt/resources/icons/actions-tools-wizard@2x.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.1 KiB |
|
@ -19,6 +19,10 @@
|
||||||
<file>icons/star-4.png</file>
|
<file>icons/star-4.png</file>
|
||||||
<file>icons/star-5.png</file>
|
<file>icons/star-5.png</file>
|
||||||
<file>icons/address-book-new-22.png</file>
|
<file>icons/address-book-new-22.png</file>
|
||||||
|
<file>icons/actions-tools-wizard.png</file>
|
||||||
|
<file>icons/actions-tools-wizard@2x.png</file>
|
||||||
|
<file>icons/actions-tools-wizard-32.png</file>
|
||||||
|
<file>icons/actions-tools-wizard-32@2x.png</file>
|
||||||
<file>icons/applications-internet.png</file>
|
<file>icons/applications-internet.png</file>
|
||||||
<file>icons/system-search.png</file>
|
<file>icons/system-search.png</file>
|
||||||
<file>icons/list-add.png</file>
|
<file>icons/list-add.png</file>
|
||||||
|
|
Loading…
Reference in a new issue