changeset 2531:b885cab426e8

Move filter code into pan-fiew-filter.{c,h}
author Omari Stephens <xsdg@google.com>
date Tue, 27 Dec 2016 19:26:45 +0000
parents 949b146aaa23
children a8680578677a
files src/pan-view/pan-timeline.c src/pan-view/pan-view-filter.c src/pan-view/pan-view-filter.h
diffstat 3 files changed, 67 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/src/pan-view/pan-timeline.c	Sun Dec 25 08:25:13 2016 +0000
+++ b/src/pan-view/pan-timeline.c	Tue Dec 27 19:26:45 2016 +0000
@@ -21,19 +21,15 @@
 
 #include "pan-timeline.h"
 
-#include "metadata.h"
 #include "pan-item.h"
 #include "pan-util.h"
 #include "pan-view.h"
-#include "ui_fileops.h"
+#include "pan-view-filter.h"
 
 void pan_timeline_compute(PanWindow *pw, FileData *dir_fd, gint *width, gint *height)
 {
 	GList *list;
 	GList *work;
-	GHashTable *filter_kw_table;
-	GHashTableIter filter_kw_iter;
-	gchar *filter_kw;
 	gint x, y;
 	time_t group_start_date;
 	gint total;
@@ -46,7 +42,7 @@
 	gint y_height;
 
 	list = pan_list_tree(dir_fd, SORT_NONE, TRUE, pw->ignore_symlinks);
-	filter_kw_table = pw->filter_ui->filter_kw_table;  // Shorthand.
+	gboolean changed = pan_filter_fd_list(&list, pw->filter_ui->filter_kw_table, PAN_VIEW_INTERSECTION);
 
 	if (pw->cache_list && pw->exif_date_enable)
 		{
@@ -80,35 +76,6 @@
 		fd = work->data;
 		work = work->next;
 
-		// Don't show images that fail the keyword test.
-		if (g_hash_table_size(filter_kw_table) > 0)
-			{
-			gint match_count = 0;
-			gint miss_count = 0;
-			// TODO(xsdg): OPTIMIZATION Do the search inside of metadata.c to avoid a
-			// bunch of string list copies.
-			// TODO(xsdg): Allow user to switch between union and intersection.
-			GList *img_keywords = metadata_read_list(fd, KEYWORD_KEY, METADATA_PLAIN);
-			if (!img_keywords) continue;
-
-			g_hash_table_iter_init(&filter_kw_iter, filter_kw_table);
-			while (g_hash_table_iter_next(&filter_kw_iter, (void**)&filter_kw, NULL))
-				{
-				if (g_list_find_custom(img_keywords, filter_kw, (GCompareFunc)g_strcmp0))
-					{
-					++match_count;
-					}
-				else
-					{
-					++miss_count;
-					}
-				if (miss_count > 0) break;
-				}
-
-			string_list_free(img_keywords);
-			if (miss_count > 0 || match_count == 0) continue;
-			}
-
 		if (!pan_date_compare(fd->date, group_start_date, PAN_DATE_LENGTH_DAY))
 			{
 			// FD starts a new day group.
--- a/src/pan-view/pan-view-filter.c	Sun Dec 25 08:25:13 2016 +0000
+++ b/src/pan-view/pan-view-filter.c	Tue Dec 27 19:26:45 2016 +0000
@@ -22,9 +22,11 @@
 #include "pan-view-filter.h"
 
 #include "image.h"
+#include "metadata.h"
 #include "pan-item.h"
 #include "pan-util.h"
 #include "pan-view.h"
+#include "ui_fileops.h"
 #include "ui_tabcomp.h"
 #include "ui_misc.h"
 
@@ -199,3 +201,58 @@
 			}
 		}
 }
+
+gboolean pan_filter_fd_list(GList **fd_list, GHashTable *kw_table, PanViewFilterMode mode)
+{
+	GList *work;
+	gboolean modified = FALSE;
+	GHashTableIter kw_iter;
+	gchar *filter_kw;
+
+
+	if (!fd_list || !*fd_list || g_hash_table_size(kw_table) == 0) return modified;
+
+	// TODO(xsdg): Pay attention to filter mode.
+	work = *fd_list;
+	while (work)
+		{
+		FileData *fd = work->data;
+		GList *last_work = work;
+		work = work->next;
+
+		// TODO(xsdg): OPTIMIZATION Do the search inside of metadata.c to avoid a
+		// bunch of string list copies.
+		GList *img_keywords = metadata_read_list(fd, KEYWORD_KEY, METADATA_PLAIN);
+		if (!img_keywords)
+			{
+			*fd_list = g_list_delete_link(*fd_list, last_work);
+			modified = TRUE;
+			continue;
+			}
+
+		gint match_count = 0;
+		gint miss_count = 0;
+		g_hash_table_iter_init(&kw_iter, kw_table);
+		while (g_hash_table_iter_next(&kw_iter, (void**)&filter_kw, NULL))
+			{
+			if (g_list_find_custom(img_keywords, filter_kw, (GCompareFunc)g_strcmp0))
+				{
+				++match_count;
+				}
+			else
+				{
+				++miss_count;
+				}
+			if (miss_count > 0) break;
+			}
+
+		string_list_free(img_keywords);
+		if (miss_count > 0 || match_count == 0)
+			{
+			*fd_list = g_list_delete_link(*fd_list, last_work);
+			modified = TRUE;
+			}
+		}
+
+	return modified;
+}
--- a/src/pan-view/pan-view-filter.h	Sun Dec 25 08:25:13 2016 +0000
+++ b/src/pan-view/pan-view-filter.h	Tue Dec 27 19:26:45 2016 +0000
@@ -25,6 +25,12 @@
 #include "main.h"
 #include "pan-types.h"
 
+typedef enum {
+	PAN_VIEW_UNION,
+	PAN_VIEW_INTERSECTION,
+	PAN_VIEW_GROUP
+} PanViewFilterMode;
+
 void pan_filter_toggle_visible(PanWindow *pw, gboolean enable);
 void pan_filter_activate(PanWindow *pw);
 void pan_filter_activate_cb(const gchar *text, gpointer data);
@@ -36,5 +42,7 @@
 // Destroys the specified PanViewFilterUi and sets the pointer to NULL.
 void pan_filter_ui_destroy(PanViewFilterUi **ui);
 
+gboolean pan_filter_fd_list(GList **fd_list, GHashTable *kw_table, PanViewFilterMode mode);
+
 #endif
 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */