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
11#include <QFileDialog>
12
13using namespace QGBA;
14
15SettingsView::SettingsView(ConfigController* controller, QWidget* parent)
16 : QWidget(parent)
17 , m_controller(controller)
18{
19 m_ui.setupUi(this);
20
21 loadSetting("bios", m_ui.bios);
22 loadSetting("useBios", m_ui.useBios);
23 loadSetting("skipBios", m_ui.skipBios);
24 loadSetting("audioBuffers", m_ui.audioBufferSize);
25 loadSetting("videoSync", m_ui.videoSync);
26 loadSetting("audioSync", m_ui.audioSync);
27 loadSetting("frameskip", m_ui.frameskip);
28 loadSetting("fpsTarget", m_ui.fpsTarget);
29 loadSetting("lockAspectRatio", m_ui.lockAspectRatio);
30 loadSetting("rewindEnable", m_ui.rewind);
31 loadSetting("rewindBufferInterval", m_ui.rewindInterval);
32 loadSetting("rewindBufferCapacity", m_ui.rewindCapacity);
33 loadSetting("resampleVideo", m_ui.resampleVideo);
34
35 QString idleOptimization = loadSetting("idleOptimization");
36 if (idleOptimization == "ignore") {
37 m_ui.idleOptimization->setCurrentIndex(0);
38 } else if (idleOptimization == "remove") {
39 m_ui.idleOptimization->setCurrentIndex(1);
40 } else if (idleOptimization == "detect") {
41 m_ui.idleOptimization->setCurrentIndex(2);
42 }
43
44 int audioDriver = m_controller->getQtOption("audioDriver").toInt();
45#ifdef BUILD_QT_MULTIMEDIA
46 m_ui.audioDriver->addItem(tr("Qt Multimedia"), static_cast<int>(AudioProcessor::Driver::QT_MULTIMEDIA));
47 if (audioDriver == static_cast<int>(AudioProcessor::Driver::QT_MULTIMEDIA)) {
48 m_ui.audioDriver->setCurrentIndex(m_ui.audioDriver->count() - 1);
49 }
50#endif
51
52#ifdef BUILD_SDL
53 m_ui.audioDriver->addItem(tr("SDL"), static_cast<int>(AudioProcessor::Driver::SDL));
54 if (audioDriver == static_cast<int>(AudioProcessor::Driver::SDL)) {
55 m_ui.audioDriver->setCurrentIndex(m_ui.audioDriver->count() - 1);
56 }
57#endif
58
59 connect(m_ui.biosBrowse, SIGNAL(clicked()), this, SLOT(selectBios()));
60 connect(m_ui.buttonBox, SIGNAL(accepted()), this, SLOT(updateConfig()));
61}
62
63void SettingsView::selectBios() {
64 QString filename = QFileDialog::getOpenFileName(this, tr("Select BIOS"));
65 if (!filename.isEmpty()) {
66 m_ui.bios->setText(filename);
67 }
68}
69
70void SettingsView::updateConfig() {
71 saveSetting("bios", m_ui.bios);
72 saveSetting("useBios", m_ui.useBios);
73 saveSetting("skipBios", m_ui.skipBios);
74 saveSetting("audioBuffers", m_ui.audioBufferSize);
75 saveSetting("videoSync", m_ui.videoSync);
76 saveSetting("audioSync", m_ui.audioSync);
77 saveSetting("frameskip", m_ui.frameskip);
78 saveSetting("fpsTarget", m_ui.fpsTarget);
79 saveSetting("lockAspectRatio", m_ui.lockAspectRatio);
80 saveSetting("rewindEnable", m_ui.rewind);
81 saveSetting("rewindBufferInterval", m_ui.rewindInterval);
82 saveSetting("rewindBufferCapacity", m_ui.rewindCapacity);
83 saveSetting("resampleVideo", m_ui.resampleVideo);
84
85 switch (m_ui.idleOptimization->currentIndex() + IDLE_LOOP_IGNORE) {
86 case IDLE_LOOP_IGNORE:
87 saveSetting("idleOptimization", "ignore");
88 break;
89 case IDLE_LOOP_REMOVE:
90 saveSetting("idleOptimization", "remove");
91 break;
92 case IDLE_LOOP_DETECT:
93 saveSetting("idleOptimization", "detect");
94 break;
95 }
96
97 QVariant audioDriver = m_ui.audioDriver->itemData(m_ui.audioDriver->currentIndex());
98 if (audioDriver != m_controller->getQtOption("audioDriver")) {
99 m_controller->setQtOption("audioDriver", audioDriver);
100 AudioProcessor::setDriver(static_cast<AudioProcessor::Driver>(audioDriver.toInt()));
101 emit audioDriverChanged();
102 }
103
104 m_controller->write();
105
106 emit biosLoaded(m_ui.bios->text());
107}
108
109void SettingsView::saveSetting(const char* key, const QAbstractButton* field) {
110 m_controller->setOption(key, field->isChecked());
111 m_controller->updateOption(key);
112}
113
114void SettingsView::saveSetting(const char* key, const QComboBox* field) {
115 saveSetting(key, field->lineEdit());
116}
117
118void SettingsView::saveSetting(const char* key, const QLineEdit* field) {
119 saveSetting(key, field->text());
120}
121
122void SettingsView::saveSetting(const char* key, const QSpinBox* field) {
123 saveSetting(key, field->cleanText());
124}
125
126void SettingsView::saveSetting(const char* key, const QString& field) {
127 m_controller->setOption(key, field);
128 m_controller->updateOption(key);
129}
130
131void SettingsView::loadSetting(const char* key, QAbstractButton* field) {
132 QString option = loadSetting(key);
133 field->setChecked(option != "0");
134}
135
136void SettingsView::loadSetting(const char* key, QComboBox* field) {
137 loadSetting(key, field->lineEdit());
138}
139
140void SettingsView::loadSetting(const char* key, QLineEdit* field) {
141 QString option = loadSetting(key);
142 field->setText(option);
143}
144
145void SettingsView::loadSetting(const char* key, QSpinBox* field) {
146 QString option = loadSetting(key);
147 field->setValue(option.toInt());
148}
149
150QString SettingsView::loadSetting(const char* key) {
151 return m_controller->getOption(key);
152}