[nautilus] Update preview when selection changes



commit 0417c013546c255fc9ad5edbcc676d3a3350d192
Author: Cosimo Cecchi <cosimoc gnome org>
Date:   Sat Jul 6 22:53:19 2019 -0700

    Update preview when selection changes
    
    If the selection changes while the preview is active, change the
    preview to the new selection.
    Combined with the previous work to move selection in the views
    when pressing keys in the preview window itself, this greatly
    improves the experience while previewing several files in a directory.
    
    Fixes https://gitlab.gnome.org/GNOME/sushi/issues/5
    Closes https://gitlab.gnome.org/GNOME/nautilus/merge_requests/470

 src/nautilus-application.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++
 src/nautilus-files-view.c  | 60 ++++++++++++++++++++++++++++++++++++-------
 src/nautilus-files-view.h  |  2 ++
 3 files changed, 117 insertions(+), 9 deletions(-)
---
diff --git a/src/nautilus-application.c b/src/nautilus-application.c
index d146147ed..fb2833372 100644
--- a/src/nautilus-application.c
+++ b/src/nautilus-application.c
@@ -45,6 +45,7 @@
 #include "nautilus-dbus-manager.h"
 #include "nautilus-directory-private.h"
 #include "nautilus-file.h"
+#include "nautilus-files-view.h"
 #include "nautilus-file-operations.h"
 #include "nautilus-file-undo-manager.h"
 #include "nautilus-file-utilities.h"
@@ -1219,6 +1220,59 @@ nautilus_application_withdraw_notification (NautilusApplication *self,
     g_application_withdraw_notification (G_APPLICATION (self), notification_id);
 }
 
+static void
+update_previewer_selection (NautilusApplication *self,
+                            NautilusWindow      *window)
+{
+    GtkWindow *gtk_window;
+    NautilusWindowSlot *slot;
+    NautilusView *view;
+    GList *selection;
+
+    gtk_window = gtk_application_get_active_window (GTK_APPLICATION (self));
+    if (!NAUTILUS_IS_WINDOW (gtk_window))
+    {
+        return;
+    }
+
+    if (NAUTILUS_WINDOW (gtk_window) != window)
+    {
+        return;
+    }
+
+    slot = nautilus_window_get_active_slot (window);
+    if (slot == NULL)
+    {
+        return;
+    }
+
+    view = nautilus_window_slot_get_current_view (slot);
+    if (!NAUTILUS_IS_FILES_VIEW (view))
+    {
+        return;
+    }
+
+    selection = nautilus_window_slot_get_selection (slot);
+    if (selection != NULL)
+    {
+        nautilus_files_view_preview_update (NAUTILUS_FILES_VIEW (view), selection);
+    }
+}
+
+static void
+on_application_active_window_changed (NautilusApplication *self,
+                                      GParamSpec          *pspec,
+                                      gpointer             user_data)
+{
+    GtkWindow *window;
+
+    window = gtk_application_get_active_window (GTK_APPLICATION (self));
+    if (NAUTILUS_IS_WINDOW (window))
+    {
+        update_previewer_selection (self, NAUTILUS_WINDOW (window));
+    }
+}
+
 static void
 on_application_shutdown (GApplication *application,
                          gpointer      user_data)
@@ -1299,6 +1353,7 @@ nautilus_application_startup_common (NautilusApplication *self)
 
     nautilus_profile_end (NULL);
 
+    g_signal_connect (self, "notify::active-window", G_CALLBACK (on_application_active_window_changed), 
NULL);
     g_signal_connect (self, "shutdown", G_CALLBACK (on_application_shutdown), NULL);
 
     g_signal_connect_object (gtk_icon_theme_get_default (),
@@ -1504,6 +1559,13 @@ on_slot_removed (NautilusWindow      *window,
     g_signal_handlers_disconnect_by_func (slot, on_slot_location_changed, self);
 }
 
+static void
+on_active_selection_changed (NautilusWindow      *window,
+                             NautilusApplication *self)
+{
+    update_previewer_selection (self, window);
+}
+
 static void
 nautilus_application_window_added (GtkApplication *app,
                                    GtkWindow      *window)
@@ -1519,6 +1581,7 @@ nautilus_application_window_added (GtkApplication *app,
         priv->windows = g_list_prepend (priv->windows, window);
         g_signal_connect (window, "slot-added", G_CALLBACK (on_slot_added), app);
         g_signal_connect (window, "slot-removed", G_CALLBACK (on_slot_removed), app);
+        g_signal_connect (window, "active-selection-changed", G_CALLBACK (on_active_selection_changed), app);
     }
 }
 
