Exif window search facility
authorColin Clark <colin.clark@cclark.uk>
Tue, 31 May 2022 10:16:24 +0000 (11:16 +0100)
committerColin Clark <colin.clark@cclark.uk>
Tue, 31 May 2022 10:16:24 +0000 (11:16 +0100)
A search of the Exif data can be initiated by clicking anywhere on the
column you wish to search, and then type Ctrl + F or press any
alpha-numeric key. The search is case-insensitive.

doc/docbook/GuideOtherWindowsExif.xml
src/advanced_exif.c

index 854b831..40cafb0 100644 (file)
@@ -13,5 +13,8 @@
     <link linkend="GuideSidebarsInfo">Info Sidebar</link>
     , it is possible to drag-and-drop an item from the Exif window onto the Sidebar pane.
   </para>
+  <para>
+    A search of the Exif data can be initiated by clicking anywhere on the column you wish to search, and then type <code>Ctrl + F</code> or press any alpha-numeric key. The search is case-insensitive
+  </para>
   <para />
 </section>
index 9e103de..0c9e4d6 100644 (file)
@@ -363,6 +363,8 @@ static gboolean advanced_exif_mouseclick(GtkWidget *widget,
 
                g_list_free(cols);
                g_free(value);
+
+               gtk_tree_view_set_search_column(GTK_TREE_VIEW(ew->listview), gtk_tree_view_column_get_sort_column_id(column));
                }
 
        return TRUE;
@@ -392,6 +394,30 @@ static gboolean advanced_exif_keypress(GtkWidget *widget, GdkEventKey *event, gp
        return stop_signal;
 } // static gboolean advanced_exif_...
 
+static gboolean search_function_cb(GtkTreeModel *model, gint column, const gchar *key, GtkTreeIter *iter, gpointer data)
+{
+       gboolean ret = TRUE;
+       gchar *field_contents;
+       gchar *field_contents_nocase;
+       gchar *key_nocase;
+
+       gtk_tree_model_get(model, iter, column, &field_contents, -1);
+
+       field_contents_nocase = g_utf8_casefold(field_contents, -1);
+       key_nocase = g_utf8_casefold(key, -1);
+
+       if (g_strstr_len(field_contents_nocase, -1, key_nocase))
+               {
+               ret = FALSE;
+               }
+
+       g_free(field_contents);
+       g_free(field_contents_nocase);
+       g_free(key_nocase);
+
+       return ret;
+}
+
 GtkWidget *advanced_exif_new(LayoutWindow *lw)
 {
        ExifWin *ew;
@@ -469,6 +495,9 @@ GtkWidget *advanced_exif_new(LayoutWindow *lw)
        advanced_exif_add_column(ew->listview, _("Format"), EXIF_ADVCOL_FORMAT, FALSE);
        advanced_exif_add_column(ew->listview, _("Elements"), EXIF_ADVCOL_ELEMENTS, FALSE);
 
+       gtk_tree_view_set_enable_search(GTK_TREE_VIEW(ew->listview), TRUE);
+       gtk_tree_view_set_search_column(GTK_TREE_VIEW(ew->listview), EXIF_ADVCOL_DESCRIPTION);
+       gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(ew->listview), search_function_cb, ew, NULL);
 
        gtk_drag_source_set(ew->listview,
                           GDK_BUTTON1_MASK | GDK_BUTTON2_MASK,