From 3881a583efd715fe06596caff92009221feba9cf Mon Sep 17 00:00:00 2001 From: WisoAltred Date: Tue, 28 Jan 2025 11:35:28 +0200 Subject: [PATCH 1/5] Allow selection of multiple folders in assets Allow (hack a) selection of multiple folders (in the same directory) in the assets prompt (with an ugly ui). --- src/widgets/aooptionsdialog.cpp | 40 ++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/src/widgets/aooptionsdialog.cpp b/src/widgets/aooptionsdialog.cpp index 57ea7d5bc..ec4d3e7b5 100644 --- a/src/widgets/aooptionsdialog.cpp +++ b/src/widgets/aooptionsdialog.cpp @@ -14,6 +14,7 @@ #include #include #include +#include AOOptionsDialog::AOOptionsDialog(AOApplication *p_ao_app, QWidget *parent) : QDialog(parent) @@ -445,20 +446,39 @@ void AOOptionsDialog::setupUI() FROM_UI(QPushButton, mount_add); connect(ui_mount_add, &QPushButton::clicked, this, [this] { - QString path = QFileDialog::getExistingDirectory(this, tr("Select a base folder"), get_app_path(), QFileDialog::ShowDirsOnly); - if (path.isEmpty()) + // QString path = QFileDialog::getExistingDirectory(this, tr("Select one or more base folders"), get_app_path(), QFileDialog::ShowDirsOnly); + + QFileDialog* _fileddialogue = new QFileDialog(this); + _fileddialogue->setFileMode(QFileDialog::Directory); + //Switches to non-native so the tree is obtainable, otherwise it will crash on varying platforms probably. + _fileddialogue->setOption(QFileDialog::DontUseNativeDialog, true); + _fileddialogue->findChild("treeView")->setSelectionMode(QAbstractItemView::MultiSelection); + + _fileddialogue->exec(); + QStringList _filepaths = _fileddialogue->selectedFiles(); + // qInfo() <<"Paths are " << _filepaths; + + if (_filepaths.isEmpty()) { return; } - QDir dir(get_app_path()); - QString relative = dir.relativeFilePath(path); - if (!relative.contains("../")) - { - path = relative; + + foreach(QString mountPath, _filepaths) { + if (_filepaths.indexOf(mountPath) == 0) { + continue; + } + QDir dir(get_app_path()); + QString relative = dir.relativeFilePath(mountPath); + if (!relative.contains("../")) + { + mountPath = relative; + } + QListWidgetItem *dir_item = new QListWidgetItem(mountPath); + ui_mount_list->addItem(dir_item); + ui_mount_list->setCurrentItem(dir_item); } - QListWidgetItem *dir_item = new QListWidgetItem(path); - ui_mount_list->addItem(dir_item); - ui_mount_list->setCurrentItem(dir_item); + + // quick hack to update buttons Q_EMIT ui_mount_list->itemSelectionChanged(); From 4f84e5c27d0ce15102f686d5157776d3ec271c44 Mon Sep 17 00:00:00 2001 From: Salanto <62221668+Salanto@users.noreply.github.com> Date: Wed, 29 Jan 2025 20:43:42 +0100 Subject: [PATCH 2/5] Add multiselect dialog for mounts closes #1065 --- CMakeLists.txt | 1 + src/widgets/aooptionsdialog.cpp | 67 +++++++++++++------------------ src/widgets/aooptionsdialog.h | 1 + src/widgets/multiselectdialog.cpp | 24 +++++++++++ src/widgets/multiselectdialog.h | 17 ++++++++ 5 files changed, 70 insertions(+), 40 deletions(-) create mode 100644 src/widgets/multiselectdialog.cpp create mode 100644 src/widgets/multiselectdialog.h diff --git a/CMakeLists.txt b/CMakeLists.txt index ebaaae253..843078c91 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -103,6 +103,7 @@ qt_add_executable(Attorney_Online src/screenslidetimer.h src/screenslidetimer.cpp src/moderation_functions.h src/moderation_functions.cpp src/network/serverinfo.h src/network/serverinfo.cpp + src/widgets/multiselectdialog.h src/widgets/multiselectdialog.cpp ) set_target_properties(Attorney_Online PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/bin") diff --git a/src/widgets/aooptionsdialog.cpp b/src/widgets/aooptionsdialog.cpp index ec4d3e7b5..c829710a6 100644 --- a/src/widgets/aooptionsdialog.cpp +++ b/src/widgets/aooptionsdialog.cpp @@ -6,7 +6,7 @@ #include "gui_utils.h" #include "networkmanager.h" #include "options.h" - +#include "multiselectdialog.h" #include #include @@ -14,7 +14,6 @@ #include #include #include -#include AOOptionsDialog::AOOptionsDialog(AOApplication *p_ao_app, QWidget *parent) : QDialog(parent) @@ -273,6 +272,31 @@ void AOOptionsDialog::onReloadThemeClicked() setupUI(); } +void AOOptionsDialog::onMountAddPressed() +{ + MultiSelectDialog mount_selection(this, tr("Select one or more mount folders"), get_app_path(), ""); + std::optional mount_paths = mount_selection.getExistingDirectories(); + + if (!mount_paths.has_value()) { + return; + } + + QDir app_dir(get_app_path()); + for(QString& mount_path : mount_paths.value()) { + QString relative = app_dir.relativeFilePath(mount_path); + if (!relative.contains("../")) + { + mount_path = relative; + } + QListWidgetItem *dir_item = new QListWidgetItem(mount_path); + ui_mount_list->addItem(dir_item); + ui_mount_list->setCurrentItem(dir_item); + } + + // quick hack to update buttons + Q_EMIT ui_mount_list->itemSelectionChanged(); +} + void AOOptionsDialog::themeChanged(int i) { ui_subtheme_combobox->clear(); @@ -445,44 +469,7 @@ void AOOptionsDialog::setupUI() registerOption("mount_list", &Options::mountPaths, &Options::setMountPaths); FROM_UI(QPushButton, mount_add); - connect(ui_mount_add, &QPushButton::clicked, this, [this] { - // QString path = QFileDialog::getExistingDirectory(this, tr("Select one or more base folders"), get_app_path(), QFileDialog::ShowDirsOnly); - - QFileDialog* _fileddialogue = new QFileDialog(this); - _fileddialogue->setFileMode(QFileDialog::Directory); - //Switches to non-native so the tree is obtainable, otherwise it will crash on varying platforms probably. - _fileddialogue->setOption(QFileDialog::DontUseNativeDialog, true); - _fileddialogue->findChild("treeView")->setSelectionMode(QAbstractItemView::MultiSelection); - - _fileddialogue->exec(); - QStringList _filepaths = _fileddialogue->selectedFiles(); - // qInfo() <<"Paths are " << _filepaths; - - if (_filepaths.isEmpty()) - { - return; - } - - foreach(QString mountPath, _filepaths) { - if (_filepaths.indexOf(mountPath) == 0) { - continue; - } - QDir dir(get_app_path()); - QString relative = dir.relativeFilePath(mountPath); - if (!relative.contains("../")) - { - mountPath = relative; - } - QListWidgetItem *dir_item = new QListWidgetItem(mountPath); - ui_mount_list->addItem(dir_item); - ui_mount_list->setCurrentItem(dir_item); - } - - - - // quick hack to update buttons - Q_EMIT ui_mount_list->itemSelectionChanged(); - }); + connect(ui_mount_add, &QPushButton::clicked, this, &AOOptionsDialog::onMountAddPressed); FROM_UI(QPushButton, mount_remove); connect(ui_mount_remove, &QPushButton::clicked, this, [this] { diff --git a/src/widgets/aooptionsdialog.h b/src/widgets/aooptionsdialog.h index 4409c9eff..54afb2ab2 100644 --- a/src/widgets/aooptionsdialog.h +++ b/src/widgets/aooptionsdialog.h @@ -150,6 +150,7 @@ private Q_SLOTS: void onTimestampFormatEdited(); void timestampCbChanged(int state); void onReloadThemeClicked(); + void onMountAddPressed(); void themeChanged(int i); void setupUI(); }; diff --git a/src/widgets/multiselectdialog.cpp b/src/widgets/multiselectdialog.cpp new file mode 100644 index 000000000..8e1fd1df1 --- /dev/null +++ b/src/widgets/multiselectdialog.cpp @@ -0,0 +1,24 @@ +#include "multiselectdialog.h" +#include + +MultiSelectDialog::MultiSelectDialog(QWidget *parent, const QString &caption, const QString &directory, const QString &filter) : + QFileDialog(parent, caption, directory, filter) +{ + setFileMode(QFileDialog::Directory); + setOption(QFileDialog::DontUseNativeDialog); + + internal_treeview = findChild("treeView"); + if (internal_treeview) { + internal_treeview->setSelectionMode(QAbstractItemView::MultiSelection); + } +} + +std::optional MultiSelectDialog::getExistingDirectories() +{ + setOption(Option::ShowDirsOnly); + setViewMode(ViewMode::Detail); + if (exec() == QDialog::Accepted) { + return std::make_optional(selectedFiles()); + } + return std::nullopt; +} diff --git a/src/widgets/multiselectdialog.h b/src/widgets/multiselectdialog.h new file mode 100644 index 000000000..e5922690a --- /dev/null +++ b/src/widgets/multiselectdialog.h @@ -0,0 +1,17 @@ +#pragma once + +#include +#include +#include + +class MultiSelectDialog : public QFileDialog +{ +public: + MultiSelectDialog(QWidget *parent = nullptr, const QString &caption = QString(), const QString &directory = QString(), const QString &filter = QString()); + + std::optional getExistingDirectories(); + +private: + // Qt internal objects + QTreeView* internal_treeview = nullptr; +}; From c9060695f0704ae9deff6f6d78624b2cb95d6d00 Mon Sep 17 00:00:00 2001 From: Salanto <62221668+Salanto@users.noreply.github.com> Date: Wed, 29 Jan 2025 20:56:52 +0100 Subject: [PATCH 3/5] Update aooptionsdialog.cpp --- src/widgets/aooptionsdialog.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/widgets/aooptionsdialog.cpp b/src/widgets/aooptionsdialog.cpp index c829710a6..77164f2e8 100644 --- a/src/widgets/aooptionsdialog.cpp +++ b/src/widgets/aooptionsdialog.cpp @@ -189,7 +189,7 @@ void AOOptionsDialog::updateValues() { QStringList l_themes = QDir(base + "/themes").entryList(QDir::Dirs | QDir::NoDotAndDotDot); - // Resorts list to match numeric sorting found in Windows. + // 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); @@ -293,7 +293,7 @@ void AOOptionsDialog::onMountAddPressed() ui_mount_list->setCurrentItem(dir_item); } - // quick hack to update buttons + // quick hack to update buttons Q_EMIT ui_mount_list->itemSelectionChanged(); } @@ -339,14 +339,14 @@ void AOOptionsDialog::setupUI() auto l_layout = new QVBoxLayout(this); l_layout->addWidget(ui_settings_widget); - // General dialog element. + // 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); - // Gameplay Tab + // Gameplay Tab FROM_UI(QComboBox, theme_combobox); connect(ui_theme_combobox, QOverload::of(&QComboBox::currentIndexChanged), this, &AOOptionsDialog::themeChanged); @@ -437,12 +437,12 @@ void AOOptionsDialog::setupUI() registerOption("restoreposition_cb", &Options::restoreWindowPositionEnabled, &Options::setRestoreWindowPositionEnabled); registerOption("playerlist_format_edit", &Options::playerlistFormatString, &Options::setPlayerlistFormatString); - // Callwords tab. This could just be a QLineEdit, but no, we decided to allow - // people to put a billion entries in. + // 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("callwords_textbox", &Options::callwords, &Options::setCallwords); - // Audio tab. + // Audio tab. FROM_UI(QComboBox, audio_device_combobox); populateAudioDevices(); registerOption("audio_device_combobox", &Options::audioOutputDevice, &Options::setAudioOutputDevice); @@ -461,7 +461,7 @@ void AOOptionsDialog::setupUI() registerOption("objectmusic_cb", &Options::objectionStopMusic, &Options::setObjectionStopMusic); registerOption("disablestreams_cb", &Options::streamingEnabled, &Options::setStreamingEnabled); - // Asset tab + // Asset tab FROM_UI(QListWidget, mount_list); auto *defaultMount = new QListWidgetItem(tr("%1 (default)").arg(get_base_path())); defaultMount->setFlags(Qt::ItemFlag::NoItemFlags); @@ -544,7 +544,7 @@ void AOOptionsDialog::setupUI() } }); - // Logging tab + // Logging tab FROM_UI(QCheckBox, downwards_cb); FROM_UI(QSpinBox, length_spinbox); FROM_UI(QCheckBox, log_newline_cb); @@ -590,7 +590,7 @@ void AOOptionsDialog::setupUI() registerOption("log_text_cb", &Options::logToTextFileEnabled, &Options::setLogToTextFileEnabled); registerOption("log_demo_cb", &Options::logToDemoFileEnabled, &Options::setLogToDemoFileEnabled); - // DSGVO/Privacy tab + // DSGVO/Privacy tab FROM_UI(QTextBrowser, privacy_policy); ui_privacy_policy->setPlainText(tr("Getting privacy policy...")); From 3c407662f56c162dd343fe3f9ad64c666b6fdb12 Mon Sep 17 00:00:00 2001 From: Salanto <62221668+Salanto@users.noreply.github.com> Date: Wed, 29 Jan 2025 20:58:16 +0100 Subject: [PATCH 4/5] Appease formatting? --- src/widgets/aooptionsdialog.cpp | 844 +++++++++++++++--------------- src/widgets/multiselectdialog.cpp | 24 +- src/widgets/multiselectdialog.h | 8 +- 3 files changed, 438 insertions(+), 438 deletions(-) diff --git a/src/widgets/aooptionsdialog.cpp b/src/widgets/aooptionsdialog.cpp index 77164f2e8..de1760bc9 100644 --- a/src/widgets/aooptionsdialog.cpp +++ b/src/widgets/aooptionsdialog.cpp @@ -19,616 +19,616 @@ AOOptionsDialog::AOOptionsDialog(AOApplication *p_ao_app, QWidget *parent) : QDialog(parent) , ao_app(p_ao_app) { - setupUI(); + setupUI(); } void AOOptionsDialog::populateAudioDevices() { - ui_audio_device_combobox->clear(); - if (needsDefaultAudioDevice()) - { - ui_audio_device_combobox->addItem("default", "default"); - } + ui_audio_device_combobox->clear(); + if (needsDefaultAudioDevice()) + { + ui_audio_device_combobox->addItem("default", "default"); + } - BASS_DEVICEINFO info; - for (int a = 0; BASS_GetDeviceInfo(a, &info); a++) - { - ui_audio_device_combobox->addItem(info.name, info.name); - } + BASS_DEVICEINFO info; + for (int a = 0; BASS_GetDeviceInfo(a, &info); a++) + { + ui_audio_device_combobox->addItem(info.name, info.name); + } } template <> void AOOptionsDialog::setWidgetData(QCheckBox *widget, const bool &value) { - widget->setChecked(value); + widget->setChecked(value); } template <> bool AOOptionsDialog::widgetData(QCheckBox *widget) const { - return widget->isChecked(); + return widget->isChecked(); } template <> void AOOptionsDialog::setWidgetData(QLineEdit *widget, const QString &value) { - widget->setText(value); + widget->setText(value); } template <> QString AOOptionsDialog::widgetData(QLineEdit *widget) const { - return widget->text(); + return widget->text(); } template <> void AOOptionsDialog::setWidgetData(QLineEdit *widget, const uint16_t &value) { - widget->setText(QString::number(value)); + widget->setText(QString::number(value)); } template <> uint16_t AOOptionsDialog::widgetData(QLineEdit *widget) const { - return widget->text().toUShort(); + return widget->text().toUShort(); } template <> void AOOptionsDialog::setWidgetData(QPlainTextEdit *widget, const QStringList &value) { - widget->setPlainText(value.join('\n')); + widget->setPlainText(value.join('\n')); } template <> QStringList AOOptionsDialog::widgetData(QPlainTextEdit *widget) const { - return widget->toPlainText().trimmed().split('\n'); + return widget->toPlainText().trimmed().split('\n'); } template <> void AOOptionsDialog::setWidgetData(QSpinBox *widget, const int &value) { - widget->setValue(value); + widget->setValue(value); } template <> int AOOptionsDialog::widgetData(QSpinBox *widget) const { - return widget->value(); + return widget->value(); } 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++) { - widget->setCurrentIndex(i); - return; + 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 <> void AOOptionsDialog::setWidgetData(QComboBox *widget, const RESIZE_MODE &value) { - widget->setCurrentIndex(value); + widget->setCurrentIndex(value); } template <> QString AOOptionsDialog::widgetData(QComboBox *widget) const { - return widget->currentData().toString(); + return widget->currentData().toString(); } template <> RESIZE_MODE AOOptionsDialog::widgetData(QComboBox *widget) const { - return RESIZE_MODE(widget->currentIndex()); + return RESIZE_MODE(widget->currentIndex()); } template <> void AOOptionsDialog::setWidgetData(QGroupBox *widget, const bool &value) { - widget->setChecked(value); + widget->setChecked(value); } template <> bool AOOptionsDialog::widgetData(QGroupBox *widget) const { - return widget->isChecked(); + return widget->isChecked(); } template <> void AOOptionsDialog::setWidgetData(QListWidget *widget, const QStringList &value) { - widget->addItems(value); + widget->addItems(value); } template <> QStringList AOOptionsDialog::widgetData(QListWidget *widget) const { - QStringList paths; - for (auto i = 1; i < widget->count(); i++) - { - paths.append(widget->item(i)->text()); - } - return paths; + QStringList paths; + for (auto i = 1; i < widget->count(); i++) + { + paths.append(widget->item(i)->text()); + } + return paths; } template void AOOptionsDialog::registerOption(const QString &widgetName, V (Options::*getter)() const, void (Options::*setter)(V)) { - auto *widget = findChild(widgetName); - if (!widget) - { - qWarning() << "could not find widget" << widgetName; - return; - } + auto *widget = findChild(widgetName); + if (!widget) + { + qWarning() << "could not find widget" << widgetName; + return; + } - OptionEntry entry; - entry.load = [=, this] { - setWidgetData(widget, (Options::getInstance().*getter)()); - }; - entry.save = [=, this] { - (Options::getInstance().*setter)(widgetData(widget)); - }; + OptionEntry entry; + entry.load = [=, this] { + setWidgetData(widget, (Options::getInstance().*getter)()); + }; + entry.save = [=, this] { + (Options::getInstance().*setter)(widgetData(widget)); + }; - optionEntries.append(entry); + optionEntries.append(entry); } void AOOptionsDialog::updateValues() { - QSet themes; - 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); - - // 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); + QSet themes; + QStringList bases = Options::getInstance().mountPaths(); + bases.push_front(get_base_path()); - for (const QString &l_theme : std::as_const(l_themes)) + for (const QString &base : bases) { - if (!themes.contains(l_theme)) - { - ui_theme_combobox->addItem(l_theme, l_theme); - themes.insert(l_theme); - } + 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 : std::as_const(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 : std::as_const(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 : std::as_const(l_subthemes)) { - ui_subtheme_combobox->addItem(l_subtheme, l_subtheme); + 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()) + 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 : std::as_const(optionEntries)) { - document = tr("Couldn't get the privacy policy."); + entry.load(); } - ui_privacy_policy->setHtml(document); - }); - - for (const OptionEntry &entry : std::as_const(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 : std::as_const(optionEntries)) - { - entry.save(); - } + 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 : std::as_const(optionEntries)) + { + entry.save(); + } - if (l_reload_theme_required) - { - Q_EMIT reloadThemeRequest(); - } - close(); + if (l_reload_theme_required) + { + Q_EMIT reloadThemeRequest(); + } + close(); } void AOOptionsDialog::discardPressed() { - close(); + 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) { - // Destructive operation. - Options::getInstance().clearConfig(); - updateValues(); + if (QMessageBox::question(this, "", "Restore default settings?\nThis can't be undone!", QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) + { + // Destructive operation. + Options::getInstance().clearConfig(); + updateValues(); + } } - } } 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()); - Q_EMIT reloadThemeRequest(); - delete layout(); - delete ui_settings_widget; - optionEntries.clear(); - setupUI(); + Options::getInstance().setTheme(ui_theme_combobox->currentText()); + Options::getInstance().setSettingsSubTheme(ui_subtheme_combobox->currentText()); + Options::getInstance().setAnimatedThemeEnabled(ui_animated_theme_cb->isChecked()); + Q_EMIT reloadThemeRequest(); + delete layout(); + delete ui_settings_widget; + optionEntries.clear(); + setupUI(); } void AOOptionsDialog::onMountAddPressed() { - MultiSelectDialog mount_selection(this, tr("Select one or more mount folders"), get_app_path(), ""); - std::optional mount_paths = mount_selection.getExistingDirectories(); + MultiSelectDialog mount_selection(this, tr("Select one or more mount folders"), get_app_path(), ""); + std::optional mount_paths = mount_selection.getExistingDirectories(); - if (!mount_paths.has_value()) { - return; - } + if (!mount_paths.has_value()) { + return; + } - QDir app_dir(get_app_path()); - for(QString& mount_path : mount_paths.value()) { - QString relative = app_dir.relativeFilePath(mount_path); - if (!relative.contains("../")) - { - mount_path = relative; + QDir app_dir(get_app_path()); + for(QString& mount_path : mount_paths.value()) { + QString relative = app_dir.relativeFilePath(mount_path); + if (!relative.contains("../")) + { + mount_path = relative; + } + QListWidgetItem *dir_item = new QListWidgetItem(mount_path); + ui_mount_list->addItem(dir_item); + ui_mount_list->setCurrentItem(dir_item); } - QListWidgetItem *dir_item = new QListWidgetItem(mount_path); - ui_mount_list->addItem(dir_item); - ui_mount_list->setCurrentItem(dir_item); - } - // quick hack to update buttons - Q_EMIT ui_mount_list->itemSelectionChanged(); + // quick hack to update buttons + Q_EMIT ui_mount_list->itemSelectionChanged(); } void AOOptionsDialog::themeChanged(int i) { - ui_subtheme_combobox->clear(); - // Fill the combobox with the names of the themes. - ui_subtheme_combobox->addItem("server", "server"); - ui_subtheme_combobox->addItem("default", "server"); + ui_subtheme_combobox->clear(); + // Fill the combobox with the names of the themes. + 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 : std::as_const(l_subthemes)) - { - if (l_subthemes.toLower() != "server" && l_subthemes.toLower() != "default" && l_subthemes.toLower() != "effects" && l_subthemes.toLower() != "misc") + for (const QString &l_subthemes : std::as_const(l_subthemes)) { - ui_subtheme_combobox->addItem(l_subthemes, 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)); - qDebug() << "Unable to locate ressource file" << l_ressource_name; - return; - } - QResource::registerResource(l_resource); + 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)); + qDebug() << "Unable to locate ressource file" << l_ressource_name; + return; + } + QResource::registerResource(l_resource); } void AOOptionsDialog::setupUI() { - QUiLoader l_loader(this); - QFile l_uiFile(Options::getInstance().getUIAsset("options_dialog.ui")); - if (!l_uiFile.open(QFile::ReadOnly)) - { - qWarning() << "Unable to open file " << l_uiFile.fileName(); - return; - } - ui_settings_widget = l_loader.load(&l_uiFile, this); - - auto l_layout = new QVBoxLayout(this); - l_layout->addWidget(ui_settings_widget); - - // 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); - - // Gameplay Tab - FROM_UI(QComboBox, theme_combobox); - connect(ui_theme_combobox, QOverload::of(&QComboBox::currentIndexChanged), this, &AOOptionsDialog::themeChanged); - - registerOption("theme_combobox", &Options::theme, &Options::setTheme); - - FROM_UI(QComboBox, subtheme_combobox); - registerOption("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_folder_button); - connect(ui_theme_folder_button, &QPushButton::clicked, this, [=, 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)) - { - 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, resize_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); - FROM_UI(QCheckBox, slides_cb); - FROM_UI(QCheckBox, restoreposition_cb); - FROM_UI(QLineEdit, playerlist_format_edit); - - registerOption("theme_scaling_factor_sb", &Options::themeScalingFactor, &Options::setThemeScalingFactor); - registerOption("animated_theme_cb", &Options::animatedThemeEnabled, &Options::setAnimatedThemeEnabled); - registerOption("stay_time_spinbox", &Options::textStayTime, &Options::setTextStayTime); - registerOption("instant_objection_cb", &Options::objectionSkipQueueEnabled, &Options::setObjectionSkipQueueEnabled); - registerOption("text_crawl_spinbox", &Options::textCrawlSpeed, &Options::setTextCrawlSpeed); - registerOption("chat_ratelimit_spinbox", &Options::chatRateLimit, &Options::setChatRateLimit); - registerOption("username_textbox", &Options::username, &Options::setUsername); - registerOption("showname_cb", &Options::customShownameEnabled, &Options::setCustomShownameEnabled); - registerOption("default_showname_textbox", &Options::shownameOnJoin, &Options::setShownameOnJoin); - registerOption("ms_textbox", &Options::alternativeMasterserver, &Options::setAlternativeMasterserver); - registerOption("discord_cb", &Options::discordEnabled, &Options::setDiscordEnabled); - registerOption("language_combobox", &Options::language, &Options::setLanguage); - - ui_language_combobox->addItem("English", "en"); - ui_language_combobox->addItem("Deutsch", "de"); - ui_language_combobox->addItem("Español", "es"); - ui_language_combobox->addItem("Português", "pt"); - ui_language_combobox->addItem("Polski", "pl"); - ui_language_combobox->addItem("日本語", "jp"); - ui_language_combobox->addItem("Русский", "ru"); - - registerOption("resize_combobox", &Options::resizeMode, &Options::setResizeMode); - registerOption("shake_cb", &Options::shakeEnabled, &Options::setShakeEnabled); - registerOption("effects_cb", &Options::effectsEnabled, &Options::setEffectsEnabled); - registerOption("framenetwork_cb", &Options::networkedFrameSfxEnabled, &Options::setNetworkedFrameSfxEnabled); - registerOption("colorlog_cb", &Options::colorLogEnabled, &Options::setColorLogEnabled); - registerOption("stickysounds_cb", &Options::clearSoundsDropdownOnPlayEnabled, &Options::setClearSoundsDropdownOnPlayEnabled); - registerOption("stickyeffects_cb", &Options::clearEffectsDropdownOnPlayEnabled, &Options::setClearEffectsDropdownOnPlayEnabled); - registerOption("stickypres_cb", &Options::clearPreOnPlayEnabled, &Options::setClearPreOnPlayEnabled); - registerOption("customchat_cb", &Options::customChatboxEnabled, &Options::setCustomChatboxEnabled); - registerOption("sticker_cb", &Options::characterStickerEnabled, &Options::setCharacterStickerEnabled); - registerOption("continuous_cb", &Options::continuousPlaybackEnabled, &Options::setContinuousPlaybackEnabled); - registerOption("category_stop_cb", &Options::stopMusicOnCategoryEnabled, &Options::setStopMusicOnCategoryEnabled); - registerOption("sfx_on_idle_cb", &Options::playSelectedSFXOnIdle, &Options::setPlaySelectedSFXOnIdle); - registerOption("evidence_double_click_cb", &Options::evidenceDoubleClickEdit, &Options::setEvidenceDoubleClickEdit); - registerOption("slides_cb", &Options::slidesEnabled, &Options::setSlidesEnabled); - registerOption("restoreposition_cb", &Options::restoreWindowPositionEnabled, &Options::setRestoreWindowPositionEnabled); - registerOption("playerlist_format_edit", &Options::playerlistFormatString, &Options::setPlayerlistFormatString); - - // 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("callwords_textbox", &Options::callwords, &Options::setCallwords); - - // Audio tab. - FROM_UI(QComboBox, audio_device_combobox); - populateAudioDevices(); - registerOption("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("suppress_audio_spinbox", &::Options::defaultSuppressAudio, &Options::setDefaultSupressedAudio); - registerOption("bliprate_spinbox", &::Options::blipRate, &Options::setBlipRate); - registerOption("blank_blips_cb", &Options::blankBlip, &Options::setBlankBlip); - registerOption("loopsfx_cb", &Options::loopingSfx, &Options::setLoopingSfx); - registerOption("objectmusic_cb", &Options::objectionStopMusic, &Options::setObjectionStopMusic); - registerOption("disablestreams_cb", &Options::streamingEnabled, &Options::setStreamingEnabled); - - // Asset tab - 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("mount_list", &Options::mountPaths, &Options::setMountPaths); - - FROM_UI(QPushButton, mount_add); - connect(ui_mount_add, &QPushButton::clicked, this, &AOOptionsDialog::onMountAddPressed); - - FROM_UI(QPushButton, mount_remove); - connect(ui_mount_remove, &QPushButton::clicked, this, [this] { - auto selected = ui_mount_list->selectedItems(); - if (selected.isEmpty()) - { - return; - } - delete selected[0]; - Q_EMIT ui_mount_list->itemSelectionChanged(); - asset_cache_dirty = true; - }); - - FROM_UI(QPushButton, mount_up); - connect(ui_mount_up, &QPushButton::clicked, this, [this] { - auto selected = ui_mount_list->selectedItems(); - if (selected.isEmpty()) - { - return; - } - auto *item = selected[0]; - int row = ui_mount_list->row(item); - ui_mount_list->takeItem(row); - int new_row = qMax(1, row - 1); - ui_mount_list->insertItem(new_row, item); - ui_mount_list->setCurrentRow(new_row); - asset_cache_dirty = true; - }); - - FROM_UI(QPushButton, mount_down); - connect(ui_mount_down, &QPushButton::clicked, this, [this] { - auto selected = ui_mount_list->selectedItems(); - if (selected.isEmpty()) + QUiLoader l_loader(this); + QFile l_uiFile(Options::getInstance().getUIAsset("options_dialog.ui")); + if (!l_uiFile.open(QFile::ReadOnly)) { - return; + qWarning() << "Unable to open file " << l_uiFile.fileName(); + return; } - auto *item = selected[0]; - int row = ui_mount_list->row(item); - ui_mount_list->takeItem(row); - int new_row = qMin(ui_mount_list->count() + 1, row + 1); - ui_mount_list->insertItem(new_row, item); - ui_mount_list->setCurrentRow(new_row); - asset_cache_dirty = true; - }); - - 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); - }); - - connect(ui_mount_list, &QListWidget::itemSelectionChanged, this, [this] { - auto selected_items = ui_mount_list->selectedItems(); - bool row_selected = !ui_mount_list->selectedItems().isEmpty(); - ui_mount_remove->setEnabled(row_selected); - ui_mount_up->setEnabled(row_selected); - ui_mount_down->setEnabled(row_selected); - - if (!row_selected) + ui_settings_widget = l_loader.load(&l_uiFile, this); + + auto l_layout = new QVBoxLayout(this); + l_layout->addWidget(ui_settings_widget); + + // 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); + + // Gameplay Tab + FROM_UI(QComboBox, theme_combobox); + connect(ui_theme_combobox, QOverload::of(&QComboBox::currentIndexChanged), this, &AOOptionsDialog::themeChanged); + + registerOption("theme_combobox", &Options::theme, &Options::setTheme); + + FROM_UI(QComboBox, subtheme_combobox); + registerOption("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_folder_button); + connect(ui_theme_folder_button, &QPushButton::clicked, this, [=, 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)) + { + 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, resize_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); + FROM_UI(QCheckBox, slides_cb); + FROM_UI(QCheckBox, restoreposition_cb); + FROM_UI(QLineEdit, playerlist_format_edit); + + registerOption("theme_scaling_factor_sb", &Options::themeScalingFactor, &Options::setThemeScalingFactor); + registerOption("animated_theme_cb", &Options::animatedThemeEnabled, &Options::setAnimatedThemeEnabled); + registerOption("stay_time_spinbox", &Options::textStayTime, &Options::setTextStayTime); + registerOption("instant_objection_cb", &Options::objectionSkipQueueEnabled, &Options::setObjectionSkipQueueEnabled); + registerOption("text_crawl_spinbox", &Options::textCrawlSpeed, &Options::setTextCrawlSpeed); + registerOption("chat_ratelimit_spinbox", &Options::chatRateLimit, &Options::setChatRateLimit); + registerOption("username_textbox", &Options::username, &Options::setUsername); + registerOption("showname_cb", &Options::customShownameEnabled, &Options::setCustomShownameEnabled); + registerOption("default_showname_textbox", &Options::shownameOnJoin, &Options::setShownameOnJoin); + registerOption("ms_textbox", &Options::alternativeMasterserver, &Options::setAlternativeMasterserver); + registerOption("discord_cb", &Options::discordEnabled, &Options::setDiscordEnabled); + registerOption("language_combobox", &Options::language, &Options::setLanguage); + + ui_language_combobox->addItem("English", "en"); + ui_language_combobox->addItem("Deutsch", "de"); + ui_language_combobox->addItem("Español", "es"); + ui_language_combobox->addItem("Português", "pt"); + ui_language_combobox->addItem("Polski", "pl"); + ui_language_combobox->addItem("日本語", "jp"); + ui_language_combobox->addItem("Русский", "ru"); + + registerOption("resize_combobox", &Options::resizeMode, &Options::setResizeMode); + registerOption("shake_cb", &Options::shakeEnabled, &Options::setShakeEnabled); + registerOption("effects_cb", &Options::effectsEnabled, &Options::setEffectsEnabled); + registerOption("framenetwork_cb", &Options::networkedFrameSfxEnabled, &Options::setNetworkedFrameSfxEnabled); + registerOption("colorlog_cb", &Options::colorLogEnabled, &Options::setColorLogEnabled); + registerOption("stickysounds_cb", &Options::clearSoundsDropdownOnPlayEnabled, &Options::setClearSoundsDropdownOnPlayEnabled); + registerOption("stickyeffects_cb", &Options::clearEffectsDropdownOnPlayEnabled, &Options::setClearEffectsDropdownOnPlayEnabled); + registerOption("stickypres_cb", &Options::clearPreOnPlayEnabled, &Options::setClearPreOnPlayEnabled); + registerOption("customchat_cb", &Options::customChatboxEnabled, &Options::setCustomChatboxEnabled); + registerOption("sticker_cb", &Options::characterStickerEnabled, &Options::setCharacterStickerEnabled); + registerOption("continuous_cb", &Options::continuousPlaybackEnabled, &Options::setContinuousPlaybackEnabled); + registerOption("category_stop_cb", &Options::stopMusicOnCategoryEnabled, &Options::setStopMusicOnCategoryEnabled); + registerOption("sfx_on_idle_cb", &Options::playSelectedSFXOnIdle, &Options::setPlaySelectedSFXOnIdle); + registerOption("evidence_double_click_cb", &Options::evidenceDoubleClickEdit, &Options::setEvidenceDoubleClickEdit); + registerOption("slides_cb", &Options::slidesEnabled, &Options::setSlidesEnabled); + registerOption("restoreposition_cb", &Options::restoreWindowPositionEnabled, &Options::setRestoreWindowPositionEnabled); + registerOption("playerlist_format_edit", &Options::playerlistFormatString, &Options::setPlayerlistFormatString); + + // 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("callwords_textbox", &Options::callwords, &Options::setCallwords); + + // Audio tab. + FROM_UI(QComboBox, audio_device_combobox); + populateAudioDevices(); + registerOption("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("suppress_audio_spinbox", &::Options::defaultSuppressAudio, &Options::setDefaultSupressedAudio); + registerOption("bliprate_spinbox", &::Options::blipRate, &Options::setBlipRate); + registerOption("blank_blips_cb", &Options::blankBlip, &Options::setBlankBlip); + registerOption("loopsfx_cb", &Options::loopingSfx, &Options::setLoopingSfx); + registerOption("objectmusic_cb", &Options::objectionStopMusic, &Options::setObjectionStopMusic); + registerOption("disablestreams_cb", &Options::streamingEnabled, &Options::setStreamingEnabled); + + // Asset tab + 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("mount_list", &Options::mountPaths, &Options::setMountPaths); + + FROM_UI(QPushButton, mount_add); + connect(ui_mount_add, &QPushButton::clicked, this, &AOOptionsDialog::onMountAddPressed); + + FROM_UI(QPushButton, mount_remove); + connect(ui_mount_remove, &QPushButton::clicked, this, [this] { + auto selected = ui_mount_list->selectedItems(); + if (selected.isEmpty()) + { + return; + } + delete selected[0]; + Q_EMIT ui_mount_list->itemSelectionChanged(); + asset_cache_dirty = true; + }); + + FROM_UI(QPushButton, mount_up); + connect(ui_mount_up, &QPushButton::clicked, this, [this] { + auto selected = ui_mount_list->selectedItems(); + if (selected.isEmpty()) + { + return; + } + auto *item = selected[0]; + int row = ui_mount_list->row(item); + ui_mount_list->takeItem(row); + int new_row = qMax(1, row - 1); + ui_mount_list->insertItem(new_row, item); + ui_mount_list->setCurrentRow(new_row); + asset_cache_dirty = true; + }); + + FROM_UI(QPushButton, mount_down); + connect(ui_mount_down, &QPushButton::clicked, this, [this] { + auto selected = ui_mount_list->selectedItems(); + if (selected.isEmpty()) + { + return; + } + auto *item = selected[0]; + int row = ui_mount_list->row(item); + ui_mount_list->takeItem(row); + int new_row = qMin(ui_mount_list->count() + 1, row + 1); + ui_mount_list->insertItem(new_row, item); + ui_mount_list->setCurrentRow(new_row); + asset_cache_dirty = true; + }); + + 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); + }); + + connect(ui_mount_list, &QListWidget::itemSelectionChanged, this, [this] { + auto selected_items = ui_mount_list->selectedItems(); + bool row_selected = !ui_mount_list->selectedItems().isEmpty(); + ui_mount_remove->setEnabled(row_selected); + ui_mount_up->setEnabled(row_selected); + ui_mount_down->setEnabled(row_selected); + + 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); + } + }); + + // 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("downwards_cb", &Options::logDirectionDownwards, &Options::setLogDirectionDownwards); + registerOption("length_spinbox", &Options::maxLogSize, &Options::setMaxLogSize); + registerOption("log_newline_cb", &Options::logNewline, &Options::setLogNewline); + registerOption("log_margin_spinbox", &Options::logMargin, &Options::setLogMargin); + + FROM_UI(QCheckBox, log_timestamp_cb); + registerOption("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("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(); + + ui_log_timestamp_format_combobox->setCurrentText(l_current_format); + + ui_log_timestamp_format_combobox->addItem(l_current_format, l_current_format); + ui_log_timestamp_format_combobox->addItem("h:mm:ss AP", "h:mm:ss AP"); + ui_log_timestamp_format_combobox->addItem("hh:mm:ss", "hh:mm:ss"); + 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()) { - return; + ui_log_timestamp_format_combobox->setDisabled(true); } - 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); - } - }); - - // 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("downwards_cb", &Options::logDirectionDownwards, &Options::setLogDirectionDownwards); - registerOption("length_spinbox", &Options::maxLogSize, &Options::setMaxLogSize); - registerOption("log_newline_cb", &Options::logNewline, &Options::setLogNewline); - registerOption("log_margin_spinbox", &Options::logMargin, &Options::setLogMargin); - - FROM_UI(QCheckBox, log_timestamp_cb); - registerOption("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("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(); - - ui_log_timestamp_format_combobox->setCurrentText(l_current_format); - - ui_log_timestamp_format_combobox->addItem(l_current_format, l_current_format); - ui_log_timestamp_format_combobox->addItem("h:mm:ss AP", "h:mm:ss AP"); - ui_log_timestamp_format_combobox->addItem("hh:mm:ss", "hh:mm:ss"); - 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()) - { - 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("log_ic_actions_cb", &Options::logIcActions, &Options::setLogIcActions); - registerOption("desync_logs_cb", &Options::desynchronisedLogsEnabled, &Options::setDesynchronisedLogsEnabled); - registerOption("log_text_cb", &Options::logToTextFileEnabled, &Options::setLogToTextFileEnabled); - registerOption("log_demo_cb", &Options::logToDemoFileEnabled, &Options::setLogToDemoFileEnabled); + registerOption("log_ic_actions_cb", &Options::logIcActions, &Options::setLogIcActions); + registerOption("desync_logs_cb", &Options::desynchronisedLogsEnabled, &Options::setDesynchronisedLogsEnabled); + registerOption("log_text_cb", &Options::logToTextFileEnabled, &Options::setLogToTextFileEnabled); + registerOption("log_demo_cb", &Options::logToDemoFileEnabled, &Options::setLogToDemoFileEnabled); - // DSGVO/Privacy tab + // DSGVO/Privacy tab - FROM_UI(QTextBrowser, privacy_policy); - ui_privacy_policy->setPlainText(tr("Getting privacy policy...")); - FROM_UI(QCheckBox, privacy_optout_cb); - registerOption("privacy_optout", &Options::playerCountOptout, &Options::setPlayerCountOptout); + FROM_UI(QTextBrowser, privacy_policy); + ui_privacy_policy->setPlainText(tr("Getting privacy policy...")); + FROM_UI(QCheckBox, privacy_optout_cb); + registerOption("privacy_optout", &Options::playerCountOptout, &Options::setPlayerCountOptout); - updateValues(); + updateValues(); } void AOOptionsDialog::onTimestampFormatEdited() { - const QString format = ui_log_timestamp_format_combobox->currentText(); - const int index = ui_log_timestamp_format_combobox->currentIndex(); + const QString format = ui_log_timestamp_format_combobox->currentText(); + const int index = ui_log_timestamp_format_combobox->currentIndex(); - 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_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)); } void AOOptionsDialog::timestampCbChanged(int state) { - ui_log_timestamp_format_combobox->setDisabled(state == 0); + ui_log_timestamp_format_combobox->setDisabled(state == 0); } #if (defined(_WIN32) || defined(_WIN64)) bool AOOptionsDialog::needsDefaultAudioDevice() { - return true; + return true; } #elif (defined(LINUX) || defined(__linux__)) bool AOOptionsDialog::needsDefaultAudioDevice() { - return false; + return false; } #elif defined __APPLE__ bool AOOptionsDialog::needsDefaultAudioDevice() { - return true; + return true; } #else #error This operating system is not supported. diff --git a/src/widgets/multiselectdialog.cpp b/src/widgets/multiselectdialog.cpp index 8e1fd1df1..724a78f6b 100644 --- a/src/widgets/multiselectdialog.cpp +++ b/src/widgets/multiselectdialog.cpp @@ -4,21 +4,21 @@ MultiSelectDialog::MultiSelectDialog(QWidget *parent, const QString &caption, const QString &directory, const QString &filter) : QFileDialog(parent, caption, directory, filter) { - setFileMode(QFileDialog::Directory); - setOption(QFileDialog::DontUseNativeDialog); + setFileMode(QFileDialog::Directory); + setOption(QFileDialog::DontUseNativeDialog); - internal_treeview = findChild("treeView"); - if (internal_treeview) { - internal_treeview->setSelectionMode(QAbstractItemView::MultiSelection); - } + internal_treeview = findChild("treeView"); + if (internal_treeview) { + internal_treeview->setSelectionMode(QAbstractItemView::MultiSelection); + } } std::optional MultiSelectDialog::getExistingDirectories() { - setOption(Option::ShowDirsOnly); - setViewMode(ViewMode::Detail); - if (exec() == QDialog::Accepted) { - return std::make_optional(selectedFiles()); - } - return std::nullopt; + setOption(Option::ShowDirsOnly); + setViewMode(ViewMode::Detail); + if (exec() == QDialog::Accepted) { + return std::make_optional(selectedFiles()); + } + return std::nullopt; } diff --git a/src/widgets/multiselectdialog.h b/src/widgets/multiselectdialog.h index e5922690a..5d6b8c2bd 100644 --- a/src/widgets/multiselectdialog.h +++ b/src/widgets/multiselectdialog.h @@ -7,11 +7,11 @@ class MultiSelectDialog : public QFileDialog { public: - MultiSelectDialog(QWidget *parent = nullptr, const QString &caption = QString(), const QString &directory = QString(), const QString &filter = QString()); + MultiSelectDialog(QWidget *parent = nullptr, const QString &caption = QString(), const QString &directory = QString(), const QString &filter = QString()); - std::optional getExistingDirectories(); + std::optional getExistingDirectories(); private: - // Qt internal objects - QTreeView* internal_treeview = nullptr; + // Qt internal objects + QTreeView* internal_treeview = nullptr; }; From af3daf6857bab6bdfa1ff0b0163d04085bdad39f Mon Sep 17 00:00:00 2001 From: Salanto <62221668+Salanto@users.noreply.github.com> Date: Wed, 29 Jan 2025 21:00:20 +0100 Subject: [PATCH 5/5] CLANG --- src/widgets/aooptionsdialog.cpp | 375 ++++++++++++++++++------------ src/widgets/multiselectdialog.cpp | 9 +- src/widgets/multiselectdialog.h | 9 +- 3 files changed, 244 insertions(+), 149 deletions(-) diff --git a/src/widgets/aooptionsdialog.cpp b/src/widgets/aooptionsdialog.cpp index de1760bc9..22ffeb184 100644 --- a/src/widgets/aooptionsdialog.cpp +++ b/src/widgets/aooptionsdialog.cpp @@ -4,9 +4,9 @@ #include "aoapplication.h" #include "file_functions.h" #include "gui_utils.h" +#include "multiselectdialog.h" #include "networkmanager.h" #include "options.h" -#include "multiselectdialog.h" #include #include @@ -25,85 +25,81 @@ AOOptionsDialog::AOOptionsDialog(AOApplication *p_ao_app, QWidget *parent) 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); } } -template <> +template<> void AOOptionsDialog::setWidgetData(QCheckBox *widget, const bool &value) { widget->setChecked(value); } -template <> +template<> bool AOOptionsDialog::widgetData(QCheckBox *widget) const { return widget->isChecked(); } -template <> +template<> void AOOptionsDialog::setWidgetData(QLineEdit *widget, const QString &value) { widget->setText(value); } -template <> +template<> QString AOOptionsDialog::widgetData(QLineEdit *widget) const { return widget->text(); } -template <> +template<> void AOOptionsDialog::setWidgetData(QLineEdit *widget, const uint16_t &value) { widget->setText(QString::number(value)); } -template <> +template<> uint16_t AOOptionsDialog::widgetData(QLineEdit *widget) const { return widget->text().toUShort(); } -template <> +template<> void AOOptionsDialog::setWidgetData(QPlainTextEdit *widget, const QStringList &value) { widget->setPlainText(value.join('\n')); } -template <> +template<> QStringList AOOptionsDialog::widgetData(QPlainTextEdit *widget) const { return widget->toPlainText().trimmed().split('\n'); } -template <> +template<> void AOOptionsDialog::setWidgetData(QSpinBox *widget, const int &value) { widget->setValue(value); } -template <> +template<> int AOOptionsDialog::widgetData(QSpinBox *widget) const { return widget->value(); } -template <> +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; } @@ -111,70 +107,66 @@ void AOOptionsDialog::setWidgetData(QComboBox *widget, const QString &value) qWarning() << "value" << value << "not found for widget" << widget->objectName(); } -template <> +template<> void AOOptionsDialog::setWidgetData(QComboBox *widget, const RESIZE_MODE &value) { widget->setCurrentIndex(value); } -template <> +template<> QString AOOptionsDialog::widgetData(QComboBox *widget) const { return widget->currentData().toString(); } -template <> +template<> RESIZE_MODE AOOptionsDialog::widgetData(QComboBox *widget) const { return RESIZE_MODE(widget->currentIndex()); } -template <> +template<> void AOOptionsDialog::setWidgetData(QGroupBox *widget, const bool &value) { widget->setChecked(value); } -template <> +template<> bool AOOptionsDialog::widgetData(QGroupBox *widget) const { return widget->isChecked(); } -template <> +template<> void AOOptionsDialog::setWidgetData(QListWidget *widget, const QStringList &value) { widget->addItems(value); } -template <> +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 -void AOOptionsDialog::registerOption(const QString &widgetName, V (Options::*getter)() const, void (Options::*setter)(V)) +template +void AOOptionsDialog::registerOption(const QString &widgetName, + V (Options::*getter)() const, + void (Options::*setter)(V)) { auto *widget = findChild(widgetName); - if (!widget) - { + if (!widget) { qWarning() << "could not find widget" << widgetName; return; } OptionEntry entry; - entry.load = [=, this] { - setWidgetData(widget, (Options::getInstance().*getter)()); - }; - entry.save = [=, this] { - (Options::getInstance().*setter)(widgetData(widget)); - }; + entry.load = [=, this] { setWidgetData(widget, (Options::getInstance().*getter)()); }; + entry.save = [=, this] { (Options::getInstance().*setter)(widgetData(widget)); }; optionEntries.append(entry); } @@ -185,8 +177,7 @@ void AOOptionsDialog::updateValues() QStringList bases = Options::getInstance().mountPaths(); bases.push_front(get_base_path()); - for (const QString &base : bases) - { + 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. @@ -194,49 +185,46 @@ void AOOptionsDialog::updateValues() l_sorting.setNumericMode(true); std::sort(l_themes.begin(), l_themes.end(), l_sorting); - for (const QString &l_theme : std::as_const(l_themes)) - { - if (!themes.contains(l_theme)) - { + for (const QString &l_theme : std::as_const(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 : std::as_const(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 : std::as_const(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()) - { + if (document.isEmpty()) { document = tr("Couldn't get the privacy policy."); } ui_privacy_policy->setHtml(document); }); - for (const OptionEntry &entry : std::as_const(optionEntries)) - { + for (const OptionEntry &entry : std::as_const(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 : std::as_const(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 : std::as_const(optionEntries)) { entry.save(); } - if (l_reload_theme_required) - { + if (l_reload_theme_required) { Q_EMIT reloadThemeRequest(); } close(); @@ -249,10 +237,12 @@ void AOOptionsDialog::discardPressed() 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(); @@ -274,7 +264,10 @@ void AOOptionsDialog::onReloadThemeClicked() void AOOptionsDialog::onMountAddPressed() { - MultiSelectDialog mount_selection(this, tr("Select one or more mount folders"), get_app_path(), ""); + MultiSelectDialog mount_selection(this, + tr("Select one or more mount folders"), + get_app_path(), + ""); std::optional mount_paths = mount_selection.getExistingDirectories(); if (!mount_paths.has_value()) { @@ -282,10 +275,9 @@ void AOOptionsDialog::onMountAddPressed() } QDir app_dir(get_app_path()); - for(QString& mount_path : mount_paths.value()) { + for (QString &mount_path : mount_paths.value()) { QString relative = app_dir.relativeFilePath(mount_path); - if (!relative.contains("../")) - { + if (!relative.contains("../")) { mount_path = relative; } QListWidgetItem *dir_item = new QListWidgetItem(mount_path); @@ -304,20 +296,20 @@ 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 : std::as_const(l_subthemes)) - { - if (l_subthemes.toLower() != "server" && l_subthemes.toLower() != "default" && l_subthemes.toLower() != "effects" && l_subthemes.toLower() != "misc") - { + for (const QString &l_subthemes : std::as_const(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()) - { + if (l_resource.isEmpty()) { QResource::unregisterResource(ao_app->get_asset("themes/" + l_ressource_name)); qDebug() << "Unable to locate ressource file" << l_ressource_name; return; @@ -329,8 +321,7 @@ 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; } @@ -343,26 +334,38 @@ void AOOptionsDialog::setupUI() 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::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::of(&QComboBox::currentIndexChanged), this, &AOOptionsDialog::themeChanged); + connect(ui_theme_combobox, + QOverload::of(&QComboBox::currentIndexChanged), + this, + &AOOptionsDialog::themeChanged); registerOption("theme_combobox", &Options::theme, &Options::setTheme); FROM_UI(QComboBox, subtheme_combobox); - registerOption("subtheme_combobox", &Options::settingsSubTheme, &Options::setSettingsSubTheme); + registerOption("subtheme_combobox", + &Options::settingsSubTheme, + &Options::setSettingsSubTheme); FROM_UI(QPushButton, theme_reload_button); - connect(ui_theme_reload_button, &QPushButton::clicked, this, &::AOOptionsDialog::onReloadThemeClicked); + connect(ui_theme_reload_button, + &QPushButton::clicked, + this, + &::AOOptionsDialog::onReloadThemeClicked); FROM_UI(QPushButton, theme_folder_button); connect(ui_theme_folder_button, &QPushButton::clicked, this, [=, 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)); @@ -398,18 +401,42 @@ void AOOptionsDialog::setupUI() FROM_UI(QCheckBox, restoreposition_cb); FROM_UI(QLineEdit, playerlist_format_edit); - registerOption("theme_scaling_factor_sb", &Options::themeScalingFactor, &Options::setThemeScalingFactor); - registerOption("animated_theme_cb", &Options::animatedThemeEnabled, &Options::setAnimatedThemeEnabled); - registerOption("stay_time_spinbox", &Options::textStayTime, &Options::setTextStayTime); - registerOption("instant_objection_cb", &Options::objectionSkipQueueEnabled, &Options::setObjectionSkipQueueEnabled); - registerOption("text_crawl_spinbox", &Options::textCrawlSpeed, &Options::setTextCrawlSpeed); - registerOption("chat_ratelimit_spinbox", &Options::chatRateLimit, &Options::setChatRateLimit); - registerOption("username_textbox", &Options::username, &Options::setUsername); - registerOption("showname_cb", &Options::customShownameEnabled, &Options::setCustomShownameEnabled); - registerOption("default_showname_textbox", &Options::shownameOnJoin, &Options::setShownameOnJoin); - registerOption("ms_textbox", &Options::alternativeMasterserver, &Options::setAlternativeMasterserver); - registerOption("discord_cb", &Options::discordEnabled, &Options::setDiscordEnabled); - registerOption("language_combobox", &Options::language, &Options::setLanguage); + registerOption("theme_scaling_factor_sb", + &Options::themeScalingFactor, + &Options::setThemeScalingFactor); + registerOption("animated_theme_cb", + &Options::animatedThemeEnabled, + &Options::setAnimatedThemeEnabled); + registerOption("stay_time_spinbox", + &Options::textStayTime, + &Options::setTextStayTime); + registerOption("instant_objection_cb", + &Options::objectionSkipQueueEnabled, + &Options::setObjectionSkipQueueEnabled); + registerOption("text_crawl_spinbox", + &Options::textCrawlSpeed, + &Options::setTextCrawlSpeed); + registerOption("chat_ratelimit_spinbox", + &Options::chatRateLimit, + &Options::setChatRateLimit); + registerOption("username_textbox", + &Options::username, + &Options::setUsername); + registerOption("showname_cb", + &Options::customShownameEnabled, + &Options::setCustomShownameEnabled); + registerOption("default_showname_textbox", + &Options::shownameOnJoin, + &Options::setShownameOnJoin); + registerOption("ms_textbox", + &Options::alternativeMasterserver, + &Options::setAlternativeMasterserver); + registerOption("discord_cb", + &Options::discordEnabled, + &Options::setDiscordEnabled); + registerOption("language_combobox", + &Options::language, + &Options::setLanguage); ui_language_combobox->addItem("English", "en"); ui_language_combobox->addItem("Deutsch", "de"); @@ -419,33 +446,69 @@ void AOOptionsDialog::setupUI() ui_language_combobox->addItem("日本語", "jp"); ui_language_combobox->addItem("Русский", "ru"); - registerOption("resize_combobox", &Options::resizeMode, &Options::setResizeMode); + registerOption("resize_combobox", + &Options::resizeMode, + &Options::setResizeMode); registerOption("shake_cb", &Options::shakeEnabled, &Options::setShakeEnabled); - registerOption("effects_cb", &Options::effectsEnabled, &Options::setEffectsEnabled); - registerOption("framenetwork_cb", &Options::networkedFrameSfxEnabled, &Options::setNetworkedFrameSfxEnabled); - registerOption("colorlog_cb", &Options::colorLogEnabled, &Options::setColorLogEnabled); - registerOption("stickysounds_cb", &Options::clearSoundsDropdownOnPlayEnabled, &Options::setClearSoundsDropdownOnPlayEnabled); - registerOption("stickyeffects_cb", &Options::clearEffectsDropdownOnPlayEnabled, &Options::setClearEffectsDropdownOnPlayEnabled); - registerOption("stickypres_cb", &Options::clearPreOnPlayEnabled, &Options::setClearPreOnPlayEnabled); - registerOption("customchat_cb", &Options::customChatboxEnabled, &Options::setCustomChatboxEnabled); - registerOption("sticker_cb", &Options::characterStickerEnabled, &Options::setCharacterStickerEnabled); - registerOption("continuous_cb", &Options::continuousPlaybackEnabled, &Options::setContinuousPlaybackEnabled); - registerOption("category_stop_cb", &Options::stopMusicOnCategoryEnabled, &Options::setStopMusicOnCategoryEnabled); - registerOption("sfx_on_idle_cb", &Options::playSelectedSFXOnIdle, &Options::setPlaySelectedSFXOnIdle); - registerOption("evidence_double_click_cb", &Options::evidenceDoubleClickEdit, &Options::setEvidenceDoubleClickEdit); - registerOption("slides_cb", &Options::slidesEnabled, &Options::setSlidesEnabled); - registerOption("restoreposition_cb", &Options::restoreWindowPositionEnabled, &Options::setRestoreWindowPositionEnabled); - registerOption("playerlist_format_edit", &Options::playerlistFormatString, &Options::setPlayerlistFormatString); + registerOption("effects_cb", + &Options::effectsEnabled, + &Options::setEffectsEnabled); + registerOption("framenetwork_cb", + &Options::networkedFrameSfxEnabled, + &Options::setNetworkedFrameSfxEnabled); + registerOption("colorlog_cb", + &Options::colorLogEnabled, + &Options::setColorLogEnabled); + registerOption("stickysounds_cb", + &Options::clearSoundsDropdownOnPlayEnabled, + &Options::setClearSoundsDropdownOnPlayEnabled); + registerOption("stickyeffects_cb", + &Options::clearEffectsDropdownOnPlayEnabled, + &Options::setClearEffectsDropdownOnPlayEnabled); + registerOption("stickypres_cb", + &Options::clearPreOnPlayEnabled, + &Options::setClearPreOnPlayEnabled); + registerOption("customchat_cb", + &Options::customChatboxEnabled, + &Options::setCustomChatboxEnabled); + registerOption("sticker_cb", + &Options::characterStickerEnabled, + &Options::setCharacterStickerEnabled); + registerOption("continuous_cb", + &Options::continuousPlaybackEnabled, + &Options::setContinuousPlaybackEnabled); + registerOption("category_stop_cb", + &Options::stopMusicOnCategoryEnabled, + &Options::setStopMusicOnCategoryEnabled); + registerOption("sfx_on_idle_cb", + &Options::playSelectedSFXOnIdle, + &Options::setPlaySelectedSFXOnIdle); + registerOption("evidence_double_click_cb", + &Options::evidenceDoubleClickEdit, + &Options::setEvidenceDoubleClickEdit); + registerOption("slides_cb", + &Options::slidesEnabled, + &Options::setSlidesEnabled); + registerOption("restoreposition_cb", + &Options::restoreWindowPositionEnabled, + &Options::setRestoreWindowPositionEnabled); + registerOption("playerlist_format_edit", + &Options::playerlistFormatString, + &Options::setPlayerlistFormatString); // 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("callwords_textbox", &Options::callwords, &Options::setCallwords); + registerOption("callwords_textbox", + &Options::callwords, + &Options::setCallwords); // Audio tab. FROM_UI(QComboBox, audio_device_combobox); populateAudioDevices(); - registerOption("audio_device_combobox", &Options::audioOutputDevice, &Options::setAudioOutputDevice); + registerOption("audio_device_combobox", + &Options::audioOutputDevice, + &Options::setAudioOutputDevice); FROM_UI(QSpinBox, suppress_audio_spinbox); FROM_UI(QSpinBox, bliprate_spinbox); @@ -454,19 +517,27 @@ void AOOptionsDialog::setupUI() FROM_UI(QCheckBox, objectmusic_cb); FROM_UI(QCheckBox, disablestreams_cb); - registerOption("suppress_audio_spinbox", &::Options::defaultSuppressAudio, &Options::setDefaultSupressedAudio); + registerOption("suppress_audio_spinbox", + &::Options::defaultSuppressAudio, + &Options::setDefaultSupressedAudio); registerOption("bliprate_spinbox", &::Options::blipRate, &Options::setBlipRate); registerOption("blank_blips_cb", &Options::blankBlip, &Options::setBlankBlip); registerOption("loopsfx_cb", &Options::loopingSfx, &Options::setLoopingSfx); - registerOption("objectmusic_cb", &Options::objectionStopMusic, &Options::setObjectionStopMusic); - registerOption("disablestreams_cb", &Options::streamingEnabled, &Options::setStreamingEnabled); + registerOption("objectmusic_cb", + &Options::objectionStopMusic, + &Options::setObjectionStopMusic); + registerOption("disablestreams_cb", + &Options::streamingEnabled, + &Options::setStreamingEnabled); // Asset tab 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("mount_list", &Options::mountPaths, &Options::setMountPaths); + registerOption("mount_list", + &Options::mountPaths, + &Options::setMountPaths); FROM_UI(QPushButton, mount_add); connect(ui_mount_add, &QPushButton::clicked, this, &AOOptionsDialog::onMountAddPressed); @@ -474,8 +545,7 @@ void AOOptionsDialog::setupUI() FROM_UI(QPushButton, mount_remove); connect(ui_mount_remove, &QPushButton::clicked, this, [this] { auto selected = ui_mount_list->selectedItems(); - if (selected.isEmpty()) - { + if (selected.isEmpty()) { return; } delete selected[0]; @@ -486,8 +556,7 @@ void AOOptionsDialog::setupUI() FROM_UI(QPushButton, mount_up); connect(ui_mount_up, &QPushButton::clicked, this, [this] { auto selected = ui_mount_list->selectedItems(); - if (selected.isEmpty()) - { + if (selected.isEmpty()) { return; } auto *item = selected[0]; @@ -502,8 +571,7 @@ void AOOptionsDialog::setupUI() FROM_UI(QPushButton, mount_down); connect(ui_mount_down, &QPushButton::clicked, this, [this] { auto selected = ui_mount_list->selectedItems(); - if (selected.isEmpty()) - { + if (selected.isEmpty()) { return; } auto *item = selected[0]; @@ -528,18 +596,15 @@ void AOOptionsDialog::setupUI() ui_mount_up->setEnabled(row_selected); ui_mount_down->setEnabled(row_selected); - if (!row_selected) - { + if (!row_selected) { return; } int row = ui_mount_list->row(selected_items[0]); - if (row <= 1) - { + if (row <= 1) { ui_mount_up->setEnabled(false); } - if (row >= ui_mount_list->count() - 1) - { + if (row >= ui_mount_list->count() - 1) { ui_mount_down->setEnabled(false); } }); @@ -552,19 +617,33 @@ void AOOptionsDialog::setupUI() FROM_UI(QLabel, log_timestamp_format_lbl); FROM_UI(QComboBox, log_timestamp_format_combobox); - registerOption("downwards_cb", &Options::logDirectionDownwards, &Options::setLogDirectionDownwards); + registerOption("downwards_cb", + &Options::logDirectionDownwards, + &Options::setLogDirectionDownwards); registerOption("length_spinbox", &Options::maxLogSize, &Options::setMaxLogSize); registerOption("log_newline_cb", &Options::logNewline, &Options::setLogNewline); registerOption("log_margin_spinbox", &Options::logMargin, &Options::setLogMargin); FROM_UI(QCheckBox, log_timestamp_cb); - registerOption("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())); + registerOption("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("log_timestamp_format_combobox", &Options::logTimestampFormat, &Options::setLogTimestampFormat); - connect(ui_log_timestamp_format_combobox, &QComboBox::currentTextChanged, this, &::AOOptionsDialog::onTimestampFormatEdited); + registerOption("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(); @@ -576,8 +655,7 @@ 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); } @@ -585,17 +663,27 @@ void AOOptionsDialog::setupUI() FROM_UI(QCheckBox, desync_logs_cb); FROM_UI(QCheckBox, log_text_cb); - registerOption("log_ic_actions_cb", &Options::logIcActions, &Options::setLogIcActions); - registerOption("desync_logs_cb", &Options::desynchronisedLogsEnabled, &Options::setDesynchronisedLogsEnabled); - registerOption("log_text_cb", &Options::logToTextFileEnabled, &Options::setLogToTextFileEnabled); - registerOption("log_demo_cb", &Options::logToDemoFileEnabled, &Options::setLogToDemoFileEnabled); + registerOption("log_ic_actions_cb", + &Options::logIcActions, + &Options::setLogIcActions); + registerOption("desync_logs_cb", + &Options::desynchronisedLogsEnabled, + &Options::setDesynchronisedLogsEnabled); + registerOption("log_text_cb", + &Options::logToTextFileEnabled, + &Options::setLogToTextFileEnabled); + registerOption("log_demo_cb", + &Options::logToDemoFileEnabled, + &Options::setLogToDemoFileEnabled); // DSGVO/Privacy tab FROM_UI(QTextBrowser, privacy_policy); ui_privacy_policy->setPlainText(tr("Getting privacy policy...")); FROM_UI(QCheckBox, privacy_optout_cb); - registerOption("privacy_optout", &Options::playerCountOptout, &Options::setPlayerCountOptout); + registerOption("privacy_optout", + &Options::playerCountOptout, + &Options::setPlayerCountOptout); updateValues(); } @@ -607,7 +695,8 @@ 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) diff --git a/src/widgets/multiselectdialog.cpp b/src/widgets/multiselectdialog.cpp index 724a78f6b..241001fa0 100644 --- a/src/widgets/multiselectdialog.cpp +++ b/src/widgets/multiselectdialog.cpp @@ -1,13 +1,16 @@ #include "multiselectdialog.h" #include -MultiSelectDialog::MultiSelectDialog(QWidget *parent, const QString &caption, const QString &directory, const QString &filter) : - QFileDialog(parent, caption, directory, filter) +MultiSelectDialog::MultiSelectDialog(QWidget *parent, + const QString &caption, + const QString &directory, + const QString &filter) + : QFileDialog(parent, caption, directory, filter) { setFileMode(QFileDialog::Directory); setOption(QFileDialog::DontUseNativeDialog); - internal_treeview = findChild("treeView"); + internal_treeview = findChild("treeView"); if (internal_treeview) { internal_treeview->setSelectionMode(QAbstractItemView::MultiSelection); } diff --git a/src/widgets/multiselectdialog.h b/src/widgets/multiselectdialog.h index 5d6b8c2bd..faa946b12 100644 --- a/src/widgets/multiselectdialog.h +++ b/src/widgets/multiselectdialog.h @@ -1,17 +1,20 @@ #pragma once #include -#include #include +#include class MultiSelectDialog : public QFileDialog { public: - MultiSelectDialog(QWidget *parent = nullptr, const QString &caption = QString(), const QString &directory = QString(), const QString &filter = QString()); + MultiSelectDialog(QWidget *parent = nullptr, + const QString &caption = QString(), + const QString &directory = QString(), + const QString &filter = QString()); std::optional getExistingDirectories(); private: // Qt internal objects - QTreeView* internal_treeview = nullptr; + QTreeView *internal_treeview = nullptr; };