From d00753e3b18ceb54563e05f33856bcb46093f04f Mon Sep 17 00:00:00 2001 From: Jonathan Feenstra <26406078+JonathanFeenstra@users.noreply.github.com> Date: Wed, 4 Feb 2026 15:12:34 +0100 Subject: [PATCH 1/2] Add instance manager to plugin API --- src/mobase/wrappers/basic_classes.cpp | 41 +++++++++++++++++++++++++++ tests/mocks/MockOrganizer.h | 1 + 2 files changed, 42 insertions(+) diff --git a/src/mobase/wrappers/basic_classes.cpp b/src/mobase/wrappers/basic_classes.cpp index 7e74d0f..c20354c 100644 --- a/src/mobase/wrappers/basic_classes.cpp +++ b/src/mobase/wrappers/basic_classes.cpp @@ -14,6 +14,8 @@ #include #include #include +#include +#include #include #include #include @@ -644,6 +646,8 @@ namespace mo2::python { .def("virtualFileTree", &IOrganizer::virtualFileTree) + .def("instanceManager", &IOrganizer::instanceManager, + py::return_value_policy::reference) .def("downloadManager", &IOrganizer::downloadManager, py::return_value_policy::reference) .def("pluginList", &IOrganizer::pluginList, @@ -799,6 +803,42 @@ namespace mo2::python { .def_static("getPluginDataPath", &IOrganizer::getPluginDataPath); } + void add_iinstance_manager_classes(py::module_ m) + { + py::class_>(m, "IInstance") + .def("readFromIni", &IInstance::readFromIni) + .def("displayName", &IInstance::displayName) + .def("gameName", &IInstance::gameName) + .def("gameDirectory", &IInstance::gameDirectory) + .def("directory", &IInstance::directory) + .def("baseDirectory", &IInstance::baseDirectory) + .def("isPortable", &IInstance::isPortable) + .def("profileName", &IInstance::profileName) + .def("iniPath", &IInstance::iniPath); + + py::class_(m, "IInstanceManager") + .def("overrideInstance", &IInstanceManager::overrideInstance, + "instance_name"_a) + .def("overrideProfile", &IInstanceManager::overrideProfile, + "profile_name"_a) + .def("clearOverrides", &IInstanceManager::clearOverrides) + .def("clearCurrentInstance", &IInstanceManager::clearCurrentInstance) + .def("currentInstance", &IInstanceManager::currentInstance, + py::return_value_policy::reference) + .def("setCurrentInstance", &IInstanceManager::setCurrentInstance, + "instance_name"_a) + .def("allowedToChangeInstance", &IInstanceManager::allowedToChangeInstance) + .def("portableInstanceExists", &IInstanceManager::portableInstanceExists) + .def("portablePath", &IInstanceManager::portablePath) + .def("globalInstancesRootPath", &IInstanceManager::globalInstancesRootPath) + .def("globalInstancePaths", &IInstanceManager::globalInstancePaths) + .def("globalInstanceExists", &IInstanceManager::globalInstanceExists, + "instance_name"_a) + .def("globalInstancePath", &IInstanceManager::globalInstancePath, + "instance_name"_a) + .def("iniPath", &IInstanceManager::iniPath, "instance_directory"_a); + } + void add_idownload_manager_classes(py::module_ m) { py::class_(m, "IDownloadManager") @@ -925,6 +965,7 @@ namespace mo2::python { add_ipluginlist_classes(m); add_imodlist_classes(m); + add_iinstance_manager_classes(m); add_idownload_manager_classes(m); add_iinstallation_manager_classes(m); add_iorganizer_classes(m); diff --git a/tests/mocks/MockOrganizer.h b/tests/mocks/MockOrganizer.h index 39214e0..3ccfa3c 100644 --- a/tests/mocks/MockOrganizer.h +++ b/tests/mocks/MockOrganizer.h @@ -34,6 +34,7 @@ class MockOrganizer : public IOrganizer { MOCK_METHOD(QStringList, getFileOrigins, (const QString &fileName) ,(const, override)); MOCK_METHOD(QList, findFileInfos, (const QString &path, const std::function &filter), (const, override)); MOCK_METHOD(std::shared_ptr, virtualFileTree, (), (const, override)); + MOCK_METHOD(MOBase::IInstanceManager*, instanceManager, (), (const, override)); MOCK_METHOD(MOBase::IDownloadManager*, downloadManager, (), (const, override)); MOCK_METHOD(MOBase::IPluginList*, pluginList, (), (const, override)); MOCK_METHOD(MOBase::IModList*, modList, (), (const, override)); From be578cc54a8d0d751162d63d01fca612af741633 Mon Sep 17 00:00:00 2001 From: Jonathan Feenstra <26406078+JonathanFeenstra@users.noreply.github.com> Date: Sat, 7 Feb 2026 11:37:07 +0100 Subject: [PATCH 2/2] Remove low-level methods from IInstance and IInstanceManager --- src/mobase/wrappers/basic_classes.cpp | 26 ++------------------------ 1 file changed, 2 insertions(+), 24 deletions(-) diff --git a/src/mobase/wrappers/basic_classes.cpp b/src/mobase/wrappers/basic_classes.cpp index c20354c..59fde61 100644 --- a/src/mobase/wrappers/basic_classes.cpp +++ b/src/mobase/wrappers/basic_classes.cpp @@ -806,37 +806,15 @@ namespace mo2::python { void add_iinstance_manager_classes(py::module_ m) { py::class_>(m, "IInstance") - .def("readFromIni", &IInstance::readFromIni) .def("displayName", &IInstance::displayName) .def("gameName", &IInstance::gameName) .def("gameDirectory", &IInstance::gameDirectory) - .def("directory", &IInstance::directory) - .def("baseDirectory", &IInstance::baseDirectory) - .def("isPortable", &IInstance::isPortable) - .def("profileName", &IInstance::profileName) - .def("iniPath", &IInstance::iniPath); + .def("isPortable", &IInstance::isPortable); py::class_(m, "IInstanceManager") - .def("overrideInstance", &IInstanceManager::overrideInstance, - "instance_name"_a) - .def("overrideProfile", &IInstanceManager::overrideProfile, - "profile_name"_a) - .def("clearOverrides", &IInstanceManager::clearOverrides) - .def("clearCurrentInstance", &IInstanceManager::clearCurrentInstance) .def("currentInstance", &IInstanceManager::currentInstance, py::return_value_policy::reference) - .def("setCurrentInstance", &IInstanceManager::setCurrentInstance, - "instance_name"_a) - .def("allowedToChangeInstance", &IInstanceManager::allowedToChangeInstance) - .def("portableInstanceExists", &IInstanceManager::portableInstanceExists) - .def("portablePath", &IInstanceManager::portablePath) - .def("globalInstancesRootPath", &IInstanceManager::globalInstancesRootPath) - .def("globalInstancePaths", &IInstanceManager::globalInstancePaths) - .def("globalInstanceExists", &IInstanceManager::globalInstanceExists, - "instance_name"_a) - .def("globalInstancePath", &IInstanceManager::globalInstancePath, - "instance_name"_a) - .def("iniPath", &IInstanceManager::iniPath, "instance_directory"_a); + .def("globalInstancePaths", &IInstanceManager::globalInstancePaths); } void add_idownload_manager_classes(py::module_ m)