@@ -1538,6 +1601,7 @@ nautilus_application_window_removed (GtkApplication *app,
         priv->windows = g_list_remove_all (priv->windows, window);
         g_signal_handlers_disconnect_by_func (window, on_slot_added, app);
         g_signal_handlers_disconnect_by_func (window, on_slot_removed, app);
+        g_signal_handlers_disconnect_by_func (window, on_active_selection_changed, app);
     }
 
     /* if this was the last window, close the previewer */
diff --git a/src/nautilus-files-view.c b/src/nautilus-files-view.c
index 40e2a2334..1a1089ac6 100644
--- a/src/nautilus-files-view.c
+++ b/src/nautilus-files-view.c
@@ -1230,14 +1230,42 @@ get_view_directory (NautilusFilesView *view)
     return path;
 }
 
+typedef struct {
+    gchar *uri;
+    gboolean is_update;
+} PreviewExportData;
+
+static void
+preview_export_data_free (gpointer _data)
+{
+    PreviewExportData *data = _data;
+    g_free (data->uri);
+    g_free (data);
+}
+
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (PreviewExportData, preview_export_data_free)
+
 static void
 on_window_handle_export (NautilusWindow *window,
                          const char     *handle,
                          guint           xid,
                          gpointer        user_data)
 {
-    g_autofree gchar *uri = user_data;
-    nautilus_previewer_call_show_file (uri, handle, xid, TRUE);
+    g_autoptr(PreviewExportData) data = user_data;
+    nautilus_previewer_call_show_file (data->uri, handle, xid, !data->is_update);
+}
+
+static void
+nautilus_files_view_preview (NautilusFilesView *view,
+                             PreviewExportData *data)
+{
+    if (!nautilus_window_export_handle (nautilus_files_view_get_window (view),
+                                        on_window_handle_export,
+                                        data))
+    {
+        /* Let's use a fallback, so at least a preview will be displayed */
+        nautilus_previewer_call_show_file (data->uri, "x11:0", 0, !data->is_update);
+    }
 }
 
 void
@@ -1245,16 +1273,30 @@ nautilus_files_view_preview_files (NautilusFilesView *view,
                                    GList             *files,
                                    GArray            *locations)
 {
-    g_autofree gchar *uri = NULL;
+    PreviewExportData *data = g_new0 (PreviewExportData, 1);
 
-    uri = nautilus_file_get_uri (files->data);
-    if (!nautilus_window_export_handle (nautilus_files_view_get_window (view),
-                                        on_window_handle_export,
-                                        g_strdup (uri)))
+    data->uri = nautilus_file_get_uri (files->data);
+    data->is_update = FALSE;
+
+    nautilus_files_view_preview (view, data);
+}
+
+void
+nautilus_files_view_preview_update (NautilusFilesView *view,
+                                    GList             *files)
+{
+    PreviewExportData *data;
+
+    if (!nautilus_previewer_is_visible ())
     {
-        /* Let's use a fallback, so at least a preview will be displayed */
-        nautilus_previewer_call_show_file (uri, "x11:0", 0, TRUE);
+        return;
     }
+
+    data = g_new0 (PreviewExportData, 1);
+    data->uri = nautilus_file_get_uri (files->data);
+    data->is_update = TRUE;
+
+    nautilus_files_view_preview (view, data);
 }
 
 void
diff --git a/src/nautilus-files-view.h b/src/nautilus-files-view.h
index 602cf8bec..152f25aa0 100644
--- a/src/nautilus-files-view.h
+++ b/src/nautilus-files-view.h
@@ -269,6 +269,8 @@ void                nautilus_files_view_activate_file                    (Nautil
 void                nautilus_files_view_preview_files                    (NautilusFilesView *view,
                                                                           GList             *files,
                                                                           GArray            *locations);
+void                nautilus_files_view_preview_update                   (NautilusFilesView *view,
+                                                                          GList             *files);
 void                nautilus_files_view_start_batching_selection_changes (NautilusFilesView *view);
 void                nautilus_files_view_stop_batching_selection_changes  (NautilusFilesView *view);
 void                nautilus_files_view_notify_selection_changed         (NautilusFilesView *view);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]