Mercurial > hg > forks > geeqie
changeset 2859:1656d2341e2f
Eliminate FIXME: enable or disable individual plugins from configure
Additional checkbox in Edit/Configure Plugins to prevent plugins being
displayed in the menus
author | Colin Clark <colin.clark@cclark.uk> |
---|---|
date | Thu, 01 Nov 2018 13:59:03 +0000 |
parents | 4c7dd47bbcd6 |
children | b20a96b979a3 |
files | doc/docbook/GuidePluginsConfig.xml plugins/Makefile.am src/desktop_file.c src/editors.c src/editors.h src/options.c src/options.h src/rcfile.c web/help/GuidePluginsConfig.html |
diffstat | 9 files changed, 218 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/doc/docbook/GuidePluginsConfig.xml Sat Oct 27 12:40:59 2018 +0100 +++ b/doc/docbook/GuidePluginsConfig.xml Thu Nov 01 13:59:03 2018 +0000 @@ -29,6 +29,14 @@ <variablelist spacing="compact"> <varlistentry> <term> + <guilabel>Disabled</guilabel> + </term> + <listitem> + <para>If the checkbox is ticked, the plugin will not be displayed in Geeqie menus.</para> + </listitem> + </varlistentry> + <varlistentry> + <term> <guilabel>Name</guilabel> </term> <listitem>
--- a/plugins/Makefile.am Sat Oct 27 12:40:59 2018 +0100 +++ b/plugins/Makefile.am Thu Nov 01 13:59:03 2018 +0000 @@ -1,4 +1,3 @@ -#FIXME enable or disable individual plugins from configure SUBDIRS = rotate symlink ufraw import geocode-parameters export-jpeg tethered-photography camera-import image-crop qq_desktoptemplatedir = $(appdir)
--- a/src/desktop_file.c Sat Oct 27 12:40:59 2018 +0100 +++ b/src/desktop_file.c Thu Nov 01 13:59:03 2018 +0000 @@ -414,6 +414,7 @@ { gint n = GPOINTER_TO_INT(data); gint ret = 0; + gboolean bool1, bool2; switch (n) { @@ -441,6 +442,25 @@ g_free(s2); } break; + case DESKTOP_FILE_COLUMN_DISABLED: + { + gtk_tree_model_get(model, a, n, &bool1, -1); + gtk_tree_model_get(model, b, n, &bool2, -1); + + if (bool1 == bool2) + { + ret = 0; + } + else if (bool1 > bool2) + { + ret = -1; + } + else + { + ret = 1; + } + break; + } default: g_return_val_if_reached(0); @@ -449,6 +469,67 @@ return ret; } +static void plugin_disable_cb(GtkCellRendererToggle *renderer, gchar *path_str, gpointer data) +{ + EditorListWindow *ewl = data; + GtkTreePath *tpath; + GtkTreeIter iter; + GtkTreeModel *model; + gboolean disabled; + gchar *path; + GList *list; + gchar *haystack; + + tpath = gtk_tree_path_new_from_string(path_str); + model = gtk_tree_view_get_model(GTK_TREE_VIEW(ewl->view)); + gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, tpath); + gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, DESKTOP_FILE_COLUMN_DISABLED, &disabled, -1); + gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, DESKTOP_FILE_COLUMN_PATH, &path, -1); + + gtk_list_store_set(GTK_LIST_STORE(desktop_file_list), &iter, DESKTOP_FILE_COLUMN_DISABLED, !disabled, -1); + + if (!disabled) + { + options->disabled_plugins = g_list_append((options->disabled_plugins), g_strdup(path)); + } + else + { + list = options->disabled_plugins; + while (list) + { + haystack = list->data; + + if (haystack && strcmp(haystack, path) == 0) + { + g_free(haystack); + options->disabled_plugins = g_list_remove(options->disabled_plugins, haystack); + } + + list = list->next; + } + } + + layout_editors_reload_start(); + layout_editors_reload_finish(); +} + +static void plugin_disable_set_func(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, + GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data) +{ + gboolean disabled; + + gtk_tree_model_get(tree_model, iter, DESKTOP_FILE_COLUMN_DISABLED, &disabled, -1); + + if (disabled) + { + g_object_set(GTK_CELL_RENDERER(cell), "active", TRUE, NULL); + } + else + { + g_object_set(GTK_CELL_RENDERER(cell), "active", FALSE, NULL); + } +} + static void editor_list_window_create(void) { GtkWidget *win_vbox; @@ -532,6 +613,19 @@ gtk_tree_view_set_enable_search(GTK_TREE_VIEW(ewl->view), FALSE); column = gtk_tree_view_column_new(); + gtk_tree_view_column_set_title(column, _("Disabled")); + gtk_tree_view_column_set_resizable(column, TRUE); + + renderer = gtk_cell_renderer_toggle_new(); + g_signal_connect(G_OBJECT(renderer), "toggled", + G_CALLBACK(plugin_disable_cb), ewl); + gtk_tree_view_column_pack_start(column, renderer, FALSE); + gtk_tree_view_column_set_cell_data_func(column, renderer, plugin_disable_set_func, + NULL, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(ewl->view), column); + gtk_tree_view_column_set_sort_column_id(column, DESKTOP_FILE_COLUMN_DISABLED); + + column = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(column, _("Name")); gtk_tree_view_column_set_resizable(column, TRUE); renderer = gtk_cell_renderer_text_new(); @@ -579,6 +673,8 @@ GINT_TO_POINTER(DESKTOP_FILE_COLUMN_NAME), NULL); gtk_tree_sortable_set_sort_func(sortable, DESKTOP_FILE_COLUMN_PATH, editor_list_window_sort_cb, GINT_TO_POINTER(DESKTOP_FILE_COLUMN_PATH), NULL); + gtk_tree_sortable_set_sort_func(sortable, DESKTOP_FILE_COLUMN_DISABLED, editor_list_window_sort_cb, + GINT_TO_POINTER(DESKTOP_FILE_COLUMN_DISABLED), NULL); /* set initial sort order */ gtk_tree_sortable_set_sort_column_id(sortable, DESKTOP_FILE_COLUMN_NAME, GTK_SORT_ASCENDING);
--- a/src/editors.c Sat Oct 27 12:40:59 2018 +0100 +++ b/src/editors.c Thu Nov 01 13:59:03 2018 +0000 @@ -184,6 +184,8 @@ gchar *try_exec; GtkTreeIter iter; gboolean category_geeqie = FALSE; + GList *work; + gboolean disabled; if (g_hash_table_lookup(editors, key)) return FALSE; /* the file found earlier wins */ @@ -352,9 +354,25 @@ if (editor->ignored) return TRUE; + work = options->disabled_plugins; + + disabled = FALSE; + while (work) + { + if (g_strcmp0(path, work->data) == 0) + { + disabled = TRUE; + break; + } + work = work->next; + } + + editor->disabled = disabled; + gtk_list_store_append(desktop_file_list, &iter); gtk_list_store_set(desktop_file_list, &iter, DESKTOP_FILE_COLUMN_KEY, key, + DESKTOP_FILE_COLUMN_DISABLED, editor->disabled, DESKTOP_FILE_COLUMN_NAME, editor->name, DESKTOP_FILE_COLUMN_HIDDEN, editor->hidden ? _("yes") : _("no"), DESKTOP_FILE_COLUMN_WRITABLE, access_file(path, W_OK), @@ -383,7 +401,7 @@ } else { - desktop_file_list = gtk_list_store_new(DESKTOP_FILE_COLUMN_COUNT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_STRING); + desktop_file_list = gtk_list_store_new(DESKTOP_FILE_COLUMN_COUNT, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_STRING); } if (editors) { @@ -470,6 +488,11 @@ strcmp(editor->key, CMD_DELETE) == 0 || strcmp(editor->key, CMD_FOLDER) == 0) return; + if (editor->disabled) + { + return; + } + *listp = g_list_prepend(*listp, editor); }
--- a/src/editors.h Sat Oct 27 12:40:59 2018 +0100 +++ b/src/editors.h Thu Nov 01 13:59:03 2018 +0000 @@ -58,6 +58,7 @@ EditorFlags flags; gboolean hidden; /* explicitly hidden, shown in configuration dialog */ gboolean ignored; /* not interesting, do not show at all */ + gboolean disabled; /* display disabled by user */ }; #define EDITOR_ERRORS(flags) ((flags) & EDITOR_ERROR_MASK) @@ -74,6 +75,7 @@ enum { DESKTOP_FILE_COLUMN_KEY, + DESKTOP_FILE_COLUMN_DISABLED, DESKTOP_FILE_COLUMN_NAME, DESKTOP_FILE_COLUMN_HIDDEN, DESKTOP_FILE_COLUMN_WRITABLE,
--- a/src/options.c Sat Oct 27 12:40:59 2018 +0100 +++ b/src/options.c Thu Nov 01 13:59:03 2018 +0000 @@ -202,6 +202,8 @@ options->printer.image_text_position = 1; options->printer.page_text_position = 3; + options->disabled_plugins = NULL; + return options; }
--- a/src/options.h Sat Oct 27 12:40:59 2018 +0100 +++ b/src/options.h Thu Nov 01 13:59:03 2018 +0000 @@ -314,6 +314,8 @@ } printer; gboolean read_metadata_in_idle; + + GList *disabled_plugins; }; ConfOptions *options;
--- a/src/rcfile.c Sat Oct 27 12:40:59 2018 +0100 +++ b/src/rcfile.c Thu Nov 01 13:59:03 2018 +0000 @@ -551,6 +551,38 @@ WRITE_NL(); WRITE_STRING("</marks_tooltips>"); } +static void write_disabled_plugins(GString *outstr, gint indent) +{ + GtkTreeIter iter; + gboolean valid; + gboolean disabled; + gchar *desktop_path; + + WRITE_NL(); WRITE_STRING("<disabled_plugins>"); + indent++; + + if (desktop_file_list) + { + valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(desktop_file_list), &iter); + while (valid) + { + gtk_tree_model_get(GTK_TREE_MODEL(desktop_file_list), &iter, DESKTOP_FILE_COLUMN_DISABLED, &disabled, -1); + gtk_tree_model_get(GTK_TREE_MODEL(desktop_file_list), &iter, DESKTOP_FILE_COLUMN_PATH, &desktop_path, -1); + + if (disabled) + { + WRITE_NL(); + write_char_option(outstr, indent, "<plugin path", desktop_path); + WRITE_STRING("/>"); + } + g_free(desktop_path); + valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(desktop_file_list), &iter); + } + } + + indent--; + WRITE_NL(); WRITE_STRING("</disabled_plugins>"); +} /* *----------------------------------------------------------------------------- @@ -608,6 +640,9 @@ write_marks_tooltips(outstr, indent); WRITE_SEPARATOR(); + write_disabled_plugins(outstr, indent); + + WRITE_SEPARATOR(); keyword_tree_write_config(outstr, indent); indent--; WRITE_NL(); WRITE_STRING("</global>\n"); @@ -914,6 +949,30 @@ } +static void options_load_disabled_plugins(GQParserData *parser_data, GMarkupParseContext *context, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer data, GError **error) +{ + gint i = GPOINTER_TO_INT(data); + struct { + gchar *path; + } tmp; + + while (*attribute_names) + { + const gchar *option = *attribute_names++; + const gchar *value = *attribute_values++; + tmp.path = NULL; + if (READ_CHAR_FULL("path", tmp.path)) + { + options->disabled_plugins = g_list_append(options->disabled_plugins, g_strdup(tmp.path)); + continue; + } + + log_printf("unknown attribute %s = %s\n", option, value); + } + i++; + options_parse_func_set_data(parser_data, GINT_TO_POINTER(i)); +} + /* *----------------------------------------------------------------------------- * xml file structure (private) @@ -973,6 +1032,20 @@ } } +static void options_parse_disabled_plugins(GQParserData *parser_data, GMarkupParseContext *context, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer data, GError **error) +{ + if (g_ascii_strcasecmp(element_name, "plugin") == 0) + { + options_load_disabled_plugins(parser_data, context, element_name, attribute_names, attribute_values, data, error); + options_parse_func_push(parser_data, options_parse_leaf, NULL, NULL); + } + else + { + log_printf("unexpected in <profile>: <%s>\n", element_name); + options_parse_func_push(parser_data, options_parse_leaf, NULL, NULL); + } +} + static void options_parse_filter(GQParserData *parser_data, GMarkupParseContext *context, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer data, GError **error) { if (g_ascii_strcasecmp(element_name, "file_type") == 0) @@ -1053,6 +1126,11 @@ if (!keyword_tree) keyword_tree_new(); options_parse_func_push(parser_data, options_parse_keyword_tree, NULL, NULL); } + else if (g_ascii_strcasecmp(element_name, "disabled_plugins") == 0) + { + options_load_disabled_plugins(parser_data, context, element_name, attribute_names, attribute_values, data, error); + options_parse_func_push(parser_data, options_parse_disabled_plugins, NULL, NULL); + } else { log_printf("unexpected in <global>: <%s>\n", element_name);
--- a/web/help/GuidePluginsConfig.html Sat Oct 27 12:40:59 2018 +0100 +++ b/web/help/GuidePluginsConfig.html Thu Nov 01 13:59:03 2018 +0000 @@ -492,6 +492,12 @@ </p> <div class="block list variablelist"><dl class="variablelist"> <dt class="term dt-first"> + <span class="guilabel">Disabled</span> + </dt> +<dd> + <p class="para block block-first">If the checkbox is ticked, the plugin will not be displayed in Geeqie menus.</p> + </dd> +<dt class="term"> <span class="guilabel">Name</span> </dt> <dd>