[nautilus/antonioffix-menus-and-popovers: 24/28] canvas-view: Reveal the focused or last selected item
- From: Carlos Soriano <csoriano src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [nautilus/antonioffix-menus-and-popovers: 24/28] canvas-view: Reveal the focused or last selected item
- Date: Tue, 23 Jan 2018 08:25:18 +0000 (UTC)
commit 5a11ccf26283945a26af5fe8980b4458b74e6b74
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 | 59 ++++++++++++++++++++++++-----------------
3 files changed, 74 insertions(+), 24 deletions(-)
---
diff --git a/src/nautilus-canvas-container.c b/src/nautilus-canvas-container.c
index 0f69bdf68..a2662e1d6 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);
@@ -4616,6 +4618,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 605fccfc1..233929aa8 100644
--- a/src/nautilus-canvas-view.c
+++ b/src/nautilus-canvas-view.c
@@ -914,56 +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, *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));
+ bounding_box = nautilus_canvas_container_get_icon_bounding_box (canvas_container, data);
+ if (bounding_box != NULL)
+ {
+ GtkAdjustment *vadjustment, *hadjustment;
+ GtkWidget *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;
+ 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));
- g_array_free (bounding_boxes, FALSE);
+ 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);
+
+ /* 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)
+ {
+ selection = g_list_last (selection);
+ data = NAUTILUS_CANVAS_ICON_DATA (selection->data);
+ }
+
+ nautilus_canvas_container_reveal (container, data);
if (revealed_area)
{
- get_revealed_rectangle (view, revealed_area);
+ get_revealed_rectangle (view, data, revealed_area);
}
}
-
- nautilus_file_list_free (selection);
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]