1 #include <Elementary.h>
2 #include <system_settings.h>
13 #include "main_view.h"
18 #define _EDJ(o) elm_layout_edje_get(o)
21 const char *const DATA_KEY_CITY = "city";
22 const char *const DATA_KEY_MAIN_VIEW_INFO = "mvi";
24 const char *const ITEM_EDJE = "item.edj";
25 static int color_index[MAX_CITY] = { 0, 0, 0, 0, 0 };
27 void _text_set_here_time(Evas_Object *item, const char *part)
29 char *timezone_str = NULL;
30 struct tm *local_time = NULL;
32 int ret = SYSTEM_SETTINGS_ERROR_NONE;
34 char time_result[PATH_LEN] = {0, };
39 local_time = localtime(&t);
42 ret = system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_TIMEZONE, &timezone_str);
43 if (ret != SYSTEM_SETTINGS_ERROR_NONE)
44 _E("cannot get the timezone string");
49 if (local_time->tm_gmtoff >= 0)
50 snprintf(time_result, sizeof(time_result), "%s, +%ld", timezone_str, local_time->tm_gmtoff / 3600);
52 snprintf(time_result, sizeof(time_result), "%s, %ld", timezone_str, local_time->tm_gmtoff / 3600);
56 elm_object_part_text_set(item, part, timezone_str);
59 static void _item_typing_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
61 item_destroy_typing(obj);
64 static void _item_typing_down_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
66 _D("An item is down");
69 static void _item_typing_up_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
71 Evas_Object *item = obj;
72 Evas_Object *selecting_item = NULL;
73 main_view_s *main_view_info = data;
78 ret_if(!main_view_info);
79 ret_if(!main_view_info->city_list);
81 _D("An item is selected");
83 if (scroller_is_scrolling(main_view_info->searchlist))
86 count = scroller_count_item(main_view_info->city_list);
87 if (count + 1 > MAXIMUM_SELECTED_CITY) {
88 Evas_Object *popup = NULL;
89 _D("Cities selected are limited.");
90 popup = popup_create_text(main_view_info->main_view, "Maximum number of cities reached");
95 city = (int) evas_object_data_get(item, DATA_KEY_CITY);
96 selecting_item = item_create_selecting(main_view_info->city_list, city, 0, main_view_info);
97 ret_if(!selecting_item);
98 scroller_append_item(main_view_info->city_list, selecting_item);
102 elm_object_signal_emit(main_view_info->main_view, "momentic,state,add_description,hide", "");
103 elm_object_signal_emit(main_view_info->main_view, "momentic,state,next_btn,show", "");
105 elm_object_signal_emit(main_view_info->main_view, "momentic,state,add_description,show", "");
106 elm_object_signal_emit(main_view_info->main_view, "momentic,state,next_btn,hide", "");
110 Evas_Object *item_create_typing(Evas_Object *parent, int city, main_view_s *main_view_info)
112 Evas_Object *item = NULL;
113 city_s *city_info = NULL;
116 char full_path[PATH_LEN] = {0, };
117 char city_str[PATH_LEN] = {0, };
119 retv_if(!parent, NULL);
121 path = app_get_resource_path();
122 retv_if(!path, NULL);
124 snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ITEM_EDJE);
127 item = elm_layout_add(parent);
128 retv_if(!item, NULL);
130 elm_layout_file_set(item, full_path, "item_typing");
132 evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
133 evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
134 evas_object_data_set(item, DATA_KEY_CITY, (void *) city);
135 evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_typing_del_cb, NULL);
136 elm_object_signal_callback_add(item, "down", "item", _item_typing_down_cb, NULL);
137 elm_object_signal_callback_add(item, "up", "item", _item_typing_up_cb, main_view_info);
139 evas_object_show(item);
142 elm_object_part_text_set(item, "city", "No results");
143 elm_object_signal_emit(item, "disable", "item");
147 city_info = city_get();
149 _E("Critical, no city information");
150 evas_object_del(item);
154 snprintf(city_str, sizeof(city_str), "%s, %s", city_info[city].name, city_info[city].nation);
155 elm_object_part_text_set(item, "city", city_str);
160 void item_destroy_typing(Evas_Object *item)
164 evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_typing_del_cb);
165 elm_object_signal_callback_del(item, "down", "item", _item_typing_down_cb);
166 elm_object_signal_callback_del(item, "up", "item", _item_typing_up_cb);
168 evas_object_data_del(item, DATA_KEY_CITY);
169 evas_object_del(item);
172 static void _item_selecting_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
174 item_destroy_selecting(obj);
177 static void _delete_selecting_item_cb(void *data, Evas_Object *obj, void *event_info)
179 main_view_s *main_view_info = NULL;
180 Evas_Object *item = data;
184 _D("clicked, delete the selected item");
188 main_view_info = evas_object_data_get(item, DATA_KEY_MAIN_VIEW_INFO);
189 ret_if(!main_view_info);
191 ci = (int) evas_object_data_get(item, "color_index");
193 if (EINA_FALSE == remove_city_from_map(ci))
194 _E("cannot remove the city");
197 item_destroy_selecting(item);
199 count = scroller_count_item(main_view_info->city_list);
201 elm_object_signal_emit(main_view_info->main_view, "momentic,state,add_description,hide", "");
202 elm_object_signal_emit(main_view_info->main_view, "momentic,state,next_btn,show", "");
204 elm_object_signal_emit(main_view_info->main_view, "momentic,state,add_description,show", "");
205 elm_object_signal_emit(main_view_info->main_view, "momentic,state,next_btn,hide", "");
209 Evas_Object *item_create_selecting(Evas_Object *parent, int city, int color, main_view_s *main_view_info)
211 Evas_Object *item = NULL;
212 Evas_Object *btn = NULL;
213 city_s *city_info = NULL;
214 selecting_info_s *selecting_info = NULL;
217 char full_path[PATH_LEN] = {0, };
218 char city_str[PATH_LEN] = {0, };
219 char gmt_str[PATH_LEN] = {0, };
220 char color_str[16] = {0, };
222 retv_if(!parent, NULL);
224 city_info = city_get();
225 goto_if(!city_info, error);
228 for (i = 0; i < MAX_CITY; i++) {
229 if (color_index[i]) continue;
231 if (EINA_FALSE == add_city_to_map(i, &city_info[city])) {
232 _E("cannot add a city to the map");
238 path = app_get_resource_path();
239 retv_if(!path, NULL);
241 snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ITEM_EDJE);
244 selecting_info = calloc(1, sizeof(selecting_info_s));
245 retv_if(!selecting_info, NULL);
246 selecting_info->city = city;
247 selecting_info->color = color;
249 item = elm_layout_add(parent);
250 retv_if(!item, NULL);
252 elm_layout_file_set(item, full_path, "item_selecting");
254 evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
255 evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
256 evas_object_data_set(item, DATA_KEY_MAIN_VIEW_INFO, main_view_info);
257 evas_object_data_set(item, DATA_KEY_SELECTING, selecting_info);
258 evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_selecting_del_cb, NULL);
259 evas_object_show(item);
261 evas_object_data_set(item, "color_index", (void *) i);
264 btn = elm_button_add(item);
266 elm_object_style_set(btn, "transparent");
267 elm_object_part_content_set(item, "delete_event", btn);
268 evas_object_smart_callback_add(btn, "clicked", _delete_selecting_item_cb, item);
269 evas_object_show(btn);
272 snprintf(city_str, sizeof(city_str), "%s, %s", city_info[city].name, city_info[city].nation);
273 elm_object_part_text_set(item, "city", city_str);
275 if (city_info[city].timezone > 0)
276 snprintf(gmt_str, sizeof(gmt_str), "GMT +%.1f", city_info[city].timezone);
278 snprintf(gmt_str, sizeof(gmt_str), "GMT %.1f", city_info[city].timezone);
280 elm_object_part_text_set(item, "gmt", gmt_str);
283 snprintf(color_str, sizeof(color_str), "%d", color);
284 elm_object_signal_emit(item, color_str, "mark");
291 evas_object_del(item);
294 free(selecting_info);
299 void item_destroy_selecting(Evas_Object *item)
301 selecting_info_s *selecting_info = NULL;
305 evas_object_data_del(item, DATA_KEY_MAIN_VIEW_INFO);
306 selecting_info = evas_object_data_del(item, DATA_KEY_SELECTING);
307 evas_object_data_del(item, "color_index");
308 free(selecting_info);
310 evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_selecting_del_cb);
312 evas_object_del(item);
315 void _text_set_local_time(Evas_Object *item, const char *part, int city, struct tm *global_time)
317 city_s *city_info = NULL;
318 int hour = global_time->tm_hour;
319 int minute = global_time->tm_min;
321 char time_result[PATH_LEN] = {0, };
326 city_info = city_get();
329 if (((double) ((int) city_info[city].timezone)) < city_info[city].timezone) {
337 snprintf(time_result, sizeof(time_result), "%d:%d", hour, minute);
338 elm_object_part_text_set(item, part, time_result);
341 static void _resize_graph_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
343 result_info_s *result_info = NULL;
347 result_info = evas_object_data_get(obj, DATA_KEY_RESULT);
348 ret_if(!result_info);
350 edje_object_part_geometry_get(_EDJ(obj), "graph_base", &x, &y, &w, &h);
352 if (result_info->start > result_info->end) {
353 evas_object_move(result_info->rect2, x, y);
354 evas_object_resize(result_info->rect2, w / 10.0, h);
355 evas_object_color_set(result_info->rect2, 0, 0, 0, 255);
356 evas_object_show(result_info->rect2);
358 evas_object_hide(result_info->rect2);
361 start_x = (result_info->start / 24.0f) * w + x;
363 evas_object_move(result_info->rect1, start_x, y);
364 evas_object_resize(result_info->rect1, x + w - start_x, h);
365 evas_object_color_set(result_info->rect1, 0, 0, 0, 255);
366 evas_object_show(result_info->rect1);
369 static void _item_result_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
371 item_destroy_result(obj);
374 Evas_Object *item_create_result(Evas_Object *parent, int city, int color, int start, int end, struct tm *global_time)
376 Evas_Object *item = NULL;
377 city_s *city_info = NULL;
378 result_info_s *result_info = NULL;
382 char full_path[PATH_LEN] = {0, };
383 char city_str[PATH_LEN] = {0, };
384 char color_str[16] = {0, };
386 retv_if(!parent, NULL);
388 path = app_get_resource_path();
389 retv_if(!path, NULL);
391 snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ITEM_EDJE);
394 result_info = calloc(1, sizeof(result_info_s));
395 retv_if(!result_info, NULL);
397 item = elm_layout_add(parent);
398 goto_if(!item, error);
400 elm_layout_file_set(item, full_path, "item_result");
402 evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
403 evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
404 evas_object_data_set(item, DATA_KEY_RESULT, result_info);
405 evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_result_del_cb, NULL);
406 //evas_object_event_callback_add(item, EVAS_CALLBACK_RESIZE, _resize_graph_cb, result_info);
407 //evas_object_event_callback_add(item, EVAS_CALLBACK_MOVE, _resize_graph_cb, result_info);
408 evas_object_show(item);
410 city_info = city_get();
411 goto_if(!city_info, error);
413 snprintf(city_str, sizeof(city_str), "%s, %s", city_info[city].name, city_info[city].nation);
414 elm_object_part_text_set(item, "city", city_str);
416 snprintf(color_str, sizeof(color_str), "%d", color);
417 elm_object_signal_emit(item, color_str, "mark");
419 _text_set_local_time(item, "time", city, global_time);
421 e = evas_object_evas_get(item);
424 result_info->rect1 = evas_object_rectangle_add(e);
425 goto_if(!result_info->rect1, error);
427 result_info->rect2 = evas_object_rectangle_add(e);
428 goto_if(!result_info->rect2, error);
430 result_info->city = city;
431 result_info->start = start;
432 result_info->end = end;
438 if (result_info->rect1)
439 evas_object_del(result_info->rect1);
440 if (result_info->rect2)
441 evas_object_del(result_info->rect2);
446 evas_object_del(item);
452 void item_destroy_result(Evas_Object *item)
454 result_info_s *result_info = NULL;
458 evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_result_del_cb);
460 result_info = evas_object_data_del(item, DATA_KEY_RESULT);
462 if (result_info->rect1)
463 evas_object_del(result_info->rect1);
464 if (result_info->rect2)
465 evas_object_del(result_info->rect2);
469 evas_object_del(item);
472 static void _item_group_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
474 item_destroy_group(obj);
477 static void _item_group_down_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
479 _D("An item is down");
482 static void _item_group_up_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
484 Evas_Object *item = obj;
485 Evas_Object *selecting_item = NULL;
486 main_view_s *main_view_info = data;
491 ret_if(!main_view_info);
492 ret_if(!main_view_info->city_list);
494 _D("An item is selected");
496 count = scroller_count_item(main_view_info->city_list);
497 if (count >= MAXIMUM_SELECTED_CITY) {
498 Evas_Object *popup = NULL;
499 _D("Cities selected are limited.");
500 popup = popup_create_text(main_view_info->main_view, "Maximum number of cities reached");
501 elm_object_part_content_set(main_view_info->main_view, "popup", popup);
505 city = (int) evas_object_data_get(item, DATA_KEY_CITY);
506 selecting_item = item_create_selecting(main_view_info->city_list, city, 0, main_view_info);
507 ret_if(!selecting_item);
509 scroller_append_item(main_view_info->city_list, selecting_item);
512 Evas_Object *item_create_group(Evas_Object *parent, const char *title, main_view_s *main_view_info)
514 Evas_Object *item = NULL;
517 char full_path[PATH_LEN] = {0, };
519 retv_if(!parent, NULL);
521 path = app_get_resource_path();
522 retv_if(!path, NULL);
524 snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ITEM_EDJE);
527 item = elm_layout_add(parent);
528 retv_if(!item, NULL);
530 elm_layout_file_set(item, full_path, "item_group");
532 evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
533 evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
534 evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_group_del_cb, NULL);
535 elm_object_signal_callback_add(item, "down", "item", _item_group_down_cb, NULL);
536 elm_object_signal_callback_add(item, "up", "item", _item_group_up_cb, main_view_info);
538 evas_object_show(item);
540 elm_object_part_text_set(item, "city", title);
545 void item_destroy_group(Evas_Object *item)
549 evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_group_del_cb);
550 elm_object_signal_callback_del(item, "down", "item", _item_group_down_cb);
551 elm_object_signal_callback_del(item, "up", "item", _item_group_up_cb);
553 evas_object_del(item);
556 static void _item_padding_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
558 item_destroy_padding(obj);
561 Evas_Object *item_create_padding(Evas_Object *parent)
563 Evas_Object *item = NULL;
564 city_s *city_info = NULL;
567 char full_path[PATH_LEN] = {0, };
568 char city_str[PATH_LEN] = {0, };
570 retv_if(!parent, NULL);
572 path = app_get_resource_path();
573 retv_if(!path, NULL);
575 snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ITEM_EDJE);
578 item = elm_layout_add(parent);
579 retv_if(!item, NULL);
581 elm_layout_file_set(item, full_path, "item_padding");
583 evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
584 evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
585 evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_padding_del_cb, NULL);
587 evas_object_show(item);
592 void item_destroy_padding(Evas_Object *item)
595 evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_padding_del_cb);
596 evas_object_del(item);