aboutsummaryrefslogtreecommitdiff
path: root/src/widgets
diff options
context:
space:
mode:
Diffstat (limited to 'src/widgets')
-rw-r--r--src/widgets/add_server_dialog.cpp44
-rw-r--r--src/widgets/add_server_dialog.h40
-rw-r--r--src/widgets/aooptionsdialog.cpp562
-rw-r--r--src/widgets/aooptionsdialog.h153
-rw-r--r--src/widgets/direct_connect_dialog.cpp75
-rw-r--r--src/widgets/direct_connect_dialog.h43
-rw-r--r--src/widgets/edit_server_dialog.cpp108
-rw-r--r--src/widgets/edit_server_dialog.h42
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;
+};