added direction property to ClutterBehaviourEllipse

This commit is contained in:
Tomas Frydrych 2007-07-26 13:48:44 +00:00
parent 1d26ea3220
commit f1b27d9e1b
3 changed files with 140 additions and 64 deletions

View File

@ -69,6 +69,7 @@ enum
PROP_ANGLE_BEGIN, PROP_ANGLE_BEGIN,
PROP_ANGLE_END, PROP_ANGLE_END,
PROP_ANGLE_TILT, PROP_ANGLE_TILT,
PROP_DIRECTION,
}; };
struct _ClutterBehaviourEllipsePrivate struct _ClutterBehaviourEllipsePrivate
@ -81,6 +82,8 @@ struct _ClutterBehaviourEllipsePrivate
ClutterAngle angle_begin; ClutterAngle angle_begin;
ClutterAngle angle_end; ClutterAngle angle_end;
ClutterAngle angle_tilt; ClutterAngle angle_tilt;
ClutterRotateDirection direction;
}; };
static void static void
@ -147,9 +150,10 @@ clutter_behaviour_ellipse_alpha_notify (ClutterBehaviour *behave,
ClutterKnot knot; ClutterKnot knot;
ClutterAngle angle; ClutterAngle angle;
if (priv->angle_end >= priv->angle_begin) if ((priv->angle_end >= priv->angle_begin) ==
(priv->direction == CLUTTER_ROTATE_CW))
{ {
angle = (priv->angle_end - priv->angle_begin) angle = abs (priv->angle_end - priv->angle_begin)
* alpha * alpha
/ CLUTTER_ALPHA_MAX_ALPHA / CLUTTER_ALPHA_MAX_ALPHA
+ priv->angle_begin; + priv->angle_begin;
@ -157,7 +161,7 @@ clutter_behaviour_ellipse_alpha_notify (ClutterBehaviour *behave,
else else
{ {
angle = priv->angle_begin angle = priv->angle_begin
- ((priv->angle_begin - priv->angle_end) * alpha) - (abs(priv->angle_begin - priv->angle_end) * alpha)
/ CLUTTER_ALPHA_MAX_ALPHA; / CLUTTER_ALPHA_MAX_ALPHA;
} }
@ -181,13 +185,16 @@ clutter_behaviour_ellipse_set_property (GObject *gobject,
switch (prop_id) switch (prop_id)
{ {
case PROP_ANGLE_BEGIN: case PROP_ANGLE_BEGIN:
priv->angle_begin = CLUTTER_ANGLE_FROM_DEG (g_value_get_double (value)); priv->angle_begin =
CLUTTER_ANGLE_FROM_DEG (g_value_get_double (value)) - 256;
break; break;
case PROP_ANGLE_END: case PROP_ANGLE_END:
priv->angle_end = CLUTTER_ANGLE_FROM_DEG (g_value_get_double (value)); priv->angle_end =
CLUTTER_ANGLE_FROM_DEG (g_value_get_double (value)) - 256;
break; break;
case PROP_ANGLE_TILT: case PROP_ANGLE_TILT:
priv->angle_tilt = CLUTTER_ANGLE_FROM_DEG (g_value_get_double (value)); priv->angle_tilt =
CLUTTER_ANGLE_FROM_DEG (g_value_get_double (value)) - 256;
break; break;
case PROP_WIDTH: case PROP_WIDTH:
priv->a = g_value_get_int (value) >> 1; priv->a = g_value_get_int (value) >> 1;
@ -202,6 +209,9 @@ clutter_behaviour_ellipse_set_property (GObject *gobject,
clutter_behaviour_ellipse_set_center (el, knot->x, knot->y); clutter_behaviour_ellipse_set_center (el, knot->x, knot->y);
} }
break; break;
case PROP_DIRECTION:
priv->direction = g_value_get_enum (value);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
break; break;
@ -238,6 +248,9 @@ clutter_behaviour_ellipse_get_property (GObject *gobject,
case PROP_CENTER: case PROP_CENTER:
g_value_set_boxed (value, &priv->center); g_value_set_boxed (value, &priv->center);
break; break;
case PROP_DIRECTION:
g_value_set_enum (value, priv->direction);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
break; break;
@ -361,6 +374,21 @@ clutter_behaviour_ellipse_class_init (ClutterBehaviourEllipseClass *klass)
CLUTTER_TYPE_KNOT, CLUTTER_TYPE_KNOT,
CLUTTER_PARAM_READWRITE)); CLUTTER_PARAM_READWRITE));
/**
* ClutterBehaviourEllipse:direction:
*
* The direction of the rotation.
*
* Since: 0.4
*/
g_object_class_install_property (object_class,
PROP_DIRECTION,
g_param_spec_enum ("direction",
"Direction",
"Direction of rotation",
CLUTTER_TYPE_ROTATE_DIRECTION,
CLUTTER_ROTATE_CW,
CLUTTER_PARAM_READWRITE));
g_type_class_add_private (klass, sizeof (ClutterBehaviourEllipsePrivate)); g_type_class_add_private (klass, sizeof (ClutterBehaviourEllipsePrivate));
} }
@ -370,6 +398,8 @@ clutter_behaviour_ellipse_init (ClutterBehaviourEllipse * self)
ClutterBehaviourEllipsePrivate *priv; ClutterBehaviourEllipsePrivate *priv;
self->priv = priv = CLUTTER_BEHAVIOUR_ELLIPSE_GET_PRIVATE (self); self->priv = priv = CLUTTER_BEHAVIOUR_ELLIPSE_GET_PRIVATE (self);
priv->direction = CLUTTER_ROTATE_CW;
} }
/** /**
@ -381,8 +411,6 @@ clutter_behaviour_ellipse_init (ClutterBehaviourEllipse * self)
* @height: height of the ellipse * @height: height of the ellipse
* @begin: angle in degrees at which movement begins * @begin: angle in degrees at which movement begins
* @end: angle in degrees at which movement ends * @end: angle in degrees at which movement ends
* @tilt: angle in degrees with which the ellipse should be tilted around its
* center
* *
* Creates a behaviour that drives actors along an elliptical path with * Creates a behaviour that drives actors along an elliptical path with
* given center, width and height; the movement begins at angle_begin (with 0 * given center, width and height; the movement begins at angle_begin (with 0
@ -400,8 +428,7 @@ clutter_behaviour_ellipse_new (ClutterAlpha *alpha,
gint width, gint width,
gint height, gint height,
gdouble begin, gdouble begin,
gdouble end, gdouble end)
gdouble tilt)
{ {
ClutterKnot center; ClutterKnot center;
@ -417,7 +444,6 @@ clutter_behaviour_ellipse_new (ClutterAlpha *alpha,
"height", height, "height", height,
"angle-begin", begin, "angle-begin", begin,
"angle-end", end, "angle-end", end,
"angle-tilt", tilt,
NULL); NULL);
} }
@ -430,8 +456,6 @@ clutter_behaviour_ellipse_new (ClutterAlpha *alpha,
* @height: height of the ellipse * @height: height of the ellipse
* @begin: #ClutterFixed angle in degrees at which movement begins * @begin: #ClutterFixed angle in degrees at which movement begins
* @end: #ClutterFixed angle in degrees at which movement ends * @end: #ClutterFixed angle in degrees at which movement ends
* @tilt: #ClutterFixed angle in degrees with which the ellipse should be
* tilted around its center
* *
* Creates a behaviour that drives actors along an elliptical path with * Creates a behaviour that drives actors along an elliptical path with
* given center, width and height; the movement begins at angle_begin (with 0 * given center, width and height; the movement begins at angle_begin (with 0
@ -449,8 +473,7 @@ clutter_behaviour_ellipse_newx (ClutterAlpha * alpha,
gint width, gint width,
gint height, gint height,
ClutterFixed begin, ClutterFixed begin,
ClutterFixed end, ClutterFixed end)
ClutterFixed tilt)
{ {
ClutterKnot center; ClutterKnot center;
@ -466,7 +489,6 @@ clutter_behaviour_ellipse_newx (ClutterAlpha * alpha,
"height", height, "height", height,
"angle-begin", CLUTTER_ANGLE_FROM_DEGX (begin), "angle-begin", CLUTTER_ANGLE_FROM_DEGX (begin),
"angle-end", CLUTTER_ANGLE_FROM_DEGX (end), "angle-end", CLUTTER_ANGLE_FROM_DEGX (end),
"angle-tilt", CLUTTER_ANGLE_FROM_DEGX (tilt),
NULL); NULL);
} }
@ -864,3 +886,52 @@ clutter_behaviour_ellipse_get_angle_tiltx (ClutterBehaviourEllipse *self)
return self->priv->angle_tilt; return self->priv->angle_tilt;
} }
/**
* clutter_behaviour_ellipse_get_direction:
* @ellipse: a #ClutterBehaviourEllipse
*
* Retrieves the #ClutterRotateDirection used by the ellipse behaviour.
*
* Return value: the rotation direction
*
* Since: 0.4
*/
ClutterRotateDirection
clutter_behaviour_ellipse_get_direction (ClutterBehaviourEllipse *self)
{
g_return_val_if_fail (CLUTTER_IS_BEHAVIOUR_ELLIPSE (self),
CLUTTER_ROTATE_CW);
return self->priv->direction;
}
/**
* clutter_behaviour_ellipse_set_direction:
* @ellipse: a #ClutterBehaviourEllipse
* @direction: the rotation direction
*
* Sets the rotation direction used by the ellipse behaviour.
*
* Since: 0.4
*/
void
clutter_behaviour_ellipse_set_direction (ClutterBehaviourEllipse *self,
ClutterRotateDirection direction)
{
ClutterBehaviourEllipsePrivate *priv;
g_return_if_fail (CLUTTER_IS_BEHAVIOUR_ELLIPSE (self));
priv = self->priv;
if (priv->direction != direction)
{
g_object_ref (self);
priv->direction = direction;
g_object_notify (G_OBJECT (self), "direction");
g_object_unref (self);
}
}

