group: Gut the implementation

A Group is a just a ClutterActor with the layout-manager property set at
instance initialization time. It doesn't need anything else from
ClutterActor's vtable, except the slightly custom show_all/hide_all
implementation, and a simplified get_paint_volume.
This commit is contained in:
Emmanuele Bassi 2012-01-20 14:53:41 +00:00
parent 1afd3827c7
commit bd348625c7

View File

@ -19,8 +19,6 @@
* *
* You should have received a copy of the GNU Lesser General Public * You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>. * License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*
*/ */
/** /**
@ -68,137 +66,83 @@
#define CLUTTER_GROUP_GET_PRIVATE(obj) \ #define CLUTTER_GROUP_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), CLUTTER_TYPE_GROUP, ClutterGroupPrivate)) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), CLUTTER_TYPE_GROUP, ClutterGroupPrivate))
struct _ClutterGroupPrivate
{
ClutterLayoutManager *layout;
};
G_DEFINE_TYPE (ClutterGroup, clutter_group, CLUTTER_TYPE_ACTOR) G_DEFINE_TYPE (ClutterGroup, clutter_group, CLUTTER_TYPE_ACTOR)
static void
clutter_group_real_pick (ClutterActor *actor,
const ClutterColor *pick)
{
ClutterActor *child;
/* Chain up so we get a bounding box pained (if we are reactive) */
CLUTTER_ACTOR_CLASS (clutter_group_parent_class)->pick (actor, pick);
for (child = clutter_actor_get_first_child (actor);
child != NULL;
child = clutter_actor_get_next_sibling (child))
{
clutter_actor_paint (child);
}
}
static void
clutter_group_real_get_preferred_width (ClutterActor *actor,
gfloat for_height,
gfloat *min_width,
gfloat *natural_width)
{
ClutterGroupPrivate *priv = CLUTTER_GROUP (actor)->priv;
clutter_layout_manager_get_preferred_width (priv->layout,
CLUTTER_CONTAINER (actor),
for_height,
min_width, natural_width);
}
static void
clutter_group_real_get_preferred_height (ClutterActor *actor,
gfloat for_width,
gfloat *min_height,
gfloat *natural_height)
{
ClutterGroupPrivate *priv = CLUTTER_GROUP (actor)->priv;
clutter_layout_manager_get_preferred_height (priv->layout,
CLUTTER_CONTAINER (actor),
for_width,
min_height, natural_height);
}
static void
clutter_group_real_allocate (ClutterActor *actor,
const ClutterActorBox *allocation,
ClutterAllocationFlags flags)
{
ClutterGroupPrivate *priv = CLUTTER_GROUP (actor)->priv;
ClutterActorClass *klass;
klass = CLUTTER_ACTOR_CLASS (clutter_group_parent_class);
klass->allocate (actor, allocation, flags);
clutter_layout_manager_allocate (priv->layout,
CLUTTER_CONTAINER (actor),
allocation, flags);
}
static void
clutter_group_dispose (GObject *object)
{
ClutterGroup *self = CLUTTER_GROUP (object);
ClutterGroupPrivate *priv = self->priv;
if (priv->layout != NULL)
{
clutter_layout_manager_set_container (priv->layout, NULL);
g_object_unref (priv->layout);
priv->layout = NULL;
}
G_OBJECT_CLASS (clutter_group_parent_class)->dispose (object);
}
static void static void
clutter_group_real_show_all (ClutterActor *actor) clutter_group_real_show_all (ClutterActor *actor)
{ {
clutter_container_foreach (CLUTTER_CONTAINER (actor), ClutterActor *iter;
CLUTTER_CALLBACK (clutter_actor_show),
NULL); for (iter = clutter_actor_get_first_child (actor);
iter != NULL;
iter = clutter_actor_get_next_sibling (iter))
clutter_actor_show (iter);
clutter_actor_show (actor); clutter_actor_show (actor);
} }
static void static void
clutter_group_real_hide_all (ClutterActor *actor) clutter_group_real_hide_all (ClutterActor *actor)
{ {
ClutterActor *iter;
clutter_actor_hide (actor); clutter_actor_hide (actor);
clutter_container_foreach (CLUTTER_CONTAINER (actor),
CLUTTER_CALLBACK (clutter_actor_hide), for (iter = clutter_actor_get_first_child (actor);
NULL); iter != NULL;
iter = clutter_actor_get_next_sibling (iter))
clutter_actor_hide (iter);
}
static gboolean
clutter_group_get_paint_volume (ClutterActor *actor,
ClutterPaintVolume *volume)
{
ClutterActor *child;
gboolean retval;
/* bail out early if we don't have any child */
if (clutter_actor_get_n_children (actor) == 0)
return FALSE;
retval = TRUE;
/* otherwise, union the paint volumes of our children, in case
* any one of them decides to paint outside the parent's allocation
*/
for (child = clutter_actor_get_first_child (actor);
child != NULL;
child = clutter_actor_get_next_sibling (child))
{
const ClutterPaintVolume *child_volume;
/* This gets the paint volume of the child transformed into the
* group's coordinate space... */
child_volume = clutter_actor_get_transformed_paint_volume (child, actor);
if (!child_volume)
return FALSE;
clutter_paint_volume_union (volume, child_volume);
}
return retval;
} }
static void static void
clutter_group_class_init (ClutterGroupClass *klass) clutter_group_class_init (ClutterGroupClass *klass)
{ {
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass); ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
g_type_class_add_private (klass, sizeof (ClutterGroupPrivate));
actor_class->get_preferred_width = clutter_group_real_get_preferred_width;
actor_class->get_preferred_height = clutter_group_real_get_preferred_height;
actor_class->allocate = clutter_group_real_allocate;
actor_class->pick = clutter_group_real_pick;
actor_class->show_all = clutter_group_real_show_all; actor_class->show_all = clutter_group_real_show_all;
actor_class->hide_all = clutter_group_real_hide_all; actor_class->hide_all = clutter_group_real_hide_all;
actor_class->get_paint_volume = clutter_group_get_paint_volume;
gobject_class->dispose = clutter_group_dispose;
} }
static void static void
clutter_group_init (ClutterGroup *self) clutter_group_init (ClutterGroup *self)
{ {
self->priv = CLUTTER_GROUP_GET_PRIVATE (self); clutter_actor_set_layout_manager (CLUTTER_ACTOR (self),
clutter_fixed_layout_new ());
self->priv->layout = clutter_fixed_layout_new ();
g_object_ref_sink (self->priv->layout);
clutter_layout_manager_set_container (self->priv->layout,
CLUTTER_CONTAINER (self));
} }
/** /**