1 #include <Elementary.h>
2 #include <system_settings.h>
14 #include "main_view.h"
18 #include "notification.h"
19 #include "group_info.h"
22 #define _EDJ(o) elm_layout_edje_get(o)
24 const char *const DATA_KEY_CITY = "city";
25 const char *const DATA_KEY_MAIN_VIEW_INFO = "mvi";
27 const char *const ITEM_EDJE = "item.edj";
28 const char *const BEST_TIME_EDJE = "best_time.edj";
29 const char *const ITEM2_EDJE = "item2.edj";
30 static int color_index[MAXIMUM_SELECTED_CITY] = { 0, 0, 0, 0, 0 };
32 void item_reset_color_index(void)
35 for (; i < MAXIMUM_SELECTED_CITY; i++) {
36 if (EINA_FALSE == remove_city_from_map(i))
37 _E("cannot remove the city");
43 static double _get_local_timezone(void)
45 struct tm *local_time = NULL;
46 double timezone = 0.0f;
51 local_time = localtime(&t);
52 retv_if(!local_time, 0.0f);
54 timezone = (double) (local_time->tm_gmtoff / 3600l);
59 void _text_set_here_time(Evas_Object *item, const char *part)
61 char *timezone_str = NULL;
62 struct tm *local_time = NULL;
64 int ret = SYSTEM_SETTINGS_ERROR_NONE;
66 char time_result[PATH_LEN] = {0, };
71 local_time = localtime(&t);
74 ret = system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_TIMEZONE, &timezone_str);
75 if (ret != SYSTEM_SETTINGS_ERROR_NONE)
76 _E("cannot get the timezone string");
81 if (local_time->tm_gmtoff >= 0l)
82 snprintf(time_result, sizeof(time_result), "%s, +%ld", timezone_str, local_time->tm_gmtoff / 3600l);
84 snprintf(time_result, sizeof(time_result), "%s, %ld", timezone_str, local_time->tm_gmtoff / 3600l);
88 elm_object_part_text_set(item, part, timezone_str);
91 static void _item_typing_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
93 item_destroy_typing(obj);
96 static void _item_typing_down_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
98 _D("An item is down");
101 static void _item_typing_up_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
103 Evas_Object *item = obj;
104 Evas_Object *selecting_item = NULL;
105 Evas_Object *entry = NULL;
106 main_view_s *main_view_info = data;
107 struct tm *local_time = NULL;
113 ret_if(!main_view_info);
114 ret_if(!main_view_info->city_list);
116 _D("An item is selected");
119 local_time = localtime(&t);
121 if (scroller_is_scrolling(main_view_info->searchlist))
124 count = scroller_count_item(main_view_info->city_list);
125 if (count + 1 > MAXIMUM_SELECTED_CITY) {
126 _D("Cities selected are limited.");
127 notification_status_message_post("Maximum number of cities reached");
131 city = (int) evas_object_data_get(item, DATA_KEY_CITY);
132 selecting_item = item_create_selecting(main_view_info->city_list, city, local_time, main_view_info);
133 ret_if(!selecting_item);
134 scroller_append_item(main_view_info->city_list, selecting_item);
138 elm_object_signal_emit(main_view_info->main_view, "momentic,state,add_description,hide", "");
139 elm_object_signal_emit(main_view_info->main_view, "momentic,state,next_btn,show", "");
141 elm_object_signal_emit(main_view_info->main_view, "momentic,state,add_description,show", "");
142 elm_object_signal_emit(main_view_info->main_view, "momentic,state,next_btn,hide", "");
145 entry = elm_object_part_content_get(main_view_info->searchbar, "entry");
146 elm_entry_entry_set(entry, "");
147 elm_object_focus_set(main_view_info->next_btn, EINA_TRUE);
150 Evas_Object *item_create_typing(Evas_Object *parent, int city, main_view_s *main_view_info)
152 Evas_Object *item = NULL;
153 city_s *city_info = NULL;
156 char full_path[PATH_LEN] = {0, };
157 char city_str[PATH_LEN] = {0, };
159 retv_if(!parent, NULL);
161 path = app_get_resource_path();
162 retv_if(!path, NULL);
164 snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ITEM_EDJE);
167 item = elm_layout_add(parent);
168 retv_if(!item, NULL);
170 elm_layout_file_set(item, full_path, "item_typing");
172 evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
173 evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
174 evas_object_data_set(item, DATA_KEY_CITY, (void *) city);
175 evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_typing_del_cb, NULL);
176 elm_object_signal_callback_add(item, "down", "item", _item_typing_down_cb, NULL);
177 elm_object_signal_callback_add(item, "up", "item", _item_typing_up_cb, main_view_info);
179 evas_object_show(item);
182 elm_object_part_text_set(item, "city", "No results");
183 elm_object_signal_emit(item, "disable", "item");
187 city_info = city_get();
189 _E("Critical, no city information");
190 evas_object_del(item);
194 snprintf(city_str, sizeof(city_str), "%s, %s", city_info[city].name, city_info[city].nation);
195 elm_object_part_text_set(item, "city", city_str);
200 void item_destroy_typing(Evas_Object *item)
204 evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_typing_del_cb);
205 elm_object_signal_callback_del(item, "down", "item", _item_typing_down_cb);
206 elm_object_signal_callback_del(item, "up", "item", _item_typing_up_cb);
208 evas_object_data_del(item, DATA_KEY_CITY);
209 evas_object_del(item);
212 static void _item_selecting_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
214 item_destroy_selecting(obj);
217 static void _delete_selecting_item_cb(void *data, Evas_Object *obj, void *event_info)
219 main_view_s *main_view_info = NULL;
220 Evas_Object *item = data;
223 _D("clicked, delete the selected item");
227 main_view_info = evas_object_data_get(item, DATA_KEY_MAIN_VIEW_INFO);
228 ret_if(!main_view_info);
230 item_destroy_selecting(item);
232 count = scroller_count_item(main_view_info->city_list);
234 elm_object_signal_emit(main_view_info->main_view, "momentic,state,add_description,hide", "");
235 elm_object_signal_emit(main_view_info->main_view, "momentic,state,next_btn,show", "");
237 elm_object_signal_emit(main_view_info->main_view, "momentic,state,add_description,show", "");
238 elm_object_signal_emit(main_view_info->main_view, "momentic,state,next_btn,hide", "");
242 void _text_set_local_time(Evas_Object *item, const char *part, int city, struct tm *local_time)
244 city_s *city_info = NULL;
245 int hour = local_time->tm_hour;
246 int minute = local_time->tm_min;
248 char time_result[PATH_LEN] = {0, };
253 city_info = city_get();
256 if (((double) ((int) city_info[city].timezone)) < city_info[city].timezone) {
264 hour -= local_time->tm_gmtoff / 3600l;
265 hour += (int) city_info[city].timezone;
266 _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);
272 snprintf(time_result, sizeof(time_result), "%2d:%02d", hour, minute);
273 elm_object_part_text_set(item, part, time_result);
276 Evas_Object *item_create_selecting(Evas_Object *parent, int city, struct tm *local_time, main_view_s *main_view_info)
278 Evas_Object *item = NULL;
279 Evas_Object *btn = NULL;
280 city_s *city_info = NULL;
281 selecting_info_s *selecting_info = NULL;
284 char full_path[PATH_LEN] = {0, };
285 char city_str[PATH_LEN] = {0, };
286 char gmt_str[PATH_LEN] = {0, };
287 char color_str[16] = {0, };
289 retv_if(!parent, NULL);
291 city_info = city_get();
292 goto_if(!city_info, error);
295 for (i = 0; i < MAXIMUM_SELECTED_CITY; i++) {
296 if (color_index[i]) continue;
298 if (EINA_FALSE == add_city_to_map(i, &city_info[city])) {
299 _E("cannot add a city to the map");
305 path = app_get_resource_path();
306 retv_if(!path, NULL);
308 snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ITEM2_EDJE);
311 selecting_info = calloc(1, sizeof(selecting_info_s));
312 retv_if(!selecting_info, NULL);
313 selecting_info->city = city;
314 selecting_info->color = i;
316 item = elm_layout_add(parent);
317 retv_if(!item, NULL);
319 elm_layout_file_set(item, full_path, "item");
321 evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
322 evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
323 evas_object_data_set(item, DATA_KEY_MAIN_VIEW_INFO, main_view_info);
324 evas_object_data_set(item, DATA_KEY_SELECTING, selecting_info);
325 evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_selecting_del_cb, NULL);
326 evas_object_show(item);
328 btn = elm_button_add(item);
330 elm_object_style_set(btn, "transparent");
331 elm_object_part_content_set(item, "delete_event", btn);
332 evas_object_smart_callback_add(btn, "clicked", _delete_selecting_item_cb, item);
333 evas_object_show(btn);
336 snprintf(city_str, sizeof(city_str), "%s, %s", city_info[city].name, city_info[city].nation);
337 elm_object_part_text_set(item, "city", city_str);
339 if (city_info[city].timezone > 0)
340 snprintf(gmt_str, sizeof(gmt_str), "GMT +%.1f", city_info[city].timezone);
342 snprintf(gmt_str, sizeof(gmt_str), "GMT %.1f", city_info[city].timezone);
344 elm_object_part_text_set(item, "gmt", gmt_str);
345 _text_set_local_time(item, "time", city, local_time);
347 if (set_marker(item, i) == EINA_FALSE)
348 _E("cannot set the marker");
356 evas_object_del(item);
359 free(selecting_info);
364 void item_destroy_selecting(Evas_Object *item)
366 selecting_info_s *selecting_info = NULL;
370 evas_object_data_del(item, DATA_KEY_MAIN_VIEW_INFO);
371 selecting_info = evas_object_data_del(item, DATA_KEY_SELECTING);
372 if (selecting_info) {
373 if (EINA_FALSE == remove_city_from_map(selecting_info->color))
374 _E("cannot remove the city");
376 color_index[selecting_info->color] = 0;
377 free(selecting_info);
380 evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_selecting_del_cb);
381 evas_object_del(item);
384 static void _resize_graph_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
386 result_info_s *result_info = NULL;
390 result_info = evas_object_data_get(obj, DATA_KEY_RESULT);
391 ret_if(!result_info);
393 edje_object_part_geometry_get(_EDJ(obj), "graph_base", &x, &y, &w, &h);
395 if (result_info->start > result_info->end) {
396 evas_object_move(result_info->rect2, x, y);
397 evas_object_resize(result_info->rect2, w / 10.0, h);
398 evas_object_color_set(result_info->rect2, 0, 0, 0, 255);
399 evas_object_show(result_info->rect2);
401 evas_object_hide(result_info->rect2);
404 start_x = (result_info->start / 24.0f) * w + x;
406 evas_object_move(result_info->rect1, start_x, y);
407 evas_object_resize(result_info->rect1, x + w - start_x, h);
408 evas_object_color_set(result_info->rect1, 0, 0, 0, 255);
409 evas_object_show(result_info->rect1);
412 static void _item_group_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
414 item_destroy_group(obj);
417 static void _item_group_down_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
419 _D("An item is down");
422 static void _item_group_up_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
424 Evas_Object *item = obj;
425 Evas_Object *selecting_item = NULL;
426 main_view_s *main_view_info = data;
427 group_info_s *group_info = NULL;
428 struct tm *local_time = NULL;
434 ret_if(!main_view_info);
435 ret_if(!main_view_info->city_list);
437 _D("An item is selected");
439 scroller_clear_item(main_view_info->city_list);
441 group_info = evas_object_data_get(item, GROUP_INFO);
445 local_time = localtime(&t);
447 for (i = 0; i < MAXIMUM_SELECTED_CITY; i++) {
448 if (!group_info->city[i]) {
449 _D("No city anymore");
452 selecting_item = item_create_selecting(main_view_info->city_list, group_info->city[i], local_time, main_view_info);
453 break_if(!selecting_item);
454 scroller_append_item(main_view_info->city_list, selecting_item);
458 //elm_object_signal_emit(main_view_info->main_view, "momentic,state,go_result_page", "");
459 //elm_object_signal_emit(main_view_info->main_view, "momentic,state,add_description,hide", "");
460 //elm_object_signal_emit(main_view_info->main_view, "momentic,state,drawer,hide", "");
461 //elm_object_signal_emit(main_view_info->main_view, "momentic,state,page2", "");
463 //main_view_click_add_btn_cb(main_view_info, NULL, NULL);
464 //main_view_click_next_btn_cb(main_view_info, NULL, NULL);
467 static void _delete_group_item_cb(void *data, Evas_Object *obj, void *event_info)
469 main_view_s *main_view_info = NULL;
470 Evas_Object *item = data;
471 group_info_s *group_info = NULL;
474 _D("clicked, delete the group item");
478 main_view_info = evas_object_data_get(item, DATA_KEY_MAIN_VIEW_INFO);
479 ret_if(!main_view_info);
481 group_info = evas_object_data_get(item, GROUP_INFO);
484 db_delete_group(main_view_info->moment_info->db, group_info->id);
485 main_view_info->moment_info->group_list = eina_list_remove(main_view_info->moment_info->group_list, group_info);
486 group_info_destroy(group_info);
488 item_destroy_group(item);
490 count = scroller_count_item(main_view_info->group_scroller);
492 elm_object_signal_emit(main_view_info->main_view, "momentic,state,drawer,noresult,show", "");
498 Evas_Object *item_create_group(Evas_Object *parent, group_info_s *group_info, main_view_s *main_view_info)
500 Evas_Object *item = NULL;
501 Evas_Object *btn = NULL;
504 char full_path[PATH_LEN] = {0, };
506 retv_if(!parent, NULL);
508 path = app_get_resource_path();
509 retv_if(!path, NULL);
511 snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ITEM_EDJE);
514 item = elm_layout_add(parent);
515 retv_if(!item, NULL);
517 elm_layout_file_set(item, full_path, "item_group");
518 evas_object_data_set(item, GROUP_INFO, group_info);
519 evas_object_data_set(item, DATA_KEY_MAIN_VIEW_INFO, main_view_info);
521 evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
522 evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
523 evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_group_del_cb, NULL);
524 elm_object_signal_callback_add(item, "down", "item", _item_group_down_cb, NULL);
525 elm_object_signal_callback_add(item, "up", "item", _item_group_up_cb, main_view_info);
527 evas_object_show(item);
529 btn = elm_button_add(item);
531 elm_object_style_set(btn, "transparent");
532 elm_object_part_content_set(item, "delete_event", btn);
533 evas_object_smart_callback_add(btn, "clicked", _delete_group_item_cb, item);
534 evas_object_show(btn);
537 elm_object_part_text_set(item, "title", group_info->title);
542 void item_destroy_group(Evas_Object *item)
546 evas_object_data_del(item, GROUP_INFO);
547 evas_object_data_del(item, DATA_KEY_MAIN_VIEW_INFO);
548 evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_group_del_cb);
549 elm_object_signal_callback_del(item, "down", "item", _item_group_down_cb);
550 elm_object_signal_callback_del(item, "up", "item", _item_group_up_cb);
552 evas_object_del(item);
555 static void _item_padding_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
557 item_destroy_padding(obj);
560 Evas_Object *item_create_padding(Evas_Object *parent)
562 Evas_Object *item = NULL;
563 city_s *city_info = NULL;
566 char full_path[PATH_LEN] = {0, };
567 char city_str[PATH_LEN] = {0, };
569 retv_if(!parent, NULL);
571 path = app_get_resource_path();
572 retv_if(!path, NULL);
574 snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ITEM_EDJE);
577 item = elm_layout_add(parent);
578 retv_if(!item, NULL);
580 elm_layout_file_set(item, full_path, "item_padding");
582 evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
583 evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
584 evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_padding_del_cb, NULL);
586 evas_object_show(item);
591 void item_destroy_padding(Evas_Object *item)
594 evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_padding_del_cb);
595 evas_object_del(item);
598 static void _item_best_time_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
600 item_destroy_best_time(obj);
603 Evas_Object *item_create_best_time(Evas_Object *parent, double start, double end)
605 Evas_Object *item = NULL;
606 city_s *city_info = NULL;
609 char full_path[PATH_LEN] = {0, };
610 char time_str[PATH_LEN] = {0, };
612 double start1, start2, end1, end2;
616 retv_if(!parent, NULL);
618 path = app_get_resource_path();
619 retv_if(!path, NULL);
621 snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, BEST_TIME_EDJE);
624 item = elm_layout_add(parent);
625 retv_if(!item, NULL);
627 elm_layout_file_set(item, full_path, "best_time");
629 evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
630 evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
631 evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_best_time_del_cb, NULL);
633 elm_object_part_text_set(item, "city", "Best time");
635 evas_object_show(item);
638 elm_object_part_text_set(item, "time", "No matched time");
643 if (tmp == start) half = 0.0f;
647 start = ((double) tmp) + half;
650 if (tmp == end) half = 0.0f;
654 end = ((double) tmp) + half;
656 _D("HELLO, Best,%f:%f", start, end);
658 int start_hour = start;
659 int start_minute = (start_hour == start)? 0 : 30;
661 int end_minute = (end_hour == end)? 0 : 30;
663 snprintf(time_str, sizeof(time_str), "%d:%02d - %d:%02d", start_hour, start_minute, end_hour, end_minute);
664 elm_object_part_text_set(item, "time", time_str);
665 if (set_time_range(item, 5, start, end, 0.0f, 0.0f) == EINA_FALSE)
666 _E("cannot set time range");
672 void item_destroy_best_time(Evas_Object *item)
675 evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_best_time_del_cb);
676 evas_object_del(item);