AppImage - update web page
[geeqie.git] / src / desktop_file.c
index dee94a1..c74cc88 100644 (file)
@@ -1,13 +1,22 @@
 /*
- * Geeqie
- * (C) 2004 John Ellis
- * Copyright (C) 2008 - 2010 The Geeqie Team
+ * Copyright (C) 2004 John Ellis
+ * Copyright (C) 2008 - 2016 The Geeqie Team
  *
  * Author: Vladimir Nadvornik
  *
- * This software is released under the GNU General Public License (GNU GPL).
- * Please read the included file COPYING for more information.
- * This software comes with no warranty of any kind, use at your own risk!
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
 #include "main.h"
@@ -68,13 +77,13 @@ static gboolean editor_window_save(EditorWindow *ew)
        GError *error = NULL;
        gboolean ret = TRUE;
        const gchar *name = gtk_entry_get_text(GTK_ENTRY(ew->entry));
-       
-       if (!name || !name[0]) 
+
+       if (!name || !name[0])
                {
                file_util_warning_dialog(_("Can't save"), _("Please specify file name."), GTK_STOCK_DIALOG_ERROR, NULL);
                return FALSE;
                }
-       
+
        gtk_text_buffer_get_bounds(ew->buffer, &start, &end);
        text = gtk_text_buffer_get_text(ew->buffer, &start, &end, FALSE);
 
@@ -87,19 +96,19 @@ static gboolean editor_window_save(EditorWindow *ew)
                ret = FALSE;
                }
 
-       if (ret && !g_file_set_contents(path, text, -1, &error)) 
+       if (ret && !g_file_set_contents(path, text, -1, &error))
                {
                file_util_warning_dialog(_("Can't save"), error->message, GTK_STOCK_DIALOG_ERROR, NULL);
                g_error_free(error);
                ret = FALSE;
                }
-       
+
        g_free(path);
        g_free(dir);
        g_free(text);
        layout_editors_reload_start();
        /* idle function is not needed, everything should be cached */
-       layout_editors_reload_finish(); 
+       layout_editors_reload_finish();
        return ret;
 }
 
