[gtk+] levelbar: port to use gadgets



commit a6e7e72d53fb1dfb29c3e1c52f42821a1457d8bc
Author: Cosimo Cecchi <cosimoc gnome org>
Date:   Sat Jan 2 18:03:50 2016 -0800

    levelbar: port to use gadgets
    
    We now use one gadget for the trough, and one for each block.

 gtk/gtklevelbar.c                        |  477 ++++++++++++++----------------
 gtk/theme/Adwaita/_common.scss           |   12 +-
 gtk/theme/Adwaita/gtk-contained-dark.css |   13 +-
 gtk/theme/Adwaita/gtk-contained.css      |   13 +-
 gtk/theme/HighContrast/_common.scss      |   19 +-
 gtk/theme/HighContrast/gtk.css           |   14 +-
 6 files changed, 254 insertions(+), 294 deletions(-)
---
diff --git a/gtk/gtklevelbar.c b/gtk/gtklevelbar.c
index 9452d09..961d5c3 100644
--- a/gtk/gtklevelbar.c
+++ b/gtk/gtklevelbar.c
@@ -107,6 +107,7 @@
 
 #include "gtkbuildable.h"
 #include "gtkbuilderprivate.h"
+#include "gtkcsscustomgadgetprivate.h"
 #include "gtkintl.h"
 #include "gtkorientableprivate.h"
 #include "gtklevelbar.h"
@@ -162,8 +163,8 @@ struct _GtkLevelBarPrivate {
 
   GList *offsets;
 
-  GtkCssNode *trough_node;
-  GtkCssNode **block_node;
+  GtkCssGadget *trough_gadget;
+  GtkCssGadget **block_gadget;
   guint n_blocks;
 
   guint inverted : 1;
@@ -259,39 +260,16 @@ gtk_level_bar_get_min_block_size (GtkLevelBar *self,
                                   gint        *block_width,
                                   gint        *block_height)
 {
-  GtkWidget *widget = GTK_WIDGET (self);
-  GtkStyleContext *context;
-  GtkStateFlags state;
-  GtkBorder border, tmp, tmp2;
-  gint min_width, min_height;
-
-  context = gtk_widget_get_style_context (widget);
-  gtk_style_context_save_to_node (context, self->priv->block_node[0]);
-  state = gtk_style_context_get_state (context);
-  gtk_style_context_get_border (context, state, &border);
-  gtk_style_context_get_padding (context, state, &tmp);
-  gtk_style_context_get_margin (context, state, &tmp2);
-  gtk_style_context_restore (context);
-
-  gtk_style_context_get_style (context,
-                               "min-block-width", &min_width,
-                               "min-block-height", &min_height,
-                               NULL);
-
-  border.top += tmp.top;
-  border.right += tmp.right;
-  border.bottom += tmp.bottom;
-  border.left += tmp.left;
-
-  border.top += tmp2.top;
-  border.right += tmp2.right;
-  border.bottom += tmp2.bottom;
-  border.left += tmp2.left;
-
-  if (block_width)
-    *block_width = MAX (border.left + border.right, min_width);
-  if (block_height)
-    *block_height = MAX (border.top + border.bottom, min_height);
+  gtk_css_gadget_get_preferred_size (self->priv->block_gadget[0],
+                                     GTK_ORIENTATION_HORIZONTAL,
+                                     -1,
+                                     block_width, NULL,
+                                     NULL, NULL);
+  gtk_css_gadget_get_preferred_size (self->priv->block_gadget[0],
+                                     GTK_ORIENTATION_VERTICAL,
+                                     -1,
+                                     NULL, block_height,
+                                     NULL, NULL);
 }
 
 static gint
@@ -316,282 +294,245 @@ gtk_level_bar_get_real_inverted (GtkLevelBar *self)
 }
 
 static void
