summaryrefslogtreecommitdiff
path: root/src/examples/transit_example_03.c
blob: caca85b25747e0c2741bb17457177bfe7d99f124 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
//Compile with:
//gcc -o transit_example_03 transit_example_03.c `pkg-config --cflags --libs elementary` -DDATA_DIR="\"<directory>\""
//where directory is the a path where images/icon_07.png can be found.

#include <Elementary.h>

/* structure to hold context for many callbacks */
struct Context
{
   Eina_Bool events_enabled;
   Eina_Bool auto_reverse;
   Eina_Bool final_state_keep;
   int repeat_times;
   Elm_Transit_Tween_Mode tween_mode;
   Evas_Object *obj;
};

static void
_transit_translation(Elm_Transit *trans)
{
   /* considering the original position (x0, y0), moves the object from
    * (x0 - 20, y0 - 50) to (x0 + 70, y0 + 150) */
   elm_transit_effect_translation_add(trans, -20, -50, 70, 150);
}

static void
_transit_color(Elm_Transit *trans)
{
   /* changes the object color from 100, 255, 100, 255 to
    * 40, 10, 40, 50 */
   elm_transit_effect_color_add(trans, 100, 255, 100, 255, 40, 10, 40, 50);
}

static void
_transit_rotation(Elm_Transit *trans)
{
   /* rotates the object from its original angle to 135 degrees to the right */
   elm_transit_effect_rotation_add(trans, 0.0, 135.0);
}

static void
_transit_wipe(Elm_Transit *trans)
{
   /* hide the object clipping it from the left to the right */
   elm_transit_effect_wipe_add(trans,
                               ELM_TRANSIT_EFFECT_WIPE_TYPE_HIDE,
                               ELM_TRANSIT_EFFECT_WIPE_DIR_RIGHT);
}

static void
_transit_zoom(Elm_Transit *trans)
{
   /* zoom the object from its original size to 2x */
   elm_transit_effect_zoom_add(trans, 1.0, 2.0);
}

static void
_transit_resizing(Elm_Transit *trans)
{
   /* resize the object from 250x100 to 400x160 */
   elm_transit_effect_resizing_add(trans, 250, 100, 400, 160);
}

/* helper structure that will hold the transit checkboxes string, callbacks
 * and checked statuses */
static struct {
     const char *label;
     void (*transition_add_cb)(Elm_Transit *);
     Eina_Bool checked;
} _transitions[] = {
       { "Translation", _transit_translation, EINA_FALSE },
       { "Color", _transit_color, EINA_FALSE },
       { "Rotation", _transit_rotation, EINA_FALSE },
       { "Wipe", _transit_wipe, EINA_FALSE },
       { "Zoom", _transit_zoom, EINA_FALSE },
       { "Resizing", _transit_resizing, EINA_FALSE },
       { NULL, NULL, EINA_FALSE }
};

/* add a checkbox to the box with the given label, and uses the checked
 * pointer as state_pointer to this checkbox */