@@ -135,7 +144,7 @@ static void editor_window_save_cb(GtkWidget *widget, gpointer data)
 static void editor_window_text_modified_cb(GtkWidget *widget, gpointer data)
 {
        EditorWindow *ew = data;
-       
+
        if (gtk_text_buffer_get_modified(ew->buffer))
                {
                gtk_widget_set_sensitive(ew->save_button, TRUE);
@@ -158,7 +167,7 @@ static void editor_window_entry_changed_cb(GtkWidget *widget, gpointer data)
                {
                modified = strcmp(ew->desktop_name, content);
                }
-       
+
        gtk_widget_set_sensitive(ew->save_button, modified);
        ew->modified = modified;
 }
@@ -180,6 +189,7 @@ static void editor_window_new(const gchar *src_path, const gchar *desktop_name)
 
 
        ew->window = window_new(GTK_WINDOW_TOPLEVEL, "Desktop", PIXBUF_INLINE_ICON_CONFIG, NULL, _("Desktop file"));
+       DEBUG_NAME(ew->window);
        gtk_window_set_type_hint(GTK_WINDOW(ew->window), GDK_WINDOW_TYPE_HINT_DIALOG);
 
        g_signal_connect(G_OBJECT(ew->window), "delete_event",
@@ -217,7 +227,7 @@ static void editor_window_new(const gchar *src_path, const gchar *desktop_name)
        ew->save_button = pref_button_new(NULL, GTK_STOCK_SAVE, NULL, FALSE,
                                 G_CALLBACK(editor_window_save_cb), ew);
        gtk_container_add(GTK_CONTAINER(button_hbox), ew->save_button);
-       GTK_WIDGET_SET_FLAGS(ew->save_button, GTK_CAN_DEFAULT);
+       gtk_widget_set_can_default(ew->save_button, TRUE);
        gtk_widget_set_sensitive(ew->save_button, FALSE);
        gtk_widget_show(ew->save_button);
        ct_button = ew->save_button;
@@ -225,7 +235,7 @@ static void editor_window_new(const gchar *src_path, const gchar *desktop_name)
        button = pref_button_new(NULL, GTK_STOCK_CLOSE, NULL, FALSE,
                                 G_CALLBACK(editor_window_close_cb), ew);
        gtk_container_add(GTK_CONTAINER(button_hbox), button);
-       GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
+       gtk_widget_set_can_default(button, TRUE);
        gtk_widget_show(button);
 
        if (!generic_dialog_get_alternative_button_order(ew->window))
@@ -297,7 +307,7 @@ static void editor_list_window_delete_dlg_ok_cb(GenericDialog *gd, gpointer data
                /* refresh list */
                layout_editors_reload_start();
                /* idle function is not needed, everything should be cached */
-               layout_editors_reload_finish(); 
+               layout_editors_reload_finish();
                }
 
        editor_list_window_delete_dlg_cancel(gd, data);
@@ -306,10 +316,10 @@ static void editor_list_window_delete_dlg_ok_cb(GenericDialog *gd, gpointer data
 static void editor_list_window_delete_cb(GtkWidget *widget, gpointer data)
 {
        EditorListWindow *ewl = data;
-       GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(ewl->view)); 
+       GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(ewl->view));
        GtkTreeIter iter;
 
-       if (gtk_tree_selection_get_selected(sel, NULL, &iter)) 
+       if (gtk_tree_selection_get_selected(sel, NULL, &iter))
                {
                GtkTreeModel *store = gtk_tree_view_get_model(GTK_TREE_VIEW(ewl->view));
                gchar *path;
@@ -325,7 +335,7 @@ static void editor_list_window_delete_cb(GtkWidget *widget, gpointer data)
                ewdl = g_new(EditorWindowDel_Data, 1);
                ewdl->ewl = ewl;
                ewdl->path = path;
-       
+
                if (ewl->gd)
                        {
                        GenericDialog *gd = ewl->gd;
@@ -341,7 +351,7 @@ static void editor_list_window_delete_cb(GtkWidget *widget, gpointer data)
 
                text = g_strdup_printf(_("About to delete the file:\n %s"), path);
                generic_dialog_add_message(ewl->gd, GTK_STOCK_DIALOG_QUESTION,
-                                          _("Delete file"), text);
+                                          _("Delete file"), text, TRUE);
                g_free(text);
 
                gtk_widget_show(ewl->gd->dialog);
@@ -351,10 +361,10 @@ static void editor_list_window_delete_cb(GtkWidget *widget, gpointer data)
 static void editor_list_window_edit_cb(GtkWidget *widget, gpointer data)
 {
        EditorListWindow *ewl = data;
-       GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(ewl->view)); 
+       GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(ewl->view));
        GtkTreeIter iter;
 
-       if (gtk_tree_selection_get_selected(sel, NULL, &iter)) 
+       if (gtk_tree_selection_get_selected(sel, NULL, &iter))
                {
                GtkTreeModel *store = gtk_tree_view_get_model(GTK_TREE_VIEW(ewl->view));
                gchar *path;
@@ -363,7 +373,7 @@ static void editor_list_window_edit_cb(GtkWidget *widget, gpointer data)
                gtk_tree_model_get(store, &iter,
                                   DESKTOP_FILE_COLUMN_PATH, &path,
                                   DESKTOP_FILE_COLUMN_KEY, &key, -1);
-               editor_window_new(path, key);   
+               editor_window_new(path, key);
                g_free(key);
                g_free(path);
                }
@@ -371,16 +381,21 @@ static void editor_list_window_edit_cb(GtkWidget *widget, gpointer data)
 
 static void editor_list_window_new_cb(GtkWidget *widget, gpointer data)
 {
-       editor_window_new(DESKTOP_FILE_TEMPLATE, _("new.desktop"));
+       editor_window_new(desktop_file_template, _("new.desktop"));
+}
+
+static void editor_list_window_help_cb(GtkWidget *widget, gpointer data)
+{
+       help_window_show("GuidePluginsConfig.html");
 }
 
 static void editor_list_window_selection_changed_cb(GtkWidget *widget, gpointer data)
 {
        EditorListWindow *ewl = data;
-       GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(ewl->view)); 
+       GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(ewl->view));
        GtkTreeIter iter;
 
-       if (gtk_tree_selection_get_selected(sel, NULL, &iter)) 
+       if (gtk_tree_selection_get_selected(sel, NULL, &iter))
                {
                GtkTreeModel *store = gtk_tree_view_get_model(GTK_TREE_VIEW(ewl->view));
                gchar *path;
@@ -388,18 +403,19 @@ static void editor_list_window_selection_changed_cb(GtkWidget *widget, gpointer
                gtk_tree_model_get(store, &iter,
                                                   DESKTOP_FILE_COLUMN_PATH, &path,
                                                   -1);
-               
+
                gtk_widget_set_sensitive(ewl->delete_button, access_file(path, W_OK));
                gtk_widget_set_sensitive(ewl->edit_button, TRUE);
                g_free(path);
                }
-       
+
 }
 
 static gint editor_list_window_sort_cb(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer data)
 {
        gint n = GPOINTER_TO_INT(data);
        gint ret = 0;
+       gboolean bool1, bool2;
 
        switch (n)
                {
@@ -427,7 +443,26 @@ 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);
                }
@@ -435,6 +470,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;
@@ -449,8 +545,9 @@ static void editor_list_window_create(void)
        EditorListWindow *ewl;
 
        editor_list_window = ewl = g_new0(EditorListWindow, 1);
-       
-       ewl->window = window_new(GTK_WINDOW_TOPLEVEL, "editors", PIXBUF_INLINE_ICON_CONFIG, NULL, _("Editors"));
+
+       ewl->window = window_new(GTK_WINDOW_TOPLEVEL, "editors", PIXBUF_INLINE_ICON_CONFIG, NULL, _("Plugins"));
+       DEBUG_NAME(ewl->window);
        gtk_window_set_type_hint(GTK_WINDOW(ewl->window), GDK_WINDOW_TYPE_HINT_DIALOG);
        g_signal_connect(G_OBJECT(ewl->window), "delete_event",
                         G_CALLBACK(editor_list_window_delete), NULL);
@@ -469,16 +566,22 @@ static void editor_list_window_create(void)
        gtk_widget_show(hbox);
 
 
+       button = pref_button_new(NULL, GTK_STOCK_HELP, NULL, FALSE,
+                                G_CALLBACK(editor_list_window_help_cb), ewl);
+       gtk_container_add(GTK_CONTAINER(hbox), button);
+       gtk_widget_set_can_default(button, TRUE);
+       gtk_widget_show(button);
+
        button = pref_button_new(NULL, GTK_STOCK_NEW, NULL, FALSE,
                                 G_CALLBACK(editor_list_window_new_cb), ewl);
        gtk_container_add(GTK_CONTAINER(hbox), button);
-       GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
+       gtk_widget_set_can_default(button, TRUE);
        gtk_widget_show(button);
 
        button = pref_button_new(NULL, GTK_STOCK_EDIT, NULL, FALSE,
                                 G_CALLBACK(editor_list_window_edit_cb), ewl);
        gtk_container_add(GTK_CONTAINER(hbox), button);
-       GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
+       gtk_widget_set_can_default(button, TRUE);
        gtk_widget_set_sensitive(button, FALSE);
        gtk_widget_show(button);
        ewl->edit_button = button;
@@ -486,7 +589,7 @@ static void editor_list_window_create(void)
        button = pref_button_new(NULL, GTK_STOCK_DELETE, NULL, FALSE,
                                 G_CALLBACK(editor_list_window_delete_cb), ewl);
        gtk_container_add(GTK_CONTAINER(hbox), button);
-       GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
+       gtk_widget_set_can_default(button, TRUE);
        gtk_widget_set_sensitive(button, FALSE);
        gtk_widget_show(button);
        ewl->delete_button = button;
@@ -494,7 +597,7 @@ static void editor_list_window_create(void)
        button = pref_button_new(NULL, GTK_STOCK_CLOSE, NULL, FALSE,
                                 G_CALLBACK(editor_list_window_close_cb), ewl);
        gtk_container_add(GTK_CONTAINER(hbox), button);
-       GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
+       gtk_widget_set_can_default(button, TRUE);
        gtk_widget_show(button);
 
        scrolled = gtk_scrolled_window_new(NULL, NULL);
@@ -511,6 +614,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);
@@ -528,7 +644,7 @@ static void editor_list_window_create(void)
        gtk_tree_view_column_add_attribute(column, renderer, "text", DESKTOP_FILE_COLUMN_HIDDEN);
        gtk_tree_view_append_column(GTK_TREE_VIEW(ewl->view), column);
        gtk_tree_view_column_set_sort_column_id(column, DESKTOP_FILE_COLUMN_HIDDEN);
-       gtk_tree_view_column_set_alignment(column, 0.5); 
+       gtk_tree_view_column_set_alignment(column, 0.5);
 
        column = gtk_tree_view_column_new();
        gtk_tree_view_column_set_title(column, _("Desktop file"));
@@ -559,9 +675,11 @@ 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_KEY, GTK_SORT_ASCENDING);
+    gtk_tree_sortable_set_sort_column_id(sortable, DESKTOP_FILE_COLUMN_NAME, GTK_SORT_ASCENDING);
 
        gtk_container_add(GTK_CONTAINER(scrolled), ewl->view);
        gtk_widget_show(ewl->view);