-gtk_level_bar_get_borders (GtkLevelBar *self,
-                           GtkBorder   *borders_out)
+gtk_level_bar_draw_fill_continuous (GtkLevelBar *self,
+                                    cairo_t     *cr)
 {
-  GtkWidget *widget = GTK_WIDGET (self);
-  GtkStyleContext *context;
-  GtkStateFlags state;
-  GtkBorder border, tmp;
-
-  context = gtk_widget_get_style_context (widget);
-  gtk_style_context_save_to_node (context, self->priv->trough_node);
-  state = gtk_style_context_get_state (context);
-  gtk_style_context_get_border (context, state, &border);
-  gtk_style_context_get_padding (context, state, &tmp);
-  gtk_style_context_restore (context);
-
-  border.top += tmp.top;
-  border.right += tmp.right;
-  border.bottom += tmp.bottom;
-  border.left += tmp.left;
-
-  if (borders_out)
-    *borders_out = border;
-}
-
-static void
-gtk_level_bar_draw_fill_continuous (GtkLevelBar           *self,
-                                    cairo_t               *cr,
-                                    cairo_rectangle_int_t *fill_area)
-{
-  GtkWidget *widget = GTK_WIDGET (self);
-  GtkStyleContext *context;
-  cairo_rectangle_int_t base_area, block_area;
-  GtkBorder block_margin;
-  gdouble fill_percentage;
   gboolean inverted;
 
-  context = gtk_widget_get_style_context (widget);
   inverted = gtk_level_bar_get_real_inverted (self);
 
   /* render the empty (unfilled) part */
-  gtk_style_context_save_to_node (context, self->priv->block_node[inverted ? 0 : 1]);
-  gtk_style_context_get_margin (context, gtk_style_context_get_state (context), &block_margin);
-
-  base_area = *fill_area;
-  base_area.x += block_margin.left;
-  base_area.y += block_margin.top;
-  base_area.width -= block_margin.left + block_margin.right;
-  base_area.height -= block_margin.top + block_margin.bottom;
-
-  gtk_render_background (context, cr, base_area.x, base_area.y,
-                         base_area.width, base_area.height);
-  gtk_render_frame (context, cr, base_area.x, base_area.y,
-                    base_area.width, base_area.height);
-
-  gtk_style_context_restore (context);
+  gtk_css_gadget_draw (self->priv->block_gadget[inverted ? 0 : 1], cr);
 
   /* now render the filled part on top of it */
+  gtk_css_gadget_draw (self->priv->block_gadget[inverted ? 1 : 0], cr);
+}
 
-  block_area = base_area;
+static void
+gtk_level_bar_draw_fill_discrete (GtkLevelBar *self,
+                                  cairo_t     *cr)
+{
+  gint num_blocks, i;
 
-  fill_percentage = (self->priv->cur_value - self->priv->min_value) /
-    (self->priv->max_value - self->priv->min_value);
+  num_blocks = gtk_level_bar_get_num_blocks (self);
 
-  if (self->priv->orientation == GTK_ORIENTATION_HORIZONTAL)
-    {
-      block_area.width = (gint) floor (block_area.width * fill_percentage);
+  for (i = 0; i < num_blocks; i++)
+    gtk_css_gadget_draw (self->priv->block_gadget[i], cr);
+}
 
-      if (inverted)
-        block_area.x += base_area.width - block_area.width;
-    }
+static gboolean
+gtk_level_bar_render_trough (GtkCssGadget *gadget,
+                             cairo_t      *cr,
+                             int           x,
+                             int           y,
+                             int           width,
+                             int           height,
+                             gpointer      data)
+{
+  GtkWidget *widget = gtk_css_gadget_get_owner (gadget);
+  GtkLevelBar *self = GTK_LEVEL_BAR (widget);
+
+  if (self->priv->bar_mode == GTK_LEVEL_BAR_MODE_CONTINUOUS)
+    gtk_level_bar_draw_fill_continuous (self, cr);
   else
-    {
-      block_area.height = (gint) floor (block_area.height * fill_percentage);
+    gtk_level_bar_draw_fill_discrete (self, cr);
 
-      if (inverted)
-        block_area.y += base_area.height - block_area.height;
-    }
+  return FALSE;
+}
 
-  gtk_style_context_save_to_node (context, self->priv->block_node[inverted ? 1 : 0]);
+static gboolean
+gtk_level_bar_draw (GtkWidget *widget,
+                    cairo_t   *cr)
+{
+  GtkLevelBar *self = GTK_LEVEL_BAR (widget);
 
-  gtk_render_background (context, cr, block_area.x, block_area.y,
-                         block_area.width, block_area.height);
-  gtk_render_frame (context, cr, block_area.x, block_area.y,
-                    block_area.width, block_area.height);
+  gtk_css_gadget_draw (self->priv->trough_gadget, cr);
 
-  gtk_style_context_restore (context);
+  return FALSE;
 }
 
 static void
