From 19dc580a4eed0e48198b1cb5bb453cccbb8e25ee Mon Sep 17 00:00:00 2001 From: Michael Maltese Date: Sun, 16 Jul 2017 14:25:36 -0700 Subject: [PATCH] Qt: extract ListTabWidget from SettingsWindow --- Source/Core/DolphinQt2/CMakeLists.txt | 1 + .../Core/DolphinQt2/Config/SettingsWindow.cpp | 100 +++++------------- .../Core/DolphinQt2/Config/SettingsWindow.h | 17 +-- Source/Core/DolphinQt2/DolphinQt2.vcxproj | 2 + .../Core/DolphinQt2/QtUtils/ListTabWidget.cpp | 72 +++++++++++++ .../Core/DolphinQt2/QtUtils/ListTabWidget.h | 23 ++++ 6 files changed, 124 insertions(+), 91 deletions(-) create mode 100644 Source/Core/DolphinQt2/QtUtils/ListTabWidget.cpp create mode 100644 Source/Core/DolphinQt2/QtUtils/ListTabWidget.h 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 -#include -#include -#include -#include -#include -#include #include #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,21 +33,21 @@ 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); + 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); }); // Dialog box buttons QDialogButtonBox* ok_box = new QDialogButtonBox(QDialogButtonBox::Ok); @@ -51,60 +56,3 @@ SettingsWindow::SettingsWindow(QWidget* parent) : QDialog(parent) 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); - - auto* audio_pane = new AudioPane; - 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()); -} - -void SettingsWindow::changePage(QListWidgetItem* current, QListWidgetItem* previous) -{ - if (!current) - current = previous; - m_settings_outer->setCurrentIndex(m_categories->row(current)); -} 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 - #include -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 @@ + @@ -214,6 +215,7 @@ + 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 +#include +#include +#include + +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 + +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; +};