diff options
| author | isanae <14251494+isanae@users.noreply.github.com> | 2019-06-09 11:38:44 -0400 |
|---|---|---|
| committer | isanae <14251494+isanae@users.noreply.github.com> | 2019-06-15 14:40:40 -0400 |
| commit | e86224ee7ffdb18b7c7d17bc2c5cef2457665103 (patch) | |
| tree | da8642f6d0ce7f82410361cd3aed5a7a511647c7 /src | |
| parent | d6d05dcae8d2b26aff5917449e38f9886bca65ba (diff) | |
moved commiting changes to EditExecutablesDialog itself instead of doing it from the main window
use a separate enabled state for custom overwrites and forced libraries, this remembers the values even when unchecking the checkbox, as long as the dialog stays opened
pass the whole OrganizerCore to EditExecutablesDialog, simplifies a bunch of things
Diffstat (limited to 'src')
| -rw-r--r-- | src/editexecutablesdialog.cpp | 147 | ||||
| -rw-r--r-- | src/editexecutablesdialog.h | 39 | ||||
| -rw-r--r-- | src/mainwindow.cpp | 36 |
3 files changed, 139 insertions, 83 deletions
diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp index 102ac4d5..cb6ec6e8 100644 --- a/src/editexecutablesdialog.cpp +++ b/src/editexecutablesdialog.cpp @@ -33,15 +33,12 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. using namespace MOBase; using namespace MOShared; -EditExecutablesDialog::EditExecutablesDialog( - const ExecutablesList &executablesList, const ModList &modList, - Profile *profile, const IPluginGame *game, QWidget *parent) +EditExecutablesDialog::EditExecutablesDialog(OrganizerCore& oc, QWidget* parent) : TutorableDialog("EditExecutables", parent) , ui(new Ui::EditExecutablesDialog) - , m_currentItem(nullptr) - , m_executablesList(executablesList) - , m_profile(profile) - , m_gamePlugin(game) + , m_organizerCore(oc) + , m_originalExecutables(*oc.executablesList()) + , m_executablesList(*oc.executablesList()) , m_settingUI(false) { ui->setupUi(this); @@ -49,11 +46,11 @@ EditExecutablesDialog::EditExecutablesDialog( ui->splitter->setStretchFactor(0, 0); ui->splitter->setStretchFactor(1, 1); - m_customOverwrites.load(profile, m_executablesList); - m_forcedLibraries.load(profile, m_executablesList); + m_customOverwrites.load(m_organizerCore.currentProfile(), m_executablesList); + m_forcedLibraries.load(m_organizerCore.currentProfile(), m_executablesList); fillExecutableList(); - ui->mods->addItems(modList.allMods()); + ui->mods->addItems(m_organizerCore.modList()->allMods()); // some widgets need to do more than just save() and have their own handler connect(ui->binary, &QLineEdit::textChanged, [&]{ save(); }); @@ -106,6 +103,37 @@ const ForcedLibraries& EditExecutablesDialog::getForcedLibraries() const return m_forcedLibraries; } +void EditExecutablesDialog::commitChanges() +{ + const auto newExecutables = getExecutablesList(); + auto* profile = m_organizerCore.currentProfile(); + + // remove all the custom overwrites and forced libraries + for (const auto& e : m_originalExecutables) { + profile->removeSetting("custom_overwrites", e.title()); + profile->removeForcedLibraries(e.title()); + } + + // 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 info=m_forcedLibraries.find(e.title())) { + if (info && info->enabled && !info->list.empty()) { + profile->setForcedLibrariesEnabled(e.title(), true); + profile->storeForcedLibraries(e.title(), info->list); + } + } + } + + // set the new executables list + m_organizerCore.setExecutablesList(newExecutables); +} + QListWidgetItem* EditExecutablesDialog::selectedItem() { const auto selection = ui->list->selectedItems(); @@ -215,23 +243,28 @@ void EditExecutablesDialog::setEdits(const Executable& e) { int modIndex = -1; - if (const auto mod=m_customOverwrites.find(e.title())) { - modIndex = ui->mods->findText(*mod); + const auto info = m_customOverwrites.find(e.title()); + + if (info && !info->modName.isEmpty()) { + modIndex = ui->mods->findText(info->modName); if (modIndex == -1) { qWarning().nospace() - << "executable '" << e.title() << "' uses mod '" << *mod << "' " + << "executable '" << e.title() << "' uses mod '" << info->modName << "' " << "as a custom overwrite, but that mod doesn't exist"; } } - ui->createFilesInMod->setChecked(modIndex != -1); - ui->mods->setEnabled(modIndex != -1); + const bool hasCustomOverwrites = (info && info->enabled); + + ui->createFilesInMod->setChecked(hasCustomOverwrites); + ui->mods->setEnabled(hasCustomOverwrites); ui->mods->setCurrentIndex(modIndex); } { - const auto hasForcedLibraries = m_forcedLibraries.find(e.title()).has_value(); + const auto info = m_forcedLibraries.find(e.title()); + const bool hasForcedLibraries = (info && info->enabled); ui->forceLoadLibraries->setChecked(hasForcedLibraries); ui->configureLibraries->setEnabled(hasForcedLibraries); @@ -269,25 +302,32 @@ void EditExecutablesDialog::save() qDebug().nospace() << "saving '" << e->title() << "'"; // title may have changed, start with the stuff using it + + // custom overwrites if (ui->createFilesInMod->isChecked()) { - m_customOverwrites.set(e->title(), ui->mods->currentText()); + m_customOverwrites.setEnabled(e->title(), true); + m_customOverwrites.setMod(e->title(), ui->mods->currentText()); } else { - m_customOverwrites.remove(e->title()); + m_customOverwrites.setEnabled(e->title(), false); } + // forced libraries + m_forcedLibraries.setEnabled(e->title(), ui->forceLoadLibraries->isChecked()); + + // get the new title, but ignore it if it's conflicting with an already + // existing executable QString newTitle = ui->title->text(); if (isTitleConflicting(newTitle)) { - // don't save conflicting titles newTitle = e->title(); } - // forced libraries are saved in on_configureLibraries_clicked() - - // now rename both the custom overwrites and forced libraries if the title - // is being changed if (e->title() != newTitle) { + // now rename both the custom overwrites and forced libraries if the title + // is being changed m_customOverwrites.rename(e->title(), newTitle); m_forcedLibraries.rename(e->title(), newTitle); + + // save the new title e->title(newTitle); } @@ -485,20 +525,21 @@ void EditExecutablesDialog::on_configureLibraries_clicked() return; } - ForcedLoadDialog dialog(m_gamePlugin, this); + ForcedLoadDialog dialog(m_organizerCore.managedGame(), this); - if (auto list=m_forcedLibraries.find(e->title())) { - dialog.setValues(*list); + if (auto info=m_forcedLibraries.find(e->title())) { + dialog.setValues(info->list); } if (dialog.exec() == QDialog::Accepted) { - m_forcedLibraries.set(e->title(), dialog.values()); + m_forcedLibraries.setList(e->title(), dialog.values()); save(); } } void EditExecutablesDialog::on_buttons_accepted() { + commitChanges(); accept(); } @@ -556,12 +597,13 @@ void CustomOverwrites::load(Profile* p, const ExecutablesList& exes) const auto s = p->setting("custom_overwrites", e.title()).toString(); if (!s.isEmpty()) { - m_map[e.title()] = s; + m_map[e.title()] = {true, s}; } } } -std::optional<QString> CustomOverwrites::find(const QString& title) const +std::optional<CustomOverwrites::Info> CustomOverwrites::find( + const QString& title) const { auto itor = m_map.find(title); if (itor == m_map.end()) { @@ -571,9 +613,26 @@ std::optional<QString> CustomOverwrites::find(const QString& title) const return itor->second; } -void CustomOverwrites::set(const QString& title, const QString& mod) +void CustomOverwrites::setEnabled(const QString& title, bool b) { - m_map[title] = mod; + 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) @@ -602,12 +661,13 @@ void ForcedLibraries::load(Profile* p, const ExecutablesList& exes) { for (const auto& e : exes) { if (p->forcedLibrariesEnabled(e.title())) { - m_map[e.title()] = p->determineForcedLibraries(e.title()); + m_map[e.title()] = {true, p->determineForcedLibraries(e.title())}; } } } -std::optional<ForcedLibraries::list_type> ForcedLibraries::find(const QString& title) const +std::optional<ForcedLibraries::Info> ForcedLibraries::find( + const QString& title) const { auto itor = m_map.find(title); if (itor == m_map.end()) { @@ -617,9 +677,26 @@ std::optional<ForcedLibraries::list_type> ForcedLibraries::find(const QString& t return itor->second; } -void ForcedLibraries::set(const QString& title, const list_type& mod) +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) { - m_map[title] = mod; + 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) diff --git a/src/editexecutablesdialog.h b/src/editexecutablesdialog.h index 6e006ae2..4957ebff 100644 --- a/src/editexecutablesdialog.h +++ b/src/editexecutablesdialog.h @@ -34,7 +34,7 @@ namespace Ui { }
class ModList;
-
+class OrganizerCore;
/** helper class to manage custom overwrites within the edit executables
* dialog
@@ -42,15 +42,22 @@ class ModList; class CustomOverwrites
{
public:
+ struct Info
+ {
+ bool enabled;
+ QString modName;
+ };
+
void load(Profile* p, const ExecutablesList& exes);
- std::optional<QString> find(const QString& title) const;
+ std::optional<Info> find(const QString& title) const;
- void set(const QString& title, const QString& mod);
+ 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);
private:
- std::map<QString, QString> m_map;
+ std::map<QString, Info> m_map;
};
@@ -61,15 +68,22 @@ class ForcedLibraries public:
using list_type = QList<MOBase::ExecutableForcedLoadSetting>;
+ struct Info
+ {
+ bool enabled;
+ list_type list;
+ };
+
void load(Profile* p, const ExecutablesList& exes);
- std::optional<list_type> find(const QString& title) const;
+ std::optional<Info> find(const QString& title) const;
- void set(const QString& title, const list_type& list);
+ 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);
private:
- std::map<QString, list_type> m_map;
+ std::map<QString, Info> m_map;
};
@@ -85,9 +99,7 @@ public: * @param executablesList current list of executables
* @param parent parent widget
**/
- explicit EditExecutablesDialog(
- const ExecutablesList &executablesList, const ModList &modList,
- Profile *profile, const MOBase::IPluginGame *game, QWidget *parent = 0);
+ explicit EditExecutablesDialog(OrganizerCore& oc, QWidget* parent=nullptr);
~EditExecutablesDialog();
@@ -115,15 +127,13 @@ private slots: private:
std::unique_ptr<Ui::EditExecutablesDialog> ui;
+ OrganizerCore& m_organizerCore;
+ const ExecutablesList m_originalExecutables;
ExecutablesList m_executablesList;
CustomOverwrites m_customOverwrites;
ForcedLibraries m_forcedLibraries;
- Profile *m_profile;
- const MOBase::IPluginGame *m_gamePlugin;
bool m_settingUI;
- QListWidgetItem *m_currentItem;
-
QListWidgetItem* selectedItem();
Executable* selectedExe();
@@ -137,6 +147,7 @@ private: void setJarBinary(const QString& binaryName);
std::optional<QString> makeNonConflictingTitle(const QString& prefix);
bool isTitleConflicting(const QString& s);
+ void commitChanges();
};
#endif // EDITEXECUTABLESDIALOG_H
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 05417f51..15a6eb62 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2482,13 +2482,8 @@ bool MainWindow::modifyExecutablesDialog() try { const auto oldExecutables = *m_OrganizerCore.executablesList(); - auto* profile = m_OrganizerCore.currentProfile(); - EditExecutablesDialog dialog(oldExecutables, - *m_OrganizerCore.modList(), - profile, - m_OrganizerCore.managedGame(), - this); + EditExecutablesDialog dialog(m_OrganizerCore, this); QSettings &settings = m_OrganizerCore.settings().directInterface(); QString key = QString("geometry/%1").arg(dialog.objectName()); @@ -2497,34 +2492,7 @@ bool MainWindow::modifyExecutablesDialog() dialog.restoreGeometry(settings.value(key).toByteArray()); } - if (dialog.exec() == QDialog::Accepted) { - const auto newExecutables = dialog.getExecutablesList(); - - // remove all the custom overwrites and forced libraries - for (const auto& e : oldExecutables) { - profile->removeSetting("custom_overwrites", e.title()); - profile->removeForcedLibraries(e.title()); - } - - // set the new custom overwrites and forced libraries - for (const auto& e : newExecutables) { - if (auto modName=dialog.getCustomOverwrites().find(e.title())) { - profile->storeSetting("custom_overwrites", e.title(), *modName); - } - - if (auto list=dialog.getForcedLibraries().find(e.title())) { - if (!list->empty()) { - profile->setForcedLibrariesEnabled(e.title(), true); - profile->storeForcedLibraries(e.title(), *list); - } - } - } - - // set the new executables list - m_OrganizerCore.setExecutablesList(newExecutables); - - result = true; - } + result = (dialog.exec() == QDialog::Accepted); settings.setValue(key, dialog.saveGeometry()); refreshExecutablesList(); |