-gtk_level_bar_draw_fill_discrete (GtkLevelBar           *self,
-                                  cairo_t               *cr,
-                                  cairo_rectangle_int_t *fill_area)
+gtk_level_bar_measure_trough (GtkCssGadget   *gadget,
+                              GtkOrientation  orientation,
+                              int             for_size,
+                              int            *minimum,
+                              int            *natural,
+                              int            *minimum_baseline,
+                              int            *natural_baseline,
+                              gpointer        data)
 {
-  GtkWidget *widget = GTK_WIDGET (self);
-  GtkStyleContext *context;
-  gint num_blocks, i;
+  GtkWidget *widget = gtk_css_gadget_get_owner (gadget);
+  GtkLevelBar *self = GTK_LEVEL_BAR (widget);
+  gint num_blocks, size;
   gint block_width, block_height;
-  gint block_draw_width, block_draw_height;
-  GtkBorder block_margin;
-  cairo_rectangle_int_t block_area;
 
-  context = gtk_widget_get_style_context (widget);
+  num_blocks = gtk_level_bar_get_num_blocks (self);
   gtk_level_bar_get_min_block_size (self, &block_width, &block_height);
 
-  block_area = *fill_area;
-  num_blocks = (gint) round (self->priv->max_value) - (gint) round (self->priv->min_value);
-
-  if (self->priv->orientation == GTK_ORIENTATION_HORIZONTAL)
-    block_width = MAX (block_width, (gint) floor (block_area.width / num_blocks));
-  else
-    block_height = MAX (block_height, (gint) floor (block_area.height / num_blocks));
-
-  gtk_style_context_save_to_node (context, self->priv->block_node[0]);
-  gtk_style_context_get_margin (context, gtk_style_context_get_state (context), &block_margin);
-  gtk_style_context_restore (context);
-
-  block_draw_width = block_width - block_margin.left - block_margin.right;
-  block_draw_height = block_height - block_margin.top - block_margin.bottom;
-
-  if (self->priv->orientation == GTK_ORIENTATION_HORIZONTAL)
+  if (orientation == GTK_ORIENTATION_HORIZONTAL)
     {
-      block_draw_height = MAX (block_draw_height, block_area.height - block_margin.top - 
block_margin.bottom);
-      block_area.y += block_margin.top;
+      if (self->priv->orientation == GTK_ORIENTATION_HORIZONTAL)
+        size = num_blocks * block_width;
+      else
+        size = block_width;
     }
   else
     {
-      block_draw_width = MAX (block_draw_width, block_area.width - block_margin.left - block_margin.right);
-      block_area.x += block_margin.left;
-    }
-
-  for (i = 0; i < num_blocks; i++)
-    {
-      if (self->priv->orientation == GTK_ORIENTATION_HORIZONTAL)
-        block_area.x += block_margin.left;
+      if (self->priv->orientation == GTK_ORIENTATION_VERTICAL)
+        size = num_blocks * block_height;
       else
-        block_area.y += block_margin.top;
-
-      gtk_style_context_save_to_node (context, self->priv->block_node[i]);
-
-      gtk_render_background (context, cr,
-                             block_area.x, block_area.y,
-                             block_draw_width, block_draw_height);
-      gtk_render_frame (context, cr,
-                        block_area.x, block_area.y,
-                        block_draw_width, block_draw_height);
-
-      gtk_style_context_restore (context);
-
-      if (self->priv->orientation == GTK_ORIENTATION_HORIZONTAL)
-        block_area.x += block_draw_width + block_margin.right;
-      else
-        block_area.y += block_draw_height + block_margin.bottom;
+        size = block_height;
     }
+
+  *minimum = size;
+  *natural = size;
 }
 
 static void
-gtk_level_bar_draw_fill (GtkLevelBar *self,
-                         cairo_t     *cr)
+gtk_level_bar_get_preferred_width (GtkWidget *widget,
+                                   gint      *minimum,
+                                   gint      *natural)
 {
-  GtkWidget *widget = GTK_WIDGET (self);
-  GtkBorder trough_borders;
-  cairo_rectangle_int_t fill_area;
-
-  gtk_level_bar_get_borders (self, &trough_borders);
-
-  fill_area.x = trough_borders.left;
-  fill_area.y = trough_borders.top;
-  fill_area.width = gtk_widget_get_allocated_width (widget) -
-    trough_borders.left - trough_borders.right;
-  fill_area.height = gtk_widget_get_allocated_height (widget) -
-    trough_borders.top - trough_borders.bottom;
+  gtk_css_gadget_get_preferred_size (GTK_LEVEL_BAR (widget)->priv->trough_gadget,
+                                     GTK_ORIENTATION_HORIZONTAL,
+                                     -1,
+                                     minimum, natural,
+                                     NULL, NULL);
+}
 
