Mercurial > hg > forks > geeqie
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: */