diff options
| author | TrickyLeifa <date.epoch@gmail.com> | 2024-05-15 00:00:17 +0200 |
|---|---|---|
| committer | TrickyLeifa <date.epoch@gmail.com> | 2024-05-15 00:04:16 +0200 |
| commit | c9f52b7223685d2e7fca925594171f94dd8c6e3b (patch) | |
| tree | 740bb32a40da98a4d52836432f59a16b31333900 /src/widgets | |
| parent | 951766666621fa77e257e6b5616fe4ab1eb2a52f (diff) | |
Ported to CMake, ...
* Ported the project to CMake
* Android and Mac support dropped for the time
being.
* Tests, BASS and Discord-RPC are now options
* Restructured and reformated the project.
* Merged `include` and `src`
* Renamed `resource` to `data`
* Renamed various files
* External libraries headers are no longer included in `src`
* Replaced header guards with #pragma once
* Multiple refactors (keywords, headers)
* Added Qt6 compatibility
* Removed various unused functions and headers
* Reworked AOPacket
* When content is passed to AOPacket, it should be ensured that the content is already decoded.
* Encoding/decoding are now static methods.
* Fixed various memory leaks
* Removed animation code for AOImage
* AOImage is always using static images
* Simplified ChatLogPiece
Diffstat (limited to 'src/widgets')
| -rw-r--r-- | src/widgets/add_server_dialog.cpp | 44 | ||||
| -rw-r--r-- | src/widgets/add_server_dialog.h | 40 | ||||
| -rw-r--r-- | src/widgets/aooptionsdialog.cpp | 562 | ||||
| -rw-r--r-- | src/widgets/aooptionsdialog.h | 153 | ||||
| -rw-r--r-- | src/widgets/direct_connect_dialog.cpp | 75 | ||||
| -rw-r--r-- | src/widgets/direct_connect_dialog.h | 43 | ||||
| -rw-r--r-- | src/widgets/edit_server_dialog.cpp | 108 | ||||
| -rw-r--r-- | src/widgets/edit_server_dialog.h | 42 |
8 files changed, 633 insertions, 434 deletions
diff --git a/src/widgets/add_server_dialog.cpp b/src/widgets/add_server_dialog.cpp index d590d77c..dfc302f0 100644 --- a/src/widgets/add_server_dialog.cpp +++ b/src/widgets/add_server_dialog.cpp @@ -1,29 +1,28 @@ -#include "widgets/add_server_dialog.h" +#include "add_server_dialog.h" + #include "datatypes.h" #include "options.h" +#include "gui_utils.h" #include <QComboBox> #include <QDebug> #include <QDialogButtonBox> #include <QFile> -#include <QLineEdit> #include <QLabel> +#include <QLineEdit> #include <QPlainTextEdit> #include <QPushButton> #include <QSpinBox> #include <QUiLoader> #include <QVBoxLayout> -#define FROM_UI(type, name) \ - ; \ - ui_##name = findChild<type *>(#name); - AddServerDialog::AddServerDialog() { QUiLoader l_loader(this); QFile l_uiFile(Options::getInstance().getUIAsset(DEFAULT_UI)); - if (!l_uiFile.open(QFile::ReadOnly)) { + if (!l_uiFile.open(QFile::ReadOnly)) + { qCritical() << "Unable to open file " << l_uiFile.fileName(); return; } @@ -38,16 +37,13 @@ AddServerDialog::AddServerDialog() FROM_UI(QComboBox, server_protocol_box); FROM_UI(QPlainTextEdit, server_description_edit); FROM_UI(QDialogButtonBox, server_dialog_button); - connect(ui_server_dialog_button, &QDialogButtonBox::accepted, this, - &::AddServerDialog::onSavePressed); - connect(ui_server_dialog_button, &QDialogButtonBox::rejected, this, - &AddServerDialog::onCancelPressed); + connect(ui_server_dialog_button, &QDialogButtonBox::accepted, this, &::AddServerDialog::onSavePressed); + connect(ui_server_dialog_button, &QDialogButtonBox::rejected, this, &AddServerDialog::onCancelPressed); FROM_UI(QLabel, server_legacy_lbl); FROM_UI(QLineEdit, server_legacy_edit); FROM_UI(QPushButton, server_legacy_load_button); - connect(ui_server_legacy_load_button, &QPushButton::released, this, - &AddServerDialog::parseLegacyServerEntry); + connect(ui_server_legacy_load_button, &QPushButton::released, this, &AddServerDialog::parseLegacyServerEntry); } void AddServerDialog::onSavePressed() @@ -57,38 +53,42 @@ void AddServerDialog::onSavePressed() server.ip = ui_server_hostname_edit->text(); server.port = ui_server_port_box->value(); server.desc = ui_server_description_edit->toPlainText(); - server.socket_type = - ui_server_protocol_box->currentIndex() == TCP_INDEX ? TCP : WEBSOCKETS; + server.socket_type = ui_server_protocol_box->currentIndex() == TCP_INDEX ? TCP : WEBSOCKETS; Options::getInstance().addFavorite(server); close(); } void AddServerDialog::onCancelPressed() { - close(); - deleteLater(); + close(); + deleteLater(); } void AddServerDialog::parseLegacyServerEntry() { QStringList l_legacy_entry = ui_server_legacy_edit->text().split(":"); server_type l_server_entry; - if (l_legacy_entry.isEmpty()) { + if (l_legacy_entry.isEmpty()) + { qDebug() << "Legacy entry empty."; return; } int l_item_count = l_legacy_entry.size(); - if (l_item_count >= 3) { + if (l_item_count >= 3) + { ui_server_hostname_edit->setText(l_legacy_entry.at(0)); ui_server_port_box->setValue(l_legacy_entry.at(1).toInt()); ui_server_display_name_edit->setText(l_legacy_entry.at(2)); - if (l_item_count >= 4) { - if (l_legacy_entry.at(3) == "ws") { + if (l_item_count >= 4) + { + if (l_legacy_entry.at(3) == "ws") + { ui_server_protocol_box->setCurrentIndex(1); } - else { + else + { ui_server_protocol_box->setCurrentIndex(0); } } diff --git a/src/widgets/add_server_dialog.h b/src/widgets/add_server_dialog.h new file mode 100644 index 00000000..5df868cc --- /dev/null +++ b/src/widgets/add_server_dialog.h @@ -0,0 +1,40 @@ +#pragma once + +#include "interfaces/server_dialog.h" + +#include <QComboBox> +#include <QDialogButtonBox> +#include <QLabel> +#include <QLineEdit> +#include <QPlainTextEdit> +#include <QPushButton> +#include <QSpinBox> + +class AddServerDialog : public AttorneyOnline::UI::FavoriteServerDialog +{ + Q_OBJECT + +public: + AddServerDialog(); + ~AddServerDialog() = default; + +private: + QWidget *ui_widget; + + QLineEdit *ui_server_display_name_edit; + QLineEdit *ui_server_hostname_edit; + QSpinBox *ui_server_port_box; + QComboBox *ui_server_protocol_box; + QPlainTextEdit *ui_server_description_edit; + QDialogButtonBox *ui_server_dialog_button; + + // Legacy Server UI + QLabel *ui_server_legacy_lbl; + QLineEdit *ui_server_legacy_edit; + QPushButton *ui_server_legacy_load_button; + +private Q_SLOTS: + void onSavePressed() override; + void onCancelPressed() override; + void parseLegacyServerEntry(); +}; diff --git a/src/widgets/aooptionsdialog.cpp b/src/widgets/aooptionsdialog.cpp index 72c9f4e8..a25bde36 100644 --- a/src/widgets/aooptionsdialog.cpp +++ b/src/widgets/aooptionsdialog.cpp @@ -1,45 +1,37 @@ -#include "widgets/aooptionsdialog.h" +#include "aooptionsdialog.h" + #include "QDesktopServices" #include "aoapplication.h" #include "bass.h" #include "file_functions.h" +#include "gui_utils.h" #include "networkmanager.h" #include "options.h" -#include <QCheckBox> #include <QCollator> -#include <QComboBox> -#include <QDialogButtonBox> #include <QGroupBox> -#include <QLabel> -#include <QLineEdit> -#include <QPlainTextEdit> -#include <QPushButton> #include <QResource> -#include <QSpinBox> #include <QUiLoader> #include <QVBoxLayout> -#define FROM_UI(type, name) \ - ; \ - ui_##name = findChild<type *>(#name); - -AOOptionsDialog::AOOptionsDialog(QDialog *parent, AOApplication *p_ao_app) +AOOptionsDialog::AOOptionsDialog(AOApplication *p_ao_app, QWidget *parent) : QDialog(parent) + , ao_app(p_ao_app) { - ao_app = p_ao_app; setupUI(); } void AOOptionsDialog::populateAudioDevices() { ui_audio_device_combobox->clear(); - if (needsDefaultAudioDevice()) { + if (needsDefaultAudioDevice()) + { ui_audio_device_combobox->addItem("default", "default"); } BASS_DEVICEINFO info; - for (int a = 0; BASS_GetDeviceInfo(a, &info); a++) { + for (int a = 0; BASS_GetDeviceInfo(a, &info); a++) + { ui_audio_device_combobox->addItem(info.name, info.name); } } @@ -50,7 +42,8 @@ void AOOptionsDialog::setWidgetData(QCheckBox *widget, const bool &value) widget->setChecked(value); } -template <> bool AOOptionsDialog::widgetData(QCheckBox *widget) const +template <> +bool AOOptionsDialog::widgetData(QCheckBox *widget) const { return widget->isChecked(); } @@ -61,7 +54,8 @@ void AOOptionsDialog::setWidgetData(QLineEdit *widget, const QString &value) widget->setText(value); } -template <> QString AOOptionsDialog::widgetData(QLineEdit *widget) const +template <> +QString AOOptionsDialog::widgetData(QLineEdit *widget) const { return widget->text(); } @@ -72,14 +66,14 @@ void AOOptionsDialog::setWidgetData(QLineEdit *widget, const uint16_t &value) widget->setText(QString::number(value)); } -template <> uint16_t AOOptionsDialog::widgetData(QLineEdit *widget) const +template <> +uint16_t AOOptionsDialog::widgetData(QLineEdit *widget) const { return widget->text().toUShort(); } template <> -void AOOptionsDialog::setWidgetData(QPlainTextEdit *widget, - const QStringList &value) +void AOOptionsDialog::setWidgetData(QPlainTextEdit *widget, const QStringList &value) { widget->setPlainText(value.join('\n')); } @@ -96,7 +90,8 @@ void AOOptionsDialog::setWidgetData(QSpinBox *widget, const int &value) widget->setValue(value); } -template <> int AOOptionsDialog::widgetData(QSpinBox *widget) const +template <> +int AOOptionsDialog::widgetData(QSpinBox *widget) const { return widget->value(); } @@ -104,17 +99,19 @@ template <> int AOOptionsDialog::widgetData(QSpinBox *widget) const template <> void AOOptionsDialog::setWidgetData(QComboBox *widget, const QString &value) { - for (auto i = 0; i < widget->count(); i++) { - if (widget->itemData(i).toString() == value) { + for (auto i = 0; i < widget->count(); i++) + { + if (widget->itemData(i).toString() == value) + { widget->setCurrentIndex(i); return; } } - qWarning() << "value" << value << "not found for widget" - << widget->objectName(); + qWarning() << "value" << value << "not found for widget" << widget->objectName(); } -template <> QString AOOptionsDialog::widgetData(QComboBox *widget) const +template <> +QString AOOptionsDialog::widgetData(QComboBox *widget) const { return widget->currentData().toString(); } @@ -125,34 +122,35 @@ void AOOptionsDialog::setWidgetData(QGroupBox *widget, const bool &value) widget->setChecked(value); } -template <> bool AOOptionsDialog::widgetData(QGroupBox *widget) const +template <> +bool AOOptionsDialog::widgetData(QGroupBox *widget) const { return widget->isChecked(); } template <> -void AOOptionsDialog::setWidgetData(QListWidget *widget, - const QStringList &value) +void AOOptionsDialog::setWidgetData(QListWidget *widget, const QStringList &value) { widget->addItems(value); } -template <> QStringList AOOptionsDialog::widgetData(QListWidget *widget) const +template <> +QStringList AOOptionsDialog::widgetData(QListWidget *widget) const { QStringList paths; - for (auto i = 1; i < widget->count(); i++) { + for (auto i = 1; i < widget->count(); i++) + { paths.append(widget->item(i)->text()); } return paths; } template <typename T, typename V> -void AOOptionsDialog::registerOption(const QString &widgetName, - V (Options::*getter)() const, - void (Options::*setter)(V)) +void AOOptionsDialog::registerOption(const QString &widgetName, V (Options::*getter)() const, void (Options::*setter)(V)) { auto *widget = findChild<T *>(widgetName); - if (!widget) { + if (!widget) + { qWarning() << "could not find widget" << widgetName; return; } @@ -174,70 +172,74 @@ void AOOptionsDialog::updateValues() QStringList bases = Options::getInstance().mountPaths(); bases.push_front(get_base_path()); - for (const QString &base : bases) { - QStringList l_themes = - QDir(base + "/themes").entryList(QDir::Dirs | QDir::NoDotAndDotDot); + for (const QString &base : bases) + { + QStringList l_themes = QDir(base + "/themes").entryList(QDir::Dirs | QDir::NoDotAndDotDot); // Resorts list to match numeric sorting found in Windows. QCollator l_sorting; l_sorting.setNumericMode(true); std::sort(l_themes.begin(), l_themes.end(), l_sorting); - for (const QString &l_theme : qAsConst(l_themes)) { - if (!themes.contains(l_theme)) { + for (const QString &l_theme : qAsConst(l_themes)) + { + if (!themes.contains(l_theme)) + { ui_theme_combobox->addItem(l_theme, l_theme); themes.insert(l_theme); } } } - QStringList l_subthemes = - QDir(ao_app->get_real_path(ao_app->get_theme_path(""))) - .entryList(QDir::Dirs | QDir::NoDotAndDotDot); - for (const QString &l_subtheme : qAsConst(l_subthemes)) { - if (l_subtheme.toLower() != "server" && l_subtheme.toLower() != "default" && - l_subtheme.toLower() != "effects" && l_subtheme.toLower() != "misc") { + QStringList l_subthemes = QDir(ao_app->get_real_path(ao_app->get_theme_path(""))).entryList(QDir::Dirs | QDir::NoDotAndDotDot); + for (const QString &l_subtheme : qAsConst(l_subthemes)) + { + if (l_subtheme.toLower() != "server" && l_subtheme.toLower() != "default" && l_subtheme.toLower() != "effects" && l_subtheme.toLower() != "misc") + { ui_subtheme_combobox->addItem(l_subtheme, l_subtheme); } } - ao_app->net_manager->request_document( - MSDocumentType::PrivacyPolicy, [this](QString document) { - if (document.isEmpty()) { - document = tr("Couldn't get the privacy policy."); - } - ui_privacy_policy->setHtml(document); - }); + ao_app->net_manager->request_document(MSDocumentType::PrivacyPolicy, [this](QString document) { + if (document.isEmpty()) + { + document = tr("Couldn't get the privacy policy."); + } + ui_privacy_policy->setHtml(document); + }); - for (const OptionEntry &entry : qAsConst(optionEntries)) { + for (const OptionEntry &entry : qAsConst(optionEntries)) + { entry.load(); } } void AOOptionsDialog::savePressed() { - bool l_reload_theme_required = - (ui_theme_combobox->currentText() != Options::getInstance().theme()) || - (ui_theme_scaling_factor_sb->value() != - Options::getInstance().themeScalingFactor()); - for (const OptionEntry &entry : qAsConst(optionEntries)) { + bool l_reload_theme_required = (ui_theme_combobox->currentText() != Options::getInstance().theme()) || (ui_theme_scaling_factor_sb->value() != Options::getInstance().themeScalingFactor()); + for (const OptionEntry &entry : qAsConst(optionEntries)) + { entry.save(); } - if (l_reload_theme_required) { - emit reloadThemeRequest(); + if (l_reload_theme_required) + { + Q_EMIT reloadThemeRequest(); } close(); } -void AOOptionsDialog::discardPressed() { close(); } +void AOOptionsDialog::discardPressed() +{ + close(); +} void AOOptionsDialog::buttonClicked(QAbstractButton *button) { - if (ui_settings_buttons->buttonRole(button) == QDialogButtonBox::ResetRole) { - if (QMessageBox::question( - this, "", "Restore default settings?\nThis can't be undone!", - QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { + if (ui_settings_buttons->buttonRole(button) == QDialogButtonBox::ResetRole) + { + if (QMessageBox::question(this, "", "Restore default settings?\nThis can't be undone!", QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) + { // Destructive operation. Options::getInstance().clearConfig(); updateValues(); @@ -249,9 +251,8 @@ void AOOptionsDialog::onReloadThemeClicked() { Options::getInstance().setTheme(ui_theme_combobox->currentText()); Options::getInstance().setSettingsSubTheme(ui_subtheme_combobox->currentText()); - Options::getInstance().setAnimatedThemeEnabled( - ui_animated_theme_cb->isChecked()); - emit reloadThemeRequest(); + Options::getInstance().setAnimatedThemeEnabled(ui_animated_theme_cb->isChecked()); + Q_EMIT reloadThemeRequest(); delete layout(); delete ui_settings_widget; optionEntries.clear(); @@ -265,24 +266,21 @@ void AOOptionsDialog::themeChanged(int i) ui_subtheme_combobox->addItem("server", "server"); ui_subtheme_combobox->addItem("default", "server"); - QStringList l_subthemes = QDir(ao_app->get_real_path(ao_app->get_theme_path( - "", ui_theme_combobox->itemText(i)))) - .entryList(QDir::Dirs | QDir::NoDotAndDotDot); + QStringList l_subthemes = QDir(ao_app->get_real_path(ao_app->get_theme_path("", ui_theme_combobox->itemText(i)))).entryList(QDir::Dirs | QDir::NoDotAndDotDot); - for (const QString &l_subthemes : qAsConst(l_subthemes)) { - if (l_subthemes.toLower() != "server" && - l_subthemes.toLower() != "default" && - l_subthemes.toLower() != "effects" && l_subthemes.toLower() != "misc") { + for (const QString &l_subthemes : qAsConst(l_subthemes)) + { + if (l_subthemes.toLower() != "server" && l_subthemes.toLower() != "default" && l_subthemes.toLower() != "effects" && l_subthemes.toLower() != "misc") + { ui_subtheme_combobox->addItem(l_subthemes, l_subthemes); } } QString l_ressource_name = Options::getInstance().theme() + ".rcc"; - QString l_resource = - ao_app->get_asset("themes/" + ui_theme_combobox->currentText() + ".rcc"); - if (l_resource.isEmpty()) { - QResource::unregisterResource( - ao_app->get_asset("themes/" + l_ressource_name)); + QString l_resource = ao_app->get_asset("themes/" + ui_theme_combobox->currentText() + ".rcc"); + if (l_resource.isEmpty()) + { + QResource::unregisterResource(ao_app->get_asset("themes/" + l_ressource_name)); qDebug() << "Unable to locate ressource file" << l_ressource_name; return; } @@ -293,7 +291,8 @@ void AOOptionsDialog::setupUI() { QUiLoader l_loader(this); QFile l_uiFile(Options::getInstance().getUIAsset("options_dialog.ui")); - if (!l_uiFile.open(QFile::ReadOnly)) { + if (!l_uiFile.open(QFile::ReadOnly)) + { qWarning() << "Unable to open file " << l_uiFile.fileName(); return; } @@ -306,98 +305,71 @@ void AOOptionsDialog::setupUI() // General dialog element. FROM_UI(QDialogButtonBox, settings_buttons); - connect(ui_settings_buttons, &QDialogButtonBox::accepted, this, - &AOOptionsDialog::savePressed); - connect(ui_settings_buttons, &QDialogButtonBox::rejected, this, - &AOOptionsDialog::discardPressed); - connect(ui_settings_buttons, &QDialogButtonBox::clicked, this, - &AOOptionsDialog::buttonClicked); + connect(ui_settings_buttons, &QDialogButtonBox::accepted, this, &AOOptionsDialog::savePressed); + connect(ui_settings_buttons, &QDialogButtonBox::rejected, this, &AOOptionsDialog::discardPressed); + connect(ui_settings_buttons, &QDialogButtonBox::clicked, this, &AOOptionsDialog::buttonClicked); // Gameplay Tab - FROM_UI(QComboBox, theme_combobox) - connect(ui_theme_combobox, - QOverload<int>::of(&QComboBox::currentIndexChanged), this, - &AOOptionsDialog::themeChanged); + FROM_UI(QComboBox, theme_combobox); + connect(ui_theme_combobox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &AOOptionsDialog::themeChanged); - registerOption<QComboBox, QString>("theme_combobox", &Options::theme, - &Options::setTheme); + registerOption<QComboBox, QString>("theme_combobox", &Options::theme, &Options::setTheme); - FROM_UI(QComboBox, subtheme_combobox) - registerOption<QComboBox, QString>("subtheme_combobox", &Options::settingsSubTheme, - &Options::setSettingsSubTheme); + FROM_UI(QComboBox, subtheme_combobox); + registerOption<QComboBox, QString>("subtheme_combobox", &Options::settingsSubTheme, &Options::setSettingsSubTheme); - FROM_UI(QPushButton, theme_reload_button) - connect(ui_theme_reload_button, &QPushButton::clicked, this, - &::AOOptionsDialog::onReloadThemeClicked); + FROM_UI(QPushButton, theme_reload_button); + connect(ui_theme_reload_button, &QPushButton::clicked, this, &::AOOptionsDialog::onReloadThemeClicked); - FROM_UI(QPushButton, theme_folder_button) + FROM_UI(QPushButton, theme_folder_button); connect(ui_theme_folder_button, &QPushButton::clicked, this, [=] { - QString p_path = ao_app->get_real_path(ao_app->get_theme_path( - "", ui_theme_combobox->itemText(ui_theme_combobox->currentIndex()))); - if (!dir_exists(p_path)) { + QString p_path = ao_app->get_real_path(ao_app->get_theme_path("", ui_theme_combobox->itemText(ui_theme_combobox->currentIndex()))); + if (!dir_exists(p_path)) + { return; } QDesktopServices::openUrl(QUrl::fromLocalFile(p_path)); }); - FROM_UI(QSpinBox, theme_scaling_factor_sb) - FROM_UI(QCheckBox, animated_theme_cb) - FROM_UI(QSpinBox, stay_time_spinbox) - FROM_UI(QCheckBox, instant_objection_cb) - FROM_UI(QSpinBox, text_crawl_spinbox) - FROM_UI(QSpinBox, chat_ratelimit_spinbox) - FROM_UI(QLineEdit, username_textbox) - FROM_UI(QCheckBox, showname_cb) - FROM_UI(QLineEdit, default_showname_textbox) - FROM_UI(QLineEdit, ms_textbox) - FROM_UI(QCheckBox, discord_cb) - FROM_UI(QComboBox, language_combobox) - FROM_UI(QComboBox, scaling_combobox) - FROM_UI(QCheckBox, shake_cb) - FROM_UI(QCheckBox, effects_cb) - FROM_UI(QCheckBox, framenetwork_cb) - FROM_UI(QCheckBox, colorlog_cb) - FROM_UI(QCheckBox, stickysounds_cb) - FROM_UI(QCheckBox, stickyeffects_cb) - FROM_UI(QCheckBox, stickypres_cb) - FROM_UI(QCheckBox, customchat_cb) - FROM_UI(QCheckBox, sticker_cb) - FROM_UI(QCheckBox, continuous_cb) - FROM_UI(QCheckBox, category_stop_cb) - FROM_UI(QCheckBox, sfx_on_idle_cb) - FROM_UI(QCheckBox, evidence_double_click_cb) - - registerOption<QSpinBox, int>("theme_scaling_factor_sb", - &Options::themeScalingFactor, - &Options::setThemeScalingFactor); - registerOption<QCheckBox, bool>("animated_theme_cb", - &Options::animatedThemeEnabled, - &Options::setAnimatedThemeEnabled); - registerOption<QSpinBox, int>("stay_time_spinbox", &Options::textStayTime, - &Options::setTextStayTime); - registerOption<QCheckBox, bool>("instant_objection_cb", - &Options::objectionSkipQueueEnabled, - &Options::setObjectionSkipQueueEnabled); - registerOption<QSpinBox, int>("text_crawl_spinbox", &Options::textCrawlSpeed, - &Options::setTextCrawlSpeed); - registerOption<QSpinBox, int>("chat_ratelimit_spinbox", - &Options::chatRateLimit, - &Options::setChatRateLimit); - registerOption<QLineEdit, QString>("username_textbox", &Options::username, - &Options::setUsername); - registerOption<QCheckBox, bool>("showname_cb", - &Options::customShownameEnabled, - &Options::setCustomShownameEnabled); - registerOption<QLineEdit, QString>("default_showname_textbox", - &Options::shownameOnJoin, - &Options::setShownameOnJoin); - registerOption<QLineEdit, QString>("ms_textbox", - &Options::alternativeMasterserver, - &Options::setAlternativeMasterserver); - registerOption<QCheckBox, bool>("discord_cb", &Options::discordEnabled, - &Options::setDiscordEnabled); - registerOption<QComboBox, QString>("language_combobox", &Options::language, - &Options::setLanguage); + FROM_UI(QSpinBox, theme_scaling_factor_sb); + FROM_UI(QCheckBox, animated_theme_cb); + FROM_UI(QSpinBox, stay_time_spinbox); + FROM_UI(QCheckBox, instant_objection_cb); + FROM_UI(QSpinBox, text_crawl_spinbox); + FROM_UI(QSpinBox, chat_ratelimit_spinbox); + FROM_UI(QLineEdit, username_textbox); + FROM_UI(QCheckBox, showname_cb); + FROM_UI(QLineEdit, default_showname_textbox); + FROM_UI(QLineEdit, ms_textbox); + FROM_UI(QCheckBox, discord_cb); + FROM_UI(QComboBox, language_combobox); + FROM_UI(QComboBox, scaling_combobox); + FROM_UI(QCheckBox, shake_cb); + FROM_UI(QCheckBox, effects_cb); + FROM_UI(QCheckBox, framenetwork_cb); + FROM_UI(QCheckBox, colorlog_cb); + FROM_UI(QCheckBox, stickysounds_cb); + FROM_UI(QCheckBox, stickyeffects_cb); + FROM_UI(QCheckBox, stickypres_cb); + FROM_UI(QCheckBox, customchat_cb); + FROM_UI(QCheckBox, sticker_cb); + FROM_UI(QCheckBox, continuous_cb); + FROM_UI(QCheckBox, category_stop_cb); + FROM_UI(QCheckBox, sfx_on_idle_cb); + FROM_UI(QCheckBox, evidence_double_click_cb); + + registerOption<QSpinBox, int>("theme_scaling_factor_sb", &Options::themeScalingFactor, &Options::setThemeScalingFactor); + registerOption<QCheckBox, bool>("animated_theme_cb", &Options::animatedThemeEnabled, &Options::setAnimatedThemeEnabled); + registerOption<QSpinBox, int>("stay_time_spinbox", &Options::textStayTime, &Options::setTextStayTime); + registerOption<QCheckBox, bool>("instant_objection_cb", &Options::objectionSkipQueueEnabled, &Options::setObjectionSkipQueueEnabled); + registerOption<QSpinBox, int>("text_crawl_spinbox", &Options::textCrawlSpeed, &Options::setTextCrawlSpeed); + registerOption<QSpinBox, int>("chat_ratelimit_spinbox", &Options::chatRateLimit, &Options::setChatRateLimit); + registerOption<QLineEdit, QString>("username_textbox", &Options::username, &Options::setUsername); + registerOption<QCheckBox, bool>("showname_cb", &Options::customShownameEnabled, &Options::setCustomShownameEnabled); + registerOption<QLineEdit, QString>("default_showname_textbox", &Options::shownameOnJoin, &Options::setShownameOnJoin); + registerOption<QLineEdit, QString>("ms_textbox", &Options::alternativeMasterserver, &Options::setAlternativeMasterserver); + registerOption<QCheckBox, bool>("discord_cb", &Options::discordEnabled, &Options::setDiscordEnabled); + registerOption<QComboBox, QString>("language_combobox", &Options::language, &Options::setLanguage); ui_language_combobox->addItem("English", "en"); ui_language_combobox->addItem("Deutsch", "de"); @@ -407,108 +379,69 @@ void AOOptionsDialog::setupUI() ui_language_combobox->addItem("日本語", "jp"); ui_language_combobox->addItem("Русский", "ru"); - registerOption<QComboBox, QString>("scaling_combobox", - &Options::defaultScalingMode, - &Options::setDefaultScalingMode); + registerOption<QComboBox, QString>("scaling_combobox", &Options::defaultScalingMode, &Options::setDefaultScalingMode); // Populate scaling dropdown. This is necessary as we need the user data // embeeded into the entry. ui_scaling_combobox->addItem(tr("Pixel"), "fast"); ui_scaling_combobox->addItem(tr("Smooth"), "smooth"); - registerOption<QCheckBox, bool>("shake_cb", &Options::shakeEnabled, - &Options::setShakeEnabled); - registerOption<QCheckBox, bool>("effects_cb", &Options::effectsEnabled, - &Options::setEffectsEnabled); - registerOption<QCheckBox, bool>("framenetwork_cb", - &Options::networkedFrameSfxEnabled, - &Options::setNetworkedFrameSfxEnabled); - registerOption<QCheckBox, bool>("colorlog_cb", &Options::colorLogEnabled, - &Options::setColorLogEnabled); - registerOption<QCheckBox, bool>( - "stickysounds_cb", &Options::clearSoundsDropdownOnPlayEnabled, - &Options::setClearSoundsDropdownOnPlayEnabled); - registerOption<QCheckBox, bool>( - "stickyeffects_cb", &Options::clearEffectsDropdownOnPlayEnabled, - &Options::setClearEffectsDropdownOnPlayEnabled); - registerOption<QCheckBox, bool>("stickypres_cb", - &Options::clearPreOnPlayEnabled, - &Options::setClearPreOnPlayEnabled); - registerOption<QCheckBox, bool>("customchat_cb", - &Options::customChatboxEnabled, - &Options::setCustomChatboxEnabled); - registerOption<QCheckBox, bool>("sticker_cb", - &Options::characterStickerEnabled, - &Options::setCharacterStickerEnabled); - registerOption<QCheckBox, bool>("continuous_cb", - &Options::continuousPlaybackEnabled, - &Options::setContinuousPlaybackEnabled); - registerOption<QCheckBox, bool>("category_stop_cb", - &Options::stopMusicOnCategoryEnabled, - &Options::setStopMusicOnCategoryEnabled); - registerOption<QCheckBox, bool>("sfx_on_idle_cb", - &Options::playSelectedSFXOnIdle, - &Options::setPlaySelectedSFXOnIdle); - registerOption<QCheckBox, bool>("evidence_double_click_cb", - &Options::evidenceDoubleClickEdit, - &Options::setEvidenceDoubleClickEdit); + registerOption<QCheckBox, bool>("shake_cb", &Options::shakeEnabled, &Options::setShakeEnabled); + registerOption<QCheckBox, bool>("effects_cb", &Options::effectsEnabled, &Options::setEffectsEnabled); + registerOption<QCheckBox, bool>("framenetwork_cb", &Options::networkedFrameSfxEnabled, &Options::setNetworkedFrameSfxEnabled); + registerOption<QCheckBox, bool>("colorlog_cb", &Options::colorLogEnabled, &Options::setColorLogEnabled); + registerOption<QCheckBox, bool>("stickysounds_cb", &Options::clearSoundsDropdownOnPlayEnabled, &Options::setClearSoundsDropdownOnPlayEnabled); + registerOption<QCheckBox, bool>("stickyeffects_cb", &Options::clearEffectsDropdownOnPlayEnabled, &Options::setClearEffectsDropdownOnPlayEnabled); + registerOption<QCheckBox, bool>("stickypres_cb", &Options::clearPreOnPlayEnabled, &Options::setClearPreOnPlayEnabled); + registerOption<QCheckBox, bool>("customchat_cb", &Options::customChatboxEnabled, &Options::setCustomChatboxEnabled); + registerOption<QCheckBox, bool>("sticker_cb", &Options::characterStickerEnabled, &Options::setCharacterStickerEnabled); + registerOption<QCheckBox, bool>("continuous_cb", &Options::continuousPlaybackEnabled, &Options::setContinuousPlaybackEnabled); + registerOption<QCheckBox, bool>("category_stop_cb", &Options::stopMusicOnCategoryEnabled, &Options::setStopMusicOnCategoryEnabled); + registerOption<QCheckBox, bool>("sfx_on_idle_cb", &Options::playSelectedSFXOnIdle, &Options::setPlaySelectedSFXOnIdle); + registerOption<QCheckBox, bool>("evidence_double_click_cb", &Options::evidenceDoubleClickEdit, &Options::setEvidenceDoubleClickEdit); // Callwords tab. This could just be a QLineEdit, but no, we decided to allow // people to put a billion entries in. - FROM_UI(QPlainTextEdit, callwords_textbox) - registerOption<QPlainTextEdit, QStringList>( - "callwords_textbox", &Options::callwords, &Options::setCallwords); + FROM_UI(QPlainTextEdit, callwords_textbox); + registerOption<QPlainTextEdit, QStringList>("callwords_textbox", &Options::callwords, &Options::setCallwords); // Audio tab. - FROM_UI(QComboBox, audio_device_combobox) + FROM_UI(QComboBox, audio_device_combobox); populateAudioDevices(); - registerOption<QComboBox, QString>("audio_device_combobox", - &Options::audioOutputDevice, - &Options::setAudioOutputDevice); - - FROM_UI(QSpinBox, suppress_audio_spinbox) - FROM_UI(QSpinBox, bliprate_spinbox) - FROM_UI(QCheckBox, blank_blips_cb) - FROM_UI(QCheckBox, loopsfx_cb) - FROM_UI(QCheckBox, objectmusic_cb) - FROM_UI(QCheckBox, disablestreams_cb) - - registerOption<QSpinBox, int>("suppress_audio_spinbox", - &::Options::defaultSuppressAudio, - &Options::setDefaultSupressedAudio); - registerOption<QSpinBox, int>("bliprate_spinbox", &::Options::blipRate, - &Options::setBlipRate); - registerOption<QCheckBox, bool>("blank_blips_cb", &Options::blankBlip, - &Options::setBlankBlip); - registerOption<QCheckBox, bool>("loopsfx_cb", &Options::loopingSfx, - &Options::setLoopingSfx); - registerOption<QCheckBox, bool>("objectmusic_cb", - &Options::objectionStopMusic, - &Options::setObjectionStopMusic); - registerOption<QCheckBox, bool>("disablestreams_cb", - &Options::streamingEnabled, - &Options::setStreamingEnabled); + registerOption<QComboBox, QString>("audio_device_combobox", &Options::audioOutputDevice, &Options::setAudioOutputDevice); + + FROM_UI(QSpinBox, suppress_audio_spinbox); + FROM_UI(QSpinBox, bliprate_spinbox); + FROM_UI(QCheckBox, blank_blips_cb); + FROM_UI(QCheckBox, loopsfx_cb); + FROM_UI(QCheckBox, objectmusic_cb); + FROM_UI(QCheckBox, disablestreams_cb); + + registerOption<QSpinBox, int>("suppress_audio_spinbox", &::Options::defaultSuppressAudio, &Options::setDefaultSupressedAudio); + registerOption<QSpinBox, int>("bliprate_spinbox", &::Options::blipRate, &Options::setBlipRate); + registerOption<QCheckBox, bool>("blank_blips_cb", &Options::blankBlip, &Options::setBlankBlip); + registerOption<QCheckBox, bool>("loopsfx_cb", &Options::loopingSfx, &Options::setLoopingSfx); + registerOption<QCheckBox, bool>("objectmusic_cb", &Options::objectionStopMusic, &Options::setObjectionStopMusic); + registerOption<QCheckBox, bool>("disablestreams_cb", &Options::streamingEnabled, &Options::setStreamingEnabled); // Asset tab - FROM_UI(QListWidget, mount_list) - auto *defaultMount = - new QListWidgetItem(tr("%1 (default)").arg(get_base_path())); + FROM_UI(QListWidget, mount_list); + auto *defaultMount = new QListWidgetItem(tr("%1 (default)").arg(get_base_path())); defaultMount->setFlags(Qt::ItemFlag::NoItemFlags); ui_mount_list->addItem(defaultMount); - registerOption<QListWidget, QStringList>("mount_list", &Options::mountPaths, - &Options::setMountPaths); + registerOption<QListWidget, QStringList>("mount_list", &Options::mountPaths, &Options::setMountPaths); - FROM_UI(QPushButton, mount_add) + FROM_UI(QPushButton, mount_add); connect(ui_mount_add, &QPushButton::clicked, this, [this] { - QString path = QFileDialog::getExistingDirectory( - this, tr("Select a base folder"), QApplication::applicationDirPath(), - QFileDialog::ShowDirsOnly); - if (path.isEmpty()) { + QString path = QFileDialog::getExistingDirectory(this, tr("Select a base folder"), QApplication::applicationDirPath(), QFileDialog::ShowDirsOnly); + if (path.isEmpty()) + { return; } QDir dir(QApplication::applicationDirPath()); QString relative = dir.relativeFilePath(path); - if (!relative.contains("../")) { + if (!relative.contains("../")) + { path = relative; } QListWidgetItem *dir_item = new QListWidgetItem(path); @@ -516,22 +449,28 @@ void AOOptionsDialog::setupUI() ui_mount_list->setCurrentItem(dir_item); // quick hack to update buttons - emit ui_mount_list->itemSelectionChanged(); + Q_EMIT ui_mount_list->itemSelectionChanged(); }); - FROM_UI(QPushButton, mount_remove) + FROM_UI(QPushButton, mount_remove); connect(ui_mount_remove, &QPushButton::clicked, this, [this] { auto selected = ui_mount_list->selectedItems(); - if (selected.isEmpty()) return; + if (selected.isEmpty()) + { + return; + } delete selected[0]; - emit ui_mount_list->itemSelectionChanged(); + Q_EMIT ui_mount_list->itemSelectionChanged(); asset_cache_dirty = true; }); - FROM_UI(QPushButton, mount_up) + FROM_UI(QPushButton, mount_up); connect(ui_mount_up, &QPushButton::clicked, this, [this] { auto selected = ui_mount_list->selectedItems(); - if (selected.isEmpty()) return; + if (selected.isEmpty()) + { + return; + } auto *item = selected[0]; int row = ui_mount_list->row(item); ui_mount_list->takeItem(row); @@ -541,10 +480,13 @@ void AOOptionsDialog::setupUI() asset_cache_dirty = true; }); - FROM_UI(QPushButton, mount_down) + FROM_UI(QPushButton, mount_down); connect(ui_mount_down, &QPushButton::clicked, this, [this] { auto selected = ui_mount_list->selectedItems(); - if (selected.isEmpty()) return; + if (selected.isEmpty()) + { + return; + } auto *item = selected[0]; int row = ui_mount_list->row(item); ui_mount_list->takeItem(row); @@ -554,7 +496,7 @@ void AOOptionsDialog::setupUI() asset_cache_dirty = true; }); - FROM_UI(QPushButton, mount_clear_cache) + FROM_UI(QPushButton, mount_clear_cache); connect(ui_mount_clear_cache, &QPushButton::clicked, this, [this] { asset_cache_dirty = true; ui_mount_clear_cache->setEnabled(false); @@ -567,48 +509,43 @@ void AOOptionsDialog::setupUI() ui_mount_up->setEnabled(row_selected); ui_mount_down->setEnabled(row_selected); - if (!row_selected) return; + if (!row_selected) + { + return; + } int row = ui_mount_list->row(selected_items[0]); - if (row <= 1) ui_mount_up->setEnabled(false); - if (row >= ui_mount_list->count() - 1) ui_mount_down->setEnabled(false); + if (row <= 1) + { + ui_mount_up->setEnabled(false); + } + if (row >= ui_mount_list->count() - 1) + { + ui_mount_down->setEnabled(false); + } }); // Logging tab - FROM_UI(QCheckBox, downwards_cb) - FROM_UI(QSpinBox, length_spinbox) - FROM_UI(QCheckBox, log_newline_cb) - FROM_UI(QSpinBox, log_margin_spinbox) - FROM_UI(QLabel, log_timestamp_format_lbl) - FROM_UI(QComboBox, log_timestamp_format_combobox) - - registerOption<QCheckBox, bool>("downwards_cb", - &Options::logDirectionDownwards, - &Options::setLogDirectionDownwards); - registerOption<QSpinBox, int>("length_spinbox", &Options::maxLogSize, - &Options::setMaxLogSize); - registerOption<QCheckBox, bool>("log_newline_cb", &Options::logNewline, - &Options::setLogNewline); - registerOption<QSpinBox, int>("log_margin_spinbox", &Options::logMargin, - &Options::setLogMargin); - - FROM_UI(QCheckBox, log_timestamp_cb) - registerOption<QCheckBox, bool>("log_timestamp_cb", - &Options::logTimestampEnabled, - &Options::setLogTimestampEnabled); - connect(ui_log_timestamp_cb, &QCheckBox::stateChanged, this, - &::AOOptionsDialog::timestampCbChanged); - ui_log_timestamp_format_lbl->setText( - tr("Log timestamp format:\n") + - QDateTime::currentDateTime().toString( - Options::getInstance().logTimestampFormat())); - - FROM_UI(QComboBox, log_timestamp_format_combobox) - registerOption<QComboBox, QString>("log_timestamp_format_combobox", - &Options::logTimestampFormat, - &Options::setLogTimestampFormat); - connect(ui_log_timestamp_format_combobox, &QComboBox::currentTextChanged, - this, &::AOOptionsDialog::onTimestampFormatEdited); + FROM_UI(QCheckBox, downwards_cb); + FROM_UI(QSpinBox, length_spinbox); + FROM_UI(QCheckBox, log_newline_cb); + FROM_UI(QSpinBox, log_margin_spinbox); + FROM_UI(QLabel, log_timestamp_format_lbl); + FROM_UI(QComboBox, log_timestamp_format_combobox); + + registerOption<QCheckBox, bool>("downwards_cb", &Options::logDirectionDownwards, &Options::setLogDirectionDownwards); + registerOption<QSpinBox, int>("length_spinbox", &Options::maxLogSize, &Options::setMaxLogSize); + registerOption<QCheckBox, bool>("log_newline_cb", &Options::logNewline, &Options::setLogNewline); + registerOption<QSpinBox, int>("log_margin_spinbox", &Options::logMargin, &Options::setLogMargin); + + FROM_UI(QCheckBox, log_timestamp_cb); + registerOption<QCheckBox, bool>("log_timestamp_cb", &Options::logTimestampEnabled, &Options::setLogTimestampEnabled); + connect(ui_log_timestamp_cb, &QCheckBox::stateChanged, this, &::AOOptionsDialog::timestampCbChanged); + ui_log_timestamp_format_lbl->setText(tr("Log timestamp format:\n") + QDateTime::currentDateTime().toString(Options::getInstance().logTimestampFormat())); + + FROM_UI(QComboBox, log_timestamp_format_combobox); + registerOption<QComboBox, QString>("log_timestamp_format_combobox", &Options::logTimestampFormat, &Options::setLogTimestampFormat); + connect(ui_log_timestamp_format_combobox, &QComboBox::currentTextChanged, this, &::AOOptionsDialog::onTimestampFormatEdited); QString l_current_format = Options::getInstance().logTimestampFormat(); @@ -620,28 +557,26 @@ void AOOptionsDialog::setupUI() ui_log_timestamp_format_combobox->addItem("h:mm AP", "h:mm AP"); ui_log_timestamp_format_combobox->addItem("hh:mm", "hh:mm"); - if (!Options::getInstance().logTimestampEnabled()) { + if (!Options::getInstance().logTimestampEnabled()) + { ui_log_timestamp_format_combobox->setDisabled(true); } - FROM_UI(QCheckBox, log_ic_actions_cb) - FROM_UI(QCheckBox, desync_logs_cb) - FROM_UI(QCheckBox, log_text_cb) + FROM_UI(QCheckBox, log_ic_actions_cb); + FROM_UI(QCheckBox, desync_logs_cb); + FROM_UI(QCheckBox, log_text_cb); - registerOption<QCheckBox, bool>("log_ic_actions_cb", &Options::logIcActions, - &Options::setLogIcActions); - registerOption<QCheckBox, bool>("desync_logs_cb", - &Options::desynchronisedLogsEnabled, - &Options::setDesynchronisedLogsEnabled); - registerOption<QCheckBox, bool>("log_text_cb", &Options::logToTextFileEnabled, - &Options::setLogToTextFileEnabled); - registerOption<QCheckBox, bool>("log_demo_cb", &Options::logToDemoFileEnabled, - &Options::setLogToDemoFileEnabled); + registerOption<QCheckBox, bool>("log_ic_actions_cb", &Options::logIcActions, &Options::setLogIcActions); + registerOption<QCheckBox, bool>("desync_logs_cb", &Options::desynchronisedLogsEnabled, &Options::setDesynchronisedLogsEnabled); + registerOption<QCheckBox, bool>("log_text_cb", &Options::logToTextFileEnabled, &Options::setLogToTextFileEnabled); + registerOption<QCheckBox, bool>("log_demo_cb", &Options::logToDemoFileEnabled, &Options::setLogToDemoFileEnabled); // DSGVO/Privacy tab - FROM_UI(QTextBrowser, privacy_policy) + FROM_UI(QTextBrowser, privacy_policy); ui_privacy_policy->setPlainText(tr("Getting privacy policy...")); + FROM_UI(QCheckBox, privacy_optout_cb); + registerOption<QCheckBox, bool>("privacy_optout", &Options::playerCountOptout, &Options::setPlayerCountOptout); updateValues(); } @@ -653,9 +588,7 @@ void AOOptionsDialog::onTimestampFormatEdited() ui_log_timestamp_format_combobox->setItemText(index, format); ui_log_timestamp_format_combobox->setItemData(index, format); - ui_log_timestamp_format_lbl->setText( - tr("Log timestamp format:\n") + - QDateTime::currentDateTime().toString(format)); + ui_log_timestamp_format_lbl->setText(tr("Log timestamp format:\n") + QDateTime::currentDateTime().toString(format)); } void AOOptionsDialog::timestampCbChanged(int state) @@ -664,11 +597,20 @@ void AOOptionsDialog::timestampCbChanged(int state) } #if (defined(_WIN32) || defined(_WIN64)) -bool AOOptionsDialog::needsDefaultAudioDevice() { return true; } +bool AOOptionsDialog::needsDefaultAudioDevice() +{ + return true; +} #elif (defined(LINUX) || defined(__linux__)) -bool AOOptionsDialog::needsDefaultAudioDevice() { return false; } +bool AOOptionsDialog::needsDefaultAudioDevice() +{ + return false; +} #elif defined __APPLE__ -bool AOOptionsDialog::needsDefaultAudioDevice() { return true; } +bool AOOptionsDialog::needsDefaultAudioDevice() +{ + return true; +} #else #error This operating system is not supported. #endif diff --git a/src/widgets/aooptionsdialog.h b/src/widgets/aooptionsdialog.h new file mode 100644 index 00000000..bccec581 --- /dev/null +++ b/src/widgets/aooptionsdialog.h @@ -0,0 +1,153 @@ +#pragma once + +#include "options.h" + +#include <QApplication> +#include <QCheckBox> +#include <QComboBox> +#include <QDialog> +#include <QDialogButtonBox> +#include <QLabel> +#include <QLineEdit> +#include <QListWidget> +#include <QPlainTextEdit> +#include <QPushButton> +#include <QScrollArea> +#include <QSpinBox> +#include <QTabWidget> +#include <QTextBrowser> +#include <QVariant> + +class AOApplication; + +struct OptionEntry +{ + std::function<void()> load; + std::function<void()> save; +}; + +class AOOptionsDialog : public QDialog +{ + Q_OBJECT + +public: + explicit AOOptionsDialog(AOApplication *p_ao_app, QWidget *parent = nullptr); + +private: + AOApplication *ao_app; + + // Dialog interaction buttons. Save/Discard/Restore Defaults + QDialogButtonBox *ui_settings_buttons; + + // The gameplay tab + QWidget *ui_settings_widget; + QComboBox *ui_theme_combobox; + QComboBox *ui_subtheme_combobox; + QSpinBox *ui_theme_scaling_factor_sb; + QPushButton *ui_theme_reload_button; + QPushButton *ui_theme_folder_button; + QCheckBox *ui_evidence_double_click_cb; + QCheckBox *ui_animated_theme_cb; + QSpinBox *ui_stay_time_spinbox; + QCheckBox *ui_instant_objection_cb; + QSpinBox *ui_text_crawl_spinbox; + QSpinBox *ui_chat_ratelimit_spinbox; + QFrame *ui_log_names_divider; + QLineEdit *ui_username_textbox; + QCheckBox *ui_showname_cb; + QLineEdit *ui_default_showname_textbox; + QFrame *ui_net_divider; + QLineEdit *ui_ms_textbox; + QCheckBox *ui_discord_cb; + QLabel *ui_language_label; + QComboBox *ui_language_combobox; + QLabel *ui_scaling_label; + QComboBox *ui_scaling_combobox; + QCheckBox *ui_shake_cb; + QCheckBox *ui_effects_cb; + QCheckBox *ui_framenetwork_cb; + QCheckBox *ui_colorlog_cb; + QCheckBox *ui_stickysounds_cb; + QCheckBox *ui_stickyeffects_cb; + QCheckBox *ui_stickypres_cb; + QCheckBox *ui_customchat_cb; + QCheckBox *ui_sticker_cb; + QCheckBox *ui_continuous_cb; + QCheckBox *ui_category_stop_cb; + QCheckBox *ui_sfx_on_idle_cb; + + // The callwords tab + QPlainTextEdit *ui_callwords_textbox; + QCheckBox *ui_callwords_char_textbox; + + // The audio tab + QWidget *ui_audio_tab; + QWidget *ui_audio_widget; + QComboBox *ui_audio_device_combobox; + QSpinBox *ui_suppress_audio_spinbox; + QFrame *ui_volume_blip_divider; + QSpinBox *ui_bliprate_spinbox; + QCheckBox *ui_blank_blips_cb; + QCheckBox *ui_loopsfx_cb; + QCheckBox *ui_objectmusic_cb; + QCheckBox *ui_disablestreams_cb; + + // The asset tab + QListWidget *ui_mount_list; + QPushButton *ui_mount_add; + QPushButton *ui_mount_remove; + QPushButton *ui_mount_up; + QPushButton *ui_mount_down; + QPushButton *ui_mount_clear_cache; + + // The logging tab + QCheckBox *ui_downwards_cb; + QSpinBox *ui_length_spinbox; + QCheckBox *ui_log_newline_cb; + QSpinBox *ui_log_margin_spinbox; + QLabel *ui_log_timestamp_format_lbl; + QCheckBox *ui_log_timestamp_cb; + QComboBox *ui_log_timestamp_format_combobox; + QCheckBox *ui_desync_logs_cb; + QCheckBox *ui_log_ic_actions_cb; + QCheckBox *ui_log_text_cb; + QCheckBox *ui_log_demo_cb; + + /** + * Allows the AO2 master server hoster to go broke. + */ + QWidget *ui_privacy_tab; + QCheckBox *ui_privacy_optout_cb; + QFrame *ui_privacy_separator; + QTextBrowser *ui_privacy_policy; + + bool asset_cache_dirty = false; + + bool needsDefaultAudioDevice(); + void populateAudioDevices(); + void updateValues(); + + QVector<OptionEntry> optionEntries; + + template <typename T, typename V> + void setWidgetData(T *widget, const V &value); + + template <typename T, typename V> + V widgetData(T *widget) const; + + template <typename T, typename V> + void registerOption(const QString &widgetName, V (Options::*getter)() const, void (Options::*setter)(V)); + +Q_SIGNALS: + void reloadThemeRequest(); + +private Q_SLOTS: + void savePressed(); + void discardPressed(); + void buttonClicked(QAbstractButton *button); + void onTimestampFormatEdited(); + void timestampCbChanged(int state); + void onReloadThemeClicked(); + void themeChanged(int i); + void setupUI(); +}; diff --git a/src/widgets/direct_connect_dialog.cpp b/src/widgets/direct_connect_dialog.cpp index 82eaa23a..40e75b76 100644 --- a/src/widgets/direct_connect_dialog.cpp +++ b/src/widgets/direct_connect_dialog.cpp @@ -1,74 +1,65 @@ -#include "widgets/direct_connect_dialog.h" +#include "direct_connect_dialog.h" +#include "debug_functions.h" +#include "gui_utils.h" #include "networkmanager.h" #include "options.h" -#include "debug_functions.h" -#include <QComboBox> -#include <QLabel> -#include <QLineEdit> -#include <QPushButton> -#include <QSpinBox> +#include <QStringBuilder> #include <QUiLoader> #include <QVBoxLayout> -#include <QRegularExpressionMatch> -#include <QStringBuilder> -#include <QUrl> -#define FROM_UI(type, name) \ - ; \ - ui_##name = findChild<type *>(#name); - -DirectConnectDialog::DirectConnectDialog(NetworkManager *p_net_manager) : - net_manager(p_net_manager) +DirectConnectDialog::DirectConnectDialog(NetworkManager *p_net_manager) + : net_manager(p_net_manager) { - QUiLoader l_loader(this); - QFile l_uiFile(Options::getInstance().getUIAsset(DEFAULT_UI)); + QUiLoader l_loader(this); + QFile l_uiFile(Options::getInstance().getUIAsset(DEFAULT_UI)); - if (!l_uiFile.open(QFile::ReadOnly)) { - qCritical() << "Unable to open file " << l_uiFile.fileName(); - return; - } - ui_widget = l_loader.load(&l_uiFile, this); + if (!l_uiFile.open(QFile::ReadOnly)) + { + qCritical() << "Unable to open file " << l_uiFile.fileName(); + return; + } + ui_widget = l_loader.load(&l_uiFile, this); - auto l_layout = new QVBoxLayout(this); - l_layout->addWidget(ui_widget); + auto l_layout = new QVBoxLayout(this); + l_layout->addWidget(ui_widget); - FROM_UI(QLineEdit, direct_hostname_edit) + FROM_UI(QLineEdit, direct_hostname_edit); - FROM_UI(QLabel, direct_connection_status_lbl) + FROM_UI(QLabel, direct_connection_status_lbl); - FROM_UI(QPushButton, direct_connect_button); - connect(ui_direct_connect_button, &QPushButton::pressed, - this, &DirectConnectDialog::onConnectPressed); - FROM_UI(QPushButton, direct_cancel_button); - connect(ui_direct_cancel_button, &QPushButton::pressed, - this, &DirectConnectDialog::close); + FROM_UI(QPushButton, direct_connect_button); + connect(ui_direct_connect_button, &QPushButton::pressed, this, &DirectConnectDialog::onConnectPressed); + FROM_UI(QPushButton, direct_cancel_button); + connect(ui_direct_cancel_button, &QPushButton::pressed, this, &DirectConnectDialog::close); - connect(net_manager, &NetworkManager::server_connected, - this, &DirectConnectDialog::onServerConnected); + connect(net_manager, &NetworkManager::server_connected, this, &DirectConnectDialog::onServerConnected); - connect(&connect_timeout, &QTimer::timeout, this, - &DirectConnectDialog::onConnectTimeout); - connect_timeout.setSingleShot(true); + connect(&connect_timeout, &QTimer::timeout, this, &DirectConnectDialog::onConnectTimeout); + connect_timeout.setSingleShot(true); } void DirectConnectDialog::onConnectPressed() { QString l_hostname = ui_direct_hostname_edit->text(); - if (!SCHEME_PATTERN.match(l_hostname).hasMatch()) { + if (!SCHEME_PATTERN.match(l_hostname).hasMatch()) + { l_hostname = "tcp://" % l_hostname; } QUrl l_url(l_hostname); - if (!l_url.isValid()) { + if (!l_url.isValid()) + { call_error(tr("Invalid URL.")); return; } - if (!to_connection_type.contains(l_url.scheme())) { + if (!to_connection_type.contains(l_url.scheme())) + { call_error(tr("Scheme not recognized. Must be either of the following: ") % QStringList::fromVector(to_connection_type.keys().toVector()).join(", ")); return; } - if (l_url.port() == -1) { + if (l_url.port() == -1) + { call_error(tr("Invalid server port.")); return; } diff --git a/src/widgets/direct_connect_dialog.h b/src/widgets/direct_connect_dialog.h new file mode 100644 index 00000000..fc34f748 --- /dev/null +++ b/src/widgets/direct_connect_dialog.h @@ -0,0 +1,43 @@ +#pragma once + +#include <QComboBox> +#include <QDialog> +#include <QLabel> +#include <QLineEdit> +#include <QPushButton> +#include <QRegularExpression> +#include <QSpinBox> +#include <QTimer> + +class NetworkManager; + +class DirectConnectDialog : public QDialog +{ + Q_OBJECT + +public: + DirectConnectDialog(NetworkManager *p_net_manager); + ~DirectConnectDialog() = default; + +private Q_SLOTS: + void onConnectPressed(); + void onServerConnected(); + void onConnectTimeout(); + +private: + NetworkManager *net_manager; + + QLineEdit *ui_direct_hostname_edit; + + QLabel *ui_direct_connection_status_lbl; + QPushButton *ui_direct_connect_button; + QPushButton *ui_direct_cancel_button; + + QWidget *ui_widget; + QTimer connect_timeout; + + const int TCP_INDEX = 0; + const QRegularExpression SCHEME_PATTERN{"^\\w+://.+$"}; + const int CONNECT_TIMEOUT = 5 * 1000; + const QString DEFAULT_UI = "direct_connect_dialog.ui"; +}; diff --git a/src/widgets/edit_server_dialog.cpp b/src/widgets/edit_server_dialog.cpp index 109e968f..a302f372 100644 --- a/src/widgets/edit_server_dialog.cpp +++ b/src/widgets/edit_server_dialog.cpp @@ -1,87 +1,75 @@ -#include "widgets/edit_server_dialog.h" +#include "edit_server_dialog.h" + #include "datatypes.h" +#include "gui_utils.h" #include "options.h" -#include <QComboBox> -#include <QDebug> -#include <QDialogButtonBox> #include <QFile> -#include <QLineEdit> -#include <QLabel> -#include <QPlainTextEdit> -#include <QPushButton> -#include <QSpinBox> #include <QUiLoader> #include <QVBoxLayout> -#define FROM_UI(type, name) \ - ; \ - ui_##name = findChild<type *>(#name); - -EditServerDialog::EditServerDialog(int index) : - index(index) // lol +EditServerDialog::EditServerDialog(int index) + : index(index) // lol { - QUiLoader l_loader(this); - QFile l_uiFile(Options::getInstance().getUIAsset(DEFAULT_UI)); + QUiLoader l_loader(this); + QFile l_uiFile(Options::getInstance().getUIAsset(DEFAULT_UI)); - if (!l_uiFile.open(QFile::ReadOnly)) { - qCritical() << "Unable to open file " << l_uiFile.fileName(); - return; - } - ui_widget = l_loader.load(&l_uiFile, this); + if (!l_uiFile.open(QFile::ReadOnly)) + { + qCritical() << "Unable to open file " << l_uiFile.fileName(); + return; + } + ui_widget = l_loader.load(&l_uiFile, this); - auto l_layout = new QVBoxLayout(this); - l_layout->addWidget(ui_widget); + auto l_layout = new QVBoxLayout(this); + l_layout->addWidget(ui_widget); - FROM_UI(QLineEdit, server_display_name_edit); - FROM_UI(QLineEdit, server_hostname_edit); - FROM_UI(QSpinBox, server_port_box); - FROM_UI(QComboBox, server_protocol_box); - FROM_UI(QPlainTextEdit, server_description_edit); - FROM_UI(QDialogButtonBox, server_dialog_button); - connect(ui_server_dialog_button, &QDialogButtonBox::accepted, this, - &::EditServerDialog::onSavePressed); - connect(ui_server_dialog_button, &QDialogButtonBox::rejected, this, - &EditServerDialog::onCancelPressed); + FROM_UI(QLineEdit, server_display_name_edit); + FROM_UI(QLineEdit, server_hostname_edit); + FROM_UI(QSpinBox, server_port_box); + FROM_UI(QComboBox, server_protocol_box); + FROM_UI(QPlainTextEdit, server_description_edit); + FROM_UI(QDialogButtonBox, server_dialog_button); + connect(ui_server_dialog_button, &QDialogButtonBox::accepted, this, &::EditServerDialog::onSavePressed); + connect(ui_server_dialog_button, &QDialogButtonBox::rejected, this, &EditServerDialog::onCancelPressed); - // We don't need you. - FROM_UI(QLabel, server_legacy_lbl); - FROM_UI(QLineEdit, server_legacy_edit); - FROM_UI(QPushButton, server_legacy_load_button); + // We don't need you. + FROM_UI(QLabel, server_legacy_lbl); + FROM_UI(QLineEdit, server_legacy_edit); + FROM_UI(QPushButton, server_legacy_load_button); - ui_server_legacy_lbl->setVisible(false); - ui_server_legacy_edit->setVisible(false); - ui_server_legacy_load_button->setVisible(false); + ui_server_legacy_lbl->setVisible(false); + ui_server_legacy_edit->setVisible(false); + ui_server_legacy_load_button->setVisible(false); - loadEntry(); + loadEntry(); } void EditServerDialog::loadEntry() { - server_type server = Options::getInstance().favorites().at(index); - ui_server_display_name_edit->setText(server.name); - ui_server_hostname_edit->setText(server.ip); - ui_server_port_box->setValue(server.port); - ui_server_description_edit->setPlainText(server.desc); - ui_server_protocol_box->setCurrentIndex(server.socket_type); + server_type server = Options::getInstance().favorites().at(index); + ui_server_display_name_edit->setText(server.name); + ui_server_hostname_edit->setText(server.ip); + ui_server_port_box->setValue(server.port); + ui_server_description_edit->setPlainText(server.desc); + ui_server_protocol_box->setCurrentIndex(server.socket_type); } void EditServerDialog::onSavePressed() { - server_type server; - server.name = ui_server_display_name_edit->text(); - server.ip = ui_server_hostname_edit->text(); - server.port = ui_server_port_box->value(); - server.desc = ui_server_description_edit->toPlainText(); - server.socket_type = - ui_server_protocol_box->currentIndex() == TCP_INDEX ? TCP : WEBSOCKETS; - Options::getInstance().updateFavorite(server, index); - close(); - deleteLater(); + server_type server; + server.name = ui_server_display_name_edit->text(); + server.ip = ui_server_hostname_edit->text(); + server.port = ui_server_port_box->value(); + server.desc = ui_server_description_edit->toPlainText(); + server.socket_type = ui_server_protocol_box->currentIndex() == TCP_INDEX ? TCP : WEBSOCKETS; + Options::getInstance().updateFavorite(server, index); + close(); + deleteLater(); } void EditServerDialog::onCancelPressed() { - close(); - deleteLater(); + close(); + deleteLater(); } diff --git a/src/widgets/edit_server_dialog.h b/src/widgets/edit_server_dialog.h new file mode 100644 index 00000000..628ea606 --- /dev/null +++ b/src/widgets/edit_server_dialog.h @@ -0,0 +1,42 @@ +#pragma once + +#include "interfaces/server_dialog.h" + +#include <QComboBox> +#include <QDialogButtonBox> +#include <QLabel> +#include <QLineEdit> +#include <QPlainTextEdit> +#include <QPushButton> +#include <QSpinBox> + +class EditServerDialog : public AttorneyOnline::UI::FavoriteServerDialog +{ + Q_OBJECT + +public: + EditServerDialog(int index); + ~EditServerDialog() = default; + +private: + QWidget *ui_widget; + + QLineEdit *ui_server_display_name_edit; + QLineEdit *ui_server_hostname_edit; + QSpinBox *ui_server_port_box; + QComboBox *ui_server_protocol_box; + QPlainTextEdit *ui_server_description_edit; + QDialogButtonBox *ui_server_dialog_button; + + // Legacy Server UI + QLabel *ui_server_legacy_lbl; + QLineEdit *ui_server_legacy_edit; + QPushButton *ui_server_legacy_load_button; + + int index; + void loadEntry(); + +private Q_SLOTS: + void onSavePressed() override; + void onCancelPressed() override; +}; |
