[gtk+] boxgadget: Add ability to draw children in reverse



commit 245d217e06be3b84aae877aea50c1737732e0c15
Author: Benjamin Otte <otte gnome org>
Date:   Sat Feb 27 03:56:07 2016 +0100

    boxgadget: Add ability to draw children in reverse
    
    This is necessary for GtkNotebook so that the stack is always drawn
    before the header.
    And that is necessary so that the active tab can use negative
    margins to overdraw the border of the stack to create a gap and
    simulate old GTK2-style visuals for notebooks.

 gtk/gtkboxgadget.c        |   18 +++++++++++++++---
 gtk/gtkboxgadgetprivate.h |    2 ++
 gtk/gtknotebook.c         |    5 +++++
 3 files changed, 22 insertions(+), 3 deletions(-)
---
diff --git a/gtk/gtkboxgadget.c b/gtk/gtkboxgadget.c
index c5657a9..e47f64b 100644
--- a/gtk/gtkboxgadget.c
+++ b/gtk/gtkboxgadget.c
@@ -36,8 +36,10 @@
 typedef struct _GtkBoxGadgetPrivate GtkBoxGadgetPrivate;
 struct _GtkBoxGadgetPrivate {
   GtkOrientation orientation;
-  gboolean draw_focus;
   GArray *children;
+
+  guint draw_focus : 1;
+  guint draw_reverse : 1;
 };
 
 typedef gboolean (* ComputeExpandFunc) (GObject *object, GtkOrientation orientation);
