From 7ee008e150bc5bcf76082d726f719ee0fdfda982 Mon Sep 17 00:00:00 2001 From: SulfurNitride Date: Wed, 11 Feb 2026 02:37:39 -0600 Subject: Fluorine Manager: full Linux port of Mod Organizer 2 Complete native Linux port with FUSE-based virtual filesystem, Proton/umu-run integration, and Flatpak packaging. Key features: - FUSE VFS replacing Windows USVFS (in-process + standalone helper for Flatpak) - Proton/GE-Proton/umu-run launcher with env var forwarding - Flatpak support (sandbox-aware VFS, NXM handler, umu-run) - Wine prefix management UI - Case-insensitive path resolution for Linux filesystems - QSettings-safe INI handling (avoids Bethesda INI corruption) - Portable instance support with auto-generated launcher scripts Co-Authored-By: Claude Opus 4.6 --- libs/tool_inibakery/src/inibakery.cpp | 97 +++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 libs/tool_inibakery/src/inibakery.cpp (limited to 'libs/tool_inibakery/src/inibakery.cpp') diff --git a/libs/tool_inibakery/src/inibakery.cpp b/libs/tool_inibakery/src/inibakery.cpp new file mode 100644 index 0000000..bb23492 --- /dev/null +++ b/libs/tool_inibakery/src/inibakery.cpp @@ -0,0 +1,97 @@ +#include "inibakery.h" + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +using namespace MOBase; + +bool IniBakery::init(MOBase::IOrganizer* moInfo) +{ + using namespace std::placeholders; + m_MOInfo = moInfo; + m_MOInfo->onAboutToRun([this](const auto& binary) { + return prepareIni(binary); + }); + + return true; +} + +QString IniBakery::name() const +{ + return "INI Bakery"; +} + +QString IniBakery::localizedName() const +{ + return tr("INI Bakery"); +} + +QString IniBakery::author() const +{ + return "Tannin"; +} + +QString IniBakery::description() const +{ + return tr("Manages game ini files"); +} + +MOBase::VersionInfo IniBakery::version() const +{ + return VersionInfo(0, 3, 0, VersionInfo::RELEASE_FINAL); +} + +QList IniBakery::settings() const +{ + return QList(); +} + +QStringList IniBakery::iniFileNames() const +{ + return m_MOInfo->managedGame()->iniFiles(); +} + +bool IniBakery::prepareIni(const QString&) +{ + const auto* features = m_MOInfo->gameFeatures(); + + auto savegames = features->gameFeature(); + if (savegames != nullptr) { + savegames->prepareProfile(m_MOInfo->profile().get()); + } + + auto invalidation = features->gameFeature(); + if (invalidation != nullptr) { + invalidation->prepareProfile(m_MOInfo->profile().get()); + } + + return true; +} + +MappingType IniBakery::mappings() const +{ + MappingType result; + + const IPluginGame* game = m_MOInfo->managedGame(); + + auto profile = m_MOInfo->profile(); + + if (profile->localSettingsEnabled()) { + for (const QString& iniFile : iniFileNames()) { + result.push_back({m_MOInfo->profilePath() + "/" + QFileInfo(iniFile).fileName(), + game->documentsDirectory().absoluteFilePath(iniFile), false, + false}); + } + } + + return result; +} -- cgit v1.3.1