View File

@ -29,6 +29,7 @@
#include <clutter/clutter-alpha.h> #include <clutter/clutter-alpha.h>
#include <clutter/clutter-actor.h> #include <clutter/clutter-actor.h>
#include <clutter/clutter-behaviour.h> #include <clutter/clutter-behaviour.h>
#include <clutter/clutter-types.h>
G_BEGIN_DECLS G_BEGIN_DECLS
@ -79,71 +80,74 @@ struct _ClutterBehaviourEllipseClass
GType clutter_behaviour_ellipse_get_type (void) G_GNUC_CONST; GType clutter_behaviour_ellipse_get_type (void) G_GNUC_CONST;
ClutterBehaviour *clutter_behaviour_ellipse_new (ClutterAlpha * alpha, ClutterBehaviour * clutter_behaviour_ellipse_new (ClutterAlpha *alpha,
gint x, gint x,
gint y, gint y,
gint width, gint width,
gint height, gint height,
gdouble begin, gdouble begin,
gdouble end, gdouble end);
gdouble tilt);
ClutterBehaviour *clutter_behaviour_ellipse_newx (ClutterAlpha * alpha, ClutterBehaviour * clutter_behaviour_ellipse_newx (ClutterAlpha *alpha,
gint x, gint x,
gint y, gint y,
gint width, gint width,
gint height, gint height,
ClutterFixed begin, ClutterFixed begin,
ClutterFixed end, ClutterFixed end);
ClutterFixed tilt);
void clutter_behaviour_ellipse_set_center (ClutterBehaviourEllipse * self, void clutter_behaviour_ellipse_set_center (ClutterBehaviourEllipse *self,
gint x, gint x,
gint y); gint y);
void clutter_behaviour_ellipse_get_center (ClutterBehaviourEllipse * self, void clutter_behaviour_ellipse_get_center (ClutterBehaviourEllipse *self,
gint * x, gint *x,
gint * y); gint *y);
void clutter_behaviour_ellipse_set_width (ClutterBehaviourEllipse * self, void clutter_behaviour_ellipse_set_width (ClutterBehaviourEllipse *self,
gint width); gint width);
gint clutter_behaviour_ellipse_get_width (ClutterBehaviourEllipse * self); gint clutter_behaviour_ellipse_get_width (ClutterBehaviourEllipse *self);
void clutter_behaviour_ellipse_set_height (ClutterBehaviourEllipse * self, void clutter_behaviour_ellipse_set_height (ClutterBehaviourEllipse *self,
gint height); gint height);
gint clutter_behaviour_ellipse_get_height (ClutterBehaviourEllipse * self); gint clutter_behaviour_ellipse_get_height (ClutterBehaviourEllipse *self);
void clutter_behaviour_ellipse_set_angle_begin (ClutterBehaviourEllipse * self, void clutter_behaviour_ellipse_set_angle_begin (ClutterBehaviourEllipse *self,
gdouble angle_begin); gdouble angle_begin);
void clutter_behaviour_ellipse_set_angle_beginx (ClutterBehaviourEllipse * self, void clutter_behaviour_ellipse_set_angle_beginx (ClutterBehaviourEllipse *self,
ClutterAngle angle_begin); ClutterAngle angle_begin);
ClutterAngle clutter_behaviour_ellipse_get_angle_beginx (ClutterBehaviourEllipse * self); ClutterAngle clutter_behaviour_ellipse_get_angle_beginx (ClutterBehaviourEllipse *self);
gdouble clutter_behaviour_ellipse_get_angle_begin (ClutterBehaviourEllipse * self); gdouble clutter_behaviour_ellipse_get_angle_begin (ClutterBehaviourEllipse *self);
void clutter_behaviour_ellipse_set_angle_endx (ClutterBehaviourEllipse * self, void clutter_behaviour_ellipse_set_angle_endx (ClutterBehaviourEllipse *self,
ClutterAngle angle_end); ClutterAngle angle_end);
void clutter_behaviour_ellipse_set_angle_end (ClutterBehaviourEllipse * self, void clutter_behaviour_ellipse_set_angle_end (ClutterBehaviourEllipse *self,
gdouble angle_end); gdouble angle_end);
ClutterAngle clutter_behaviour_ellipse_get_angle_endx (ClutterBehaviourEllipse * self); ClutterAngle clutter_behaviour_ellipse_get_angle_endx (ClutterBehaviourEllipse *self);
gdouble clutter_behaviour_ellipse_get_angle_end (ClutterBehaviourEllipse * self); gdouble clutter_behaviour_ellipse_get_angle_end (ClutterBehaviourEllipse *self);
void clutter_behaviour_ellipse_set_angle_tiltx (ClutterBehaviourEllipse * self, void clutter_behaviour_ellipse_set_angle_tiltx (ClutterBehaviourEllipse *self,
ClutterAngle angle_tilt); ClutterAngle angle_tilt);
void clutter_behaviour_ellipse_set_angle_tilt (ClutterBehaviourEllipse * self, void clutter_behaviour_ellipse_set_angle_tilt (ClutterBehaviourEllipse *self,
gdouble angle_tilt); gdouble angle_tilt);
ClutterAngle clutter_behaviour_ellipse_get_angle_tiltx (ClutterBehaviourEllipse * self); ClutterAngle clutter_behaviour_ellipse_get_angle_tiltx (ClutterBehaviourEllipse *self);
gdouble clutter_behaviour_ellipse_get_angle_tilt (ClutterBehaviourEllipse * self); gdouble clutter_behaviour_ellipse_get_angle_tilt (ClutterBehaviourEllipse *self);
ClutterRotateDirection clutter_behaviour_ellipse_get_direction (ClutterBehaviourEllipse *self);
void clutter_behaviour_ellipse_set_direction (ClutterBehaviourEllipse *self,
ClutterRotateDirection direction);
G_END_DECLS G_END_DECLS

View File

@ -153,7 +153,7 @@ main (int argc, char *argv[])
/* Set an alpha func to power behaviour - ramp is constant rise/fall */ /* Set an alpha func to power behaviour - ramp is constant rise/fall */
alpha = clutter_alpha_new_full (timeline, alpha = clutter_alpha_new_full (timeline,
CLUTTER_ALPHA_SINE, CLUTTER_ALPHA_RAMP_INC,
NULL, NULL); NULL, NULL);
/* Create a behaviour for that alpha */ /* Create a behaviour for that alpha */
@ -171,7 +171,8 @@ main (int argc, char *argv[])
case PATH_ELLIPSE: case PATH_ELLIPSE:
p_behave = p_behave =
clutter_behaviour_ellipse_new (alpha, 200, 200, 400, 300, clutter_behaviour_ellipse_new (alpha, 200, 200, 400, 300,
0.0, 360.0, 120.0); 0.0, 360.0);
g_object_set (p_behave, "angle-tilt", 45.0, NULL);
break; break;
case PATH_BSPLINE: case PATH_BSPLINE: