summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2016-04-28 21:27:02 -0400
committerMatthias Clasen <mclasen@redhat.com>2016-05-05 15:04:00 -0400
commitfc04d6613a6a2c994b151f7704693417d7a2a794 (patch)
tree71f9c1ac2ce9ecc205691c88d67f4249eb7c5d1b
parent515c665b7fe8e53059232b13968e5d299bae0c69 (diff)
downloadgtk+-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.c34
-rw-r--r--gtk/gtkboxgadgetprivate.h2
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);