From d63a63cff05c5e0dfb8c5f81078e13e456151ca6 Mon Sep 17 00:00:00 2001
From: spycrab <spycrab@users.noreply.github.com>
Date: Thu, 6 Sep 2018 19:59:25 +0200
Subject: [PATCH] Qt/Configure: Use sidebar to divide tabs into smaller groups

---
 src/citra_qt/configuration/configure.ui       | 114 +++++++++---------
 .../configuration/configure_dialog.cpp        |  44 +++++++
 src/citra_qt/configuration/configure_dialog.h |   2 +
 3 files changed, 106 insertions(+), 54 deletions(-)

diff --git a/src/citra_qt/configuration/configure.ui b/src/citra_qt/configuration/configure.ui
index 21fa5fbc8..0f24016b2 100644
--- a/src/citra_qt/configuration/configure.ui
+++ b/src/citra_qt/configuration/configure.ui
@@ -2,64 +2,70 @@
 <ui version="4.0">
  <class>ConfigureDialog</class>
  <widget class="QDialog" name="ConfigureDialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>461</width>
-    <height>500</height>
-   </rect>
-  </property>
   <property name="windowTitle">
    <string>Citra Configuration</string>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout">
    <item>
-    <widget class="QTabWidget" name="tabWidget">
-     <property name="currentIndex">
-      <number>0</number>
-     </property>
-     <widget class="ConfigureGeneral" name="generalTab">
-      <attribute name="title">
-       <string>General</string>
-      </attribute>
-     </widget>
-     <widget class="ConfigureSystem" name="systemTab">
-      <attribute name="title">
-       <string>System</string>
-      </attribute>
-     </widget>
-     <widget class="ConfigureInput" name="inputTab">
-      <attribute name="title">
-       <string>Input</string>
-      </attribute>
-     </widget>
-     <widget class="ConfigureGraphics" name="graphicsTab">
-      <attribute name="title">
-       <string>Graphics</string>
-      </attribute>
-     </widget>
-     <widget class="ConfigureAudio" name="audioTab">
-      <attribute name="title">
-       <string>Audio</string>
-      </attribute>
-     </widget>
-      <widget class="ConfigureCamera" name="cameraTab">
-      <attribute name="title">
-       <string>Camera</string>
-      </attribute>
-     </widget>
-     <widget class="ConfigureDebug" name="debugTab">
-      <attribute name="title">
-       <string>Debug</string>
-      </attribute>
-     </widget>
-     <widget class="ConfigureWeb" name="webTab">
-      <attribute name="title">
-       <string>Web</string>
-      </attribute>
-     </widget>
-    </widget>
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <widget class="QListWidget" name="selectorList">
+       <property name="minimumWidth">
+        <number>150</number>
+       </property>
+       <property name="maximumWidth">
+        <number>150</number>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QTabWidget" name="tabWidget">
+       <property name="currentIndex">
+        <number>0</number>
+       </property>
+       <widget class="ConfigureGeneral" name="generalTab">
+        <attribute name="title">
+         <string>General</string>
+        </attribute>
+       </widget>
+       <widget class="ConfigureSystem" name="systemTab">
+        <attribute name="title">
+         <string>System</string>
+        </attribute>
+       </widget>
+       <widget class="ConfigureInput" name="inputTab">
+        <attribute name="title">
+         <string>Input</string>
+        </attribute>
+       </widget>
+       <widget class="ConfigureGraphics" name="graphicsTab">
+        <attribute name="title">
+         <string>Graphics</string>
+        </attribute>
+       </widget>
+       <widget class="ConfigureAudio" name="audioTab">
+        <attribute name="title">
+         <string>Audio</string>
+        </attribute>
+       </widget>
+       <widget class="ConfigureCamera" name="cameraTab">
+        <attribute name="title">
+         <string>Camera</string>
+        </attribute>
+       </widget>
+       <widget class="ConfigureDebug" name="debugTab">
+        <attribute name="title">
+         <string>Debug</string>
+        </attribute>
+       </widget>
+       <widget class="ConfigureWeb" name="webTab">
+        <attribute name="title">
+         <string>Web</string>
+        </attribute>
+       </widget>
+      </widget>
+     </item>
+    </layout>
    </item>
    <item>
     <widget class="QDialogButtonBox" name="buttonBox">
