cssnode: Add properties
This commit is contained in:
191
gtk/gtkcssnode.c
191
gtk/gtkcssnode.c
@ -24,6 +24,7 @@
|
|||||||
#include "gtkintl.h"
|
#include "gtkintl.h"
|
||||||
#include "gtkmarshalers.h"
|
#include "gtkmarshalers.h"
|
||||||
#include "gtksettingsprivate.h"
|
#include "gtksettingsprivate.h"
|
||||||
|
#include "gtktypebuiltins.h"
|
||||||
|
|
||||||
/* When these change we do a full restyling. Otherwise we try to figure out
|
/* When these change we do a full restyling. Otherwise we try to figure out
|
||||||
* if we need to change things. */
|
* if we need to change things. */
|
||||||
@ -38,7 +39,18 @@ enum {
|
|||||||
LAST_SIGNAL
|
LAST_SIGNAL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
PROP_0,
|
||||||
|
PROP_CLASSES,
|
||||||
|
PROP_ID,
|
||||||
|
PROP_STATE,
|
||||||
|
PROP_VISIBLE,
|
||||||
|
PROP_WIDGET_TYPE,
|
||||||
|
NUM_PROPERTIES
|
||||||
|
};
|
||||||
|
|
||||||
static guint cssnode_signals[LAST_SIGNAL] = { 0 };
|
static guint cssnode_signals[LAST_SIGNAL] = { 0 };
|
||||||
|
static GParamSpec *cssnode_properties[NUM_PROPERTIES];
|
||||||
|
|
||||||
static GtkStyleProviderPrivate *
|
static GtkStyleProviderPrivate *
|
||||||
gtk_css_node_get_style_provider_or_null (GtkCssNode *cssnode)
|
gtk_css_node_get_style_provider_or_null (GtkCssNode *cssnode)
|
||||||
@ -69,6 +81,76 @@ gtk_css_node_set_invalid (GtkCssNode *node,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_css_node_get_property (GObject *object,
|
||||||
|
guint property_id,
|
||||||
|
GValue *value,
|
||||||
|
GParamSpec *pspec)
|
||||||
|
{
|
||||||
|
GtkCssNode *cssnode = GTK_CSS_NODE (object);
|
||||||
|
|
||||||
|
switch (property_id)
|
||||||
|
{
|
||||||
|
case PROP_CLASSES:
|
||||||
|
g_value_take_boxed (value, gtk_css_node_get_classes (cssnode));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PROP_ID:
|
||||||
|
g_value_set_string (value, gtk_css_node_get_id (cssnode));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PROP_STATE:
|
||||||
|
g_value_set_flags (value, gtk_css_node_get_state (cssnode));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PROP_VISIBLE:
|
||||||
|
g_value_set_boolean (value, gtk_css_node_get_visible (cssnode));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PROP_WIDGET_TYPE:
|
||||||
|
g_value_set_gtype (value, gtk_css_node_get_widget_type (cssnode));
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_css_node_set_property (GObject *object,
|
||||||
|
guint property_id,
|
||||||
|
const GValue *value,
|
||||||
|
GParamSpec *pspec)
|
||||||
|
{
|
||||||
|
GtkCssNode *cssnode = GTK_CSS_NODE (object);
|
||||||
|
|
||||||
|
switch (property_id)
|
||||||
|
{
|
||||||
|
case PROP_CLASSES:
|
||||||
|
gtk_css_node_set_classes (cssnode, g_value_get_boxed (value));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PROP_ID:
|
||||||
|
gtk_css_node_set_id (cssnode, g_value_get_string (value));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PROP_STATE:
|
||||||
|
gtk_css_node_set_state (cssnode, g_value_get_flags (value));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PROP_VISIBLE:
|
||||||
|
gtk_css_node_set_visible (cssnode, g_value_get_boolean (value));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PROP_WIDGET_TYPE:
|
||||||
|
gtk_css_node_set_widget_type (cssnode, g_value_get_gtype (value));
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gtk_css_node_dispose (GObject *object)
|
gtk_css_node_dispose (GObject *object)
|
||||||
{
|
{
|
||||||
@ -404,6 +486,8 @@ gtk_css_node_class_init (GtkCssNodeClass *klass)
|
|||||||
{
|
{
|
||||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||||
|
|
||||||
|
object_class->get_property = gtk_css_node_get_property;
|
||||||
|
object_class->set_property = gtk_css_node_set_property;
|
||||||
object_class->dispose = gtk_css_node_dispose;
|
object_class->dispose = gtk_css_node_dispose;
|
||||||
object_class->finalize = gtk_css_node_finalize;
|
object_class->finalize = gtk_css_node_finalize;
|
||||||
|
|
||||||
@ -449,6 +533,40 @@ gtk_css_node_class_init (GtkCssNodeClass *klass)
|
|||||||
_gtk_marshal_VOID__OBJECT_OBJECT,
|
_gtk_marshal_VOID__OBJECT_OBJECT,
|
||||||
G_TYPE_NONE, 2,
|
G_TYPE_NONE, 2,
|
||||||
GTK_TYPE_CSS_STYLE, GTK_TYPE_CSS_STYLE);
|
GTK_TYPE_CSS_STYLE, GTK_TYPE_CSS_STYLE);
|
||||||
|
|
||||||
|
cssnode_properties[PROP_CLASSES] =
|
||||||
|
g_param_spec_boxed ("classes", "Classes",
|
||||||
|
"List of classes",
|
||||||
|
G_TYPE_STRV,
|
||||||
|
G_PARAM_READWRITE
|
||||||
|
| G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
|
||||||
|
cssnode_properties[PROP_ID] =
|
||||||
|
g_param_spec_string ("id", "ID",
|
||||||
|
"Unique ID",
|
||||||
|
NULL,
|
||||||
|
G_PARAM_READWRITE
|
||||||
|
| G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
|
||||||
|
cssnode_properties[PROP_STATE] =
|
||||||
|
g_param_spec_flags ("state", "State",
|
||||||
|
"State flags",
|
||||||
|
GTK_TYPE_STATE_FLAGS,
|
||||||
|
0,
|
||||||
|
G_PARAM_READWRITE
|
||||||
|
| G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
|
||||||
|
cssnode_properties[PROP_VISIBLE] =
|
||||||
|
g_param_spec_boolean ("visible", "Visible",
|
||||||
|
"If other nodes can see this node",
|
||||||
|
TRUE,
|
||||||
|
G_PARAM_READWRITE
|
||||||
|
| G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
|
||||||
|
cssnode_properties[PROP_WIDGET_TYPE] =
|
||||||
|
g_param_spec_gtype ("widget-type", "Widget type",
|
||||||
|
"GType of the widget",
|
||||||
|
G_TYPE_NONE,
|
||||||
|
G_PARAM_READWRITE
|
||||||
|
| G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
|
||||||
|
|
||||||
|
g_object_class_install_properties (object_class, NUM_PROPERTIES, cssnode_properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -763,6 +881,7 @@ gtk_css_node_set_visible (GtkCssNode *cssnode,
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
cssnode->visible = visible;
|
cssnode->visible = visible;
|
||||||
|
g_object_notify_by_pspec (G_OBJECT (cssnode), cssnode_properties[PROP_VISIBLE]);
|
||||||
|
|
||||||
if (cssnode->parent)
|
if (cssnode->parent)
|
||||||
gtk_css_node_set_children_changed (cssnode->parent);
|
gtk_css_node_set_children_changed (cssnode->parent);
|
||||||
@ -779,7 +898,10 @@ gtk_css_node_set_widget_type (GtkCssNode *cssnode,
|
|||||||
GType widget_type)
|
GType widget_type)
|
||||||
{
|
{
|
||||||
if (gtk_css_node_declaration_set_type (&cssnode->decl, widget_type))
|
if (gtk_css_node_declaration_set_type (&cssnode->decl, widget_type))
|
||||||
|
{
|
||||||
gtk_css_node_invalidate (cssnode, GTK_CSS_CHANGE_NAME);
|
gtk_css_node_invalidate (cssnode, GTK_CSS_CHANGE_NAME);
|
||||||
|
g_object_notify_by_pspec (G_OBJECT (cssnode), cssnode_properties[PROP_WIDGET_TYPE]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GType
|
GType
|
||||||
@ -793,7 +915,10 @@ gtk_css_node_set_id (GtkCssNode *cssnode,
|
|||||||
const char *id)
|
const char *id)
|
||||||
{
|
{
|
||||||
if (gtk_css_node_declaration_set_id (&cssnode->decl, id))
|
if (gtk_css_node_declaration_set_id (&cssnode->decl, id))
|
||||||
|
{
|
||||||
gtk_css_node_invalidate (cssnode, GTK_CSS_CHANGE_ID);
|
gtk_css_node_invalidate (cssnode, GTK_CSS_CHANGE_ID);
|
||||||
|
g_object_notify_by_pspec (G_OBJECT (cssnode), cssnode_properties[PROP_ID]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
@ -807,7 +932,10 @@ gtk_css_node_set_state (GtkCssNode *cssnode,
|
|||||||
GtkStateFlags state_flags)
|
GtkStateFlags state_flags)
|
||||||
{
|
{
|
||||||
if (gtk_css_node_declaration_set_state (&cssnode->decl, state_flags))
|
if (gtk_css_node_declaration_set_state (&cssnode->decl, state_flags))
|
||||||
|
{
|
||||||
gtk_css_node_invalidate (cssnode, GTK_CSS_CHANGE_STATE);
|
gtk_css_node_invalidate (cssnode, GTK_CSS_CHANGE_STATE);
|
||||||
|
g_object_notify_by_pspec (G_OBJECT (cssnode), cssnode_properties[PROP_STATE]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GtkStateFlags
|
GtkStateFlags
|
||||||
@ -829,12 +957,72 @@ gtk_css_node_get_junction_sides (GtkCssNode *cssnode)
|
|||||||
return gtk_css_node_declaration_get_junction_sides (cssnode->decl);
|
return gtk_css_node_declaration_get_junction_sides (cssnode->decl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_css_node_clear_classes (GtkCssNode *cssnode)
|
||||||
|
{
|
||||||
|
GList *list, *l;
|
||||||
|
|
||||||
|
list = gtk_css_node_declaration_list_classes (cssnode->decl);
|
||||||
|
|
||||||
|
for (l = list; l; l = l->next)
|
||||||
|
{
|
||||||
|
gtk_css_node_remove_class (cssnode, GPOINTER_TO_UINT (l->data));
|
||||||
|
}
|
||||||
|
|
||||||
|
g_list_free (list);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gtk_css_node_set_classes (GtkCssNode *cssnode,
|
||||||
|
const char **classes)
|
||||||
|
{
|
||||||
|
guint i;
|
||||||
|
|
||||||
|
g_object_freeze_notify (G_OBJECT (cssnode));
|
||||||
|
|
||||||
|
gtk_css_node_clear_classes (cssnode);
|
||||||
|
|
||||||
|
if (classes)
|
||||||
|
{
|
||||||
|
for (i = 0; classes[i] != NULL; i++)
|
||||||
|
{
|
||||||
|
gtk_css_node_add_class (cssnode, g_quark_from_string (classes[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
g_object_thaw_notify (G_OBJECT (cssnode));
|
||||||
|
}
|
||||||
|
|
||||||
|
char **
|
||||||
|
gtk_css_node_get_classes (GtkCssNode *cssnode)
|
||||||
|
{
|
||||||
|
GList *list, *l;
|
||||||
|
GPtrArray *result;
|
||||||
|
|
||||||
|
list = gtk_css_node_declaration_list_classes (cssnode->decl);
|
||||||
|
result = g_ptr_array_new ();
|
||||||
|
|
||||||
|
for (l = list; l; l = l->next)
|
||||||
|
{
|
||||||
|
g_ptr_array_add (result, g_strdup (g_quark_to_string (GPOINTER_TO_UINT (l->data))));
|
||||||
|
}
|
||||||
|
|
||||||
|
g_ptr_array_add (result, NULL);
|
||||||
|
|
||||||
|
g_list_free (list);
|
||||||
|
|
||||||
|
return (char **) g_ptr_array_free (result, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
gtk_css_node_add_class (GtkCssNode *cssnode,
|
gtk_css_node_add_class (GtkCssNode *cssnode,
|
||||||
GQuark style_class)
|
GQuark style_class)
|
||||||
{
|
{
|
||||||
if (gtk_css_node_declaration_add_class (&cssnode->decl, style_class))
|
if (gtk_css_node_declaration_add_class (&cssnode->decl, style_class))
|
||||||
|
{
|
||||||
gtk_css_node_invalidate (cssnode, GTK_CSS_CHANGE_CLASS);
|
gtk_css_node_invalidate (cssnode, GTK_CSS_CHANGE_CLASS);
|
||||||
|
g_object_notify_by_pspec (G_OBJECT (cssnode), cssnode_properties[PROP_CLASSES]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -842,7 +1030,10 @@ gtk_css_node_remove_class (GtkCssNode *cssnode,
|
|||||||
GQuark style_class)
|
GQuark style_class)
|
||||||
{
|
{
|
||||||
if (gtk_css_node_declaration_remove_class (&cssnode->decl, style_class))
|
if (gtk_css_node_declaration_remove_class (&cssnode->decl, style_class))
|
||||||
|
{
|
||||||
gtk_css_node_invalidate (cssnode, GTK_CSS_CHANGE_CLASS);
|
gtk_css_node_invalidate (cssnode, GTK_CSS_CHANGE_CLASS);
|
||||||
|
g_object_notify_by_pspec (G_OBJECT (cssnode), cssnode_properties[PROP_CLASSES]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
|
|||||||
@ -123,6 +123,9 @@ GtkStateFlags gtk_css_node_get_state (GtkCssNode *
|
|||||||
void gtk_css_node_set_junction_sides (GtkCssNode *cssnode,
|
void gtk_css_node_set_junction_sides (GtkCssNode *cssnode,
|
||||||
GtkJunctionSides junction_sides);
|
GtkJunctionSides junction_sides);
|
||||||
GtkJunctionSides gtk_css_node_get_junction_sides (GtkCssNode *cssnode);
|
GtkJunctionSides gtk_css_node_get_junction_sides (GtkCssNode *cssnode);
|
||||||
|
void gtk_css_node_set_classes (GtkCssNode *cssnode,
|
||||||
|
const char **classes);
|
||||||
|
char ** gtk_css_node_get_classes (GtkCssNode *cssnode);
|
||||||
void gtk_css_node_add_class (GtkCssNode *cssnode,
|
void gtk_css_node_add_class (GtkCssNode *cssnode,
|
||||||
GQuark style_class);
|
GQuark style_class);
|
||||||
void gtk_css_node_remove_class (GtkCssNode *cssnode,
|
void gtk_css_node_remove_class (GtkCssNode *cssnode,
|
||||||
|
|||||||
Reference in New Issue
Block a user