summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/editexecutablesdialog.cpp147
-rw-r--r--src/editexecutablesdialog.h39
-rw-r--r--src/mainwindow.cpp36
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();