diff options
author | Matthias Clasen <mclasen@redhat.com> | 2016-04-28 21:27:02 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2016-05-05 15:04:00 -0400 |
commit | fc04d6613a6a2c994b151f7704693417d7a2a794 (patch) | |
tree | 71f9c1ac2ce9ecc205691c88d67f4249eb7c5d1b | |
parent | 515c665b7fe8e53059232b13968e5d299bae0c69 (diff) | |
download | gtk+-fc04d6613a6a2c994b151f7704693417d7a2a794.tar.gz |
box gadget: allow reversing alignments
In RTL, we want to interpret GTK_ALIGN_START and _END
in the opposite way. Since we don't give gadgets a text
direction, just allow setting an align_reverse flag
to the box gadget.
-rw-r--r-- | gtk/gtkboxgadget.c | 34 | ||||
-rw-r--r-- | gtk/gtkboxgadgetprivate.h | 2 |
2 files changed, 32 insertions, 4 deletions
diff --git a/gtk/gtkboxgadget.c b/gtk/gtkboxgadget.c index 6533b6e77a..e8198d7d97 100644 --- a/gtk/gtkboxgadget.c +++ b/gtk/gtkboxgadget.c @@ -38,9 +38,10 @@ struct _GtkBoxGadgetPrivate { GtkOrientation orientation; GArray *children; - guint draw_focus : 1; - guint draw_reverse : 1; + guint draw_focus : 1; + guint draw_reverse : 1; guint allocate_reverse : 1; + guint align_reverse : 1; }; typedef gboolean (* ComputeExpandFunc) (GObject *object, GtkOrientation orientation); @@ -84,6 +85,21 @@ gtk_box_gadget_child_get_align (GtkBoxGadget *gadget, return align; } +static GtkAlign +effective_align (GtkAlign align, + gboolean reverse) +{ + switch (align) + { + case GTK_ALIGN_START: + return reverse ? GTK_ALIGN_END : GTK_ALIGN_START; + case GTK_ALIGN_END: + return reverse ? GTK_ALIGN_START : GTK_ALIGN_END; + default: + return align; + } +} + static void gtk_box_gadget_measure_child (GObject *child, GtkOrientation orientation, @@ -304,6 +320,7 @@ gtk_box_gadget_allocate_child (GObject *child, allocation->width, &minimum, &natural, &minimum_baseline, &natural_baseline); + switch (child_align) { case GTK_ALIGN_FILL: @@ -407,7 +424,7 @@ gtk_box_gadget_allocate (GtkCssGadget *gadget, child_align = gtk_box_gadget_child_get_align (GTK_BOX_GADGET (gadget), child); gtk_box_gadget_allocate_child (child->object, priv->orientation, - child_align, + effective_align (child_align, priv->align_reverse), &child_allocation, baseline, &child_clip); @@ -441,7 +458,7 @@ gtk_box_gadget_allocate (GtkCssGadget *gadget, child_align = gtk_box_gadget_child_get_align (GTK_BOX_GADGET (gadget), child); gtk_box_gadget_allocate_child (child->object, priv->orientation, - child_align, + effective_align (child_align, priv->align_reverse), &child_allocation, -1, &child_clip); @@ -595,6 +612,15 @@ gtk_box_gadget_set_allocate_reverse (GtkBoxGadget *gadget, priv->allocate_reverse = allocate_reverse; } +void +gtk_box_gadget_set_align_reverse (GtkBoxGadget *gadget, + gboolean align_reverse) +{ + GtkBoxGadgetPrivate *priv = gtk_box_gadget_get_instance_private (gadget); + + priv->align_reverse = align_reverse; +} + static GtkCssNode * get_css_node (GObject *child) { diff --git a/gtk/gtkboxgadgetprivate.h b/gtk/gtkboxgadgetprivate.h index 008fd1671b..ce1a667a29 100644 --- a/gtk/gtkboxgadgetprivate.h +++ b/gtk/gtkboxgadgetprivate.h @@ -63,6 +63,8 @@ void gtk_box_gadget_set_draw_reverse (GtkBoxGadget void gtk_box_gadget_set_allocate_reverse (GtkBoxGadget *gadget, gboolean allocate_reverse); +void gtk_box_gadget_set_align_reverse (GtkBoxGadget *gadget, + gboolean align_reverse); void gtk_box_gadget_insert_widget (GtkBoxGadget *gadget, int pos, GtkWidget *widget); |