summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmmanuele Bassi <ebassi@gnome.org>2019-04-01 18:02:22 +0100
committerEmmanuele Bassi <ebassi@gnome.org>2019-04-01 18:02:22 +0100
commit7b17f6fedeabffeb2012ca0a66edffebfc5aa19b (patch)
tree51217111ec7cfb914bb68ae65f5dc7e2c7ca018a
parent060e30de3f5affd9a98de7d21c8071d86252ee64 (diff)
downloadgtk+-7b17f6fedeabffeb2012ca0a66edffebfc5aa19b.tar.gz
WIP: Additional API for GtkLayout
-rw-r--r--gtk/gtkfixedlayout.c88
-rw-r--r--gtk/gtkfixedlayout.h15
2 files changed, 89 insertions, 14 deletions
diff --git a/gtk/gtkfixedlayout.c b/gtk/gtkfixedlayout.c
index 0895753edf..58abd02d4d 100644
--- a/gtk/gtkfixedlayout.c
+++ b/gtk/gtkfixedlayout.c
@@ -71,6 +71,11 @@
struct _GtkFixedLayout
{
GtkLayoutManager parent_instance;
+
+ int min_width;
+ int min_height;
+
+ GskTransform *child_transform;
};
struct _GtkFixedLayoutChild
@@ -229,7 +234,8 @@ gtk_fixed_layout_measure (GtkLayoutManager *layout_manager,
{
int child_min = 0, child_nat = 0;
int child_min_opp = 0, child_nat_opp = 0;
- graphene_rect_t min_rect, nat_rect;
+ graphene_rect_t nat_rect;
+ GskTransform *transform = NULL;
if (!gtk_widget_get_visible (child))
continue;
@@ -243,23 +249,16 @@ gtk_fixed_layout_measure (GtkLayoutManager *layout_manager,
&child_min_opp, &child_nat_opp,
NULL, NULL);
- gsk_transform_transform_bounds (child_info->position,
- &GRAPHENE_RECT_INIT (0.f, 0.f, child_min, child_min_opp),
- &min_rect);
- gsk_transform_transform_bounds (child_info->position,
+ transform = gsk_transform_transform (transform, child_info->position);
+ gsk_transform_transform_bounds (transform,
&GRAPHENE_RECT_INIT (0.f, 0.f, child_nat, child_nat_opp),
&nat_rect);
+ gsk_transform_unref (transform);
if (orientation == GTK_ORIENTATION_HORIZONTAL)
- {
- minimum_size = MAX (minimum_size, min_rect.origin.x + min_rect.size.width);
- natural_size = MAX (natural_size, nat_rect.origin.x + nat_rect.size.width);
- }
+ natural_size = MAX (natural_size, nat_rect.origin.x + nat_rect.size.width);
else
- {
- minimum_size = MAX (minimum_size, min_rect.origin.y + min_rect.size.height);
- natural_size = MAX (natural_size, nat_rect.origin.y + nat_rect.size.height);
- }
+ natural_size = MAX (natural_size, nat_rect.origin.y + nat_rect.size.height);
}
if (minimum != NULL)
@@ -275,7 +274,9 @@ gtk_fixed_layout_allocate (GtkLayoutManager *layout_manager,
int height,
int baseline)
{
+ GtkFixedLayout *self = GTK_FIXED_LAYOUT (layout_manager);
GtkFixedLayoutChild *child_info;
+ GskTransform *transform;
GtkWidget *child;
for (child = _gtk_widget_get_first_child (widget);
@@ -290,11 +291,17 @@ gtk_fixed_layout_allocate (GtkLayoutManager *layout_manager,
child_info = GTK_FIXED_LAYOUT_CHILD (gtk_layout_manager_get_layout_child (layout_manager, child));
gtk_widget_get_preferred_size (child, &child_req, NULL);
+ transform = NULL;
+ transform = gsk_transform_transform (transform, self->child_transform);
+ transform = gsk_transform_transform (transform, child_info->position);
+
gtk_widget_allocate (child,
child_req.width,
child_req.height,
-1,
- child_info->position);
+ transform);
+
+ gsk_transform_unref (transform);
}
}
@@ -329,3 +336,56 @@ gtk_fixed_layout_new (void)
{
return g_object_new (GTK_TYPE_FIXED_LAYOUT, NULL);
}
+
+void
+gtk_fixed_layout_set_minimum_size (GtkFixedLayout *layout,
+ int min_width,
+ int min_height)
+{
+ g_return_if_fail (GTK_IS_FIXED_LAYOUT (layout));
+
+ if (layout->min_width != min_width)
+ layout->min_width = min_width;
+
+ if (layout->min_height != min_height)
+ layout->min_height = min_height;
+
+ gtk_layout_manager_layout_changed (GTK_LAYOUT_MANAGER (layout));
+}
+
+void
+gtk_fixed_layout_get_minimum_size (GtkFixedLayout *layout,
+ int *min_width,
+ int *min_height)
+{
+ g_return_if_fail (GTK_IS_FIXED_LAYOUT (layout));
+
+ if (min_width != NULL)
+ *min_width = layout->min_width;
+
+ if (min_height != NULL)
+ *min_height = layout->min_height;
+}
+
+void
+gtk_fixed_layout_set_child_transform (GtkFixedLayout *layout,
+ GskTransform *transform)
+{
+ g_return_if_fail (GTK_IS_FIXED_LAYOUT (layout));
+
+ if (layout->child_transform == transform)
+ return;
+
+ gsk_transform_unref (layout->child_transform);
+ layout->child_transform = gsk_transform_ref (transform);
+
+ gtk_layout_manager_layout_changed (GTK_LAYOUT_MANAGER (layout));
+}
+
+GskTransform *
+gtk_fixed_layout_get_child_transform (GtkFixedLayout *layout)
+{
+ g_return_val_if_fail (GTK_IS_FIXED_LAYOUT (layout), NULL);
+
+ return layout->child_transform;
+}
diff --git a/gtk/gtkfixedlayout.h b/gtk/gtkfixedlayout.h
index 090aceb138..aef62bc03f 100644
--- a/gtk/gtkfixedlayout.h
+++ b/gtk/gtkfixedlayout.h
@@ -20,6 +20,7 @@
#pragma once
+#include <gsk/gsk.h>
#include <gtk/gtklayoutmanager.h>
G_BEGIN_DECLS
@@ -35,6 +36,20 @@ G_DECLARE_FINAL_TYPE (GtkFixedLayout, gtk_fixed_layout, GTK, FIXED_LAYOUT, GtkLa
GDK_AVAILABLE_IN_ALL
GtkLayoutManager * gtk_fixed_layout_new (void);
+GDK_AVAILABLE_IN_ALL
+void gtk_fixed_layout_set_minimum_size (GtkFixedLayout *layout,
+ int min_width,
+ int min_height);
+GDK_AVAILABLE_IN_ALL
+void gtk_fixed_layout_get_minimum_size (GtkFixedLayout *layout,
+ int *min_width,
+ int *min_height);
+GDK_AVAILABLE_IN_ALL
+void gtk_fixed_layout_set_child_transform (GtkFixedLayout *layout,
+ GskTransform *transform);
+GDK_AVAILABLE_IN_ALL
+GskTransform * gtk_fixed_layout_get_child_transform (GtkFixedLayout *layout);
+
/* GtkFixedLayoutChild */
GDK_AVAILABLE_IN_ALL