From 521629986e62a0aa4b413f5cf255eb72c0db7ebf Mon Sep 17 00:00:00 2001
From: Colin Clark
Date: Thu, 16 Aug 2018 19:48:59 +0100
Subject: [PATCH] Bug fix #624: Filter files by shell or regular expression
pattern
https://github.com/BestImageViewer/geeqie/issues/624
Show new entries in the combo box
Permit entries to be deleted (select the entry, click on the text box,
press delete, press enter)
---
doc/docbook/GuideMainWindowFilePane.xml | 6 ++
src/layout_util.c | 4 +-
src/typedefs.h | 9 ++-
src/view_file/view_file.c | 86 +++++++++++++++++++------
web/help/GuideMainWindowFilePane.html | 6 ++
5 files changed, 88 insertions(+), 23 deletions(-)
diff --git a/doc/docbook/GuideMainWindowFilePane.xml b/doc/docbook/GuideMainWindowFilePane.xml
index 98b24930..fa086051 100644
--- a/doc/docbook/GuideMainWindowFilePane.xml
+++ b/doc/docbook/GuideMainWindowFilePane.xml
@@ -74,6 +74,12 @@
To make a case-insensitive search, use "(?i)JPG"
If you type a newline, the text will be saved in the dropdown box list. The last 10 items are saved.
+
+ To delete an item, select it from the drop-down list, click on the text box to select the text, and then press
+ Delete
+ followed by
+ Enter
+ .
diff --git a/src/layout_util.c b/src/layout_util.c
index cf1cf46f..a618f7aa 100644
--- a/src/layout_util.c
+++ b/src/layout_util.c
@@ -118,9 +118,9 @@ gboolean layout_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpointer dat
}
}
- if (lw->vf->file_filter_combo && gtk_widget_has_focus(gtk_bin_get_child(GTK_BIN(lw->vf->file_filter_combo))))
+ if (lw->vf->file_filter.combo && gtk_widget_has_focus(gtk_bin_get_child(GTK_BIN(lw->vf->file_filter.combo))))
{
- if (gtk_widget_event(gtk_bin_get_child(GTK_BIN(lw->vf->file_filter_combo)), (GdkEvent *)event))
+ if (gtk_widget_event(gtk_bin_get_child(GTK_BIN(lw->vf->file_filter.combo)), (GdkEvent *)event))
{
return TRUE;
}
diff --git a/src/typedefs.h b/src/typedefs.h
index 1217eac0..4664dc68 100644
--- a/src/typedefs.h
+++ b/src/typedefs.h
@@ -862,8 +862,13 @@ struct _ViewFile
GtkWidget *scrolled;
GtkWidget *filter;
GtkWidget *filter_check[FILEDATA_MARKS_SIZE];
- GtkWidget *file_filter_combo;
- GtkWidget *file_filter_frame;
+
+ struct {
+ GtkWidget *combo;
+ GtkWidget *frame;
+ gint count;
+ gint last_selected;
+ } file_filter;
FileData *dir_fd;
GList *list;
diff --git a/src/view_file/view_file.c b/src/view_file/view_file.c
index 15324506..66fe6c8c 100644
--- a/src/view_file/view_file.c
+++ b/src/view_file/view_file.c
@@ -849,11 +849,56 @@ static void vf_file_filter_save_cb(GtkWidget *widget, gpointer data)
{
ViewFile *vf = data;
gchar *entry_text;
+ gchar *remove_text = NULL;
+ gchar *index_text = NULL;
+ gboolean text_found = FALSE;
+ gint i;
- entry_text = g_strdup(gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(vf->file_filter_combo)))));
+ entry_text = g_strdup(gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(vf->file_filter.combo)))));
- history_list_add_to_key("file_filter", entry_text, 10);
+ if (entry_text[0] == '\0' && vf->file_filter.last_selected >= 0)
+ {
+ gtk_combo_box_set_active(GTK_COMBO_BOX(vf->file_filter.combo), vf->file_filter.last_selected);
+ remove_text = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(vf->file_filter.combo));
+ history_list_item_remove("file_filter", remove_text);
+ gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(vf->file_filter.combo), vf->file_filter.last_selected);
+ g_free(remove_text);
+
+ gtk_combo_box_set_active(GTK_COMBO_BOX(vf->file_filter.combo), -1);
+ vf->file_filter.last_selected = - 1;
+ gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(vf->file_filter.combo))), "");
+ vf->file_filter.count--;
+ }
+ else
+ {
+ if (entry_text[0] != '\0')
+ {
+ for (i = 0; i < vf->file_filter.count; i++)
+ {
+ if (index_text)
+ {
+ g_free(index_text);
+ }
+ gtk_combo_box_set_active(GTK_COMBO_BOX(vf->file_filter.combo), i);
+ index_text = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(vf->file_filter.combo));
+
+ if (g_strcmp0(index_text, entry_text) == 0)
+ {
+ text_found = TRUE;
+ break;
+ }
+ }
+ g_free(index_text);
+ if (!text_found)
+ {
+ history_list_add_to_key("file_filter", entry_text, 10);
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(vf->file_filter.combo), entry_text);
+ vf->file_filter.count++;
+ gtk_combo_box_set_active(GTK_COMBO_BOX(vf->file_filter.combo), vf->file_filter.count - 1);
+ }
+ }
+ }
vf_refresh(vf);
g_free(entry_text);
@@ -869,6 +914,7 @@ static void vf_file_filter_cb(GtkWidget *widget, gpointer data)
static gboolean vf_file_filter_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
{
ViewFile *vf = data;
+ vf->file_filter.last_selected = gtk_combo_box_get_active(GTK_COMBO_BOX(vf->file_filter.combo));
gtk_widget_grab_focus(widget);
@@ -904,13 +950,13 @@ void vf_file_filter_set(ViewFile *vf, gboolean enable)
{
if (enable)
{
- gtk_widget_show(vf->file_filter_combo);
- gtk_widget_show(vf->file_filter_frame);
+ gtk_widget_show(vf->file_filter.combo);
+ gtk_widget_show(vf->file_filter.frame);
}
else
{
- gtk_widget_hide(vf->file_filter_combo);
- gtk_widget_hide(vf->file_filter_frame);
+ gtk_widget_hide(vf->file_filter.combo);
+ gtk_widget_hide(vf->file_filter.frame);
}
vf_refresh(vf);
@@ -924,31 +970,33 @@ static GtkWidget *vf_file_filter_init(ViewFile *vf)
gint n = 0;
GtkWidget *combo_entry;
- vf->file_filter_combo = gtk_combo_box_text_new_with_entry();
- combo_entry = gtk_bin_get_child(GTK_BIN(vf->file_filter_combo));
- gtk_widget_show(gtk_bin_get_child(GTK_BIN(vf->file_filter_combo)));
- gtk_widget_show((GTK_WIDGET(vf->file_filter_combo)));
+ vf->file_filter.combo = gtk_combo_box_text_new_with_entry();
+ combo_entry = gtk_bin_get_child(GTK_BIN(vf->file_filter.combo));
+ gtk_widget_show(gtk_bin_get_child(GTK_BIN(vf->file_filter.combo)));
+ gtk_widget_show((GTK_WIDGET(vf->file_filter.combo)));
+ gtk_widget_set_tooltip_text(GTK_WIDGET(vf->file_filter.combo), "Use regular expressions");
work = history_list_get_by_key("file_filter");
while (work)
{
- gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(vf->file_filter_combo), (gchar *)work->data);
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(vf->file_filter.combo), (gchar *)work->data);
work = work->next;
n++;
+ vf->file_filter.count = n;
}
- gtk_combo_box_set_active(GTK_COMBO_BOX(vf->file_filter_combo), 0);
+ gtk_combo_box_set_active(GTK_COMBO_BOX(vf->file_filter.combo), 0);
g_signal_connect(G_OBJECT(combo_entry), "activate",
G_CALLBACK(vf_file_filter_save_cb), vf);
- g_signal_connect(G_OBJECT(vf->file_filter_combo), "changed",
+ g_signal_connect(G_OBJECT(vf->file_filter.combo), "changed",
G_CALLBACK(vf_file_filter_cb), vf);
g_signal_connect(G_OBJECT(combo_entry), "button_press_event",
G_CALLBACK(vf_file_filter_press_cb), vf);
- gtk_box_pack_start(GTK_BOX(hbox), vf->file_filter_combo, FALSE, FALSE, 0);
- gtk_widget_show(vf->file_filter_combo);
+ gtk_box_pack_start(GTK_BOX(hbox), vf->file_filter.combo, FALSE, FALSE, 0);
+ gtk_widget_show(vf->file_filter.combo);
gtk_container_add(GTK_CONTAINER(frame), hbox);
gtk_widget_show(hbox);
@@ -979,11 +1027,11 @@ ViewFile *vf_new(FileViewType type, FileData *dir_fd)
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
vf->filter = vf_marks_filter_init(vf);
- vf->file_filter_frame = vf_file_filter_init(vf);
+ vf->file_filter.frame = vf_file_filter_init(vf);
vf->widget = gtk_vbox_new(FALSE, 0);
gtk_box_pack_start(GTK_BOX(vf->widget), vf->filter, FALSE, FALSE, 0);
- gtk_box_pack_start(GTK_BOX(vf->widget), vf->file_filter_frame, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(vf->widget), vf->file_filter.frame, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(vf->widget), vf->scrolled, TRUE, TRUE, 0);
gtk_widget_show(vf->scrolled);
@@ -1264,12 +1312,12 @@ GRegex *vf_file_filter_get_filter(ViewFile *vf)
GError *error = NULL;
gchar *file_filter_text = NULL;
- if (!gtk_widget_get_visible(vf->file_filter_combo))
+ if (!gtk_widget_get_visible(vf->file_filter.combo))
{
return g_regex_new("", 0, 0, NULL);
}
- file_filter_text = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(vf->file_filter_combo));
+ file_filter_text = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(vf->file_filter.combo));
if (file_filter_text[0] != '\0')
{
diff --git a/web/help/GuideMainWindowFilePane.html b/web/help/GuideMainWindowFilePane.html
index 6b062e2f..5dd5ac1f 100644
--- a/web/help/GuideMainWindowFilePane.html
+++ b/web/help/GuideMainWindowFilePane.html
@@ -549,6 +549,12 @@ dd.answer div.label { float: left; }
To make a case-insensitive search, use "(?i)JPG"
If you type a newline, the text will be saved in the dropdown box list. The last 10 items are saved.
+
+ To delete an item, select it from the drop-down list, click on the text box to select the text, and then press
+ Delete
+ followed by
+ Enter
+ .
--
2.20.1