[gtk+/wip/baedert/drawing: 150/359] notebook: Replace arrow gadgets with GtkIcons



commit a586bf44b2e3dc012dd255e72a480c68401cc635
Author: Timm Bäder <mail baedert org>
Date:   Thu May 11 07:48:46 2017 +0200

    notebook: Replace arrow gadgets with GtkIcons

 gtk/gtknotebook.c |  208 ++++++++++++++++++++++++++---------------------------
 1 files changed, 103 insertions(+), 105 deletions(-)
---
diff --git a/gtk/gtknotebook.c b/gtk/gtknotebook.c
index ede9add..f0c0291 100644
--- a/gtk/gtknotebook.c
+++ b/gtk/gtknotebook.c
@@ -50,6 +50,7 @@
 #include "gtksizerequest.h"
 #include "gtkstylecontextprivate.h"
 #include "gtkwidgetprivate.h"
+#include "gtkiconprivate.h"
 #include "a11y/gtknotebookaccessible.h"
 
 
@@ -180,7 +181,7 @@ struct _GtkNotebookPrivate
   GtkCssGadget              *stack_gadget;
   GtkCssGadget              *header_gadget;
   GtkCssGadget              *tabs_gadget;
-  GtkCssGadget              *arrow_gadget[4];
+  GtkWidget                 *arrow_widget[4];
 
   GList         *children;
   GList         *first_tab;             /* The first tab visible (for scrolling notebooks) */
@@ -1729,10 +1730,6 @@ gtk_notebook_finalize (GObject *object)
   g_clear_object (&priv->gadget);
   g_clear_object (&priv->header_gadget);
   g_clear_object (&priv->tabs_gadget);
-  g_clear_object (&priv->arrow_gadget[0]);
-  g_clear_object (&priv->arrow_gadget[1]);
-  g_clear_object (&priv->arrow_gadget[2]);
-  g_clear_object (&priv->arrow_gadget[3]);
   g_clear_object (&priv->stack_gadget);
   g_clear_object (&priv->press_gesture);
 
