From 78e974ba68aac7cc3d47b19acba6d2b1dd97bb8f Mon Sep 17 00:00:00 2001
From: N00byKing <N00byKing@hotmail.de>
Date: Fri, 30 Mar 2018 11:50:10 +0200
Subject: Add Dark theme, Icon theming

configure_general.ui: Add UI Option for Themes

config.cpp: Save Theme Settings
---
 src/yuzu/about_dialog.cpp                    |  2 ++
 src/yuzu/configuration/config.cpp            |  2 ++
 src/yuzu/configuration/configure_general.cpp |  8 ++++++++
 src/yuzu/configuration/configure_general.ui  | 27 ++++++++++++++++++++++++++
 src/yuzu/main.cpp                            | 29 ++++++++++++++++++++++++++++
 src/yuzu/main.h                              |  3 +++
 src/yuzu/ui_settings.h                       |  4 ++++
 7 files changed, 75 insertions(+)

(limited to 'src')

diff --git a/src/yuzu/about_dialog.cpp b/src/yuzu/about_dialog.cpp
index da34298221..d6647eeeae 100644
--- a/src/yuzu/about_dialog.cpp
+++ b/src/yuzu/about_dialog.cpp
@@ -2,12 +2,14 @@
 // Licensed under GPLv2 or any later version
 // Refer to the license.txt file included.
 
+#include <QIcon>
 #include "common/scm_rev.h"
 #include "ui_aboutdialog.h"
 #include "yuzu/about_dialog.h"
 
 AboutDialog::AboutDialog(QWidget* parent) : QDialog(parent), ui(new Ui::AboutDialog) {
     ui->setupUi(this);
+    ui->labelLogo->setPixmap(QIcon::fromTheme("yuzu").pixmap(200));
     ui->labelBuildInfo->setText(ui->labelBuildInfo->text().arg(
         Common::g_build_name, Common::g_scm_branch, Common::g_scm_desc));
 }
diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp
index 4b4216eecc..b6c11b7f0f 100644
--- a/src/yuzu/configuration/config.cpp
+++ b/src/yuzu/configuration/config.cpp
@@ -107,6 +107,8 @@ void Config::ReadValues() {
     qt_config->endGroup();
 
     qt_config->beginGroup("UI");
+    UISettings::values.theme = qt_config->value("theme", UISettings::themes[0].second).toString();
+    
     qt_config->beginGroup("UILayout");
     UISettings::values.geometry = qt_config->value("geometry").toByteArray();
     UISettings::values.state = qt_config->value("state").toByteArray();
diff --git a/src/yuzu/configuration/configure_general.cpp b/src/yuzu/configuration/configure_general.cpp
index 616a67f9fb..2d73fc5aab 100644
--- a/src/yuzu/configuration/configure_general.cpp
+++ b/src/yuzu/configuration/configure_general.cpp
@@ -13,6 +13,10 @@ ConfigureGeneral::ConfigureGeneral(QWidget* parent)
 
     ui->setupUi(this);
 
+    for (auto theme : UISettings::themes) {
+        ui->theme_combobox->addItem(theme.first, theme.second);
+    }
+
     this->setConfiguration();
 
     ui->use_cpu_jit->setEnabled(!Core::System::GetInstance().IsPoweredOn());
@@ -24,6 +28,7 @@ ConfigureGeneral::~ConfigureGeneral() {}
 void ConfigureGeneral::setConfiguration() {
     ui->toggle_deepscan->setChecked(UISettings::values.gamedir_deepscan);
     ui->toggle_check_exit->setChecked(UISettings::values.confirm_before_closing);
+    ui->theme_combobox->setCurrentIndex(ui->theme_combobox->findData(UISettings::values.theme));
     ui->use_cpu_jit->setChecked(Settings::values.use_cpu_jit);
     ui->use_docked_mode->setChecked(Settings::values.use_docked_mode);
 }
@@ -31,6 +36,9 @@ void ConfigureGeneral::setConfiguration() {
 void ConfigureGeneral::applyConfiguration() {
     UISettings::values.gamedir_deepscan = ui->toggle_deepscan->isChecked();
     UISettings::values.confirm_before_closing = ui->toggle_check_exit->isChecked();
+    UISettings::values.theme =
+        ui->theme_combobox->itemData(ui->theme_combobox->currentIndex()).toString();
+
     Settings::values.use_cpu_jit = ui->use_cpu_jit->isChecked();
     Settings::values.use_docked_mode = ui->use_docked_mode->isChecked();
     Settings::Apply();
diff --git a/src/yuzu/configuration/configure_general.ui b/src/yuzu/configuration/configure_general.ui
index 5ff68f0799..1775c4d40c 100644
--- a/src/yuzu/configuration/configure_general.ui
+++ b/src/yuzu/configuration/configure_general.ui
@@ -83,6 +83,33 @@
         </layout>
       </widget>
      </item>
+     <item>
+      <widget class="QGroupBox" name="theme_group_box">
+       <property name="title">
+        <string>Theme</string>
+       </property>
+       <layout class="QHBoxLayout" name="theme_qhbox_layout">
+        <item>
+         <layout class="QVBoxLayout" name="theme_qvbox_layout">
+          <item>
+           <layout class="QHBoxLayout" name="theme_qhbox_layout_2">
+            <item>
+             <widget class="QLabel" name="theme_label">
+              <property name="text">
+               <string>Theme:</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QComboBox" name="theme_combobox"/>
+            </item>
+           </layout>
+          </item>
+         </layout>
+        </item>
+       </layout>
+      </widget>
+     </item>
      <item>
       <widget class="QGroupBox" name="HotKeysGroupBox">
        <property name="title">
diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp
index bd323870b7..53ac1fd6a8 100644
--- a/src/yuzu/main.cpp
+++ b/src/yuzu/main.cpp
@@ -95,6 +95,9 @@ GMainWindow::GMainWindow() : config(new Config()), emu_thread(nullptr) {
 
     game_list->PopulateAsync(UISettings::values.gamedir, UISettings::values.gamedir_deepscan);
 
+    default_theme_paths = QIcon::themeSearchPaths();
+    UpdateUITheme();
+
     // Show one-time "callout" messages to the user
     ShowCallouts();
 
@@ -653,6 +656,7 @@ void GMainWindow::OnConfigure() {
     auto result = configureDialog.exec();
     if (result == QDialog::Accepted) {
         configureDialog.applyConfiguration();
+        UpdateUITheme();
         config->Save();
     }
 }
@@ -833,6 +837,31 @@ void GMainWindow::filterBarSetChecked(bool state) {
     emit(OnToggleFilterBar());
 }
 
+void GMainWindow::UpdateUITheme() {
+    QStringList theme_paths(default_theme_paths);
+    if (UISettings::values.theme != UISettings::themes[0].second &&
+        !UISettings::values.theme.isEmpty()) {
+        QString theme_uri(":" + UISettings::values.theme + "/style.qss");
+        QFile f(theme_uri);
+        if (!f.exists()) {
+            LOG_ERROR(Frontend, "Unable to set style, stylesheet file not found");
+        } else {
+            f.open(QFile::ReadOnly | QFile::Text);
+            QTextStream ts(&f);
+            qApp->setStyleSheet(ts.readAll());
+            GMainWindow::setStyleSheet(ts.readAll());
+        }
+        theme_paths.append(QStringList{":/icons/default", ":/icons/" + UISettings::values.theme});
+        QIcon::setThemeName(":/icons/" + UISettings::values.theme);
+    } else {
+        qApp->setStyleSheet("");
+        GMainWindow::setStyleSheet("");
+        theme_paths.append(QStringList{":/icons/default"});
+        QIcon::setThemeName(":/icons/default");
+    }
+    QIcon::setThemeSearchPaths(theme_paths);
+}
+
 #ifdef main
 #undef main
 #endif
diff --git a/src/yuzu/main.h b/src/yuzu/main.h
index 592ab7d9e1..2920219389 100644
--- a/src/yuzu/main.h
+++ b/src/yuzu/main.h
@@ -166,6 +166,9 @@ private:
 
     QAction* actions_recent_files[max_recent_files_item];
 
+    // stores default icon theme search paths for the platform
+    QStringList default_theme_paths;
+
 protected:
     void dropEvent(QDropEvent* event) override;
     void dragEnterEvent(QDragEnterEvent* event) override;
diff --git a/src/yuzu/ui_settings.h b/src/yuzu/ui_settings.h
index 9036ce2c19..8e215a002a 100644
--- a/src/yuzu/ui_settings.h
+++ b/src/yuzu/ui_settings.h
@@ -15,6 +15,10 @@ namespace UISettings {
 using ContextualShortcut = std::pair<QString, int>;
 using Shortcut = std::pair<QString, ContextualShortcut>;
 
+static const std::array<std::pair<QString, QString>, 2> themes = {
+    {std::make_pair(QString("Default"), QString("default")),
+     std::make_pair(QString("Dark"), QString("qdarkstyle"))}};
+
 struct Values {
     QByteArray geometry;
     QByteArray state;
-- 
cgit v1.2.3-70-g09d2