summaryrefslogtreecommitdiff
path: root/src/editexecutablesdialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/editexecutablesdialog.cpp')
-rw-r--r--src/editexecutablesdialog.cpp147
1 files changed, 112 insertions, 35 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)