diff --git a/src/citra_qt/CMakeLists.txt b/src/citra_qt/CMakeLists.txt
index 43a766053..017b43871 100644
--- a/src/citra_qt/CMakeLists.txt
+++ b/src/citra_qt/CMakeLists.txt
@@ -22,6 +22,7 @@ set(SRCS
configure_debug.cpp
configure_dialog.cpp
configure_general.cpp
+ configure_system.cpp
game_list.cpp
hotkeys.cpp
main.cpp
@@ -52,6 +53,7 @@ set(HEADERS
configure_debug.h
configure_dialog.h
configure_general.h
+ configure_system.h
game_list.h
game_list_p.h
hotkeys.h
@@ -69,6 +71,7 @@ set(UIS
configure_audio.ui
configure_debug.ui
configure_general.ui
+ configure_system.ui
hotkeys.ui
main.ui
)
diff --git a/src/citra_qt/configure.ui b/src/citra_qt/configure.ui
index e1624bbef..4a9c52650 100644
--- a/src/citra_qt/configure.ui
+++ b/src/citra_qt/configure.ui
@@ -24,6 +24,11 @@
General
+
+
+ System
+
+
Input
@@ -57,6 +62,12 @@
1
+
+ ConfigureSystem
+ QWidget
+
+ 1
+
ConfigureAudio
QWidget
diff --git a/src/citra_qt/configure_dialog.cpp b/src/citra_qt/configure_dialog.cpp
index 2f0317fe0..77c266d01 100644
--- a/src/citra_qt/configure_dialog.cpp
+++ b/src/citra_qt/configure_dialog.cpp
@@ -9,9 +9,10 @@
#include "core/settings.h"
-ConfigureDialog::ConfigureDialog(QWidget *parent) :
+ConfigureDialog::ConfigureDialog(QWidget *parent, bool running) :
QDialog(parent),
- ui(new Ui::ConfigureDialog)
+ ui(new Ui::ConfigureDialog),
+ emulation_running(running)
{
ui->setupUi(this);
this->setConfiguration();
@@ -21,10 +22,14 @@ ConfigureDialog::~ConfigureDialog() {
}
void ConfigureDialog::setConfiguration() {
+ // System tab needs set manually
+ // depending on whether emulation is running
+ ui->systemTab->setConfiguration(emulation_running);
}
void ConfigureDialog::applyConfiguration() {
ui->generalTab->applyConfiguration();
+ ui->systemTab->applyConfiguration();
ui->audioTab->applyConfiguration();
ui->debugTab->applyConfiguration();
}
diff --git a/src/citra_qt/configure_dialog.h b/src/citra_qt/configure_dialog.h
index 89020eeb4..305b33bdf 100644
--- a/src/citra_qt/configure_dialog.h
+++ b/src/citra_qt/configure_dialog.h
@@ -16,7 +16,7 @@ class ConfigureDialog : public QDialog
Q_OBJECT
public:
- explicit ConfigureDialog(QWidget *parent = nullptr);
+ explicit ConfigureDialog(QWidget *parent, bool emulation_running);
~ConfigureDialog();
void applyConfiguration();
@@ -26,4 +26,5 @@ private:
private:
std::unique_ptr ui;
+ bool emulation_running;
};
diff --git a/src/citra_qt/configure_system.cpp b/src/citra_qt/configure_system.cpp
new file mode 100644
index 000000000..4f0d4dbfe
--- /dev/null
+++ b/src/citra_qt/configure_system.cpp
@@ -0,0 +1,136 @@
+// Copyright 2016 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "citra_qt/configure_system.h"
+#include "citra_qt/ui_settings.h"
+#include "ui_configure_system.h"
+
+#include "core/hle/service/fs/archive.h"
+#include "core/hle/service/cfg/cfg.h"
+
+static const std::array days_in_month = {{
+ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
+}};
+
+ConfigureSystem::ConfigureSystem(QWidget *parent) :
+ QWidget(parent),
+ ui(new Ui::ConfigureSystem) {
+ ui->setupUi(this);
+
+ connect(ui->combo_birthmonth, SIGNAL(currentIndexChanged(int)), SLOT(updateBirthdayComboBox(int)));
+}
+
+ConfigureSystem::~ConfigureSystem() {
+}
+
+void ConfigureSystem::setConfiguration(bool emulation_running) {
+ enabled = !emulation_running;
+
+ if (!enabled) {
+ ReadSystemSettings();
+ ui->group_system_settings->setEnabled(false);
+ } else {
+ // This tab is enabled only when game is not running (i.e. all service are not initialized).
+ // Temporarily register archive types and load the config savegame file to memory.
+ Service::FS::RegisterArchiveTypes();
+ ResultCode result = Service::CFG::LoadConfigNANDSaveFile();
+ Service::FS::UnregisterArchiveTypes();
+
+ if (result.IsError()) {
+ ui->label_disable_info->setText(tr("Failed to load system settings data."));
+ ui->group_system_settings->setEnabled(false);
+ enabled = false;
+ return;
+ }
+
+ ReadSystemSettings();
+ ui->label_disable_info->hide();
+ }
+}
+
+void ConfigureSystem::ReadSystemSettings() {
+ // set username
+ username = Service::CFG::GetUsername();
+ // ui->edit_username->setText(QString::fromStdU16String(username)); // TODO(wwylele): Use this when we move to Qt 5.5
+ ui->edit_username->setText(QString::fromUtf16(reinterpret_cast(username.data())));
+
+ // set birthday
+ std::tie(birthmonth, birthday) = Service::CFG::GetBirthday();
+ ui->combo_birthmonth->setCurrentIndex(birthmonth - 1);
+ ui->combo_birthday->setCurrentIndex(birthday - 1);
+
+ // set system language
+ language_index = Service::CFG::GetSystemLanguage();
+ ui->combo_language->setCurrentIndex(language_index);
+
+ // set sound output mode
+ sound_index = Service::CFG::GetSoundOutputMode();
+ ui->combo_sound->setCurrentIndex(sound_index);
+}
+
+void ConfigureSystem::applyConfiguration() {
+ if (!enabled)
+ return;
+
+ bool modified = false;
+
+ // apply username
+ // std::u16string new_username = ui->edit_username->text().toStdU16String(); // TODO(wwylele): Use this when we move to Qt 5.5
+ std::u16string new_username(reinterpret_cast(ui->edit_username->text().utf16()));
+ if (new_username != username) {
+ Service::CFG::SetUsername(new_username);
+ modified = true;
+ }
+
+ // apply birthday
+ int new_birthmonth = ui->combo_birthmonth->currentIndex() + 1;
+ int new_birthday = ui->combo_birthday->currentIndex() + 1;
+ if (birthmonth != new_birthmonth || birthday != new_birthday) {
+ Service::CFG::SetBirthday(new_birthmonth, new_birthday);
+ modified = true;
+ }
+
+ // apply language
+ int new_language = ui->combo_language->currentIndex();
+ if (language_index != new_language) {
+ Service::CFG::SetSystemLanguage(static_cast(new_language));
+ modified = true;
+ }
+
+ // apply sound
+ int new_sound = ui->combo_sound->currentIndex();
+ if (sound_index != new_sound) {
+ Service::CFG::SetSoundOutputMode(static_cast(new_sound));
+ modified = true;
+ }
+
+ // update the config savegame if any item is modified.
+ if (modified)
+ Service::CFG::UpdateConfigNANDSavegame();
+}
+
+void ConfigureSystem::updateBirthdayComboBox(int birthmonth_index) {
+ if (birthmonth_index < 0 || birthmonth_index >= 12)
+ return;
+
+ // store current day selection
+ int birthday_index = ui->combo_birthday->currentIndex();
+
+ // get number of days in the new selected month
+ int days = days_in_month[birthmonth_index];
+
+ // if the selected day is out of range,
+ // reset it to 1st
+ if (birthday_index < 0 || birthday_index >= days)
+ birthday_index = 0;
+
+ // update the day combo box
+ ui->combo_birthday->clear();
+ for (int i = 1; i <= days; ++i) {
+ ui->combo_birthday->addItem(QString::number(i));
+ }
+
+ // restore the day selection
+ ui->combo_birthday->setCurrentIndex(birthday_index);
+}
diff --git a/src/citra_qt/configure_system.h b/src/citra_qt/configure_system.h
new file mode 100644
index 000000000..1f5577070
--- /dev/null
+++ b/src/citra_qt/configure_system.h
@@ -0,0 +1,38 @@
+// Copyright 2016 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include
+#include
+
+namespace Ui {
+class ConfigureSystem;
+}
+
+class ConfigureSystem : public QWidget
+{
+ Q_OBJECT
+
+public:
+ explicit ConfigureSystem(QWidget *parent = nullptr);
+ ~ConfigureSystem();
+
+ void applyConfiguration();
+ void setConfiguration(bool emulation_running);
+
+public slots:
+ void updateBirthdayComboBox(int birthmonth_index);
+
+private:
+ void ReadSystemSettings();
+
+ std::unique_ptr ui;
+ bool enabled;
+
+ std::u16string username;
+ int birthmonth, birthday;
+ int language_index;
+ int sound_index;
+};
diff --git a/src/citra_qt/configure_system.ui b/src/citra_qt/configure_system.ui
new file mode 100644
index 000000000..6a906b61b
--- /dev/null
+++ b/src/citra_qt/configure_system.ui
@@ -0,0 +1,252 @@
+
+
+ ConfigureSystem
+
+
+
+ 0
+ 0
+ 360
+ 377
+
+
+
+ Form
+
+
+ -
+
+
-
+
+
+ System Settings
+
+
+
-
+
+
+ Username
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ 10
+
+
+
+ -
+
+
+ Birthday
+
+
+
+ -
+
+
-
+
+
-
+
+ January
+
+
+ -
+
+ February
+
+
+ -
+
+ March
+
+
+ -
+
+ April
+
+
+ -
+
+ May
+
+
+ -
+
+ June
+
+
+ -
+
+ July
+
+
+ -
+
+ August
+
+
+ -
+
+ September
+
+
+ -
+
+ October
+
+
+ -
+
+ November
+
+
+ -
+
+ December
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ Language
+
+
+
+ -
+
+
-
+
+ Japanese (日本語)
+
+
+ -
+
+ English
+
+
+ -
+
+ French (français)
+
+
+ -
+
+ German (Deutsch)
+
+
+ -
+
+ Italian (italiano)
+
+
+ -
+
+ Spanish (español)
+
+
+ -
+
+ Simplified Chinese (简体中文)
+
+
+ -
+
+ Korean (한국어)
+
+
+ -
+
+ Dutch (Nederlands)
+
+
+ -
+
+ Portuguese (português)
+
+
+ -
+
+ Russian (Русский)
+
+
+ -
+
+ Traditional Chinese (正體中文)
+
+
+
+
+ -
+
+
+ Sound output mode
+
+
+
+ -
+
+
-
+
+ Mono
+
+
+ -
+
+ Stereo
+
+
+ -
+
+ Surround
+
+
+
+
+
+
+
+ -
+
+
+ System settings are available only when game is not running.
+
+
+ true
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/citra_qt/main.cpp b/src/citra_qt/main.cpp
index 0ed1ffa5a..6fe5d7a3f 100644
--- a/src/citra_qt/main.cpp
+++ b/src/citra_qt/main.cpp
@@ -508,7 +508,7 @@ void GMainWindow::ToggleWindowMode() {
}
void GMainWindow::OnConfigure() {
- ConfigureDialog configureDialog(this);
+ ConfigureDialog configureDialog(this, emulation_running);
auto result = configureDialog.exec();
if (result == QDialog::Accepted)
{