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 };
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, };
288 retv_if(!parent, NULL);
290 city_info = city_get();
291 goto_if(!city_info, error);
294 for (i = 0; i < MAXIMUM_SELECTED_CITY; i++) {
295 if (color_index[i]) continue;
297 if (EINA_FALSE == add_city_to_map(i, &city_info[city])) {
298 _E("cannot add a city to the map");
304 path = app_get_resource_path();
305 retv_if(!path, NULL);
307 snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ITEM2_EDJE);
310 selecting_info = calloc(1, sizeof(selecting_info_s));
311 retv_if(!selecting_info, NULL);
312 selecting_info->city = city;
313 selecting_info->color = i;
315 item = elm_layout_add(parent);
316 retv_if(!item, NULL);
318 elm_layout_file_set(item, full_path, "item");
320 evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
321 evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
322 evas_object_data_set(item, DATA_KEY_MAIN_VIEW_INFO, main_view_info);
323 evas_object_data_set(item, DATA_KEY_SELECTING, selecting_info);
324 evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_selecting_del_cb, NULL);
325 evas_object_show(item);
327 btn = elm_button_add(item);
329 elm_object_style_set(btn, "transparent");
330 elm_object_part_content_set(item, "delete_event", btn);
331 evas_object_smart_callback_add(btn, "clicked", _delete_selecting_item_cb, item);
332 evas_object_show(btn);
335 snprintf(city_str, sizeof(city_str), "%s, %s", city_info[city].name, city_info[city].nation);
336 elm_object_part_text_set(item, "city", city_str);
338 if (city_info[city].timezone > 0)
339 snprintf(gmt_str, sizeof(gmt_str), "GMT +%.1f", city_info[city].timezone);
341 snprintf(gmt_str, sizeof(gmt_str), "GMT %.1f", city_info[city].timezone);
343 elm_object_part_text_set(item, "gmt", gmt_str);
344 _text_set_local_time(item, "time", city, local_time);
346 if (set_marker(item, i) == EINA_FALSE)
347 _E("cannot set the marker");
355 evas_object_del(item);
358 free(selecting_info);
363 void item_destroy_selecting(Evas_Object *item)
365 selecting_info_s *selecting_info = NULL;
369 evas_object_data_del(item, DATA_KEY_MAIN_VIEW_INFO);
370 selecting_info = evas_object_data_del(item, DATA_KEY_SELECTING);
371 if (selecting_info) {
372 _D("HELLO, REMOVE!!");
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 Eina_Bool _item_group_up_timer_cb(void *data)
424 Evas_Object *item = data;
425 Evas_Object *selecting_item = NULL;
426 main_view_s *main_view_info = NULL;
427 group_info_s *group_info = NULL;
428 struct tm *local_time = NULL;
432 retv_if(!item, ECORE_CALLBACK_CANCEL);
434 main_view_info = evas_object_data_get(item, DATA_KEY_MAIN_VIEW_INFO);
435 retv_if(!main_view_info, ECORE_CALLBACK_CANCEL);
436 retv_if(!main_view_info->city_list, ECORE_CALLBACK_CANCEL);
438 group_info = evas_object_data_get(item, GROUP_INFO);
439 retv_if(!group_info, ECORE_CALLBACK_CANCEL);
442 local_time = localtime(&t);
444 for (i = 0; i < MAXIMUM_SELECTED_CITY; i++) {
445 if (!group_info->city[i]) {
446 _D("No city anymore");
449 selecting_item = item_create_selecting(main_view_info->city_list, group_info->city[i], local_time, main_view_info);
450 break_if(!selecting_item);
451 scroller_append_item(main_view_info->city_list, selecting_item);
454 main_view_go_result(main_view_info);
456 elm_object_signal_emit(main_view_info->main_view, "momentic,state,drawer,hide", "");
457 //elm_object_signal_emit(main_view_info->main_view, "momentic,state,drawer_btn,hide", "");
458 elm_object_signal_emit(main_view_info->main_view, "momentic,state,result,show", "");
459 elm_object_signal_emit(main_view_info->main_view, "momentic,state,add_description,hide", "");
462 return ECORE_CALLBACK_CANCEL;
465 static void _item_group_up_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
467 main_view_s *main_view_info = data;
468 ret_if(!main_view_info);
469 ret_if(!main_view_info->city_list);
471 scroller_clear_item(main_view_info->city_list);
473 ecore_timer_add(0.4, _item_group_up_timer_cb, obj);
476 static void _delete_group_item_cb(void *data, Evas_Object *obj, void *event_info)
478 main_view_s *main_view_info = NULL;
479 Evas_Object *item = data;
480 group_info_s *group_info = NULL;
483 _D("clicked, delete the group item");
487 main_view_info = evas_object_data_get(item, DATA_KEY_MAIN_VIEW_INFO);
488 ret_if(!main_view_info);
490 group_info = evas_object_data_get(item, GROUP_INFO);
493 db_delete_group(main_view_info->moment_info->db, group_info->id);
494 main_view_info->moment_info->group_list = eina_list_remove(main_view_info->moment_info->group_list, group_info);
495 group_info_destroy(group_info);
497 item_destroy_group(item);
499 count = scroller_count_item(main_view_info->group_scroller);
501 elm_object_signal_emit(main_view_info->main_view, "momentic,state,drawer,noresult,show", "");
507 Evas_Object *item_create_group(Evas_Object *parent, group_info_s *group_info, main_view_s *main_view_info)
509 Evas_Object *item = NULL;
510 Evas_Object *btn = NULL;
513 char full_path[PATH_LEN] = {0, };
515 retv_if(!parent, NULL);
517 path = app_get_resource_path();
518 retv_if(!path, NULL);
520 snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ITEM_EDJE);
523 item = elm_layout_add(parent);
524 retv_if(!item, NULL);
526 elm_layout_file_set(item, full_path, "item_group");
527 evas_object_data_set(item, GROUP_INFO, group_info);
528 evas_object_data_set(item, DATA_KEY_MAIN_VIEW_INFO, main_view_info);
530 evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
531 evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
532 evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_group_del_cb, NULL);
533 elm_object_signal_callback_add(item, "down", "item", _item_group_down_cb, NULL);
534 elm_object_signal_callback_add(item, "up", "item", _item_group_up_cb, main_view_info);
536 evas_object_show(item);
538 btn = elm_button_add(item);
540 elm_object_style_set(btn, "transparent");
541 elm_object_part_content_set(item, "delete_event", btn);
542 evas_object_smart_callback_add(btn, "clicked", _delete_group_item_cb, item);
543 evas_object_show(btn);
546 elm_object_part_text_set(item, "title", group_info->title);
551 void item_destroy_group(Evas_Object *item)
555 evas_object_data_del(item, GROUP_INFO);
556 evas_object_data_del(item, DATA_KEY_MAIN_VIEW_INFO);
557 evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_group_del_cb);
558 elm_object_signal_callback_del(item, "down", "item", _item_group_down_cb);
559 elm_object_signal_callback_del(item, "up", "item", _item_group_up_cb);
561 evas_object_del(item);
564 static void _item_padding_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
566 item_destroy_padding(obj);
569 Evas_Object *item_create_padding(Evas_Object *parent)
571 Evas_Object *item = NULL;
574 char full_path[PATH_LEN] = {0, };
576 retv_if(!parent, NULL);
578 path = app_get_resource_path();
579 retv_if(!path, NULL);
581 snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ITEM_EDJE);
584 item = elm_layout_add(parent);
585 retv_if(!item, NULL);
587 elm_layout_file_set(item, full_path, "item_padding");
589 evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
590 evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
591 evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_padding_del_cb, NULL);
593 evas_object_show(item);
598 void item_destroy_padding(Evas_Object *item)
601 evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_padding_del_cb);
602 evas_object_del(item);
605 static void _item_best_time_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
607 item_destroy_best_time(obj);
610 Evas_Object *item_create_best_time(Evas_Object *parent, double start, double end)
612 Evas_Object *item = NULL;
615 char full_path[PATH_LEN] = {0, };
616 char time_str[PATH_LEN] = {0, };
621 retv_if(!parent, NULL);
623 path = app_get_resource_path();
624 retv_if(!path, NULL);
626 snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, BEST_TIME_EDJE);
629 item = elm_layout_add(parent);
630 retv_if(!item, NULL);
632 elm_layout_file_set(item, full_path, "best_time");
634 evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
635 evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
636 evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_best_time_del_cb, NULL);
638 elm_object_part_text_set(item, "city", "Best time");
640 evas_object_show(item);
643 elm_object_part_text_set(item, "time", "No matched time");
648 if (tmp == start) half = 0.0f;
652 start = ((double) tmp) + half;
655 if (tmp == end) half = 0.0f;
659 end = ((double) tmp) + half;
661 _D("HELLO, Best,%f:%f", start, end);
663 int start_hour = start;
664 int start_minute = (start_hour == start)? 0 : 30;
666 int end_minute = (end_hour == end)? 0 : 30;
668 snprintf(time_str, sizeof(time_str), "%d:%02d - %d:%02d", start_hour, start_minute, end_hour, end_minute);
669 elm_object_part_text_set(item, "time", time_str);
670 if (set_time_range(item, 5, start, end, 0.0f, 0.0f) == EINA_FALSE)
671 _E("cannot set time range");
677 void item_destroy_best_time(Evas_Object *item)
680 evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_best_time_del_cb);
681 evas_object_del(item);