diff options
-rw-r--r-- | src/nautilus-query-editor.c | 130 | ||||
-rw-r--r-- | src/resources/css/Adwaita.css | 19 |
2 files changed, 105 insertions, 44 deletions
diff --git a/src/nautilus-query-editor.c b/src/nautilus-query-editor.c index c36d0026a..07d9497e0 100644 --- a/src/nautilus-query-editor.c +++ b/src/nautilus-query-editor.c @@ -41,6 +41,7 @@ struct _NautilusQueryEditor GtkWidget parent_instance; GtkWidget *entry; + GtkWidget *clear_icon; GtkWidget *popover; GtkWidget *dropdown_button; @@ -49,6 +50,7 @@ struct _NautilusQueryEditor GdTaggedEntryTag *date_range_tag; #endif + guint search_changed_timeout_id; gboolean change_frozen; GFile *location; @@ -83,6 +85,8 @@ static void nautilus_query_editor_changed (NautilusQueryEditor *editor); G_DEFINE_TYPE (NautilusQueryEditor, nautilus_query_editor, GTK_TYPE_WIDGET); +#define SEARCH_CHANGED_TIMEOUT 150 + static void update_fts_sensitivity (NautilusQueryEditor *editor) { @@ -135,8 +139,12 @@ nautilus_query_editor_dispose (GObject *object) editor = NAUTILUS_QUERY_EDITOR (object); + g_clear_handle_id (&editor->search_changed_timeout_id, g_source_remove); + + gtk_widget_unparent (gtk_widget_get_first_child (GTK_WIDGET (editor))); g_clear_pointer (&editor->entry, gtk_widget_unparent); g_clear_pointer (&editor->dropdown_button, gtk_widget_unparent); + g_clear_pointer (&editor->clear_icon, gtk_widget_unparent); g_clear_object (&editor->location); g_clear_object (&editor->query); @@ -157,7 +165,7 @@ nautilus_query_editor_grab_focus (GtkWidget *widget) if (gtk_widget_get_visible (widget) && !gtk_widget_is_focus (editor->entry)) { - return gtk_widget_grab_focus (editor->entry); + return gtk_text_grab_focus_without_selecting (GTK_TEXT (editor->entry)); } return FALSE; @@ -296,6 +304,10 @@ nautilus_query_editor_class_init (NautilusQueryEditorClass *class) gtk_signal_action_new ("focus-view")); gtk_widget_class_add_shortcut (widget_class, shortcut); + gtk_widget_class_add_binding_signal (widget_class, + GDK_KEY_Escape, 0, "cancel", + NULL); + /** * NautilusQueryEditor::location: * @@ -324,6 +336,8 @@ nautilus_query_editor_class_init (NautilusQueryEditorClass *class) G_PARAM_READWRITE)); gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BOX_LAYOUT); + gtk_widget_class_set_css_name (widget_class, "entry"); + gtk_widget_class_set_accessible_role (widget_class, GTK_ACCESSIBLE_ROLE_TEXT_BOX); } GFile * @@ -373,14 +387,15 @@ entry_activate_cb (GtkWidget *entry, g_signal_emit (editor, signals[ACTIVATED], 0); } -static void -entry_changed_cb (GtkWidget *entry, - NautilusQueryEditor *editor) +static gboolean +entry_changed_internal (NautilusQueryEditor *editor) { - if (editor->change_frozen) - { - return; - } + const gchar *text = gtk_editable_get_text (GTK_EDITABLE (editor->entry)); + gboolean is_empty = (text == NULL && *text == '\0'); + + editor->search_changed_timeout_id = 0; + + gtk_widget_set_child_visible (editor->clear_icon, !is_empty); if (editor->query == NULL) { @@ -388,22 +403,28 @@ entry_changed_cb (GtkWidget *entry, } else { - g_autofree gchar *text = NULL; - - text = g_strdup (gtk_editable_get_text (GTK_EDITABLE (editor->entry))); - text = g_strstrip (text); - - nautilus_query_set_text (editor->query, text); + g_autofree gchar *stripped_text = g_strstrip (g_strdup (text)); + nautilus_query_set_text (editor->query, stripped_text); } nautilus_query_editor_changed (editor); + + return G_SOURCE_REMOVE; } static void -nautilus_query_editor_on_stop_search (GtkWidget *entry, - NautilusQueryEditor *editor) +entry_changed_cb (GtkWidget *entry, + NautilusQueryEditor *editor) { - g_signal_emit (editor, signals[CANCEL], 0); + if (editor->change_frozen) + { + return; + } + + g_clear_handle_id (&editor->search_changed_timeout_id, g_source_remove); + editor->search_changed_timeout_id = g_timeout_add (SEARCH_CHANGED_TIMEOUT, + G_SOURCE_FUNC (entry_changed_internal), + editor); } static void @@ -558,25 +579,62 @@ entry_tag_close_button_clicked (NautilusQueryEditor *editor, #endif static void +on_clear_icon_pressed (GtkGestureClick *gesture, + int n_press, + double x, + double y, + NautilusQueryEditor *self) +{ + gtk_gesture_set_state (GTK_GESTURE (gesture), GTK_EVENT_SEQUENCE_CLAIMED); +} + +static void +on_clear_icon_released (GtkGestureClick *gesture, + int n_press, + double x, + double y, + NautilusQueryEditor *self) +{ + gtk_editable_set_text (GTK_EDITABLE (self->entry), ""); +} + +static void nautilus_query_editor_init (NautilusQueryEditor *editor) { + gboolean rtl = (gtk_widget_get_direction (GTK_WIDGET (editor)) == GTK_TEXT_DIR_RTL); + GtkWidget *image; + GtkEventController *controller; + + gtk_widget_set_name (GTK_WIDGET (editor), "NautilusQueryEditor"); + gtk_widget_add_css_class (GTK_WIDGET (editor), "search"); + g_signal_connect (nautilus_preferences, "changed::recursive-search", G_CALLBACK (recursive_search_preferences_changed), editor); - gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET (editor)), "linked"); - /* create the search entry */ -#if 0 && TAGGED_ENTRY_NEEDS_GTK4_REIMPLEMENTATION - editor->entry = GTK_WIDGET (gd_tagged_entry_new ()); -#else - editor->entry = gtk_search_entry_new (); -#endif - gtk_widget_set_hexpand (editor->entry, TRUE); + image = gtk_image_new_from_icon_name ("system-search-symbolic"); + g_object_set (image, "accessible-role", GTK_ACCESSIBLE_ROLE_PRESENTATION, NULL); + gtk_widget_set_margin_start (image, 4); + gtk_widget_set_parent (image, GTK_WIDGET (editor)); + editor->entry = gtk_text_new (); + gtk_widget_set_hexpand (editor->entry, TRUE); gtk_widget_set_parent (editor->entry, GTK_WIDGET (editor)); + editor->clear_icon = gtk_image_new_from_icon_name (rtl ? "edit-clear-rtl-symbolic" : + "edit-clear-symbolic"); + g_object_set (editor->clear_icon, "accessible-role", GTK_ACCESSIBLE_ROLE_PRESENTATION, NULL); + gtk_widget_set_tooltip_text (editor->clear_icon, _("Clear entry")); + gtk_widget_set_child_visible (editor->clear_icon, FALSE); + gtk_widget_set_parent (editor->clear_icon, GTK_WIDGET (editor)); + + controller = GTK_EVENT_CONTROLLER (gtk_gesture_click_new ()); + g_signal_connect (controller, "pressed", G_CALLBACK (on_clear_icon_pressed), editor); + g_signal_connect (controller, "released", G_CALLBACK (on_clear_icon_released), editor); + gtk_widget_add_controller (editor->clear_icon, controller); + #if 0 && TAGGED_ENTRY_NEEDS_GTK4_REIMPLEMENTATION editor->mime_types_tag = gd_tagged_entry_tag_new (NULL); editor->date_range_tag = gd_tagged_entry_tag_new (NULL); @@ -607,13 +665,12 @@ nautilus_query_editor_init (NautilusQueryEditor *editor) editor->dropdown_button = gtk_menu_button_new (); gtk_menu_button_set_popover (GTK_MENU_BUTTON (editor->dropdown_button), editor->popover); gtk_widget_set_parent (editor->dropdown_button, GTK_WIDGET (editor)); + gtk_widget_add_css_class (editor->dropdown_button, "circular"); g_signal_connect (editor->entry, "activate", G_CALLBACK (entry_activate_cb), editor); - g_signal_connect (editor->entry, "search-changed", + g_signal_connect (editor->entry, "changed", G_CALLBACK (entry_changed_cb), editor); - g_signal_connect (editor->entry, "stop-search", - G_CALLBACK (nautilus_query_editor_on_stop_search), editor); g_signal_connect (editor->popover, "date-range", G_CALLBACK (search_popover_date_range_changed_cb), editor); g_signal_connect (editor->popover, "mime-type", @@ -774,7 +831,6 @@ nautilus_query_editor_handle_event (NautilusQueryEditor *self, guint keyval, GdkModifierType state) { - GtkWidget *text; g_return_val_if_fail (NAUTILUS_IS_QUERY_EDITOR (self), GDK_EVENT_PROPAGATE); g_return_val_if_fail (controller != NULL, GDK_EVENT_PROPAGATE); @@ -786,19 +842,5 @@ nautilus_query_editor_handle_event (NautilusQueryEditor *self, return GDK_EVENT_PROPAGATE; } - text = gtk_widget_get_first_child (GTK_WIDGET (self->entry)); - while (text != NULL) - { - if (GTK_IS_TEXT (text)) - { - break; - } - text = gtk_widget_get_next_sibling (text); - } - - if (text == NULL) - { - return FALSE; - } - return gtk_event_controller_key_forward (controller, text); + return gtk_event_controller_key_forward (controller, self->entry); } diff --git a/src/resources/css/Adwaita.css b/src/resources/css/Adwaita.css index af7e33ad7..ed943a0ed 100644 --- a/src/resources/css/Adwaita.css +++ b/src/resources/css/Adwaita.css @@ -78,6 +78,25 @@ opacity: 1; } +/* Search bar */ + +#NautilusQueryEditor > * { + margin-top: 5px; + margin-bottom: 5px; +} + +/* Mimic the style of GtkEntry icons, but keep button background if pressed. */ +#NautilusQueryEditor > menubutton > button { + min-width: 24px; + min-height: 24px; +} +#NautilusQueryEditor > menubutton > button:not(:checked) { + background: none; +} +#NautilusQueryEditor > menubutton > button:not(:hover):not(:checked) { + opacity: 0.7; +} + /* Floating status bar */ .floating-bar { padding: 3px; |