diff options
-rw-r--r-- | configure.ac | 1 | ||||
m--------- | libgd | 0 | ||||
-rw-r--r-- | src/nautilus-query-editor.c | 91 |
3 files changed, 82 insertions, 10 deletions
diff --git a/configure.ac b/configure.ac index 972800954..6f191604f 100644 --- a/configure.ac +++ b/configure.ac @@ -297,6 +297,7 @@ LIBGD_INIT([ notification static _view-common + tagged-entry ]) AC_CONFIG_FILES([ diff --git a/libgd b/libgd -Subproject 04b2480259769709ec34d7ee48294878c94bbbb +Subproject 56a19ad9b056332ef07e508f1bdb6f03c6cb259 diff --git a/src/nautilus-query-editor.c b/src/nautilus-query-editor.c index 41430d034..ebfa84fcb 100644 --- a/src/nautilus-query-editor.c +++ b/src/nautilus-query-editor.c @@ -31,15 +31,22 @@ #include <gio/gio.h> #include <gdk/gdkkeysyms.h> #include <gtk/gtk.h> +#include <libgd/gd.h> #include <eel/eel-glib-extensions.h> #include <libnautilus-private/nautilus-file-utilities.h> +#include <libnautilus-private/nautilus-ui-utilities.h> #include <libnautilus-private/nautilus-global-preferences.h> typedef struct { GtkWidget *entry; GtkWidget *popover; GtkWidget *label; + GtkWidget *dropdown_button; + + GdTaggedEntryTag *mime_types_tag; + GdTaggedEntryTag *date_range_tag; + gboolean change_frozen; GFile *location; @@ -428,7 +435,7 @@ search_mode_changed_cb (GObject *editor, static void search_popover_date_range_changed_cb (NautilusSearchPopover *popover, - GPtrArray *data, + GPtrArray *date_range, NautilusQueryEditor *editor) { NautilusQueryEditorPrivate *priv; @@ -437,7 +444,19 @@ search_popover_date_range_changed_cb (NautilusSearchPopover *popover, if (!priv->query) create_query (editor); - nautilus_query_set_date_range (priv->query, data); + gd_tagged_entry_remove_tag (GD_TAGGED_ENTRY (priv->entry), + priv->date_range_tag); + if (date_range) { + g_autofree gchar *text_for_date_range; + + text_for_date_range = get_text_for_date_range (date_range); + gd_tagged_entry_tag_set_label (priv->date_range_tag, + text_for_date_range); + gd_tagged_entry_add_tag (GD_TAGGED_ENTRY (priv->entry), + GD_TAGGED_ENTRY_TAG (priv->date_range_tag)); + } + + nautilus_query_set_date_range (priv->query, date_range); nautilus_query_editor_changed (editor); } @@ -449,16 +468,31 @@ search_popover_mime_type_changed_cb (NautilusSearchPopover *popover, NautilusQueryEditor *editor) { NautilusQueryEditorPrivate *priv; - GList *mimetypes; + GList *mimetypes = NULL; priv = nautilus_query_editor_get_instance_private (NAUTILUS_QUERY_EDITOR (editor)); if (!priv->query) create_query (editor); - if (mimetype_group >= 0) { + gd_tagged_entry_remove_tag (GD_TAGGED_ENTRY (priv->entry), + priv->mime_types_tag); + /* group 0 is anything */ + if (mimetype_group == 0) { + mimetypes = nautilus_mime_types_group_get_mimetypes (mimetype_group); + } else if (mimetype_group > 0) { mimetypes = nautilus_mime_types_group_get_mimetypes (mimetype_group); + gd_tagged_entry_tag_set_label (priv->mime_types_tag, + nautilus_mime_types_group_get_name (mimetype_group)); + gd_tagged_entry_add_tag (GD_TAGGED_ENTRY (priv->entry), + GD_TAGGED_ENTRY_TAG (priv->mime_types_tag)); } else { + g_autofree gchar *display_name; + mimetypes = g_list_append (NULL, (gpointer) mimetype); + display_name = g_content_type_get_description (mimetype); + gd_tagged_entry_tag_set_label (priv->mime_types_tag, display_name); + gd_tagged_entry_add_tag (GD_TAGGED_ENTRY (priv->entry), + GD_TAGGED_ENTRY_TAG (priv->mime_types_tag)); } nautilus_query_set_mime_types (priv->query, mimetypes); @@ -484,10 +518,35 @@ search_popover_time_type_changed_cb (NautilusSearchPopover *popover, } static void +entry_tag_clicked (NautilusQueryEditor *editor) +{ + NautilusQueryEditorPrivate *priv; + priv = nautilus_query_editor_get_instance_private (editor); + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->dropdown_button), + TRUE); +} + +static void +entry_tag_close_button_clicked (NautilusQueryEditor *editor, + GdTaggedEntryTag *tag) +{ + NautilusQueryEditorPrivate *priv; + priv = nautilus_query_editor_get_instance_private (editor); + + if (tag == priv->mime_types_tag) { + nautilus_search_popover_reset_mime_types (NAUTILUS_SEARCH_POPOVER (priv->popover)); + } else { + nautilus_search_popover_reset_date_range (NAUTILUS_SEARCH_POPOVER (priv->popover)); + } +} + +static void setup_widgets (NautilusQueryEditor *editor) { NautilusQueryEditorPrivate *priv; - GtkWidget *button, *hbox, *vbox; + GtkWidget *hbox; + GtkWidget *vbox; priv = nautilus_query_editor_get_instance_private (editor); @@ -501,12 +560,24 @@ setup_widgets (NautilusQueryEditor *editor) gtk_container_add (GTK_CONTAINER (vbox), hbox); /* create the search entry */ - priv->entry = gtk_search_entry_new (); - gtk_entry_set_width_chars (GTK_ENTRY (priv->entry), 40); + priv->entry = GTK_WIDGET (gd_tagged_entry_new ()); + gtk_widget_set_size_request (GTK_WIDGET (priv->entry), 400, -1); gtk_search_bar_connect_entry (GTK_SEARCH_BAR (editor), GTK_ENTRY (priv->entry)); gtk_container_add (GTK_CONTAINER (hbox), priv->entry); + priv->mime_types_tag = gd_tagged_entry_tag_new (NULL); + priv->date_range_tag = gd_tagged_entry_tag_new (NULL); + + g_signal_connect_swapped (priv->entry, + "tag-clicked", + G_CALLBACK (entry_tag_clicked), + editor); + g_signal_connect_swapped (priv->entry, + "tag-button-clicked", + G_CALLBACK (entry_tag_close_button_clicked), + editor); + /* additional information label */ priv->label = gtk_label_new (NULL); gtk_widget_set_no_show_all (priv->label, TRUE); @@ -522,9 +593,9 @@ setup_widgets (NautilusQueryEditor *editor) G_BINDING_DEFAULT); /* setup the filter menu button */ - button = gtk_menu_button_new (); - gtk_menu_button_set_popover (GTK_MENU_BUTTON (button), priv->popover); - gtk_container_add (GTK_CONTAINER (hbox), button); + priv->dropdown_button = gtk_menu_button_new (); + gtk_menu_button_set_popover (GTK_MENU_BUTTON (priv->dropdown_button), priv->popover); + gtk_container_add (GTK_CONTAINER (hbox), priv->dropdown_button); g_signal_connect (editor, "notify::search-mode-enabled", G_CALLBACK (search_mode_changed_cb), NULL); |