1 #include <Elementary.h>
2 #include <system_settings.h>
14 #include "main_view.h"
19 #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 const char *const BEST_TIME_EDJE = "best_time.edj";
26 const char *const ITEM2_EDJE = "item2.edj";
27 static int color_index[MAXIMUM_SELECTED_CITY] = { 0, 0, 0, 0, 0 };
29 void item_reset_color_index(void)
32 for (; i < MAXIMUM_SELECTED_CITY; i++) {
33 if (EINA_FALSE == remove_city_from_map(i))
34 _E("cannot remove the city");
40 static double _get_local_timezone(void)
42 struct tm *local_time = NULL;
43 double timezone = 0.0f;
48 local_time = localtime(&t);
49 retv_if(!local_time, 0.0f);
51 timezone = (double) (local_time->tm_gmtoff / 3600l);
52 _D("HELLO, gmtoff:%d", local_time->tm_gmtoff / 3600l);
57 void _text_set_here_time(Evas_Object *item, const char *part)
59 char *timezone_str = NULL;
60 struct tm *local_time = NULL;
62 int ret = SYSTEM_SETTINGS_ERROR_NONE;
64 char time_result[PATH_LEN] = {0, };
69 local_time = localtime(&t);
72 ret = system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_TIMEZONE, &timezone_str);
73 if (ret != SYSTEM_SETTINGS_ERROR_NONE)
74 _E("cannot get the timezone string");
79 if (local_time->tm_gmtoff >= 0l)
80 snprintf(time_result, sizeof(time_result), "%s, +%ld", timezone_str, local_time->tm_gmtoff / 3600l);
82 snprintf(time_result, sizeof(time_result), "%s, %ld", timezone_str, local_time->tm_gmtoff / 3600l);
86 elm_object_part_text_set(item, part, timezone_str);
89 static void _item_typing_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
91 item_destroy_typing(obj);
94 static void _item_typing_down_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
96 _D("An item is down");
99 static void _item_typing_up_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
101 Evas_Object *item = obj;
102 Evas_Object *selecting_item = NULL;
103 main_view_s *main_view_info = data;
104 struct tm *local_time = NULL;
110 ret_if(!main_view_info);
111 ret_if(!main_view_info->city_list);
113 _D("An item is selected");
116 local_time = localtime(&t);
118 if (scroller_is_scrolling(main_view_info->searchlist))
121 count = scroller_count_item(main_view_info->city_list);
122 if (count + 1 > MAXIMUM_SELECTED_CITY) {
123 Evas_Object *popup = NULL;
124 _D("Cities selected are limited.");
125 popup = popup_create_text(main_view_info->main_view, "Maximum number of cities reached");
130 city = (int) evas_object_data_get(item, DATA_KEY_CITY);
131 selecting_item = item_create_selecting(main_view_info->city_list, city, local_time, main_view_info);
132 ret_if(!selecting_item);
133 scroller_append_item(main_view_info->city_list, selecting_item);
137 elm_object_signal_emit(main_view_info->main_view, "momentic,state,add_description,hide", "");
138 elm_object_signal_emit(main_view_info->main_view, "momentic,state,next_btn,show", "");
140 elm_object_signal_emit(main_view_info->main_view, "momentic,state,add_description,show", "");
141 elm_object_signal_emit(main_view_info->main_view, "momentic,state,next_btn,hide", "");
145 Evas_Object *item_create_typing(Evas_Object *parent, int city, main_view_s *main_view_info)
147 Evas_Object *item = NULL;
148 city_s *city_info = NULL;
151 char full_path[PATH_LEN] = {0, };
152 char city_str[PATH_LEN] = {0, };
154 retv_if(!parent, NULL);
156 path = app_get_resource_path();
157 retv_if(!path, NULL);
159 snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ITEM_EDJE);
162 item = elm_layout_add(parent);
163 retv_if(!item, NULL);
165 elm_layout_file_set(item, full_path, "item_typing");
167 evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
168 evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
169 evas_object_data_set(item, DATA_KEY_CITY, (void *) city);
170 evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_typing_del_cb, NULL);
171 elm_object_signal_callback_add(item, "down", "item", _item_typing_down_cb, NULL);
172 elm_object_signal_callback_add(item, "up", "item", _item_typing_up_cb, main_view_info);
174 evas_object_show(item);
177 elm_object_part_text_set(item, "city", "No results");
178 elm_object_signal_emit(item, "disable", "item");
182 city_info = city_get();
184 _E("Critical, no city information");
185 evas_object_del(item);
189 snprintf(city_str, sizeof(city_str), "%s, %s", city_info[city].name, city_info[city].nation);
190 elm_object_part_text_set(item, "city", city_str);
195 void item_destroy_typing(Evas_Object *item)
199 evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_typing_del_cb);
200 elm_object_signal_callback_del(item, "down", "item", _item_typing_down_cb);
201 elm_object_signal_callback_del(item, "up", "item", _item_typing_up_cb);
203 evas_object_data_del(item, DATA_KEY_CITY);
204 evas_object_del(item);
207 static void _item_selecting_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
209 item_destroy_selecting(obj);
212 static void _delete_selecting_item_cb(void *data, Evas_Object *obj, void *event_info)
214 main_view_s *main_view_info = NULL;
215 Evas_Object *item = data;
218 _D("clicked, delete the selected item");
222 main_view_info = evas_object_data_get(item, DATA_KEY_MAIN_VIEW_INFO);
223 ret_if(!main_view_info);
225 item_destroy_selecting(item);
227 count = scroller_count_item(main_view_info->city_list);
229 elm_object_signal_emit(main_view_info->main_view, "momentic,state,add_description,hide", "");
230 elm_object_signal_emit(main_view_info->main_view, "momentic,state,next_btn,show", "");
232 elm_object_signal_emit(main_view_info->main_view, "momentic,state,add_description,show", "");
233 elm_object_signal_emit(main_view_info->main_view, "momentic,state,next_btn,hide", "");
237 void _text_set_local_time(Evas_Object *item, const char *part, int city, struct tm *local_time)
239 city_s *city_info = NULL;
240 int hour = local_time->tm_hour;
241 int minute = local_time->tm_min;
243 char time_result[PATH_LEN] = {0, };
248 city_info = city_get();
251 if (((double) ((int) city_info[city].timezone)) < city_info[city].timezone) {
259 hour -= local_time->tm_gmtoff / 3600l;
260 hour += (int) city_info[city].timezone;
261 _D("HELLO : local_time:%d, diff:%d, timezone:%f, final_hour:%d", local_time->tm_hour, local_time->tm_gmtoff / 3600l, city_info[city].timezone, hour);
267 snprintf(time_result, sizeof(time_result), "%2d:%02d", hour, minute);
268 elm_object_part_text_set(item, part, time_result);
271 Evas_Object *item_create_selecting(Evas_Object *parent, int city, struct tm *local_time, main_view_s *main_view_info)
273 Evas_Object *item = NULL;
274 Evas_Object *btn = NULL;
275 city_s *city_info = NULL;
276 selecting_info_s *selecting_info = NULL;
279 char full_path[PATH_LEN] = {0, };
280 char city_str[PATH_LEN] = {0, };
281 char gmt_str[PATH_LEN] = {0, };
282 char color_str[16] = {0, };
284 retv_if(!parent, NULL);
286 city_info = city_get();
287 goto_if(!city_info, error);
290 for (i = 0; i < MAXIMUM_SELECTED_CITY; i++) {
291 if (color_index[i]) continue;
293 _D("HELLO, i : %d, city : %d", i, city);
294 if (EINA_FALSE == add_city_to_map(i, &city_info[city])) {
295 _E("cannot add a city to the map");
301 path = app_get_resource_path();
302 retv_if(!path, NULL);
304 snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ITEM2_EDJE);
307 selecting_info = calloc(1, sizeof(selecting_info_s));
308 retv_if(!selecting_info, NULL);
309 selecting_info->city = city;
310 selecting_info->color = i;
312 item = elm_layout_add(parent);
313 retv_if(!item, NULL);
315 elm_layout_file_set(item, full_path, "item");
317 evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
318 evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
319 evas_object_data_set(item, DATA_KEY_MAIN_VIEW_INFO, main_view_info);
320 evas_object_data_set(item, DATA_KEY_SELECTING, selecting_info);
321 evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_selecting_del_cb, NULL);
322 evas_object_show(item);
324 btn = elm_button_add(item);
326 elm_object_style_set(btn, "transparent");
327 elm_object_part_content_set(item, "delete_event", btn);
328 evas_object_smart_callback_add(btn, "clicked", _delete_selecting_item_cb, item);
329 evas_object_show(btn);
332 snprintf(city_str, sizeof(city_str), "%s, %s", city_info[city].name, city_info[city].nation);
333 elm_object_part_text_set(item, "city", city_str);
335 if (city_info[city].timezone > 0)
336 snprintf(gmt_str, sizeof(gmt_str), "GMT +%.1f", city_info[city].timezone);
338 snprintf(gmt_str, sizeof(gmt_str), "GMT %.1f", city_info[city].timezone);
340 elm_object_part_text_set(item, "gmt", gmt_str);
341 _text_set_local_time(item, "time", city, local_time);
343 if (set_marker(item, i) == EINA_FALSE)
344 _E("cannot set the marker");
352 evas_object_del(item);
355 free(selecting_info);
360 void item_destroy_selecting(Evas_Object *item)
362 selecting_info_s *selecting_info = NULL;
366 evas_object_data_del(item, DATA_KEY_MAIN_VIEW_INFO);
367 selecting_info = evas_object_data_del(item, DATA_KEY_SELECTING);
368 if (selecting_info) {
369 if (EINA_FALSE == remove_city_from_map(selecting_info->color))
370 _E("cannot remove the city");
372 color_index[selecting_info->color] = 0;
373 free(selecting_info);
376 evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_selecting_del_cb);
377 evas_object_del(item);
380 static void _resize_graph_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
382 result_info_s *result_info = NULL;
386 result_info = evas_object_data_get(obj, DATA_KEY_RESULT);
387 ret_if(!result_info);
389 edje_object_part_geometry_get(_EDJ(obj), "graph_base", &x, &y, &w, &h);
391 if (result_info->start > result_info->end) {
392 evas_object_move(result_info->rect2, x, y);
393 evas_object_resize(result_info->rect2, w / 10.0, h);
394 evas_object_color_set(result_info->rect2, 0, 0, 0, 255);
395 evas_object_show(result_info->rect2);
397 evas_object_hide(result_info->rect2);
400 start_x = (result_info->start / 24.0f) * w + x;
402 evas_object_move(result_info->rect1, start_x, y);
403 evas_object_resize(result_info->rect1, x + w - start_x, h);
404 evas_object_color_set(result_info->rect1, 0, 0, 0, 255);
405 evas_object_show(result_info->rect1);
408 static void _item_group_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
410 item_destroy_group(obj);
413 static void _item_group_down_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
415 _D("An item is down");
418 static void _item_group_up_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
420 Evas_Object *item = obj;
421 Evas_Object *selecting_item = NULL;
422 main_view_s *main_view_info = data;
423 struct tm *local_time = NULL;
429 ret_if(!main_view_info);
430 ret_if(!main_view_info->city_list);
432 _D("An item is selected");
435 local_time = localtime(&t);
437 count = scroller_count_item(main_view_info->city_list);
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);
446 city = (int) evas_object_data_get(item, DATA_KEY_CITY);
447 selecting_item = item_create_selecting(main_view_info->city_list, city, local_time, main_view_info);
448 ret_if(!selecting_item);
450 scroller_append_item(main_view_info->city_list, selecting_item);
453 Evas_Object *item_create_group(Evas_Object *parent, const char *title, main_view_s *main_view_info)
455 Evas_Object *item = NULL;
458 char full_path[PATH_LEN] = {0, };
460 retv_if(!parent, NULL);
462 path = app_get_resource_path();
463 retv_if(!path, NULL);
465 snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ITEM_EDJE);
468 item = elm_layout_add(parent);
469 retv_if(!item, NULL);
471 elm_layout_file_set(item, full_path, "item_group");
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);
479 evas_object_show(item);
481 elm_object_part_text_set(item, "city", title);
486 void item_destroy_group(Evas_Object *item)
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);
494 evas_object_del(item);
497 static void _item_padding_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
499 item_destroy_padding(obj);
502 Evas_Object *item_create_padding(Evas_Object *parent)
504 Evas_Object *item = NULL;
505 city_s *city_info = NULL;
508 char full_path[PATH_LEN] = {0, };
509 char city_str[PATH_LEN] = {0, };
511 retv_if(!parent, NULL);
513 path = app_get_resource_path();
514 retv_if(!path, NULL);
516 snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ITEM_EDJE);
519 item = elm_layout_add(parent);
520 retv_if(!item, NULL);
522 elm_layout_file_set(item, full_path, "item_padding");
524 evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
525 evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
526 evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_padding_del_cb, NULL);
528 evas_object_show(item);
533 void item_destroy_padding(Evas_Object *item)
536 evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_padding_del_cb);
537 evas_object_del(item);
540 static void _item_best_time_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
542 item_destroy_best_time(obj);
545 Evas_Object *item_create_best_time(Evas_Object *parent)
547 Evas_Object *item = NULL;
548 city_s *city_info = NULL;
551 char full_path[PATH_LEN] = {0, };
552 char city_str[PATH_LEN] = {0, };
554 retv_if(!parent, NULL);
556 path = app_get_resource_path();
557 retv_if(!path, NULL);
559 snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, BEST_TIME_EDJE);
562 item = elm_layout_add(parent);
563 retv_if(!item, NULL);
565 elm_layout_file_set(item, full_path, "best_time");
567 evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
568 evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
569 evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_best_time_del_cb, NULL);
571 elm_object_part_text_set(item, "city", "Best time");
573 evas_object_show(item);
578 void item_destroy_best_time(Evas_Object *item)
581 evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_best_time_del_cb);
582 evas_object_del(item);