summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorMichael Maltese <mchtly@gmail.com>2017-07-16 14:25:36 -0700
committerMichael Maltese <mchtly@gmail.com>2017-07-16 18:23:59 -0700
commit19dc580a4eed0e48198b1cb5bb453cccbb8e25ee (patch)
tree8b66d0d4d421e1e05d48ec441dbfe3f3b019114c /Source
parent42f2851fa1fb4ba24747adeb75a905b76ff9542b (diff)
Qt: extract ListTabWidget from SettingsWindow
Diffstat (limited to 'Source')
-rw-r--r--Source/Core/DolphinQt2/CMakeLists.txt1
-rw-r--r--Source/Core/DolphinQt2/Config/SettingsWindow.cpp98
-rw-r--r--Source/Core/DolphinQt2/Config/SettingsWindow.h17
-rw-r--r--Source/Core/DolphinQt2/DolphinQt2.vcxproj2
-rw-r--r--Source/Core/DolphinQt2/QtUtils/ListTabWidget.cpp72
-rw-r--r--Source/Core/DolphinQt2/QtUtils/ListTabWidget.h23
6 files changed, 123 insertions, 90 deletions
diff --git a/Source/Core/DolphinQt2/CMakeLists.txt b/Source/Core/DolphinQt2/CMakeLists.txt
index 6ddffd597f..66ba436282 100644
--- a/Source/Core/DolphinQt2/CMakeLists.txt
+++ b/Source/Core/DolphinQt2/CMakeLists.txt
@@ -65,6 +65,7 @@ set(SRCS
GameList/ListProxyModel.cpp
QtUtils/DoubleClickEventFilter.cpp
QtUtils/ElidedButton.cpp
+ QtUtils/ListTabWidget.cpp
QtUtils/WindowActivationEventFilter.cpp
Settings/AudioPane.cpp
Settings/GeneralPane.cpp
diff --git a/Source/Core/DolphinQt2/Config/SettingsWindow.cpp b/Source/Core/DolphinQt2/Config/SettingsWindow.cpp
index 3d9cf7320f..a3dff1084a 100644
--- a/Source/Core/DolphinQt2/Config/SettingsWindow.cpp
+++ b/Source/Core/DolphinQt2/Config/SettingsWindow.cpp
@@ -3,16 +3,11 @@
// Refer to the license.txt file included.
#include <QDialogButtonBox>
-#include <QGroupBox>
-#include <QHBoxLayout>
-#include <QLabel>
-#include <QListWidget>
-#include <QScrollBar>
-#include <QStackedWidget>
#include <QVBoxLayout>
#include "DolphinQt2/Config/SettingsWindow.h"
#include "DolphinQt2/MainWindow.h"
+#include "DolphinQt2/QtUtils/ListTabWidget.h"
#include "DolphinQt2/Resources.h"
#include "DolphinQt2/Settings.h"
#include "DolphinQt2/Settings/AudioPane.h"
@@ -20,6 +15,16 @@
#include "DolphinQt2/Settings/InterfacePane.h"
#include "DolphinQt2/Settings/PathPane.h"
+static int AddTab(ListTabWidget* tab_widget, const QString& label, QWidget* widget,
+ const char* icon_name)
+{
+ int index = tab_widget->addTab(widget, label);
+ auto set_icon = [=] { tab_widget->setTabIcon(index, Resources::GetScaledThemeIcon(icon_name)); };
+ QObject::connect(&Settings::Instance(), &Settings::ThemeChanged, set_icon);
+ set_icon();
+ return index;
+}
+
SettingsWindow::SettingsWindow(QWidget* parent) : QDialog(parent)
{
// Set Window Properties
@@ -28,83 +33,26 @@ SettingsWindow::SettingsWindow(QWidget* parent) : QDialog(parent)
// Main Layout
QVBoxLayout* layout = new QVBoxLayout;
- QHBoxLayout* content = new QHBoxLayout;
- // Content's widgets
- {
- // Category list
- MakeCategoryList();
- content->addWidget(m_categories);
-
- // Actual Settings UI
- SetupSettingsWidget();
-
- content->addWidget(m_settings_outer);
- }
// Add content to layout before dialog buttons.
- layout->addLayout(content);
-
- // Dialog box buttons
- QDialogButtonBox* ok_box = new QDialogButtonBox(QDialogButtonBox::Ok);
- connect(ok_box, &QDialogButtonBox::accepted, this, &SettingsWindow::accept);
- layout->addWidget(ok_box);
-
- setLayout(layout);
-}
-
-void SettingsWindow::SetupSettingsWidget()
-{
- m_settings_outer = new QStackedWidget;
- m_settings_outer->setCurrentIndex(0);
-
- // Panes initalised here
- m_settings_outer->addWidget(new GeneralPane);
- m_settings_outer->addWidget(new InterfacePane);
+ m_tabs = new ListTabWidget();
+ layout->addWidget(m_tabs);
+ AddTab(m_tabs, tr("General"), new GeneralPane(), "config");
+ AddTab(m_tabs, tr("Interface"), new InterfacePane(), "browse");
auto* audio_pane = new AudioPane;
+ AddTab(m_tabs, tr("Audio"), audio_pane, "play");
+ AddTab(m_tabs, tr("Paths"), new PathPane(), "browse");
+
connect(this, &SettingsWindow::EmulationStarted,
[audio_pane] { audio_pane->OnEmulationStateChanged(true); });
connect(this, &SettingsWindow::EmulationStopped,
[audio_pane] { audio_pane->OnEmulationStateChanged(false); });
- m_settings_outer->addWidget(audio_pane);
- m_settings_outer->addWidget(new PathPane);
-}
-
-void SettingsWindow::AddCategoryToList(const QString& title, const std::string& icon_name)
-{
- QListWidgetItem* button = new QListWidgetItem();
- button->setText(title);
- button->setTextAlignment(Qt::AlignVCenter);
- button->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
-
- auto set_icon = [=] { button->setIcon(Resources::GetScaledThemeIcon(icon_name)); };
- QObject::connect(&Settings::Instance(), &Settings::ThemeChanged, set_icon);
- set_icon();
- m_categories->addItem(button);
-}
-
-void SettingsWindow::MakeCategoryList()
-{
- m_categories = new QListWidget;
- m_categories->setIconSize(QSize(32, 32));
- m_categories->setMovement(QListView::Static);
- m_categories->setSpacing(0);
-
- AddCategoryToList(tr("General"), "config");
- AddCategoryToList(tr("Interface"), "browse");
- AddCategoryToList(tr("Audio"), "play");
- AddCategoryToList(tr("Paths"), "browse");
- connect(m_categories, &QListWidget::currentItemChanged, this, &SettingsWindow::changePage);
-
- m_categories->setFixedWidth(m_categories->sizeHintForColumn(0) +
- m_categories->verticalScrollBar()->sizeHint().width() +
- 2 * m_categories->frameWidth());
-}
+ // Dialog box buttons
+ QDialogButtonBox* ok_box = new QDialogButtonBox(QDialogButtonBox::Ok);
+ connect(ok_box, &QDialogButtonBox::accepted, this, &SettingsWindow::accept);
+ layout->addWidget(ok_box);
-void SettingsWindow::changePage(QListWidgetItem* current, QListWidgetItem* previous)
-{
- if (!current)
- current = previous;
- m_settings_outer->setCurrentIndex(m_categories->row(current));
+ setLayout(layout);
}
diff --git a/Source/Core/DolphinQt2/Config/SettingsWindow.h b/Source/Core/DolphinQt2/Config/SettingsWindow.h
index 1feeec8661..45124d98ac 100644
--- a/Source/Core/DolphinQt2/Config/SettingsWindow.h
+++ b/Source/Core/DolphinQt2/Config/SettingsWindow.h
@@ -4,15 +4,9 @@
#pragma once
-#include <string>
-
#include <QDialog>
-class MainWindow;
-class QGroupBox;
-class QListWidget;
-class QListWidgetItem;
-class QStackedWidget;
+class ListTabWidget;
class SettingsWindow final : public QDialog
{
@@ -23,13 +17,6 @@ signals:
void EmulationStarted();
void EmulationStopped();
-public slots:
- void changePage(QListWidgetItem* current, QListWidgetItem* previous);
-
private:
- void MakeCategoryList();
- void AddCategoryToList(const QString& title, const std::string& icon_name);
- void SetupSettingsWidget();
- QStackedWidget* m_settings_outer;
- QListWidget* m_categories;
+ ListTabWidget* m_tabs;
};
diff --git a/Source/Core/DolphinQt2/DolphinQt2.vcxproj b/Source/Core/DolphinQt2/DolphinQt2.vcxproj
index 1a51b5e633..e51b6c9006 100644
--- a/Source/Core/DolphinQt2/DolphinQt2.vcxproj
+++ b/Source/Core/DolphinQt2/DolphinQt2.vcxproj
@@ -185,6 +185,7 @@
<ClCompile Include="MenuBar.cpp" />
<ClCompile Include="QtUtils\DoubleClickEventFilter.cpp" />
<ClCompile Include="QtUtils\ElidedButton.cpp" />
+ <ClCompile Include="QtUtils\ListTabWidget.cpp" />
<ClCompile Include="QtUtils\WindowActivationEventFilter.cpp" />
<ClCompile Include="RenderWidget.cpp" />
<ClCompile Include="Resources.cpp" />
@@ -214,6 +215,7 @@
<ClInclude Include="Config\Mapping\WiimoteEmuGeneral.h" />
<ClInclude Include="Config\Mapping\WiimoteEmuMotionControl.h" />
<ClInclude Include="QtUtils\ElidedButton.h" />
+ <ClInclude Include="QtUtils\ListTabWidget.h" />
<ClInclude Include="Resources.h" />
<ClInclude Include="Settings\PathPane.h" />
<ClInclude Include="WiiUpdate.h" />
diff --git a/Source/Core/DolphinQt2/QtUtils/ListTabWidget.cpp b/Source/Core/DolphinQt2/QtUtils/ListTabWidget.cpp
new file mode 100644
index 0000000000..bf7aa41f5c
--- /dev/null
+++ b/Source/Core/DolphinQt2/QtUtils/ListTabWidget.cpp
@@ -0,0 +1,72 @@
+// Copyright 2017 Dolphin Emulator Project
+// Licensed under GPLv2+
+// Refer to the license.txt file included.
+
+#include "DolphinQt2/QtUtils/ListTabWidget.h"
+
+#include <QHBoxLayout>
+#include <QListWidget>
+#include <QScrollBar>
+#include <QStackedWidget>
+
+class OverriddenListWidget : public QListWidget
+{
+public:
+ // We want this widget to have a fixed width that fits all items, unlike a normal QListWidget
+ // which adds scrollbars and expands/contracts.
+ OverriddenListWidget() { setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred); }
+ QSize sizeHint() const override
+ {
+ int width = sizeHintForColumn(0) + verticalScrollBar()->sizeHint().width() + 2 * frameWidth();
+ int height = QListWidget::sizeHint().height();
+ return {width, height};
+ }
+};
+
+ListTabWidget::ListTabWidget()
+{
+ QHBoxLayout* layout = new QHBoxLayout();
+ layout->setContentsMargins(0, 0, 0, 0);
+ setLayout(layout);
+
+ m_labels = new OverriddenListWidget();
+ layout->addWidget(m_labels);
+ m_labels->setIconSize(QSize(32, 32));
+ m_labels->setMovement(QListView::Static);
+ m_labels->setSpacing(0);
+
+ m_display = new QStackedWidget();
+ layout->addWidget(m_display);
+
+ connect(m_labels, &QListWidget::currentItemChanged, this,
+ [=](QListWidgetItem* current, QListWidgetItem* previous) {
+ if (!current)
+ current = previous;
+ m_display->setCurrentIndex(m_labels->row(current));
+ });
+}
+
+int ListTabWidget::addTab(QWidget* page, const QString& label)
+{
+ QListWidgetItem* button = new QListWidgetItem();
+ button->setText(label);
+ button->setTextAlignment(Qt::AlignVCenter);
+ button->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
+
+ m_labels->addItem(button);
+ if (!m_labels->currentItem())
+ m_labels->setCurrentItem(button);
+
+ return m_display->addWidget(page);
+}
+
+void ListTabWidget::setTabIcon(int index, const QIcon& icon)
+{
+ if (auto* label = m_labels->item(index))
+ label->setIcon(icon);
+}
+
+void ListTabWidget::setCurrentIndex(int index)
+{
+ m_labels->setCurrentRow(index);
+}
diff --git a/Source/Core/DolphinQt2/QtUtils/ListTabWidget.h b/Source/Core/DolphinQt2/QtUtils/ListTabWidget.h
new file mode 100644
index 0000000000..57a23db36c
--- /dev/null
+++ b/Source/Core/DolphinQt2/QtUtils/ListTabWidget.h
@@ -0,0 +1,23 @@
+// Copyright 2017 Dolphin Emulator Project
+// Licensed under GPLv2+
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include <QWidget>
+
+class QListWidget;
+class QStackedWidget;
+
+class ListTabWidget : public QWidget
+{
+public:
+ ListTabWidget();
+ int addTab(QWidget* page, const QString& label);
+ void setTabIcon(int index, const QIcon& icon);
+ void setCurrentIndex(int index);
+
+private:
+ QListWidget* m_labels;
+ QStackedWidget* m_display;
+};