Initial Import
[profile/ivi/clutter-toys.git] / attic / fluttr / src / fluttr-set-view.c
1 /*
2  * Copyright (C) 2007 Neil J. Patel
3  * Copyright (C) 2007 OpenedHand Ltd
4  *
5  * Author: Neil J. Patel  <njp@o-hand.com>
6  */
7
8 #include <GL/gl.h>
9
10 #include "fluttr-set-view.h"
11
12 G_DEFINE_TYPE (FluttrSetView, fluttr_set_view, CLUTTER_TYPE_GROUP);
13
14 #define FLUTTR_SET_VIEW_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj),\
15         FLUTTR_TYPE_SET_VIEW, \
16         FluttrSetViewPrivate))
17         
18 struct _FluttrSetViewPrivate
19 {
20         GList                   *sets;
21         gint                     active_set;
22         ClutterActor            *active_actor;
23         gint                     active_col;
24 };
25
26 enum
27 {
28         PROP_0,
29         PROP_LIBRARY
30 };
31
32 #define N_COLS 3
33
34 static ClutterGroupClass        *parent_class = NULL;
35
36 FluttrSet*
37 fluttr_set_view_get_active (FluttrSetView *set_view)
38 {
39         FluttrSetViewPrivate *priv;
40                 
41         g_return_val_if_fail (FLUTTR_IS_SET_VIEW (set_view), NULL);
42         priv = FLUTTR_SET_VIEW_GET_PRIVATE(set_view);
43         
44         return FLUTTR_SET (priv->active_actor);
45 }
46
47 void 
48 fluttr_set_view_advance (FluttrSetView *set_view, gint n)
49 {
50         FluttrSetViewPrivate *priv;
51         gint len;
52         gint i = 0;
53         ClutterActor *set = NULL;
54         guint width = fluttr_set_get_default_width ();
55         guint height = fluttr_set_get_default_height ();
56         gint x1;
57         gint active_row = 0;
58         gint offset = height/2;
59         gint padding = width/2;
60                 
61         g_return_if_fail (FLUTTR_IS_SET_VIEW (set_view));
62         priv = FLUTTR_SET_VIEW_GET_PRIVATE(set_view);
63
64         len = clutter_group_get_n_children (CLUTTER_GROUP (set_view));
65         
66         /* Make sure we are within the bounds of the number of albums */
67         priv->active_set+= n;
68         if (priv->active_set < 0) {
69                 priv->active_set  = 0;
70         } else if (priv->active_set > len-1) {
71                 priv->active_set = len -1;
72         } else
73                 ;
74         /* Find the magic row */        
75         active_row = 0;
76         gint row = 0;
77         gint col = 0;
78         
79         for (i = 0; i < len; i++) {
80                 if (i == priv->active_set) {
81                         active_row = row;
82                         break;
83                 }
84                 col++;
85                 if (col > (N_COLS-1)) {
86                         col = 0;
87                         row++;
88                 }
89         }
90         
91         /* Figure out the base x value */
92         x1 = ((width) * N_COLS ) + (padding*(N_COLS-1));
93         x1 = (CLUTTER_STAGE_WIDTH ()/2)-(x1/2);
94         
95         /* Iterate through actors, calculating their new x positions, and make
96            sure they are on the right place (left, right or center) */
97         col = 0;
98         row = 0;
99
100         offset = -1 * ((height) + padding) * active_row;
101         offset += (CLUTTER_STAGE_HEIGHT () /2) - (height/2);
102         
103         for (i = 0; i < len; i++) {
104                 set = clutter_group_get_nth_child (CLUTTER_GROUP (set_view), i);
105                  
106                 gint x = x1 + (col * (width + padding));
107                 gint y = offset;
108                 fluttr_set_update_position (FLUTTR_SET (set), x, y);
109                 
110                 col++;
111                 if (col > (N_COLS-1)) {
112                         col = 0;
113                         row++;
114                         offset += height + padding;
115                 }
116                 if (i == priv->active_set) {
117                         priv->active_actor = set;       
118                         fluttr_set_set_active (FLUTTR_SET (set), TRUE);
119                 } else
120                         fluttr_set_set_active (FLUTTR_SET (set), FALSE);        
121                         
122                 /* Update the position of the ring */
123         }
124 }
125
126 /* We make all the 'viewable' sets fall down, leaving just the main one */
127 void
128 fluttr_set_view_activate (FluttrSetView *set_view)
129 {
130         ;
131 }
132
133 void
134 fluttr_set_view_advance_row (FluttrSetView *set_view, gint n)
135 {
136         fluttr_set_view_advance (set_view, (N_COLS * n));
137 }
138
139 void
140 fluttr_set_view_advance_col (FluttrSetView *set_view, gint n)
141 {
142         fluttr_set_view_advance (set_view, n);
143 }
144
145 void
146 fluttr_set_view_add_set (FluttrSetView *set_view, FluttrSet *set)
147 {
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));
151         
152         
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));
156 }
157
158 /* GObject Stuff */
159
160 static void
161 fluttr_set_view_set_property (GObject      *object, 
162                           guint         prop_id,
163                           const GValue *value, 
164                           GParamSpec   *pspec)
165 {
166         FluttrSetViewPrivate *priv;
167
168         g_return_if_fail (FLUTTR_IS_SET_VIEW (object));
169         priv = FLUTTR_SET_VIEW_GET_PRIVATE(object);
170
171         switch (prop_id) {
172                 default:
173                         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, 
174                                                            pspec);
175                         break;
176         }
177 }
178
179 static void
180 fluttr_set_view_get_property (GObject    *object, 
181                           guint       prop_id,
182                           GValue     *value, 
183                           GParamSpec *pspec)
184 {
185         FluttrSetViewPrivate *priv;
186         
187         g_return_if_fail (FLUTTR_IS_SET_VIEW (object));
188         priv = FLUTTR_SET_VIEW_GET_PRIVATE(object);
189
190         switch (prop_id) {
191                 default:
192                         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id,
193                                                            pspec);
194                 break;
195         } 
196 }
197
198 static void
199 fluttr_set_view_paint (ClutterActor *actor)
200 {
201         FluttrSetView        *set;
202         FluttrSetViewPrivate *priv;
203
204         set = FLUTTR_SET_VIEW(actor);
205
206         priv = FLUTTR_SET_VIEW_GET_PRIVATE(set);
207
208         glPushMatrix();
209         
210         gint i;
211         gint len = clutter_group_get_n_children (CLUTTER_GROUP (actor)); 
212         for (i = 0; i < len; i++) {
213                 ClutterActor* child;
214
215                 child = clutter_group_get_nth_child (CLUTTER_GROUP(actor), i);
216                 if (child) {
217                         clutter_actor_paint (child);
218                 }
219         }
220
221         glPopMatrix();
222 }
223
224 static void 
225 fluttr_set_view_dispose (GObject *object)
226 {
227         FluttrSetView         *self = FLUTTR_SET_VIEW(object);
228         FluttrSetViewPrivate  *priv;  
229
230         priv = self->priv;
231   
232         G_OBJECT_CLASS (parent_class)->dispose (object);
233 }
234
235 static void 
236 fluttr_set_view_finalize (GObject *object)
237 {
238         G_OBJECT_CLASS (parent_class)->finalize (object);
239 }
240
241 static void
242 fluttr_set_view_class_init (FluttrSetViewClass *klass)
243 {
244         GObjectClass        *gobject_class = G_OBJECT_CLASS (klass);
245         ClutterActorClass   *actor_class = CLUTTER_ACTOR_CLASS (klass);
246         
247         parent_class = CLUTTER_GROUP_CLASS (klass);
248
249         actor_class->paint           = fluttr_set_view_paint;
250         
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;     
255
256         g_type_class_add_private (gobject_class, sizeof (FluttrSetViewPrivate));
257                 
258 }
259
260 static void
261 fluttr_set_view_init (FluttrSetView *self)
262 {
263         FluttrSetViewPrivate *priv;
264         priv = FLUTTR_SET_VIEW_GET_PRIVATE (self);
265         
266         priv->active_set = 0;
267         priv->active_col = 0;
268         
269 }
270
271 ClutterActor*
272 fluttr_set_view_new (void)
273 {
274         ClutterGroup         *set_view;
275
276         set_view = g_object_new (FLUTTR_TYPE_SET_VIEW, 
277                                   NULL);
278
279         return CLUTTER_ACTOR (set_view);
280 }
281