2 * Copyright (C) 2004 John Ellis
3 * Copyright (C) 2008 - 2016 The Geeqie Team
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License along
18 * with this program; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
27 /** @typedef DupeMatchType
33 DUPE_MATCH_NAME = 1 << 0,
34 DUPE_MATCH_SIZE = 1 << 1,
35 DUPE_MATCH_DATE = 1 << 2,
36 DUPE_MATCH_DIM = 1 << 3, /**< image dimensions */
37 DUPE_MATCH_SUM = 1 << 4, /**< MD5sum */
38 DUPE_MATCH_PATH = 1 << 5,
39 DUPE_MATCH_SIM_HIGH = 1 << 6, /**< similarity */
40 DUPE_MATCH_SIM_MED = 1 << 7,
41 DUPE_MATCH_SIM_LOW = 1 << 8,
42 DUPE_MATCH_SIM_CUSTOM = 1 << 9,
43 DUPE_MATCH_NAME_CI = 1 << 10, /**< same as name, but case insensitive */
44 DUPE_MATCH_NAME_CONTENT = 1 << 11, /**< same name, but different content */
45 DUPE_MATCH_NAME_CI_CONTENT = 1 << 12, /**< same name - case insensitive, but different content */
46 DUPE_MATCH_ALL = 1 << 13 /**< N.B. this is used as a clamp value in rcfile.c */
56 typedef struct _DupeItem DupeItem;
59 CollectionData *collection; /**< NULL if from #DupeWindow->files */
67 gint dimensions; /**< Computed as (#DupeItem->width << 16) + #DupeItem->height */
69 ImageSimilarityData *simd;
71 GdkPixbuf *pixbuf; /**< thumb */
73 GList *group; /**< List of match data (#DupeMatch) */
74 gdouble group_rank; /**< (sum of all child ranks) / n */
79 typedef struct _DupeMatch DupeMatch;
86 typedef struct _DupeWindow DupeWindow;
89 GList *list; /**< one entry for each dropped file in 1st set window (#DupeItem) */
90 GList *dupes; /**< list of dupes (#DupeItem, grouping the #DupeMatch-es) */
91 DupeMatchType match_mask; /**< mask of things to check for match */
97 GtkWidget *status_label;
98 GtkWidget *extra_label; /**< Progress bar widget */
99 GtkWidget *button_thumbs;
100 GtkWidget *button_rotation_invariant;
101 GtkWidget *custom_threshold;
102 GList *add_files_queue;
103 guint add_files_queue_id;
104 GHashTable *list_cache; /**< Caches the #DupeItem-s of all items in list. Used when ensuring #FileData-s are unique */
105 GHashTable *second_list_cache; /**< Caches the #DupeItem-s of all items in second_list. Used when ensuring #FileData-s are unique */
106 GtkWidget *controls_box;
108 gboolean show_thumbs;
110 guint idle_id; /**< event source id */
112 gint setup_done; /**< Boolean. Set TRUE when all checksums/dimensions/similarity data have been read or created */
113 gint setup_count; /**< length of set1 or if 2 sets, total length of both */
114 gint setup_n; /**< Set to zero on start/reset. These are merely for speed optimization */
115 GList *setup_point; /**< these are merely for speed optimization */
116 DupeMatchType setup_mask; /**< these are merely for speed optimization */
117 guint64 setup_time; /**< Time in µsec since Epoch, restored at each phase of operation */
118 guint64 setup_time_count; /**< Time in µsec since time-to-go status display was updated */
120 DupeItem *click_item; /**< for popup menu */
122 ThumbLoader *thumb_loader;
123 DupeItem *thumb_item;
125 ImageLoader *img_loader;
127 GtkTreeSortable *sortable;
128 gint set_count; /**< Index/counter for number of duplicate sets found */
130 /* second set comparison stuff */
132 gboolean second_set; /**< second set enabled ? */
133 GList *second_list; /**< second set dropped files */
134 gboolean second_drop; /**< drop is on second set */
136 GtkWidget *second_vbox; /**< box of second widgets */
137 GtkWidget *second_listview;
138 GtkWidget *second_status_label;
140 gboolean color_frozen;
142 /* required for similarity threads */
143 GThreadPool *dupe_comparison_thread_pool;
144 GList *search_matches; /**< List of similarity matches (#DupeSearchMatch) */
145 GMutex search_matches_mutex;
146 GList *search_matches_sorted; /**< \a search_matches sorted by order of entry into thread pool */
147 gint queue_count; /**< Incremented each time an item is pushed onto the similarity thread pool */
148 gint thread_count; /**< Incremented each time a similarity check thread item is completed */
149 GMutex thread_count_mutex;
150 gboolean abort; /**< Stop the similarity check thread queue */
154 DupeWindow *dupe_window_new(void);
156 void dupe_window_clear(DupeWindow *dw);
157 void dupe_window_close(DupeWindow *dw);
159 void dupe_window_add_collection(DupeWindow *dw, CollectionData *collection);
160 void dupe_window_add_files(DupeWindow *dw, GList *list, gboolean recurse);
162 void cell_renderer_height_override(GtkCellRenderer *renderer); /**< cell max with/height hack utility */
165 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */