shorthand: Add a property for all subproperties
This commit is contained in:
		@ -22,15 +22,80 @@
 | 
			
		||||
 | 
			
		||||
#include "gtkcssshorthandpropertyprivate.h"
 | 
			
		||||
 | 
			
		||||
#include "gtkintl.h"
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
  PROP_0,
 | 
			
		||||
  PROP_SUBPROPERTIES,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
G_DEFINE_TYPE (GtkCssShorthandProperty, _gtk_css_shorthand_property, GTK_TYPE_STYLE_PROPERTY)
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
gtk_css_shorthand_property_set_property (GObject      *object,
 | 
			
		||||
                                         guint         prop_id,
 | 
			
		||||
                                         const GValue *value,
 | 
			
		||||
                                         GParamSpec   *pspec)
 | 
			
		||||
{
 | 
			
		||||
  GtkCssShorthandProperty *property = GTK_CSS_SHORTHAND_PROPERTY (object);
 | 
			
		||||
  const char **subproperties;
 | 
			
		||||
  guint i;
 | 
			
		||||
 | 
			
		||||
  switch (prop_id)
 | 
			
		||||
    {
 | 
			
		||||
    case PROP_SUBPROPERTIES:
 | 
			
		||||
      subproperties = g_value_get_boxed (value);
 | 
			
		||||
      g_assert (subproperties);
 | 
			
		||||
      for (i = 0; subproperties[i] != NULL; i++)
 | 
			
		||||
        {
 | 
			
		||||
          GtkStyleProperty *subproperty = _gtk_style_property_lookup (subproperties[i]);
 | 
			
		||||
          g_assert (GTK_IS_CSS_STYLE_PROPERTY (subproperty));
 | 
			
		||||
          g_ptr_array_add (property->subproperties, subproperty);
 | 
			
		||||
        }
 | 
			
		||||
      break;
 | 
			
		||||
    default:
 | 
			
		||||
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
_gtk_css_shorthand_property_class_init (GtkCssShorthandPropertyClass *klass)
 | 
			
		||||
{
 | 
			
		||||
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
 | 
			
		||||
 | 
			
		||||
  object_class->set_property = gtk_css_shorthand_property_set_property;
 | 
			
		||||
 | 
			
		||||
  g_object_class_install_property (object_class,
 | 
			
		||||
                                   PROP_SUBPROPERTIES,
 | 
			
		||||
                                   g_param_spec_boxed ("subproperties",
 | 
			
		||||
                                                       P_("Subproperties"),
 | 
			
		||||
                                                       P_("The list of subproperties"),
 | 
			
		||||
                                                       G_TYPE_STRV,
 | 
			
		||||
                                                       G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
_gtk_css_shorthand_property_init (GtkCssShorthandProperty *shorthand)
 | 
			
		||||
{
 | 
			
		||||
  shorthand->subproperties = g_ptr_array_new_with_free_func (g_object_unref);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
GtkCssStyleProperty *
 | 
			
		||||
_gtk_css_shorthand_property_get_subproperty (GtkCssShorthandProperty *shorthand,
 | 
			
		||||
                                             guint                    property)
 | 
			
		||||
{
 | 
			
		||||
  g_return_val_if_fail (GTK_IS_CSS_SHORTHAND_PROPERTY (shorthand), NULL);
 | 
			
		||||
  g_return_val_if_fail (property < shorthand->subproperties->len, NULL);
 | 
			
		||||
 | 
			
		||||
  return g_ptr_array_index (shorthand->subproperties, property);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
guint
 | 
			
		||||
_gtk_css_shorthand_property_get_n_subproperties (GtkCssShorthandProperty *shorthand)
 | 
			
		||||
{
 | 
			
		||||
  g_return_val_if_fail (GTK_IS_CSS_SHORTHAND_PROPERTY (shorthand), 0);
 | 
			
		||||
  
 | 
			
		||||
  return shorthand->subproperties->len;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -767,6 +767,7 @@ unset_border_image (GtkStyleProperties *props,
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
_gtk_css_shorthand_property_register (GParamSpec               *pspec,
 | 
			
		||||
                                      const char              **subproperties,
 | 
			
		||||
                                      GtkStylePropertyFlags     flags,
 | 
			
		||||
                                      GtkStylePropertyParser    property_parse_func,
 | 
			
		||||
                                      GtkStyleUnpackFunc        unpack_func,
 | 
			
		||||
@ -783,6 +784,7 @@ _gtk_css_shorthand_property_register (GParamSpec               *pspec,
 | 
			
		||||
 | 
			
		||||
  node = g_object_new (GTK_TYPE_CSS_SHORTHAND_PROPERTY,
 | 
			
		||||
                       "name", pspec->name,
 | 
			
		||||
                       "subproperties", subproperties,
 | 
			
		||||
                       NULL);
 | 
			
		||||
 | 
			
		||||
  node->flags = flags;
 | 
			
		||||
@ -798,10 +800,20 @@ _gtk_css_shorthand_property_register (GParamSpec               *pspec,
 | 
			
		||||
void
 | 
			
		||||
_gtk_css_shorthand_property_init_properties (void)
 | 
			
		||||
{
 | 
			
		||||
  const char *font_subproperties[] = { "font-family", "font-style", "font-variant", "font-weight", "font-size", NULL };
 | 
			
		||||
  const char *margin_subproperties[] = { "margin-top", "margin-right", "margin-bottom", "margin-left", NULL };
 | 
			
		||||
  const char *padding_subproperties[] = { "padding-top", "padding-right", "padding-bottom", "padding-left", NULL };
 | 
			
		||||
  const char *border_width_subproperties[] = { "border-top-width", "border-right-width", "border-bottom-width", "border-left-width", NULL };
 | 
			
		||||
  const char *border_radius_subproperties[] = { "border-top-left-radius", "border-top-right-radius",
 | 
			
		||||
                                                "border-bottom-right-radius", "border-bottom-left-radius", NULL };
 | 
			
		||||
  const char *border_color_subproperties[] = { "border-top-color", "border-right-color", "border-bottom-color", "border-left-color", NULL };
 | 
			
		||||
  const char *border_image_subproperties[] = { "border-image-source", "border-image-slice", "border-image-width", "border-image-repeat", NULL };
 | 
			
		||||
 | 
			
		||||
  _gtk_css_shorthand_property_register   (g_param_spec_boxed ("font",
 | 
			
		||||
                                                              "Font Description",
 | 
			
		||||
                                                              "Font Description",
 | 
			
		||||
                                                              PANGO_TYPE_FONT_DESCRIPTION, 0),
 | 
			
		||||
                                          font_subproperties,
 | 
			
		||||
                                          GTK_STYLE_PROPERTY_INHERIT,
 | 
			
		||||
                                          NULL,
 | 
			
		||||
                                          unpack_font_description,
 | 
			
		||||
@ -814,6 +826,7 @@ _gtk_css_shorthand_property_init_properties (void)
 | 
			
		||||
                                                              "Margin",
 | 
			
		||||
                                                              "Margin",
 | 
			
		||||
                                                              GTK_TYPE_BORDER, 0),
 | 
			
		||||
                                          margin_subproperties,
 | 
			
		||||
                                          0,
 | 
			
		||||
                                          NULL,
 | 
			
		||||
                                          unpack_margin,
 | 
			
		||||
@ -826,6 +839,7 @@ _gtk_css_shorthand_property_init_properties (void)
 | 
			
		||||
                                                              "Padding",
 | 
			
		||||
                                                              "Padding",
 | 
			
		||||
                                                              GTK_TYPE_BORDER, 0),
 | 
			
		||||
                                          padding_subproperties,
 | 
			
		||||
                                          0,
 | 
			
		||||
                                          NULL,
 | 
			
		||||
                                          unpack_padding,
 | 
			
		||||
@ -838,6 +852,7 @@ _gtk_css_shorthand_property_init_properties (void)
 | 
			
		||||
                                                              "Border width",
 | 
			
		||||
                                                              "Border width, in pixels",
 | 
			
		||||
                                                              GTK_TYPE_BORDER, 0),
 | 
			
		||||
                                          border_width_subproperties,
 | 
			
		||||
                                          0,
 | 
			
		||||
                                          NULL,
 | 
			
		||||
                                          unpack_border_width,
 | 
			
		||||
@ -850,6 +865,7 @@ _gtk_css_shorthand_property_init_properties (void)
 | 
			
		||||
                                                            "Border radius",
 | 
			
		||||
                                                            "Border radius, in pixels",
 | 
			
		||||
                                                            0, G_MAXINT, 0, 0),
 | 
			
		||||
                                          border_radius_subproperties,
 | 
			
		||||
                                          0,
 | 
			
		||||
                                          NULL,
 | 
			
		||||
                                          unpack_border_radius,
 | 
			
		||||
@ -862,6 +878,7 @@ _gtk_css_shorthand_property_init_properties (void)
 | 
			
		||||
                                                              "Border color",
 | 
			
		||||
                                                              "Border color",
 | 
			
		||||
                                                              GDK_TYPE_RGBA, 0),
 | 
			
		||||
                                          border_color_subproperties,
 | 
			
		||||
                                          0,
 | 
			
		||||
                                          NULL,
 | 
			
		||||
                                          unpack_border_color,
 | 
			
		||||
@ -874,6 +891,7 @@ _gtk_css_shorthand_property_init_properties (void)
 | 
			
		||||
                                                              "Border Image",
 | 
			
		||||
                                                              "Border Image",
 | 
			
		||||
                                                              GTK_TYPE_BORDER_IMAGE, 0),
 | 
			
		||||
                                          border_image_subproperties,
 | 
			
		||||
                                          0,
 | 
			
		||||
                                          NULL,
 | 
			
		||||
                                          _gtk_border_image_unpack,
 | 
			
		||||
 | 
			
		||||
@ -23,6 +23,8 @@
 | 
			
		||||
 | 
			
		||||
#include <glib-object.h>
 | 
			
		||||
 | 
			
		||||
#include "gtk/gtkcssparserprivate.h"
 | 
			
		||||
#include "gtk/gtkcssstylepropertyprivate.h"
 | 
			
		||||
#include "gtk/gtkstylepropertyprivate.h"
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
@ -40,6 +42,8 @@ typedef struct _GtkCssShorthandPropertyClass      GtkCssShorthandPropertyClass;
 | 
			
		||||
struct _GtkCssShorthandProperty
 | 
			
		||||
{
 | 
			
		||||
  GtkStyleProperty parent;
 | 
			
		||||
 | 
			
		||||
  GPtrArray *subproperties;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct _GtkCssShorthandPropertyClass
 | 
			
		||||
@ -51,6 +55,10 @@ void                    _gtk_css_shorthand_property_init_properties     (void);
 | 
			
		||||
 | 
			
		||||
GType                   _gtk_css_shorthand_property_get_type            (void) G_GNUC_CONST;
 | 
			
		||||
 | 
			
		||||
GtkCssStyleProperty *   _gtk_css_shorthand_property_get_subproperty     (GtkCssShorthandProperty *shorthand,
 | 
			
		||||
                                                                         guint                    property);
 | 
			
		||||
guint                   _gtk_css_shorthand_property_get_n_subproperties (GtkCssShorthandProperty *shorthand);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user