aboutsummaryrefslogtreecommitdiff
path: root/src/aooptionsdialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/aooptionsdialog.cpp')
-rw-r--r--src/aooptionsdialog.cpp161
1 files changed, 154 insertions, 7 deletions
diff --git a/src/aooptionsdialog.cpp b/src/aooptionsdialog.cpp
index 1db0dec..5f3dbf0 100644
--- a/src/aooptionsdialog.cpp
+++ b/src/aooptionsdialog.cpp
@@ -4,6 +4,8 @@
#include "lobby.h"
#include "bass.h"
+#include <QFileDialog>
+
AOOptionsDialog::AOOptionsDialog(QWidget *parent, AOApplication *p_ao_app)
: QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint)
{
@@ -12,7 +14,7 @@ AOOptionsDialog::AOOptionsDialog(QWidget *parent, AOApplication *p_ao_app)
// Setting up the basics.
setWindowFlag(Qt::WindowCloseButtonHint);
setWindowTitle(tr("Settings"));
- resize(400, 408);
+ resize(450, 408);
ui_settings_buttons = new QDialogButtonBox(this);
@@ -73,12 +75,19 @@ AOOptionsDialog::AOOptionsDialog(QWidget *parent, AOApplication *p_ao_app)
ui_theme_combobox = new QComboBox(ui_form_layout_widget);
// Fill the combobox with the names of the themes.
- QDirIterator it(ao_app->get_base_path() + "themes", QDir::Dirs,
- QDirIterator::NoIteratorFlags);
- while (it.hasNext()) {
- QString actualname = QDir(it.next()).dirName();
- if (actualname != "." && actualname != "..")
- ui_theme_combobox->addItem(actualname);
+ QSet<QString> themes;
+ QStringList bases = ao_app->get_mount_paths();
+ bases.push_front(ao_app->get_base_path());
+ for (const QString &base : bases) {
+ QDirIterator it(base + "/themes", QDir::Dirs | QDir::NoDotAndDotDot,
+ QDirIterator::NoIteratorFlags);
+ while (it.hasNext()) {
+ QString actualname = QDir(it.next()).dirName();
+ if (!themes.contains(actualname)) {
+ ui_theme_combobox->addItem(actualname);
+ themes.insert(actualname);
+ }
+ }
}
QObject::connect(ui_theme_combobox, SIGNAL(currentIndexChanged(int)), this,
@@ -902,7 +911,131 @@ AOOptionsDialog::AOOptionsDialog(QWidget *parent, AOApplication *p_ao_app)
ui_casing_layout->setWidget(row, QFormLayout::FieldRole, ui_log_cb);
+ // Assets tab
+ ui_assets_tab = new QWidget(this);
+ ui_assets_tab_layout = new QVBoxLayout(ui_assets_tab);
+ ui_assets_tab->setLayout(ui_assets_tab_layout);
+ ui_settings_tabs->addTab(ui_assets_tab, tr("Assets"));
+
+ ui_asset_lbl = new QLabel(ui_assets_tab);
+ ui_asset_lbl->setText(
+ tr("Add or remove base folders for use by assets. "
+ "Base folders will be searched in the order provided."));
+ ui_asset_lbl->setWordWrap(true);
+ ui_assets_tab_layout->addWidget(ui_asset_lbl);
+
+ ui_mount_list = new QListWidget(ui_assets_tab);
+ ui_assets_tab_layout->addWidget(ui_mount_list);
+
+ ui_mount_buttons_layout = new QGridLayout(ui_assets_tab);
+ ui_assets_tab_layout->addLayout(ui_mount_buttons_layout);
+
+ QSizePolicy stretch_btns(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
+ stretch_btns.setHorizontalStretch(4);
+
+ ui_mount_add = new QPushButton(tr("Add…"), ui_assets_tab);
+ ui_mount_add->setSizePolicy(stretch_btns);
+ ui_mount_buttons_layout->addWidget(ui_mount_add, 0, 0, 1, 1);
+ connect(ui_mount_add, &QPushButton::clicked, this, [this] {
+ QString dir = QFileDialog::getExistingDirectory(this, tr("Select a base folder"),
+ QApplication::applicationDirPath(),
+ QFileDialog::ShowDirsOnly);
+ if (dir.isEmpty())
+ return;
+ QListWidgetItem *dir_item = new QListWidgetItem(dir);
+ ui_mount_list->addItem(dir_item);
+ ui_mount_list->setCurrentItem(dir_item);
+
+ // quick hack to update buttons
+ emit ui_mount_list->itemSelectionChanged();
+ });
+
+ ui_mount_remove = new QPushButton(tr("Remove"), ui_assets_tab);
+ ui_mount_remove->setSizePolicy(stretch_btns);
+ ui_mount_remove->setEnabled(false);
+ ui_mount_buttons_layout->addWidget(ui_mount_remove, 0, 1, 1, 1);
+ connect(ui_mount_remove, &QPushButton::clicked, this, [=] {
+ auto selected = ui_mount_list->selectedItems();
+ if (selected.isEmpty())
+ return;
+ delete selected[0];
+ emit ui_mount_list->itemSelectionChanged();
+ asset_cache_dirty = true;
+ });
+
+ auto *mount_buttons_spacer = new QSpacerItem(40, 20, QSizePolicy::Expanding,
+ QSizePolicy::Minimum);
+ ui_mount_buttons_layout->addItem(mount_buttons_spacer, 0, 2, 1, 1);
+
+ ui_mount_up = new QPushButton(tr("↑"), ui_assets_tab);
+ ui_mount_up->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
+ ui_mount_up->setMaximumWidth(40);
+ ui_mount_up->setEnabled(false);
+ ui_mount_buttons_layout->addWidget(ui_mount_up, 0, 3, 1, 1);
+ connect(ui_mount_up, &QPushButton::clicked, 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;
+ });
+
+ ui_mount_down = new QPushButton(tr("↓"), ui_assets_tab);
+ ui_mount_down->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
+ ui_mount_down->setMaximumWidth(40);
+ ui_mount_down->setEnabled(false);
+ ui_mount_buttons_layout->addWidget(ui_mount_down, 0, 4, 1, 1);
+ connect(ui_mount_down, &QPushButton::clicked, 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;
+ });
+
+ auto *mount_buttons_spacer_2 = new QSpacerItem(40, 20, QSizePolicy::Expanding,
+ QSizePolicy::Minimum);
+ ui_mount_buttons_layout->addItem(mount_buttons_spacer_2, 0, 5, 1, 1);
+
+ ui_mount_clear_cache = new QPushButton(tr("Clear Cache"), ui_assets_tab);
+ ui_mount_clear_cache->setToolTip(tr("Clears the lookup cache for assets. "
+ "Use this when you have added an asset that takes precedence over another "
+ "existing asset."));
+ ui_mount_buttons_layout->addWidget(ui_mount_clear_cache, 0, 6, 1, 1);
+ connect(ui_mount_clear_cache, &QPushButton::clicked, this, [=] {
+ asset_cache_dirty = true;
+ ui_mount_clear_cache->setEnabled(false);
+ });
+
+ connect(ui_mount_list, &QListWidget::itemSelectionChanged, 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);
+ });
+
update_values();
+
// When we're done, we should continue the updates!
setUpdatesEnabled(true);
}
@@ -976,6 +1109,12 @@ void AOOptionsDialog::update_values() {
ui_blips_volume_spinbox->setValue(ao_app->get_default_blip());
ui_bliprate_spinbox->setValue(ao_app->read_blip_rate());
ui_default_showname_textbox->setText(ao_app->get_default_showname());
+
+ auto *defaultMount = new QListWidgetItem(tr("%1 (default)")
+ .arg(ao_app->get_base_path()));
+ defaultMount->setFlags(Qt::ItemFlag::NoItemFlags);
+ ui_mount_list->addItem(defaultMount);
+ ui_mount_list->addItems(ao_app->get_mount_paths());
}
void AOOptionsDialog::save_pressed()
@@ -1050,9 +1189,17 @@ void AOOptionsDialog::save_pressed()
configini->setValue("casing_can_host_cases",
ui_casing_cm_cases_textbox->text());
+ QStringList mountPaths;
+ for (int i = 1; i < ui_mount_list->count(); i++)
+ mountPaths.append(ui_mount_list->item(i)->text());
+ configini->setValue("mount_paths", mountPaths);
+
if (audioChanged)
ao_app->initBASS();
+ if (asset_cache_dirty)
+ ao_app->invalidate_lookup_cache();
+
callwordsini->close();
// We most probably pressed "Restore defaults" at some point. Since we're saving our settings, remove the temporary file.