[nautilus] Add support for the SelectionEvent previewer signal



commit 0f9823b05e5a1371b3b0d8a1838aef8f78f08d30
Author: Cosimo Cecchi <cosimoc gnome org>
Date:   Sat Jul 6 22:26:44 2019 -0700

    Add support for the SelectionEvent previewer signal
    
    And handle it by moving the selection in the current view.
    Once in a following commit we have the previewer follow the view
    selection, we'll achieve the desired effect of moving the preview
    with the selection.

 src/nautilus-application.c          | 11 ++++++
 src/nautilus-canvas-container.c     | 22 ++++++++++++
 src/nautilus-canvas-container.h     |  2 ++
 src/nautilus-canvas-view.c          | 13 +++++++
 src/nautilus-files-view.c           |  7 ++++
 src/nautilus-files-view.h           |  5 +++
 src/nautilus-list-view.c            | 60 ++++++++++++++++++++++++++++++++
 src/nautilus-previewer.c            | 68 +++++++++++++++++++++++++++++++++++++
 src/nautilus-previewer.h            |  5 +++
 src/nautilus-view-icon-controller.c | 18 ++++++++++
 10 files changed, 211 insertions(+)
---
diff --git a/src/nautilus-application.c b/src/nautilus-application.c
index 3deae733f..d146147ed 100644
--- a/src/nautilus-application.c
+++ b/src/nautilus-application.c
@@ -84,6 +84,8 @@ typedef struct
 
     NautilusTagManager *tag_manager;
     GCancellable *tag_manager_cancellable;
+
+    guint previewer_selection_id;
 } NautilusApplicationPrivate;
 
 G_DEFINE_TYPE_WITH_PRIVATE (NautilusApplication, nautilus_application, GTK_TYPE_APPLICATION);
@@ -1343,6 +1345,8 @@ nautilus_application_dbus_register (GApplication     *app,
         return FALSE;
     }
 
+    priv->previewer_selection_id = nautilus_previewer_connect_selection_event (connection);
+
     return TRUE;
 }
 
@@ -1366,6 +1370,13 @@ nautilus_application_dbus_unregister (GApplication    *app,
         nautilus_shell_search_provider_unregister (priv->search_provider);
         g_clear_object (&priv->search_provider);
     }
+
+    if (priv->previewer_selection_id != 0)
+    {
+        nautilus_previewer_disconnect_selection_event (connection,
+                                                       priv->previewer_selection_id);
+        priv->previewer_selection_id = 0;
+    }
 }
 
 static void
diff --git a/src/nautilus-canvas-container.c b/src/nautilus-canvas-container.c
index 994f519a4..1035fa2b8 100644
--- a/src/nautilus-canvas-container.c
+++ b/src/nautilus-canvas-container.c
@@ -2869,6 +2869,28 @@ keyboard_up (NautilusCanvasContainer *container,
                         closest_in_90_degrees);
 }
 
+void
+nautilus_canvas_container_preview_selection_event (NautilusCanvasContainer *container,
+                                                   GtkDirectionType         direction)
+{
+    if (direction == GTK_DIR_UP)
+    {
+        keyboard_up (container, NULL);
+    }
+    else if (direction == GTK_DIR_DOWN)
+    {
+        keyboard_down (container, NULL);
+    }
+    else if (direction == GTK_DIR_LEFT)
+    {
+        keyboard_left (container, NULL);
+    }
+    else if (direction == GTK_DIR_RIGHT)
+    {
+        keyboard_right (container, NULL);
+    }
+}
+
 static void
 keyboard_space (NautilusCanvasContainer *container,
                 GdkEventKey             *event)
