From 191b7793fc8b985e7dcef18cbc6feb11f8be9dac Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Fri, 23 Feb 2024 13:59:41 +0200 Subject: [PATCH] Qt: Make settings window pretty --- CMakeLists.txt | 2 + docs/img/display_icon.png | Bin 0 -> 208 bytes docs/img/settings_icon.png | Bin 0 -> 697 bytes docs/img/sparkling_icon.png | Bin 0 -> 584 bytes docs/img/speaker_icon.png | Bin 0 -> 535 bytes include/panda_qt/config_window.hpp | 12 +++++ src/panda_qt/about_window.cpp | 1 + src/panda_qt/config_window.cpp | 68 ++++++++++++++++++++++++++++- 8 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 docs/img/display_icon.png create mode 100644 docs/img/settings_icon.png create mode 100644 docs/img/sparkling_icon.png create mode 100644 docs/img/speaker_icon.png diff --git a/CMakeLists.txt b/CMakeLists.txt index 43391513..e0dd618c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -485,6 +485,8 @@ if(ENABLE_QT_GUI) PREFIX "/" FILES docs/img/rsob_icon.png docs/img/rstarstruck_icon.png + docs/img/settings_icon.png docs/img/display_icon.png docs/img/speaker_icon.png + docs/img/sparkling_icon.png ) else() target_compile_definitions(Alber PUBLIC "PANDA3DS_FRONTEND_SDL=1") diff --git a/docs/img/display_icon.png b/docs/img/display_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..dd88a7f3108c6c6470e6e4959fb76f8ed33b3b98 GIT binary patch literal 208 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4mJh`h6m-gKNuJo7>k44ofy`glX=O&z|iIC z;uzxL{WjE*tHFTBd!F*VFaPT=H2;`;icNY&@!J&PmbbUeGB;fk>Xny%{MedF@Fqjg zRFSnR>g}SU9UUP|-wjl3zx67x+?&+uW_@sR^IfIV9lKoZH+bY;oG~Fv)Vkqd#QLSW zD$g%(x~vuR$Es=CtVPYia}QK07irtAUSQdHG+B4~3x1OgA%7S$#Hu9A-YD;3U|?YI MboFyt=akR{009n9i~s-t literal 0 HcmV?d00001 diff --git a/docs/img/settings_icon.png b/docs/img/settings_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..bf21c417c7817481296f471e0115634b5d7520d4 GIT binary patch literal 697 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4mJh`h6m-gKNuJo7>k44ofy`glX=O&z*Ow% z;uzxLy>(i2hi{_D@%s9u0-81z1)QFf($C9HxigEi^Tblk?NTigvaZK+J7#KhWoA8@ zbRyT}>B+_Fp7TyDnV`g#`D9zo>o2_3+xDKfTYRqS*6%l8YyWS(_J991t3}6_N!|B% zWiXazTEklBVKtrS*qLk0%?*5>@t>K_vKnk=dthN8^n=rcS^Uw`?1sA^e==|I4N4dD zP-~bO%QWpc^ZACAmV)0HCO_U@<|!9qf0}s*uMP{Jm)6Wk*#eFka{l&wsoI{qlGAh# z_&wOQMD;4u95yrN*D9qULQXnMKVMeL4ByJY-w=6#$+MiB!DhGgfm+Ya+>B>(3=4RF z@bpakvX|k&)NgtmNfrV6FViml=Vwpb#udSMrkAgGlHbqGGk3;oPCHwlHMwNRdnM!B zQdi21_TBHQ+41P#x5k+}mDF69D^HpwBtEA=bD2@*v@PZjFLUK|zPFvUYzbo(qknnL zgxjk_g7>n!F&Z~*Vq@-axIXFF(m!fU`VDcOhd(i>c~s4``oSh49W-B(QBI7ZX5y1M zDbr3ksl_d_?fkO$-o2fkxAimQ{Uqmm&6>tmFljpD=f?|sC!JICD05i<(R_ia%ZubC zIceK$`$X&CGOhF2b%S5w;U1A4Ts2I`LNqULKfsYNvAo>q?4H0v{u#n2)=Yk~>GW2Y z`z7A9rk9;z&R~{mWb=H>${^ifeBh$Nw#zoD@0pEX_wimgfAgx5IdECucb1GvS5ni? zwH6yJNPNEeu4j3*+&71vnMOL6>#SARu3P02D7kNApX;Z($|Iahe^ivctm?F9vUa*W z_k7oaj8s0>uxU@fy+3v5i7a=_zx7iiJ8v}Btp2&b>ptV9Pm*=rH`g;TFfe$!`njxg HN@xNAXel!+ literal 0 HcmV?d00001 diff --git a/docs/img/sparkling_icon.png b/docs/img/sparkling_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..db32c077d72076b37622215ab83676fa58681970 GIT binary patch literal 584 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4mJh`h6m-gKNuJo7>k44ofy`glX=O&z{KR~ z;uzxLy>;r@?!G{YWA)RgE_%X0A;-sV(gw-2nx!6MIW>P-HMlubQ^S&*dq41N$VYal zD4qGC(G{fjv*Qn=nV3?srTh2QkLNzGeO7taI{j+ayYq{f?oT=Jo++NWL~ldfrNdoXMfP=GzixQAZrje7-uUyt#**bb{nZ=&4>)?7 z@BVo1zS`|LzBwmnvN@c~@D%7_O}tmdAT#O9D$a>H=b76Y_cDIdHL_EES?(Ix1zh@S@TAYpE@N_L*{eA*Gnd?XP(ST$>BS#1@!Bg>_t-zT>gzH& z@ouT(wvFd9awna0SNGW2mmvDVhGUv%RqU5+!2-DxH^bNFocNpB*6VBbW?ifI>6J56 zZyPu9d~ps6yV8k44ofy`glX=O&z~avX1q|ld+_Xm zhQ^&PMa~{}%qL5IRkqIgddppZ@Ao@zYpYMsn`4#!{_C2p-}3+V^;B9u`|-!Vq2okK z-|EfYp|XO)uaf?MU&ZxFp+Nk`dOjOr!RL+L2lT!cb4Q8^2+nR`KXA;(ghN13yP^C5 z+XKT5;l20%t@G~dXg(k_LG(+QJL}8?#R)l;_rhg_6=kd`d(fBMP4h@fT7OyPXDmZmL8yRzrSoaNh6>-nPEt>v`Twr@J5 z737*J`qF**m6@q~SEPhymr2%WfAF~b-Fo4yec`uCqe}fg@|mXoIxUmUuyoR$YKPhz s7cV`mv)Jm%b1OXd;D!ksnd_Lothg?@sA7{M0|Nttr>mdKI;Vst0A*L~_5c6? literal 0 HcmV?d00001 diff --git a/include/panda_qt/config_window.hpp b/include/panda_qt/config_window.hpp index 1c16711a..9f0d3479 100644 --- a/include/panda_qt/config_window.hpp +++ b/include/panda_qt/config_window.hpp @@ -4,9 +4,13 @@ #include #include #include +#include #include +#include +#include #include #include +#include #include #include @@ -27,11 +31,19 @@ class ConfigWindow : public QDialog { Theme currentTheme; QComboBox* themeSelect = nullptr; + QTextEdit* helpText = nullptr; + QListWidget* widgetList = nullptr; + QStackedWidget* widgetContainer = nullptr; + + static constexpr size_t settingWidgetCount = 4; + std::array helpTexts; // The config class holds a copy of the emulator config which it edits and sends // over to the emulator EmulatorConfig config; ConfigCallback updateConfig; + + void addWidget(QWidget* widget, QString title, QString icon, QString helpText); void setTheme(Theme theme); public: diff --git a/src/panda_qt/about_window.cpp b/src/panda_qt/about_window.cpp index 67767198..d614a14c 100644 --- a/src/panda_qt/about_window.cpp +++ b/src/panda_qt/about_window.cpp @@ -1,5 +1,6 @@ #include "panda_qt/about_window.hpp" +#include #include #include #include diff --git a/src/panda_qt/config_window.cpp b/src/panda_qt/config_window.cpp index c9efcbb0..7abf90a7 100644 --- a/src/panda_qt/config_window.cpp +++ b/src/panda_qt/config_window.cpp @@ -1,12 +1,50 @@ #include "panda_qt/config_window.hpp" +#include +#include +#include + ConfigWindow::ConfigWindow(ConfigCallback callback, const EmulatorConfig& emuConfig, QWidget* parent) : QDialog(parent), config(emuConfig) { setWindowTitle(tr("Configuration")); updateConfig = std::move(callback); + // Initialize the widget list and the widget container widgets + widgetList = new QListWidget(this); + widgetContainer = new QStackedWidget(this); + + helpText = new QTextEdit(this); + helpText->setReadOnly(true); + + helpText->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + helpText->setFixedHeight(50); + + widgetList->setMinimumWidth(100); + widgetList->setMaximumWidth(100); + widgetList->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); + + widgetList->setCurrentRow(0); + widgetContainer->setCurrentIndex(0); + + connect(widgetList, &QListWidget::currentRowChanged, this, [&](int row) { + widgetContainer->setCurrentIndex(row); + helpText->setText(helpTexts[row]); + }); + + QVBoxLayout* mainLayout = new QVBoxLayout; + QHBoxLayout* hLayout = new QHBoxLayout; + + // Set up widget layouts + setLayout(mainLayout); + mainLayout->addLayout(hLayout); + mainLayout->addWidget(helpText); + + hLayout->setAlignment(Qt::AlignLeft); + hLayout->addWidget(widgetList); + hLayout->addWidget(widgetContainer); + // Set up theme selection setTheme(Theme::Dark); - themeSelect = new QComboBox(this); + themeSelect = new QComboBox(widgetContainer); themeSelect->addItem(tr("System")); themeSelect->addItem(tr("Light")); themeSelect->addItem(tr("Dark")); @@ -17,8 +55,17 @@ ConfigWindow::ConfigWindow(ConfigCallback callback, const EmulatorConfig& emuCon themeSelect->show(); connect(themeSelect, &QComboBox::currentIndexChanged, this, [&](int index) { setTheme(static_cast(index)); }); - QCheckBox* useShaderJIT = new QCheckBox(tr("Enable Shader recompiler"), this); + QCheckBox* useShaderJIT = new QCheckBox(tr("Enable shader recompiler"), widgetContainer); useShaderJIT->setChecked(config.shaderJitEnabled); + useShaderJIT->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); + + // Add all our settings widgets to our widget list + addWidget(themeSelect, tr("General"), ":/docs/img/settings_icon.png", tr("General emulator settings")); + addWidget(useShaderJIT, tr("UI"), ":/docs/img/sparkling_icon.png", tr("User Interface (UI) settings")); + addWidget(useShaderJIT, tr("Graphics"), ":/docs/img/display_icon.png", tr("Graphics emulation and output settings")); + addWidget(useShaderJIT, tr("Audio"), ":/docs/img/speaker_icon.png", tr("Audio emulation and output settings")); + + helpText->setText(helpTexts[0]); connect(useShaderJIT, &QCheckBox::toggled, this, [this, useShaderJIT]() { config.shaderJitEnabled = useShaderJIT->isChecked(); @@ -105,4 +152,21 @@ void ConfigWindow::setTheme(Theme theme) { } } +void ConfigWindow::addWidget(QWidget* widget, QString title, QString icon, QString helpText) { + const int index = widgetList->count(); + + QListWidgetItem* item = new QListWidgetItem(widgetList); + item->setText(title); + if (!icon.isEmpty()) { + item->setIcon(QIcon::fromTheme(icon)); + } + + widgetContainer->addWidget(widget); + + if (index >= settingWidgetCount) { + Helpers::panic("Qt: ConfigWindow::settingWidgetCount has not been updated correctly!"); + } + helpTexts[index] = std::move(helpText); +} + ConfigWindow::~ConfigWindow() { delete themeSelect; } \ No newline at end of file