Skip to content

Commit 076244f

Browse files
Add executables list to plugin API (#151)
1 parent b816465 commit 076244f

File tree

3 files changed

+42
-12
lines changed

3 files changed

+42
-12
lines changed

src/mobase/wrappers/basic_classes.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,14 @@
55
#include <format>
66
#include <memory>
77

8+
#include <pybind11_utils/generator.h>
89
#include <uibase/executableinfo.h>
910
#include <uibase/filemapping.h>
1011
#include <uibase/game_features/igamefeatures.h>
1112
#include <uibase/guessedvalue.h>
1213
#include <uibase/idownloadmanager.h>
14+
#include <uibase/iexecutable.h>
15+
#include <uibase/iexecutableslist.h>
1316
#include <uibase/iinstallationmanager.h>
1417
#include <uibase/imodinterface.h>
1518
#include <uibase/imodrepositorybridge.h>
@@ -198,6 +201,27 @@ namespace mo2::python {
198201
.def("forced", &ExecutableForcedLoadSetting::forced)
199202
.def("library", &ExecutableForcedLoadSetting::library)
200203
.def("process", &ExecutableForcedLoadSetting::process);
204+
205+
py::class_<IExecutable>(m, "IExecutable")
206+
.def("title", &IExecutable::title)
207+
.def("binaryInfo", &IExecutable::binaryInfo)
208+
.def("arguments", &IExecutable::arguments)
209+
.def("steamAppID", &IExecutable::steamAppID)
210+
.def("workingDirectory", &IExecutable::workingDirectory)
211+
.def("isShownOnToolbar", &IExecutable::isShownOnToolbar)
212+
.def("usesOwnIcon", &IExecutable::usesOwnIcon)
213+
.def("minimizeToSystemTray", &IExecutable::minimizeToSystemTray)
214+
.def("hide", &IExecutable::hide);
215+
216+
py::class_<IExecutablesList>(m, "IExecutablesList")
217+
.def("executables",
218+
[](IExecutablesList* executablesList) {
219+
return make_generator(executablesList->executables(),
220+
py::return_value_policy::reference);
221+
})
222+
.def("getByTitle", &IExecutablesList::getByTitle, "title"_a)
223+
.def("getByBinary", &IExecutablesList::getByBinary, "info"_a)
224+
.def("titleExists", &IExecutablesList::contains, "title"_a);
201225
}
202226

203227
void add_modinterface_classes(py::module_ m)
@@ -625,6 +649,8 @@ namespace mo2::python {
625649
.def("pluginList", &IOrganizer::pluginList,
626650
py::return_value_policy::reference)
627651
.def("modList", &IOrganizer::modList, py::return_value_policy::reference)
652+
.def("executablesList", &IOrganizer::executablesList,
653+
py::return_value_policy::reference)
628654
.def("gameFeatures", &IOrganizer::gameFeatures,
629655
py::return_value_policy::reference)
630656
.def("profile", &IOrganizer::profile)

src/pybind11-utils/include/pybind11_utils/generator.h

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ namespace mo2::python {
2222

2323
// create a Python generator from a C++ generator
2424
//
25-
template <typename T>
26-
auto make_generator(std::generator<T> g)
25+
template <typename T, typename... Args>
26+
auto make_generator(std::generator<T> g, Args&&... args)
2727
{
2828
using state = detail::generator_state<T>;
2929

@@ -34,16 +34,19 @@ namespace mo2::python {
3434
[](state& s) -> state& {
3535
return s;
3636
})
37-
.def("__next__", [](state& s) {
38-
if (s.it != s.g.end()) {
39-
const auto v = *s.it;
40-
s.it++;
41-
return v;
42-
}
43-
else {
44-
throw py::stop_iteration();
45-
}
46-
});
37+
.def(
38+
"__next__",
39+
[](state& s) -> T {
40+
if (s.it != s.g.end()) {
41+
T v = *s.it;
42+
s.it++;
43+
return v;
44+
}
45+
else {
46+
throw py::stop_iteration();
47+
}
48+
},
49+
std::forward<Args>(args)...);
4750
}
4851

4952
return py::cast(state{std::move(g)});

tests/mocks/MockOrganizer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ class MockOrganizer : public IOrganizer {
3737
MOCK_METHOD(MOBase::IDownloadManager*, downloadManager, (), (const, override));
3838
MOCK_METHOD(MOBase::IPluginList*, pluginList, (), (const, override));
3939
MOCK_METHOD(MOBase::IModList*, modList, (), (const, override));
40+
MOCK_METHOD(MOBase::IExecutablesList*, executablesList, (), (const, override));
4041
MOCK_METHOD(std::shared_ptr<MOBase::IProfile>, profile, (), (const, override));
4142
MOCK_METHOD(QStringList, profileNames, (), (const, override));
4243
MOCK_METHOD(std::shared_ptr<const MOBase::IProfile>, getProfile, (const QString& name), (const, override));

0 commit comments

Comments
 (0)