diff options
Diffstat (limited to 'src/nautilus-rename-file-popover-controller.c')
-rw-r--r-- | src/nautilus-rename-file-popover-controller.c | 191 |
1 files changed, 118 insertions, 73 deletions
diff --git a/src/nautilus-rename-file-popover-controller.c b/src/nautilus-rename-file-popover-controller.c index 5806315fb..2c10e07e2 100644 --- a/src/nautilus-rename-file-popover-controller.c +++ b/src/nautilus-rename-file-popover-controller.c @@ -38,14 +38,53 @@ struct _NautilusRenameFilePopoverController gboolean target_is_folder; GtkWidget *rename_file_popover; + GtkWidget *name_entry; + GtkWidget *name_label; gint closed_handler_id; gint file_changed_handler_id; + gint key_press_event_handler_id; }; G_DEFINE_TYPE (NautilusRenameFilePopoverController, nautilus_rename_file_popover_controller, NAUTILUS_TYPE_FILE_NAME_WIDGET_CONTROLLER) static void +disconnect_signal_handlers (NautilusRenameFilePopoverController *self) +{ + g_assert (NAUTILUS_IS_RENAME_FILE_POPOVER_CONTROLLER (self)); + + if (self->closed_handler_id != 0) + { + g_signal_handler_disconnect (self->rename_file_popover, self->closed_handler_id); + self->closed_handler_id = 0; + } + + if (self->file_changed_handler_id != 0) + { + g_signal_handler_disconnect (self->target_file, self->file_changed_handler_id); + self->file_changed_handler_id = 0; + } + + if (self->key_press_event_handler_id != 0) + { + g_signal_handler_disconnect (self->name_entry, self->key_press_event_handler_id); + self->key_press_event_handler_id = 0; + } +} + +static void +reset_state (NautilusRenameFilePopoverController *self) +{ + g_assert (NAUTILUS_IS_RENAME_FILE_POPOVER_CONTROLLER (self)); + + disconnect_signal_handlers (self); + + g_clear_object (&self->target_file); + + gtk_popover_popdown (GTK_POPOVER (self->rename_file_popover)); +} + +static void rename_file_popover_controller_on_closed (GtkPopover *popover, gpointer user_data) { @@ -53,9 +92,7 @@ rename_file_popover_controller_on_closed (GtkPopover *popover, controller = NAUTILUS_RENAME_FILE_POPOVER_CONTROLLER (user_data); - g_signal_handler_disconnect (controller->rename_file_popover, - controller->closed_handler_id); - controller->closed_handler_id = 0; + reset_state (controller); g_signal_emit_by_name (controller, "cancelled"); } @@ -137,7 +174,7 @@ name_entry_on_f2_pressed (GtkWidget *widget, text_length = (guint) gtk_entry_get_text_length (GTK_ENTRY (widget)); if (text_length == 0) { - return GDK_EVENT_PROPAGATE; + return GDK_EVENT_STOP; } gtk_editable_get_selection_bounds (GTK_EDITABLE (widget), @@ -160,7 +197,7 @@ name_entry_on_f2_pressed (GtkWidget *widget, start_offset, end_offset); } - return GDK_EVENT_PROPAGATE; + return GDK_EVENT_STOP; } static gboolean @@ -212,18 +249,14 @@ target_file_on_changed (NautilusFile *file, if (nautilus_file_is_gone (file)) { - g_signal_handler_disconnect (controller->target_file, - controller->file_changed_handler_id); - controller->file_changed_handler_id = 0; + reset_state (controller); g_signal_emit_by_name (controller, "cancelled"); } } NautilusRenameFilePopoverController * -nautilus_rename_file_popover_controller_new (NautilusFile *target_file, - GdkRectangle *pointing_to, - GtkWidget *relative_to) +nautilus_rename_file_popover_controller_new (void) { NautilusRenameFilePopoverController *self; g_autoptr (GtkBuilder) builder = NULL; @@ -233,9 +266,6 @@ nautilus_rename_file_popover_controller_new (NautilusFile *target_file, GtkWidget *name_entry; GtkWidget *activate_button; GtkWidget *name_label; - NautilusDirectory *containing_directory; - g_autofree char *display_name = NULL; - gint n_chars; builder = gtk_builder_new_from_resource ("/org/gnome/nautilus/ui/nautilus-rename-file-popover.ui"); rename_file_popover = GTK_WIDGET (gtk_builder_get_object (builder, "rename_file_popover")); @@ -245,35 +275,67 @@ nautilus_rename_file_popover_controller_new (NautilusFile *target_file, activate_button = GTK_WIDGET (gtk_builder_get_object (builder, "rename_button")); name_label = GTK_WIDGET (gtk_builder_get_object (builder, "name_label")); - if (!nautilus_file_is_self_owned (target_file)) - { - NautilusFile *parent_location; + self = g_object_new (NAUTILUS_TYPE_RENAME_FILE_POPOVER_CONTROLLER, + "error-revealer", error_revealer, + "error-label", error_label, + "name-entry", name_entry, + "activate-button", activate_button, + NULL); + + self->rename_file_popover = g_object_ref_sink (rename_file_popover); + self->name_entry = name_entry; + self->name_label = name_label; + + gtk_popover_set_default_widget (GTK_POPOVER (rename_file_popover), name_entry); + + return self; +} + +NautilusFile * +nautilus_rename_file_popover_controller_get_target_file (NautilusRenameFilePopoverController *self) +{ + g_return_val_if_fail (NAUTILUS_IS_RENAME_FILE_POPOVER_CONTROLLER (self), NULL); + + return self->target_file; +} + +void +nautilus_rename_file_popover_controller_show_for_file (NautilusRenameFilePopoverController *self, + NautilusFile *target_file, + GdkRectangle *pointing_to, + GtkWidget *relative_to) +{ + g_autoptr (NautilusDirectory) containing_directory = NULL; + g_autofree gchar *display_name = NULL; + gint n_chars; + + g_assert (NAUTILUS_IS_RENAME_FILE_POPOVER_CONTROLLER (self)); + g_assert (NAUTILUS_IS_FILE (target_file)); - parent_location = nautilus_file_get_parent (target_file); - containing_directory = nautilus_directory_get_for_file (parent_location); + reset_state (self); - nautilus_file_unref (parent_location); + self->target_file = g_object_ref (target_file); + + if (!nautilus_file_is_self_owned (self->target_file)) + { + g_autoptr (NautilusFile) parent = NULL; + + parent = nautilus_file_get_parent (self->target_file); + containing_directory = nautilus_directory_get_for_file (parent); } else { - containing_directory = nautilus_directory_get_for_file (target_file); + containing_directory = nautilus_directory_get_for_file (self->target_file); } - self = g_object_new (NAUTILUS_TYPE_RENAME_FILE_POPOVER_CONTROLLER, - "error-revealer", error_revealer, - "error-label", error_label, - "name-entry", name_entry, - "activate-button", activate_button, - "containing-directory", containing_directory, NULL); - - self->target_is_folder = nautilus_file_is_directory (target_file); - self->target_file = nautilus_file_ref (target_file); + nautilus_file_name_widget_controller_set_containing_directory (NAUTILUS_FILE_NAME_WIDGET_CONTROLLER (self), + containing_directory); - self->rename_file_popover = rename_file_popover; + self->target_is_folder = nautilus_file_is_directory (self->target_file); - self->closed_handler_id = g_signal_connect (rename_file_popover, + self->closed_handler_id = g_signal_connect (self->rename_file_popover, "closed", - (GCallback) rename_file_popover_controller_on_closed, + G_CALLBACK (rename_file_popover_controller_on_closed), self); self->file_changed_handler_id = g_signal_connect (self->target_file, @@ -281,26 +343,25 @@ nautilus_rename_file_popover_controller_new (NautilusFile *target_file, G_CALLBACK (target_file_on_changed), self); - g_signal_connect (name_entry, - "key-press-event", - G_CALLBACK (name_entry_on_key_pressed), - self); + self->key_press_event_handler_id = g_signal_connect (self->name_entry, + "key-press-event", + G_CALLBACK (name_entry_on_key_pressed), + self); - gtk_label_set_text (GTK_LABEL (name_label), + gtk_label_set_text (GTK_LABEL (self->name_label), self->target_is_folder ? _("Folder name") : _("File name")); - display_name = nautilus_file_get_display_name (target_file); + display_name = nautilus_file_get_display_name (self->target_file); - gtk_entry_set_text (GTK_ENTRY (name_entry), display_name); + gtk_entry_set_text (GTK_ENTRY (self->name_entry), display_name); - gtk_popover_set_default_widget (GTK_POPOVER (rename_file_popover), name_entry); - gtk_popover_set_pointing_to (GTK_POPOVER (rename_file_popover), pointing_to); - gtk_popover_set_relative_to (GTK_POPOVER (rename_file_popover), relative_to); + gtk_popover_set_pointing_to (GTK_POPOVER (self->rename_file_popover), pointing_to); + gtk_popover_set_relative_to (GTK_POPOVER (self->rename_file_popover), relative_to); - gtk_popover_popup (GTK_POPOVER (rename_file_popover)); + gtk_popover_popup (GTK_POPOVER (self->rename_file_popover)); - if (nautilus_file_is_regular_file (target_file)) + if (nautilus_file_is_regular_file (self->target_file)) { gint start_offset; gint end_offset; @@ -308,31 +369,30 @@ nautilus_rename_file_popover_controller_new (NautilusFile *target_file, /* Select the name part without the file extension */ eel_filename_get_rename_region (display_name, &start_offset, &end_offset); - gtk_editable_select_region (GTK_EDITABLE (name_entry), + gtk_editable_select_region (GTK_EDITABLE (self->name_entry), start_offset, end_offset); } n_chars = g_utf8_strlen (display_name, -1); - gtk_entry_set_width_chars (GTK_ENTRY (name_entry), + gtk_entry_set_width_chars (GTK_ENTRY (self->name_entry), MIN (MAX (n_chars, RENAME_ENTRY_MIN_CHARS), RENAME_ENTRY_MAX_CHARS)); - - nautilus_directory_unref (containing_directory); - - return self; } -NautilusFile * -nautilus_rename_file_popover_controller_get_target_file (NautilusRenameFilePopoverController *self) +static void +on_name_accepted (NautilusFileNameWidgetController *controller) { - g_return_val_if_fail (NAUTILUS_IS_RENAME_FILE_POPOVER_CONTROLLER (self), NULL); + NautilusRenameFilePopoverController *self; - return self->target_file; + self = NAUTILUS_RENAME_FILE_POPOVER_CONTROLLER (controller); + + reset_state (self); } static void nautilus_rename_file_popover_controller_init (NautilusRenameFilePopoverController *self) { + g_signal_connect_after (self, "name-accepted", G_CALLBACK (on_name_accepted), self); } static void @@ -342,25 +402,10 @@ nautilus_rename_file_popover_controller_finalize (GObject *object) self = NAUTILUS_RENAME_FILE_POPOVER_CONTROLLER (object); - if (self->rename_file_popover) - { - if (self->closed_handler_id) - { - g_signal_handler_disconnect (self->rename_file_popover, - self->closed_handler_id); - self->closed_handler_id = 0; - } - gtk_popover_popdown (GTK_POPOVER (self->rename_file_popover)); - g_clear_pointer (&self->rename_file_popover, gtk_widget_destroy); - } + reset_state (self); - if (self->file_changed_handler_id != 0) - { - g_signal_handler_disconnect (self->target_file, - self->file_changed_handler_id); - self->file_changed_handler_id = 0; - } - nautilus_file_unref (self->target_file); + gtk_widget_destroy (self->rename_file_popover); + g_clear_object (&self->rename_file_popover); G_OBJECT_CLASS (nautilus_rename_file_popover_controller_parent_class)->finalize (object); } |