-  if (self->priv->bar_mode == GTK_LEVEL_BAR_MODE_CONTINUOUS)
-    gtk_level_bar_draw_fill_continuous (self, cr, &fill_area);
-  else
-    gtk_level_bar_draw_fill_discrete (self, cr, &fill_area);
+static void
+gtk_level_bar_get_preferred_height (GtkWidget *widget,
+                                    gint      *minimum,
+                                    gint      *natural)
+{
+  gtk_css_gadget_get_preferred_size (GTK_LEVEL_BAR (widget)->priv->trough_gadget,
+                                     GTK_ORIENTATION_VERTICAL,
+                                     -1,
+                                     minimum, natural,
+                                     NULL, NULL);
 }
 
-static gboolean
-gtk_level_bar_draw (GtkWidget *widget,
-                    cairo_t   *cr)
+static void
+gtk_level_bar_allocate_trough_continuous (GtkLevelBar *self,
+                                          const GtkAllocation *allocation,
+                                          int baseline,
+                                          GtkAllocation *out_clip)
 {
-  GtkLevelBar *self = GTK_LEVEL_BAR (widget);
-  GtkStyleContext *context;
-  gint width, height;
+  GtkAllocation block_area, clip;
+  gdouble fill_percentage;
+  gboolean inverted;
 
-  width = gtk_widget_get_allocated_width (widget);
-  height = gtk_widget_get_allocated_height (widget);
+  inverted = gtk_level_bar_get_real_inverted (self);
 
-  context = gtk_widget_get_style_context (widget);
-  gtk_style_context_save_to_node (context, self->priv->trough_node);
+  /* allocate the empty (unfilled) part */
+  block_area = *allocation;
+  gtk_css_gadget_allocate (self->priv->block_gadget[inverted ? 0 : 1],
+                           &block_area,
+                           baseline,
+                           out_clip);
 
-  gtk_render_background (context, cr, 0, 0, width, height);
-  gtk_render_frame (context, cr, 0, 0, width, height);
+  /* now allocate the filled part */
+  block_area = *allocation;
+  fill_percentage = (self->priv->cur_value - self->priv->min_value) /
+    (self->priv->max_value - self->priv->min_value);
 
-  gtk_style_context_restore (context);
+  if (self->priv->orientation == GTK_ORIENTATION_HORIZONTAL)
+    {
+      block_area.width = (gint) floor (block_area.width * fill_percentage);
 
-  gtk_level_bar_draw_fill (self, cr);
+      if (inverted)
+        block_area.x += allocation->width - block_area.width;
+    }
+  else
+    {
+      block_area.height = (gint) floor (block_area.height * fill_percentage);
 
-  return FALSE;
+      if (inverted)
+        block_area.y += allocation->height - block_area.height;
+    }
+
+  gtk_css_gadget_allocate (self->priv->block_gadget[inverted ? 1 : 0],
+                           &block_area,
+                           baseline,
+                           &clip);
+  gdk_rectangle_intersect (out_clip, &clip, out_clip);
 }
 
 static void
