Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
stenzek
GitHub Repository: stenzek/duckstation
Path: blob/master/src/duckstation-qt/advancedsettingswidget.cpp
7411 views
1
// SPDX-FileCopyrightText: 2019-2026 Connor McLaughlin <[email protected]>
2
// SPDX-License-Identifier: CC-BY-NC-ND-4.0
3
4
#include "advancedsettingswidget.h"
5
#include "logwindow.h"
6
#include "mainwindow.h"
7
#include "qtutils.h"
8
#include "settingswindow.h"
9
#include "settingwidgetbinder.h"
10
11
#include "core/gpu_types.h"
12
13
#include <QtGui/QCursor>
14
#include <QtWidgets/QMenu>
15
16
#include "moc_advancedsettingswidget.cpp"
17
18
using namespace Qt::StringLiterals;
19
20
static QCheckBox* addBooleanTweakOption(SettingsWindow* dialog, QTableWidget* table, QString name, std::string section,
21
std::string key, bool default_value)
22
{
23
const int row = table->rowCount();
24
25
table->insertRow(row);
26
27
QTableWidgetItem* name_item = new QTableWidgetItem(name);
28
name_item->setFlags(name_item->flags() & ~(Qt::ItemIsEditable | Qt::ItemIsSelectable));
29
table->setItem(row, 0, name_item);
30
31
QCheckBox* cb = new QCheckBox(table);
32
if (!section.empty() || !key.empty())
33
{
34
SettingWidgetBinder::BindWidgetToBoolSetting(dialog->getSettingsInterface(), cb, std::move(section), std::move(key),
35
default_value);
36
}
37
38
table->setCellWidget(row, 1, cb);
39
return cb;
40
}
41
42
static QCheckBox* setBooleanTweakOption(QTableWidget* table, int row, bool value)
43
{
44
QWidget* widget = table->cellWidget(row, 1);
45
QCheckBox* cb = qobject_cast<QCheckBox*>(widget);
46
Assert(cb);
47
cb->setChecked(value);
48
return cb;
49
}
50
51
static QSpinBox* addIntRangeTweakOption(SettingsWindow* dialog, QTableWidget* table, QString name, std::string section,
52
std::string key, int min_value, int max_value, int default_value,
53
const QString& suffix = QString())
54
{
55
const int row = table->rowCount();
56
57
table->insertRow(row);
58
59
QTableWidgetItem* name_item = new QTableWidgetItem(name);
60
name_item->setFlags(name_item->flags() & ~(Qt::ItemIsEditable | Qt::ItemIsSelectable));
61
table->setItem(row, 0, name_item);
62
63
QSpinBox* cb = new QSpinBox(table);
64
cb->setMinimum(min_value);
65
cb->setMaximum(max_value);
66
if (!suffix.isEmpty())
67
cb->setSuffix(suffix);
68
69
if (!section.empty() || !key.empty())
70
{
71
SettingWidgetBinder::BindWidgetToIntSetting(dialog->getSettingsInterface(), cb, std::move(section), std::move(key),
72
default_value);
73
}
74
75
table->setCellWidget(row, 1, cb);
76
return cb;
77
}
78
79
static QSpinBox* setIntRangeTweakOption(QTableWidget* table, int row, int value)
80
{
81
QWidget* widget = table->cellWidget(row, 1);
82
QSpinBox* cb = qobject_cast<QSpinBox*>(widget);
83
Assert(cb);
84
cb->setValue(value);
85
return cb;
86
}
87
88
template<typename T>
89
static QComboBox* addChoiceTweakOption(SettingsWindow* dialog, QTableWidget* table, QString name, std::string section,
90
std::string key, std::optional<T> (*parse_callback)(const char*),
91
const char* (*get_value_callback)(T), const char* (*get_display_callback)(T),
92
u32 num_values, T default_value)
93
{
94
const int row = table->rowCount();
95
96
table->insertRow(row);
97
98
QTableWidgetItem* name_item = new QTableWidgetItem(name);
99
name_item->setFlags(name_item->flags() & ~(Qt::ItemIsEditable | Qt::ItemIsSelectable));
100
table->setItem(row, 0, name_item);
101
102
QComboBox* cb = new QComboBox(table);
103
for (u32 i = 0; i < num_values; i++)
104
cb->addItem(QString::fromUtf8(get_display_callback(static_cast<T>(i))));
105
106
if (!section.empty() || !key.empty())
107
{
108
SettingWidgetBinder::BindWidgetToEnumSetting(dialog->getSettingsInterface(), cb, std::move(section), std::move(key),
109
parse_callback, get_value_callback, default_value);
110
}
111
112
table->setCellWidget(row, 1, cb);
113
return cb;
114
}
115
116
template<typename T>
117
static void setChoiceTweakOption(QTableWidget* table, int row, T value)
118
{
119
QWidget* widget = table->cellWidget(row, 1);
120
QComboBox* cb = qobject_cast<QComboBox*>(widget);
121
Assert(cb);
122
cb->setCurrentIndex(static_cast<int>(value));
123
}
124
125
static void addDirectoryOption(SettingsWindow* dialog, QTableWidget* table, const QString& name, std::string section,
126
std::string key)
127
{
128
const int row = table->rowCount();
129
130
table->insertRow(row);
131
132
QTableWidgetItem* name_item = new QTableWidgetItem(name);
133
name_item->setFlags(name_item->flags() & ~(Qt::ItemIsEditable | Qt::ItemIsSelectable));
134
table->setItem(row, 0, name_item);
135
136
QWidget* container = new QWidget(table);
137
138
QHBoxLayout* layout = new QHBoxLayout(container);
139
layout->setContentsMargins(0, 0, 0, 0);
140
141
QLineEdit* value = new QLineEdit(container);
142
value->setObjectName("value"_L1);
143
SettingWidgetBinder::BindWidgetToStringSetting(dialog->getSettingsInterface(), value, std::move(section),
144
std::move(key));
145
layout->addWidget(value, 1);
146
147
QPushButton* browse = new QPushButton(container);
148
browse->setText("..."_L1);
149
browse->setMaximumWidth(32);
150
QObject::connect(browse, &QPushButton::clicked, browse, [browse, value, name]() {
151
const QString path(QDir::toNativeSeparators(QFileDialog::getExistingDirectory(
152
browse, qApp->translate("AdvancedSettingsWidget", "Select folder for %1").arg(name), value->text())));
153
if (!path.isEmpty())
154
value->setText(path);
155
});
156
layout->addWidget(browse, 0);
157
158
table->setCellWidget(row, 1, container);
159
}
160
161
static void setDirectoryOption(QTableWidget* table, int row, const char* value)
162
{
163
QWidget* widget = table->cellWidget(row, 1);
164
Assert(widget);
165
QLineEdit* valuew = widget->findChild<QLineEdit*>("value"_L1);
166
Assert(valuew);
167
valuew->setText(QString::fromUtf8(value));
168
}
169
170
AdvancedSettingsWidget::AdvancedSettingsWidget(SettingsWindow* dialog, QWidget* parent)
171
: QWidget(parent), m_dialog(dialog)
172
{
173
SettingsInterface* sif = dialog->getSettingsInterface();
174
175
m_ui.setupUi(this);
176
177
for (u32 i = 0; i < static_cast<u32>(Log::Level::MaxCount); i++)
178
m_ui.logLevel->addItem(QString::fromUtf8(Settings::GetLogLevelDisplayName(static_cast<Log::Level>(i))));
179
180
SettingWidgetBinder::BindWidgetToEnumSetting(sif, m_ui.logLevel, "Logging", "LogLevel", &Settings::ParseLogLevelName,
181
&Settings::GetLogLevelName, Log::DEFAULT_LOG_LEVEL);
182
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.logToConsole, "Logging", "LogToConsole", false);
183
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.logToDebug, "Logging", "LogToDebug", false);
184
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.logToWindow, "Logging", "LogToWindow", false);
185
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.logToFile, "Logging", "LogToFile", false);
186
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.logTimestamps, "Logging", "LogTimestamps", true);
187
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.logFileTimestamps, "Logging", "LogFileTimestamps", false);
188
connect(m_ui.logToConsole, &QCheckBox::checkStateChanged, this, &AdvancedSettingsWidget::onAnyLogSinksChanged);
189
connect(m_ui.logToWindow, &QCheckBox::checkStateChanged, this, &AdvancedSettingsWidget::onAnyLogSinksChanged);
190
connect(m_ui.logToFile, &QCheckBox::checkStateChanged, this, &AdvancedSettingsWidget::onAnyLogSinksChanged);
191
onAnyLogSinksChanged(); // initialize enabled/disabled state of checkboxes
192
193
connect(m_ui.logChannels, &QAbstractButton::clicked, this, &AdvancedSettingsWidget::onLogChannelsButtonClicked);
194
195
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.showDebugMenu, "Main", "ShowDebugMenu", false);
196
connect(m_ui.showDebugMenu, &QCheckBox::checkStateChanged, g_main_window, &MainWindow::updateDebugMenuVisibility,
197
Qt::QueuedConnection);
198
connect(m_ui.showDebugMenu, &QCheckBox::checkStateChanged, this,
199
&AdvancedSettingsWidget::onShowDebugOptionsStateChanged);
200
201
connect(m_ui.resetToDefaultButton, &QPushButton::clicked, this, &AdvancedSettingsWidget::onResetToDefaultClicked);
202
203
m_ui.tweakOptionTable->setColumnWidth(0, 380);
204
m_ui.tweakOptionTable->setColumnWidth(1, 170);
205
206
addTweakOptions();
207
208
dialog->registerWidgetHelp(m_ui.logLevel, tr("Log Level"), tr("Information"),
209
tr("Sets the verbosity of messages logged. Higher levels will log more messages."));
210
dialog->registerWidgetHelp(m_ui.logToConsole, tr("Log To System Console"), tr("User Preference"),
211
tr("Logs messages to the console window."));
212
dialog->registerWidgetHelp(m_ui.logToDebug, tr("Log To Debug Console"), tr("User Preference"),
213
tr("Logs messages to the debug console where supported."));
214
dialog->registerWidgetHelp(m_ui.logToWindow, tr("Log To Window"), tr("User Preference"),
215
tr("Logs messages to the window."));
216
dialog->registerWidgetHelp(m_ui.logToFile, tr("Log To File"), tr("User Preference"),
217
tr("Logs messages to duckstation.log in the user directory."));
218
dialog->registerWidgetHelp(m_ui.logTimestamps, tr("Log Timestamps"), tr("User Preference"),
219
tr("Includes the elapsed time since the application start in window and console logs."));
220
dialog->registerWidgetHelp(m_ui.logFileTimestamps, tr("Log File Timestamps"), tr("User Preference"),
221
tr("Includes the elapsed time since the application start in file logs."));
222
dialog->registerWidgetHelp(m_ui.showDebugMenu, tr("Show Debug Menu"), tr("Unchecked"),
223
tr("Shows a debug menu bar with additional statistics and quick settings."));
224
}
225
226
AdvancedSettingsWidget::~AdvancedSettingsWidget() = default;
227
228
void AdvancedSettingsWidget::onLogChannelsButtonClicked()
229
{
230
QMenu* const menu = QtUtils::NewPopupMenu(this);
231
LogWindow::populateFilterMenu(menu);
232
menu->popup(QCursor::pos());
233
}
234
235
void AdvancedSettingsWidget::onAnyLogSinksChanged()
236
{
237
const bool log_to_console = m_dialog->getEffectiveBoolValue("Logging", "LogToConsole", false);
238
const bool log_to_window = m_dialog->getEffectiveBoolValue("Logging", "LogToWindow", false);
239
const bool log_to_file = m_dialog->getEffectiveBoolValue("Logging", "LogToFile", false);
240
241
m_ui.logTimestamps->setEnabled(log_to_console || log_to_window);
242
m_ui.logFileTimestamps->setEnabled(log_to_file);
243
}
244
245
void AdvancedSettingsWidget::onShowDebugOptionsStateChanged()
246
{
247
const bool enabled = QtHost::ShouldShowDebugOptions();
248
emit onShowDebugOptionsChanged(enabled);
249
}
250
251
void AdvancedSettingsWidget::addTweakOptions()
252
{
253
if (!m_dialog->isPerGameSettings())
254
{
255
addBooleanTweakOption(m_dialog, m_ui.tweakOptionTable, tr("Apply Game Settings"), "Main", "ApplyGameSettings",
256
true);
257
}
258
259
addBooleanTweakOption(m_dialog, m_ui.tweakOptionTable, tr("Apply Compatibility Settings"), "Main",
260
"ApplyCompatibilitySettings", true);
261
addBooleanTweakOption(m_dialog, m_ui.tweakOptionTable, tr("Load Devices From Save States"), "Main",
262
"LoadDevicesFromSaveStates", false);
263
addBooleanTweakOption(m_dialog, m_ui.tweakOptionTable, tr("Pause On Start"), "Main", "StartPaused", false);
264
addChoiceTweakOption(m_dialog, m_ui.tweakOptionTable, tr("Save State Compression"), "Main", "SaveStateCompression",
265
&Settings::ParseSaveStateCompressionModeName, &Settings::GetSaveStateCompressionModeName,
266
&Settings::GetSaveStateCompressionModeDisplayName,
267
static_cast<u32>(SaveStateCompressionMode::Count),
268
Settings::DEFAULT_SAVE_STATE_COMPRESSION_MODE);
269
270
if (m_dialog->isPerGameSettings())
271
{
272
addIntRangeTweakOption(m_dialog, m_ui.tweakOptionTable, tr("Display Active Start Offset"), "Display",
273
"ActiveStartOffset", -5000, 5000, 0);
274
addIntRangeTweakOption(m_dialog, m_ui.tweakOptionTable, tr("Display Active End Offset"), "Display",
275
"ActiveEndOffset", -5000, 5000, 0);
276
addIntRangeTweakOption(m_dialog, m_ui.tweakOptionTable, tr("Display Line Start Offset"), "Display",
277
"LineStartOffset", -128, 127, 0);
278
addIntRangeTweakOption(m_dialog, m_ui.tweakOptionTable, tr("Display Line End Offset"), "Display", "LineEndOffset",
279
-128, 127, 0);
280
}
281
282
addIntRangeTweakOption(m_dialog, m_ui.tweakOptionTable, tr("DMA Max Slice Ticks"), "Hacks", "DMAMaxSliceTicks", 1,
283
10000, Settings::DEFAULT_DMA_MAX_SLICE_TICKS, tr(" cycles"));
284
addIntRangeTweakOption(m_dialog, m_ui.tweakOptionTable, tr("DMA Halt Ticks"), "Hacks", "DMAHaltTicks", 1, 10000,
285
Settings::DEFAULT_DMA_HALT_TICKS, tr(" cycles"));
286
addIntRangeTweakOption(m_dialog, m_ui.tweakOptionTable, tr("GPU FIFO Size"), "Hacks", "GPUFIFOSize", 16, 4096,
287
Settings::DEFAULT_GPU_FIFO_SIZE, tr(" words"));
288
addIntRangeTweakOption(m_dialog, m_ui.tweakOptionTable, tr("GPU Max Runahead"), "Hacks", "GPUMaxRunAhead", 0, 1000,
289
Settings::DEFAULT_GPU_MAX_RUN_AHEAD, tr(" cycles"));
290
291
addBooleanTweakOption(m_dialog, m_ui.tweakOptionTable, tr("Enable Recompiler Memory Exceptions"), "CPU",
292
"RecompilerMemoryExceptions", false);
293
addBooleanTweakOption(m_dialog, m_ui.tweakOptionTable, tr("Enable Recompiler Block Linking"), "CPU",
294
"RecompilerBlockLinking", true);
295
addChoiceTweakOption(m_dialog, m_ui.tweakOptionTable, tr("Enable Recompiler Fast Memory Access"), "CPU",
296
"FastmemMode", Settings::ParseCPUFastmemMode, Settings::GetCPUFastmemModeName,
297
Settings::GetCPUFastmemModeDisplayName, static_cast<u32>(CPUFastmemMode::Count),
298
Settings::DEFAULT_CPU_FASTMEM_MODE);
299
300
addChoiceTweakOption(m_dialog, m_ui.tweakOptionTable, tr("CD-ROM Mechacon Version"), "CDROM", "MechaconVersion",
301
Settings::ParseCDROMMechVersionName, Settings::GetCDROMMechVersionName,
302
Settings::GetCDROMMechVersionDisplayName, static_cast<u8>(CDROMMechaconVersion::Count),
303
Settings::DEFAULT_CDROM_MECHACON_VERSION);
304
addIntRangeTweakOption(m_dialog, m_ui.tweakOptionTable, tr("CD-ROM Readahead Sectors"), "CDROM", "ReadaheadSectors",
305
0, 32, Settings::DEFAULT_CDROM_READAHEAD_SECTORS, tr(" sectors"));
306
addIntRangeTweakOption(m_dialog, m_ui.tweakOptionTable, tr("CD-ROM Max Read Speedup Cycles"), "CDROM",
307
"MaxReadSpeedupCycles", 1, 1000000, Settings::DEFAULT_CDROM_MAX_READ_SPEEDUP_CYCLES,
308
tr(" cycles"));
309
addIntRangeTweakOption(m_dialog, m_ui.tweakOptionTable, tr("CD-ROM Max Seek Speedup Cycles"), "CDROM",
310
"MaxSeekSpeedupCycles", 1, 1000000, Settings::DEFAULT_CDROM_MAX_SEEK_SPEEDUP_CYCLES,
311
tr(" cycles"));
312
addBooleanTweakOption(m_dialog, m_ui.tweakOptionTable, tr("CD-ROM Disable Speedup on MDEC"), "CDROM",
313
"DisableSpeedupOnMDEC", false);
314
addBooleanTweakOption(m_dialog, m_ui.tweakOptionTable, tr("CD-ROM Region Check"), "CDROM", "RegionCheck", false);
315
addBooleanTweakOption(m_dialog, m_ui.tweakOptionTable, tr("CD-ROM SubQ Skew"), "CDROM", "SubQSkew", false);
316
addBooleanTweakOption(m_dialog, m_ui.tweakOptionTable, tr("Allow Booting Without SBI File"), "CDROM",
317
"AllowBootingWithoutSBIFile", false);
318
319
addBooleanTweakOption(m_dialog, m_ui.tweakOptionTable, tr("Enable GDB Server"), "Debug", "EnableGDBServer", false);
320
addIntRangeTweakOption(m_dialog, m_ui.tweakOptionTable, tr("GDB Server Port"), "Debug", "GDBServerPort", 1, 65535,
321
Settings::DEFAULT_GDB_SERVER_PORT);
322
323
addBooleanTweakOption(m_dialog, m_ui.tweakOptionTable, tr("Export Shared Memory"), "Hacks", "ExportSharedMemory",
324
false);
325
addBooleanTweakOption(m_dialog, m_ui.tweakOptionTable, tr("Redirect SIO to TTY"), "SIO", "RedirectToTTY", false);
326
addBooleanTweakOption(m_dialog, m_ui.tweakOptionTable, tr("Enable PCDrv"), "PCDrv", "Enabled", false);
327
addBooleanTweakOption(m_dialog, m_ui.tweakOptionTable, tr("Enable PCDrv Writes"), "PCDrv", "EnableWrites", false);
328
addDirectoryOption(m_dialog, m_ui.tweakOptionTable, tr("PCDrv Root Directory"), "PCDrv", "Root");
329
}
330
331
void AdvancedSettingsWidget::onResetToDefaultClicked()
332
{
333
if (!m_dialog->isPerGameSettings())
334
{
335
int i = 0;
336
337
setBooleanTweakOption(m_ui.tweakOptionTable, i++, true); // Apply Game Settings
338
setBooleanTweakOption(m_ui.tweakOptionTable, i++, true); // Apply Compatibility settings
339
setBooleanTweakOption(m_ui.tweakOptionTable, i++, false); // Pause On Start
340
setBooleanTweakOption(m_ui.tweakOptionTable, i++, false); // Load Devices From Save States
341
setChoiceTweakOption(m_ui.tweakOptionTable, i++,
342
Settings::DEFAULT_SAVE_STATE_COMPRESSION_MODE); // Save State Compression
343
setIntRangeTweakOption(m_ui.tweakOptionTable, i++,
344
static_cast<int>(Settings::DEFAULT_DMA_MAX_SLICE_TICKS)); // DMA max slice ticks
345
setIntRangeTweakOption(m_ui.tweakOptionTable, i++,
346
static_cast<int>(Settings::DEFAULT_DMA_HALT_TICKS)); // DMA halt ticks
347
setIntRangeTweakOption(m_ui.tweakOptionTable, i++,
348
static_cast<int>(Settings::DEFAULT_GPU_FIFO_SIZE)); // GPU FIFO size
349
setIntRangeTweakOption(m_ui.tweakOptionTable, i++,
350
static_cast<int>(Settings::DEFAULT_GPU_MAX_RUN_AHEAD)); // GPU max runahead
351
setBooleanTweakOption(m_ui.tweakOptionTable, i++, false); // Recompiler memory exceptions
352
setBooleanTweakOption(m_ui.tweakOptionTable, i++, true); // Recompiler block linking
353
setChoiceTweakOption(m_ui.tweakOptionTable, i++,
354
Settings::DEFAULT_CPU_FASTMEM_MODE); // Recompiler fastmem mode
355
setChoiceTweakOption(m_ui.tweakOptionTable, i++,
356
Settings::DEFAULT_CDROM_MECHACON_VERSION); // CDROM Mechacon Version
357
setIntRangeTweakOption(m_ui.tweakOptionTable, i++,
358
Settings::DEFAULT_CDROM_READAHEAD_SECTORS); // CD-ROM Readahead Sectors
359
setIntRangeTweakOption(m_ui.tweakOptionTable, i++,
360
Settings::DEFAULT_CDROM_MAX_READ_SPEEDUP_CYCLES); // CD-ROM Max Speedup Read Cycles
361
setIntRangeTweakOption(m_ui.tweakOptionTable, i++,
362
Settings::DEFAULT_CDROM_MAX_SEEK_SPEEDUP_CYCLES); // CD-ROM Max Speedup Seek Cycles
363
setBooleanTweakOption(m_ui.tweakOptionTable, i++, false); // CDROM Disable Speedup on MDEC
364
setBooleanTweakOption(m_ui.tweakOptionTable, i++, false); // CDROM Region Check
365
setBooleanTweakOption(m_ui.tweakOptionTable, i++, false); // CDROM SubQ Skew
366
setBooleanTweakOption(m_ui.tweakOptionTable, i++, false); // Allow booting without SBI file
367
setBooleanTweakOption(m_ui.tweakOptionTable, i++, false); // Enable GDB Server
368
setIntRangeTweakOption(m_ui.tweakOptionTable, i++, Settings::DEFAULT_GDB_SERVER_PORT); // GDB Server Port
369
setBooleanTweakOption(m_ui.tweakOptionTable, i++, false); // Export Shared Memory
370
setBooleanTweakOption(m_ui.tweakOptionTable, i++, false); // Redirect SIO to TTY
371
setBooleanTweakOption(m_ui.tweakOptionTable, i++, false); // Enable PCDRV
372
setBooleanTweakOption(m_ui.tweakOptionTable, i++, false); // Enable PCDRV Writes
373
setDirectoryOption(m_ui.tweakOptionTable, i++, ""); // PCDrv Root Directory
374
375
return;
376
}
377
378
// for per-game it's easier to just clear and recreate
379
INISettingsInterface* sif = m_dialog->getSettingsInterface();
380
sif->DeleteValue("Main", "ApplyCompatibilitySettings");
381
sif->DeleteValue("Main", "LoadDevicesFromSaveStates");
382
sif->DeleteValue("Main", "PauseOnStart");
383
sif->DeleteValue("Main", "CompressSaveStates");
384
sif->DeleteValue("Display", "ActiveStartOffset");
385
sif->DeleteValue("Display", "ActiveEndOffset");
386
sif->DeleteValue("Display", "LineStartOffset");
387
sif->DeleteValue("Display", "LineEndOffset");
388
sif->DeleteValue("Hacks", "DMAMaxSliceTicks");
389
sif->DeleteValue("Hacks", "DMAHaltTicks");
390
sif->DeleteValue("Hacks", "GPUFIFOSize");
391
sif->DeleteValue("Hacks", "GPUMaxRunAhead");
392
sif->DeleteValue("Hacks", "ExportSharedMemory");
393
sif->DeleteValue("CPU", "RecompilerMemoryExceptions");
394
sif->DeleteValue("CPU", "RecompilerBlockLinking");
395
sif->DeleteValue("CPU", "FastmemMode");
396
sif->DeleteValue("CDROM", "MechaconVersion");
397
sif->DeleteValue("CDROM", "ReadaheadSectors");
398
sif->DeleteValue("CDROM", "MaxReadSpeedupCycles");
399
sif->DeleteValue("CDROM", "MaxSeekSpeedupCycles");
400
sif->DeleteValue("CDROM", "DisableSpeedupOnMDEC");
401
sif->DeleteValue("CDROM", "RegionCheck");
402
sif->DeleteValue("CDROM", "SubQSkew");
403
sif->DeleteValue("CDROM", "AllowBootingWithoutSBIFile");
404
sif->DeleteValue("Debug", "EnableGDBServer");
405
sif->DeleteValue("Debug", "GDBServerPort");
406
sif->DeleteValue("SIO", "RedirectToTTY");
407
sif->DeleteValue("PCDrv", "Enabled");
408
sif->DeleteValue("PCDrv", "EnableWrites");
409
sif->DeleteValue("PCDrv", "Root");
410
QtHost::SaveGameSettings(sif, true);
411
g_core_thread->reloadGameSettings();
412
while (m_ui.tweakOptionTable->rowCount() > 0)
413
m_ui.tweakOptionTable->removeRow(m_ui.tweakOptionTable->rowCount() - 1);
414
addTweakOptions();
415
}
416
417