[gtk+/wip/matthiasc/gadget: 2/16] separator: port to gadgets



commit 60c8c1345963199adcf958835d35af947b6d4204
Author: Matthias Clasen <mclasen redhat com>
Date:   Thu Nov 26 22:32:41 2015 -0500

    separator: port to gadgets
    
    As part of this, stop using custom rendering code for wide
    and non-wide separators.

 gtk/gtkseparator.c                       |  118 +++++++++++++++--------------
 gtk/gtkwidget.c                          |   11 ++-
 gtk/theme/Adwaita/_common.scss           |    4 +-
 gtk/theme/Adwaita/gtk-contained-dark.css |    4 +-
 gtk/theme/Adwaita/gtk-contained.css      |    4 +-
 5 files changed, 78 insertions(+), 63 deletions(-)
---
diff --git a/gtk/gtkseparator.c b/gtk/gtkseparator.c
index c8f2a08..ca26992 100644
--- a/gtk/gtkseparator.c
+++ b/gtk/gtkseparator.c
@@ -30,6 +30,8 @@
 #include "gtkintl.h"
 #include "gtkprivate.h"
 #include "gtkrender.h"
+#include "gtkwidgetprivate.h"
+#include "gtkcsscustomgadgetprivate.h"
 
 /**
  * SECTION:gtkseparator
@@ -51,6 +53,7 @@
 struct _GtkSeparatorPrivate
 {
   GtkOrientation orientation;
+  GtkCssGadget *gadget;
 };
 
 
@@ -111,18 +114,28 @@ gtk_separator_get_property (GObject    *object,
     }
 }
 
+
 static void
-gtk_separator_get_preferred_size (GtkWidget      *widget,
-                                  GtkOrientation  orientation,
-                                  gint           *minimum,
-                                  gint           *natural)
+gtk_separator_get_content_size (GtkCssGadget   *gadget,
+                                GtkOrientation  orientation,
+                                gint            for_size,
+                                gint           *minimum,
+                                gint           *natural,
+                                gint           *minimum_baseline,
+                                gint           *natural_baseline,
+                                gpointer        data)
 {
-  GtkSeparator *separator = GTK_SEPARATOR (widget);
-  GtkSeparatorPrivate *private = separator->priv;
+  GtkWidget *widget;
+  GtkSeparator *separator;
+  GtkSeparatorPrivate *private;
   gboolean wide_sep;
   gint     sep_width;
   gint     sep_height;
 
+  widget = gtk_css_gadget_get_owner (gadget);
+  separator = GTK_SEPARATOR (widget);
+  private = separator->priv;
+
   gtk_widget_style_get (widget,
                         "wide-separators",  &wide_sep,
                         "separator-width",  &sep_width,
@@ -130,17 +143,11 @@ gtk_separator_get_preferred_size (GtkWidget      *widget,
                         NULL);
 
   if (orientation == private->orientation)
-    {
-      *minimum = *natural = 1;
-    }
+    *minimum = *natural = 1;
   else if (orientation == GTK_ORIENTATION_VERTICAL)
-    {
-      *minimum = *natural = wide_sep ? sep_height : 1;
-    }
+    *minimum = *natural = wide_sep ? sep_height : 1;
   else
-    {
-      *minimum = *natural = wide_sep ? sep_width : 1;
-    }
+    *minimum = *natural = wide_sep ? sep_width : 1;
 }
 
 static void
@@ -148,7 +155,11 @@ gtk_separator_get_preferred_width (GtkWidget *widget,
                                    gint      *minimum,
                                    gint      *natural)
 {
-  gtk_separator_get_preferred_size (widget, GTK_ORIENTATION_HORIZONTAL, minimum, natural);
+  gtk_css_gadget_get_preferred_size (GTK_SEPARATOR (widget)->priv->gadget,
+                                     GTK_ORIENTATION_HORIZONTAL,
+                                     -1,
+                                     minimum, natural,
+                                     NULL, NULL);
 }
 
 static void
@@ -156,53 +167,34 @@ gtk_separator_get_preferred_height (GtkWidget *widget,
                                     gint      *minimum,
                                     gint      *natural)
 {
-  gtk_separator_get_preferred_size (widget, GTK_ORIENTATION_VERTICAL, minimum, natural);
+  gtk_css_gadget_get_preferred_size (GTK_SEPARATOR (widget)->priv->gadget,
+                                     GTK_ORIENTATION_VERTICAL,
+                                     -1,
+                                     minimum, natural,
+                                     NULL, NULL);
 }
 
-static gboolean
-gtk_separator_draw (GtkWidget *widget,
-                    cairo_t   *cr)
+static void
+gtk_separator_size_allocate (GtkWidget     *widget,
+                             GtkAllocation *allocation)
 {
-  GtkSeparator *separator = GTK_SEPARATOR (widget);
-  GtkSeparatorPrivate *private = separator->priv;
-  GtkStyleContext *context;
-  gboolean wide_separators;
-  gint separator_width;
-  gint separator_height;
-  int width, height;
+  GtkAllocation clip;
 
-  gtk_widget_style_get (widget,
-                        "wide-separators",  &wide_separators,
-                        "separator-width",  &separator_width,
-                        "separator-height", &separator_height,
-                        NULL);
+  gtk_widget_set_allocation (widget, allocation);
 
-  context = gtk_widget_get_style_context (widget);
-  width = gtk_widget_get_allocated_width (widget);
-  height = gtk_widget_get_allocated_height (widget);
+  gtk_css_gadget_allocate (GTK_SEPARATOR (widget)->priv->gadget,
+                           allocation,
+                           gtk_widget_get_allocated_baseline (widget),
+                           &clip);
 
-  if (private->orientation == GTK_ORIENTATION_HORIZONTAL)
-    {
-      if (wide_separators)
-        gtk_render_frame (context, cr,
-                          0, (height - separator_height) / 2,
-                          width, separator_height);
-      else
-        gtk_render_line (context, cr,
-                         0, height / 2,
-                         width - 1, height / 2);
-    }
-  else
-    {
-      if (wide_separators)
-        gtk_render_frame (context, cr,
-                          (width - separator_width) / 2, 0,
-                          separator_width, height);
-      else
-        gtk_render_line (context, cr,
-                         width / 2, 0,
-                         width / 2, height - 1);
-    }
+  gtk_widget_set_clip (widget, &clip);
+}
+
+static gboolean
+gtk_separator_draw (GtkWidget *widget,
+                    cairo_t   *cr)
+{
+  gtk_css_gadget_draw (GTK_SEPARATOR (widget)->priv->gadget, cr);
 
   return FALSE;
 }
@@ -210,12 +202,23 @@ gtk_separator_draw (GtkWidget *widget,
 static void
 gtk_separator_init (GtkSeparator *separator)
 {
+  GtkCssNode *widget_node;
+
   separator->priv = gtk_separator_get_instance_private (separator);
   separator->priv->orientation = GTK_ORIENTATION_HORIZONTAL;
 
   gtk_widget_set_has_window (GTK_WIDGET (separator), FALSE);
 
   _gtk_orientable_set_style_classes (GTK_ORIENTABLE (separator));
+
+  widget_node = gtk_widget_get_css_node (GTK_WIDGET (separator));
+  separator->priv->gadget = gtk_css_custom_gadget_new_for_node (widget_node,
+                                                                GTK_WIDGET (separator),
+                                                                gtk_separator_get_content_size,
+                                                                NULL,
+                                                                NULL,
+                                                                NULL,
+                                                                NULL);
 }
 
 static void
@@ -229,6 +232,7 @@ gtk_separator_class_init (GtkSeparatorClass *class)
 
   widget_class->get_preferred_width = gtk_separator_get_preferred_width;
   widget_class->get_preferred_height = gtk_separator_get_preferred_height;
+  widget_class->size_allocate = gtk_separator_size_allocate;
 
   widget_class->draw = gtk_separator_draw;
 
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index c7e207c..90a060c 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -3566,13 +3566,14 @@ G_GNUC_END_IGNORE_DEPRECATIONS
    * configurable width and should be drawn using a box instead of a line.
    *
    * Since: 2.10
+   * Deprecated: 3.20: Use the standard min-width and min-height CSS properties instead.
    */
   gtk_widget_class_install_style_property (klass,
                                            g_param_spec_boolean ("wide-separators",
                                                                  P_("Wide Separators"),
                                                                  P_("Whether separators have configurable 
width and should be drawn using a box instead of a line"),
                                                                  FALSE,
-                                                                 GTK_PARAM_READABLE));
+                                                                 GTK_PARAM_READABLE|G_PARAM_DEPRECATED));
 
   /**
    * GtkWidget:separator-width:
@@ -3581,13 +3582,15 @@ G_GNUC_END_IGNORE_DEPRECATIONS
    * This property only takes effect if the "wide-separators" style property is %TRUE.
    *
    * Since: 2.10
+   *
+   * Deprecated: 3.20: Use the standard min-width and min-height CSS properties instead.
    */
   gtk_widget_class_install_style_property (klass,
                                            g_param_spec_int ("separator-width",
                                                              P_("Separator Width"),
                                                              P_("The width of separators if wide-separators 
is TRUE"),
                                                              0, G_MAXINT, 0,
-                                                             GTK_PARAM_READABLE));
+                                                             GTK_PARAM_READABLE|G_PARAM_DEPRECATED));
 
   /**
    * GtkWidget:separator-height:
@@ -3596,13 +3599,15 @@ G_GNUC_END_IGNORE_DEPRECATIONS
    * This property only takes effect if the "wide-separators" style property is %TRUE.
    *
    * Since: 2.10
+   *
+   * Deprecated: 3.20: Use the standard min-width and min-height CSS properties instead.
    */
   gtk_widget_class_install_style_property (klass,
                                            g_param_spec_int ("separator-height",
                                                              P_("Separator Height"),
                                                              P_("The height of separators if 
\"wide-separators\" is TRUE"),
                                                              0, G_MAXINT, 0,
-                                                             GTK_PARAM_READABLE));
+                                                             GTK_PARAM_READABLE|G_PARAM_DEPRECATED));
 
   /**
    * GtkWidget:scroll-arrow-hlength:
diff --git a/gtk/theme/Adwaita/_common.scss b/gtk/theme/Adwaita/_common.scss
index c35d84f..fd9c890 100644
--- a/gtk/theme/Adwaita/_common.scss
+++ b/gtk/theme/Adwaita/_common.scss
@@ -2557,7 +2557,9 @@ scrolledwindow {
 separator {
   // always disable separators
   // -GtkWidget-wide-separators: true;
-  color: transparentize(black, 0.9);
+  background: transparentize(black, 0.9);
+  min-width: 1px;
+  min-height: 1px;
 
   // Font and File button separators
   button.file &.vertical,
diff --git a/gtk/theme/Adwaita/gtk-contained-dark.css b/gtk/theme/Adwaita/gtk-contained-dark.css
index aa6663e..271dc25 100644
--- a/gtk/theme/Adwaita/gtk-contained-dark.css
+++ b/gtk/theme/Adwaita/gtk-contained-dark.css
@@ -3580,7 +3580,9 @@ scrolledwindow junction {
     background-color: #323737; }
 
 separator {
-  color: rgba(0, 0, 0, 0.1); }
+  background: rgba(0, 0, 0, 0.1);
+  min-width: 1px;
+  min-height: 1px; }
   button.file separator.vertical, button.font separator.vertical {
     -GtkWidget-wide-separators: true; }
 
diff --git a/gtk/theme/Adwaita/gtk-contained.css b/gtk/theme/Adwaita/gtk-contained.css
index 7f3019e..8b5fe3d 100644
--- a/gtk/theme/Adwaita/gtk-contained.css
+++ b/gtk/theme/Adwaita/gtk-contained.css
@@ -3742,7 +3742,9 @@ scrolledwindow junction {
     background-color: #e5e5e5; }
 
 separator {
-  color: rgba(0, 0, 0, 0.1); }
+  background: rgba(0, 0, 0, 0.1);
+  min-width: 1px;
+  min-height: 1px; }
   button.file separator.vertical, button.font separator.vertical {
     -GtkWidget-wide-separators: true; }
 


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