diff options
Diffstat (limited to 'src/nautilus-view.c')
-rw-r--r-- | src/nautilus-view.c | 167 |
1 files changed, 119 insertions, 48 deletions
diff --git a/src/nautilus-view.c b/src/nautilus-view.c index 1e28f1615..7a0cb6566 100644 --- a/src/nautilus-view.c +++ b/src/nautilus-view.c @@ -1404,22 +1404,6 @@ rename_file (NautilusView *view, NautilusFile *new_file) nautilus_view_reveal_selection (view); } -static void -reveal_newly_added_folder (NautilusView *view, NautilusFile *new_file, - NautilusDirectory *directory, GFile *target_location) -{ - GFile *location; - - location = nautilus_file_get_location (new_file); - if (g_file_equal (location, target_location)) { - g_signal_handlers_disconnect_by_func (view, - G_CALLBACK (reveal_newly_added_folder), - (void *) target_location); - rename_file (view, new_file); - } - g_object_unref (location); -} - typedef struct { NautilusView *directory_view; GHashTable *added_locations; @@ -1553,22 +1537,6 @@ new_folder_done (GFile *new_folder, 0, 0); g_list_free_full (uris, g_free); g_free (target_uri); - } else { - if (g_hash_table_lookup_extended (data->added_locations, new_folder, NULL, NULL)) { - /* The file was already added */ - rename_file (directory_view, file); - } else { - /* We need to run after the default handler adds the folder we want to - * operate on. The ADD_FILE signal is registered as G_SIGNAL_RUN_LAST, so we - * must use connect_after. - */ - g_signal_connect_data (directory_view, - "add-file", - G_CALLBACK (reveal_newly_added_folder), - g_object_ref (new_folder), - (GClosureNotify)g_object_unref, - G_CONNECT_AFTER); - } } nautilus_file_unref (file); @@ -1624,30 +1592,133 @@ context_menu_to_file_operation_position (NautilusView *view) } static void +nautilus_view_add_file_dialog_validate_entry (GObject *object, + GParamSpec *params, + gpointer user_data) +{ + const gchar *text; + + g_assert (object && GTK_IS_ENTRY (object)); + g_assert (user_data && GTK_IS_DIALOG (user_data)); + + text = gtk_entry_get_text (GTK_ENTRY (object)); + + gtk_dialog_set_response_sensitive (GTK_DIALOG (user_data), + GTK_RESPONSE_OK, + g_utf8_strlen (text, -1) > 0); +} + +static void +nautilus_view_add_file_dialog_entry_activate (GtkWidget *entry, + gpointer user_data) +{ + const gchar *text; + + g_assert (entry && GTK_IS_ENTRY (entry)); + g_assert (user_data && GTK_IS_DIALOG (user_data)); + + text = gtk_entry_get_text (GTK_ENTRY (entry)); + + if (g_utf8_strlen (text, -1) > 0) { + gtk_dialog_response (GTK_DIALOG (user_data), + GTK_RESPONSE_OK); + } +} + +static void nautilus_view_new_folder (NautilusView *directory_view, gboolean with_selection) { - char *parent_uri; - NewFolderData *data; - GdkPoint *pos; + GtkWidget *dialog; + GtkWidget *label; + GtkWidget *entry; + GtkWidget *box; + GtkWidget *window; + GtkWidget *area; + gint response; - data = new_folder_data_new (directory_view, with_selection); + // Dialog label + label = gtk_label_new (_("Name")); + gtk_style_context_add_class (gtk_widget_get_style_context (label), + "dim-label"); - g_signal_connect_data (directory_view, - "add-file", - G_CALLBACK (track_newly_added_locations), - data, - (GClosureNotify)NULL, - G_CONNECT_AFTER); + // Folder name entry + entry = gtk_entry_new (); + gtk_widget_set_hexpand (entry, TRUE); - pos = context_menu_to_file_operation_position (directory_view); + // Dialog + window = gtk_widget_get_toplevel (GTK_WIDGET (directory_view)); + dialog = gtk_dialog_new_with_buttons (_("New Folder"), + GTK_WINDOW (window), + GTK_DIALOG_MODAL | GTK_DIALOG_USE_HEADER_BAR | GTK_DIALOG_DESTROY_WITH_PARENT, + _("Cancel"), + GTK_RESPONSE_CANCEL, + _("Create"), + GTK_RESPONSE_OK, + NULL); + + gtk_dialog_set_default_response (GTK_DIALOG (dialog), + GTK_RESPONSE_OK); + + gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog ), + GTK_RESPONSE_OK, + FALSE); + + gtk_container_set_border_width (GTK_CONTAINER (dialog), 12); + + // Main box + box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12); + area = gtk_dialog_get_content_area (GTK_DIALOG (dialog)); + + gtk_container_add (GTK_CONTAINER (box), label); + gtk_container_add (GTK_CONTAINER (box), entry); + gtk_container_add (GTK_CONTAINER (area), box); + + gtk_widget_show_all (box); + + // Only allow non-null names + g_signal_connect (entry, + "notify::text", + G_CALLBACK (nautilus_view_add_file_dialog_validate_entry), + dialog); + g_signal_connect (entry, + "activate", + G_CALLBACK (nautilus_view_add_file_dialog_entry_activate), + dialog); + + // Show the dialog and wait for user interaction + response = gtk_dialog_run (GTK_DIALOG (dialog)); + + // Perform the action on GTK_RESPONSE_OK response + if (response == GTK_RESPONSE_OK) { + char *parent_uri; + gchar *name; + NewFolderData *data; + GdkPoint *pos; + + data = new_folder_data_new (directory_view, with_selection); + name = gtk_entry_get_text (GTK_ENTRY (entry)); + + g_signal_connect_data (directory_view, + "add-file", + G_CALLBACK (track_newly_added_locations), + data, + (GClosureNotify)NULL, + G_CONNECT_AFTER); + + pos = context_menu_to_file_operation_position (directory_view); + + parent_uri = nautilus_view_get_backing_uri (directory_view); + nautilus_file_operations_new_folder (GTK_WIDGET (directory_view), + pos, + parent_uri, + name, + new_folder_done, data); - parent_uri = nautilus_view_get_backing_uri (directory_view); - nautilus_file_operations_new_folder (GTK_WIDGET (directory_view), - pos, parent_uri, - new_folder_done, data); + g_free (parent_uri); + } - g_free (parent_uri); + gtk_widget_destroy (dialog); } static NewFolderData * |