diff --git a/src/nautilus-canvas-container.h b/src/nautilus-canvas-container.h
index bd8de5caf..7955cf34d 100644
--- a/src/nautilus-canvas-container.h
+++ b/src/nautilus-canvas-container.h
@@ -252,6 +252,8 @@ void              nautilus_canvas_container_select_all                    (Nauti
 
 void              nautilus_canvas_container_select_first                  (NautilusCanvasContainer  *view);
 
+void              nautilus_canvas_container_preview_selection_event       (NautilusCanvasContainer  *view,
+                                                                           GtkDirectionType          
direction);
 
 /* operations on the selection */
 GList     *       nautilus_canvas_container_get_selection                 (NautilusCanvasContainer  *view);
diff --git a/src/nautilus-canvas-view.c b/src/nautilus-canvas-view.c
index dbed7586b..4b3197bd7 100644
--- a/src/nautilus-canvas-view.c
+++ b/src/nautilus-canvas-view.c
@@ -1277,6 +1277,18 @@ nautilus_canvas_view_sort_directories_first_changed (NautilusFilesView *director
     nautilus_canvas_container_sort (get_canvas_container (canvas_view));
 }
 
+static void
+nautilus_canvas_view_preview_selection_event (NautilusFilesView *directory_view,
+                                              GtkDirectionType   direction)
+{
+    NautilusCanvasView *canvas_view;
+
+    canvas_view = NAUTILUS_CANVAS_VIEW (directory_view);
+
+    nautilus_canvas_container_preview_selection_event (get_canvas_container (canvas_view),
+                                                       direction);
+}
+
 static char *
 canvas_view_get_container_uri (NautilusCanvasContainer *container,
                                NautilusFilesView       *view)
@@ -1566,6 +1578,7 @@ nautilus_canvas_view_class_init (NautilusCanvasViewClass *klass)
     nautilus_files_view_class->get_first_visible_file = canvas_view_get_first_visible_file;
     nautilus_files_view_class->scroll_to_file = canvas_view_scroll_to_file;
     nautilus_files_view_class->reveal_for_selection_context_menu = 
nautilus_canvas_view_reveal_for_selection_context_menu;
+    nautilus_files_view_class->preview_selection_event = nautilus_canvas_view_preview_selection_event;
 }
 
 static void
diff --git a/src/nautilus-files-view.c b/src/nautilus-files-view.c
index 916de2581..f61b6bce9 100644
--- a/src/nautilus-files-view.c
+++ b/src/nautilus-files-view.c
@@ -1257,6 +1257,13 @@ nautilus_files_view_preview_files (NautilusFilesView *view,
     }
 }
 