-gtk_level_bar_get_preferred_width (GtkWidget *widget,
-                                   gint      *minimum,
-                                   gint      *natural)
+gtk_level_bar_allocate_trough_discrete (GtkLevelBar *self,
+                                        const GtkAllocation *allocation,
+                                        int baseline,
+                                        GtkAllocation *out_clip)
 {
-  GtkLevelBar *self = GTK_LEVEL_BAR (widget);
-  GtkBorder borders;
-  gint num_blocks;
-  gint width, block_width;
+  GtkAllocation block_area, clip;
+  gint num_blocks, i;
+  gint block_width, block_height;
 
+  gtk_level_bar_get_min_block_size (self, &block_width, &block_height);
   num_blocks = gtk_level_bar_get_num_blocks (self);
-  gtk_level_bar_get_min_block_size (self, &block_width, NULL);
-
-  gtk_level_bar_get_borders (self, &borders);
-  width = borders.left + borders.right;
 
   if (self->priv->orientation == GTK_ORIENTATION_HORIZONTAL)
-    width += num_blocks * block_width;
+    block_width = MAX (block_width, (gint) floor (allocation->width / num_blocks));
   else
-    width += block_width;
+    block_height = MAX (block_height, (gint) floor (allocation->height / num_blocks));
+
+  block_area.x = allocation->x;
+  block_area.y = allocation->y;
+  block_area.width = block_width;
+  block_area.height = block_height;
 
-  *minimum = width;
-  *natural = width;
+  for (i = 0; i < num_blocks; i++)
+    {
+      gtk_css_gadget_allocate (self->priv->block_gadget[i],
+                               &block_area,
+                               baseline,
+                               &clip);
+      gdk_rectangle_intersect (out_clip, &clip, out_clip);
+
+      if (self->priv->orientation == GTK_ORIENTATION_HORIZONTAL)
+        block_area.x += block_area.width;
+      else
+        block_area.y += block_area.height;
+    }
 }
 
 static void
-gtk_level_bar_get_preferred_height (GtkWidget *widget,
-                                    gint      *minimum,
-                                    gint      *natural)
+gtk_level_bar_allocate_trough (GtkCssGadget        *gadget,
+                               const GtkAllocation *allocation,
+                               int                  baseline,
+                               GtkAllocation       *out_clip,
+                               gpointer             data)
 {
+  GtkWidget *widget = gtk_css_gadget_get_owner (gadget);
   GtkLevelBar *self = GTK_LEVEL_BAR (widget);
-  GtkBorder borders;
-  gint num_blocks;
-  gint height, block_height;
 
-  num_blocks = gtk_level_bar_get_num_blocks (self);
-  gtk_level_bar_get_min_block_size (self, NULL, &block_height);
-
-  gtk_level_bar_get_borders (self, &borders);
-  height = borders.top + borders.bottom;
-
-  if (self->priv->orientation == GTK_ORIENTATION_VERTICAL)
-    height += num_blocks * block_height;
+  if (self->priv->bar_mode == GTK_LEVEL_BAR_MODE_CONTINUOUS)
+    gtk_level_bar_allocate_trough_continuous (self, allocation, baseline, out_clip);
   else
-    height += block_height;
-
-  *minimum = height;
-  *natural = height;
+    gtk_level_bar_allocate_trough_discrete (self, allocation, baseline, out_clip);
 }
 
 static void
 gtk_level_bar_size_allocate (GtkWidget     *widget,
                              GtkAllocation *allocation)
 {
+  GtkAllocation clip;
+
   GTK_WIDGET_CLASS (gtk_level_bar_parent_class)->size_allocate (widget, allocation);
 
-  _gtk_widget_set_simple_clip (widget, NULL);
-}
+  gtk_css_gadget_allocate (GTK_LEVEL_BAR (widget)->priv->trough_gadget,
+                           allocation,
+                           gtk_widget_get_allocated_baseline (widget),
+                           &clip);
 
