Preferences/files - search and sort
[geeqie.git] / src / preferences.c
index 6ce4eb2..dc26b82 100644 (file)
@@ -112,6 +112,15 @@ enum {
        AE_ACCEL
 };
 
+enum {
+       FILETYPES_COLUMN_FILTER = 0,
+       FILETYPES_COLUMN_DESCRIPTION,
+       FILETYPES_COLUMN_CLASS,
+       FILETYPES_COLUMN_WRITABLE,
+       FILETYPES_COLUMN_SIDECAR,
+       FILETYPES_COLUMN_COUNT
+};
+
 gchar *format_class_list[] = {
        N_("Unknown"),
        N_("Image"),
@@ -341,6 +350,8 @@ static void config_window_apply(void)
 
        options->image.zoom_increment = c_options->image.zoom_increment;
 
+       options->image.zoom_style = c_options->image.zoom_style;
+
        options->image.enable_read_ahead = c_options->image.enable_read_ahead;
 
 
@@ -377,7 +388,6 @@ static void config_window_apply(void)
        options->image_overlay.background_blue = c_options->image_overlay.background_blue;
        options->image_overlay.background_alpha = c_options->image_overlay.background_alpha;
        options->update_on_time_change = c_options->update_on_time_change;
-       options->image.exif_proof_rotate_enable = c_options->image.exif_proof_rotate_enable;
 
        options->duplicates_similarity_threshold = c_options->duplicates_similarity_threshold;
        options->rot_invariant_sim = c_options->rot_invariant_sim;
@@ -715,6 +725,47 @@ static void add_clipboard_selection_menu(GtkWidget *table, gint column, gint row
        gtk_widget_show(combo);
 }
 
+static void zoom_style_selection_menu_cb(GtkWidget *combo, gpointer data)
+{
+       gint *option = data;
+
+       switch (gtk_combo_box_get_active(GTK_COMBO_BOX(combo)))
+               {
+               case 0:
+                       *option = ZOOM_GEOMETRIC;
+                       break;
+               case 1:
+                       *option = ZOOM_ARITHMETIC;
+                       break;
+               default:
+                       *option = ZOOM_GEOMETRIC;
+               }
+}
+
+static void add_zoom_style_selection_menu(GtkWidget *table, gint column, gint row, const gchar *text, ZoomStyle option, ZoomStyle *option_c)
+{
+       GtkWidget *combo;
+       gint current = 0;
+
+       *option_c = option;
+
+       pref_table_label(table, column, row, text, 0.0);
+
+       combo = gtk_combo_box_text_new();
+
+       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("Geometric"));
+       if (option == ZOOM_GEOMETRIC) current = 0;
+       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("Arithmetic"));
+       if (option == ZOOM_ARITHMETIC) current = 1;
+
+       gtk_combo_box_set_active(GTK_COMBO_BOX(combo), current);
+
+       g_signal_connect(G_OBJECT(combo), "changed", G_CALLBACK(zoom_style_selection_menu_cb), option_c);
+
+       gtk_table_attach(GTK_TABLE(table), combo, column + 1, column + 2, row, row + 1, GTK_SHRINK, 0, 0, 0);
+       gtk_widget_show(combo);
+}
+
 typedef struct _UseableMouseItems UseableMouseItems;
 struct _UseableMouseItems
 {
@@ -2244,6 +2295,10 @@ static void config_tab_image(GtkWidget *notebook)
                             G_CALLBACK(zoom_increment_cb), NULL);
        gtk_spin_button_set_update_policy(GTK_SPIN_BUTTON(spin), GTK_UPDATE_ALWAYS);
 
+       c_options->image.zoom_style = options->image.zoom_style;
+       table = pref_table_new(group, 2, 1, FALSE, FALSE);
+       add_zoom_style_selection_menu(table, 0, 0, _("Zoom style:"), options->image.zoom_style, &c_options->image.zoom_style);
+
        group = pref_group_new(vbox, FALSE, _("Fit image to window"), GTK_ORIENTATION_VERTICAL);
 
        hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
@@ -2294,11 +2349,6 @@ static void config_tab_image(GtkWidget *notebook)
 
        c_options->image.alpha_color_1 = options->image.alpha_color_1;
        c_options->image.alpha_color_2 = options->image.alpha_color_2;
-
-       group = pref_group_new(vbox, FALSE, _("Convenience"), GTK_ORIENTATION_VERTICAL);
-
-       pref_checkbox_new_int(group, _("Auto rotate proofs using Exif information"),
-                             options->image.exif_proof_rotate_enable, &c_options->image.exif_proof_rotate_enable);
 }
 
 /* windows tab */
@@ -2578,6 +2628,60 @@ static GtkTreeModel *create_class_model(void)
 
 
 /* filtering tab */
