Additional option on Search/Image Class to search for broken images.
Broken being defined as of Class Image, Raw Image, Video or Document,
but Geeqie cannot display an image.
Also additional buttons for Help and Close.
</itemizedlist>\r
<note>\r
In this last case, the result of a search may contain the latitude/longitude embedded in the URL. This may be automatically decoded with the help of an external file:-\r
</itemizedlist>\r
<note>\r
In this last case, the result of a search may contain the latitude/longitude embedded in the URL. This may be automatically decoded with the help of an external file:-\r
- <programlisting xml:space="preserve">~/.config/geeqie/geocode-parameters.awk</programlisting>\r
+ <programlisting xml:space="preserve">$HOME/.config/geeqie/geocode-parameters.awk</programlisting>\r
See\r
<link linkend="GuideReferenceDecodeLatLong">Decoding Latitude and Longitude</link>\r
for details on how to create this file.\r
See\r
<link linkend="GuideReferenceDecodeLatLong">Decoding Latitude and Longitude</link>\r
for details on how to create this file.\r
<listitem>Image</listitem>\r
<listitem>Raw Image</listitem>\r
<listitem>Video</listitem>\r
<listitem>Image</listitem>\r
<listitem>Raw Image</listitem>\r
<listitem>Video</listitem>\r
+ <listitem>Document</listitem>\r
<listitem>Metadata</listitem>\r
<listitem>Metadata</listitem>\r
+ <listitem>Unknown</listitem>\r
+ <listitem>Broken (Of class Image, Raw Image, Video, or Document, but Geeqie cannot display an image)</listitem>\r
</itemizedlist>\r
</listitem>\r
</varlistentry>\r
</itemizedlist>\r
</listitem>\r
</varlistentry>\r
#define SEARCH_BUFFER_MATCH_MISS 1
#define SEARCH_BUFFER_FLUSH_SIZE 99
#define SEARCH_BUFFER_MATCH_MISS 1
#define SEARCH_BUFFER_FLUSH_SIZE 99
+#define FORMAT_CLASS_BROKEN FILE_FORMAT_CLASSES + 1
+
typedef enum {
SEARCH_MATCH_NONE,
SEARCH_MATCH_EQUAL,
typedef enum {
SEARCH_MATCH_NONE,
SEARCH_MATCH_EQUAL,
GtkWidget *label_progress;
GtkWidget *button_start;
GtkWidget *button_stop;
GtkWidget *label_progress;
GtkWidget *button_start;
GtkWidget *button_stop;
+ GtkWidget *button_close;
+ GtkWidget *button_help;
GtkWidget *spinner;
GtkWidget *box_search;
GtkWidget *spinner;
GtkWidget *box_search;
gboolean match_rating_enable;
gboolean match_class_enable;
gboolean match_marks_enable;
gboolean match_rating_enable;
gboolean match_class_enable;
gboolean match_marks_enable;
+ gboolean match_broken_enable;
GList *search_folder_list;
GList *search_done_list;
GList *search_folder_list;
GList *search_done_list;
filelist_free(sd->search_file_list);
sd->search_file_list = NULL;
filelist_free(sd->search_file_list);
sd->search_file_list = NULL;
+ sd->match_broken_enable = FALSE;
+
gtk_widget_set_sensitive(sd->box_search, TRUE);
spinner_set_interval(sd->spinner, -1);
gtk_widget_set_sensitive(sd->button_start, TRUE);
gtk_widget_set_sensitive(sd->box_search, TRUE);
spinner_set_interval(sd->spinner, -1);
gtk_widget_set_sensitive(sd->button_start, TRUE);
pixbuf = image_loader_get_pixbuf(sd->img_loader);
pixbuf = image_loader_get_pixbuf(sd->img_loader);
+ /* Used to determnine if image is broken
+ */
+ if (cd && !pixbuf)
+ {
+ if (!cd->dimensions)
+ {
+ cache_sim_data_set_dimensions(cd, -1, -1);
+ }
+ }
+ else if (cd && pixbuf)
- if ((sd->match_dimensions_enable && !sd->img_cd->dimensions) ||
- (sd->match_similarity_enable && !sd->img_cd->similarity))
+ if ((sd->match_dimensions_enable && !sd->img_cd->dimensions) || (sd->match_similarity_enable && !sd->img_cd->similarity || sd->match_broken_enable))
{
sd->img_loader = image_loader_new(fd);
g_signal_connect(G_OBJECT(sd->img_loader), "error", (GCallback)search_file_load_done_cb, sd);
{
sd->img_loader = image_loader_new(fd);
g_signal_connect(G_OBJECT(sd->img_loader), "error", (GCallback)search_file_load_done_cb, sd);
+ if (sd->match_broken_enable)
+ {
+ tested = TRUE;
+ tmatch = FALSE;
+ if (sd->match_class == SEARCH_MATCH_EQUAL && sd->img_cd->width == -1)
+ {
+ tmatch = TRUE;
+ }
+ else if (sd->match_class == SEARCH_MATCH_NONE && sd->img_cd->width != -1)
+ {
+ tmatch = TRUE;
+ }
+ }
+
if (tmatch && sd->match_dimensions_enable && sd->img_cd->dimensions)
{
CacheData *cd = sd->img_cd;
if (tmatch && sd->match_dimensions_enable && sd->img_cd->dimensions)
{
CacheData *cd = sd->img_cd;
{
search_class = FORMAT_CLASS_META;
}
{
search_class = FORMAT_CLASS_META;
}
+ else if (g_strcmp0(gtk_combo_box_text_get_active_text(
+ GTK_COMBO_BOX_TEXT(sd->class_type)), _("Unknown")) == 0)
{
search_class = FORMAT_CLASS_UNKNOWN;
}
{
search_class = FORMAT_CLASS_UNKNOWN;
}
+ else
+ {
+ search_class = FORMAT_CLASS_BROKEN;
+ }
- class = fd->format_class;
- if (sd->match_class == SEARCH_MATCH_EQUAL)
+ if (search_class != FORMAT_CLASS_BROKEN)
- match = (class == search_class);
+ class = fd->format_class;
+ if (sd->match_class == SEARCH_MATCH_EQUAL)
+ {
+ match = (class == search_class);
+ }
+ else if (sd->match_class == SEARCH_MATCH_NONE)
+ {
+ match = (class != search_class);
+ }
- else if (sd->match_class == SEARCH_MATCH_NONE)
- match = (class != search_class);
+ if (fd->format_class == FORMAT_CLASS_IMAGE || fd->format_class == FORMAT_CLASS_RAWIMAGE || fd->format_class == FORMAT_CLASS_VIDEO || fd->format_class == FORMAT_CLASS_DOCUMENT)
+ {
+ sd->match_broken_enable = TRUE;
+ }
+ else
+ {
+ sd->match_broken_enable = FALSE;
+ }
- if ((match || extra_only) && (sd->match_dimensions_enable ||
- sd ->match_similarity_enable))
+ if (((match || extra_only) && sd->match_dimensions_enable || sd->match_similarity_enable || sd->match_broken_enable))
gtk_widget_destroy(sd->window);
}
gtk_widget_destroy(sd->window);
}
+static void search_window_close_cb(GtkWidget *widget, gpointer data)
+{
+ SearchData *sd = data;
+
+ search_window_close(sd);
+}
+
+static void search_window_help_cb(GtkWidget *widget, gpointer data)
+{
+ help_window_show("GuideImageSearchSearch.html");
+}
+
static gboolean search_window_delete_cb(GtkWidget *widget, GdkEventAny *event, gpointer data)
{
SearchData *sd = data;
static gboolean search_window_delete_cb(GtkWidget *widget, GdkEventAny *event, gpointer data)
{
SearchData *sd = data;
gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(sd->class_type), _("Document"));
gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(sd->class_type), _("Metadata"));
gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(sd->class_type), _("Unknown"));
gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(sd->class_type), _("Document"));
gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(sd->class_type), _("Metadata"));
gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(sd->class_type), _("Unknown"));
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(sd->class_type), _("Broken"));
gtk_box_pack_start(GTK_BOX(hbox), sd->class_type, FALSE, FALSE, 0);
gtk_combo_box_set_active(GTK_COMBO_BOX(sd->class_type), 0);
gtk_widget_show(sd->class_type);
gtk_box_pack_start(GTK_BOX(hbox), sd->class_type, FALSE, FALSE, 0);
gtk_combo_box_set_active(GTK_COMBO_BOX(sd->class_type), 0);
gtk_widget_show(sd->class_type);
gtk_box_pack_start(GTK_BOX(hbox), sd->spinner, FALSE, FALSE, 0);
gtk_widget_show(sd->spinner);
gtk_box_pack_start(GTK_BOX(hbox), sd->spinner, FALSE, FALSE, 0);
gtk_widget_show(sd->spinner);
+ sd->button_help = pref_button_new(hbox, GTK_STOCK_HELP, NULL, FALSE, G_CALLBACK(search_window_help_cb), sd);
+ gtk_widget_set_sensitive(sd->button_help, TRUE);
+ pref_spacer(hbox, PREF_PAD_BUTTON_GAP);
sd->button_start = pref_button_new(hbox, GTK_STOCK_FIND, NULL, FALSE,
G_CALLBACK(search_start_cb), sd);
pref_spacer(hbox, PREF_PAD_BUTTON_GAP);
sd->button_stop = pref_button_new(hbox, GTK_STOCK_STOP, NULL, FALSE,
G_CALLBACK(search_start_cb), sd);
gtk_widget_set_sensitive(sd->button_stop, FALSE);
sd->button_start = pref_button_new(hbox, GTK_STOCK_FIND, NULL, FALSE,
G_CALLBACK(search_start_cb), sd);
pref_spacer(hbox, PREF_PAD_BUTTON_GAP);
sd->button_stop = pref_button_new(hbox, GTK_STOCK_STOP, NULL, FALSE,
G_CALLBACK(search_start_cb), sd);
gtk_widget_set_sensitive(sd->button_stop, FALSE);
+ pref_spacer(hbox, PREF_PAD_BUTTON_GAP);
+ sd->button_close = pref_button_new(hbox, GTK_STOCK_CLOSE, NULL, FALSE, G_CALLBACK(search_window_close_cb), sd);
+ gtk_widget_set_sensitive(sd->button_close, TRUE);
search_status_update(sd);
search_progress_update(sd, FALSE, -1.0);
search_status_update(sd);
search_progress_update(sd, FALSE, -1.0);