summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorisanae <14251494+isanae@users.noreply.github.com>2019-06-14 19:13:28 -0400
committerisanae <14251494+isanae@users.noreply.github.com>2019-06-15 14:40:40 -0400
commit5ca4ea500439bdeee85ca2103374618f2608808d (patch)
tree96f3f8de03c051045aa07d482dcacc301437bcc5 /src
parent7671725436551b7254ea89ff6985c5491fcc743d (diff)
merged CustomOverwrites and ForcedLibraries, they were mostly identical
some comments
Diffstat (limited to 'src')
-rw-r--r--src/editexecutablesdialog.cpp202
-rw-r--r--src/editexecutablesdialog.h131
-rw-r--r--src/executableslist.h16
-rw-r--r--src/profile.cpp4
-rw-r--r--src/profile.h4
5 files changed, 165 insertions, 192 deletions
diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp
index 882bb8b5..8929d207 100644
--- a/src/editexecutablesdialog.cpp
+++ b/src/editexecutablesdialog.cpp
@@ -46,11 +46,11 @@ EditExecutablesDialog::EditExecutablesDialog(OrganizerCore& oc, QWidget* parent)
ui->splitter->setStretchFactor(0, 0);
ui->splitter->setStretchFactor(1, 1);
- m_customOverwrites.load(m_organizerCore.currentProfile(), m_executablesList);
- m_forcedLibraries.load(m_organizerCore.currentProfile(), m_executablesList);
+ loadCustomOverwrites();
+ loadForcedLibraries();
- fillList();
ui->mods->addItems(m_organizerCore.modList()->allMods());
+ fillList();
setDirty(false);
// some widgets need to do more than just save() and have their own handler
@@ -65,6 +65,31 @@ EditExecutablesDialog::EditExecutablesDialog(OrganizerCore& oc, QWidget* parent)
EditExecutablesDialog::~EditExecutablesDialog() = default;
+
+void EditExecutablesDialog::loadCustomOverwrites()
+{
+ const auto* p = m_organizerCore.currentProfile();
+
+ for (const auto& e : m_executablesList) {
+ const auto s = p->setting("custom_overwrites", e.title()).toString();
+
+ if (!s.isEmpty()) {
+ m_customOverwrites.set(e.title(), true, s);
+ }
+ }
+}
+
+void EditExecutablesDialog::loadForcedLibraries()
+{
+ const auto* p = m_organizerCore.currentProfile();
+
+ for (const auto& e : m_executablesList) {
+ if (p->forcedLibrariesEnabled(e.title())) {
+ m_forcedLibraries.set(e.title(), true, p->determineForcedLibraries(e.title()));
+ }
+ }
+}
+
ExecutablesList EditExecutablesDialog::getExecutablesList() const
{
ExecutablesList newList;
@@ -88,12 +113,14 @@ ExecutablesList EditExecutablesDialog::getExecutablesList() const
return newList;
}
-const CustomOverwrites& EditExecutablesDialog::getCustomOverwrites() const
+const EditExecutablesDialog::CustomOverwrites&
+EditExecutablesDialog::getCustomOverwrites() const
{
return m_customOverwrites;
}
-const ForcedLibraries& EditExecutablesDialog::getForcedLibraries() const
+const EditExecutablesDialog::ForcedLibraries&
+EditExecutablesDialog::getForcedLibraries() const
{
return m_forcedLibraries;
}
@@ -111,16 +138,16 @@ void EditExecutablesDialog::commitChanges()
// set the new custom overwrites and forced libraries
for (const auto& e : newExecutables) {
- if (auto info=m_customOverwrites.find(e.title())) {
- if (info && info->enabled) {
- profile->storeSetting("custom_overwrites", e.title(), info->modName);
+ if (auto modName=m_customOverwrites.find(e.title())) {
+ if (modName && modName->enabled) {
+ profile->storeSetting("custom_overwrites", e.title(), modName->value);
}
}
- if (auto info=m_forcedLibraries.find(e.title())) {
- if (info && info->enabled && !info->list.empty()) {
+ if (auto libraryList=m_forcedLibraries.find(e.title())) {
+ if (libraryList && libraryList->enabled && !libraryList->value.empty()) {
profile->setForcedLibrariesEnabled(e.title(), true);
- profile->storeForcedLibraries(e.title(), info->list);
+ profile->storeForcedLibraries(e.title(), libraryList->value);
}
}
}
@@ -260,19 +287,19 @@ void EditExecutablesDialog::setEdits(const Executable& e)
{
int modIndex = -1;
- const auto info = m_customOverwrites.find(e.title());
+ const auto modName = m_customOverwrites.find(e.title());
- if (info && !info->modName.isEmpty()) {
- modIndex = ui->mods->findText(info->modName);
+ if (modName && !modName->value.isEmpty()) {
+ modIndex = ui->mods->findText(modName->value);
if (modIndex == -1) {
qWarning().nospace()
- << "executable '" << e.title() << "' uses mod '" << info->modName << "' "
+ << "executable '" << e.title() << "' uses mod '" << modName->value << "' "
<< "as a custom overwrite, but that mod doesn't exist";
}
}
- const bool hasCustomOverwrites = (info && info->enabled);
+ const bool hasCustomOverwrites = (modName && modName->enabled);
ui->createFilesInMod->setChecked(hasCustomOverwrites);
ui->mods->setEnabled(hasCustomOverwrites);
@@ -280,8 +307,8 @@ void EditExecutablesDialog::setEdits(const Executable& e)
}
{
- const auto info = m_forcedLibraries.find(e.title());
- const bool hasForcedLibraries = (info && info->enabled);
+ const auto libraryList = m_forcedLibraries.find(e.title());
+ const bool hasForcedLibraries = (libraryList && libraryList->enabled);
ui->forceLoadLibraries->setChecked(hasForcedLibraries);
ui->configureLibraries->setEnabled(hasForcedLibraries);
@@ -316,8 +343,7 @@ void EditExecutablesDialog::save()
// custom overwrites
if (ui->createFilesInMod->isChecked()) {
- m_customOverwrites.setEnabled(e->title(), true);
- m_customOverwrites.setMod(e->title(), ui->mods->currentText());
+ m_customOverwrites.set(e->title(), true, ui->mods->currentText());
} else {
m_customOverwrites.setEnabled(e->title(), false);
}
@@ -626,12 +652,12 @@ void EditExecutablesDialog::on_configureLibraries_clicked()
ForcedLoadDialog dialog(m_organizerCore.managedGame(), this);
- if (auto info=m_forcedLibraries.find(e->title())) {
- dialog.setValues(info->list);
+ if (auto libraryList=m_forcedLibraries.find(e->title())) {
+ dialog.setValues(libraryList->value);
}
if (dialog.exec() == QDialog::Accepted) {
- m_forcedLibraries.setList(e->title(), dialog.values());
+ m_forcedLibraries.setValue(e->title(), dialog.values());
save();
}
}
@@ -670,133 +696,3 @@ void EditExecutablesDialog::setJarBinary(const QString& binaryName)
save();
}
-
-
-void CustomOverwrites::load(Profile* p, const ExecutablesList& exes)
-{
- for (const auto& e : exes) {
- const auto s = p->setting("custom_overwrites", e.title()).toString();
-
- if (!s.isEmpty()) {
- m_map[e.title()] = {true, s};
- }
- }
-}
-
-std::optional<CustomOverwrites::Info> CustomOverwrites::find(
- const QString& title) const
-{
- auto itor = m_map.find(title);
- if (itor == m_map.end()) {
- return {};
- }
-
- return itor->second;
-}
-
-void CustomOverwrites::setEnabled(const QString& title, bool b)
-{
- auto itor = m_map.find(title);
-
- if (itor == m_map.end()) {
- m_map[title] = {b, {}};
- } else {
- itor->second.enabled = b;
- }
-}
-
-void CustomOverwrites::setMod(const QString& title, const QString& mod)
-{
- auto itor = m_map.find(title);
-
- if (itor == m_map.end()) {
- m_map[title] = {true, mod};
- } else {
- itor->second.modName = mod;
- }
-}
-
-void CustomOverwrites::rename(const QString& oldTitle, const QString& newTitle)
-{
- auto itor = m_map.find(oldTitle);
- if (itor == m_map.end()) {
- return;
- }
-
- // copy to new title, erase old
- m_map[newTitle] = itor->second;
- m_map.erase(itor);
-}
-
-void CustomOverwrites::remove(const QString& title)
-{
- auto itor = m_map.find(title);
-
- if (itor != m_map.end()) {
- m_map.erase(itor);
- }
-}
-
-
-void ForcedLibraries::load(Profile* p, const ExecutablesList& exes)
-{
- for (const auto& e : exes) {
- if (p->forcedLibrariesEnabled(e.title())) {
- m_map[e.title()] = {true, p->determineForcedLibraries(e.title())};
- }
- }
-}
-
-std::optional<ForcedLibraries::Info> ForcedLibraries::find(
- const QString& title) const
-{
- auto itor = m_map.find(title);
- if (itor == m_map.end()) {
- return {};
- }
-
- return itor->second;
-}
-
-void ForcedLibraries::setEnabled(const QString& title, bool b)
-{
- auto itor = m_map.find(title);
-
- if (itor == m_map.end()) {
- m_map[title] = {b, {}};
- } else {
- itor->second.enabled = b;
- }
-}
-
-void ForcedLibraries::setList(const QString& title, const list_type& list)
-{
- auto itor = m_map.find(title);
-
- if (itor == m_map.end()) {
- m_map[title] = {true, list};
- } else {
- itor->second.list = list;
- }
-}
-
-void ForcedLibraries::rename(const QString& oldTitle, const QString& newTitle)
-{
- auto itor = m_map.find(oldTitle);
- if (itor == m_map.end()) {
- return;
- }
-
- // copy to new title, erase old
- m_map[newTitle] = itor->second;
- m_map.erase(itor);
-}
-
-void ForcedLibraries::remove(const QString& title)
-{
- auto itor = m_map.find(title);
-
- if (itor != m_map.end()) {
- m_map.erase(itor);
- }
-}
diff --git a/src/editexecutablesdialog.h b/src/editexecutablesdialog.h
index 4a04ef42..9715489e 100644
--- a/src/editexecutablesdialog.h
+++ b/src/editexecutablesdialog.h
@@ -37,53 +37,102 @@ class ModList;
class OrganizerCore;
/** helper class to manage custom overwrites within the edit executables
- * dialog
+ * dialog, stores a T and a bool in map indexed by a QString
**/
-class CustomOverwrites
+template <class T>
+class ToggableMap
{
public:
- struct Info
+ struct Value
{
bool enabled;
- QString modName;
+ T value;
+
+ Value(bool b, T&& v)
+ : enabled(b), value(std::forward<T>(v))
+ {
+ }
};
- void load(Profile* p, const ExecutablesList& exes);
- std::optional<Info> find(const QString& title) const;
+ /**
+ * returns the Value associated with the given title, or empty
+ **/
+ std::optional<Value> find(const QString& title) const
+ {
+ auto itor = m_map.find(title);
+ if (itor == m_map.end()) {
+ return {};
+ }
- void setEnabled(const QString& title, bool b);
- void setMod(const QString& title, const QString& mod);
- void rename(const QString& oldTitle, const QString& newTitle);
- void remove(const QString& title);
+ return itor->second;
+ }
-private:
- std::map<QString, Info> m_map;
-};
+ /**
+ * sets the given value, adds it if not found
+ **/
+ void set(QString title, bool b, T value)
+ {
+ m_map.insert_or_assign(std::move(title), Value(b, std::move(value)));
+ }
+ /**
+ * sets whether the given value is enabled, inserts it if not found
+ **/
+ void setEnabled(const QString& title, bool b)
+ {
+ auto itor = m_map.find(title);
-/** helper class to manage forced libraries within the edit executables dialog
- **/
-class ForcedLibraries
-{
-public:
- using list_type = QList<MOBase::ExecutableForcedLoadSetting>;
+ if (itor == m_map.end()) {
+ m_map.emplace(title, Value(b, {}));
+ } else {
+ itor->second.enabled = b;
+ }
+ }
- struct Info
+ /**
+ * sets the given value, inserts it enabled if not found
+ **/
+ void setValue(const QString& title, T value)
{
- bool enabled;
- list_type list;
- };
+ auto itor = m_map.find(title);
- void load(Profile* p, const ExecutablesList& exes);
- std::optional<Info> find(const QString& title) const;
+ if (itor == m_map.end()) {
+ m_map.emplace(title, Value(true, std::move(value)));
+ } else {
+ itor->second.value = std::move(value);
+ }
+ }
- void setEnabled(const QString& title, bool b);
- void setList(const QString& title, const list_type& list);
- void rename(const QString& oldTitle, const QString& newTitle);
- void remove(const QString& title);
+ /**
+ * renames the given value, ignored if not found
+ **/
+ void rename(const QString& oldTitle, QString newTitle)
+ {
+ auto itor = m_map.find(oldTitle);
+ if (itor == m_map.end()) {
+ return;
+ }
+
+ // move to new title, erase old
+ m_map.emplace(std::move(newTitle), std::move(itor->second));
+ m_map.erase(itor);
+ }
+
+ /**
+ * removes the given value, ignored if not found
+ **/
+ void remove(const QString& title)
+ {
+ auto itor = m_map.find(title);
+ if (itor == m_map.end()) {
+ return;
+ }
+
+ m_map.erase(itor);
+ }
private:
- std::map<QString, Info> m_map;
+ std::map<QString, Value> m_map;
};
@@ -95,10 +144,9 @@ class EditExecutablesDialog : public MOBase::TutorableDialog
Q_OBJECT
public:
- /**
- * @param executablesList current list of executables
- * @param parent parent widget
- **/
+ using CustomOverwrites = ToggableMap<QString>;
+ using ForcedLibraries = ToggableMap<QList<MOBase::ExecutableForcedLoadSetting>>;
+
explicit EditExecutablesDialog(OrganizerCore& oc, QWidget* parent=nullptr);
~EditExecutablesDialog();
@@ -130,13 +178,28 @@ private slots:
private:
std::unique_ptr<Ui::EditExecutablesDialog> ui;
OrganizerCore& m_organizerCore;
+
+ // copy of the original executables, used to clear the current settings when
+ // committing changes
const ExecutablesList m_originalExecutables;
+
+ // current executable list
ExecutablesList m_executablesList;
+
+ // custom overwrites set in the dialog
CustomOverwrites m_customOverwrites;
+
+ // forced libraries set in the dialog
ForcedLibraries m_forcedLibraries;
+
+ // true when the change events being triggered are in response to loading
+ // the executable's data into the UI, not from a user change
bool m_settingUI;
+ void loadCustomOverwrites();
+ void loadForcedLibraries();
+
QListWidgetItem* selectedItem();
Executable* selectedExe();
diff --git a/src/executableslist.h b/src/executableslist.h
index 61582e71..61bf6734 100644
--- a/src/executableslist.h
+++ b/src/executableslist.h
@@ -102,9 +102,13 @@ public:
/**
* @brief initializes the list from the settings and the given plugin
- */
+ **/
void load(const MOBase::IPluginGame* game, QSettings& settings);
+ /**
+ * @brief re-adds all the executables from the plugin and renames existing
+ * executables that are in the way
+ **/
void resetFromPlugin(MOBase::IPluginGame const *game);
/**
@@ -167,18 +171,28 @@ public:
**/
void remove(const QString &title);
+ /**
+ * returns a title that starts with the given prefix and does not clash with
+ * an existing executable, may fail
+ */
std::optional<QString> makeNonConflictingTitle(const QString& prefix);
private:
enum SetFlags
{
+ // executables having the same name as existing ones are ignored
IgnoreExisting = 1,
+
+ // executables having the same name are merged
MergeExisting,
+
+ // an existing executable with the same name is renamed
MoveExisting
};
std::vector<Executable> m_Executables;
+
/**
* @brief add the executables preconfigured for this game
**/
diff --git a/src/profile.cpp b/src/profile.cpp
index 4ccaa641..ef387027 100644
--- a/src/profile.cpp
+++ b/src/profile.cpp
@@ -982,7 +982,7 @@ int Profile::getPriorityMinimum() const
return m_ModIndexByPriority.begin()->first;
}
-bool Profile::forcedLibrariesEnabled(const QString &executable)
+bool Profile::forcedLibrariesEnabled(const QString &executable) const
{
return setting("forced_libraries", executable + "/enabled", false).toBool();
}
@@ -992,7 +992,7 @@ void Profile::setForcedLibrariesEnabled(const QString &executable, bool enabled)
storeSetting("forced_libraries", executable + "/enabled", enabled);
}
-QList<ExecutableForcedLoadSetting> Profile::determineForcedLibraries(const QString &executable)
+QList<ExecutableForcedLoadSetting> Profile::determineForcedLibraries(const QString &executable) const
{
QList<ExecutableForcedLoadSetting> results;
diff --git a/src/profile.h b/src/profile.h
index a7ba7e91..bc7964f8 100644
--- a/src/profile.h
+++ b/src/profile.h
@@ -330,9 +330,9 @@ public:
int getPriorityMinimum() const;
- bool forcedLibrariesEnabled(const QString &executable);
+ bool forcedLibrariesEnabled(const QString &executable) const;
void setForcedLibrariesEnabled(const QString &executable, bool enabled);
- QList<MOBase::ExecutableForcedLoadSetting> determineForcedLibraries(const QString &executable);
+ QList<MOBase::ExecutableForcedLoadSetting> determineForcedLibraries(const QString &executable) const;
void storeForcedLibraries(const QString &executable, const QList<MOBase::ExecutableForcedLoadSetting> &values);
void removeForcedLibraries(const QString &executable);