[nautilus/antonioffix-menus-and-popovers: 11/14] canvas-view: Reveal the focused or last selected item



commit 13dc4cd3d62bc1dd068e0231b9c440068b4338f0
Author: António Fernandes <antoniof gnome org>
Date:   Fri Jan 12 21:53:53 2018 +0000

    canvas-view: Reveal the focused or last selected item
    
    For consistency with list view, as implemented by the previous commit.

 src/nautilus-canvas-container.c | 36 ++++++++++++++++++++++
 src/nautilus-canvas-container.h |  3 ++
 src/nautilus-canvas-view.c      | 68 +++++++++++++++++++++++------------------
 3 files changed, 78 insertions(+), 29 deletions(-)
---
diff --git a/src/nautilus-canvas-container.c b/src/nautilus-canvas-container.c
index f42d56d60..916adf60c 100644
--- a/src/nautilus-canvas-container.c
+++ b/src/nautilus-canvas-container.c
@@ -146,6 +146,8 @@ static void          handle_hadjustment_changed (GtkAdjustment           *adjust
 static void          handle_vadjustment_changed (GtkAdjustment           *adjustment,
                                                  NautilusCanvasContainer *container);
 static GList *nautilus_canvas_container_get_selected_icons (NautilusCanvasContainer *container);
+static GArray *nautilus_canvas_container_get_icons_bounding_box (NautilusCanvasContainer *container,
+                                                                 GList                   *icons);
 static void          nautilus_canvas_container_update_visible_icons (NautilusCanvasContainer *container);
 static void          reveal_icon (NautilusCanvasContainer *container,
                                   NautilusCanvasIcon      *icon);
@@ -4594,6 +4596,40 @@ nautilus_canvas_container_get_first_visible_icon (NautilusCanvasContainer *conta
     return best_icon ? best_icon->data : NULL;
 }
 
+NautilusCanvasIconData *
+nautilus_canvas_container_get_focused_icon (NautilusCanvasContainer  *container)
+{
+    NautilusCanvasIcon *icon;
+
+    icon = container->details->focus;
+
+    if (icon != NULL)
+    {
+        return icon->data;
+    }
+
+    return NULL;
+}
+
+GdkRectangle *
+nautilus_canvas_container_get_icon_bounding_box (NautilusCanvasContainer  *container,
+                                                 NautilusCanvasIconData       *data)
+{
+    NautilusCanvasIcon *icon;
+
+    g_autoptr (GList) list = NULL;
+    g_autoptr (GArray) bounding_boxes = NULL;
+
+    g_return_val_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container), NULL);
+    g_return_val_if_fail (data != NULL, NULL);
+
+    icon = g_hash_table_lookup (container->details->icon_set, data);
+    list = g_list_prepend (list, icon);
+    bounding_boxes = nautilus_canvas_container_get_icons_bounding_box (container, list);
+
+    return g_memdup (&g_array_index (bounding_boxes, GdkRectangle, 0), sizeof (GdkRectangle));
+}
+
 /* puts the icon at the top of the screen */
 void
 nautilus_canvas_container_scroll_to_canvas (NautilusCanvasContainer *container,
diff --git a/src/nautilus-canvas-container.h b/src/nautilus-canvas-container.h
index 63cec4b6b..9da9fa61f 100644
--- a/src/nautilus-canvas-container.h
+++ b/src/nautilus-canvas-container.h
@@ -226,6 +226,9 @@ void              nautilus_canvas_container_reveal                        (Nauti
                                                                           NautilusCanvasIconData       
*data);
 gboolean          nautilus_canvas_container_is_empty                      (NautilusCanvasContainer  
*container);
 NautilusCanvasIconData *nautilus_canvas_container_get_first_visible_icon        (NautilusCanvasContainer  
*container);
+NautilusCanvasIconData *nautilus_canvas_container_get_focused_icon              (NautilusCanvasContainer  
*container);
+GdkRectangle      *nautilus_canvas_container_get_icon_bounding_box          (NautilusCanvasContainer  
*container,
+                                                                            NautilusCanvasIconData       
*data);
 void              nautilus_canvas_container_scroll_to_canvas                (NautilusCanvasContainer  
*container,
                                                                             NautilusCanvasIconData       
*data);
 
diff --git a/src/nautilus-canvas-view.c b/src/nautilus-canvas-view.c
index da35af282..dba36e8ed 100644
--- a/src/nautilus-canvas-view.c
+++ b/src/nautilus-canvas-view.c
@@ -914,57 +914,67 @@ nautilus_canvas_view_select_first (NautilusFilesView *view)
 }
 
 static void
