interactive/*: Update the API usage
[profile/ivi/clutter.git] / tests / interactive / test-bin-layout.c
1 #include <stdlib.h>
2 #include <gmodule.h>
3 #include <cairo.h>
4 #include <clutter/clutter.h>
5
6 static const ClutterColor bg_color = { 0xcc, 0xcc, 0xcc, 0x99 };
7
8 static gboolean is_expanded = FALSE;
9
10 static gboolean
11 draw_background (ClutterCairoTexture *texture,
12                  cairo_t             *cr)
13 {
14   cairo_pattern_t *pat;
15   gfloat x, y;
16   guint width, height;
17
18   clutter_cairo_texture_get_surface_size (texture, &width, &height);
19
20 #define BG_ROUND_RADIUS         12
21
22   x = y = 0;
23
24   cairo_move_to (cr, BG_ROUND_RADIUS, y);
25   cairo_line_to (cr, width - BG_ROUND_RADIUS, y);
26   cairo_curve_to (cr, width, y, width, y, width, BG_ROUND_RADIUS);
27   cairo_line_to (cr, width, height - BG_ROUND_RADIUS);
28   cairo_curve_to (cr, width, height, width, height, width - BG_ROUND_RADIUS, height);
29   cairo_line_to (cr, BG_ROUND_RADIUS, height);
30   cairo_curve_to (cr, x, height, x, height, x, height - BG_ROUND_RADIUS);
31   cairo_line_to (cr, x, BG_ROUND_RADIUS);
32   cairo_curve_to (cr, x, y, x, y, BG_ROUND_RADIUS, y);
33
34   cairo_close_path (cr);
35
36   clutter_cairo_set_source_color (cr, &bg_color);
37   cairo_stroke (cr);
38
39   x += 4;
40   y += 4;
41   width -= 4;
42   height -= 4;
43
44   cairo_move_to (cr, BG_ROUND_RADIUS, y);
45   cairo_line_to (cr, width - BG_ROUND_RADIUS, y);
46   cairo_curve_to (cr, width, y, width, y, width, BG_ROUND_RADIUS);
47   cairo_line_to (cr, width, height - BG_ROUND_RADIUS);
48   cairo_curve_to (cr, width, height, width, height, width - BG_ROUND_RADIUS, height);
49   cairo_line_to (cr, BG_ROUND_RADIUS, height);
50   cairo_curve_to (cr, x, height, x, height, x, height - BG_ROUND_RADIUS);
51   cairo_line_to (cr, x, BG_ROUND_RADIUS);
52   cairo_curve_to (cr, x, y, x, y, BG_ROUND_RADIUS, y);
53
54   cairo_close_path (cr);
55
56   pat = cairo_pattern_create_linear (0, 0, 0, height);
57   cairo_pattern_add_color_stop_rgba (pat, 1, .85, .85, .85, 1);
58   cairo_pattern_add_color_stop_rgba (pat, .95, 1, 1, 1, 1);
59   cairo_pattern_add_color_stop_rgba (pat, .05, 1, 1, 1, 1);
60   cairo_pattern_add_color_stop_rgba (pat, 0, .85, .85, .85, 1);
61
62   cairo_set_source (cr, pat);
63   cairo_fill (cr);
64
65   cairo_pattern_destroy (pat);
66
67 #undef BG_ROUND_RADIUS
68
69   return TRUE;
70 }
71
72 static gboolean
73 on_box_enter (ClutterActor *box,
74               ClutterEvent *event,
75               ClutterActor *emblem)
76 {
77   clutter_actor_animate (emblem, CLUTTER_LINEAR, 150,
78                          "opacity", 255,
79                          NULL);
80
81   return TRUE;
82 }
83
84 static gboolean
85 on_box_leave (ClutterActor *box,
86               ClutterEvent *event,
87               ClutterActor *emblem)
88 {
89   clutter_actor_animate (emblem, CLUTTER_LINEAR, 150,
90                          "opacity", 0,
91                          NULL);
92
93   return TRUE;
94 }
95
96 static void
97 on_rect_clicked (ClutterClickAction *action,
98                  ClutterActor       *rect,
99                  ClutterActor       *box)
100 {
101   if (!is_expanded)
102     clutter_actor_animate (box, CLUTTER_EASE_OUT_BOUNCE, 250,
103                            "width", 400.0,
104                            "height", 400.0,
105                            NULL);
106   else
107     clutter_actor_animate (box, CLUTTER_EASE_OUT_BOUNCE, 250,
108                            "width", 200.0,
109                            "height", 200.0,
110                            NULL);
111
112   is_expanded = !is_expanded;
113 }
114
115 static gboolean
116 on_rect_long_press (ClutterClickAction    *action,
117                     ClutterActor          *rect,
118                     ClutterLongPressState  state,
119                     ClutterActor          *box)
120 {
121   switch (state)
122     {
123     case CLUTTER_LONG_PRESS_QUERY:
124       g_print ("*** long press: query ***\n");
125       return is_expanded;
126
127     case CLUTTER_LONG_PRESS_CANCEL:
128       g_print ("*** long press: cancel ***\n");
129       break;
130
131     case CLUTTER_LONG_PRESS_ACTIVATE:
132       g_print ("*** long press: activate ***\n");
133       break;
134     }
135
136   return TRUE;
137 }
138
139 static void
140 on_box_allocation_changed (ClutterActor           *box,
141                            const ClutterActorBox  *allocation,
142                            ClutterAllocationFlags  flags,
143                            ClutterActor           *background)
144 {
145   gfloat new_width, new_height;
146
147   clutter_actor_box_get_size (allocation, &new_width, &new_height);
148   clutter_cairo_texture_set_surface_size (CLUTTER_CAIRO_TEXTURE (background),
149                                           new_width,
150                                           new_height);
151   clutter_cairo_texture_invalidate (CLUTTER_CAIRO_TEXTURE (background));
152 }
153
154 G_MODULE_EXPORT int
155 test_bin_layout_main (int argc, char *argv[])
156 {
157   ClutterActor *stage, *box, *rect;
158   ClutterLayoutManager *layout;
159   ClutterColor stage_color = { 0xe0, 0xf2, 0xfc, 0xff };
160   ClutterColor *color;
161   ClutterAction *action;
162
163   if (clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS)
164     return 1;
165
166   stage = clutter_stage_new ();
167   clutter_stage_set_title (CLUTTER_STAGE (stage), "BinLayout");
168   clutter_actor_set_background_color (stage, &stage_color);
169   clutter_actor_set_size (stage, 640, 480);
170   g_signal_connect (stage, "destroy", G_CALLBACK (clutter_main_quit), NULL);
171
172   layout = clutter_bin_layout_new (CLUTTER_BIN_ALIGNMENT_CENTER,
173                                    CLUTTER_BIN_ALIGNMENT_CENTER);
174
175   box = clutter_box_new (layout);
176   clutter_container_add_actor (CLUTTER_CONTAINER (stage), box);
177   clutter_actor_set_anchor_point_from_gravity (box, CLUTTER_GRAVITY_CENTER);
178   clutter_actor_set_position (box, 320, 240);
179   clutter_actor_set_reactive (box, TRUE);
180   clutter_actor_set_name (box, "box");
181
182   /* the contents of the texture are created every time the allocation
183    * of the box changes, to keep the background's size the same as the
184    * box's size
185    */
186   rect = clutter_cairo_texture_new (100, 100);
187   g_signal_connect (rect, "draw", G_CALLBACK (draw_background), NULL);
188
189   /* first method: use clutter_box_pack() */
190   clutter_box_pack (CLUTTER_BOX (box), rect,
191                     "x-align", CLUTTER_BIN_ALIGNMENT_FILL,
192                     "y-align", CLUTTER_BIN_ALIGNMENT_FILL,
193                     NULL);
194
195   clutter_actor_lower_bottom (rect);
196   clutter_actor_set_name (rect, "background");
197   g_signal_connect (box, "allocation-changed",
198                     G_CALLBACK (on_box_allocation_changed),
199                     rect);
200
201   {
202     ClutterActor *tex;
203     GError *error;
204     gchar *file;
205
206     error = NULL;
207     file = g_build_filename (TESTS_DATADIR, "redhand.png", NULL);
208     tex = clutter_texture_new_from_file (file, &error);
209     if (error)
210       g_error ("Unable to create texture: %s", error->message);
211
212     clutter_texture_set_keep_aspect_ratio (CLUTTER_TEXTURE (tex), TRUE);
213
214     /* second method: use clutter_bin_layout_add() */
215     clutter_bin_layout_add (CLUTTER_BIN_LAYOUT (layout), tex,
216                             CLUTTER_BIN_ALIGNMENT_CENTER,
217                             CLUTTER_BIN_ALIGNMENT_CENTER);
218
219     clutter_actor_raise (tex, rect);
220     clutter_actor_set_width (tex, 175);
221     clutter_actor_set_name (tex, "texture");
222
223     g_free (file);
224   }
225
226   color = clutter_color_new (g_random_int_range (0, 255),
227                              g_random_int_range (0, 255),
228                              g_random_int_range (0, 255),
229                              224);
230
231   rect = clutter_rectangle_new_with_color (color);
232
233   /* third method: container_add() and set_alignment() */
234   clutter_container_add_actor (CLUTTER_CONTAINER (box), rect);
235   clutter_bin_layout_set_alignment (CLUTTER_BIN_LAYOUT (layout), rect,
236                                     CLUTTER_BIN_ALIGNMENT_END,
237                                     CLUTTER_BIN_ALIGNMENT_END);
238
239   clutter_actor_set_size (rect, 50, 50);
240   clutter_actor_set_opacity (rect, 0);
241   clutter_actor_set_reactive (rect, TRUE);
242   clutter_actor_raise_top (rect);
243   clutter_actor_set_name (rect, "emblem");
244
245   action = clutter_click_action_new ();
246   clutter_actor_add_action (rect, action);
247   g_signal_connect (action, "clicked", G_CALLBACK (on_rect_clicked), box);
248   g_signal_connect (action, "long-press", G_CALLBACK (on_rect_long_press), box);
249   g_signal_connect (box,
250                     "enter-event", G_CALLBACK (on_box_enter),
251                     rect);
252   g_signal_connect (box,
253                     "leave-event", G_CALLBACK (on_box_leave),
254                     rect);
255
256   rect = clutter_text_new ();
257   clutter_text_set_text (CLUTTER_TEXT (rect), "A simple test");
258   clutter_container_add_actor (CLUTTER_CONTAINER (box), rect);
259   clutter_bin_layout_set_alignment (CLUTTER_BIN_LAYOUT (layout), rect,
260                                     CLUTTER_BIN_ALIGNMENT_CENTER,
261                                     CLUTTER_BIN_ALIGNMENT_START);
262   clutter_actor_raise_top (rect);
263   clutter_actor_set_name (rect, "text");
264
265   clutter_actor_show_all (stage);
266
267   clutter_main ();
268
269   clutter_color_free (color);
270
271   return EXIT_SUCCESS;
272 }
273
274 G_MODULE_EXPORT const char *
275 test_bin_layout_describe (void)
276 {
277   return "BinLayout layout manager example";
278 }