summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Soriano <csoriano@gnome.org>2015-08-16 23:26:36 +0200
committerCarlos Soriano <csoriano@gnome.org>2015-08-17 00:18:49 +0200
commit73c1cdd7f1971672158d8461e41565b60dec2b02 (patch)
tree1d9d16b4969eb6e11b8866fec1e8fe9c45818a3c
parent84faf7473b6c375188cd24746a3569872def8f13 (diff)
downloadnautilus-73c1cdd7f1971672158d8461e41565b60dec2b02.tar.gz
view: check for duplicated files for renaming as well
I removed that part of the code. Also, now that both behaviours between renaming and new folder are closer, simplify the code and merge the common parts.
-rw-r--r--src/nautilus-create-folder-dialog.ui5
-rw-r--r--src/nautilus-rename-file-popover.ui3
-rw-r--r--src/nautilus-view.c289
3 files changed, 127 insertions, 170 deletions
diff --git a/src/nautilus-create-folder-dialog.ui b/src/nautilus-create-folder-dialog.ui
index 21bf6b2ad..e39f5e603 100644
--- a/src/nautilus-create-folder-dialog.ui
+++ b/src/nautilus-create-folder-dialog.ui
@@ -9,6 +9,7 @@
<property name="type_hint">dialog</property>
<property name="use-header-bar">1</property>
<property name="width_request">450</property>
+ <signal name="response" handler="create_folder_dialog_on_response"/>
<child internal-child="vbox">
<object class="GtkBox" id="vbox">
<property name="orientation">vertical</property>
@@ -32,8 +33,8 @@
<object class="GtkEntry" id="name_entry">
<property name="visible">True</property>
<property name="can_focus">True</property>
- <signal name="changed" handler="create_folder_dialog_entry_on_changed" swapped="no" />
- <signal name="activate" handler="create_folder_dialog_entry_on_activate" swapped="no" />
+ <signal name="changed" handler="file_name_widget_entry_on_changed" swapped="yes" />
+ <signal name="activate" handler="file_name_widget_on_activate" swapped="yes" />
</object>
<packing>
<property name="expand">False</property>
diff --git a/src/nautilus-rename-file-popover.ui b/src/nautilus-rename-file-popover.ui
index 5214857c2..ff60a97f5 100644
--- a/src/nautilus-rename-file-popover.ui
+++ b/src/nautilus-rename-file-popover.ui
@@ -3,6 +3,7 @@
<object class="GtkPopover" id="rename_file_popover">
<property name="position">bottom</property>
<signal name="closed" handler="rename_file_popover_on_closed"/>
+ <signal name="unmap" handler="rename_file_popover_on_unmap"/>
<child>
<object class="GtkGrid">
<property name="visible">True</property>
@@ -27,6 +28,7 @@
<object class="GtkEntry" id="name_entry">
<property name="visible">True</property>
<property name="activates-default">True</property>
+ <signal name="changed" handler="file_name_widget_entry_on_changed" swapped="yes" />
</object>
<packing>
<property name="left-attach">0</property>
@@ -40,6 +42,7 @@
<property name="label" translatable="yes">_Rename</property>
<property name="use_underline">True</property>
<property name="can_default">True</property>
+ <signal name="clicked" handler="file_name_widget_on_activate" swapped="yes" />
<style>
<class name="suggested-action"/>
</style>
diff --git a/src/nautilus-view.c b/src/nautilus-view.c
index 2c1b0d5b5..3c21fe3c9 100644
--- a/src/nautilus-view.c
+++ b/src/nautilus-view.c
@@ -121,7 +121,7 @@
#define TEMPLATE_LIMIT 30
/* Delay to show the duplicated label when creating a folder */
-#define CREATE_FOLDER_DUPLICATED_LABEL_TIMEOUT 500
+#define FILE_NAME_DUPLICATED_LABEL_TIMEOUT 500
/* Delay to show the Loading... floating bar */
#define FLOATING_BAR_LOADING_DELAY 500 /* ms */
@@ -165,7 +165,7 @@ struct NautilusViewDetails
NautilusFile *directory_as_file;
guint dir_merge_id;
- gint create_folder_duplicated_label_timeout_id;
+ gint duplicated_label_timeout_id;
GtkWidget *rename_file_popover;
gboolean supports_zooming;
@@ -1778,24 +1778,14 @@ typedef struct {
GtkWidget *widget;
GtkWidget *error_label;
GtkWidget *name_entry;
+ GtkWidget *activate_button;
gboolean target_is_folder;
NautilusFile *target_file;
- GtkWidget *activate_button;
gboolean duplicated_is_folder;
-} FileNameWidgetData;
-
-typedef struct {
- NautilusView *view;
- GtkWidget *widget;
- GtkWidget *name_entry;
- NautilusFile *target_file;
-} RenameDialogData;
-
-typedef struct {
- NautilusView *view;
- GtkWidget *name_entry;
+ void (*on_name_accepted) (gpointer data);
+ /* For create folder only */
gboolean with_selection;
-} NewFolderDialogData;
+} FileNameWidgetData;
static gboolean
duplicated_file_label_show (FileNameWidgetData *data)
@@ -1805,7 +1795,7 @@ duplicated_file_label_show (FileNameWidgetData *data)
else
gtk_label_set_label (GTK_LABEL (data->error_label), _("A file with that name already exists."));
- data->view->details->create_folder_duplicated_label_timeout_id = 0;
+ data->view->details->duplicated_label_timeout_id = 0;
return G_SOURCE_REMOVE;
}
@@ -1837,15 +1827,14 @@ validate_file_name (const gchar *name,
}
static void
-create_folder_dialog_entry_on_changed (GtkEntry *entry,
- gpointer user_data)
+file_name_widget_entry_on_changed (gpointer user_data)
{
FileNameWidgetData *data;
NautilusFile *existing_file;
gchar *name;
gchar *error_message;
gboolean valid_name;
- gboolean can_create_folder;
+ gboolean duplicated;
data = (FileNameWidgetData *) user_data;
name = g_strstrip (g_strdup (gtk_entry_get_text (GTK_ENTRY (data->name_entry))));
@@ -1855,75 +1844,132 @@ create_folder_dialog_entry_on_changed (GtkEntry *entry,
existing_file = nautilus_directory_get_file_by_name (data->view->details->model, name);
valid_name = strlen (name) > 0 && error_message == NULL;
- can_create_folder = existing_file == NULL && valid_name;
- gtk_widget_set_sensitive (data->activate_button, can_create_folder);
-
- if (data->view->details->create_folder_duplicated_label_timeout_id > 0) {
- g_source_remove (data->view->details->create_folder_duplicated_label_timeout_id);
- data->view->details->create_folder_duplicated_label_timeout_id = 0;
+ /* If there is a target file and the name is the same, we don't show it
+ * as duplicated. This is the case for renaming. */
+ duplicated = existing_file != NULL &&
+ (data->target_file == NULL ||
+ nautilus_file_compare_display_name (data->target_file, name) != 0);
+ gtk_widget_set_sensitive (data->activate_button, valid_name && !duplicated);
+
+ if (data->view->details->duplicated_label_timeout_id > 0) {
+ g_source_remove (data->view->details->duplicated_label_timeout_id);
+ data->view->details->duplicated_label_timeout_id = 0;
}
/* Report duplicated file only if not other message shown (for instance,
* folders like "." or ".." will always exists, but we consider it as an
- * error, not as a duplicated file) */
- if (existing_file != NULL && valid_name) {
+ * error, not as a duplicated file or if the name is the same as the file
+ * we are renaming also don't report as a duplicated */
+ if (duplicated && valid_name) {
data->duplicated_is_folder = nautilus_file_is_directory (existing_file);
- data->view->details->create_folder_duplicated_label_timeout_id =
- g_timeout_add (CREATE_FOLDER_DUPLICATED_LABEL_TIMEOUT,
+ data->view->details->duplicated_label_timeout_id =
+ g_timeout_add (FILE_NAME_DUPLICATED_LABEL_TIMEOUT,
(GSourceFunc)duplicated_file_label_show,
data);
}
if (existing_file != NULL)
nautilus_file_unref (existing_file);
+
+ g_free (name);
}
static void
-rename_file_popover_entry_on_changed (GtkEntry *entry,
- gpointer user_data)
+create_folder_dialog_on_response (GtkDialog *dialog,
+ gint response_id,
+ gpointer user_data)
{
- FileNameWidgetData *data;
- gboolean valid_name;
+ FileNameWidgetData *widget_data;
+
+ widget_data = (FileNameWidgetData *) user_data;
+
+ if (response_id == GTK_RESPONSE_OK) {
+ NewFolderData *data;
+ GdkPoint *pos;
+ char *parent_uri;
+ gchar *name;
+
+ data = new_folder_data_new (widget_data->view, widget_data->with_selection);
+
+ name = g_strstrip (g_strdup (gtk_entry_get_text (GTK_ENTRY (widget_data->name_entry))));
+ g_signal_connect_data (widget_data->view,
+ "add-file",
+ G_CALLBACK (track_newly_added_locations),
+ data,
+ (GClosureNotify)NULL,
+ G_CONNECT_AFTER);
+
+ pos = context_menu_to_file_operation_position (widget_data->view);
+
+ parent_uri = nautilus_view_get_backing_uri (widget_data->view);
+ nautilus_file_operations_new_folder (GTK_WIDGET (widget_data->view),
+ pos, parent_uri, name,
+ new_folder_done, data);
+
+ g_free (parent_uri);
+ g_free (name);
+ }
+
+ gtk_widget_destroy (GTK_WIDGET (dialog));
+ g_free (user_data);
+}
+
+
+static void
+create_folder_on_name_accepted (gpointer user_data)
+{
+ FileNameWidgetData *data;
+
+ data = (FileNameWidgetData *) user_data;
+ gtk_dialog_response (GTK_DIALOG (data->widget),
+ GTK_RESPONSE_OK);
+}
+
+static void
+rename_file_on_name_accepted (gpointer user_data)
+{
+ FileNameWidgetData *data;
gchar *name;
- gchar *error_message;
data = (FileNameWidgetData *) user_data;
+
name = g_strstrip (g_strdup (gtk_entry_get_text (GTK_ENTRY (data->name_entry))));
- error_message = validate_file_name (name, nautilus_file_is_directory (data->target_file));
- gtk_label_set_label (GTK_LABEL (data->error_label), error_message);
+ nautilus_rename_file (data->target_file, name, NULL, NULL);
- valid_name = strlen (name) > 0 && error_message == NULL;
- gtk_widget_set_sensitive (data->activate_button, valid_name);
+ nautilus_view_select_file (data->view, data->target_file);
+ nautilus_view_reveal_selection (data->view);
+
+ gtk_widget_hide (data->widget);
g_free (name);
}
static void
-create_folder_dialog_entry_on_activate (GtkWidget *entry,
- gpointer user_data)
+file_name_widget_on_activate (gpointer user_data)
{
FileNameWidgetData *data;
NautilusFile *existing_file;
gchar *name;
gchar *error_message;
gboolean valid_name;
- gboolean can_create_folder;
+ gboolean duplicated;
- data = (FileNameWidgetData *) user_data;
+ data = (FileNameWidgetData *) user_data;
name = g_strstrip (g_strdup (gtk_entry_get_text (GTK_ENTRY (data->name_entry))));
existing_file = nautilus_directory_get_file_by_name (data->view->details->model, name);
error_message = validate_file_name (name, TRUE);
valid_name = strlen (name) > 0 && error_message == NULL;
- can_create_folder = existing_file == NULL && valid_name;
+ duplicated = existing_file != NULL &&
+ (data->target_file == NULL ||
+ nautilus_file_compare_display_name (data->target_file, name) != 0);
- if (data->view->details->create_folder_duplicated_label_timeout_id > 0) {
- g_source_remove (data->view->details->create_folder_duplicated_label_timeout_id);
- data->view->details->create_folder_duplicated_label_timeout_id = 0;
+ if (data->view->details->duplicated_label_timeout_id > 0) {
+ g_source_remove (data->view->details->duplicated_label_timeout_id);
+ data->view->details->duplicated_label_timeout_id = 0;
}
- if (can_create_folder) {
- gtk_dialog_response (GTK_DIALOG (data->widget),
- GTK_RESPONSE_OK);
+ if (valid_name && !duplicated) {
+ data->on_name_accepted ((gpointer) data);
} else {
/* Report duplicated file only if not other message shown (for instance,
* folders like "." or ".." will always exists, but we consider it as an
@@ -1938,32 +1984,7 @@ create_folder_dialog_entry_on_activate (GtkWidget *entry,
if (existing_file != NULL)
nautilus_file_unref (existing_file);
- g_free (name);
-}
-
-static void
-rename_file_popover_rename_button_on_clicked (GtkButton *entry,
- gpointer *user_data)
-{
- RenameDialogData *rename_data;
- gchar *name;
-
- rename_data = (RenameDialogData *) user_data;
-
- g_assert (rename_data != NULL);
- g_assert (GTK_IS_ENTRY (rename_data->name_entry));
- g_assert (NAUTILUS_IS_FILE (rename_data->target_file));
-
- name = g_strstrip (g_strdup (gtk_entry_get_text (GTK_ENTRY (rename_data->name_entry))));
- nautilus_rename_file (rename_data->target_file, name, NULL, NULL);
g_free (name);
-
- nautilus_view_select_file (rename_data->view, rename_data->target_file);
- nautilus_view_reveal_selection (rename_data->view);
-
- gtk_widget_hide (rename_data->widget);
-
- g_free (rename_data);
}
static void
@@ -1988,7 +2009,6 @@ nautilus_view_rename_file_popover_new (NautilusView *view,
NautilusFile *target_file)
{
FileNameWidgetData *widget_data;
- RenameDialogData *rename_data;
GtkWidget *label_file_name;
GtkBuilder *builder;
gint start_offset, end_offset;
@@ -2002,6 +2022,7 @@ nautilus_view_rename_file_popover_new (NautilusView *view,
widget_data = g_new (FileNameWidgetData, 1);
widget_data->view = view;
+ widget_data->on_name_accepted = rename_file_on_name_accepted;
widget_data->widget = GTK_WIDGET (gtk_builder_get_object (builder, "rename_file_popover"));
widget_data->activate_button = GTK_WIDGET (gtk_builder_get_object (builder, "rename_button"));
widget_data->error_label = GTK_WIDGET (gtk_builder_get_object (builder, "error_label"));
@@ -2011,11 +2032,19 @@ nautilus_view_rename_file_popover_new (NautilusView *view,
view->details->rename_file_popover = widget_data->widget;
- rename_data = g_new (RenameDialogData, 1);
- rename_data->view = view;
- rename_data->widget = widget_data->widget;
- rename_data->target_file = target_file;
- rename_data->name_entry = widget_data->name_entry;
+ /* Connect signals */
+ gtk_builder_add_callback_symbols (builder,
+ "file_name_widget_entry_on_changed",
+ G_CALLBACK (file_name_widget_entry_on_changed),
+ "file_name_widget_on_activate",
+ G_CALLBACK (file_name_widget_on_activate),
+ "rename_file_popover_on_closed",
+ G_CALLBACK (rename_file_popover_on_closed),
+ "rename_file_popover_on_unmap",
+ G_CALLBACK (gtk_widget_destroy),
+ NULL);
+
+ gtk_builder_connect_signals (builder, widget_data);
if (widget_data->target_is_folder)
gtk_label_set_text (GTK_LABEL (label_file_name), _("Folder name"));
@@ -2023,26 +2052,6 @@ nautilus_view_rename_file_popover_new (NautilusView *view,
gtk_label_set_text (GTK_LABEL (label_file_name), _("File name"));
gtk_entry_set_text (GTK_ENTRY (widget_data->name_entry), nautilus_file_get_name (target_file));
- g_signal_connect (widget_data->activate_button,
- "clicked",
- G_CALLBACK (rename_file_popover_rename_button_on_clicked),
- rename_data);
-
- g_signal_connect (widget_data->name_entry,
- "changed",
- G_CALLBACK (rename_file_popover_entry_on_changed),
- widget_data);
-
- g_signal_connect (GTK_POPOVER (widget_data->widget),
- "closed",
- G_CALLBACK (rename_file_popover_on_closed),
- widget_data);
-
- g_signal_connect (GTK_POPOVER (widget_data->widget),
- "unmap",
- G_CALLBACK (gtk_widget_destroy),
- NULL);
-
relative_to = nautilus_view_compute_rename_popover_relative_to (view);
gtk_popover_set_default_widget (GTK_POPOVER (widget_data->widget),
widget_data->activate_button);
@@ -2050,6 +2059,7 @@ nautilus_view_rename_file_popover_new (NautilusView *view,
gtk_popover_set_relative_to (GTK_POPOVER (widget_data->widget),
GTK_WIDGET (view));
gtk_widget_show (widget_data->widget);
+ gtk_widget_grab_focus (widget_data->widget);
/* Select the name part withouth the file extension */
eel_filename_get_rename_region (nautilus_file_get_name (target_file),
@@ -2058,67 +2068,17 @@ nautilus_view_rename_file_popover_new (NautilusView *view,
start_offset, end_offset);
/* Update the rename button status */
- rename_file_popover_entry_on_changed (GTK_ENTRY (widget_data->name_entry),
- widget_data);
+ file_name_widget_entry_on_changed (widget_data);
g_object_unref (builder);
}
static void
-nautilus_view_new_folder_dialog_on_response (GtkDialog *dialog,
- gint response_id,
- gpointer user_data)
-{
- NewFolderDialogData *new_folder_data;
-
- new_folder_data = (NewFolderDialogData *) user_data;
-
- g_assert (new_folder_data != NULL);
- g_assert (GTK_IS_ENTRY (new_folder_data->name_entry));
-
- if (response_id == GTK_RESPONSE_OK) {
- NewFolderData *data;
- GdkPoint *pos;
- char *parent_uri;
- gchar *name;
-
- data = new_folder_data_new (new_folder_data->view, new_folder_data->with_selection);
-
- name = g_strstrip (g_strdup (gtk_entry_get_text (GTK_ENTRY (new_folder_data->name_entry))));
- g_signal_connect_data (new_folder_data->view,
- "add-file",
- G_CALLBACK (track_newly_added_locations),
- data,
- (GClosureNotify)NULL,
- G_CONNECT_AFTER);
-
- pos = context_menu_to_file_operation_position (new_folder_data->view);
-
- parent_uri = nautilus_view_get_backing_uri (new_folder_data->view);
- nautilus_file_operations_new_folder (GTK_WIDGET (new_folder_data->view),
- pos, parent_uri, name,
- new_folder_done, data);
-
- g_free (parent_uri);
- g_free (name);
- }
-
- if (new_folder_data->view->details->create_folder_duplicated_label_timeout_id > 0) {
- g_source_remove (new_folder_data->view->details->create_folder_duplicated_label_timeout_id);
- new_folder_data->view->details->create_folder_duplicated_label_timeout_id = 0;
- }
-
- gtk_widget_destroy (GTK_WIDGET (dialog));
- g_free (user_data);
-}
-
-static void
nautilus_view_new_folder_dialog_new (NautilusView *view,
gboolean with_selection)
{
FileNameWidgetData *widget_data;
- NewFolderDialogData *user_data;
GtkWidget *label_file_name;
GtkBuilder *builder;
@@ -2127,27 +2087,26 @@ nautilus_view_new_folder_dialog_new (NautilusView *view,
widget_data = g_new (FileNameWidgetData, 1);
widget_data->view = view;
+ widget_data->on_name_accepted = create_folder_on_name_accepted;
widget_data->widget = GTK_WIDGET (gtk_builder_get_object (builder, "create_folder_dialog"));
widget_data->activate_button = GTK_WIDGET (gtk_builder_get_object (builder, "ok_button"));
widget_data->error_label = GTK_WIDGET (gtk_builder_get_object (builder, "error_label"));
widget_data->name_entry = GTK_WIDGET (gtk_builder_get_object (builder, "name_entry"));
widget_data->target_is_folder = TRUE;
widget_data->target_file = NULL;
-
- user_data = g_new (NewFolderDialogData, 1);
- user_data->view = view;
- user_data->with_selection = with_selection;
- user_data->name_entry = widget_data->name_entry;
+ widget_data->with_selection = with_selection;
gtk_window_set_transient_for (GTK_WINDOW (widget_data->widget),
GTK_WINDOW (nautilus_view_get_window (view)));
/* Connect signals */
gtk_builder_add_callback_symbols (builder,
- "create_folder_dialog_entry_on_changed",
- G_CALLBACK (create_folder_dialog_entry_on_changed),
- "create_folder_dialog_entry_on_activate",
- G_CALLBACK (create_folder_dialog_entry_on_activate),
+ "file_name_widget_entry_on_changed",
+ G_CALLBACK (file_name_widget_entry_on_changed),
+ "file_name_widget_on_activate",
+ G_CALLBACK (file_name_widget_on_activate),
+ "create_folder_dialog_on_response",
+ G_CALLBACK (create_folder_dialog_on_response),
NULL);
gtk_builder_connect_signals (builder, widget_data);
@@ -2156,15 +2115,9 @@ nautilus_view_new_folder_dialog_new (NautilusView *view,
gtk_label_set_text (GTK_LABEL (label_file_name), _("Folder name"));
gtk_window_set_title (GTK_WINDOW (widget_data->widget), _("New Folder"));
- g_signal_connect (widget_data->widget,
- "response",
- G_CALLBACK (nautilus_view_new_folder_dialog_on_response),
- user_data);
-
gtk_widget_show_all (widget_data->widget);
/* Update the ok button status */
- create_folder_dialog_entry_on_changed (GTK_ENTRY (widget_data->name_entry),
- widget_data);
+ file_name_widget_entry_on_changed (widget_data);
g_object_unref (builder);
}