summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmmanuele Bassi <ebassi@gnome.org>2013-02-20 23:02:05 +0000
committerEmmanuele Bassi <ebassi@gnome.org>2013-02-20 23:06:28 +0000
commit01ba68ad3b2990513e1125bd3ce97a24d0a72670 (patch)
tree8e9e6ed8a10aea508d29fcd9d7bb8f98f41492c4
parentdfb145988e8b952e9fef9d68b43d0cbd0b0765ae (diff)
downloadclutter-01ba68ad3b2990513e1125bd3ce97a24d0a72670.tar.gz
scroll-actor: Use :child-transform
Instead of using a custom apply_transform(), paint(), and pick() implementations, we can simply apply a transformation to the children of a ScrollActor. https://bugzilla.gnome.org/show_bug.cgi?id=686225
-rw-r--r--clutter/clutter-scroll-actor.c103
1 files changed, 16 insertions, 87 deletions
diff --git a/clutter/clutter-scroll-actor.c b/clutter/clutter-scroll-actor.c
index 366047cf1..8783e102a 100644
--- a/clutter/clutter-scroll-actor.c
+++ b/clutter/clutter-scroll-actor.c
@@ -100,92 +100,13 @@ G_DEFINE_TYPE_WITH_CODE (ClutterScrollActor, clutter_scroll_actor, CLUTTER_TYPE_
clutter_animatable_iface_init))
static void
-clutter_scroll_actor_apply_transform (ClutterActor *actor,
- CoglMatrix *transform)
-{
- ClutterScrollActorPrivate *priv = CLUTTER_SCROLL_ACTOR (actor)->priv;
- float x_factor, y_factor;
-
- CLUTTER_ACTOR_CLASS (clutter_scroll_actor_parent_class)->apply_transform (actor, transform);
-
- if (priv->scroll_mode & CLUTTER_SCROLL_HORIZONTALLY)
- x_factor = -priv->scroll_to.x;
- else
- x_factor = 0.f;
-
- if (priv->scroll_mode & CLUTTER_SCROLL_VERTICALLY)
- y_factor = -priv->scroll_to.y;
- else
- y_factor = 0.f;
-
- cogl_matrix_translate (transform, x_factor, y_factor, 0.0f);
-}
-
-static inline void
-clutter_scroll_actor_push_clip (ClutterActor *actor)
-{
- ClutterScrollActorPrivate *priv = CLUTTER_SCROLL_ACTOR (actor)->priv;
- ClutterActorBox allocation;
- float width, height;
- float x, y;
-
- clutter_actor_get_allocation_box (actor, &allocation);
- clutter_actor_box_get_size (&allocation, &width, &height);
-
- if (priv->scroll_mode & CLUTTER_SCROLL_HORIZONTALLY)
- x = priv->scroll_to.x;
- else
- x = 0.f;
-
- if (priv->scroll_mode & CLUTTER_SCROLL_VERTICALLY)
- y = priv->scroll_to.y;
- else
- y = 0.f;
-
- /* offset the clip so that we keep it at the right place */
- cogl_clip_push_rectangle (x,
- y,
- x + width,
- y + height);
-}
-
-static void
-clutter_scroll_actor_paint (ClutterActor *actor)
-{
- clutter_scroll_actor_push_clip (actor);
-
- CLUTTER_ACTOR_CLASS (clutter_scroll_actor_parent_class)->paint (actor);
-
- cogl_clip_pop ();
-}
-
-static void
-clutter_scroll_actor_pick (ClutterActor *actor,
- const ClutterColor *pick_color)
-{
- ClutterActorIter iter;
- ClutterActor *child;
-
- clutter_scroll_actor_push_clip (actor);
-
- CLUTTER_ACTOR_CLASS (clutter_scroll_actor_parent_class)->pick (actor, pick_color);
-
- /* FIXME - this has to go away when we remove the vfunc check inside
- * the ClutterActor::pick default implementation
- */
- clutter_actor_iter_init (&iter, actor);
- while (clutter_actor_iter_next (&iter, &child))
- clutter_actor_paint (child);
-
- cogl_clip_pop ();
-}
-
-static void
clutter_scroll_actor_set_scroll_to_internal (ClutterScrollActor *self,
const ClutterPoint *point)
{
ClutterScrollActorPrivate *priv = self->priv;
ClutterActor *actor = CLUTTER_ACTOR (self);
+ ClutterMatrix m = CLUTTER_MATRIX_INIT_IDENTITY;
+ float dx, dy;
if (clutter_point_equals (&priv->scroll_to, point))
return;
@@ -195,7 +116,18 @@ clutter_scroll_actor_set_scroll_to_internal (ClutterScrollActor *self,
else
priv->scroll_to = *point;
- clutter_actor_queue_redraw (actor);
+ if (priv->scroll_mode & CLUTTER_SCROLL_HORIZONTALLY)
+ dx = -priv->scroll_to.x;
+ else
+ dx = 0.f;
+
+ if (priv->scroll_mode & CLUTTER_SCROLL_VERTICALLY)
+ dy = -priv->scroll_to.y;
+ else
+ dy = 0.f;
+
+ cogl_matrix_translate (&m, dx, dy, 0.f);
+ clutter_actor_set_child_transform (actor, &m);
}
static void
@@ -240,17 +172,12 @@ static void
clutter_scroll_actor_class_init (ClutterScrollActorClass *klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
g_type_class_add_private (klass, sizeof (ClutterScrollActorPrivate));
gobject_class->set_property = clutter_scroll_actor_set_property;
gobject_class->get_property = clutter_scroll_actor_get_property;
- actor_class->apply_transform = clutter_scroll_actor_apply_transform;
- actor_class->paint = clutter_scroll_actor_paint;
- actor_class->pick = clutter_scroll_actor_pick;
-
/**
* ClutterScrollActor:scroll-mode:
*
@@ -277,6 +204,8 @@ clutter_scroll_actor_init (ClutterScrollActor *self)
ClutterScrollActorPrivate);
self->priv->scroll_mode = CLUTTER_SCROLL_BOTH;
+
+ clutter_actor_set_clip_to_allocation (CLUTTER_ACTOR (self), TRUE);
}
static GParamSpec *