From 8c38bdd745118d8781f4088243af06ca8a11691d Mon Sep 17 00:00:00 2001 From: Nick Treleaven Date: Sun, 27 Sep 2009 14:07:24 +0000 Subject: [PATCH] Add plugin_show_configure() API utility function. Add File Browser popup menu 'Preferences' item. git-svn-id: https://geany.svn.sourceforge.net/svnroot/geany/trunk@4244 ea778897-0a13-0410-b9d1-a72fbfd435f5 --- ChangeLog | 5 ++ plugins/filebrowser.c | 15 ++++++ plugins/geanyfunctions.h | 2 + po/POTFILES.in | 1 + src/plugindata.h | 3 +- src/pluginprivate.h | 2 + src/plugins.c | 108 ++----------------------------------- src/plugins.h | 3 ++ src/pluginutils.c | 112 ++++++++++++++++++++++++++++++++++++++- src/pluginutils.h | 2 + 10 files changed, 148 insertions(+), 105 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5f6d427c..762e139e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -15,6 +15,11 @@ Make the multiple-configure dialog notebook tabs scrollable. * src/pluginutils.c, src/pluginutils.h: Don't build pluginutils.o if HAVE_PLUGINS is not defined. + * src/pluginprivate.h, src/plugindata.h, src/pluginutils.c, + src/plugins.c, src/pluginutils.h, src/plugins.h, po/POTFILES.in, + plugins/geanyfunctions.h, plugins/filebrowser.c: + Add plugin_show_configure() API utility function. + Add File Browser popup menu 'Preferences' item. 2009-09-24 Enrico Tröger diff --git a/plugins/filebrowser.c b/plugins/filebrowser.c index f4a623d3..d31f9b20 100644 --- a/plugins/filebrowser.c +++ b/plugins/filebrowser.c @@ -546,6 +546,12 @@ static void on_hide_sidebar(void) } +static void on_show_preferences(void) +{ + plugin_show_configure(geany_plugin); +} + + static GtkWidget *create_popup_menu(void) { GtkWidget *item, *menu; @@ -583,6 +589,15 @@ static GtkWidget *create_popup_menu(void) gtk_widget_show(item); gtk_container_add(GTK_CONTAINER(menu), item); + item = gtk_image_menu_item_new_from_stock(GTK_STOCK_PREFERENCES, NULL); + gtk_widget_show(item); + gtk_container_add(GTK_CONTAINER(menu), item); + g_signal_connect(item, "activate", G_CALLBACK(on_show_preferences), NULL); + + item = gtk_separator_menu_item_new(); + gtk_widget_show(item); + gtk_container_add(GTK_CONTAINER(menu), item); + item = ui_image_menu_item_new(GTK_STOCK_CLOSE, _("H_ide Sidebar")); gtk_widget_show(item); gtk_container_add(GTK_CONTAINER(menu), item); diff --git a/plugins/geanyfunctions.h b/plugins/geanyfunctions.h index c710a5cf..73ff265d 100644 --- a/plugins/geanyfunctions.h +++ b/plugins/geanyfunctions.h @@ -24,6 +24,8 @@ geany_functions->p_plugin->signal_connect #define plugin_set_key_group \ geany_functions->p_plugin->set_key_group +#define plugin_show_configure \ + geany_functions->p_plugin->show_configure #define document_new_file \ geany_functions->p_document->new_file #define document_get_current \ diff --git a/po/POTFILES.in b/po/POTFILES.in index 6ae1e57b..6d134bcb 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -23,6 +23,7 @@ src/msgwindow.c src/navqueue.c src/notebook.c src/plugins.c +src/pluginutils.c src/prefs.c src/printing.c src/project.c diff --git a/src/plugindata.h b/src/plugindata.h index 3c0d8ff2..428a4470 100644 --- a/src/plugindata.h +++ b/src/plugindata.h @@ -50,7 +50,7 @@ enum { /** The Application Programming Interface (API) version, incremented * whenever any plugin data types are modified or appended to. */ - GEANY_API_VERSION = 157, + GEANY_API_VERSION = 158, /** The Application Binary Interface (ABI) version, incremented whenever * existing fields in the plugin data types have to be changed or reordered. */ @@ -572,6 +572,7 @@ typedef struct PluginFuncs GCallback callback, gpointer user_data); struct GeanyKeyGroup* (*set_key_group)(GeanyPlugin *plugin, const gchar *section_name, gsize count, _GeanyKeyGroupCallback callback); + void (*show_configure)(GeanyPlugin *plugin); } PluginFuncs; diff --git a/src/pluginprivate.h b/src/pluginprivate.h index 0d02fef7..e5a51e02 100644 --- a/src/pluginprivate.h +++ b/src/pluginprivate.h @@ -59,5 +59,7 @@ typedef struct GeanyPluginPrivate } GeanyPluginPrivate; +typedef GeanyPluginPrivate Plugin; /* shorter alias */ + #endif /* PLUGINPRIVATE_H */ diff --git a/src/plugins.c b/src/plugins.c index 643dccac..f0dfb7cd 100644 --- a/src/plugins.c +++ b/src/plugins.c @@ -62,7 +62,8 @@ #include "pluginutils.h" #include "pluginprivate.h" -typedef GeanyPluginPrivate Plugin; /* shorter alias */ + +GList *active_plugin_list = NULL; /* list of only actually loaded plugins, always valid */ static gboolean want_plugins = FALSE; @@ -70,7 +71,6 @@ static gboolean want_plugins = FALSE; /* list of all available, loadable plugins, only valid as long as the plugin manager dialog is * opened, afterwards it will be destroyed */ static GList *plugin_list = NULL; -static GList *active_plugin_list = NULL; /* list of only actually loaded plugins, always valid */ static gchar **active_plugins_pref = NULL; /* list of plugin filenames to load at startup */ static GList *failed_plugins_list = NULL; /* plugins the user wants active but can't be used */ @@ -83,7 +83,8 @@ static PluginFuncs plugin_funcs = { &plugin_add_toolbar_item, &plugin_module_make_resident, &plugin_signal_connect, - &plugin_set_key_group + &plugin_set_key_group, + &plugin_show_configure }; static DocumentFuncs doc_funcs = { @@ -1140,97 +1141,6 @@ static void pm_prepare_treeview(GtkWidget *tree, GtkListStore *store) } -static void on_pref_btn_clicked(gpointer btn, Plugin *p) -{ - p->configure_single(main_widgets.window); -} - - -static GtkWidget *create_pref_page(Plugin *p, GtkWidget *dialog) -{ - GtkWidget *page = NULL; /* some plugins don't have prefs */ - - if (p->configure) - { - page = p->configure(GTK_DIALOG(dialog)); - - if (! GTK_IS_WIDGET(page)) - { - geany_debug("Invalid widget returned from plugin_configure() in plugin \"%s\"!", - p->info.name); - return NULL; - } - else - { - GtkWidget *align = gtk_alignment_new(0.5, 0.5, 1, 1); - - gtk_alignment_set_padding(GTK_ALIGNMENT(align), 6, 6, 6, 6); - gtk_container_add(GTK_CONTAINER(align), page); - page = align; - } - } - else if (p->configure_single) - { - GtkWidget *align = gtk_alignment_new(0.5, 0.5, 0, 0); - GtkWidget *btn; - - gtk_alignment_set_padding(GTK_ALIGNMENT(align), 6, 6, 6, 6); - - btn = gtk_button_new_from_stock(GTK_STOCK_PREFERENCES); - g_signal_connect(btn, "clicked", G_CALLBACK(on_pref_btn_clicked), p); - gtk_container_add(GTK_CONTAINER(align), btn); - page = align; - } - return page; -} - - -/* multiple plugin configure dialog */ -static void configure_plugins(Plugin *current_plugin) -{ - GtkWidget *parent = pm_widgets.dialog; - GtkWidget *dialog, *vbox, *nb; - GList *node; - gint cur_page = -1; - - dialog = gtk_dialog_new_with_buttons(_("Configure Plugins"), - GTK_WINDOW(parent), GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_STOCK_APPLY, GTK_RESPONSE_APPLY, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); - gtk_widget_set_name(dialog, "GeanyDialog"); - - vbox = ui_dialog_vbox_new(GTK_DIALOG(dialog)); - nb = gtk_notebook_new(); - gtk_notebook_set_scrollable(GTK_NOTEBOOK(nb), TRUE); - gtk_container_add(GTK_CONTAINER(vbox), nb); - - foreach_list(node, active_plugin_list) - { - Plugin *p = node->data; - GtkWidget *page = create_pref_page(p, dialog); - - if (page) - { - GtkWidget *label = gtk_label_new(p->info.name); - gint n = gtk_notebook_append_page(GTK_NOTEBOOK(nb), page, label); - - if (p == current_plugin) - cur_page = n; - } - } - if (cur_page >= 0) - { - gtk_notebook_set_current_page(GTK_NOTEBOOK(nb), cur_page); - - gtk_widget_show_all(vbox); - /* run the dialog */ - while (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_APPLY); - } - gtk_widget_destroy(dialog); -} - - static void pm_on_plugin_button_clicked(GtkButton *button, gpointer user_data) { GtkTreeModel *model; @@ -1246,15 +1156,7 @@ static void pm_on_plugin_button_clicked(GtkButton *button, gpointer user_data) if (p != NULL) { if (GPOINTER_TO_INT(user_data) == PM_BUTTON_CONFIGURE) - { - if (p->configure) - configure_plugins(p); - else - { - g_return_if_fail(p->configure_single); - p->configure_single(main_widgets.window); - } - } + plugin_show_configure(&p->public); else if (GPOINTER_TO_INT(user_data) == PM_BUTTON_HELP && p->help != NULL) p->help(); } diff --git a/src/plugins.h b/src/plugins.h index cb44aef2..42c08669 100644 --- a/src/plugins.h +++ b/src/plugins.h @@ -28,6 +28,9 @@ #ifdef HAVE_PLUGINS +extern GList *active_plugin_list; + + void plugins_init(void); void plugins_finalize(void); diff --git a/src/pluginutils.c b/src/pluginutils.c index 42affb5a..94374684 100644 --- a/src/pluginutils.c +++ b/src/pluginutils.c @@ -36,6 +36,8 @@ #include "ui_utils.h" #include "toolbar.h" #include "utils.h" +#include "support.h" +#include "plugins.h" /** Insert a toolbar item before the Quit button, or after the previous plugin toolbar item. @@ -140,7 +142,7 @@ void plugin_signal_connect(GeanyPlugin *plugin, GeanyKeyGroup *plugin_set_key_group(GeanyPlugin *plugin, const gchar *section_name, gsize count, GeanyKeyGroupCallback callback) { - GeanyPluginPrivate *priv = plugin->priv; + Plugin *priv = plugin->priv; priv->key_group = keybindings_set_group(priv->key_group, section_name, priv->info.name, count, callback); @@ -148,4 +150,112 @@ GeanyKeyGroup *plugin_set_key_group(GeanyPlugin *plugin, } +static void on_pref_btn_clicked(gpointer btn, Plugin *p) +{ + p->configure_single(main_widgets.window); +} + + +static GtkWidget *create_pref_page(Plugin *p, GtkWidget *dialog) +{ + GtkWidget *page = NULL; /* some plugins don't have prefs */ + + if (p->configure) + { + page = p->configure(GTK_DIALOG(dialog)); + + if (! GTK_IS_WIDGET(page)) + { + geany_debug("Invalid widget returned from plugin_configure() in plugin \"%s\"!", + p->info.name); + return NULL; + } + else + { + GtkWidget *align = gtk_alignment_new(0.5, 0.5, 1, 1); + + gtk_alignment_set_padding(GTK_ALIGNMENT(align), 6, 6, 6, 6); + gtk_container_add(GTK_CONTAINER(align), page); + page = align; + } + } + else if (p->configure_single) + { + GtkWidget *align = gtk_alignment_new(0.5, 0.5, 0, 0); + GtkWidget *btn; + + gtk_alignment_set_padding(GTK_ALIGNMENT(align), 6, 6, 6, 6); + + btn = gtk_button_new_from_stock(GTK_STOCK_PREFERENCES); + g_signal_connect(btn, "clicked", G_CALLBACK(on_pref_btn_clicked), p); + gtk_container_add(GTK_CONTAINER(align), btn); + page = align; + } + return page; +} + + +/* multiple plugin configure dialog */ +static void configure_plugins(Plugin *current_plugin) +{ + GtkWidget *dialog, *vbox, *nb; + GList *node; + gint cur_page = -1; + + dialog = gtk_dialog_new_with_buttons(_("Configure Plugins"), + GTK_WINDOW(main_widgets.window), GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_APPLY, GTK_RESPONSE_APPLY, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); + gtk_widget_set_name(dialog, "GeanyDialog"); + + vbox = ui_dialog_vbox_new(GTK_DIALOG(dialog)); + nb = gtk_notebook_new(); + gtk_notebook_set_scrollable(GTK_NOTEBOOK(nb), TRUE); + gtk_container_add(GTK_CONTAINER(vbox), nb); + + foreach_list(node, active_plugin_list) + { + Plugin *p = node->data; + GtkWidget *page = create_pref_page(p, dialog); + + if (page) + { + GtkWidget *label = gtk_label_new(p->info.name); + gint n = gtk_notebook_append_page(GTK_NOTEBOOK(nb), page, label); + + if (p == current_plugin) + cur_page = n; + } + } + if (cur_page >= 0) + { + gtk_notebook_set_current_page(GTK_NOTEBOOK(nb), cur_page); + + gtk_widget_show_all(vbox); + /* run the dialog */ + while (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_APPLY); + } + gtk_widget_destroy(dialog); +} + + +/** Show the plugin's configure dialog. + * The plugin must implement one of the plugin_configure() or plugin_configure_single() symbols. + * @param plugin Must be @ref geany_plugin. + * @since 0.19. */ +void plugin_show_configure(GeanyPlugin *plugin) +{ + Plugin *p = plugin->priv; + + if (p->configure) + configure_plugins(p); + else + { + g_return_if_fail(p->configure_single); + p->configure_single(main_widgets.window); + } +} + + #endif diff --git a/src/pluginutils.h b/src/pluginutils.h index e1dd6bba..430efae9 100644 --- a/src/pluginutils.h +++ b/src/pluginutils.h @@ -43,5 +43,7 @@ void plugin_signal_connect(GeanyPlugin *plugin, struct GeanyKeyGroup *plugin_set_key_group(GeanyPlugin *plugin, const gchar *section_name, gsize count, GeanyKeyGroupCallback callback); +void plugin_show_configure(GeanyPlugin *plugin); + #endif /* HAVE_PLUGINS */ #endif /* PLUGINUTILS_H */