diff options
author | Prajwal Mohan <prajwal.karur.mohan@intel.com> | 2012-04-27 15:45:31 -0700 |
---|---|---|
committer | Prajwal Mohan <prajwal.karur.mohan@intel.com> | 2012-04-27 15:45:31 -0700 |
commit | b7ef78844736699e9b96ecfb89853b0ceb6133f9 (patch) | |
tree | 69c7f426404fc2dfbe020984a4722fcbf1a61114 /attic/fluttr/src/fluttr-set.c | |
download | clutter-toys-b7ef78844736699e9b96ecfb89853b0ceb6133f9.tar.gz clutter-toys-b7ef78844736699e9b96ecfb89853b0ceb6133f9.tar.bz2 clutter-toys-b7ef78844736699e9b96ecfb89853b0ceb6133f9.zip |
Initial Import
Diffstat (limited to 'attic/fluttr/src/fluttr-set.c')
-rw-r--r-- | attic/fluttr/src/fluttr-set.c | 554 |
1 files changed, 554 insertions, 0 deletions
diff --git a/attic/fluttr/src/fluttr-set.c b/attic/fluttr/src/fluttr-set.c new file mode 100644 index 0000000..f54b1b4 --- /dev/null +++ b/attic/fluttr/src/fluttr-set.c @@ -0,0 +1,554 @@ +/* + * Copyright (C) 2007 Neil J. Patel + * Copyright (C) 2007 OpenedHand Ltd + * + * Author: Neil J. Patel <njp@o-hand.com> + */ + +#include "fluttr-set.h" + +#include "fluttr-behave.h" +#include "fluttr-settings.h" +#include "fluttr-photo.h" + + +G_DEFINE_TYPE (FluttrSet, fluttr_set, CLUTTER_TYPE_GROUP); + +#define FLUTTR_SET_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj),\ + FLUTTR_TYPE_SET, \ + FluttrSetPrivate)) + +#define FONT "DejaVu Sans Book" +#define FRAME 2 +#define X_ANGLE 90 + +#define ACT_SCALE 0.3 + +struct _FluttrSetPrivate +{ + gchar *setid; + gchar *name; + NFlickPhotoSet *set; + GList *photos; + + /* The all-important pixbuf fetching variables */ + NFlickWorker *worker; + + + /* The actual actors */ + ClutterActor *text; + ClutterActor *photo1; + ClutterActor *photo2; + ClutterActor *photo3; + + /* Transformation code */ + gint new_x; + gint new_y; + gfloat new_scale; + ClutterTimeline *trans_time; + ClutterAlpha *trans_alpha; + ClutterBehaviour *trans_behave; + + /* Activate animation */ + gboolean active; + gfloat scale; + ClutterTimeline *act_time; + ClutterAlpha *act_alpha; + ClutterBehaviour *act_behave; +}; + +enum +{ + PROP_0, + PROP_ID, + PROP_NAME, + PROP_SET +}; + +void +_fluttr_set_fetch_pixbuf (FluttrSet *set, guint width, guint height); + +/* Will return the default size of the FluttrSet square for the current stage */ +guint +fluttr_set_get_default_size (void) +{ + guint width = CLUTTER_STAGE_WIDTH (); + guint height = CLUTTER_STAGE_HEIGHT (); + + if (width > height) + return height/3; + else + return width /3; +} + +guint +fluttr_set_get_default_width (void) +{ + return fluttr_set_get_default_size (); +} + +guint +fluttr_set_get_default_height (void) +{ + return fluttr_set_get_default_width () * 1.4; +} + +/* If active, scale the set, if not, scale it down */ +void +fluttr_set_set_active (FluttrSet *set, gboolean active) +{ + FluttrSetPrivate *priv; + ClutterColor act = { 0x00, 0x55, 0xff, 0xff }; + ClutterColor inact = { 0xff, 0xff, 0xff, 0xff }; + + g_return_if_fail (FLUTTR_IS_SET (set)); + priv = FLUTTR_SET_GET_PRIVATE(set); + + if (priv->active == active) + return; + + priv->active = active; + + if (active) + clutter_label_set_color (CLUTTER_LABEL (priv->text), &act); + else + clutter_label_set_color (CLUTTER_LABEL (priv->text), &inact); +} + + +/* Set the new x and y position of the actor, and start (or rewind) the main + timeline */ +void +fluttr_set_update_position (FluttrSet *set, gint x, gint y) +{ + FluttrSetPrivate *priv; + + g_return_if_fail (FLUTTR_IS_SET (set)); + priv = FLUTTR_SET_GET_PRIVATE(set); + + if ((priv->new_x == x) && (priv->new_y == y)) { + return; + } + priv->new_x = x; + priv->new_y = y; + /*clutter_actor_set_position (set, x, y); + + */ + if (clutter_timeline_is_playing (priv->trans_time)) + clutter_timeline_rewind (priv->trans_time); + else + clutter_timeline_start (priv->trans_time); + +} + +/* Allows smooth transforms (position & size) on th widget...looks goooood*/ +static void +fluttr_set_trans_alpha_func (ClutterBehaviour *behave, + guint alpha_value, + gpointer data) +{ + FluttrSetPrivate *priv; + gfloat factor; + gint old_x, old_y; + gint x, y; + + + g_return_if_fail (FLUTTR_IS_SET (data)); + priv = FLUTTR_SET_GET_PRIVATE(data); + + /* Calculate the factor */ + factor = (gfloat)alpha_value / CLUTTER_ALPHA_MAX_ALPHA; + + /* Load up the orignal values */ + old_x = clutter_actor_get_x (CLUTTER_ACTOR (data)); + old_y = clutter_actor_get_y (CLUTTER_ACTOR (data)); + + /* We first calculate the new x pos */ + if (old_x == priv->new_x) { + x = 0; + //g_print ("Same x %d\n", x); + } else if (old_x < priv->new_x) { + /* We're moving to the positive */ + if (old_x < 0) + x = ((-1*old_x)+priv->new_x) * factor; + else + x = (priv->new_x - old_x) * factor; + } else { + /* We're moving to the left */ + if (priv->new_x < 0) + x = ((-1*priv->new_x)+old_x) * -1 * factor; + else + x = (old_x - priv->new_x) * -1 * factor; + } + + /* Then the new y pos */ + if (old_y == priv->new_y) { + y = 0; + //g_print ("Same y %d %d\n", y, priv->new_y); + + } else if (old_y < priv->new_y) { + /* We're moving to the bottom */ + if (old_y < 0) + y = ((-1*old_y)+priv->new_y) * factor; + else + y = (priv->new_y - old_y) * factor; + } else { + /* We're moving to the top */ + if (priv->new_y < 0) + y = ((-1*priv->new_y)+old_y) * -1 * factor; + else + y = (old_y - priv->new_y) * -1 * factor; + } + + x += old_x; + y += old_y; + + clutter_actor_set_position (CLUTTER_ACTOR (data), x, y); + /*g_print ("%s %d %d\n", priv->setid, x, y);*/ + + if (CLUTTER_ACTOR_IS_VISIBLE (CLUTTER_ACTOR(data))) + clutter_actor_queue_redraw (CLUTTER_ACTOR(data)); +} + + +/* Moves the pixbuf texture on the y axis when it is active*/ +static void +fluttr_set_act_alpha_func (ClutterBehaviour *behave, + guint alpha_value, + gpointer data) +{ + FluttrSetPrivate *priv; + gfloat factor; + guint size = fluttr_set_get_default_size (); + + g_return_if_fail (FLUTTR_IS_SET (data)); + priv = FLUTTR_SET_GET_PRIVATE(data); + + factor = (gfloat) alpha_value / CLUTTER_ALPHA_MAX_ALPHA; + + if (priv->active) + priv->scale = 1 + (ACT_SCALE * factor); + else + priv->scale = (1 +ACT_SCALE)- (ACT_SCALE *factor); + + + priv->scale = size * priv->scale; + + //clutter_actor_set_scale (CLUTTER_ACTOR (data), y + //clutter_actor_set_position (CLUTTER_ACTOR (data), x, y); + + if (CLUTTER_ACTOR_IS_VISIBLE (CLUTTER_ACTOR(data))) + clutter_actor_queue_redraw (CLUTTER_ACTOR(data)); +} + +static void +_refresh_thumbs (FluttrSet *set, const gchar *id, const gchar *name) +{ + FluttrSetPrivate *priv; + gint i = 0; + ClutterActor *photo = NULL; + + g_return_if_fail (FLUTTR_IS_SET (set)); + priv = FLUTTR_SET_GET_PRIVATE(set); + + i = g_list_length (priv->photos); + + if (i > 3) + return; + else if (i == 1) + photo = priv->photo1; + else if (i == 2) + photo = priv->photo2; + else + photo = priv->photo3; + + if (photo) { + g_object_set (G_OBJECT (photo), + "photoid", id, + "name", name, + NULL); + fluttr_photo_fetch_pixbuf (FLUTTR_PHOTO (photo)); + } + + +} + +void +fluttr_set_append_photo (FluttrSet *set, const gchar *id, const gchar *name) +{ + FluttrPhotoData *data; + FluttrSetPrivate *priv; + + g_return_if_fail (FLUTTR_IS_SET (set)); + priv = FLUTTR_SET_GET_PRIVATE(set); + + data = g_new0 (FluttrPhotoData, 1); + + data->id = g_strdup (id); + data->name = g_strdup (id); + data->pixbuf = NULL; + + priv->photos = g_list_append (priv->photos, (gpointer)data); + + _refresh_thumbs (set, id, name); +} + +GList* +fluttr_set_get_photos (FluttrSet *set) +{ + FluttrSetPrivate *priv; + + g_return_val_if_fail (FLUTTR_IS_SET (set), NULL); + priv = FLUTTR_SET_GET_PRIVATE(set); + + return priv->photos; +} + +static void +_update_text (FluttrSet *set) +{ + FluttrSetPrivate *priv; + + g_return_if_fail (FLUTTR_IS_SET (set)); + priv = FLUTTR_SET_GET_PRIVATE(set); + + clutter_label_set_text (CLUTTER_LABEL (priv->text), + priv->name); + + g_object_set (G_OBJECT (priv->text), + "x", (fluttr_set_get_default_width ()/2) + - (clutter_actor_get_width (priv->text)/2), + NULL); +} + +/* GObject Stuff */ + +static void +fluttr_set_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + FluttrSetPrivate *priv; + + g_return_if_fail (FLUTTR_IS_SET (object)); + priv = FLUTTR_SET_GET_PRIVATE(object); + + switch (prop_id) { + case PROP_ID: + if (priv->setid != NULL) + g_free (priv->setid); + priv->setid = g_strdup (g_value_get_string (value)); + break; + case PROP_NAME: + if (priv->name != NULL) + g_free (priv->name); + priv->name =g_strdup (g_value_get_string (value)); + _update_text (FLUTTR_SET (object)); + break; + + case PROP_SET: + priv->set = g_value_get_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, + pspec); + break; + } +} + +static void +fluttr_set_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + FluttrSetPrivate *priv; + + g_return_if_fail (FLUTTR_IS_SET (object)); + priv = FLUTTR_SET_GET_PRIVATE(object); + + switch (prop_id) { + case PROP_ID: + g_value_set_string (value, priv->setid); + break; + + case PROP_NAME: + g_value_set_string (value, priv->name); + + case PROP_SET: + g_value_set_object (value, G_OBJECT (priv->set)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, + pspec); + break; + } +} + +static void +fluttr_set_dispose (GObject *object) +{ + FluttrSet *self = FLUTTR_SET(object); + FluttrSetPrivate *priv; + + priv = self->priv; + + G_OBJECT_CLASS (fluttr_set_parent_class)->dispose (object); +} + +static void +fluttr_set_finalize (GObject *object) +{ + G_OBJECT_CLASS (fluttr_set_parent_class)->finalize (object); +} + +static void +fluttr_set_class_init (FluttrSetClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + ClutterActorClass *parent_class; + + parent_class = CLUTTER_ACTOR_CLASS (fluttr_set_parent_class); + + gobject_class->finalize = fluttr_set_finalize; + gobject_class->dispose = fluttr_set_dispose; + gobject_class->get_property = fluttr_set_get_property; + gobject_class->set_property = fluttr_set_set_property; + + g_type_class_add_private (gobject_class, sizeof (FluttrSetPrivate)); + + /* Class properties */ + g_object_class_install_property + (gobject_class, + PROP_ID, + g_param_spec_string ("setid", + "SetID", + "The Flickr set id", + NULL, + G_PARAM_CONSTRUCT|G_PARAM_READWRITE)); + + g_object_class_install_property + (gobject_class, + PROP_NAME, + g_param_spec_string ("name", + "Name", + "The Flickr set name", + NULL, + G_PARAM_CONSTRUCT|G_PARAM_READWRITE)); + + g_object_class_install_property + (gobject_class, + PROP_SET, + g_param_spec_object ("set", + "Set", + "The Flickr set", + NFLICK_TYPE_PHOTO_SET, + G_PARAM_CONSTRUCT|G_PARAM_READWRITE)); + + +} + +static void +fluttr_set_init (FluttrSet *self) +{ + FluttrSetPrivate *priv; + ClutterColor rect_col = { 0xff, 0xff, 0xff, 0xff }; + ClutterActor *label, *photo; + gint width = fluttr_set_get_default_width (); + gint height = fluttr_set_get_default_height (); + gchar *font; + + priv = FLUTTR_SET_GET_PRIVATE (self); + + /* Create the text label */ + font = g_strdup_printf ("%s %d", FONT, height/12); + label = clutter_label_new_full (font, "Set name", &rect_col); + priv->text = label; + clutter_label_set_line_wrap (CLUTTER_LABEL (label), FALSE); + clutter_actor_set_size (label, width, height/12); + clutter_actor_set_position (label, 0, height-(height/12)); + clutter_group_add (CLUTTER_GROUP (self), label); + + /* Set up the photos */ + photo = fluttr_photo_new (); + priv->photo1 = photo; + clutter_actor_set_size (photo, fluttr_photo_get_default_width ()/2, + fluttr_photo_get_default_height ()/2); + clutter_group_add (CLUTTER_GROUP (self), photo); + clutter_actor_set_position (photo, + (width/2)-(clutter_actor_get_width(photo)/2), + (height/2)-(clutter_actor_get_height(photo)/2)); + clutter_actor_set_rotation (photo, CLUTTER_Z_AXIS, 30, + clutter_actor_get_width (photo) / 2, + clutter_actor_get_height (photo) / 2, 0); + + + photo = fluttr_photo_new (); + priv->photo2 = photo; + clutter_actor_set_size (photo, fluttr_photo_get_default_width ()/2, + fluttr_photo_get_default_height ()/2); + clutter_group_add (CLUTTER_GROUP (self), photo); + clutter_actor_set_position (photo, + (width/2)-(clutter_actor_get_width(photo)/2), + (height/2)-(clutter_actor_get_height(photo)/2)); + clutter_actor_set_rotation (photo, CLUTTER_Z_AXIS, -20, + clutter_actor_get_width (photo) / 2, + clutter_actor_get_height (photo) / 2, 0); + + + photo = fluttr_photo_new (); + priv->photo3 = photo; + clutter_actor_set_size (photo, fluttr_photo_get_default_width ()/2, + fluttr_photo_get_default_height ()/2); + clutter_group_add (CLUTTER_GROUP (self), photo); + clutter_actor_set_position (photo, + (width/2)-(clutter_actor_get_width(photo)/2), + (height/2)-(clutter_actor_get_height(photo)/2)); + clutter_actor_set_rotation (photo, CLUTTER_Z_AXIS, 0, + clutter_actor_get_width (photo) / 2, + clutter_actor_get_height (photo) / 2, 0); + + + /* Setup the transformation */ + priv->new_x = priv->new_y = priv->new_scale = 0; + priv->trans_time = clutter_timeline_new (40, 40); + priv->trans_alpha = clutter_alpha_new_full (priv->trans_time, + alpha_linear_inc_func, + NULL, NULL); + priv->trans_behave = fluttr_behave_new (priv->trans_alpha, + fluttr_set_trans_alpha_func, + (gpointer)self); + + /* Setup the activating line */ + priv->act_time = clutter_timeline_new (60, 240); + priv->act_alpha = clutter_alpha_new_full (priv->act_time, + alpha_linear_inc_func, + NULL, NULL); + priv->act_behave = fluttr_behave_new (priv->act_alpha, + fluttr_set_act_alpha_func, + (gpointer)self); + +} + +ClutterActor* +fluttr_set_new (NFlickPhotoSet *photo_set) +{ + ClutterGroup *set; + gchar *setid; + gchar *name; + + g_object_get (G_OBJECT (photo_set), + "id", &setid, + "combotext", &name, + NULL); + + set = g_object_new (FLUTTR_TYPE_SET, + "setid", setid, + "name", name, + "set", photo_set, + NULL); + return CLUTTER_ACTOR (set); +} + |