all repos — mgba @ 16ba5bd05ff423ba9bc98cb7615140b01ff49bd2

mGBA Game Boy Advance Emulator

src/platform/qt/SettingsView.cpp (view raw)

  1/* Copyright (c) 2013-2014 Jeffrey Pfau
  2 *
  3 * This Source Code Form is subject to the terms of the Mozilla Public
  4 * License, v. 2.0. If a copy of the MPL was not distributed with this
  5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  6#include "SettingsView.h"
  7
  8#include "AudioProcessor.h"
  9#include "ConfigController.h"
 10#include "Display.h"
 11#include "GBAApp.h"
 12#include "GBAKeyEditor.h"
 13#include "InputController.h"
 14#include "ShortcutView.h"
 15
 16using namespace QGBA;
 17
 18SettingsView::SettingsView(ConfigController* controller, InputController* inputController, ShortcutController* shortcutController, QWidget* parent)
 19	: QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint)
 20	, m_controller(controller)
 21{
 22	m_ui.setupUi(this);
 23
 24	loadSetting("bios", m_ui.bios);
 25	loadSetting("useBios", m_ui.useBios);
 26	loadSetting("skipBios", m_ui.skipBios);
 27	loadSetting("audioBuffers", m_ui.audioBufferSize);
 28	loadSetting("sampleRate", m_ui.sampleRate);
 29	loadSetting("videoSync", m_ui.videoSync);
 30	loadSetting("audioSync", m_ui.audioSync);
 31	loadSetting("frameskip", m_ui.frameskip);
 32	loadSetting("fpsTarget", m_ui.fpsTarget);
 33	loadSetting("lockAspectRatio", m_ui.lockAspectRatio);
 34	loadSetting("volume", m_ui.volume);
 35	loadSetting("mute", m_ui.mute);
 36	loadSetting("rewindEnable", m_ui.rewind);
 37	loadSetting("rewindBufferInterval", m_ui.rewindInterval);
 38	loadSetting("rewindBufferCapacity", m_ui.rewindCapacity);
 39	loadSetting("resampleVideo", m_ui.resampleVideo);
 40	loadSetting("allowOpposingDirections", m_ui.allowOpposingDirections);
 41	loadSetting("suspendScreensaver", m_ui.suspendScreensaver);
 42	loadSetting("pauseOnFocusLost", m_ui.pauseOnFocusLost);
 43
 44	double fastForwardRatio = loadSetting("fastForwardRatio").toDouble();
 45	if (fastForwardRatio <= 0) {
 46		m_ui.fastForwardUnbounded->setChecked(true);
 47		m_ui.fastForwardRatio->setEnabled(false);
 48	} else {
 49		m_ui.fastForwardUnbounded->setChecked(false);
 50		m_ui.fastForwardRatio->setEnabled(true);
 51		m_ui.fastForwardRatio->setValue(fastForwardRatio);
 52	}
 53	connect(m_ui.fastForwardUnbounded, &QAbstractButton::toggled, [this](bool checked) {
 54		m_ui.fastForwardRatio->setEnabled(!checked);
 55	});
 56
 57	QString idleOptimization = loadSetting("idleOptimization");
 58	if (idleOptimization == "ignore") {
 59		m_ui.idleOptimization->setCurrentIndex(0);
 60	} else if (idleOptimization == "remove") {
 61		m_ui.idleOptimization->setCurrentIndex(1);
 62	} else if (idleOptimization == "detect") {
 63		m_ui.idleOptimization->setCurrentIndex(2);
 64	}
 65
 66	QVariant audioDriver = m_controller->getQtOption("audioDriver");
 67#ifdef BUILD_QT_MULTIMEDIA
 68	m_ui.audioDriver->addItem(tr("Qt Multimedia"), static_cast<int>(AudioProcessor::Driver::QT_MULTIMEDIA));
 69	if (!audioDriver.isNull() && audioDriver.toInt() == static_cast<int>(AudioProcessor::Driver::QT_MULTIMEDIA)) {
 70		m_ui.audioDriver->setCurrentIndex(m_ui.audioDriver->count() - 1);
 71	}
 72#endif
 73
 74#ifdef BUILD_SDL
 75	m_ui.audioDriver->addItem(tr("SDL"), static_cast<int>(AudioProcessor::Driver::SDL));
 76	if (audioDriver.isNull() || audioDriver.toInt() == static_cast<int>(AudioProcessor::Driver::SDL)) {
 77		m_ui.audioDriver->setCurrentIndex(m_ui.audioDriver->count() - 1);
 78	}
 79#endif
 80
 81	QVariant displayDriver = m_controller->getQtOption("displayDriver");
 82	m_ui.displayDriver->addItem(tr("Software (Qt)"), static_cast<int>(Display::Driver::QT));
 83	if (!displayDriver.isNull() && displayDriver.toInt() == static_cast<int>(Display::Driver::QT)) {
 84		m_ui.displayDriver->setCurrentIndex(m_ui.displayDriver->count() - 1);
 85	}
 86
 87#ifdef BUILD_GL
 88	m_ui.displayDriver->addItem(tr("OpenGL"), static_cast<int>(Display::Driver::OPENGL));
 89	if (displayDriver.isNull() || displayDriver.toInt() == static_cast<int>(Display::Driver::OPENGL)) {
 90		m_ui.displayDriver->setCurrentIndex(m_ui.displayDriver->count() - 1);
 91	}
 92#endif
 93
 94	connect(m_ui.biosBrowse, SIGNAL(clicked()), this, SLOT(selectBios()));
 95	connect(m_ui.buttonBox, SIGNAL(accepted()), this, SLOT(updateConfig()));
 96	connect(m_ui.buttonBox, &QDialogButtonBox::clicked, [this](QAbstractButton* button) {
 97		if (m_ui.buttonBox->buttonRole(button) == QDialogButtonBox::ApplyRole) {
 98			updateConfig();
 99		}
100	});
101
102	GBAKeyEditor* editor = new GBAKeyEditor(inputController, InputController::KEYBOARD, QString(), this);
103	m_ui.stackedWidget->addWidget(editor);
104	m_ui.tabs->addItem("Keyboard");
105	connect(m_ui.buttonBox, SIGNAL(accepted()), editor, SLOT(save()));
106
107#ifdef BUILD_SDL
108	inputController->recalibrateAxes();
109	const char* profile = inputController->profileForType(SDL_BINDING_BUTTON);
110	editor = new GBAKeyEditor(inputController, SDL_BINDING_BUTTON, profile);
111	m_ui.stackedWidget->addWidget(editor);
112	m_ui.tabs->addItem("Controllers");
113	connect(m_ui.buttonBox, SIGNAL(accepted()), editor, SLOT(save()));
114#endif
115
116	ShortcutView* shortcutView = new ShortcutView();
117	shortcutView->setController(shortcutController);
118	shortcutView->setInputController(inputController);
119	m_ui.stackedWidget->addWidget(shortcutView);
120	m_ui.tabs->addItem("Shortcuts");
121}
122
123void SettingsView::selectBios() {
124	QString filename = GBAApp::app()->getOpenFileName(this, tr("Select BIOS"));
125	if (!filename.isEmpty()) {
126		m_ui.bios->setText(filename);
127	}
128}
129
130void SettingsView::updateConfig() {
131	saveSetting("bios", m_ui.bios);
132	saveSetting("useBios", m_ui.useBios);
133	saveSetting("skipBios", m_ui.skipBios);
134	saveSetting("audioBuffers", m_ui.audioBufferSize);
135	saveSetting("sampleRate", m_ui.sampleRate);
136	saveSetting("videoSync", m_ui.videoSync);
137	saveSetting("audioSync", m_ui.audioSync);
138	saveSetting("frameskip", m_ui.frameskip);
139	saveSetting("fpsTarget", m_ui.fpsTarget);
140	saveSetting("lockAspectRatio", m_ui.lockAspectRatio);
141	saveSetting("volume", m_ui.volume);
142	saveSetting("mute", m_ui.mute);
143	saveSetting("rewindEnable", m_ui.rewind);
144	saveSetting("rewindBufferInterval", m_ui.rewindInterval);
145	saveSetting("rewindBufferCapacity", m_ui.rewindCapacity);
146	saveSetting("resampleVideo", m_ui.resampleVideo);
147	saveSetting("allowOpposingDirections", m_ui.allowOpposingDirections);
148	saveSetting("suspendScreensaver", m_ui.suspendScreensaver);
149	saveSetting("pauseOnFocusLost", m_ui.pauseOnFocusLost);
150
151	if (m_ui.fastForwardUnbounded->isChecked()) {
152		saveSetting("fastForwardRatio", "-1");
153	} else {
154		saveSetting("fastForwardRatio", m_ui.fastForwardRatio);
155	}
156
157	switch (m_ui.idleOptimization->currentIndex() + IDLE_LOOP_IGNORE) {
158	case IDLE_LOOP_IGNORE:
159		saveSetting("idleOptimization", "ignore");
160		break;
161	case IDLE_LOOP_REMOVE:
162		saveSetting("idleOptimization", "remove");
163		break;
164	case IDLE_LOOP_DETECT:
165		saveSetting("idleOptimization", "detect");
166		break;
167	}
168
169	QVariant audioDriver = m_ui.audioDriver->itemData(m_ui.audioDriver->currentIndex());
170	if (audioDriver != m_controller->getQtOption("audioDriver")) {
171		m_controller->setQtOption("audioDriver", audioDriver);
172		AudioProcessor::setDriver(static_cast<AudioProcessor::Driver>(audioDriver.toInt()));
173		emit audioDriverChanged();
174	}
175
176	QVariant displayDriver = m_ui.displayDriver->itemData(m_ui.displayDriver->currentIndex());
177	if (displayDriver != m_controller->getQtOption("displayDriver")) {
178		m_controller->setQtOption("displayDriver", displayDriver);
179		Display::setDriver(static_cast<Display::Driver>(displayDriver.toInt()));
180		emit displayDriverChanged();
181	}
182
183	m_controller->write();
184
185	emit biosLoaded(m_ui.bios->text());
186}
187
188void SettingsView::saveSetting(const char* key, const QAbstractButton* field) {
189	m_controller->setOption(key, field->isChecked());
190	m_controller->updateOption(key);
191}
192
193void SettingsView::saveSetting(const char* key, const QComboBox* field) {
194	saveSetting(key, field->lineEdit());
195}
196
197void SettingsView::saveSetting(const char* key, const QDoubleSpinBox* field) {
198	saveSetting(key, field->value());
199}
200
201void SettingsView::saveSetting(const char* key, const QLineEdit* field) {
202	saveSetting(key, field->text());
203}
204
205void SettingsView::saveSetting(const char* key, const QSlider* field) {
206	saveSetting(key, field->value());
207}
208
209void SettingsView::saveSetting(const char* key, const QSpinBox* field) {
210	saveSetting(key, field->value());
211}
212
213void SettingsView::saveSetting(const char* key, const QVariant& field) {
214	m_controller->setOption(key, field);
215	m_controller->updateOption(key);
216}
217
218void SettingsView::loadSetting(const char* key, QAbstractButton* field) {
219	QString option = loadSetting(key);
220	field->setChecked(!option.isNull() && option != "0");
221}
222
223void SettingsView::loadSetting(const char* key, QComboBox* field) {
224	loadSetting(key, field->lineEdit());
225}
226
227void SettingsView::loadSetting(const char* key, QDoubleSpinBox* field) {
228	QString option = loadSetting(key);
229	field->setValue(option.toDouble());
230}
231
232void SettingsView::loadSetting(const char* key, QLineEdit* field) {
233	QString option = loadSetting(key);
234	field->setText(option);
235}
236
237void SettingsView::loadSetting(const char* key, QSlider* field) {
238	QString option = loadSetting(key);
239	field->setValue(option.toInt());
240}
241
242void SettingsView::loadSetting(const char* key, QSpinBox* field) {
243	QString option = loadSetting(key);
244	field->setValue(option.toInt());
245}
246
247QString SettingsView::loadSetting(const char* key) {
248	return m_controller->getOption(key);
249}