1 #include <pybind11/eval.h>
2 #include <filesystem>
3 
4 #include "configfile.py.h"
5 #include "configfile.h"
6 #include "plugin.py.h"
7 
8 namespace fs = std::filesystem;
9 
config(py::module & m,ConfigState & state)10 void Vipster::Py::config(py::module& m, ConfigState& state){
11     m.attr("PeriodicTable") = std::get<0>(state);
12     m.attr("Parameters") = py::cast(std::get<3>(state), py::return_value_policy::reference);
13     m.attr("Presets") = py::cast(std::get<4>(state), py::return_value_policy::reference);
14     auto& plugins = std::get<2>(state);
15     auto& params = std::get<3>(state);
16     auto& presets = std::get<4>(state);
17     // try to parse python-based plugins
18     auto pluginDir = getConfigDir()/"plugins";
19     if(fs::exists(pluginDir)){
20         for(const auto& file: fs::directory_iterator(pluginDir)){
21             if(file.path().extension() != ".py") continue;
22             auto plug = Plugin::create(file);
23             if(plug){
24                 std::cerr << "Loading Python-plugin " << file.path() << std::endl;
25                 plugins.push_back(plug);
26                 if(plug->makeParam){
27                     params[plug]["default"] = plug->makeParam();
28                 }
29                 if(plug->makePreset){
30                     presets[plug]["default"] = plug->makePreset();
31                 }
32             }
33         }
34     }
35     // expose plugins
36     auto plug = m.def_submodule("Plugins");
37     for(const Vipster::Plugin* p: plugins){
38         plug.attr(p->command.c_str()) = p;
39     }
40 }
41