+void
+nautilus_files_view_preview_selection_event (NautilusFilesView *view,
+                                             GtkDirectionType   direction)
+{
+    NAUTILUS_FILES_VIEW_CLASS (G_OBJECT_GET_CLASS (view))->preview_selection_event (view, direction);
+}
+
 void
 nautilus_files_view_activate_selection (NautilusFilesView *view)
 {
diff --git a/src/nautilus-files-view.h b/src/nautilus-files-view.h
index 954101bd6..602cf8bec 100644
--- a/src/nautilus-files-view.h
+++ b/src/nautilus-files-view.h
@@ -236,6 +236,9 @@ struct _NautilusFilesViewClass {
         /* Use this to show an optional visual feedback when the directory is empty.
          * By default it shows a widget overlay on top of the view */
         void           (* check_empty_states)          (NautilusFilesView *view);
+
+        void           (* preview_selection_event)     (NautilusFilesView *view,
+                                                        GtkDirectionType   direction);
 };
 
 NautilusFilesView *      nautilus_files_view_new                         (guint               id,
@@ -304,6 +307,8 @@ void              nautilus_files_view_new_file_with_initial_contents (NautilusFi
 
 /* selection handling */
 void              nautilus_files_view_activate_selection         (NautilusFilesView      *view);
+void              nautilus_files_view_preview_selection_event    (NautilusFilesView      *view,
+                                                                  GtkDirectionType        direction);
 void              nautilus_files_view_stop_loading               (NautilusFilesView      *view);
 
 char *            nautilus_files_view_get_first_visible_file     (NautilusFilesView      *view);
diff --git a/src/nautilus-list-view.c b/src/nautilus-list-view.c
index 9b7b7826b..60a615366 100644
--- a/src/nautilus-list-view.c
+++ b/src/nautilus-list-view.c
@@ -3984,6 +3984,65 @@ nautilus_list_view_reveal_for_selection_context_menu (NautilusFilesView *view)
     return rect;
 }
 
+static void
+nautilus_list_view_preview_selection_event (NautilusFilesView *view,
+                                            GtkDirectionType   direction)
+{
+    NautilusListView *list_view;
+    GtkTreeView *tree_view;
+    GtkTreeSelection *selection;
+    GList *list;
+    GtkTreeIter iter;
+    GtkTreePath *path;
+    GtkTreeModel *tree_model;
+    gboolean moved;
+
+    /* We only support up and down movements for the list view */
+    if (direction != GTK_DIR_UP && direction != GTK_DIR_DOWN)
+    {
+        return;
+    }
+
+    list_view = NAUTILUS_LIST_VIEW (view);
+    tree_view = list_view->details->tree_view;
+    selection = gtk_tree_view_get_selection (tree_view);
+    list = gtk_tree_selection_get_selected_rows (selection, &tree_model);
+
+    if (list == NULL)
+    {
+        return;
+    }
+
+    /* Advance the first selected item, since that's what we use for
+     * the previewer */
+    path = list->data;
+    moved = FALSE;
+    if (gtk_tree_model_get_iter (tree_model, &iter, path))
+    {
+        if (direction == GTK_DIR_UP)
+        {
+            moved = gtk_tree_model_iter_previous (tree_model, &iter);
+        }
+        else
+        {
+            moved = gtk_tree_model_iter_next (tree_model, &iter);
+        }
+    }
+
+    if (moved)
+    {
+        g_signal_handlers_block_by_func (selection, list_selection_changed_callback, view);
+
+        gtk_tree_selection_unselect_all (selection);
+        gtk_tree_selection_select_iter (selection, &iter);
+
+        g_signal_handlers_unblock_by_func (selection, list_selection_changed_callback, view);
+        nautilus_files_view_notify_selection_changed (view);
+    }
+
+    g_list_free_full (list, (GDestroyNotify) gtk_tree_path_free);
+}
+
 static void
 nautilus_list_view_class_init (NautilusListViewClass *class)
 {
@@ -4024,6 +4083,7 @@ nautilus_list_view_class_init (NautilusListViewClass *class)
     nautilus_files_view_class->scroll_to_file = list_view_scroll_to_file;
     nautilus_files_view_class->compute_rename_popover_pointing_to = 
nautilus_list_view_compute_rename_popover_pointing_to;
     nautilus_files_view_class->reveal_for_selection_context_menu = 
nautilus_list_view_reveal_for_selection_context_menu;
+    nautilus_files_view_class->preview_selection_event = nautilus_list_view_preview_selection_event;
 }
 
 static void
diff --git a/src/nautilus-previewer.c b/src/nautilus-previewer.c
index aef60e615..e2ac3e885 100644
--- a/src/nautilus-previewer.c
+++ b/src/nautilus-previewer.c
@@ -24,6 +24,10 @@
 
 #include "nautilus-previewer.h"
 
+#include "nautilus-files-view.h"
+#include "nautilus-window.h"
+#include "nautilus-window-slot.h"
+
 #define DEBUG_FLAG NAUTILUS_DEBUG_PREVIEWER
 #include "nautilus-debug.h"
 
@@ -94,3 +98,67 @@ nautilus_previewer_call_close (void)
                             previewer2_method_ready_cb,
                             NULL);
 }
+
+static void
+previewer_selection_event (GDBusConnection *connection,
+                           const gchar     *sender_name,
+                           const gchar     *object_path,
+                           const gchar     *interface_name,
+                           const gchar     *signal_name,
+                           GVariant        *parameters,
+                           gpointer         user_data)
+{
+    GApplication *application = g_application_get_default ();
+    GList *l, *windows = gtk_application_get_windows (GTK_APPLICATION (application));
+    NautilusWindow *window = NULL;
+    NautilusWindowSlot *slot;
+    NautilusView *view;
+    GtkDirectionType direction;
+
+    for (l = windows; l != NULL; l = l->next)
+    {
+        if (NAUTILUS_IS_WINDOW (l->data))
+        {
+            window = l->data;
+            break;
+        }
+    }
+
+    if (window == NULL)
+    {
+        return;
+    }
+
+    slot = nautilus_window_get_active_slot (window);
+    view = nautilus_window_slot_get_current_view (slot);
+
+    if (!NAUTILUS_IS_FILES_VIEW (view))
+    {
+        return;
+    }
+
+    g_variant_get (parameters, "(u)", &direction);
+    nautilus_files_view_preview_selection_event (NAUTILUS_FILES_VIEW (view), direction);
+}
+
+guint
+nautilus_previewer_connect_selection_event (GDBusConnection *connection)
+{
+    return g_dbus_connection_signal_subscribe (connection,
+                                               PREVIEWER_DBUS_NAME,
+                                               PREVIEWER2_DBUS_IFACE,
+                                               "SelectionEvent",
+                                               PREVIEWER_DBUS_PATH,
+                                               NULL,
+                                               G_DBUS_SIGNAL_FLAGS_NONE,
+                                               previewer_selection_event,
+                                               NULL,
+                                               NULL);
+}
+
+void
+nautilus_previewer_disconnect_selection_event (GDBusConnection *connection,
+                                               guint            event_id)
+{
+    g_dbus_connection_signal_unsubscribe (connection, event_id);
+}
diff --git a/src/nautilus-previewer.h b/src/nautilus-previewer.h
index e9e399fbc..7de3d178f 100644
--- a/src/nautilus-previewer.h
+++ b/src/nautilus-previewer.h
@@ -22,6 +22,7 @@
 
 #pragma once
 
+#include <gio/gio.h>
 #include <glib.h>
 
 G_BEGIN_DECLS
@@ -32,4 +33,8 @@ void nautilus_previewer_call_show_file (const gchar *uri,
                                        gboolean     close_if_already_visible);
 void nautilus_previewer_call_close     (void);
 
+guint nautilus_previewer_connect_selection_event (GDBusConnection *connection);
+void  nautilus_previewer_disconnect_selection_event (GDBusConnection *connection,
+                                                     guint            event_id);
+
 G_END_DECLS
diff --git a/src/nautilus-view-icon-controller.c b/src/nautilus-view-icon-controller.c
index e8e3cb1a9..6dbdf1e3e 100644
--- a/src/nautilus-view-icon-controller.c
+++ b/src/nautilus-view-icon-controller.c
@@ -907,6 +907,23 @@ real_select_first (NautilusFilesView *files_view)
 {
 }
 
+static void
+real_preview_selection_event (NautilusFilesView *files_view,
+                              GtkDirectionType direction)
+{
+    NautilusViewIconController *self = NAUTILUS_VIEW_ICON_CONTROLLER (files_view);
+    GtkMovementStep step;
+    gint count;
+    gboolean handled;
+
+    step = (direction == GTK_DIR_UP || direction == GTK_DIR_DOWN) ?
+        GTK_MOVEMENT_DISPLAY_LINES : GTK_MOVEMENT_VISUAL_POSITIONS;
+    count = (direction == GTK_DIR_RIGHT || direction == GTK_DIR_DOWN) ?
+        1 : -1;
+
+    g_signal_emit_by_name (self->view_ui, "move-cursor", step, count, &handled);
+}
+
 static void
 action_zoom_to_level (GSimpleAction *action,
                       GVariant      *state,
@@ -1056,6 +1073,7 @@ nautilus_view_icon_controller_class_init (NautilusViewIconControllerClass *klass
     files_view_class->is_zoom_level_default = real_is_zoom_level_default;
     files_view_class->compute_rename_popover_pointing_to = real_compute_rename_popover_pointing_to;
     files_view_class->reveal_for_selection_context_menu = real_reveal_for_selection_context_menu;
+    files_view_class->preview_selection_event = real_preview_selection_event;
 }
 
 static void


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