From f678e48a08a376cbed060b52cd9746febf44c6cc Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 19 Oct 2014 17:54:28 -0400 Subject: [PATCH] GtkFileChooser: Make preview update more understandable Implement Federico's suggestion: In single-selection mode, just use the selected row, In multi-selection mode, use the cursor row as long as it is in the selection. https://bugzilla.gnome.org/show_bug.cgi?id=154709 --- gtk/gtkfilechooserwidget.c | 45 ++++++++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/gtk/gtkfilechooserwidget.c b/gtk/gtkfilechooserwidget.c index 404ca8d230..984aaf0d84 100644 --- a/gtk/gtkfilechooserwidget.c +++ b/gtk/gtkfilechooserwidget.c @@ -496,11 +496,13 @@ static gboolean list_select_func (GtkTreeSelection *selection, gpointer data); static void list_selection_changed (GtkTreeSelection *tree_selection, - GtkFileChooserWidget *impl); + GtkFileChooserWidget *impl); static void list_row_activated (GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, - GtkFileChooserWidget *impl); + GtkFileChooserWidget *impl); +static void list_cursor_changed (GtkTreeView *treeview, + GtkFileChooserWidget *impl); static void path_bar_clicked (GtkPathBar *path_bar, GFile *file, @@ -6571,24 +6573,45 @@ static void check_preview_change (GtkFileChooserWidget *impl) { GtkFileChooserWidgetPrivate *priv = impl->priv; - GtkTreePath *cursor_path; + GtkTreePath *path; GFile *new_file; char *new_display_name; GtkTreeModel *model; + GtkTreeSelection *selection; - gtk_tree_view_get_cursor (GTK_TREE_VIEW (priv->browse_files_tree_view), &cursor_path, NULL); model = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->browse_files_tree_view)); - if (cursor_path) + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->browse_files_tree_view)); + if (gtk_tree_selection_get_mode (selection) == GTK_SELECTION_SINGLE || + gtk_tree_selection_get_mode (selection) == GTK_SELECTION_BROWSE) { GtkTreeIter iter; - gtk_tree_model_get_iter (model, &iter, cursor_path); + if (gtk_tree_selection_get_selected (selection, NULL, &iter)) + path = gtk_tree_model_get_path (model, &iter); + else + path = NULL; + } + else + { + gtk_tree_view_get_cursor (GTK_TREE_VIEW (priv->browse_files_tree_view), &path, NULL); + if (path && !gtk_tree_selection_path_is_selected (selection, path)) + { + gtk_tree_path_free (path); + path = NULL; + } + } + + if (path) + { + GtkTreeIter iter; + + gtk_tree_model_get_iter (model, &iter, path); gtk_tree_model_get (model, &iter, MODEL_COL_FILE, &new_file, MODEL_COL_NAME, &new_display_name, -1); - gtk_tree_path_free (cursor_path); + gtk_tree_path_free (path); } else { @@ -6696,6 +6719,13 @@ list_selection_changed (GtkTreeSelection *selection, g_signal_emit_by_name (impl, "selection-changed", 0); } +static void +list_cursor_changed (GtkTreeView *list, + GtkFileChooserWidget *impl) +{ + check_preview_change (impl); +} + /* Callback used when a row in the file list is activated */ static void list_row_activated (GtkTreeView *tree_view, @@ -7382,6 +7412,7 @@ gtk_file_chooser_widget_class_init (GtkFileChooserWidgetClass *class) gtk_widget_class_bind_template_callback (widget_class, list_row_activated); gtk_widget_class_bind_template_callback (widget_class, file_list_drag_motion_cb); gtk_widget_class_bind_template_callback (widget_class, list_selection_changed); + gtk_widget_class_bind_template_callback (widget_class, list_cursor_changed); gtk_widget_class_bind_template_callback (widget_class, renderer_editing_canceled_cb); gtk_widget_class_bind_template_callback (widget_class, renderer_edited_cb); gtk_widget_class_bind_template_callback (widget_class, filter_combo_changed);