-static void
-node_style_changed_cb (GtkCssNode        *node,
-                       GtkCssStyleChange *change,
-                       GtkWidget         *widget)
-{
-  if (gtk_css_style_change_affects (change, GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP))
-    gtk_widget_queue_resize (widget);
-  else
-    gtk_widget_queue_draw (widget);
+  gtk_widget_set_clip (widget, &clip);
 }
 
 static void
 update_block_nodes (GtkLevelBar *self)
 {
   GtkLevelBarPrivate *priv = self->priv;
+  GtkCssNode *trough_node = gtk_css_gadget_get_node (priv->trough_gadget);
   guint n_blocks;
   guint i;
 
@@ -605,21 +546,23 @@ update_block_nodes (GtkLevelBar *self)
   else if (n_blocks < priv->n_blocks)
     {
       for (i = n_blocks; i < priv->n_blocks; i++)
-        gtk_css_node_set_parent (priv->block_node[i], NULL);
-      priv->block_node = g_renew (GtkCssNode*, priv->block_node, n_blocks);
+        g_clear_object (&priv->block_gadget[i]);
+      priv->block_gadget = g_renew (GtkCssGadget*, priv->block_gadget, n_blocks);
       priv->n_blocks = n_blocks;
     }
   else
     {
-      priv->block_node = g_renew (GtkCssNode*, priv->block_node, n_blocks);
+      priv->block_gadget = g_renew (GtkCssGadget*, priv->block_gadget, n_blocks);
       for (i = priv->n_blocks; i < n_blocks; i++)
         {
-          priv->block_node[i] = gtk_css_node_new ();
-          gtk_css_node_set_name (priv->block_node[i], I_("block"));
-          gtk_css_node_set_parent (priv->block_node[i], priv->trough_node);
-          gtk_css_node_set_state (priv->block_node[i], gtk_css_node_get_state (priv->trough_node));
-          g_signal_connect_object (priv->block_node[i], "style-changed", G_CALLBACK (node_style_changed_cb), 
self, 0);
-          g_object_unref (priv->block_node[i]);
+          priv->block_gadget[i] = gtk_css_custom_gadget_new ("block",
+                                                             GTK_WIDGET (self),
+                                                             priv->trough_gadget,
+                                                             NULL,
+                                                             NULL, NULL, NULL,
+                                                             NULL, NULL);
+          gtk_css_node_set_state (gtk_css_gadget_get_node (priv->block_gadget[i]),
+                                  gtk_css_node_get_state (trough_node));
         }
       priv->n_blocks = n_blocks;
     }
@@ -655,9 +598,9 @@ gtk_level_bar_state_flags_changed (GtkWidget     *widget,
 
   state = gtk_widget_get_state_flags (widget);
 
-  gtk_css_node_set_state (priv->trough_node, state);
+  gtk_css_node_set_state (gtk_css_gadget_get_node (priv->trough_gadget), state);
   for (i = 0; i < priv->n_blocks; i++)
-    gtk_css_node_set_state (priv->block_node[i], state);
+    gtk_css_node_set_state (gtk_css_gadget_get_node (priv->block_gadget[i]), state);
 
   GTK_WIDGET_CLASS (gtk_level_bar_parent_class)->state_flags_changed (widget, previous_state);
 }
@@ -718,12 +661,12 @@ update_level_style_classes (GtkLevelBar *self)
       classes[0] = "filled";
       classes[1] = value_class;
       for (i = 0; i < num_filled; i++)
-        gtk_css_node_set_classes (priv->block_node[inverted ? num_blocks - 1 - i : i], classes);
+        gtk_css_node_set_classes (gtk_css_gadget_get_node (priv->block_gadget[inverted ? num_blocks - 1 - i 
: i]), classes);
 
       classes[0] = "empty";
       classes[1] = NULL;
       for (; i < num_blocks; i++)
-        gtk_css_node_set_classes (priv->block_node[inverted ? num_blocks - 1 - i : i], classes);
+        gtk_css_node_set_classes (gtk_css_gadget_get_node (priv->block_gadget[inverted ? num_blocks - 1 - i 
: i]), classes);
     }
 }
 
@@ -971,9 +914,15 @@ gtk_level_bar_finalize (GObject *obj)
 {
   GtkLevelBar *self = GTK_LEVEL_BAR (obj);
   GtkLevelBarPrivate *priv = self->priv;
+  gint i;
 
   g_list_free_full (priv->offsets, (GDestroyNotify) gtk_level_bar_offset_free);
-  g_free (priv->block_node);
+
+  for (i = 0; i < priv->n_blocks; i++)
+    g_clear_object (&priv->block_gadget[i]);
+  g_free (priv->block_gadget);
+
+  g_clear_object (&priv->trough_gadget);
 
   G_OBJECT_CLASS (gtk_level_bar_parent_class)->finalize (obj);
 }
@@ -1110,13 +1059,16 @@ gtk_level_bar_class_init (GtkLevelBarClass *klass)
    * height for blocks filling the #GtkLevelBar widget.
    *
    * Since: 3.6
+   *
+   * Deprecated: 3.20: Use the standard min-width/min-height CSS properties on
+   *   the block elements; the value of this style property is ignored.
    */
   gtk_widget_class_install_style_property
     (wclass, g_param_spec_int ("min-block-height",
                                P_("Minimum height for filling blocks"),
                                P_("Minimum height for blocks that fill the bar"),
                                1, G_MAXINT, DEFAULT_BLOCK_SIZE,
-                               G_PARAM_READWRITE));
+                               G_PARAM_READWRITE|G_PARAM_DEPRECATED));
   /**
    * GtkLevelBar:min-block-width:
    *
@@ -1124,13 +1076,16 @@ gtk_level_bar_class_init (GtkLevelBarClass *klass)
    * width for blocks filling the #GtkLevelBar widget.
    *
    * Since: 3.6
+   *
+   * Deprecated: 3.20: Use the standard min-width/min-height CSS properties on
+   *   the block elements; the value of this style property is ignored.
    */
   gtk_widget_class_install_style_property
     (wclass, g_param_spec_int ("min-block-width",
                                P_("Minimum width for filling blocks"),
                                P_("Minimum width for blocks that fill the bar"),
                                1, G_MAXINT, DEFAULT_BLOCK_SIZE,
-                               G_PARAM_READWRITE));
+                               G_PARAM_READWRITE|G_PARAM_DEPRECATED));
 
   g_object_class_install_properties (oclass, LAST_PROPERTY, properties);
 
