diff options
| -rw-r--r-- | src/editexecutablesdialog.cpp | 202 | ||||
| -rw-r--r-- | src/editexecutablesdialog.h | 131 | ||||
| -rw-r--r-- | src/executableslist.h | 16 | ||||
| -rw-r--r-- | src/profile.cpp | 4 | ||||
| -rw-r--r-- | src/profile.h | 4 |
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); |
