0cb89082bbdb73831cc6a000b4e78adcf1d1f73d
[apps/native/sample/adventure.git] / src / item.c
1 #include <Elementary.h>
2 #include <system_settings.h>
3 #include <time.h>
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <app.h>
7
8 #include "log.h"
9 #include "conf.h"
10 #include "util.h"
11 #include "city.h"
12 #include "item.h"
13 #include "main_view.h"
14 #include "scroller.h"
15 #include "popup.h"
16
17 #define _EDJ(o) elm_layout_edje_get(o)
18 const char *const DATA_KEY_CITY = "city";
19
20 const char *const ITEM_EDJE = "item.edj";
21
22 void _text_set_here_time(Evas_Object *item, const char *part)
23 {
24         char *timezone_str = NULL;
25         struct tm *local_time = NULL;
26
27         int ret = SYSTEM_SETTINGS_ERROR_NONE;
28         time_t t = 0;
29         char time_result[PATH_LEN] = {0, };
30
31         ret_if(!item);
32         ret_if(!part);
33
34         local_time = localtime(&t);
35         ret_if(!local_time);
36
37         ret = system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_TIMEZONE, &timezone_str);
38         if (ret != SYSTEM_SETTINGS_ERROR_NONE)
39                 _E("cannot get the timezone string");
40
41         /* Timezone
42            Asia/Seoul
43         */
44         if (local_time->tm_gmtoff >= 0)
45                 snprintf(time_result, sizeof(time_result), "%s, +%ld", timezone_str, local_time->tm_gmtoff / 3600);
46         else
47                 snprintf(time_result, sizeof(time_result), "%s, %ld", timezone_str, local_time->tm_gmtoff / 3600);
48
49         free(timezone_str);
50
51         elm_object_part_text_set(item, part, timezone_str);
52 }
53
54 static void _item_typing_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
55 {
56         item_destroy_typing(obj);
57 }
58
59 static void _item_typing_down_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
60 {
61         _D("An item is down");
62 }
63
64 static void _item_typing_up_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
65 {
66         Evas_Object *item = obj;
67         Evas_Object *selecting_item = NULL;
68         main_view_s *main_view_info = data;
69         int city = 0;
70         int count = 0;
71
72         ret_if(!item);
73         ret_if(!main_view_info);
74         ret_if(!main_view_info->selected_scroller);
75
76         _D("An item is selected");
77
78         count = scroller_count_item(main_view_info->selected_scroller);
79         if (count >= MAXIMUM_SELECTED_CITY) {
80                 Evas_Object *popup = NULL;
81                 _D("Cities selected are limited.");
82                 popup = popup_create_text(main_view_info->main_view, "Maximum number of cities reached");
83                 elm_object_part_content_set(main_view_info->main_view, "popup", popup);
84                 return;
85         } else if (count > 0) {
86                 elm_object_signal_emit(main_view_info->main_view, "momentic,state,add_description,hide", "");
87         } else {
88                 /* We need to move this to the item_selecting */
89                 elm_object_signal_emit(main_view_info->main_view, "momentic,state,add_description,show", "");
90         }
91
92         if (count > 1) {
93                 elm_object_signal_emit(main_view_info->main_view, "momentic,state,next_btn,show", "");
94         }
95
96         city = (int) evas_object_data_get(item, DATA_KEY_CITY);
97         selecting_item = item_create_selecting(main_view_info->selected_scroller, city, 0);
98         ret_if(!selecting_item);
99
100         scroller_append_item(main_view_info->selected_scroller, selecting_item);
101 }
102
103 Evas_Object *item_create_typing(Evas_Object *parent, int city, main_view_s *main_view_info)
104 {
105         Evas_Object *item = NULL;
106         city_s *city_info = NULL;
107
108         char *path = NULL;
109         char full_path[PATH_LEN] = {0, };
110         char city_str[PATH_LEN] = {0, };
111
112         retv_if(!parent, NULL);
113
114         path = app_get_resource_path();
115         retv_if(!path, NULL);
116
117         snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ITEM_EDJE);
118         free(path);
119
120         item = elm_layout_add(parent);
121         retv_if(!item, NULL);
122
123         elm_layout_file_set(item, full_path, "item_typing");
124
125         evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
126         evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
127         evas_object_data_set(item, DATA_KEY_CITY, (void *) city);
128         evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_typing_del_cb, NULL);
129         elm_object_signal_callback_add(item, "down", "item", _item_typing_down_cb, NULL);
130         elm_object_signal_callback_add(item, "up", "item", _item_typing_up_cb, main_view_info);
131
132         evas_object_show(item);
133
134         city_info = city_get();
135         if (!city_info) {
136                 _E("Critical, no city information");
137                 evas_object_del(item);
138                 return NULL;
139         }
140         
141         snprintf(city_str, sizeof(city_str), "%s, %s", city_info[city].name, city_info[city].nation);
142         elm_object_part_text_set(item, "city", city_str);
143
144         return item;
145 }
146
147 void item_destroy_typing(Evas_Object *item)
148 {
149         ret_if(!item);
150
151         evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_typing_del_cb);
152         elm_object_signal_callback_del(item, "down", "item", _item_typing_down_cb);
153         elm_object_signal_callback_del(item, "up", "item", _item_typing_up_cb);
154
155         evas_object_data_del(item, DATA_KEY_CITY);
156         evas_object_del(item);
157 }
158
159 static void _item_selecting_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
160 {
161         item_destroy_selecting(obj);
162 }
163
164 static void _delete_down_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
165 {
166         _D("Delete button is down");
167 }
168
169 static void _delete_up_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
170 {
171         Evas_Object *item= obj;
172
173         ret_if(!item);
174
175         item_destroy_selecting(item);
176 }
177
178 Evas_Object *item_create_selecting(Evas_Object *parent, int city, int color)
179 {
180         Evas_Object *item = NULL;
181         city_s *city_info = NULL;
182         selecting_info_s *selecting_info = NULL;
183
184         char *path = NULL;
185         char full_path[PATH_LEN] = {0, };
186         char city_str[PATH_LEN] = {0, };
187         char color_str[16] = {0, };
188
189         retv_if(!parent, NULL);
190
191         path = app_get_resource_path();
192         retv_if(!path, NULL);
193
194         snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ITEM_EDJE);
195         free(path);
196
197         selecting_info = calloc(1, sizeof(selecting_info_s));
198         retv_if(!selecting_info, NULL);
199         selecting_info->city = city;
200         selecting_info->color = color;
201
202         item = elm_layout_add(parent);
203         retv_if(!item, NULL);
204
205         elm_layout_file_set(item, full_path, "item_selecting");
206
207         evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
208         evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
209         evas_object_data_set(item, DATA_KEY_SELECTING, selecting_info);
210         evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_selecting_del_cb, NULL);
211         elm_object_signal_callback_add(item, "delete,down", "item", _delete_down_cb, NULL);
212         elm_object_signal_callback_add(item, "delete,up", "item", _delete_up_cb, NULL);
213         evas_object_show(item);
214
215         city_info = city_get();
216         goto_if(!city_info, error);
217         
218         snprintf(city_str, sizeof(city_str), "%s, %s", city_info[city].name, city_info[city].nation);
219         elm_object_part_text_set(item, "city", city_str);
220
221         if (color) {
222                 snprintf(color_str, sizeof(color_str), "%d", color);
223                 elm_object_signal_emit(item, color_str, "mark");
224         }
225
226         return item;
227
228 error:
229         if (item)
230                 evas_object_del(item);
231
232         if (selecting_info)
233                 free(selecting_info);
234
235         return NULL;
236 }
237
238 void item_destroy_selecting(Evas_Object *item)
239 {
240         selecting_info_s *selecting_info = NULL;
241
242         ret_if(!item);
243
244         selecting_info = evas_object_data_del(item, DATA_KEY_SELECTING);
245         free(selecting_info);
246
247         evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_selecting_del_cb);
248         elm_object_signal_callback_del(item, "delete,down", "item", _delete_down_cb);
249         elm_object_signal_callback_del(item, "delete,up", "item", _delete_up_cb);
250
251         evas_object_del(item);
252 }
253
254 void _text_set_local_time(Evas_Object *item, const char *part, int city, struct tm *global_time)
255 {
256         city_s *city_info = NULL;
257         int hour = global_time->tm_hour;
258         int minute = global_time->tm_min;
259
260         char time_result[PATH_LEN] = {0, };
261
262         ret_if(!item);
263         ret_if(!part);
264
265         city_info = city_get();
266         ret_if(!city_info);
267
268         if (((double) ((int) city_info[city].timezone)) < city_info[city].timezone) {
269                 minute += 30;
270                 if (minute > 60) {
271                         hour++;
272                         minute -= 60;
273                 }
274         }
275
276         snprintf(time_result, sizeof(time_result), "%d:%d", hour, minute);
277         elm_object_part_text_set(item, part, time_result);
278 }
279
280 static void _resize_graph_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
281 {
282         result_info_s *result_info = NULL;
283         int x, y, w, h;
284         int start_x = 0;
285
286         result_info = evas_object_data_get(obj, DATA_KEY_RESULT);
287         ret_if(!result_info);
288
289         edje_object_part_geometry_get(_EDJ(obj), "graph_base", &x, &y, &w, &h);
290
291         if (result_info->start > result_info->end) {
292                 evas_object_move(result_info->rect2, x, y);
293                 evas_object_resize(result_info->rect2, w / 10.0, h);
294                 evas_object_color_set(result_info->rect2, 0, 0, 0, 255);
295                 evas_object_show(result_info->rect2);
296         } else {
297                 evas_object_hide(result_info->rect2);
298         }
299
300         start_x = (result_info->start / 24.0f) * w + x;
301
302         evas_object_move(result_info->rect1, start_x, y);
303         evas_object_resize(result_info->rect1, x + w - start_x, h);
304         evas_object_color_set(result_info->rect1, 0, 0, 0, 255);
305         evas_object_show(result_info->rect1);
306 }
307
308 static void _item_result_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
309 {
310         item_destroy_result(obj);
311 }
312
313 Evas_Object *item_create_result(Evas_Object *parent, int city, int color, int start, int end, struct tm *global_time)
314 {
315         Evas_Object *item = NULL;
316         city_s *city_info = NULL;
317         result_info_s *result_info = NULL;
318         Evas *e = NULL;
319
320         char *path = NULL;
321         char full_path[PATH_LEN] = {0, };
322         char city_str[PATH_LEN] = {0, };
323         char color_str[16] = {0, };
324
325         retv_if(!parent, NULL);
326
327         path = app_get_resource_path();
328         retv_if(!path, NULL);
329
330         snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ITEM_EDJE);
331         free(path);
332
333         result_info = calloc(1, sizeof(result_info_s));
334         retv_if(!result_info, NULL);
335
336         item = elm_layout_add(parent);
337         goto_if(!item, error);
338
339         elm_layout_file_set(item, full_path, "item_result");
340
341         evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
342         evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
343         evas_object_data_set(item, DATA_KEY_RESULT, result_info);
344         evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_result_del_cb, NULL);
345         evas_object_event_callback_add(item, EVAS_CALLBACK_RESIZE, _resize_graph_cb, result_info);
346         evas_object_event_callback_add(item, EVAS_CALLBACK_MOVE, _resize_graph_cb, result_info); 
347         evas_object_show(item);
348
349         city_info = city_get();
350         goto_if(!city_info, error);
351         
352         snprintf(city_str, sizeof(city_str), "%s, %s", city_info[city].name, city_info[city].nation);
353         elm_object_part_text_set(item, "city", city_str);
354
355         snprintf(color_str, sizeof(color_str), "%d", color);
356         elm_object_signal_emit(item, color_str, "mark");
357
358         _text_set_local_time(item, "time", city, global_time);
359
360         e = evas_object_evas_get(item);
361         goto_if(!e, error);
362
363         result_info->rect1 = evas_object_rectangle_add(e);
364         goto_if(!result_info->rect1, error);
365         
366         result_info->rect2 = evas_object_rectangle_add(e);
367         goto_if(!result_info->rect2, error);
368
369         result_info->city = city;
370         result_info->start = start;
371         result_info->end = end;
372
373         return item;
374
375 error:
376         if (result_info) {
377                 if (result_info->rect1)
378                         evas_object_del(result_info->rect1);
379                 if (result_info->rect2)
380                         evas_object_del(result_info->rect2);
381                 free(result_info);
382         }
383
384         if (item)
385                 evas_object_del(item);
386
387         free(result_info);
388         return NULL;
389 }
390
391 void item_destroy_result(Evas_Object *item)
392 {
393         result_info_s *result_info = NULL;
394
395         ret_if(!item);
396
397         evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_result_del_cb);
398         elm_object_signal_callback_del(item, "delete,down", "item", _delete_down_cb);
399         elm_object_signal_callback_del(item, "delete,up", "item", _delete_up_cb);
400
401         result_info = evas_object_data_del(item, DATA_KEY_RESULT);
402         if (result_info) {
403                 if (result_info->rect1)
404                         evas_object_del(result_info->rect1);
405                 if (result_info->rect2)
406                         evas_object_del(result_info->rect2);
407                 free(result_info);
408         }
409
410         evas_object_del(item);
411 }
412
413 static void _item_group_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
414 {
415         item_destroy_group(obj);
416 }
417
418 static void _item_group_down_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
419 {
420         _D("An item is down");
421 }
422
423 static void _item_group_up_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
424 {
425         Evas_Object *item = obj;
426         Evas_Object *selecting_item = NULL;
427         main_view_s *main_view_info = data;
428         int city = 0;
429         int count = 0;
430
431         ret_if(!item);
432         ret_if(!main_view_info);
433         ret_if(!main_view_info->selected_scroller);
434
435         _D("An item is selected");
436
437         count = scroller_count_item(main_view_info->selected_scroller);
438         if (count >= MAXIMUM_SELECTED_CITY) {
439                 Evas_Object *popup = NULL;
440                 _D("Cities selected are limited.");
441                 popup = popup_create_text(main_view_info->main_view, "Maximum number of cities reached");
442                 elm_object_part_content_set(main_view_info->main_view, "popup", popup);
443                 return;
444         }
445
446         city = (int) evas_object_data_get(item, DATA_KEY_CITY);
447         selecting_item = item_create_selecting(main_view_info->selected_scroller, city, 0);
448         ret_if(!selecting_item);
449
450         scroller_append_item(main_view_info->selected_scroller, selecting_item);
451 }
452
453 Evas_Object *item_create_group(Evas_Object *parent, const char *title, main_view_s *main_view_info)
454 {
455         Evas_Object *item = NULL;
456
457         char *path = NULL;
458         char full_path[PATH_LEN] = {0, };
459
460         retv_if(!parent, NULL);
461
462         path = app_get_resource_path();
463         retv_if(!path, NULL);
464
465         snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ITEM_EDJE);
466         free(path);
467
468         item = elm_layout_add(parent);
469         retv_if(!item, NULL);
470
471         elm_layout_file_set(item, full_path, "item_group");
472
473         evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
474         evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
475         evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_group_del_cb, NULL);
476         elm_object_signal_callback_add(item, "down", "item", _item_group_down_cb, NULL);
477         elm_object_signal_callback_add(item, "up", "item", _item_group_up_cb, main_view_info);
478
479         evas_object_show(item);
480
481         elm_object_part_text_set(item, "city", title);
482
483         return item;
484 }
485
486 void item_destroy_group(Evas_Object *item)
487 {
488         ret_if(!item);
489
490         evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_group_del_cb);
491         elm_object_signal_callback_del(item, "down", "item", _item_group_down_cb);
492         elm_object_signal_callback_del(item, "up", "item", _item_group_up_cb);
493
494         evas_object_del(item);
495 }