+static gint filter_table_sort_cb(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer data)
+{
+       gint n = GPOINTER_TO_INT(data);
+       gint ret = 0;
+       FilterEntry *filter_a;
+       FilterEntry *filter_b;
+
+       gtk_tree_model_get(model, a, 0, &filter_a, -1);
+       gtk_tree_model_get(model, b, 0, &filter_b, -1);
+
+       switch (n)
+               {
+               case FILETYPES_COLUMN_DESCRIPTION:
+                       {
+                       ret = g_utf8_collate(filter_a->description, filter_b->description);
+                       break;
+                       }
+               case FILETYPES_COLUMN_CLASS:
+                       {
+                       ret = g_strcmp0(format_class_list[filter_a->file_class], format_class_list[filter_b->file_class]);
+                       break;
+                       }
+               case FILETYPES_COLUMN_WRITABLE:
+                       {
+                       ret = filter_a->writable - filter_b->writable;
+                       break;
+                       }
+               case FILETYPES_COLUMN_SIDECAR:
+                       {
+                       ret = filter_a->allow_sidecar - filter_b->allow_sidecar;
+                       break;
+                       }
+               default:
+                       g_return_val_if_reached(0);
+               }
+
+       return ret;
+}
+
+static gboolean search_function_cb(GtkTreeModel *model, gint column, const gchar *key, GtkTreeIter *iter, gpointer search_data)
+{
+       FilterEntry *fe;
+       gboolean ret = TRUE;
+
+       gtk_tree_model_get(model, iter, 0, &fe, -1);
+
+       if (g_strstr_len(fe->extensions, -1, key))
+               {
+               ret = FALSE;
+               }
+
+       return ret;
+}
+
 static void config_tab_files(GtkWidget *notebook)
 {
        GtkWidget *hbox;
@@ -2659,6 +2763,10 @@ static void config_tab_files(GtkWidget *notebook)
                                                GINT_TO_POINTER(FE_EXTENSION), NULL);
        gtk_tree_view_append_column(GTK_TREE_VIEW(filter_view), column);
 
+       gtk_tree_view_set_enable_search(GTK_TREE_VIEW(filter_view), TRUE);
+       gtk_tree_view_set_search_column(GTK_TREE_VIEW(filter_view), FILETYPES_COLUMN_FILTER);
+       gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(filter_view), search_function_cb, NULL, NULL);
+
        column = gtk_tree_view_column_new();
        gtk_tree_view_column_set_title(column, _("Description"));
        gtk_tree_view_column_set_resizable(column, TRUE);
@@ -2673,6 +2781,8 @@ static void config_tab_files(GtkWidget *notebook)
        gtk_tree_view_column_set_cell_data_func(column, renderer, filter_set_func,
                                                GINT_TO_POINTER(FE_DESCRIPTION), NULL);
        gtk_tree_view_append_column(GTK_TREE_VIEW(filter_view), column);
+       gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(filter_store), FILETYPES_COLUMN_DESCRIPTION, filter_table_sort_cb, GINT_TO_POINTER(FILETYPES_COLUMN_DESCRIPTION), NULL);
+       gtk_tree_view_column_set_sort_column_id(column, FILETYPES_COLUMN_DESCRIPTION);
 
        column = gtk_tree_view_column_new();
        gtk_tree_view_column_set_title(column, _("Class"));
@@ -2690,6 +2800,8 @@ static void config_tab_files(GtkWidget *notebook)
        gtk_tree_view_column_set_cell_data_func(column, renderer, filter_set_func,
                                                GINT_TO_POINTER(FE_CLASS), NULL);
        gtk_tree_view_append_column(GTK_TREE_VIEW(filter_view), column);
+       gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(filter_store), FILETYPES_COLUMN_CLASS, filter_table_sort_cb, GINT_TO_POINTER(FILETYPES_COLUMN_CLASS), NULL);
+       gtk_tree_view_column_set_sort_column_id(column, FILETYPES_COLUMN_CLASS);
 
        column = gtk_tree_view_column_new();
        gtk_tree_view_column_set_title(column, _("Writable"));
@@ -2701,6 +2813,8 @@ static void config_tab_files(GtkWidget *notebook)
        gtk_tree_view_column_set_cell_data_func(column, renderer, filter_set_func,
                                                GINT_TO_POINTER(FE_WRITABLE), NULL);
        gtk_tree_view_append_column(GTK_TREE_VIEW(filter_view), column);
+       gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(filter_store), FILETYPES_COLUMN_WRITABLE, filter_table_sort_cb, GINT_TO_POINTER(FILETYPES_COLUMN_WRITABLE), NULL);
+       gtk_tree_view_column_set_sort_column_id(column, FILETYPES_COLUMN_WRITABLE);
 
        column = gtk_tree_view_column_new();
        gtk_tree_view_column_set_title(column, _("Sidecar is allowed"));
@@ -2712,7 +2826,8 @@ static void config_tab_files(GtkWidget *notebook)
        gtk_tree_view_column_set_cell_data_func(column, renderer, filter_set_func,
                                                GINT_TO_POINTER(FE_ALLOW_SIDECAR), NULL);
        gtk_tree_view_append_column(GTK_TREE_VIEW(filter_view), column);
-
+       gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(filter_store), FILETYPES_COLUMN_SIDECAR, filter_table_sort_cb, GINT_TO_POINTER(FILETYPES_COLUMN_SIDECAR), NULL);
+       gtk_tree_view_column_set_sort_column_id(column, FILETYPES_COLUMN_SIDECAR);
 
        filter_store_populate();
        gtk_container_add(GTK_CONTAINER(scrolled), filter_view);