1 /*
2  * Copyright (C) 2004 John Ellis
3  * Copyright (C) 2008 - 2016 The Geeqie Team
4  *
5  * Author: John Ellis
6  *
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.
11  *
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.
16  *
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.
20  */
21 
22 #ifndef DUPE_H
23 #define DUPE_H
24 
25 #include "similar.h"
26 
27 /* match methods */
28 typedef enum
29 {
30 	DUPE_MATCH_NONE = 0,
31 	DUPE_MATCH_NAME = 1 << 0,
32 	DUPE_MATCH_SIZE = 1 << 1,
33 	DUPE_MATCH_DATE = 1 << 2,
34 	DUPE_MATCH_DIM  = 1 << 3,	/* image dimensions */
35 	DUPE_MATCH_SUM  = 1 << 4,	/* MD5sum */
36 	DUPE_MATCH_PATH = 1 << 5,
37 	DUPE_MATCH_SIM_HIGH = 1 << 6,	/* similarity */
38 	DUPE_MATCH_SIM_MED  = 1 << 7,
39 	DUPE_MATCH_SIM_LOW  = 1 << 8,
40 	DUPE_MATCH_SIM_CUSTOM = 1 << 9,
41 	DUPE_MATCH_NAME_CI = 1 << 10,	/* same as name, but case insensitive */
42 	DUPE_MATCH_NAME_CONTENT = 1 << 11,	/* same name, but different content */
43 	DUPE_MATCH_NAME_CI_CONTENT = 1 << 12,	/* same name - case insensitive, but different content */
44 	DUPE_MATCH_ALL = 1 << 13 /* N.B. this is used as a clamp value in rcfile.c */
45 } DupeMatchType;
46 
47 typedef enum
48 {
49 	DUPE_SELECT_NONE,
50 	DUPE_SELECT_GROUP1,
51 	DUPE_SELECT_GROUP2
52 } DupeSelectType;
53 
54 typedef struct _DupeItem DupeItem;
55 struct _DupeItem
56 {
57 	CollectionData *collection;	/* NULL if from DupeWindow->files */
58 	CollectInfo *info;
59 
60 	FileData *fd;
61 
62 	gchar *md5sum;
63 	gint width;
64 	gint height;
65 
66 	ImageSimilarityData *simd;
67 
68 	/* thumb */
69 	GdkPixbuf *pixbuf;
70 
71 	GList *group;			/* List of match data */
72 	gdouble group_rank;
73 
74 	gint second;
75 };
76 
77 typedef struct _DupeMatch DupeMatch;
78 struct _DupeMatch
79 {
80 	DupeItem *di;
81 	gdouble rank;
82 };
83 
84 typedef struct _DupeWindow DupeWindow;
85 struct _DupeWindow
86 {
87 	GList *list;			/* dropped files (DupeItem) */
88 	GList *dupes;			/* list of dupes (DupeItem, grouping the DupeMatches) */
89 	DupeMatchType match_mask;	/* mask of things to check for match */
90 
91 	GtkWidget *window;
92 	GtkWidget *table;
93 	GtkWidget *listview;
94 	GtkWidget *combo;
95 	GtkWidget *status_label;
96 	GtkWidget *extra_label;
97 	GtkWidget *button_thumbs;
98 	GtkWidget *button_rotation_invariant;
99 	GtkWidget *custom_threshold;
100 	GList *add_files_queue;
101 	guint add_files_queue_id;
102 	GtkWidget *controls_box;
103 
104 	gboolean show_thumbs;
105 
106 	guint idle_id; /* event source id */
107 	GList *working;
108 	gint setup_done;
109 	gint setup_count;
110 	gint setup_n;			/* these are merely for speed optimization */
111 	GList *setup_point;		/* ditto */
112 	DupeMatchType setup_mask;	/* ditto */
113 	guint64 setup_time;
114 	guint64 setup_time_count;
115 
116 	DupeItem *click_item;		/* for popup menu */
117 
118 	ThumbLoader *thumb_loader;
119 	DupeItem *thumb_item;
120 
121 	ImageLoader *img_loader;
122 
123 	GtkTreeSortable *sortable;
124 	gint set_count;
125 
126 	/* second set comparison stuff */
127 
128 	gboolean second_set;		/* second set enabled ? */
129 	GList *second_list;		/* second set dropped files */
130 	gboolean second_drop;		/* drop is on second set */
131 
132 	GtkWidget *second_vbox;		/* box of second widgets */
133 	GtkWidget *second_listview;
134 	GtkWidget *second_status_label;
135 
136 	gboolean color_frozen;
137 };
138 
139 
140 DupeWindow *dupe_window_new(void);
141 
142 void dupe_window_clear(DupeWindow *dw);
143 void dupe_window_close(DupeWindow *dw);
144 
145 void dupe_window_add_collection(DupeWindow *dw, CollectionData *collection);
146 void dupe_window_add_files(DupeWindow *dw, GList *list, gboolean recurse);
147 
148 /* cell max with/height hack utility */
149 void cell_renderer_height_override(GtkCellRenderer *renderer);
150 
151 
152 #endif
153 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
154