-get_revealed_rectangle (NautilusFilesView *view,
-                        GdkRectangle      *rect)
+get_revealed_rectangle (NautilusFilesView      *view,
+                        NautilusCanvasIconData *data,
+                        GdkRectangle           *rect)
 {
-    GArray *bounding_boxes;
-    g_autofree GdkRectangle *bounding_box;
     NautilusCanvasContainer *canvas_container;
-    GtkAdjustment *vadjustment;
-    GtkAdjustment *hadjustment;
-    GtkWidget *parent_container;
-
+    g_autofree GdkRectangle *bounding_box = NULL;
     canvas_container = get_canvas_container (NAUTILUS_CANVAS_VIEW (view));
-    bounding_boxes = nautilus_canvas_container_get_selected_icons_bounding_box (canvas_container);
-    bounding_box = &g_array_index (bounding_boxes, GdkRectangle, 0);
-    parent_container = nautilus_files_view_get_content_widget (view);
-    vadjustment = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (parent_container));
-    hadjustment = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (parent_container));
-
-    rect->x = bounding_box->x - gtk_adjustment_get_value (hadjustment);
-    rect->y = bounding_box->y - gtk_adjustment_get_value (vadjustment);
-    rect->width = bounding_box->width;
-    rect->height = bounding_box->height;
-
-    g_array_free (bounding_boxes, FALSE);
+    bounding_box = nautilus_canvas_container_get_icon_bounding_box (canvas_container, data);
+    if (bounding_box != NULL)
+    {
+        GtkWidget *parent_container;
+        GtkAdjustment *vadjustment;
+        GtkAdjustment *hadjustment;
+
+        parent_container = nautilus_files_view_get_content_widget (view);
+        vadjustment = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (parent_container));
+        hadjustment = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (parent_container));
+
+        rect->x = bounding_box->x - gtk_adjustment_get_value (hadjustment);
+        rect->y = bounding_box->y - gtk_adjustment_get_value (vadjustment);
+        rect->width = bounding_box->width;
+        rect->height = bounding_box->height;
+    }
 }
 
 static void
 nautilus_canvas_view_reveal_selection (NautilusFilesView *view,
                                        GdkRectangle      *revealed_area)
 {
-    GList *selection;
+    NautilusCanvasContainer *container;
+    g_autoptr (GList) selection = NULL;
 
     g_return_if_fail (NAUTILUS_IS_CANVAS_VIEW (view));
 
+    container = get_canvas_container (NAUTILUS_CANVAS_VIEW (view));
     selection = nautilus_view_get_selection (NAUTILUS_VIEW (view));
 
     /* Make sure at least one of the selected items is scrolled into view */
     if (selection != NULL)
     {
+        NautilusCanvasIconData *data;
+
         /* Update the icon ordering to reveal the rigth selection */
-        nautilus_canvas_container_layout_now (get_canvas_container (NAUTILUS_CANVAS_VIEW (view)));
-        nautilus_canvas_container_reveal
-            (get_canvas_container (NAUTILUS_CANVAS_VIEW (view)),
-            selection->data);
+        nautilus_canvas_container_layout_now (container);
 
-        if (revealed_area)
+        /* Get the data of the focused item, if selected. Otherwise, get the
+         * data of the last selected item.*/
+        data = nautilus_canvas_container_get_focused_icon (container);
+        if (!data || g_list_index (selection, NAUTILUS_FILE (data)) == -1)
         {
-            get_revealed_rectangle (view, revealed_area);
+            selection = g_list_last (selection);
+            data = NAUTILUS_CANVAS_ICON_DATA (selection->data);
         }
-    }
 
-    nautilus_file_list_free (selection);
+        nautilus_canvas_container_reveal (container, data);
+
+        if (revealed_area != NULL)
+        {
+            get_revealed_rectangle (view, data, revealed_area);
+        }
+    }
 }
 
 static void


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