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
-#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)
{
gint n = GPOINTER_TO_INT(data);
gint ret = 0;
+ gboolean bool1, bool2;
switch (n)
{
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);
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;
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);
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);
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 */
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),
}
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)
{
strcmp(editor->key, CMD_DELETE) == 0 ||
strcmp(editor->key, CMD_FOLDER) == 0) return;
+ if (editor->disabled)
+ {
+ return;
+ }
+
*listp = g_list_prepend(*listp, editor);
}
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)
enum {
DESKTOP_FILE_COLUMN_KEY,
+ DESKTOP_FILE_COLUMN_DISABLED,
DESKTOP_FILE_COLUMN_NAME,
DESKTOP_FILE_COLUMN_HIDDEN,
DESKTOP_FILE_COLUMN_WRITABLE,
options->printer.image_text_position = 1;
options->printer.page_text_position = 3;
+ options->disabled_plugins = NULL;
+
return options;
}
} printer;
gboolean read_metadata_in_idle;
+
+ GList *disabled_plugins;
};
ConfOptions *options;
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>");
+}
/*
*-----------------------------------------------------------------------------
WRITE_SEPARATOR();
write_marks_tooltips(outstr, indent);
+ WRITE_SEPARATOR();
+ write_disabled_plugins(outstr, indent);
+
WRITE_SEPARATOR();
keyword_tree_write_config(outstr, indent);
indent--;
}
+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)
}
}
+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)
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);
</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>