From cca959e760fa6988987f7589870f5b243370d61d Mon Sep 17 00:00:00 2001 From: Satori Date: Sun, 30 Aug 2020 23:09:16 +0100 Subject: [PATCH] [Qt] Support initializing SettingsWidget by reference to cvar This prevents a situation where one developer changes the name of a cvar but doesn't update calls to Config::FindCvar* --- .../ui/qt/settings/panes/general_pane.cc | 6 ++-- .../qt/settings/widgets/settings_checkbox.cc | 36 +++++++++++++++++++ .../qt/settings/widgets/settings_checkbox.h | 28 +++++++-------- .../ui/qt/settings/widgets/settings_widget.h | 9 ++++- 4 files changed, 60 insertions(+), 19 deletions(-) create mode 100644 src/xenia/ui/qt/settings/widgets/settings_checkbox.cc diff --git a/src/xenia/ui/qt/settings/panes/general_pane.cc b/src/xenia/ui/qt/settings/panes/general_pane.cc index d9f64d0b8..0411119f6 100644 --- a/src/xenia/ui/qt/settings/panes/general_pane.cc +++ b/src/xenia/ui/qt/settings/panes/general_pane.cc @@ -8,7 +8,9 @@ #include "xenia/ui/qt/widgets/groupbox.h" #include "xenia/ui/qt/widgets/scroll_area.h" -DECLARE_bool(show_debug_tab) +DECLARE_bool(show_debug_tab); +DECLARE_bool(discord); +DECLARE_bool(use_game_icon); namespace xe { namespace ui { @@ -53,7 +55,7 @@ DECLARE_bool(show_debug_tab) groupbox_layout->setContentsMargins(16, 16, 16, 16); groupbox->setLayout(groupbox_layout); - auto discord_presence_checkbox = new SettingsCheckBox("discord"); + auto discord_presence_checkbox = new SettingsCheckBox(cvars::discord); discord_presence_checkbox->setText("Discord Rich Presence"); groupbox_layout->addWidget(discord_presence_checkbox); diff --git a/src/xenia/ui/qt/settings/widgets/settings_checkbox.cc b/src/xenia/ui/qt/settings/widgets/settings_checkbox.cc new file mode 100644 index 000000000..c8e532254 --- /dev/null +++ b/src/xenia/ui/qt/settings/widgets/settings_checkbox.cc @@ -0,0 +1,36 @@ +/** + ****************************************************************************** + * Xenia : Xbox 360 Emulator Research Project * + ****************************************************************************** + * Copyright 2020 Ben Vanik. All rights reserved. * + * Released under the BSD license - see LICENSE in the root for more details. * + ****************************************************************************** + */ + +#include "settings_checkbox.h" + +namespace xe { +namespace ui { +namespace qt { + +void SettingsCheckBox::Initialize() { + if (!cvar_) { + return; + } + + setChecked(*cvar_->current_value()); + + connect(this, &SettingsCheckBox::stateChanged, [&](int state) { + if (state == Qt::Checked) { + UpdateValue(true); + } else if (state == Qt::Unchecked) { + UpdateValue(false); + } else { + XELOGW("PartiallyChecked state not supported for SettingsCheckBox"); + } + }); +} + +} // namespace qt +} // namespace ui +} // namespace xe \ No newline at end of file diff --git a/src/xenia/ui/qt/settings/widgets/settings_checkbox.h b/src/xenia/ui/qt/settings/widgets/settings_checkbox.h index 5f0dcc37b..2c6070a2b 100644 --- a/src/xenia/ui/qt/settings/widgets/settings_checkbox.h +++ b/src/xenia/ui/qt/settings/widgets/settings_checkbox.h @@ -18,27 +18,23 @@ namespace xe { namespace ui { namespace qt { -class SettingsCheckBox : public SettingsWidget { +using SettingsType = bool; + +class SettingsCheckBox : public SettingsWidget { public: explicit SettingsCheckBox(const std::string& config_name, QWidget* parent = nullptr) : SettingsWidget(config_name, parent) { - if (!cvar_) { - return; - } - - setChecked(*cvar_->current_value()); - - connect(this, &SettingsCheckBox::stateChanged, [&](int state) { - if (state == Qt::Checked) { - UpdateValue(true); - } else if (state == Qt::Unchecked) { - UpdateValue(false); - } else { - XELOGW("PartiallyChecked state not supported for SettingsCheckBox"); - } - }); + Initialize(); } + + explicit SettingsCheckBox(const SettingsType& config_var, + QWidget* parent = nullptr) + : SettingsWidget(config_var, parent) { + Initialize(); + } + + void Initialize(); }; } // namespace qt diff --git a/src/xenia/ui/qt/settings/widgets/settings_widget.h b/src/xenia/ui/qt/settings/widgets/settings_widget.h index fbf4d0f0e..b49892e46 100644 --- a/src/xenia/ui/qt/settings/widgets/settings_widget.h +++ b/src/xenia/ui/qt/settings/widgets/settings_widget.h @@ -25,7 +25,14 @@ class SettingsWidget : public Widget { SettingsWidget(const std::string& config_name, Args... args) : Widget(args...), cvar_(nullptr) { cvar_ = dynamic_cast*>( - Config::Instance().FindConfigVar(config_name)); + Config::Instance().FindConfigVarByName(config_name)); + } + + template + SettingsWidget(const T& config_ref, Args... args) + : Widget(args...), cvar_(nullptr) { + cvar_ = dynamic_cast*>( + Config::Instance().FindConfigVar(config_ref)); } void UpdateValue(T val) {