diff --git a/src/control/Control.cpp b/src/control/Control.cpp index 5ecbd851..32315e8f 100644 --- a/src/control/Control.cpp +++ b/src/control/Control.cpp @@ -365,6 +365,8 @@ void Control::initWindow(MainWindow* win) win->setFontButtonFont(settings->getFont()); + this->pluginController->registerMenu(); + fireActionSelected(GROUP_SNAPPING, settings->isSnapRotation() ? ACTION_ROTATION_SNAPPING : ACTION_NONE); fireActionSelected(GROUP_GRID_SNAPPING, settings->isSnapGrid() ? ACTION_GRID_SNAPPING : ACTION_NONE); } diff --git a/src/plugin/Plugin.cpp b/src/plugin/Plugin.cpp index cb5395ca..074942ee 100644 --- a/src/plugin/Plugin.cpp +++ b/src/plugin/Plugin.cpp @@ -51,6 +51,12 @@ Plugin::~Plugin() lua = NULL; } + for (MenuEntry* m : menuEntries) + { + delete m; + } + menuEntries.clear(); + XOJ_RELEASE_TYPE(Plugin); } @@ -108,6 +114,47 @@ void Plugin::registerToolbar() inInitUi = false; } + +/** + * Register all menu entries to the menu + */ +void Plugin::registerMenu(GtkWidget* menu) +{ + XOJ_CHECK_TYPE(Plugin); + + if (menuEntries.empty()) + { + // No entries - nothing to do + return; + } + + gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new()); + + for (MenuEntry* m : menuEntries) + { + GtkWidget* mi = gtk_menu_item_new_with_label(m->menu.c_str()); + m->widget = mi; + gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi); + + g_signal_connect(mi, "activate", G_CALLBACK( + +[](GtkWidget* bt, MenuEntry* me) + { + XOJ_CHECK_TYPE_OBJ(me, MenuEntry); + me->plugin->executeMenuEntry(me); + }), m); + } +} + +/** + * Execute menu entry + */ +void Plugin::executeMenuEntry(MenuEntry* entry) +{ + XOJ_CHECK_TYPE(Plugin); + + callFunction(entry->callback); +} + /** * @return the Plugin name */ @@ -135,8 +182,12 @@ bool Plugin::isInInitUi() */ int Plugin::registerMenu(string menu, string callback) { - // TODO - return 0; + MenuEntry* m = new MenuEntry(this); + m->menu = menu; + m->callback = callback; + menuEntries.push_back(m); + + return menuEntries.size() - 1; } /** diff --git a/src/plugin/Plugin.h b/src/plugin/Plugin.h index fc38c762..95fa682b 100644 --- a/src/plugin/Plugin.h +++ b/src/plugin/Plugin.h @@ -13,11 +13,52 @@ #include +#include + #include #ifdef ENABLE_PLUGINS #include +class Plugin; + +class MenuEntry { +public: + MenuEntry(Plugin* plugin) + : plugin(plugin) + { + XOJ_INIT_TYPE(MenuEntry); + } + + ~MenuEntry() + { + XOJ_CHECK_TYPE(MenuEntry); + XOJ_RELEASE_TYPE(MenuEntry); + } + +public: + XOJ_TYPE_ATTRIB; + + /** + * The Plugin + */ + Plugin* plugin; + + /** + * Menu item + */ + GtkWidget* widget = NULL; + + /** + * Menu display name + */ + string menu; + + /** + * Callback function name + */ + string callback; +}; class Plugin { @@ -36,6 +77,16 @@ public: */ void registerToolbar(); + /** + * Register all menu entries to the menu + */ + void registerMenu(GtkWidget* menu); + + /** + * Execute menu entry + */ + void executeMenuEntry(MenuEntry* entry); + /** * @return the Plugin name */ @@ -118,6 +169,11 @@ private: */ lua_State* lua = NULL; + /** + * All registered menu entries + */ + vector menuEntries; + /** * Flag to check if init ui is currently running */ diff --git a/src/plugin/PluginController.cpp b/src/plugin/PluginController.cpp index d0536a3e..c1a5e9f3 100644 --- a/src/plugin/PluginController.cpp +++ b/src/plugin/PluginController.cpp @@ -13,7 +13,6 @@ PluginController::PluginController(Control* control) : control(control) { XOJ_INIT_TYPE(PluginController); - #ifdef ENABLE_PLUGINS string path = control->getGladeSearchPath()->getFirstSearchPath(); if (StringUtils::endsWith(path, "ui")) @@ -99,4 +98,27 @@ void PluginController::registerToolbar() #endif } +/** + * Register menu stuff + */ +void PluginController::registerMenu() +{ + XOJ_CHECK_TYPE(PluginController); + +#ifdef ENABLE_PLUGINS + GtkWidget* menuPlugin = control->getWindow()->get("menuPlugin"); + for (Plugin* p : this->plugins) + { + p->registerMenu(menuPlugin); + } + + gtk_widget_show_all(menuPlugin); + +#else + // If plugins are disabled - disable menu also + GtkWidget* menuitemPlugin = control->getWindow()->get("menuitemPlugin"); + gtk_widget_hide(menuitemPlugin); +#endif +} + diff --git a/src/plugin/PluginController.h b/src/plugin/PluginController.h index 744db24f..1119c212 100644 --- a/src/plugin/PluginController.h +++ b/src/plugin/PluginController.h @@ -35,6 +35,11 @@ public: */ void registerToolbar(); + /** + * Register menu stuff + */ + void registerMenu(); + private: XOJ_TYPE_ATTRIB; diff --git a/src/util/XournalTypeList.h b/src/util/XournalTypeList.h index 6d07bab9..ad67fbc1 100644 --- a/src/util/XournalTypeList.h +++ b/src/util/XournalTypeList.h @@ -282,6 +282,7 @@ XOJ_DECLARE_TYPE(XmlAudioNode, 272); XOJ_DECLARE_TYPE(LayoutMapper, 273); XOJ_DECLARE_TYPE(PluginController, 274); XOJ_DECLARE_TYPE(Plugin, 275); +XOJ_DECLARE_TYPE(MenuEntry, 276); diff --git a/ui/main.glade b/ui/main.glade index 5f1743f3..08df807f 100644 --- a/ui/main.glade +++ b/ui/main.glade @@ -1534,6 +1534,28 @@ + + + True + False + _Plugin + True + + + True + False + + + True + False + Plugin _Manager + True + + + + + + True