@@ -1818,31 +1815,31 @@ gtk_notebook_distribute_arrow_width (GtkNotebook *notebook,
   GtkNotebookPrivate *priv = notebook->priv;
   GtkRequestedSize sizes[2];
 
-  if (priv->arrow_gadget[2 * type + 1] == NULL)
+  if (priv->arrow_widget[2 * type + 1] == NULL)
     {
-      if (priv->arrow_gadget[2 * type] == NULL)
+      if (priv->arrow_widget[2 * type] == NULL)
         *out_left = 0;
       else
         *out_left = size;
       *out_right = 0;
     }
-  else if (priv->arrow_gadget[2 * type] == NULL)
+  else if (priv->arrow_widget[2 * type] == NULL)
     {
       *out_left = 0;
       *out_right = size;
     }
   else
     {
-      gtk_css_gadget_get_preferred_size (priv->arrow_gadget[2 * type],
-                                         GTK_ORIENTATION_HORIZONTAL,
-                                         -1,
-                                         &sizes[0].minimum_size, &sizes[0].natural_size,
-                                         NULL, NULL);
-      gtk_css_gadget_get_preferred_size (priv->arrow_gadget[2 * type + 1],
-                                         GTK_ORIENTATION_HORIZONTAL,
-                                         -1,
-                                         &sizes[1].minimum_size, &sizes[1].natural_size,
-                                         NULL, NULL);
+      gtk_widget_measure (priv->arrow_widget[2 * type],
+                          GTK_ORIENTATION_HORIZONTAL,
+                          -1,
+                          &sizes[0].minimum_size, &sizes[0].natural_size,
+                          NULL, NULL);
+      gtk_widget_measure (priv->arrow_widget[2 * type + 1],
+                          GTK_ORIENTATION_HORIZONTAL,
+                          -1,
+                          &sizes[1].minimum_size, &sizes[1].natural_size,
+                          NULL, NULL);
 
       size -= sizes[0].minimum_size + sizes[1].minimum_size;
       size = gtk_distribute_natural_allocation (size, G_N_ELEMENTS (sizes), sizes);
@@ -1868,25 +1865,25 @@ gtk_notebook_measure_arrows (GtkNotebook    *notebook,
 
   if (orientation == GTK_ORIENTATION_HORIZONTAL)
     {
-      if (priv->arrow_gadget[2 * type])
+      if (priv->arrow_widget[2 * type])
         {
-          gtk_css_gadget_get_preferred_size (priv->arrow_gadget[2 * type],
-                                             orientation,
-                                             for_size,
-                                             &child1_min, &child1_nat,
-                                             NULL, NULL);
+          gtk_widget_measure (priv->arrow_widget[2 * type],
+                              orientation,
+                              for_size,
+                              &child1_min, &child1_nat,
+                              NULL, NULL);
         }
       else
         {
           child1_min = child1_nat = 0;
         }
-      if (priv->arrow_gadget[2 * type + 1])
+      if (priv->arrow_widget[2 * type + 1])
         {
-          gtk_css_gadget_get_preferred_size (priv->arrow_gadget[2 * type + 1],
-                                             orientation,
-                                             for_size,
-                                             &child2_min, &child2_nat,
-                                             NULL, NULL);
+          gtk_widget_measure (priv->arrow_widget[2 * type + 1],
+                              orientation,
+                              for_size,
+                              &child2_min, &child2_nat,
+                              NULL, NULL);
         }
       else
         {
@@ -1908,25 +1905,25 @@ gtk_notebook_measure_arrows (GtkNotebook    *notebook,
       else
         child1_size = child2_size = for_size;
 
-      if (priv->arrow_gadget[2 * type])
+      if (priv->arrow_widget[2 * type])
         {
-          gtk_css_gadget_get_preferred_size (priv->arrow_gadget[2 * type],
-                                             orientation,
-                                             child1_size,
-                                             &child1_min, &child1_nat,
-                                             NULL, NULL);
+          gtk_widget_measure (priv->arrow_widget[2 * type],
+                              orientation,
+                              child1_size,
+                              &child1_min, &child1_nat,
+                              NULL, NULL);
         }
       else
         {
           child1_min = child1_nat = 0;
         }
-      if (priv->arrow_gadget[2 * type + 1])
+      if (priv->arrow_widget[2 * type + 1])
         {
-          gtk_css_gadget_get_preferred_size (priv->arrow_gadget[2 * type + 1],
-                                             orientation,
-                                             child2_size,
-                                             &child2_min, &child2_nat,
-                                             NULL, NULL);
+          gtk_widget_measure (priv->arrow_widget[2 * type + 1],
+                              orientation,
+                              child2_size,
+                              &child2_min, &child2_nat,
+                              NULL, NULL);
         }
       else
         {
@@ -2339,7 +2336,7 @@ gtk_notebook_get_arrow_rect (GtkNotebook      *notebook,
 {
   GtkNotebookPrivate *priv = notebook->priv;
 
-  gtk_css_gadget_get_border_allocation (priv->arrow_gadget[arrow], rectangle, NULL);
+  gtk_widget_get_border_allocation (priv->arrow_widget[arrow], rectangle);
 }
 
 static GtkNotebookArrow
@@ -2356,7 +2353,7 @@ gtk_notebook_get_arrow (GtkNotebook *notebook,
     {
       for (i = 0; i < 4; i++)
         {
-          if (priv->arrow_gadget[i] == NULL)
+          if (priv->arrow_widget[i] == NULL)
             continue;
 
           gtk_notebook_get_arrow_rect (notebook, &arrow_rect, i);
@@ -3109,7 +3106,7 @@ update_arrow_state (GtkNotebook *notebook)
 
   for (i = 0; i < 4; i++)
     {
-      if (priv->arrow_gadget[i] == NULL)
+      if (priv->arrow_widget[i] == NULL)
         continue;
 
       state = gtk_widget_get_state_flags (GTK_WIDGET (notebook));
@@ -3132,7 +3129,7 @@ update_arrow_state (GtkNotebook *notebook)
             state |= GTK_STATE_FLAG_ACTIVE;
         }
 
-      gtk_css_gadget_set_state (priv->arrow_gadget[i], state);
+      gtk_widget_set_state_flags (priv->arrow_widget[i], state, TRUE);
     }
 }
 
@@ -3207,72 +3204,79 @@ update_arrow_nodes (GtkNotebook *notebook)
     {
       if (priv->scrollable && arrow[i])
         {
-          if (priv->arrow_gadget[i] == NULL)
+          if (priv->arrow_widget[i] == NULL)
             {
-              GtkCssGadget *next_gadget;
+              GtkWidget *next_widget;
+              GtkStyleContext *context;
 
               switch (i)
                 {
                 case 0:
-                  if (priv->arrow_gadget[1])
+                  if (priv->arrow_widget[1])
                     {
-                      next_gadget = priv->arrow_gadget[1];
+                      next_widget = priv->arrow_widget[1];
                       break;
                     }
                   /* fall through */
                 case 1:
                   if (priv->children)
                     {
+#if 0
                       GtkNotebookPage *page = priv->children->data;
-                      next_gadget = page->gadget;
+                      next_widget = page->widget;
                       break;
+#endif
                     }
-                  if (priv->arrow_gadget[2])
+                  if (priv->arrow_widget[2])
                     {
-                      next_gadget = priv->arrow_gadget[2];
+                      next_widget = priv->arrow_widget[2];
                       break;
                     }
                   /* fall through */
                 case 2:
-                  if (priv->arrow_gadget[3])
+                  if (priv->arrow_widget[3])
                     {
-                      next_gadget = priv->arrow_gadget[3];
+                      next_widget = priv->arrow_widget[3];
                       break;
                     }
                   /* fall through */
                 case 3:
-                  next_gadget = NULL;
+                  next_widget = NULL;
                   break;
 
                 default:
                   g_assert_not_reached ();
-                  next_gadget = NULL;
+                  next_widget = NULL;
                   break;
                 }
 
-              priv->arrow_gadget[i] = gtk_builtin_icon_new ("arrow",
-                                                            GTK_WIDGET (notebook),
-                                                            priv->tabs_gadget,
-                                                            next_gadget);
+              priv->arrow_widget[i] = gtk_icon_new ("arrow");
+              gtk_css_node_set_parent (gtk_widget_get_css_node (priv->arrow_widget[i]),
+                                       gtk_css_gadget_get_node (priv->tabs_gadget));
+              gtk_widget_insert_before (priv->arrow_widget[i], GTK_WIDGET (notebook),
+                                        next_widget);
+
+              context = gtk_widget_get_style_context (priv->arrow_widget[i]);
+
+
+
               if (i == ARROW_LEFT_BEFORE || i == ARROW_LEFT_AFTER)
-                gtk_css_gadget_add_class (priv->arrow_gadget[i], "down");
+                gtk_style_context_add_class (context, "down");
               else
-                gtk_css_gadget_add_class (priv->arrow_gadget[i], "up");
-              gtk_css_gadget_set_state (priv->arrow_gadget[i], gtk_css_node_get_state (tabs_node));
+                gtk_style_context_add_class (context, "up");
            }
 
           if (i == ARROW_LEFT_BEFORE || i == ARROW_LEFT_AFTER)
-            gtk_builtin_icon_set_image (GTK_BUILTIN_ICON (priv->arrow_gadget[i]), down_image_type);
+            gtk_icon_set_image (GTK_ICON (priv->arrow_widget[i]), down_image_type);
           else
-            gtk_builtin_icon_set_image (GTK_BUILTIN_ICON (priv->arrow_gadget[i]), up_image_type);
-          
+            gtk_icon_set_image (GTK_ICON (priv->arrow_widget[i]), up_image_type);
         }
       else
         {
-          if (priv->arrow_gadget[i])
+          if (priv->arrow_widget[i])
             {
-              gtk_css_node_set_parent (gtk_css_gadget_get_node (priv->arrow_gadget[i]), NULL);
-              g_clear_object (&priv->arrow_gadget[i]);
+              gtk_widget_unparent (priv->arrow_widget[i]);
+              priv->arrow_widget[i] = NULL;
             }
         }
     }
@@ -4406,7 +4410,6 @@ gtk_notebook_real_insert_page (GtkNotebook *notebook,
   GtkNotebookPage *page;
   gint nchildren;
   GList *list;
-  GtkCssGadget *sibling;
 
   gtk_widget_freeze_child_notify (child);
 
@@ -4419,20 +4422,13 @@ gtk_notebook_real_insert_page (GtkNotebook *notebook,
 
   priv->children = g_list_insert (priv->children, page, position);
 
-  if (position < nchildren)
-    sibling = GTK_NOTEBOOK_PAGE (g_list_nth (priv->children, position))->gadget;
-  else if (priv->arrow_gadget[ARROW_LEFT_AFTER])
-    sibling = priv->arrow_gadget[ARROW_LEFT_AFTER];
-  else
-    sibling = priv->arrow_gadget[ARROW_RIGHT_AFTER];
-
   if (priv->tabs_reversed)
     gtk_css_node_reverse_children (gtk_css_gadget_get_node (priv->tabs_gadget));
 
   page->gadget = gtk_css_custom_gadget_new ("tab",
                                             GTK_WIDGET (notebook),
                                             priv->tabs_gadget,
-                                            sibling,
+                                            NULL,
                                             measure_tab,
                                             allocate_tab,
                                             snapshot_tab,
@@ -4552,7 +4548,7 @@ gtk_notebook_redraw_arrows (GtkNotebook *notebook)
 
       for (i = 0; i < 4; i++)
         {
-          if (priv->arrow_gadget[i] == NULL)
+          if (priv->arrow_widget[i] == NULL)
             continue;
 
           gtk_notebook_get_arrow_rect (notebook, &rect, i);
@@ -4968,10 +4964,10 @@ gtk_notebook_snapshot_tabs (GtkCssGadget *gadget,
     {
       for (i = 0; i < 4; i++)
         {
-          if (priv->arrow_gadget[i] == NULL)
+          if (priv->arrow_widget[i] == NULL)
             continue;
-          
-          gtk_css_gadget_snapshot (priv->arrow_gadget[i], snapshot);
+
+          gtk_widget_snapshot (priv->arrow_widget[i], snapshot);
         }
     }
 
@@ -5008,19 +5004,20 @@ gtk_notebook_allocate_arrows (GtkNotebook   *notebook,
         {
           ii = i < 2 ? i : i ^ 1;
 
-          if (priv->arrow_gadget[ii] == NULL)
+          if (priv->arrow_widget[ii] == NULL)
             continue;
 
-          gtk_css_gadget_get_preferred_size (priv->arrow_gadget[ii],
-                                             GTK_ORIENTATION_HORIZONTAL,
-                                             allocation->height,
-                                             &min, &nat,
-                                             NULL, NULL);
+          gtk_widget_measure (priv->arrow_widget[ii],
+                              GTK_ORIENTATION_HORIZONTAL,
+                              allocation->height,
+                              &min, &nat,
+                              NULL, NULL);
           if (i < 2)
             {
               arrow_allocation.x = allocation->x;
               arrow_allocation.width = min;
-              gtk_css_gadget_allocate (priv->arrow_gadget[ii], &arrow_allocation, -1, &arrow_clip);
+              gtk_widget_size_allocate (priv->arrow_widget[ii], &arrow_allocation);
+              gtk_widget_get_clip (priv->arrow_widget[ii], &arrow_clip);
               allocation->x += min;
               allocation->width -= min;
             }
@@ -5028,7 +5025,8 @@ gtk_notebook_allocate_arrows (GtkNotebook   *notebook,
             {
               arrow_allocation.x = allocation->x + allocation->width - min;
               arrow_allocation.width = min;
-              gtk_css_gadget_allocate (priv->arrow_gadget[ii], &arrow_allocation, -1, &arrow_clip);
+              gtk_widget_size_allocate (priv->arrow_widget[ii], &arrow_allocation);
+              gtk_widget_get_clip (priv->arrow_widget[ii], &arrow_clip);
               allocation->width -= min;
             }
         }
@@ -5036,7 +5034,7 @@ gtk_notebook_allocate_arrows (GtkNotebook   *notebook,
 
     case GTK_POS_LEFT:
     case GTK_POS_RIGHT:
-      if (priv->arrow_gadget[0] || priv->arrow_gadget[1])
+      if (priv->arrow_widget[0] || priv->arrow_widget[1])
         {
           gtk_notebook_measure_arrows (notebook,
                                        GTK_PACK_START,
@@ -5049,16 +5047,16 @@ gtk_notebook_allocate_arrows (GtkNotebook   *notebook,
           arrow_allocation.y = allocation->y;
           arrow_allocation.width = size1;
           arrow_allocation.height = min;
-          if (priv->arrow_gadget[0])
-            gtk_css_gadget_allocate (priv->arrow_gadget[0], &arrow_allocation, -1, &arrow_clip);
+          if (priv->arrow_widget[0])
+            gtk_widget_size_allocate (priv->arrow_widget[0], &arrow_allocation);
           arrow_allocation.x += size1;
           arrow_allocation.width = size2;
-          if (priv->arrow_gadget[1])
-            gtk_css_gadget_allocate (priv->arrow_gadget[1], &arrow_allocation, -1, &arrow_clip);
+          if (priv->arrow_widget[1])
+            gtk_widget_size_allocate (priv->arrow_widget[1], &arrow_allocation);
           allocation->y += min;
           allocation->height -= min;
         }
-      if (priv->arrow_gadget[2] || priv->arrow_gadget[3])
+      if (priv->arrow_widget[2] || priv->arrow_widget[3])
         {
           gtk_notebook_measure_arrows (notebook,
                                        GTK_PACK_END,
@@ -5071,12 +5069,12 @@ gtk_notebook_allocate_arrows (GtkNotebook   *notebook,
           arrow_allocation.y = allocation->y + allocation->height - min;
           arrow_allocation.width = size1;
           arrow_allocation.height = min;
-          if (priv->arrow_gadget[2])
-            gtk_css_gadget_allocate (priv->arrow_gadget[2], &arrow_allocation, -1, &arrow_clip);
+          if (priv->arrow_widget[2])
+            gtk_widget_size_allocate (priv->arrow_widget[2], &arrow_allocation);
           arrow_allocation.x += size1;
           arrow_allocation.width = size2;
-          if (priv->arrow_gadget[3])
-            gtk_css_gadget_allocate (priv->arrow_gadget[3], &arrow_allocation, -1, &arrow_clip);
+          if (priv->arrow_widget[3])
+            gtk_widget_size_allocate (priv->arrow_widget[3], &arrow_allocation);
           allocation->height -= min;
         }
       break;
@@ -7231,10 +7229,10 @@ gtk_notebook_child_reordered (GtkNotebook     *notebook,
 
   if (list->prev)
     sibling = gtk_css_gadget_get_node (GTK_NOTEBOOK_PAGE (list->prev)->gadget);
-  else if (priv->arrow_gadget[ARROW_RIGHT_BEFORE])
-    sibling = gtk_css_gadget_get_node (priv->arrow_gadget[ARROW_RIGHT_BEFORE]);
-  else if (priv->arrow_gadget[ARROW_LEFT_BEFORE])
-    sibling = gtk_css_gadget_get_node (priv->arrow_gadget[ARROW_LEFT_BEFORE]);
+  else if (priv->arrow_widget[ARROW_RIGHT_BEFORE])
+    sibling = gtk_widget_get_css_node (priv->arrow_widget[ARROW_RIGHT_BEFORE]);
+  else if (priv->arrow_widget[ARROW_LEFT_BEFORE])
+    sibling = gtk_widget_get_css_node (priv->arrow_widget[ARROW_LEFT_BEFORE]);
   else
     sibling = NULL;
 


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