From cc997c370465629c11b72ebef3ffde1bbd1fa46e Mon Sep 17 00:00:00 2001
From: isanae <14251494+isanae@users.noreply.github.com>
Date: Tue, 29 Dec 2020 02:10:33 -0500
Subject: editable combobox for output mod name
---
src/editexecutablesdialog.cpp | 66 +++++++++++++++++++++++++++++++++++++++++--
src/editexecutablesdialog.h | 3 +-
src/editexecutablesdialog.ui | 3 ++
src/pch.h | 1 +
4 files changed, 69 insertions(+), 4 deletions(-)
diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp
index cd11d5fb..6e3cecff 100644
--- a/src/editexecutablesdialog.cpp
+++ b/src/editexecutablesdialog.cpp
@@ -71,6 +71,9 @@ EditExecutablesDialog::EditExecutablesDialog(OrganizerCore& oc, int sel, QWidget
loadCustomOverwrites();
loadForcedLibraries();
+
+ QStringList modNames;
+
for (auto&& m : m_organizerCore.modList()->allMods()) {
auto mod = ModInfo::getByName(m);
if (!mod->hasAnyOfTheseFlags({ ModInfo::FLAG_FOREIGN,
@@ -78,9 +81,16 @@ EditExecutablesDialog::EditExecutablesDialog(OrganizerCore& oc, int sel, QWidget
ModInfo::FLAG_OVERWRITE,
ModInfo::FLAG_SEPARATOR })) {
ui->mods->addItem(m);
+ modNames.push_back(m);
}
}
+ auto* c = new QCompleter(modNames);
+ c->setCaseSensitivity(Qt::CaseInsensitive);
+ c->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
+ ui->mods->setCompleter(c);
+
+
fillList();
setDirty(false);
@@ -170,9 +180,51 @@ EditExecutablesDialog::getForcedLibraries() const
return m_forcedLibraries;
}
-void EditExecutablesDialog::commitChanges()
+bool EditExecutablesDialog::checkOutputMods(const ExecutablesList& exes)
+{
+ // make sure the output mods for exes exist since the combobox is editable
+ //
+ // it'd be convenient for users to automatically create mods here if they're
+ // not found, but this is a can of worms: it would require a refresh
+ // because getIndex() still won't find it after calling
+ // OrganizerCore::createMod(), which is a problem if the user just clicked
+ // Apply and continued doing things
+ //
+ // triggering a refresh while this dialog is up doesn't sound like a very
+ // smart thing to do for now, so this just shows an error
+
+ for (const auto& e : exes) {
+ auto modName = m_customOverwrites.find(e.title());
+
+ if (modName && modName->enabled) {
+ if (modName->value.isEmpty()) {
+ QMessageBox::critical(
+ this, tr("Empty output mod"),
+ tr("The output mod for %2 is empty.").arg(e.title()));
+
+ return false;
+ } else if (ModInfo::getIndex(modName->value) == UINT_MAX) {
+ QMessageBox::critical(
+ this, tr("Output mod not found"),
+ tr("The output mod '%1' for %2 does not exist.")
+ .arg(modName->value).arg(e.title()));
+
+ return false;
+ }
+ }
+ }
+
+ return true;
+}
+
+bool EditExecutablesDialog::commitChanges()
{
const auto newExecutables = getExecutablesList();
+
+ if (!checkOutputMods(newExecutables)) {
+ return false;
+ }
+
auto* profile = m_organizerCore.currentProfile();
// remove all the custom overwrites and forced libraries
@@ -201,6 +253,8 @@ void EditExecutablesDialog::commitChanges()
m_organizerCore.setExecutablesList(newExecutables);
setDirty(false);
+
+ return true;
}
void EditExecutablesDialog::setDirty(bool b)
@@ -651,6 +705,11 @@ void EditExecutablesDialog::on_createFilesInMod_toggled(bool checked)
ui->mods->setEnabled(checked);
save();
+
+ if (checked) {
+ ui->mods->lineEdit()->selectAll();
+ ui->mods->setFocus();
+ }
}
void EditExecutablesDialog::on_forceLoadLibraries_toggled(bool checked)
@@ -776,8 +835,9 @@ void EditExecutablesDialog::on_configureLibraries_clicked()
void EditExecutablesDialog::on_buttons_clicked(QAbstractButton* b)
{
if (b == ui->buttons->button(QDialogButtonBox::Ok)) {
- commitChanges();
- accept();
+ if (commitChanges()) {
+ accept();
+ }
} else if (b == ui->buttons->button(QDialogButtonBox::Apply)) {
commitChanges();
} else {
diff --git a/src/editexecutablesdialog.h b/src/editexecutablesdialog.h
index c8be0bf6..8da53e09 100644
--- a/src/editexecutablesdialog.h
+++ b/src/editexecutablesdialog.h
@@ -225,9 +225,10 @@ private:
bool canMove(const QListWidgetItem* item, int direction);
void move(QListWidgetItem* item, int direction);
bool isTitleConflicting(const QString& s);
- void commitChanges();
+ bool commitChanges();
void setDirty(bool b);
void selectIndex(int i);
+ bool checkOutputMods(const ExecutablesList& exes);
void addFromFile();
void addEmpty();
diff --git a/src/editexecutablesdialog.ui b/src/editexecutablesdialog.ui
index 6f50b3b3..d90fd8d4 100644
--- a/src/editexecutablesdialog.ui
+++ b/src/editexecutablesdialog.ui
@@ -387,6 +387,9 @@ Right now the only case I know of where this needs to be overwritten is for the
false
+
+ true
+
diff --git a/src/pch.h b/src/pch.h
index 2a2246ba..bfc7f2d2 100644
--- a/src/pch.h
+++ b/src/pch.h
@@ -89,6 +89,7 @@
#include
#include
#include
+#include
#include
#include
#include
--
cgit v1.3.1