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