static void
_checkbox_transition_add(Evas_Object *box, const char *label, Eina_Bool *checked)
{
   Evas_Object *check = elm_check_add(elm_object_parent_widget_get(box));
   evas_object_size_hint_weight_set(check, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
   evas_object_size_hint_align_set(check, 0.0, 0.0);
   elm_object_text_set(check, label);
   elm_check_state_pointer_set(check, checked);
   elm_box_pack_end(box, check);
   evas_object_show(check);
}

static void
_transit_start(void *data, Evas_Object *o, void *event_info)
{
   Elm_Transit *trans = NULL;
   int i;
   struct Context *ctxt = data;
   Evas_Object *obj = ctxt->obj; // the object on which the transition will be
                                 // applied

   // FIXME: Should check if there's another transit going before starting a new
   // one

   /* initialization: create the transition and add the object to it */
   trans = elm_transit_add();
   elm_transit_object_add(trans, obj);

   /* from our helper structure and array, check if the specified transition is
    * checked and use its callback to add this transition to trans */
   for (i = 0; _transitions[i].label; i++)
     {
        if (_transitions[i].checked)
          _transitions[i].transition_add_cb(trans);
     }

   /* get the various options for this transition from the context structure */
   elm_transit_event_enabled_set(trans, ctxt->events_enabled);
   elm_transit_auto_reverse_set(trans, ctxt->auto_reverse);
   elm_transit_objects_final_state_keep_set(trans, ctxt->final_state_keep);
   elm_transit_tween_mode_set(trans, ctxt->tween_mode);
   elm_transit_repeat_times_set(trans, ctxt->repeat_times);

   /* set the transition time to 2 seconds and start it */
   elm_transit_duration_set(trans, 2.0);
   elm_transit_go(trans);
}

/* callback useful just to know whether we can receive events from the
 * object or not */
static void
_object_clicked(void *data, Evas_Object *o, void *event_info)
{
   printf("object clicked!\n");
}

/* update our context with the given value for repeat count */
static void
_cb_repeat_changed(void *data, Evas_Object *obj, void *event)
{
   int *repeat_cnt = data;

   *repeat_cnt = elm_spinner_value_get(obj);
}

/* update our context with the given tween mode for the transition */
static void
_cb_tween_changed(void *data, Evas_Object *obj, void *event)
{
   Elm_Transit_Tween_Mode *mode = data;
   double val = 0.0;

   val = elm_spinner_value_get(obj);
   if (val == 1.0)
     *mode = ELM_TRANSIT_TWEEN_MODE_LINEAR;
   else if (val == 2.0)
     *mode = ELM_TRANSIT_TWEEN_MODE_SINUSOIDAL;
   else if (val == 3.0)
     *mode = ELM_TRANSIT_TWEEN_MODE_DECELERATE;
   else if (val == 4.0)
     *mode = ELM_TRANSIT_TWEEN_MODE_ACCELERATE;
}

EAPI_MAIN int
elm_main(int argc, char **argv)
{
   Evas_Object *win, *obj, *icon, *box, *vbox, *vbox2, *hbox, *btn;
   Evas_Object *cbox, *dummy, *spinner;
   char buf[PATH_MAX];
   int i;
   struct Context context;

   /* initialize our context */
   context.events_enabled = EINA_FALSE;
   context.auto_reverse = EINA_FALSE;
   context.final_state_keep = EINA_FALSE;
   context.repeat_times = 0;
   context.tween_mode = ELM_TRANSIT_TWEEN_MODE_LINEAR;

   elm_app_info_set(elm_main, "elementary", "images/icon_07.png");
   elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);

   /* add a window */
   win = elm_win_util_standard_add("transit", "Transit Example");
   elm_win_autodel_set(win, EINA_TRUE);

   /* add a vertical box that will hold everything */
   box = elm_box_add(win);
   evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
   elm_win_resize_object_add(win, box);
   evas_object_show(box);

   /* a dummy background to create some space for the animation */
   dummy = elm_bg_add(win);
   evas_object_size_hint_weight_set(dummy, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
   elm_box_pack_end(box, dummy);
   evas_object_show(dummy);

   /* add an object that we are going to play with */
   /* this object isn't packed inside the box because we don't want it to have
    * its size, position, aspect or anything else controlled by the container */
   obj = elm_button_add(win);
   elm_object_text_set(obj, "Transformed object!");
   icon = elm_icon_add(win);
   snprintf(buf, sizeof(buf), "%s/images/icon_07.png", elm_app_data_dir_get());
   elm_image_file_set(icon, buf, NULL);
   elm_object_part_content_set(obj, "icon", icon);
   evas_object_move(obj, 160, 60);
   evas_object_resize(obj, 250, 100);
   evas_object_show(obj);
   context.obj = obj;

   /* a callback to know if clicks are being received */
   evas_object_smart_callback_add(obj, "clicked", _object_clicked, NULL);

   /* button to start our transition */
   btn = elm_button_add(win);
   evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
   elm_object_text_set(btn, "Transit!");
   elm_box_pack_end(box, btn);
   evas_object_show(btn);
   evas_object_smart_callback_add(btn, "clicked", _transit_start, &context);

   /* horizontal box to help visual organization */
   hbox = elm_box_add(win);
   elm_box_horizontal_set(hbox, EINA_TRUE);
   evas_object_size_hint_weight_set(hbox, EVAS_HINT_EXPAND, EVAS_HINT_FILL);
   evas_object_size_hint_align_set(hbox, EVAS_HINT_FILL, 0.0);
   elm_box_pack_end(box, hbox);
   evas_object_show(hbox);

   /* horizontal box that will hold the many transition checkboxes */
   vbox = elm_box_add(win);
   evas_object_size_hint_weight_set(vbox, EVAS_HINT_EXPAND, EVAS_HINT_FILL);
   evas_object_size_hint_align_set(vbox, EVAS_HINT_FILL, 0.0);

   /* create the respective checkboxes based on our helper structure and
    * array */
   for (i = 0; _transitions[i].label; i++)
     _checkbox_transition_add(vbox, _transitions[i].label,
                              &_transitions[i].checked);

   elm_box_pack_end(hbox, vbox);
   evas_object_show(vbox);

   /* vertical box that will hold the many transition option checkboxes */
   vbox2 = elm_box_add(win);
   evas_object_size_hint_weight_set(vbox2, EVAS_HINT_EXPAND, EVAS_HINT_FILL);
   evas_object_size_hint_align_set(vbox2, EVAS_HINT_FILL, 0.0);
   elm_box_pack_end(hbox, vbox2);
   evas_object_show(vbox2);

   /* the rest of this code adds widgets to control some of the behavior of
    * the transitions */
   cbox = elm_check_add(win);
   evas_object_size_hint_weight_set(cbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
   evas_object_size_hint_align_set(cbox, 0.0, 0.0);
   elm_object_text_set(cbox, "Events enabled");
   elm_check_state_pointer_set(cbox, &context.events_enabled);
   elm_box_pack_end(vbox2, cbox);
   evas_object_show(cbox);

   cbox = elm_check_add(win);
   evas_object_size_hint_weight_set(cbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
   evas_object_size_hint_align_set(cbox, 0.0, 0.0);
   elm_object_text_set(cbox, "Auto reverse");
   elm_check_state_pointer_set(cbox, &context.auto_reverse);
   elm_box_pack_end(vbox2, cbox);
   evas_object_show(cbox);

   cbox = elm_check_add(win);
   evas_object_size_hint_weight_set(cbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
   evas_object_size_hint_align_set(cbox, 0.0, 0.0);
   elm_object_text_set(cbox, "Keep final state");
   elm_check_state_pointer_set(cbox, &context.final_state_keep);
   elm_box_pack_end(vbox2, cbox);
   evas_object_show(cbox);

   spinner = elm_spinner_add(win);
   elm_object_style_set(spinner, "vertical");
   elm_spinner_min_max_set(spinner, 0, 4);
   elm_spinner_label_format_set(spinner, "%.0f");
   elm_spinner_editable_set(spinner, EINA_FALSE);
   evas_object_size_hint_weight_set(spinner, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
   evas_object_size_hint_align_set(spinner, 0.0, EVAS_HINT_FILL);
   evas_object_smart_callback_add(spinner, "changed", _cb_repeat_changed, &context.repeat_times);
   elm_box_pack_end(vbox2, spinner);
   evas_object_show(spinner);

   spinner = elm_spinner_add(win);
   elm_object_style_set(spinner, "vertical");
   elm_spinner_min_max_set(spinner, 1, 4);
   elm_spinner_label_format_set(spinner, "%.0f");
   elm_spinner_editable_set(spinner, EINA_FALSE);
   elm_spinner_special_value_add(spinner, 1, "linear");
   elm_spinner_special_value_add(spinner, 2, "sinusoidal");
   elm_spinner_special_value_add(spinner, 3, "decelerate");
   elm_spinner_special_value_add(spinner, 4, "accelerate");
   evas_object_size_hint_weight_set(spinner, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
   evas_object_size_hint_align_set(spinner, 0.0, EVAS_HINT_FILL);
   evas_object_smart_callback_add(spinner, "changed", _cb_tween_changed, &context.tween_mode);
   elm_box_pack_end(vbox2, spinner);
   evas_object_show(spinner);

   evas_object_show(win);

   elm_run();

   return 0;
}
ELM_MAIN()