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