diff options
author | Matthias Clasen <mclasen@redhat.com> | 2019-08-13 21:20:13 +0000 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2019-08-13 21:20:13 +0000 |
commit | 7913a6f0b64d304cb3089ab44aaea2c4ae4dd9e2 (patch) | |
tree | 636bc8ce88155822f7373874baafa22a8838919c | |
parent | f04d654ae74dabc9c1517e7a0d187ee12e43da05 (diff) | |
parent | aff5c7ede6611ed645f48fef0cd678fdc2bb3e11 (diff) | |
download | gtk+-7913a6f0b64d304cb3089ab44aaea2c4ae4dd9e2.tar.gz |
Merge branch '948-patch-renaming-a-file-can-make-it-to-loose-selection_GTK3' into 'gtk-3-24'
filechooser: keep file selected after being renamed
See merge request GNOME/gtk!1052
-rw-r--r-- | gtk/gtkfilechooserwidget.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/gtk/gtkfilechooserwidget.c b/gtk/gtkfilechooserwidget.c index ce708670c9..fe9bceacdc 100644 --- a/gtk/gtkfilechooserwidget.c +++ b/gtk/gtkfilechooserwidget.c @@ -322,6 +322,7 @@ struct _GtkFileChooserWidgetPrivate { GFile *current_folder; GFile *preview_file; char *preview_display_name; + GFile *renamed_file; GtkTreeViewColumn *list_name_column; GtkCellRenderer *list_name_renderer; @@ -703,6 +704,9 @@ gtk_file_chooser_widget_finalize (GObject *object) if (priv->browse_path_bar_size_group) g_object_unref (priv->browse_path_bar_size_group); + if (priv->renamed_file) + g_object_unref (priv->renamed_file); + /* Free all the Models we have */ stop_loading_and_clear_list_model (impl, FALSE); search_clear_model (impl, FALSE); @@ -1596,6 +1600,9 @@ rename_file_rename_clicked (GtkButton *button, new_name = gtk_entry_get_text (GTK_ENTRY (priv->rename_file_name_entry)); dest = g_file_get_parent (priv->rename_file_source_file); + if (priv->renamed_file) + g_clear_object (&priv->renamed_file); + if (dest) { GFile *child; @@ -1607,6 +1614,12 @@ rename_file_rename_clicked (GtkButton *button, if (!g_file_move (priv->rename_file_source_file, child, G_FILE_COPY_NONE, NULL, NULL, NULL, &error)) error_dialog (impl, _("The file could not be renamed"), error); + else + { + /* Rename succeded, save renamed file so it will + * be revealed by our "row-changed" handler */ + priv->renamed_file = g_object_ref (child); + } g_object_unref (child); } @@ -4673,6 +4686,36 @@ browse_files_model_finished_loading_cb (GtkFileSystemModel *model, profile_end ("end", NULL); } +/* Callback used when file system model adds or updates a file. + * We detect here when a new renamed file appears and reveal it */ +static void +browse_files_model_row_changed_cb (GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + gpointer data) +{ + GtkFileChooserWidget *impl = data; + GtkFileChooserWidgetPrivate *priv = impl->priv; + GFile *file; + GSList files; + + if (priv->renamed_file) + { + gtk_tree_model_get (model, iter, MODEL_COL_FILE, &file, -1); + if (g_file_equal (priv->renamed_file, file)) + { + g_clear_object (&priv->renamed_file); + + files.data = (gpointer) file; + files.next = NULL; + + show_and_select_files (impl, &files); + } + + g_object_unref (file); + } +} + static void stop_loading_and_clear_list_model (GtkFileChooserWidget *impl, gboolean remove) @@ -5113,6 +5156,9 @@ set_list_model (GtkFileChooserWidget *impl, g_signal_connect (priv->browse_files_model, "finished-loading", G_CALLBACK (browse_files_model_finished_loading_cb), impl); + g_signal_connect (priv->browse_files_model, "row-changed", + G_CALLBACK (browse_files_model_row_changed_cb), impl); + _gtk_file_system_model_set_filter (priv->browse_files_model, priv->current_filter); profile_end ("end", NULL); @@ -8620,6 +8666,7 @@ gtk_file_chooser_widget_init (GtkFileChooserWidget *impl) priv->recent_manager = gtk_recent_manager_get_default (); priv->create_folders = TRUE; priv->auto_selecting_first_row = FALSE; + priv->renamed_file = NULL; /* Ensure GTK+ private types used by the template * definition before calling gtk_widget_init_template() |