2 * Copyright (C) 2007 Neil J. Patel
3 * Copyright (C) 2007 OpenedHand Ltd
5 * Author: Neil J. Patel <njp@o-hand.com>
10 #include "fluttr-set-view.h"
12 G_DEFINE_TYPE (FluttrSetView, fluttr_set_view, CLUTTER_TYPE_GROUP);
14 #define FLUTTR_SET_VIEW_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj),\
15 FLUTTR_TYPE_SET_VIEW, \
16 FluttrSetViewPrivate))
18 struct _FluttrSetViewPrivate
22 ClutterActor *active_actor;
34 static ClutterGroupClass *parent_class = NULL;
37 fluttr_set_view_get_active (FluttrSetView *set_view)
39 FluttrSetViewPrivate *priv;
41 g_return_val_if_fail (FLUTTR_IS_SET_VIEW (set_view), NULL);
42 priv = FLUTTR_SET_VIEW_GET_PRIVATE(set_view);
44 return FLUTTR_SET (priv->active_actor);
48 fluttr_set_view_advance (FluttrSetView *set_view, gint n)
50 FluttrSetViewPrivate *priv;
53 ClutterActor *set = NULL;
54 guint width = fluttr_set_get_default_width ();
55 guint height = fluttr_set_get_default_height ();
58 gint offset = height/2;
59 gint padding = width/2;
61 g_return_if_fail (FLUTTR_IS_SET_VIEW (set_view));
62 priv = FLUTTR_SET_VIEW_GET_PRIVATE(set_view);
64 len = clutter_group_get_n_children (CLUTTER_GROUP (set_view));
66 /* Make sure we are within the bounds of the number of albums */
68 if (priv->active_set < 0) {
70 } else if (priv->active_set > len-1) {
71 priv->active_set = len -1;
74 /* Find the magic row */
79 for (i = 0; i < len; i++) {
80 if (i == priv->active_set) {
85 if (col > (N_COLS-1)) {
91 /* Figure out the base x value */
92 x1 = ((width) * N_COLS ) + (padding*(N_COLS-1));
93 x1 = (CLUTTER_STAGE_WIDTH ()/2)-(x1/2);
95 /* Iterate through actors, calculating their new x positions, and make
96 sure they are on the right place (left, right or center) */
100 offset = -1 * ((height) + padding) * active_row;
101 offset += (CLUTTER_STAGE_HEIGHT () /2) - (height/2);
103 for (i = 0; i < len; i++) {
104 set = clutter_group_get_nth_child (CLUTTER_GROUP (set_view), i);
106 gint x = x1 + (col * (width + padding));
108 fluttr_set_update_position (FLUTTR_SET (set), x, y);
111 if (col > (N_COLS-1)) {
114 offset += height + padding;
116 if (i == priv->active_set) {
117 priv->active_actor = set;
118 fluttr_set_set_active (FLUTTR_SET (set), TRUE);
120 fluttr_set_set_active (FLUTTR_SET (set), FALSE);
122 /* Update the position of the ring */
126 /* We make all the 'viewable' sets fall down, leaving just the main one */
128 fluttr_set_view_activate (FluttrSetView *set_view)
134 fluttr_set_view_advance_row (FluttrSetView *set_view, gint n)
136 fluttr_set_view_advance (set_view, (N_COLS * n));
140 fluttr_set_view_advance_col (FluttrSetView *set_view, gint n)
142 fluttr_set_view_advance (set_view, n);
146 fluttr_set_view_add_set (FluttrSetView *set_view, FluttrSet *set)
148 gint x = CLUTTER_STAGE_WIDTH () /2;
149 gint y = CLUTTER_STAGE_HEIGHT ()/2;
150 g_return_if_fail (FLUTTR_IS_SET_VIEW (set_view));
153 clutter_group_add (CLUTTER_GROUP (set_view), CLUTTER_ACTOR (set));
154 clutter_actor_set_position (CLUTTER_ACTOR (set), x, y);
155 clutter_actor_show_all (CLUTTER_ACTOR (set));
161 fluttr_set_view_set_property (GObject *object,
166 FluttrSetViewPrivate *priv;
168 g_return_if_fail (FLUTTR_IS_SET_VIEW (object));
169 priv = FLUTTR_SET_VIEW_GET_PRIVATE(object);
173 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id,
180 fluttr_set_view_get_property (GObject *object,
185 FluttrSetViewPrivate *priv;
187 g_return_if_fail (FLUTTR_IS_SET_VIEW (object));
188 priv = FLUTTR_SET_VIEW_GET_PRIVATE(object);
192 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id,
199 fluttr_set_view_paint (ClutterActor *actor)
202 FluttrSetViewPrivate *priv;
204 set = FLUTTR_SET_VIEW(actor);
206 priv = FLUTTR_SET_VIEW_GET_PRIVATE(set);
211 gint len = clutter_group_get_n_children (CLUTTER_GROUP (actor));
212 for (i = 0; i < len; i++) {
215 child = clutter_group_get_nth_child (CLUTTER_GROUP(actor), i);
217 clutter_actor_paint (child);
225 fluttr_set_view_dispose (GObject *object)
227 FluttrSetView *self = FLUTTR_SET_VIEW(object);
228 FluttrSetViewPrivate *priv;
232 G_OBJECT_CLASS (parent_class)->dispose (object);
236 fluttr_set_view_finalize (GObject *object)
238 G_OBJECT_CLASS (parent_class)->finalize (object);
242 fluttr_set_view_class_init (FluttrSetViewClass *klass)
244 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
245 ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
247 parent_class = CLUTTER_GROUP_CLASS (klass);
249 actor_class->paint = fluttr_set_view_paint;
251 gobject_class->finalize = fluttr_set_view_finalize;
252 gobject_class->dispose = fluttr_set_view_dispose;
253 gobject_class->get_property = fluttr_set_view_get_property;
254 gobject_class->set_property = fluttr_set_view_set_property;
256 g_type_class_add_private (gobject_class, sizeof (FluttrSetViewPrivate));
261 fluttr_set_view_init (FluttrSetView *self)
263 FluttrSetViewPrivate *priv;
264 priv = FLUTTR_SET_VIEW_GET_PRIVATE (self);
266 priv->active_set = 0;
267 priv->active_col = 0;
272 fluttr_set_view_new (void)
274 ClutterGroup *set_view;
276 set_view = g_object_new (FLUTTR_TYPE_SET_VIEW,
279 return CLUTTER_ACTOR (set_view);