Eliminate FIXME: enable or disable individual plugins from configure
authorColin Clark <colin.clark@cclark.uk>
Thu, 1 Nov 2018 13:59:03 +0000 (13:59 +0000)
committerColin Clark <colin.clark@cclark.uk>
Thu, 1 Nov 2018 13:59:03 +0000 (13:59 +0000)
Additional checkbox in Edit/Configure Plugins to prevent plugins being
displayed in the menus

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

index 6977b43..5b03723 100644 (file)
       The list has the following columns:\r
     </para>\r
     <variablelist spacing="compact">\r
+      <varlistentry>\r
+        <term>\r
+          <guilabel>Disabled</guilabel>\r
+        </term>\r
+        <listitem>\r
+          <para>If the checkbox is ticked, the plugin will not be displayed in Geeqie menus.</para>\r
+        </listitem>\r
+      </varlistentry>\r
       <varlistentry>\r
         <term>\r
           <guilabel>Name</guilabel>\r
index 929d7dd..b0b5d65 100644 (file)
@@ -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)
index b3b7e21..471ab5e 100644 (file)
@@ -414,6 +414,7 @@ static gint editor_list_window_sort_cb(GtkTreeModel *model, GtkTreeIter *a, GtkT
 {
        gint n = GPOINTER_TO_INT(data);
        gint ret = 0;
+       gboolean bool1, bool2;
 
        switch (n)
                {
@@ -441,6 +442,25 @@ static gint editor_list_window_sort_cb(GtkTreeModel *model, GtkTreeIter *a, GtkT
                        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 @@ static gint editor_list_window_sort_cb(GtkTreeModel *model, GtkTreeIter *a, GtkT
        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;
@@ -531,6 +612,19 @@ static void editor_list_window_create(void)
 
        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);
@@ -579,6 +673,8 @@ static void editor_list_window_create(void)
                                        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);
index 2ddc34b..aa970ac 100644 (file)
@@ -184,6 +184,8 @@ gboolean editor_read_desktop_file(const gchar *path)
        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 @@ gboolean editor_read_desktop_file(const gchar *path)
 
        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 @@ void editor_table_clear(void)
                }
        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 @@ static void editor_list_add_cb(gpointer key, gpointer value, gpointer data)
            strcmp(editor->key, CMD_DELETE) == 0 ||
            strcmp(editor->key, CMD_FOLDER) == 0) return;
 
+       if (editor->disabled)
+               {
+               return;
+               }
+
        *listp = g_list_prepend(*listp, editor);
 }
 
index 508ab30..5c2811e 100644 (file)
@@ -58,6 +58,7 @@ struct _EditorDescription {
        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 {
 
 enum {
        DESKTOP_FILE_COLUMN_KEY,
+       DESKTOP_FILE_COLUMN_DISABLED,
        DESKTOP_FILE_COLUMN_NAME,
        DESKTOP_FILE_COLUMN_HIDDEN,
        DESKTOP_FILE_COLUMN_WRITABLE,
index f8721f6..cf9764b 100644 (file)
@@ -202,6 +202,8 @@ ConfOptions *init_options(ConfOptions *options)
        options->printer.image_text_position = 1;
        options->printer.page_text_position = 3;
 
+       options->disabled_plugins = NULL;
+
        return options;
 }
 
index a5f52cf..46748c2 100644 (file)
@@ -314,6 +314,8 @@ struct _ConfOptions
        } printer;
 
        gboolean read_metadata_in_idle;
+
+       GList *disabled_plugins;
 };
 
 ConfOptions *options;
index 41a1977..12c5a78 100644 (file)
@@ -551,6 +551,38 @@ static void write_marks_tooltips(GString *outstr, gint indent)
        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>");
+}
 
 /*
  *-----------------------------------------------------------------------------
@@ -607,6 +639,9 @@ gboolean save_config_to_file(const gchar *utf8_path, ConfOptions *options)
        WRITE_SEPARATOR();
        write_marks_tooltips(outstr, indent);
 
+       WRITE_SEPARATOR();
+       write_disabled_plugins(outstr, indent);
+
        WRITE_SEPARATOR();
        keyword_tree_write_config(outstr, indent);
        indent--;
@@ -914,6 +949,30 @@ static void options_load_marks_tooltips(GQParserData *parser_data, GMarkupParseC
 
 }
 
+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_marks_tooltips(GQParserData *parser_data, GMarkupParse
                }
 }
 
+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 @@ static void options_parse_global(GQParserData *parser_data, GMarkupParseContext
                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);
index 704de5e..f612b72 100644 (file)
@@ -492,6 +492,12 @@ dd.answer div.label { float: left; }
     </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>