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>