1 #include "PluginController.h"
2
3 #include <algorithm>
4
5 #include <config-features.h>
6
7 #include "control/Control.h"
8 #include "gui/GladeSearchpath.h"
9 #include "gui/dialog/PluginDialog.h"
10
11 #include "Plugin.h"
12 #include "StringUtils.h"
13
14
PluginController(Control * control)15 PluginController::PluginController(Control* control): control(control) {
16 #ifdef ENABLE_PLUGINS
17 auto searchPath = control->getGladeSearchPath()->getFirstSearchPath();
18 loadPluginsFrom((searchPath /= "../plugins").lexically_normal());
19 #endif
20 }
21
loadPluginsFrom(fs::path const & path)22 void PluginController::loadPluginsFrom(fs::path const& path) {
23 #ifdef ENABLE_PLUGINS
24 Settings* settings = control->getSettings();
25 std::vector<std::string> pluginEnabled = StringUtils::split(settings->getPluginEnabled(), ',');
26 std::vector<std::string> pluginDisabled = StringUtils::split(settings->getPluginDisabled(), ',');
27
28 try {
29 for (auto const& f: fs::directory_iterator(path)) {
30 const auto& pluginPath = f.path();
31 auto plugin = std::make_unique<Plugin>(control, pluginPath.filename().string(), pluginPath);
32 if (!plugin->isValid()) {
33 g_warning("Error loading plugin \"%s\"", f.path().string().c_str());
34 continue;
35 }
36
37 if (plugin->isDefaultEnabled()) {
38 plugin->setEnabled(!(std::find(pluginDisabled.begin(), pluginDisabled.end(), plugin->getName()) !=
39 pluginDisabled.end()));
40 } else {
41 plugin->setEnabled(std::find(pluginEnabled.begin(), pluginEnabled.end(), plugin->getName()) !=
42 pluginEnabled.end());
43 }
44
45 plugin->loadScript();
46
47 this->plugins.emplace_back(std::move(plugin));
48 }
49 } catch (fs::filesystem_error const& e) {
50 g_warning("Could not open plugin dir: \"%s\"", path.string().c_str());
51 return;
52 }
53 #endif
54 }
55
registerToolbar()56 void PluginController::registerToolbar() {
57 #ifdef ENABLE_PLUGINS
58 for (auto&& p: this->plugins) {
59 p->registerToolbar();
60 }
61 #endif
62 }
63
showPluginManager() const64 void PluginController::showPluginManager() const {
65 PluginDialog dlg(control->getGladeSearchPath(), control->getSettings());
66 dlg.loadPluginList(this);
67 dlg.show(control->getGtkWindow());
68 }
69
registerMenu()70 void PluginController::registerMenu() {
71 #ifdef ENABLE_PLUGINS
72 GtkWidget* menuPlugin = control->getWindow()->get("menuPlugin");
73 for (auto&& p: this->plugins) {
74 p->registerMenu(control->getGtkWindow(), menuPlugin);
75 }
76 gtk_widget_show_all(menuPlugin);
77
78 #else
79 // If plugins are disabled - disable menu also
80 GtkWidget* menuitemPlugin = control->getWindow()->get("menuitemPlugin");
81 gtk_widget_hide(menuitemPlugin);
82 #endif
83 }
84
getPlugins() const85 auto PluginController::getPlugins() const -> std::vector<Plugin*> {
86 std::vector<Plugin*> pl;
87 pl.reserve(plugins.size());
88 std::transform(begin(plugins), end(plugins), std::back_inserter(pl), [](auto&& plugin) { return plugin.get(); });
89 return pl;
90 }
91