Version : 0813
[apps/native/sample/adventure.git] / src / item.c
index b318b06..0318c0f 100644 (file)
@@ -4,6 +4,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <app.h>
+#include <time.h>
 
 #include "log.h"
 #include "conf.h"
 #include "map.h"
 
 #define _EDJ(o) elm_layout_edje_get(o)
-#define MAX_CITY 5
 
 const char *const DATA_KEY_CITY = "city";
 const char *const DATA_KEY_MAIN_VIEW_INFO = "mvi";
 
 const char *const ITEM_EDJE = "item.edj";
-static int color_index[MAX_CITY] = { 0, 0, 0, 0, 0 };
+const char *const BEST_TIME_EDJE = "best_time.edj";
+const char *const ITEM2_EDJE = "item2.edj";
+static int color_index[MAXIMUM_SELECTED_CITY] = { 0, 0, 0, 0, 0 };
+
+void item_reset_color_index(void)
+{
+       register int i = 0;
+       for (; i < MAXIMUM_SELECTED_CITY; i++) {
+               if (EINA_FALSE == remove_city_from_map(i))
+                       _E("cannot remove the city");
+
+               color_index[i] = 0;
+       }
+}
+
+static double _get_local_timezone(void)
+{
+       struct tm *local_time = NULL;
+       double timezone = 0.0f;
+       time_t t;
+
+       time(&t);
+
+       local_time = localtime(&t);
+       retv_if(!local_time, 0.0f);
+
+       timezone = (double) (local_time->tm_gmtoff / 3600l);
+_D("HELLO, gmtoff:%d", local_time->tm_gmtoff / 3600l);
+
+       return timezone;
+}
 
 void _text_set_here_time(Evas_Object *item, const char *part)
 {
@@ -46,10 +76,10 @@ void _text_set_here_time(Evas_Object *item, const char *part)
        /* Timezone
           Asia/Seoul
         */
-       if (local_time->tm_gmtoff >= 0)
-               snprintf(time_result, sizeof(time_result), "%s, +%ld", timezone_str, local_time->tm_gmtoff / 3600);
+       if (local_time->tm_gmtoff >= 0l)
+               snprintf(time_result, sizeof(time_result), "%s, +%ld", timezone_str, local_time->tm_gmtoff / 3600l);
        else
-               snprintf(time_result, sizeof(time_result), "%s, %ld", timezone_str, local_time->tm_gmtoff / 3600);
+               snprintf(time_result, sizeof(time_result), "%s, %ld", timezone_str, local_time->tm_gmtoff / 3600l);
 
        free(timezone_str);
 
@@ -71,8 +101,10 @@ static void _item_typing_up_cb(void *data, Evas_Object *obj, const char *emissio
        Evas_Object *item = obj;
        Evas_Object *selecting_item = NULL;
        main_view_s *main_view_info = data;
+       struct tm *local_time = NULL;
        int city = 0;
        int count = 0;
+       time_t t = 0;
 
        ret_if(!item);
        ret_if(!main_view_info);
@@ -80,6 +112,9 @@ static void _item_typing_up_cb(void *data, Evas_Object *obj, const char *emissio
 
        _D("An item is selected");
 
+       time(&t);
+       local_time = localtime(&t);
+
        if (scroller_is_scrolling(main_view_info->searchlist))
                return;
 
@@ -93,7 +128,7 @@ static void _item_typing_up_cb(void *data, Evas_Object *obj, const char *emissio
        }
 
        city = (int) evas_object_data_get(item, DATA_KEY_CITY);
-       selecting_item = item_create_selecting(main_view_info->city_list, city, 0, main_view_info);
+       selecting_item = item_create_selecting(main_view_info->city_list, city, local_time, main_view_info);
        ret_if(!selecting_item);
        scroller_append_item(main_view_info->city_list, selecting_item);
        count++;
@@ -179,7 +214,6 @@ static void _delete_selecting_item_cb(void *data, Evas_Object *obj, void *event_
        main_view_s *main_view_info = NULL;
        Evas_Object *item = data;
        int count = 0;
-       int ci = 0;
 
        _D("clicked, delete the selected item");
 
@@ -188,12 +222,6 @@ static void _delete_selecting_item_cb(void *data, Evas_Object *obj, void *event_
        main_view_info = evas_object_data_get(item, DATA_KEY_MAIN_VIEW_INFO);
        ret_if(!main_view_info);
 
-       ci = (int) evas_object_data_get(item, "color_index");
-
-       if (EINA_FALSE == remove_city_from_map(ci))
-               _E("cannot remove the city");
-
-       color_index[ci] = 0;
        item_destroy_selecting(item);
 
        count = scroller_count_item(main_view_info->city_list);
@@ -206,7 +234,41 @@ static void _delete_selecting_item_cb(void *data, Evas_Object *obj, void *event_
        }
 }
 
-Evas_Object *item_create_selecting(Evas_Object *parent, int city, int color, main_view_s *main_view_info)
+void _text_set_local_time(Evas_Object *item, const char *part, int city, struct tm *local_time)
+{
+       city_s *city_info = NULL;
+       int hour = local_time->tm_hour;
+       int minute = local_time->tm_min;
+
+       char time_result[PATH_LEN] = {0, };
+
+       ret_if(!item);
+       ret_if(!part);
+
+       city_info = city_get();
+       ret_if(!city_info);
+
+       if (((double) ((int) city_info[city].timezone)) < city_info[city].timezone) {
+               minute += 30;
+               if (minute > 60) {
+                       hour++;
+                       minute -= 60;
+               }
+       }
+
+       hour -= local_time->tm_gmtoff / 3600l;
+       hour += (int) city_info[city].timezone;
+       _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);
+       if (hour < 0)
+               hour += 24;
+
+       hour %= 24;
+
+       snprintf(time_result, sizeof(time_result), "%2d:%02d", hour, minute);
+       elm_object_part_text_set(item, part, time_result);
+}
+
+Evas_Object *item_create_selecting(Evas_Object *parent, int city, struct tm *local_time, main_view_s *main_view_info)
 {
        Evas_Object *item = NULL;
        Evas_Object *btn = NULL;
@@ -225,9 +287,10 @@ Evas_Object *item_create_selecting(Evas_Object *parent, int city, int color, mai
        goto_if(!city_info, error);
 
        int i = 0;
-       for (i = 0; i < MAX_CITY; i++) {
+       for (i = 0; i < MAXIMUM_SELECTED_CITY; i++) {
                if (color_index[i]) continue;
 
+               _D("HELLO, i : %d, city : %d", i, city);
                if (EINA_FALSE == add_city_to_map(i, &city_info[city])) {
                        _E("cannot add a city to the map");
                        return NULL;
@@ -238,18 +301,18 @@ Evas_Object *item_create_selecting(Evas_Object *parent, int city, int color, mai
        path = app_get_resource_path();
        retv_if(!path, NULL);
 
-       snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ITEM_EDJE);
+       snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ITEM2_EDJE);
        free(path);
 
        selecting_info = calloc(1, sizeof(selecting_info_s));
        retv_if(!selecting_info, NULL);
        selecting_info->city = city;
-       selecting_info->color = color;
+       selecting_info->color = i;
 
        item = elm_layout_add(parent);
        retv_if(!item, NULL);
 
-       elm_layout_file_set(item, full_path, "item_selecting");
+       elm_layout_file_set(item, full_path, "item");
 
        evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
        evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
@@ -258,9 +321,6 @@ Evas_Object *item_create_selecting(Evas_Object *parent, int city, int color, mai
        evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_selecting_del_cb, NULL);
        evas_object_show(item);
 
-       evas_object_data_set(item, "color_index", (void *) i);
-       color_index[i] = 1;
-
        btn = elm_button_add(item);
        if (btn) {
                elm_object_style_set(btn, "transparent");
@@ -278,11 +338,12 @@ Evas_Object *item_create_selecting(Evas_Object *parent, int city, int color, mai
                snprintf(gmt_str, sizeof(gmt_str), "GMT %.1f", city_info[city].timezone);
 
        elm_object_part_text_set(item, "gmt", gmt_str);
+       _text_set_local_time(item, "time", city, local_time);
 
-       if (color) {
-               snprintf(color_str, sizeof(color_str), "%d", color);
-               elm_object_signal_emit(item, color_str, "mark");
-       }
+       if (set_marker(item, i) == EINA_FALSE)
+               _E("cannot set the marker");
+
+       color_index[i] = 1;
 
        return item;
 
@@ -304,38 +365,16 @@ void item_destroy_selecting(Evas_Object *item)
 
        evas_object_data_del(item, DATA_KEY_MAIN_VIEW_INFO);
        selecting_info = evas_object_data_del(item, DATA_KEY_SELECTING);
-       evas_object_data_del(item, "color_index");
-       free(selecting_info);
+       if (selecting_info) {
+               if (EINA_FALSE == remove_city_from_map(selecting_info->color))
+                       _E("cannot remove the city");
 
-       evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_selecting_del_cb);
-
-       evas_object_del(item);
-}
-
-void _text_set_local_time(Evas_Object *item, const char *part, int city, struct tm *global_time)
-{
-       city_s *city_info = NULL;
-       int hour = global_time->tm_hour;
-       int minute = global_time->tm_min;
-
-       char time_result[PATH_LEN] = {0, };
-
-       ret_if(!item);
-       ret_if(!part);
-
-       city_info = city_get();
-       ret_if(!city_info);
-
-       if (((double) ((int) city_info[city].timezone)) < city_info[city].timezone) {
-               minute += 30;
-               if (minute > 60) {
-                       hour++;
-                       minute -= 60;
-               }
+               color_index[selecting_info->color] = 0;
+               free(selecting_info);
        }
 
-       snprintf(time_result, sizeof(time_result), "%d:%d", hour, minute);
-       elm_object_part_text_set(item, part, time_result);
+       evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_selecting_del_cb);
+       evas_object_del(item);
 }
 
 static void _resize_graph_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
@@ -366,109 +405,6 @@ static void _resize_graph_cb(void *data, Evas *e, Evas_Object *obj, void *event_
        evas_object_show(result_info->rect1);
 }
 
-static void _item_result_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
-       item_destroy_result(obj);
-}
-
-Evas_Object *item_create_result(Evas_Object *parent, int city, int color, int start, int end, struct tm *global_time)
-{
-       Evas_Object *item = NULL;
-       city_s *city_info = NULL;
-       result_info_s *result_info = NULL;
-       Evas *e = NULL;
-
-       char *path = NULL;
-       char full_path[PATH_LEN] = {0, };
-       char city_str[PATH_LEN] = {0, };
-       char color_str[16] = {0, };
-
-       retv_if(!parent, NULL);
-
-       path = app_get_resource_path();
-       retv_if(!path, NULL);
-
-       snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ITEM_EDJE);
-       free(path);
-
-       result_info = calloc(1, sizeof(result_info_s));
-       retv_if(!result_info, NULL);
-
-       item = elm_layout_add(parent);
-       goto_if(!item, error);
-
-       elm_layout_file_set(item, full_path, "item_result");
-
-       evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-       evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
-       evas_object_data_set(item, DATA_KEY_RESULT, result_info);
-       evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_result_del_cb, NULL);
-       //evas_object_event_callback_add(item, EVAS_CALLBACK_RESIZE, _resize_graph_cb, result_info);
-       //evas_object_event_callback_add(item, EVAS_CALLBACK_MOVE, _resize_graph_cb, result_info);
-       evas_object_show(item);
-
-       city_info = city_get();
-       goto_if(!city_info, error);
-
-       snprintf(city_str, sizeof(city_str), "%s, %s", city_info[city].name, city_info[city].nation);
-       elm_object_part_text_set(item, "city", city_str);
-
-       snprintf(color_str, sizeof(color_str), "%d", color);
-       elm_object_signal_emit(item, color_str, "mark");
-
-       _text_set_local_time(item, "time", city, global_time);
-
-       e = evas_object_evas_get(item);
-       goto_if(!e, error);
-
-       result_info->rect1 = evas_object_rectangle_add(e);
-       goto_if(!result_info->rect1, error);
-
-       result_info->rect2 = evas_object_rectangle_add(e);
-       goto_if(!result_info->rect2, error);
-
-       result_info->city = city;
-       result_info->start = start;
-       result_info->end = end;
-
-       return item;
-
-error:
-       if (result_info) {
-               if (result_info->rect1)
-                       evas_object_del(result_info->rect1);
-               if (result_info->rect2)
-                       evas_object_del(result_info->rect2);
-               free(result_info);
-       }
-
-       if (item)
-               evas_object_del(item);
-
-       free(result_info);
-       return NULL;
-}
-
-void item_destroy_result(Evas_Object *item)
-{
-       result_info_s *result_info = NULL;
-
-       ret_if(!item);
-
-       evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_result_del_cb);
-
-       result_info = evas_object_data_del(item, DATA_KEY_RESULT);
-       if (result_info) {
-               if (result_info->rect1)
-                       evas_object_del(result_info->rect1);
-               if (result_info->rect2)
-                       evas_object_del(result_info->rect2);
-               free(result_info);
-       }
-
-       evas_object_del(item);
-}
-
 static void _item_group_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
 {
        item_destroy_group(obj);
@@ -484,8 +420,10 @@ static void _item_group_up_cb(void *data, Evas_Object *obj, const char *emission
        Evas_Object *item = obj;
        Evas_Object *selecting_item = NULL;
        main_view_s *main_view_info = data;
+       struct tm *local_time = NULL;
        int city = 0;
        int count = 0;
+       time_t t = 0;
 
        ret_if(!item);
        ret_if(!main_view_info);
@@ -493,6 +431,9 @@ static void _item_group_up_cb(void *data, Evas_Object *obj, const char *emission
 
        _D("An item is selected");
 
+       time(&t);
+       local_time = localtime(&t);
+
        count = scroller_count_item(main_view_info->city_list);
        if (count >= MAXIMUM_SELECTED_CITY) {
                Evas_Object *popup = NULL;
@@ -503,7 +444,7 @@ static void _item_group_up_cb(void *data, Evas_Object *obj, const char *emission
        }
 
        city = (int) evas_object_data_get(item, DATA_KEY_CITY);
-       selecting_item = item_create_selecting(main_view_info->city_list, city, 0, main_view_info);
+       selecting_item = item_create_selecting(main_view_info->city_list, city, local_time, main_view_info);
        ret_if(!selecting_item);
 
        scroller_append_item(main_view_info->city_list, selecting_item);
@@ -596,3 +537,48 @@ void item_destroy_padding(Evas_Object *item)
        evas_object_del(item);
 }
 
+static void _item_best_time_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+       item_destroy_best_time(obj);
+}
+
+Evas_Object *item_create_best_time(Evas_Object *parent)
+{
+       Evas_Object *item = NULL;
+       city_s *city_info = NULL;
+
+       char *path = NULL;
+       char full_path[PATH_LEN] = {0, };
+       char city_str[PATH_LEN] = {0, };
+
+       retv_if(!parent, NULL);
+
+       path = app_get_resource_path();
+       retv_if(!path, NULL);
+
+       snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, BEST_TIME_EDJE);
+       free(path);
+
+       item = elm_layout_add(parent);
+       retv_if(!item, NULL);
+
+       elm_layout_file_set(item, full_path, "best_time");
+
+       evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+       evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
+       evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_best_time_del_cb, NULL);
+
+       elm_object_part_text_set(item, "city", "Best time");
+
+       evas_object_show(item);
+
+       return item;
+}
+
+void item_destroy_best_time(Evas_Object *item)
+{
+       ret_if(!item);
+       evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_best_time_del_cb);
+       evas_object_del(item);
+}
+