diff options
Diffstat (limited to 'src/aooptionsdialog.cpp')
| -rw-r--r-- | src/aooptionsdialog.cpp | 161 |
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. |