@@ -89,7 +95,7 @@
    <header>configuration/configure_audio.h</header>
    <container>1</container>
   </customwidget>
-   <customwidget>
+  <customwidget>
    <class>ConfigureCamera</class>
    <extends>QWidget</extends>
    <header>configuration/configure_camera.h</header>
diff --git a/src/citra_qt/configuration/configure_dialog.cpp b/src/citra_qt/configuration/configure_dialog.cpp
index e9e0c598f..0a3f1fbae 100644
--- a/src/citra_qt/configuration/configure_dialog.cpp
+++ b/src/citra_qt/configuration/configure_dialog.cpp
@@ -2,6 +2,8 @@
 // Licensed under GPLv2 or any later version
 // Refer to the license.txt file included.
 
+#include <QHash>
+#include <QListWidgetItem>
 #include "citra_qt/configuration/config.h"
 #include "citra_qt/configuration/configure_dialog.h"
 #include "citra_qt/hotkeys.h"
@@ -13,8 +15,15 @@ ConfigureDialog::ConfigureDialog(QWidget* parent, const HotkeyRegistry& registry
     ui->setupUi(this);
     ui->generalTab->PopulateHotkeyList(registry);
     this->setConfiguration();
+    this->PopulateSelectionList();
     connect(ui->generalTab, &ConfigureGeneral::languageChanged, this,
             &ConfigureDialog::onLanguageChanged);
+    connect(ui->selectorList, &QListWidget::itemSelectionChanged, this,
+            &ConfigureDialog::UpdateVisibleTabs);
+
+    adjustSize();
+
+    ui->selectorList->setCurrentRow(0);
 }
 
 ConfigureDialog::~ConfigureDialog() = default;
@@ -34,6 +43,22 @@ void ConfigureDialog::applyConfiguration() {
     Settings::LogSettings();
 }
 
+void ConfigureDialog::PopulateSelectionList() {
+
+    const std::array<std::pair<QString, QStringList>, 4> items{
+        {{tr("General"), {tr("General"), tr("Web"), tr("Debug")}},
+         {tr("System"), {tr("System"), tr("Audio")}},
+         {tr("Graphics"), {tr("Graphics")}},
+         {tr("Controls"), {tr("Input")}}}};
+
+    for (const auto& entry : items) {
+        auto* item = new QListWidgetItem(entry.first);
+        item->setData(Qt::UserRole, entry.second);
+
+        ui->selectorList->addItem(item);
+    }
+}
+
 void ConfigureDialog::onLanguageChanged(const QString& locale) {
     emit languageChanged(locale);
     ui->retranslateUi(this);
@@ -46,3 +71,22 @@ void ConfigureDialog::onLanguageChanged(const QString& locale) {
     ui->debugTab->retranslateUi();
     ui->webTab->retranslateUi();
 }
+
+void ConfigureDialog::UpdateVisibleTabs() {
+    auto items = ui->selectorList->selectedItems();
+    if (items.isEmpty())
+        return;
+
+    const QHash<QString, QWidget*> widgets = {
+        {tr("General"), ui->generalTab}, {tr("System"), ui->systemTab},
+        {tr("Input"), ui->inputTab},     {tr("Graphics"), ui->graphicsTab},
+        {tr("Audio"), ui->audioTab},     {tr("Camera"), ui->cameraTab},
+        {tr("Debug"), ui->debugTab},     {tr("Web"), ui->webTab}};
+
+    ui->tabWidget->clear();
+
+    QStringList tabs = items[0]->data(Qt::UserRole).toStringList();
+
+    for (const auto& tab : tabs)
+        ui->tabWidget->addTab(widgets[tab], tab);
+}
diff --git a/src/citra_qt/configuration/configure_dialog.h b/src/citra_qt/configuration/configure_dialog.h
index fb6d25ce9..f78c1fd20 100644
--- a/src/citra_qt/configuration/configure_dialog.h
+++ b/src/citra_qt/configuration/configure_dialog.h
@@ -21,6 +21,8 @@ public:
     ~ConfigureDialog();
 
     void applyConfiguration();
+    void UpdateVisibleTabs();
+    void PopulateSelectionList();
 
 private slots:
     void onLanguageChanged(const QString& locale);