diff options
author | Benjamin Otte <otte@redhat.com> | 2023-03-02 21:27:52 +0100 |
---|---|---|
committer | Benjamin Otte <otte.benjamin@googlemail.com> | 2023-03-05 15:23:20 +0000 |
commit | f3c53ae69d464b50903450c336e3dd1a275c8c3e (patch) | |
tree | 2e5b4e1f7bc29b54ac42d1a087259937b34133af | |
parent | 8aea6fc1b540d9d27e0eb9e9bd7620a957b26b21 (diff) | |
download | gtk+-f3c53ae69d464b50903450c336e3dd1a275c8c3e.tar.gz |
listview: Simplify allocation
With the Tile changes, a lot of stuff does no longer need to be
duplicated between listview and gridview. Move it to ListBase instead.
-rw-r--r-- | gtk/gtkgridview.c | 23 | ||||
-rw-r--r-- | gtk/gtklistbase.c | 60 | ||||
-rw-r--r-- | gtk/gtklistbaseprivate.h | 16 | ||||
-rw-r--r-- | gtk/gtklistview.c | 17 |
4 files changed, 45 insertions, 71 deletions
diff --git a/gtk/gtkgridview.c b/gtk/gtkgridview.c index ebc32169cf..93d00a4537 100644 --- a/gtk/gtkgridview.c +++ b/gtk/gtkgridview.c @@ -624,21 +624,19 @@ gtk_grid_view_size_allocate (GtkWidget *widget, GtkListTile *tile, *start; GArray *heights; int min_row_height, unknown_row_height, row_height, col_min, col_nat; - GtkOrientation orientation, opposite_orientation; + GtkOrientation orientation; GtkScrollablePolicy scroll_policy; - GdkRectangle bounds; - int x, y; + int y; guint i; orientation = gtk_list_base_get_orientation (GTK_LIST_BASE (self)); scroll_policy = gtk_list_base_get_scroll_policy (GTK_LIST_BASE (self), orientation); - opposite_orientation = OPPOSITE_ORIENTATION (orientation); min_row_height = ceil ((double) height / GTK_GRID_VIEW_MAX_VISIBLE_ROWS); /* step 0: exit early if list is empty */ if (gtk_list_item_manager_get_root (self->item_manager) == NULL) { - gtk_list_base_update_adjustments (GTK_LIST_BASE (self), 0, 0, 0, 0, &x, &y); + gtk_list_base_allocate (GTK_LIST_BASE (self)); return; } @@ -756,19 +754,8 @@ gtk_grid_view_size_allocate (GtkWidget *widget, } } - gtk_list_item_manager_get_tile_bounds (self->item_manager, &bounds); - - /* step 4: update the adjustments */ - gtk_list_base_update_adjustments (GTK_LIST_BASE (self), - bounds.width, - bounds.height, - gtk_widget_get_size (widget, opposite_orientation), - gtk_widget_get_size (widget, orientation), - &x, &y); - - gtk_list_base_allocate_children (GTK_LIST_BASE (widget)); - - gtk_list_base_allocate_rubberband (GTK_LIST_BASE (widget)); + /* step 4: allocate the rest */ + gtk_list_base_allocate (GTK_LIST_BASE (self)); } static void diff --git a/gtk/gtklistbase.c b/gtk/gtklistbase.c index d4996d74a3..2008f9a055 100644 --- a/gtk/gtklistbase.c +++ b/gtk/gtklistbase.c @@ -1355,7 +1355,7 @@ update_autoscroll (GtkListBase *self, remove_autoscroll (self); } -/** +/* * gtk_list_base_size_allocate_child: * @self: The listbase * @child: The child @@ -1368,7 +1368,7 @@ update_autoscroll (GtkListBase *self, * but with the coordinates already offset by the scroll * offset. **/ -void +static void gtk_list_base_size_allocate_child (GtkListBase *self, GtkWidget *child, int x, @@ -1432,7 +1432,7 @@ gtk_list_base_size_allocate_child (GtkListBase *self, gtk_widget_size_allocate (child, &child_allocation, -1); } -void +static void gtk_list_base_allocate_children (GtkListBase *self) { GtkListBasePrivate *priv = gtk_list_base_get_instance_private (self); @@ -1537,7 +1537,7 @@ gtk_list_base_get_rubberband_coords (GtkListBase *self, return TRUE; } -void +static void gtk_list_base_allocate_rubberband (GtkListBase *self) { GtkListBasePrivate *priv = gtk_list_base_get_instance_private (self); @@ -1912,7 +1912,7 @@ gtk_list_base_init_real (GtkListBase *self, gtk_widget_add_controller (GTK_WIDGET (self), controller); } -static int +static void gtk_list_base_set_adjustment_values (GtkListBase *self, GtkOrientation orientation, int value, @@ -1940,23 +1940,24 @@ gtk_list_base_set_adjustment_values (GtkListBase *self, g_signal_handlers_unblock_by_func (priv->adjustment[orientation], gtk_list_base_adjustment_value_changed_cb, self); - - return value; } -void -gtk_list_base_update_adjustments (GtkListBase *self, - int total_across, - int total_along, - int page_across, - int page_along, - int *across, - int *along) +static void +gtk_list_base_update_adjustments (GtkListBase *self) { GtkListBasePrivate *priv = gtk_list_base_get_instance_private (self); + GdkRectangle bounds; int value_along, value_across, size; + int page_along, page_across; guint pos; + gtk_list_item_manager_get_tile_bounds (priv->item_manager, &bounds); + g_assert (bounds.x == 0); + g_assert (bounds.y == 0); + + page_across = gtk_widget_get_size (GTK_WIDGET (self), OPPOSITE_ORIENTATION (priv->orientation)); + page_along = gtk_widget_get_size (GTK_WIDGET (self), priv->orientation); + pos = gtk_list_item_tracker_get_position (priv->item_manager, priv->anchor); if (pos == GTK_INVALID_LIST_POSITION) { @@ -1987,16 +1988,25 @@ gtk_list_base_update_adjustments (GtkListBase *self, } } - *across = gtk_list_base_set_adjustment_values (self, - OPPOSITE_ORIENTATION (priv->orientation), - value_across, - total_across, - page_across); - *along = gtk_list_base_set_adjustment_values (self, - priv->orientation, - value_along, - total_along, - page_along); + gtk_list_base_set_adjustment_values (self, + OPPOSITE_ORIENTATION (priv->orientation), + value_across, + bounds.width, + page_across); + gtk_list_base_set_adjustment_values (self, + priv->orientation, + value_along, + bounds.height, + page_along); +} + +void +gtk_list_base_allocate (GtkListBase *self) +{ + gtk_list_base_update_adjustments (self); + + gtk_list_base_allocate_children (self); + gtk_list_base_allocate_rubberband (self); } GtkScrollablePolicy diff --git a/gtk/gtklistbaseprivate.h b/gtk/gtklistbaseprivate.h index e6047a758c..a418bec6cd 100644 --- a/gtk/gtklistbaseprivate.h +++ b/gtk/gtklistbaseprivate.h @@ -76,13 +76,6 @@ guint gtk_list_base_get_n_items (GtkListBase GtkSelectionModel * gtk_list_base_get_model (GtkListBase *self); gboolean gtk_list_base_set_model (GtkListBase *self, GtkSelectionModel *model); -void gtk_list_base_update_adjustments (GtkListBase *self, - int total_across, - int total_along, - int page_across, - int page_along, - int *across, - int *along); guint gtk_list_base_get_anchor (GtkListBase *self); void gtk_list_base_set_anchor (GtkListBase *self, @@ -107,14 +100,7 @@ gboolean gtk_list_base_grab_focus_on_item (GtkListBase void gtk_list_base_set_enable_rubberband (GtkListBase *self, gboolean enable); gboolean gtk_list_base_get_enable_rubberband (GtkListBase *self); -void gtk_list_base_allocate_rubberband (GtkListBase *self); -void gtk_list_base_allocate_children (GtkListBase *self); -void gtk_list_base_size_allocate_child (GtkListBase *self, - GtkWidget *child, - int x, - int y, - int width, - int height); +void gtk_list_base_allocate (GtkListBase *self); #endif /* __GTK_LIST_BASE_PRIVATE_H__ */ diff --git a/gtk/gtklistview.c b/gtk/gtklistview.c index 3c939da806..408870bccd 100644 --- a/gtk/gtklistview.c +++ b/gtk/gtklistview.c @@ -506,8 +506,7 @@ gtk_list_view_size_allocate (GtkWidget *widget, GtkListView *self = GTK_LIST_VIEW (widget); GtkListTile *tile; GArray *heights; - int min, nat, row_height; - int x, y; + int min, nat, row_height, y; GtkOrientation orientation, opposite_orientation; GtkScrollablePolicy scroll_policy, opposite_scroll_policy; @@ -519,7 +518,7 @@ gtk_list_view_size_allocate (GtkWidget *widget, /* step 0: exit early if list is empty */ if (gtk_list_item_manager_get_root (self->item_manager) == NULL) { - gtk_list_base_update_adjustments (GTK_LIST_BASE (self), 0, 0, 0, 0, &x, &y); + gtk_list_base_allocate (GTK_LIST_BASE (self)); return; } @@ -570,16 +569,8 @@ gtk_list_view_size_allocate (GtkWidget *widget, y += tile->area.height; } - /* step 4: update the adjustments */ - gtk_list_base_update_adjustments (GTK_LIST_BASE (self), - self->list_width, - gtk_list_view_get_list_height (self), - gtk_widget_get_size (widget, opposite_orientation), - gtk_widget_get_size (widget, orientation), - &x, &y); - - gtk_list_base_allocate_children (GTK_LIST_BASE (self)); - gtk_list_base_allocate_rubberband (GTK_LIST_BASE (self)); + /* step 4: allocate the rest */ + gtk_list_base_allocate (GTK_LIST_BASE (self)); } static void |