@@ -1142,7 +1097,7 @@ static void
 gtk_level_bar_init (GtkLevelBar *self)
 {
   GtkLevelBarPrivate *priv;
-  GtkCssNode *widget_node;
+  GtkCssNode *widget_node, *trough_node;
 
   priv = self->priv = gtk_level_bar_get_instance_private (self);
 
@@ -1159,18 +1114,22 @@ gtk_level_bar_init (GtkLevelBar *self)
   gtk_widget_set_has_window (GTK_WIDGET (self), FALSE);
 
   widget_node = gtk_widget_get_css_node (GTK_WIDGET (self));
-  priv->trough_node = gtk_css_node_new ();
-  gtk_css_node_set_name (priv->trough_node, I_("trough"));
-  gtk_css_node_set_parent (priv->trough_node, widget_node);
-  gtk_css_node_set_state (priv->trough_node, gtk_css_node_get_state (widget_node));
-  g_signal_connect_object (priv->trough_node, "style-changed", G_CALLBACK (node_style_changed_cb), self, 0);
-  g_object_unref (priv->trough_node);
+  priv->trough_gadget = gtk_css_custom_gadget_new ("trough",
+                                                   GTK_WIDGET (self),
+                                                   NULL, NULL,
+                                                   gtk_level_bar_measure_trough,
+                                                   gtk_level_bar_allocate_trough,
+                                                   gtk_level_bar_render_trough,
+                                                   NULL, NULL);
+  trough_node = gtk_css_gadget_get_node (priv->trough_gadget);
+  gtk_css_node_set_parent (trough_node, widget_node);
+  gtk_css_node_set_state (trough_node, gtk_css_node_get_state (widget_node));
 
   gtk_level_bar_ensure_offset (self, GTK_LEVEL_BAR_OFFSET_LOW, 0.25);
   gtk_level_bar_ensure_offset (self, GTK_LEVEL_BAR_OFFSET_HIGH, 0.75);
   gtk_level_bar_ensure_offset (self, "full", 1.0);
 
-  priv->block_node = NULL;
+  priv->block_gadget = NULL;
   priv->n_blocks = 0;
 
   priv->bar_mode = GTK_LEVEL_BAR_MODE_CONTINUOUS;
@@ -1277,7 +1236,7 @@ gtk_level_bar_set_value_internal (GtkLevelBar *self,
 {
   self->priv->cur_value = value;
   g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_VALUE]);
-  gtk_widget_queue_draw (GTK_WIDGET (self));
+  gtk_widget_queue_allocate (GTK_WIDGET (self));
 }
 
 /**
diff --git a/gtk/theme/Adwaita/_common.scss b/gtk/theme/Adwaita/_common.scss
index bebead4..74db834 100644
--- a/gtk/theme/Adwaita/_common.scss
+++ b/gtk/theme/Adwaita/_common.scss
@@ -2524,11 +2524,13 @@ progressbar {
 
 levelbar {
   box-shadow: _widget_edge(); // needs to be set here to avoid clipping
-  -GtkLevelBar-min-block-width: 34;
-  -GtkLevelBar-min-block-height: 3;
-  &.vertical {
-    -GtkLevelBar-min-block-width: 3;
-    -GtkLevelBar-min-block-height: 34;
+  & block {
+    min-width: 32px;
+    min-height: 1px;
+  }
+  &.vertical block {
+    min-width: 1px;
+    min-height: 32px;
   }
   & trough {
     border: 1px solid;
diff --git a/gtk/theme/Adwaita/gtk-contained-dark.css b/gtk/theme/Adwaita/gtk-contained-dark.css
index 665af68..a105948 100644
--- a/gtk/theme/Adwaita/gtk-contained-dark.css
+++ b/gtk/theme/Adwaita/gtk-contained-dark.css
@@ -3486,12 +3486,13 @@ progressbar {
  * Level Bar *
  *************/
 levelbar {
-  box-shadow: 0 1px rgba(238, 238, 236, 0);
-  -GtkLevelBar-min-block-width: 34;
-  -GtkLevelBar-min-block-height: 3; }
-  levelbar.vertical {
-    -GtkLevelBar-min-block-width: 3;
-    -GtkLevelBar-min-block-height: 34; }
+  box-shadow: 0 1px rgba(238, 238, 236, 0); }
+  levelbar block {
+    min-width: 32px;
+    min-height: 1px; }
+  levelbar.vertical block {
+    min-width: 1px;
+    min-height: 32px; }
   levelbar trough {
     border: 1px solid;
     padding: 2px;
diff --git a/gtk/theme/Adwaita/gtk-contained.css b/gtk/theme/Adwaita/gtk-contained.css
index cf13814..b2b2302 100644
--- a/gtk/theme/Adwaita/gtk-contained.css
+++ b/gtk/theme/Adwaita/gtk-contained.css
@@ -3648,12 +3648,13 @@ progressbar {
  * Level Bar *
  *************/
 levelbar {
-  box-shadow: 0 1px rgba(255, 255, 255, 0);
-  -GtkLevelBar-min-block-width: 34;
-  -GtkLevelBar-min-block-height: 3; }
-  levelbar.vertical {
-    -GtkLevelBar-min-block-width: 3;
-    -GtkLevelBar-min-block-height: 34; }
+  box-shadow: 0 1px rgba(255, 255, 255, 0); }
+  levelbar block {
+    min-width: 32px;
+    min-height: 1px; }
+  levelbar.vertical block {
+    min-width: 1px;
+    min-height: 32px; }
   levelbar trough {
     border: 1px solid;
     padding: 2px;
diff --git a/gtk/theme/HighContrast/_common.scss b/gtk/theme/HighContrast/_common.scss
index 24ba6b4..de3ec3f 100644
--- a/gtk/theme/HighContrast/_common.scss
+++ b/gtk/theme/HighContrast/_common.scss
@@ -1792,16 +1792,6 @@ progressbar progress {
  * Level Bar *
  *************/
 
-GtkLevelBar {
-  -GtkLevelBar-min-block-width: 34;
-  -GtkLevelBar-min-block-height: 3;
-}
-
-GtkLevelBar.vertical {
-  -GtkLevelBar-min-block-width: 3;
-  -GtkLevelBar-min-block-height: 34;
-}
-
 levelbar {
   & trough {
     // FIXME: outset not working
@@ -1812,6 +1802,15 @@ levelbar {
       @include entry(backdrop);
     }
   }
+  & block {
+    min-width: 32px;
+    min-height: 1px;
+  }
+  &.vertical block {
+    min-width: 1px;
+    min-height: 32px;
+  }
+
   &.horizontal.discrete block { margin: 0 1px; }
   &.vertical.discrete block { margin: 1px 0; }
   & block.filled.low {
diff --git a/gtk/theme/HighContrast/gtk.css b/gtk/theme/HighContrast/gtk.css
index 866d293..92ae83b 100644
--- a/gtk/theme/HighContrast/gtk.css
+++ b/gtk/theme/HighContrast/gtk.css
@@ -1948,14 +1948,6 @@ progressbar progress {
 /*************
  * Level Bar *
  *************/
-GtkLevelBar {
-  -GtkLevelBar-min-block-width: 34;
-  -GtkLevelBar-min-block-height: 3; }
-
-GtkLevelBar.vertical {
-  -GtkLevelBar-min-block-width: 3;
-  -GtkLevelBar-min-block-height: 34; }
-
 levelbar trough {
   padding: 2px;
   border-radius: 3px;
@@ -1971,6 +1963,12 @@ levelbar trough {
     color: #000;
     background-image: linear-gradient(to bottom, #fff);
     box-shadow: 0 1px rgba(255, 255, 255, 0); }
+levelbar block {
+  min-width: 32px;
+  min-height: 1px; }
+levelbar.vertical block {
+  min-width: 1px;
+  min-height: 32px; }
 levelbar.horizontal.discrete block {
   margin: 0 1px; }
 levelbar.vertical.discrete block {


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