From a983b5c7d7ded40ab12dbeb7702f92b34bcdec6f Mon Sep 17 00:00:00 2001 From: Ivan Savenko Date: Tue, 17 Dec 2024 14:38:50 +0000 Subject: [PATCH] It is now possible to export or import mod preset to/from clipboard --- launcher/modManager/cmodlistview_moc.cpp | 11 ++++++++ launcher/modManager/cmodlistview_moc.h | 7 ++--- launcher/modManager/modstatemodel.cpp | 10 +++++++ launcher/modManager/modstatemodel.h | 3 ++ launcher/startGame/StartGameTab.cpp | 14 ++++++--- lib/modding/ModManager.cpp | 36 ++++++++++++++++++++++++ lib/modding/ModManager.h | 6 ++++ 7 files changed, 79 insertions(+), 8 deletions(-) diff --git a/launcher/modManager/cmodlistview_moc.cpp b/launcher/modManager/cmodlistview_moc.cpp index 974c4062f..642f50ced 100644 --- a/launcher/modManager/cmodlistview_moc.cpp +++ b/launcher/modManager/cmodlistview_moc.cpp @@ -1143,3 +1143,14 @@ QString CModListView::getActivePreset() const { return modStateModel->getActivePreset(); } + +JsonNode CModListView::exportCurrentPreset() const +{ + return modStateModel->exportCurrentPreset(); +} + +void CModListView::importPreset(const JsonNode & data) +{ + modStateModel->importPreset(data); + modStateModel->reloadLocalState(); +} diff --git a/launcher/modManager/cmodlistview_moc.h b/launcher/modManager/cmodlistview_moc.h index 6dbd198ce..bfa6f81d7 100644 --- a/launcher/modManager/cmodlistview_moc.h +++ b/launcher/modManager/cmodlistview_moc.h @@ -97,17 +97,16 @@ public: QStringList getUpdateableMods(); void createNewPreset(const QString & presetName); - void deletePreset(const QString & presetName); - void activatePreset(const QString & presetName); - void renamePreset(const QString & oldPresetName, const QString & newPresetName); QStringList getAllPresets() const; - QString getActivePreset() const; + JsonNode exportCurrentPreset() const; + void importPreset(const JsonNode & data); + /// returns true if mod is currently enabled bool isModEnabled(const QString & modName); diff --git a/launcher/modManager/modstatemodel.cpp b/launcher/modManager/modstatemodel.cpp index aaaa037ce..97845cc03 100644 --- a/launcher/modManager/modstatemodel.cpp +++ b/launcher/modManager/modstatemodel.cpp @@ -157,3 +157,13 @@ QString ModStateModel::getActivePreset() const { return QString::fromStdString(modManager->getActivePreset()); } + +JsonNode ModStateModel::exportCurrentPreset() const +{ + return modManager->exportCurrentPreset(); +} + +void ModStateModel::importPreset(const JsonNode & data) +{ + modManager->importPreset(data); +} diff --git a/launcher/modManager/modstatemodel.h b/launcher/modManager/modstatemodel.h index e15433dc7..9244a3f51 100644 --- a/launcher/modManager/modstatemodel.h +++ b/launcher/modManager/modstatemodel.h @@ -57,4 +57,7 @@ public: QStringList getAllPresets() const; QString getActivePreset() const; + + JsonNode exportCurrentPreset() const; + void importPreset(const JsonNode & data); }; diff --git a/launcher/startGame/StartGameTab.cpp b/launcher/startGame/StartGameTab.cpp index bf3e6c3f4..d532dccec 100644 --- a/launcher/startGame/StartGameTab.cpp +++ b/launcher/startGame/StartGameTab.cpp @@ -44,8 +44,6 @@ StartGameTab::StartGameTab(QWidget * parent) refreshState(); ui->buttonGameResume->setVisible(false); // TODO: implement - ui->buttonPresetExport->setVisible(false); // TODO: implement - ui->buttonPresetImport->setVisible(false); // TODO: implement #ifndef ENABLE_EDITOR ui->buttonGameEditor->hide(); @@ -360,12 +358,20 @@ void StartGameTab::on_buttonMissingCampaignsHelp_clicked() void StartGameTab::on_buttonPresetExport_clicked() { - // TODO + JsonNode presetJson = getMainWindow()->getModView()->exportCurrentPreset(); + QString presetString = QString::fromStdString(presetJson.toCompactString()); + QGuiApplication::clipboard()->setText(presetString); } void StartGameTab::on_buttonPresetImport_clicked() { - // TODO + QString presetString = QGuiApplication::clipboard()->text(); + QByteArray presetBytes(presetString.toUtf8()); + JsonNode presetJson(reinterpret_cast(presetBytes.data()), presetBytes.size(), "imported preset"); + + getMainWindow()->getModView()->importPreset(presetJson); + getMainWindow()->switchToModsTab(); + refreshPresets(); } void StartGameTab::on_buttonPresetNew_clicked() diff --git a/lib/modding/ModManager.cpp b/lib/modding/ModManager.cpp index 20dcc9fc6..bf32343e8 100644 --- a/lib/modding/ModManager.cpp +++ b/lib/modding/ModManager.cpp @@ -385,6 +385,31 @@ std::string ModsPresetState::getActivePreset() const return modConfig["activePreset"].String(); } +JsonNode ModsPresetState::exportCurrentPreset() const +{ + JsonNode data = getActivePresetConfig(); + std::string presetName = getActivePreset(); + + data["name"] = JsonNode(presetName); + + vstd::erase_if(data["settings"].Struct(), [&](const auto & pair){ + return !vstd::contains(data["mods"].Vector(), JsonNode(pair.first)); + }); + + return data; +} + +void ModsPresetState::importPreset(const JsonNode & newConfig) +{ + std::string importedPresetName = newConfig["name"].String(); + + if (importedPresetName.empty()) + throw std::runtime_error("Attempt to import invalid preset"); + + modConfig["presets"][importedPresetName] = newConfig; + modConfig["presets"][importedPresetName].Struct().erase("name"); +} + ModsStorage::ModsStorage(const std::vector & modsToLoad, const JsonNode & repositoryList) { JsonNode coreModConfig(JsonPath::builtin("config/gameConfig.json")); @@ -796,4 +821,15 @@ std::string ModManager::getActivePreset() const return modsPreset->getActivePreset(); } +JsonNode ModManager::exportCurrentPreset() const +{ + return modsPreset->exportCurrentPreset(); +} + +void ModManager::importPreset(const JsonNode & data) +{ + modsPreset->importPreset(data); + modsPreset->saveConfigurationState(); +} + VCMI_LIB_NAMESPACE_END diff --git a/lib/modding/ModManager.h b/lib/modding/ModManager.h index 616e2632d..0f5cedeb8 100644 --- a/lib/modding/ModManager.h +++ b/lib/modding/ModManager.h @@ -58,6 +58,9 @@ public: std::vector getAllPresets() const; std::string getActivePreset() const; + JsonNode exportCurrentPreset() const; + void importPreset(const JsonNode & data); + void setModActive(const TModID & modName, bool isActive); void addRootMod(const TModID & modName); @@ -155,6 +158,9 @@ public: std::vector getAllPresets() const; std::string getActivePreset() const; + + JsonNode exportCurrentPreset() const; + void importPreset(const JsonNode & data); }; VCMI_LIB_NAMESPACE_END