actor: Background color

Each actor should have a background color property, disabled by default.

This property allows us to cover 99% of the use cases for
ClutterRectangle, and brings us one step closer to being able to
instantiate ClutterActor directly.
This commit is contained in:
Emmanuele Bassi 2011-12-05 08:41:51 +00:00
parent 7d88a70b78
commit 98a8feae64
2 changed files with 141 additions and 1 deletions

View File

@ -306,6 +306,8 @@
#include "clutter-actor-meta-private.h"
#include "clutter-animatable.h"
#include "clutter-behaviour.h"
#include "clutter-color-static.h"
#include "clutter-color.h"
#include "clutter-constraint.h"
#include "clutter-container.h"
#include "clutter-debug.h"
@ -482,6 +484,8 @@ struct _ClutterActorPrivate
ClutterStageQueueRedrawEntry *queue_redraw_entry;
ClutterColor bg_color;
/* bitfields */
/* fixed position and sizes */
@ -518,6 +522,7 @@ struct _ClutterActorPrivate
guint y_expand_set : 1;
guint y_expand_effective : 1;
guint needs_compute_expand : 1;
guint bg_color_set : 1;
};
enum
@ -617,6 +622,9 @@ enum
PROP_MARGIN_LEFT,
PROP_MARGIN_RIGHT,
PROP_BACKGROUND_COLOR,
PROP_BACKGROUND_COLOR_SET,
PROP_LAST
};
@ -3163,7 +3171,26 @@ clutter_actor_continue_paint (ClutterActor *self)
if (priv->next_effect_to_paint == NULL)
{
if (_clutter_context_get_pick_mode () == CLUTTER_PICK_NONE)
g_signal_emit (self, actor_signals[PAINT], 0);
{
/* paint the background color, if set */
if (priv->bg_color_set)
{
float width, height;
clutter_actor_box_get_size (&priv->allocation,
&width,
&height);
cogl_set_source_color4ub (priv->bg_color.red,
priv->bg_color.green,
priv->bg_color.blue,
priv->bg_color.alpha);
cogl_rectangle (0, 0, width, height);
}
g_signal_emit (self, actor_signals[PAINT], 0);
}
else
{
ClutterColor col = { 0, };
@ -3577,6 +3604,10 @@ clutter_actor_set_property (GObject *object,
clutter_actor_set_margin_right (actor, g_value_get_float (value));
break;
case PROP_BACKGROUND_COLOR:
clutter_actor_set_background_color (actor, g_value_get_boxed (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@ -3948,6 +3979,14 @@ clutter_actor_get_property (GObject *object,
}
break;
case PROP_BACKGROUND_COLOR_SET:
g_value_set_boolean (value, priv->bg_color_set);
break;
case PROP_BACKGROUND_COLOR:
g_value_set_boxed (value, &priv->bg_color);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@ -5078,6 +5117,35 @@ clutter_actor_class_init (ClutterActorClass *klass)
0.0,
CLUTTER_PARAM_READWRITE);
/**
* ClutterActor:background-color-set:
*
* Whether the #ClutterActor:background-color property has been set.
*
* Since: 1.10
*/
obj_props[PROP_BACKGROUND_COLOR_SET] =
g_param_spec_boolean ("background-color-set",
P_("Background Color Set"),
P_("Whether the background color is set"),
FALSE,
CLUTTER_PARAM_READABLE);
/**
* ClutterActor:background-color:
*
* Paints a solid fill of the actor's allocation using the specified
* color.
*
* Since: 1.10
*/
obj_props[PROP_BACKGROUND_COLOR] =
clutter_param_spec_color ("background-color",
P_("Background color"),
P_("The actor's background color"),
CLUTTER_COLOR_Transparent,
CLUTTER_PARAM_READWRITE);
g_object_class_install_properties (object_class, PROP_LAST, obj_props);
/**
@ -14839,3 +14907,70 @@ clutter_actor_get_margin_right (ClutterActor *self)
return _clutter_actor_get_layout_info_or_defaults (self)->margin.right;
}
/**
* clutter_actor_set_background_color:
* @self: a #ClutterActor
* @color: (allow-none): a #ClutterColor, or %NULL to unset a previously
* set color
*
* Sets the background color of a #ClutterActor.
*
* The background color will be used to cover the whole allocation of the
* actor. The default background color of an actor is transparent.
*
* To check whether an actor has a background color, you can use the
* #ClutterActor:background-color-set actor property.
*
* Since: 1.10
*/
void
clutter_actor_set_background_color (ClutterActor *self,
const ClutterColor *color)
{
ClutterActorPrivate *priv;
g_return_if_fail (CLUTTER_IS_ACTOR (self));
priv = self->priv;
if (color == NULL)
{
priv->bg_color_set = FALSE;
g_object_notify_by_pspec (G_OBJECT (self),
obj_props[PROP_BACKGROUND_COLOR_SET]);
return;
}
if (priv->bg_color_set && clutter_color_equal (color, &priv->bg_color))
return;
priv->bg_color = *color;
priv->bg_color_set = TRUE;
clutter_actor_queue_redraw (self);
g_object_notify_by_pspec (G_OBJECT (self),
obj_props[PROP_BACKGROUND_COLOR_SET]);
g_object_notify_by_pspec (G_OBJECT (self),
obj_props[PROP_BACKGROUND_COLOR]);
}
/**
* clutter_actor_get_background_color:
* @self: a #ClutterActor
* @color: (out caller-allocates): return location for a #ClutterColor
*
* Retrieves the color set using clutter_actor_set_background_color().
*
* Since: 1.10
*/
void
clutter_actor_get_background_color (ClutterActor *self,
ClutterColor *color)
{
g_return_if_fail (CLUTTER_IS_ACTOR (self));
g_return_if_fail (color != NULL);
*color = self->priv->bg_color;
}

View File

@ -578,6 +578,11 @@ gboolean clutter_actor_get_paint_box (ClutterActor *sel
gboolean clutter_actor_has_overlaps (ClutterActor *self);
void clutter_actor_set_background_color (ClutterActor *self,
const ClutterColor *color);
void clutter_actor_get_background_color (ClutterActor *self,
ClutterColor *color);
G_END_DECLS
#endif /* __CLUTTER_ACTOR_H__ */