@@ -452,9 +454,10 @@ gtk_box_gadget_draw (GtkCssGadget *gadget,
   GtkWidget *owner = gtk_css_gadget_get_owner (gadget);
   guint i;
 
-  for (i = 0 ; i < priv->children->len; i++)
+  for (i = 0; i < priv->children->len; i++)
     {
-      GtkBoxGadgetChild *child = &g_array_index (priv->children, GtkBoxGadgetChild, i);
+      guint draw_index = priv->draw_reverse ? priv->children->len - 1 - i : i;
+      GtkBoxGadgetChild *child = &g_array_index (priv->children, GtkBoxGadgetChild, draw_index);
 
       if (GTK_IS_WIDGET (child->object))
         gtk_container_propagate_draw (GTK_CONTAINER (owner), GTK_WIDGET (child->object), cr);
@@ -559,6 +562,15 @@ gtk_box_gadget_set_draw_focus (GtkBoxGadget *gadget,
   priv->draw_focus = draw_focus;
 }
 
+void
+gtk_box_gadget_set_draw_reverse (GtkBoxGadget *gadget,
+                                 gboolean      draw_reverse)
+{
+  GtkBoxGadgetPrivate *priv = gtk_box_gadget_get_instance_private (gadget);
+
+  priv->draw_reverse = draw_reverse;
+}
+
 static GtkCssNode *
 get_css_node (GObject *child)
 {
diff --git a/gtk/gtkboxgadgetprivate.h b/gtk/gtkboxgadgetprivate.h
index e59ab9a..2fd2240 100644
--- a/gtk/gtkboxgadgetprivate.h
+++ b/gtk/gtkboxgadgetprivate.h
@@ -58,6 +58,8 @@ void                    gtk_box_gadget_set_orientation          (GtkBoxGadget
                                                                  GtkOrientation          orientation);
 void                    gtk_box_gadget_set_draw_focus           (GtkBoxGadget           *gadget,
                                                                  gboolean                draw_focus);
+void                    gtk_box_gadget_set_draw_reverse         (GtkBoxGadget           *gadget,
+                                                                 gboolean                draw_reverse);
 
 void                    gtk_box_gadget_insert_widget            (GtkBoxGadget           *gadget,
                                                                  int                     pos,
diff --git a/gtk/gtknotebook.c b/gtk/gtknotebook.c
index abd62b2..4b2a75b 100644
--- a/gtk/gtknotebook.c
+++ b/gtk/gtknotebook.c
@@ -1304,6 +1304,7 @@ gtk_notebook_init (GtkNotebook *notebook)
                                               GTK_WIDGET (notebook));
   gtk_css_gadget_add_class (priv->gadget, GTK_STYLE_CLASS_FRAME);
   gtk_box_gadget_set_orientation (GTK_BOX_GADGET (priv->gadget), GTK_ORIENTATION_VERTICAL);
+  gtk_box_gadget_set_draw_reverse (GTK_BOX_GADGET (priv->gadget), TRUE);
 
   priv->stack_gadget = gtk_css_custom_gadget_new ("stack",
                                                   GTK_WIDGET (notebook),
@@ -6995,6 +6996,7 @@ gtk_notebook_update_tab_pos (GtkNotebook *notebook)
     case GTK_POS_TOP:
       if (priv->show_tabs)
         gtk_box_gadget_insert_gadget (GTK_BOX_GADGET (priv->gadget), 0, priv->header_gadget, FALSE, FALSE, 
GTK_ALIGN_FILL);
+      gtk_box_gadget_set_draw_reverse (GTK_BOX_GADGET (priv->gadget), TRUE);
       gtk_box_gadget_set_orientation (GTK_BOX_GADGET (priv->gadget), GTK_ORIENTATION_VERTICAL);
       gtk_box_gadget_set_orientation (GTK_BOX_GADGET (priv->header_gadget), GTK_ORIENTATION_HORIZONTAL);
       break;
@@ -7002,6 +7004,7 @@ gtk_notebook_update_tab_pos (GtkNotebook *notebook)
     case GTK_POS_BOTTOM:
       if (priv->show_tabs)
         gtk_box_gadget_insert_gadget (GTK_BOX_GADGET (priv->gadget), 1, priv->header_gadget, FALSE, FALSE, 
GTK_ALIGN_FILL);
+      gtk_box_gadget_set_draw_reverse (GTK_BOX_GADGET (priv->gadget), FALSE);
       gtk_box_gadget_set_orientation (GTK_BOX_GADGET (priv->gadget), GTK_ORIENTATION_VERTICAL);
       gtk_box_gadget_set_orientation (GTK_BOX_GADGET (priv->header_gadget), GTK_ORIENTATION_HORIZONTAL);
       break;
@@ -7009,6 +7012,7 @@ gtk_notebook_update_tab_pos (GtkNotebook *notebook)
     case GTK_POS_LEFT:
       if (priv->show_tabs)
         gtk_box_gadget_insert_gadget (GTK_BOX_GADGET (priv->gadget), 0, priv->header_gadget, FALSE, FALSE, 
GTK_ALIGN_FILL);
+      gtk_box_gadget_set_draw_reverse (GTK_BOX_GADGET (priv->gadget), TRUE);
       gtk_box_gadget_set_orientation (GTK_BOX_GADGET (priv->gadget), GTK_ORIENTATION_HORIZONTAL);
       gtk_box_gadget_set_orientation (GTK_BOX_GADGET (priv->header_gadget), GTK_ORIENTATION_VERTICAL);
       break;
@@ -7016,6 +7020,7 @@ gtk_notebook_update_tab_pos (GtkNotebook *notebook)
     case GTK_POS_RIGHT:
       if (priv->show_tabs)
         gtk_box_gadget_insert_gadget (GTK_BOX_GADGET (priv->gadget), 1, priv->header_gadget, FALSE, FALSE, 
GTK_ALIGN_FILL);
+      gtk_box_gadget_set_draw_reverse (GTK_BOX_GADGET (priv->gadget), FALSE);
       gtk_box_gadget_set_orientation (GTK_BOX_GADGET (priv->gadget), GTK_ORIENTATION_HORIZONTAL);
       gtk_box_gadget_set_orientation (GTK_BOX_GADGET (priv->header_gadget), GTK_ORIENTATION_VERTICAL);
       break;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]