From fb11b56a4bc35c8dc56ca19179fbd059e33246d0 Mon Sep 17 00:00:00 2001 From: Jonathan Feenstra <26406078+JonathanFeenstra@users.noreply.github.com> Date: Sun, 18 Jan 2026 17:13:59 +0100 Subject: [PATCH 1/4] Add executables list to plugin API --- src/mobase/wrappers/basic_classes.cpp | 21 +++++++++++++++++++++ tests/mocks/MockOrganizer.h | 1 + 2 files changed, 22 insertions(+) diff --git a/src/mobase/wrappers/basic_classes.cpp b/src/mobase/wrappers/basic_classes.cpp index de28e71..560149b 100644 --- a/src/mobase/wrappers/basic_classes.cpp +++ b/src/mobase/wrappers/basic_classes.cpp @@ -10,6 +10,8 @@ #include #include #include +#include +#include #include #include #include @@ -198,6 +200,23 @@ namespace mo2::python { .def("forced", &ExecutableForcedLoadSetting::forced) .def("library", &ExecutableForcedLoadSetting::library) .def("process", &ExecutableForcedLoadSetting::process); + + py::class_>(m, "IExecutable") + .def("title", &IExecutable::title) + .def("binaryInfo", &IExecutable::binaryInfo) + .def("arguments", &IExecutable::arguments) + .def("steamAppID", &IExecutable::steamAppID) + .def("workingDirectory", &IExecutable::workingDirectory) + .def("isShownOnToolbar", &IExecutable::isShownOnToolbar) + .def("usesOwnIcon", &IExecutable::usesOwnIcon) + .def("minimizeToSystemTray", &IExecutable::minimizeToSystemTray) + .def("hide", &IExecutable::hide); + + py::class_(m, "IExecutablesList") + .def("executables", &IExecutablesList::executables) + .def("getByTitle", &IExecutablesList::getByTitle, "title"_a) + .def("getByBinary", &IExecutablesList::getByBinary, "info"_a) + .def("titleExists", &IExecutablesList::titleExists, "title"_a); } void add_modinterface_classes(py::module_ m) @@ -625,6 +644,8 @@ namespace mo2::python { .def("pluginList", &IOrganizer::pluginList, py::return_value_policy::reference) .def("modList", &IOrganizer::modList, py::return_value_policy::reference) + .def("executablesList", &IOrganizer::executablesList, + py::return_value_policy::reference) .def("gameFeatures", &IOrganizer::gameFeatures, py::return_value_policy::reference) .def("profile", &IOrganizer::profile) diff --git a/tests/mocks/MockOrganizer.h b/tests/mocks/MockOrganizer.h index 6508fc0..39214e0 100644 --- a/tests/mocks/MockOrganizer.h +++ b/tests/mocks/MockOrganizer.h @@ -37,6 +37,7 @@ class MockOrganizer : public IOrganizer { MOCK_METHOD(MOBase::IDownloadManager*, downloadManager, (), (const, override)); MOCK_METHOD(MOBase::IPluginList*, pluginList, (), (const, override)); MOCK_METHOD(MOBase::IModList*, modList, (), (const, override)); + MOCK_METHOD(MOBase::IExecutablesList*, executablesList, (), (const, override)); MOCK_METHOD(std::shared_ptr, profile, (), (const, override)); MOCK_METHOD(QStringList, profileNames, (), (const, override)); MOCK_METHOD(std::shared_ptr, getProfile, (const QString& name), (const, override)); From ae1dbd08a0c1ddbb702d94a98880d1356ab407ad Mon Sep 17 00:00:00 2001 From: Jonathan Feenstra <26406078+JonathanFeenstra@users.noreply.github.com> Date: Sat, 24 Jan 2026 19:40:10 +0100 Subject: [PATCH 2/4] WIP --- src/mobase/wrappers/basic_classes.cpp | 9 ++++++--- src/pybind11-utils/include/pybind11_utils/generator.h | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/mobase/wrappers/basic_classes.cpp b/src/mobase/wrappers/basic_classes.cpp index 560149b..9dab508 100644 --- a/src/mobase/wrappers/basic_classes.cpp +++ b/src/mobase/wrappers/basic_classes.cpp @@ -201,7 +201,7 @@ namespace mo2::python { .def("library", &ExecutableForcedLoadSetting::library) .def("process", &ExecutableForcedLoadSetting::process); - py::class_>(m, "IExecutable") + py::class_(m, "IExecutable") .def("title", &IExecutable::title) .def("binaryInfo", &IExecutable::binaryInfo) .def("arguments", &IExecutable::arguments) @@ -213,10 +213,13 @@ namespace mo2::python { .def("hide", &IExecutable::hide); py::class_(m, "IExecutablesList") - .def("executables", &IExecutablesList::executables) + .def("executables", + [](IExecutablesList* executablesList) { + return make_generator(executablesList->executables()); + }) .def("getByTitle", &IExecutablesList::getByTitle, "title"_a) .def("getByBinary", &IExecutablesList::getByBinary, "info"_a) - .def("titleExists", &IExecutablesList::titleExists, "title"_a); + .def("titleExists", &IExecutablesList::contains, "title"_a); } void add_modinterface_classes(py::module_ m) diff --git a/src/pybind11-utils/include/pybind11_utils/generator.h b/src/pybind11-utils/include/pybind11_utils/generator.h index 635b73b..e72a4ef 100644 --- a/src/pybind11-utils/include/pybind11_utils/generator.h +++ b/src/pybind11-utils/include/pybind11_utils/generator.h @@ -34,9 +34,9 @@ namespace mo2::python { [](state& s) -> state& { return s; }) - .def("__next__", [](state& s) { + .def("__next__", [](state& s) -> decltype(auto) { if (s.it != s.g.end()) { - const auto v = *s.it; + decltype(auto) v = *s.it; s.it++; return v; } From c6962a2be8a26a840a8cf9ea3fb522292e846678 Mon Sep 17 00:00:00 2001 From: Jonathan Feenstra <26406078+JonathanFeenstra@users.noreply.github.com> Date: Sat, 24 Jan 2026 20:18:06 +0100 Subject: [PATCH 3/4] Fix make_generator function --- src/mobase/wrappers/basic_classes.cpp | 4 ++- .../include/pybind11_utils/generator.h | 27 ++++++++++--------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/mobase/wrappers/basic_classes.cpp b/src/mobase/wrappers/basic_classes.cpp index 9dab508..7e74d0f 100644 --- a/src/mobase/wrappers/basic_classes.cpp +++ b/src/mobase/wrappers/basic_classes.cpp @@ -5,6 +5,7 @@ #include #include +#include #include #include #include @@ -215,7 +216,8 @@ namespace mo2::python { py::class_(m, "IExecutablesList") .def("executables", [](IExecutablesList* executablesList) { - return make_generator(executablesList->executables()); + return make_generator(executablesList->executables(), + py::return_value_policy::reference); }) .def("getByTitle", &IExecutablesList::getByTitle, "title"_a) .def("getByBinary", &IExecutablesList::getByBinary, "info"_a) diff --git a/src/pybind11-utils/include/pybind11_utils/generator.h b/src/pybind11-utils/include/pybind11_utils/generator.h index e72a4ef..0496e04 100644 --- a/src/pybind11-utils/include/pybind11_utils/generator.h +++ b/src/pybind11-utils/include/pybind11_utils/generator.h @@ -22,8 +22,8 @@ namespace mo2::python { // create a Python generator from a C++ generator // - template - auto make_generator(std::generator g) + template + auto make_generator(std::generator g, Args&&... args) { using state = detail::generator_state; @@ -34,16 +34,19 @@ namespace mo2::python { [](state& s) -> state& { return s; }) - .def("__next__", [](state& s) -> decltype(auto) { - if (s.it != s.g.end()) { - decltype(auto) v = *s.it; - s.it++; - return v; - } - else { - throw py::stop_iteration(); - } - }); + .def( + "__next__", + [](state& s) -> T { + if (s.it != s.g.end()) { + decltype(auto) v = *s.it; + s.it++; + return v; + } + else { + throw py::stop_iteration(); + } + }, + std::forward(args)...); } return py::cast(state{std::move(g)}); From bccfc5edfabcbef4d8711befe296808b68c50102 Mon Sep 17 00:00:00 2001 From: Jonathan Feenstra <26406078+JonathanFeenstra@users.noreply.github.com> Date: Sun, 25 Jan 2026 19:22:37 +0100 Subject: [PATCH 4/4] Fix IFileTree.walk yielding an extra None at the end --- src/pybind11-utils/include/pybind11_utils/generator.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pybind11-utils/include/pybind11_utils/generator.h b/src/pybind11-utils/include/pybind11_utils/generator.h index 0496e04..cbf9d18 100644 --- a/src/pybind11-utils/include/pybind11_utils/generator.h +++ b/src/pybind11-utils/include/pybind11_utils/generator.h @@ -38,7 +38,7 @@ namespace mo2::python { "__next__", [](state& s) -> T { if (s.it != s.g.end()) { - decltype(auto) v = *s.it; + T v = *s.it; s.it++; return v; }