From 69349483956f9222d3e68ffc4c514f792f43b3c8 Mon Sep 17 00:00:00 2001 From: raster Date: Thu, 22 Mar 2012 10:40:04 +0000 Subject: [PATCH] From: Bluezery Subject: [E-devel] [Patch][elm_map] Add line, polygon, circle, scale overlay This patch adds new overlay APIs (line, polygon, circle, scale) for elm_map. These overlays are adhered to map even though zooming, panning. You can test these by doing "elementary_test --> click mouse right --> overlay" git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/elementary@69562 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- data/themes/map_circle.png | Bin 0 -> 28715 bytes data/themes/map_scale.png | Bin 0 -> 244 bytes data/themes/widgets/map.edc | 57 ++++- src/bin/test_map.c | 317 ++++++++++++++++++--------- src/lib/elm_map.c | 509 +++++++++++++++++++++++++++++++++++++++++++- src/lib/elm_map.h | 126 ++++++++++- 6 files changed, 891 insertions(+), 118 deletions(-) create mode 100644 data/themes/map_circle.png create mode 100644 data/themes/map_scale.png diff --git a/data/themes/map_circle.png b/data/themes/map_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..1641097cb9a73f9ad0ab5dd3a675f1ae5a36de76 GIT binary patch literal 28715 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 literal 0 HcmV?d00001 diff --git a/data/themes/map_scale.png b/data/themes/map_scale.png new file mode 100644 index 0000000000000000000000000000000000000000..ff7be49ed4831b2dd375e64979633dcde750c697 GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^DL^dA!3HFc$8~!HDaPU;cPEB*=VV?2Ic!PZ?k)`f zL2$v|<&%LToCO|{#S9GG!XV7ZFl&wkP>{XE)7O>#4l_TKlKxJf&8a{k$r9Iy66gHf z+|;}h2Ir#G#FEq$h4Rdj3m|PqhI5-3t8I=(1pF7|D+f}3plDn79bdQHe Uvo9@sCeUaGPgg&ebxsLQ08AQ2asU7T literal 0 HcmV?d00001 diff --git a/data/themes/widgets/map.edc b/data/themes/widgets/map.edc index c4711c4..2d7b177 100644 --- a/data/themes/widgets/map.edc +++ b/data/themes/widgets/map.edc @@ -742,4 +742,59 @@ group { name: "elm/map/marker_bubble/default"; } } } - +group { name: "elm/map/circle/base/default"; + images { + image: "map_circle.png" COMP; + } + parts { + part { name: "base"; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + image.normal: "map_circle.png"; + } + } + } +} +group { name: "elm/map/scale/base/default"; + data { + item: size_w 100; + item: size_h 25; + } + images { + image: "map_scale.png" COMP; + } + parts { + part { name: "base"; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + image.normal: "map_scale.png"; + image.border: 10 10 10 10; + } + } + part { name: "elm.text"; + type: TEXT; + ignore_flags: ON_HOLD; + effect: SOFT_SHADOW; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + color: 224 224 224 255; + color3: 0 0 0 64; + rel1 { + relative: 0 0; + offset: 1 1; + } + rel2 { + relative: 1 1; + offset: -1 -1; + } + text { + font: "Sans,Edje-Vera"; + size: 10; + min: 0 0; + align: 0.1 0.5; + } + } + } + } +} diff --git a/src/bin/test_map.c b/src/bin/test_map.c index 5ed2f8d..bf1b0d2 100644 --- a/src/bin/test_map.c +++ b/src/bin/test_map.c @@ -38,6 +38,11 @@ static Elm_Map_Overlay *route_start, *route_end, *route_clas; static Elm_Map_Overlay *bubble_img; static Elm_Map_Overlay *bubble_parking; static Elm_Map_Overlay *route_ovl; +static Elm_Map_Overlay *line_start, *line_end, *line; +static Elm_Map_Overlay *poly; +static Elm_Map_Overlay *circle; +static Elm_Map_Overlay *scale; +static Eina_List *poly_points; static Evas_Object *menu, *fs_win; static Elm_Map_Route *route; @@ -81,6 +86,109 @@ _route_icon_get(Evas_Object *obj) return icon; } +static Evas_Object * +_box_get(Evas_Object *obj, Overlay_Data *data, Elm_Map_Overlay *ovl) +{ + Evas_Object *bx, *img, *label; + double lon, lat; + char buf[256]; + bx = elm_box_add(obj); + evas_object_show(bx); + + img = evas_object_image_add(evas_object_evas_get(obj)); + evas_object_image_file_set(img, data->file, NULL); + evas_object_image_filled_set(img, EINA_TRUE); + evas_object_size_hint_min_set(img, 64, 64); + evas_object_show(img); + elm_box_pack_end(bx, img); + + label = elm_label_add(bx); + elm_map_overlay_region_get(ovl, &lon, &lat); + snprintf(buf, sizeof(buf), "%0.4lf %0.4lf", lon, lat); + elm_object_text_set(label, buf); + evas_object_show(label); + elm_box_pack_end(bx, label); + return bx; +} + +static Evas_Object * +_label_get(Evas_Object *obj) +{ + Evas_Object *label; + label = elm_label_add(obj); + elm_object_text_set(label, "Here is a parking lot."); + return label; +} + +static Evas_Object * +_icon_get(Evas_Object *obj, Overlay_Data *data) +{ + Evas_Object *icon = elm_icon_add(obj); + elm_icon_file_set(icon, data->file, NULL); + evas_object_show(icon); + + return icon; +} + +static void +_overlay_hide(void *data, Evas_Object *obj __UNUSED__, void *ev __UNUSED__) +{ + elm_map_overlay_hide_set(data, EINA_TRUE); +} + +static void +_overlay_pause(void *data, Evas_Object *obj __UNUSED__, void *ev __UNUSED__) +{ + elm_map_overlay_paused_set(data, EINA_TRUE); +} + +static void +_overlay_unpause(void *data, Evas_Object *obj __UNUSED__, void *ev __UNUSED__) +{ + elm_map_overlay_paused_set(data, EINA_FALSE); +} + +static void +_overlay_show(void *data, Evas_Object *obj __UNUSED__, void *ev __UNUSED__) +{ + elm_map_overlay_show(data); +} + +static Evas_Object * +_btn_box_get(Evas_Object *obj, Elm_Map_Overlay *ovl) +{ + Evas_Object *bx, *btn, *btn2, *btn3, *btn4; + bx = elm_box_add(obj); + elm_box_horizontal_set(bx, EINA_TRUE); + evas_object_show(bx); + + btn = elm_button_add(bx); + elm_object_text_set(btn, "Hide"); + evas_object_smart_callback_add(btn, "clicked", _overlay_hide, ovl); + evas_object_show(btn); + elm_box_pack_end(bx, btn); + + btn2 = elm_button_add(bx); + elm_object_text_set(btn2, "Pause"); + evas_object_smart_callback_add(btn2, "clicked", _overlay_pause, ovl); + evas_object_show(btn2); + elm_box_pack_end(bx, btn2); + + btn3 = elm_button_add(bx); + elm_object_text_set(btn3, "Unpause"); + evas_object_smart_callback_add(btn3, "clicked", _overlay_unpause, ovl); + evas_object_show(btn3); + elm_box_pack_end(bx, btn3); + + btn4 = elm_button_add(bx); + elm_object_text_set(btn4, "Show"); + evas_object_smart_callback_add(btn4, "clicked", _overlay_show, ovl); + evas_object_show(btn4); + elm_box_pack_end(bx, btn4); + + return bx; +} + static void _bubble_parking_follow(Evas_Object *map) { @@ -316,7 +424,16 @@ _map_name_loaded_fail(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void * } static void -map_show_urmatt(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +_src_set(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Map_Source *s = data; + + if (!s) return; + elm_map_source_set(s->map, s->type, s->source_name); +} + +static void +_show_urmatt(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) { elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_MANUAL); if (elm_map_zoom_get(data) < 12) elm_map_zoom_set(data, 12); @@ -324,7 +441,7 @@ map_show_urmatt(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUS } static void -map_bring_seoul(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +_bring_seoul(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) { elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_MANUAL); if (elm_map_zoom_get(data) < 12) elm_map_zoom_set(data, 12); @@ -504,115 +621,74 @@ _zoom_max_set(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED } static void -src_set(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) -{ - Map_Source *s = data; - - if (!s) return; - elm_map_source_set(s->map, s->type, s->source_name); -} - -static Evas_Object * -_box_get(Evas_Object *obj, Overlay_Data *data, Elm_Map_Overlay *ovl) +_line_add(void *data, Evas_Object *obj __UNUSED__, void *ei __UNUSED__) { - Evas_Object *bx, *img, *label; double lon, lat; - char buf[256]; - bx = elm_box_add(obj); - evas_object_show(bx); - img = evas_object_image_add(evas_object_evas_get(obj)); - evas_object_image_file_set(img, data->file, NULL); - evas_object_image_filled_set(img, EINA_TRUE); - evas_object_size_hint_min_set(img, 64, 64); - evas_object_show(img); - elm_box_pack_end(bx, img); + elm_map_canvas_to_region_convert(data, down_x, down_y, &lon, &lat); + printf("line marker: %d %d %lf %lf\n", down_x, down_y, lon, lat); + if (line_start && line_end) + { + elm_map_overlay_del(line_start); + elm_map_overlay_del(line_end); + elm_map_overlay_del(line); + line_start = NULL; + line_end = NULL; + line = NULL; + } + if (!line_start) line_start = elm_map_overlay_add(data, lon, lat); + else if (!line_end) line_end = elm_map_overlay_add(data, lon, lat); - label = elm_label_add(bx); - elm_map_overlay_region_get(ovl, &lon, &lat); - snprintf(buf, sizeof(buf), "%0.4lf %0.4lf", lon, lat); - elm_object_text_set(label, buf); - evas_object_show(label); - elm_box_pack_end(bx, label); - return bx; + if (line_start && line_end) + { + double flon, flat, tlon, tlat; + elm_map_overlay_region_get(line_start, &flon, &flat); + elm_map_overlay_region_get(line_end, &tlon, &tlat); + line = elm_map_overlay_line_add(data, flon, flat, tlon, tlat); + printf("line add: (%lf, %lf) --> (%lf, %lf)\n", flon, flat, tlon, tlat); + } } static void -_overlay_hide(void *data, Evas_Object *obj __UNUSED__, void *ev __UNUSED__) +_poly_add(void *data, Evas_Object *obj __UNUSED__, void *ei __UNUSED__) { - elm_map_overlay_hide_set(data, EINA_TRUE); -} + double lon, lat; -static void -_overlay_pause(void *data, Evas_Object *obj __UNUSED__, void *ev __UNUSED__) -{ - elm_map_overlay_paused_set(data, EINA_TRUE); -} + elm_map_canvas_to_region_convert(data, down_x, down_y, &lon, &lat); + printf("%d %d %lf %lf\n", down_x, down_y, lon, lat); -static void -_overlay_unpause(void *data, Evas_Object *obj __UNUSED__, void *ev __UNUSED__) -{ - elm_map_overlay_paused_set(data, EINA_FALSE); + if (!poly) poly = elm_map_overlay_polygon_add(data); + poly_points = eina_list_append(poly_points, + elm_map_overlay_add(data, lon, lat)); + elm_map_overlay_polygon_region_add(poly, lon, lat); } static void -_overlay_show(void *data, Evas_Object *obj __UNUSED__, void *ev __UNUSED__) +_poly_clear(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *ei __UNUSED__) { - elm_map_overlay_show(data); + Elm_Map_Overlay *ovl; + if (poly) elm_map_overlay_del(poly); + EINA_LIST_FREE(poly_points, ovl) elm_map_overlay_del(ovl); + poly = NULL; + poly_points = NULL; } -static Evas_Object * -_btn_box_get(Evas_Object *obj, Elm_Map_Overlay *ovl) +static void +_circle_add(void *data, Evas_Object *obj __UNUSED__, void *ei __UNUSED__) { - Evas_Object *bx, *btn, *btn2, *btn3, *btn4; - bx = elm_box_add(obj); - elm_box_horizontal_set(bx, EINA_TRUE); - evas_object_show(bx); - - btn = elm_button_add(bx); - elm_object_text_set(btn, "Hide"); - evas_object_smart_callback_add(btn, "clicked", _overlay_hide, ovl); - evas_object_show(btn); - elm_box_pack_end(bx, btn); - - btn2 = elm_button_add(bx); - elm_object_text_set(btn2, "Pause"); - evas_object_smart_callback_add(btn2, "clicked", _overlay_pause, ovl); - evas_object_show(btn2); - elm_box_pack_end(bx, btn2); - - btn3 = elm_button_add(bx); - elm_object_text_set(btn3, "Unpause"); - evas_object_smart_callback_add(btn3, "clicked", _overlay_unpause, ovl); - evas_object_show(btn3); - elm_box_pack_end(bx, btn3); - - btn4 = elm_button_add(bx); - elm_object_text_set(btn4, "Show"); - evas_object_smart_callback_add(btn4, "clicked", _overlay_show, ovl); - evas_object_show(btn4); - elm_box_pack_end(bx, btn4); - - return bx; -} + double radius = 100; + double lon, lat; -static Evas_Object * -_label_get(Evas_Object *obj) -{ - Evas_Object *label; - label = elm_label_add(obj); - elm_object_text_set(label, "Here is a parking lot."); - return label; + if (circle) elm_map_overlay_del(circle); + elm_map_canvas_to_region_convert(data, down_x, down_y, &lon, &lat); + circle = elm_map_overlay_circle_add(data, lon, lat, radius); } -static Evas_Object * -_icon_get(Evas_Object *obj, Overlay_Data *data) +static void +_scale_add(void *data, Evas_Object *obj __UNUSED__, void *ei __UNUSED__) { - Evas_Object *icon = elm_icon_add(obj); - elm_icon_file_set(icon, data->file, NULL); - evas_object_show(icon); - - return icon; + if (scale) elm_map_overlay_del(scale); + scale = elm_map_overlay_scale_add(data, down_x, down_y); } static void @@ -635,7 +711,7 @@ _submenu_src_add(void *data, Elm_Object_Item *parent) ts[idx].map = data; ts[idx].type = ELM_MAP_SOURCE_TYPE_TILE; ts[idx].source_name = strdup(tile_srcs[idx]); - elm_menu_item_add(menu, parent, "", tile_srcs[idx], src_set, &ts[idx]); + elm_menu_item_add(menu, parent, "", tile_srcs[idx], _src_set, &ts[idx]); } for (idx = 0; route_srcs[idx]; idx++) { @@ -643,7 +719,7 @@ _submenu_src_add(void *data, Elm_Object_Item *parent) rs[idx].map = data; rs[idx].type = ELM_MAP_SOURCE_TYPE_ROUTE; rs[idx].source_name = strdup(route_srcs[idx]); - elm_menu_item_add(menu, parent, "", route_srcs[idx], src_set, &rs[idx]); + elm_menu_item_add(menu, parent, "", route_srcs[idx], _src_set, &rs[idx]); } for (idx = 0; name_srcs[idx]; idx++) { @@ -651,7 +727,7 @@ _submenu_src_add(void *data, Elm_Object_Item *parent) ns[idx].map = data; ns[idx].type = ELM_MAP_SOURCE_TYPE_NAME; ns[idx].source_name = strdup(name_srcs[idx]); - elm_menu_item_add(menu, parent, "", name_srcs[idx], src_set, &ns[idx]); + elm_menu_item_add(menu, parent, "", name_srcs[idx], _src_set, &ns[idx]); } } @@ -659,8 +735,8 @@ static void _submenu_move_add(void *data, Elm_Object_Item *parent) { if ((!data) || (!parent)) return; - elm_menu_item_add(menu, parent, NULL, "Show Urmatt", map_show_urmatt, data); - elm_menu_item_add(menu, parent, NULL, "Bring Seoul", map_bring_seoul, data); + elm_menu_item_add(menu, parent, NULL, "Show Urmatt", _show_urmatt, data); + elm_menu_item_add(menu, parent, NULL, "Bring Seoul", _bring_seoul, data); } @@ -699,6 +775,17 @@ _submenu_track_add(void *data, Elm_Object_Item *parent) } static void +_submenu_ovl_add(void *data, Elm_Object_Item *parent) +{ + if ((!data) || (!parent)) return; + elm_menu_item_add(menu, parent, NULL, "Add line", _line_add, data); + elm_menu_item_add(menu, parent, NULL, "Add polygon", _poly_add, data); + elm_menu_item_add(menu, parent, NULL, "Clear polygon", _poly_clear, data); + elm_menu_item_add(menu, parent, NULL, "Add circle", _circle_add, data); + elm_menu_item_add(menu, parent, NULL, "Add scale", _scale_add, data); +} + +static void _map_mouse_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj, void *event_info) { Evas_Event_Mouse_Down *down = event_info; @@ -726,9 +813,11 @@ _map_mouse_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj, void *event _submenu_prop_add(data, menu_it); menu_it = elm_menu_item_add(menu, NULL, "", "Track", NULL, NULL); _submenu_track_add(data, menu_it); + menu_it = elm_menu_item_add(menu, NULL, "", "Overlay", NULL, NULL); + _submenu_ovl_add(data, menu_it); - elm_menu_move(menu, down->canvas.x, down->canvas.y); - evas_object_show(menu); + elm_menu_move(menu, down->canvas.x, down->canvas.y); + evas_object_show(menu); } } @@ -791,25 +880,41 @@ _overlay_cb(void *data __UNUSED__, Evas_Object *map, void *ev) Overlay_Data *od; Elm_Map_Overlay_Type type = elm_map_overlay_type_get(overlay); - if (type != ELM_MAP_OVERLAY_TYPE_DEFAULT) return; + if (type != ELM_MAP_OVERLAY_TYPE_GROUP && + type != ELM_MAP_OVERLAY_TYPE_DEFAULT) return; if (!bubble_img) bubble_img = elm_map_overlay_bubble_add(map); elm_map_overlay_bubble_follow(bubble_img, overlay); elm_map_overlay_bubble_content_clear(bubble_img); - od = elm_map_overlay_data_get(overlay); - if (od) - elm_map_overlay_bubble_content_append(bubble_img, - _box_get(map, od, overlay)); - elm_map_overlay_bubble_content_append(bubble_img, - _btn_box_get(map, overlay)); + if (type == ELM_MAP_OVERLAY_TYPE_GROUP) + { + Eina_List *l; + Elm_Map_Overlay *memb; + Eina_List *members = elm_map_overlay_group_members_get(overlay); + printf("Group Members Num: %d\n", eina_list_count(members)); + EINA_LIST_FOREACH(members, l, memb) + { + od = elm_map_overlay_data_get(memb); + if (od) + elm_map_overlay_bubble_content_append(bubble_img, + _box_get(map, od, memb)); + } + } + else + { + od = elm_map_overlay_data_get(overlay); + if (od) + elm_map_overlay_bubble_content_append(bubble_img, + _box_get(map, od, overlay)); + elm_map_overlay_bubble_content_append(bubble_img, + _btn_box_get(map, overlay)); + } } static void _parking_cb(void *data __UNUSED__, Evas_Object *map, Elm_Map_Overlay *ovl) { - if (elm_map_overlay_type_get(ovl) != ELM_MAP_OVERLAY_TYPE_DEFAULT) return; - double lon, lat; Evas_Coord x, y; elm_map_overlay_region_get(ovl, &lon, &lat); diff --git a/src/lib/elm_map.c b/src/lib/elm_map.c index 78f598a..442cc3b 100644 --- a/src/lib/elm_map.c +++ b/src/lib/elm_map.c @@ -13,6 +13,7 @@ typedef struct _Widget_Data Widget_Data; typedef struct _Path Path; typedef struct _Color Color; +typedef struct _Region Region; typedef struct _Pan Pan; typedef struct _Grid Grid; typedef struct _Grid_Item Grid_Item; @@ -21,6 +22,10 @@ typedef struct _Overlay_Class Overlay_Class; typedef struct _Overlay_Group Overlay_Group; typedef struct _Overlay_Bubble Overlay_Bubble; typedef struct _Overlay_Route Overlay_Route; +typedef struct _Overlay_Line Overlay_Line; +typedef struct _Overlay_Polygon Overlay_Polygon; +typedef struct _Overlay_Circle Overlay_Circle; +typedef struct _Overlay_Scale Overlay_Scale; typedef struct _Marker_Group Marker_Group; typedef struct _Marker_Bubble Marker_Bubble; typedef struct _Path_Node Path_Node; @@ -38,6 +43,7 @@ typedef int (*Elm_Map_Module_Tile_Zoom_Max_Func)(void); typedef char *(*Elm_Map_Module_Tile_Url_Func)(const Evas_Object *obj, int x, int y, int zoom); typedef Eina_Bool (*Elm_Map_Module_Tile_Geo_to_Coord_Func)(const Evas_Object *obj, int zoom, double lon, double lat, int size, int *x, int *y); typedef Eina_Bool (*Elm_Map_Module_Tile_Coord_to_Geo_Func)(const Evas_Object *obj, int zoom, int x, int y, int size, double *lon, double *lat); +typedef double (*Elm_Map_Module_Tile_Scale_Func)(const Evas_Object *obj, double lon, double lat, int zoom); typedef char *(*Elm_Map_Module_Route_Url_Func)(const Evas_Object *obj, const char *type_name, int method, double flon, double flat, double tlon, double tlat); typedef char *(*Elm_Map_Module_Name_Url_Func)(const Evas_Object *obj, int method, const char *name, double lon, double lat); @@ -98,6 +104,11 @@ struct _Path Evas_Coord x, y; }; +struct _Region +{ + double lon, lat; +}; + struct _Delayed_Data { void (*func)(void *data); @@ -120,6 +131,7 @@ struct _Source_Tile Elm_Map_Module_Tile_Url_Func url_cb; Elm_Map_Module_Tile_Geo_to_Coord_Func geo_to_coord; Elm_Map_Module_Tile_Coord_to_Geo_Func coord_to_geo; + Elm_Map_Module_Tile_Scale_Func scale_cb; }; // Map Route Source @@ -198,6 +210,37 @@ struct _Overlay_Route Eina_List *nodes; }; +struct _Overlay_Line +{ + Widget_Data *wd; + double flon, flat, tlon, tlat; + Evas_Object *obj; +}; + +struct _Overlay_Polygon +{ + Widget_Data *wd; + Eina_List *regions; // list of Regions + Evas_Object *obj; +}; + +struct _Overlay_Circle +{ + Widget_Data *wd; + double lon, lat; + double radius; // Intial pixel in intial view + double ratio; // initial-radius/map-size + Evas_Object *obj; +}; + +struct _Overlay_Scale +{ + Widget_Data *wd; + Evas_Coord x, y; + Evas_Coord w, h; + Evas_Object *obj; + }; + struct _Elm_Map_Overlay { Widget_Data *wd; @@ -490,14 +533,15 @@ static char *_nominatim_url_cb(const Evas_Object *obj, int method, const char *n static char *_monav_url_cb(Evas_Object *obj __UNUSED__, char *type_name, int method, double flon, double flat, double tlon, double tlat) static char *_ors_url_cb(Evas_Object *obj __UNUSED__, char *type_name, int method, double flon, double flat, double tlon, double tlat); */ +static double _scale_cb(const Evas_Object *obj __UNUSED__, double lon __UNUSED__, double lat, int zoom); const Source_Tile src_tiles[] = { - {"Mapnik", 0, 18, _mapnik_url_cb, NULL, NULL}, - {"Osmarender", 0, 17, _osmarender_url_cb, NULL, NULL}, - {"CycleMap", 0, 16, _cyclemap_url_cb, NULL, NULL}, - {"MapQuest", 0, 18, _mapquest_url_cb, NULL, NULL}, - {"MapQuest Open Aerial", 0, 11, _mapquest_aerial_url_cb, NULL, NULL}, + {"Mapnik", 0, 18, _mapnik_url_cb, NULL, NULL, _scale_cb}, + {"Osmarender", 0, 17, _osmarender_url_cb, NULL, NULL, _scale_cb}, + {"CycleMap", 0, 16, _cyclemap_url_cb, NULL, NULL, _scale_cb}, + {"MapQuest", 0, 18, _mapquest_url_cb, NULL, NULL, _scale_cb}, + {"MapQuest Open Aerial", 0, 11, _mapquest_aerial_url_cb, NULL, NULL, _scale_cb} }; // FIXME: Fix more open sources @@ -508,6 +552,20 @@ const Source_Route src_routes[] = //{"ORS", _ors_url_cb}, // http://www.openrouteservice.org }; +// Refer : http://wiki.openstreetmap.org/wiki/FAQ +// meters per pixel when latitude is 0 (equator) +// meters per pixel = _osm_scale_meter[zoom] * cos (latitude) +const double _osm_scale_meter[] = +{78206, 39135.758482, 19567.879241, 9783.939621, 4891.969810, + 2445.984905, 1222.992453, 611.496226, 305.748113, 152.874057, 76.437028, + 38.218514, 19.109257, 9.554629, 4.777314, 2.388657, 1.194329, 0.597164, + 0.29858}; + +// Scale in meters +const double _scale_tb[] = +{10000000, 5000000, 2000000, 1000000, 500000, 200000, 100000, 50000, + 20000, 10000, 5000, 2000, 1000, 500, 500, 200, 100, 50, 20, 10, 5, 2, 1}; + // FIXME: Add more open sources const Source_Name src_names[] = { @@ -2505,6 +2563,251 @@ _overlay_route_new(Widget_Data *wd, const Elm_Map_Route *route, Color c) } static void +_overlay_line_color_update(Overlay_Line *ovl, Color c) +{ + EINA_SAFETY_ON_NULL_RETURN(ovl); + evas_object_color_set(ovl->obj, c.r, c.g, c.b, c.a); +} + +static void +_overlay_line_hide(Overlay_Line *ovl) +{ + EINA_SAFETY_ON_NULL_RETURN(ovl); + if (ovl->obj) evas_object_hide(ovl->obj); +} + +static void +_overlay_line_show(Overlay_Line *ovl) +{ + Evas_Coord fx, fy, tx, ty; + Widget_Data *wd = ovl->wd; + + _region_to_coord_convert(wd, ovl->flon, ovl->flat, wd->size.w, &fx, &fy); + _region_to_coord_convert(wd, ovl->tlon, ovl->tlat, wd->size.w, &tx, &ty); + _coord_to_canvas(wd, fx, fy, &fx, &fy); + _coord_to_canvas(wd, tx, ty, &tx, &ty); + evas_object_line_xy_set(ovl->obj, fx, fy, tx, ty); + evas_object_show(ovl->obj); +} + +static void +_overlay_line_free(Overlay_Line *ovl) +{ + EINA_SAFETY_ON_NULL_RETURN(ovl); + evas_object_del(ovl->obj); + free(ovl); +} + +static Overlay_Line * +_overlay_line_new(Widget_Data *wd, double flon, double flat, double tlon, double tlat, Color c) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(wd, NULL); + + Overlay_Line *ovl = ELM_NEW(Overlay_Line); + ovl->wd = wd; + ovl->flon = flon; + ovl->flat = flat; + ovl->tlon = tlon; + ovl->tlat = tlat; + ovl->obj = evas_object_line_add(evas_object_evas_get(wd->obj)); + evas_object_smart_member_add(ovl->obj, wd->pan_smart); + _overlay_line_color_update(ovl, c); + return ovl; +} + +static void +_overlay_polygon_color_update(Overlay_Polygon *ovl, Color c) +{ + EINA_SAFETY_ON_NULL_RETURN(ovl); + evas_object_color_set(ovl->obj, c.r, c.g, c.b, c.a); +} + +static void +_overlay_polygon_hide(Overlay_Polygon *ovl) +{ + EINA_SAFETY_ON_NULL_RETURN(ovl); + if (ovl->obj) evas_object_hide(ovl->obj); +} + +static void +_overlay_polygon_show(Overlay_Polygon *ovl) +{ + EINA_SAFETY_ON_NULL_RETURN(ovl); + Eina_List *l; + Region *r; + Widget_Data *wd = ovl->wd; + + evas_object_polygon_points_clear(ovl->obj); + EINA_LIST_FOREACH(ovl->regions, l, r) + { + Evas_Coord x, y; + _region_to_coord_convert(wd, r->lon, r->lat, wd->size.w, &x, &y); + _coord_to_canvas(wd, x, y, &x, &y); + evas_object_polygon_point_add(ovl->obj, x, y); + } + evas_object_show(ovl->obj); +} + +static void +_overlay_polygon_free(Overlay_Polygon *ovl) +{ + EINA_SAFETY_ON_NULL_RETURN(ovl); + Region *r; + evas_object_del(ovl->obj); + EINA_LIST_FREE(ovl->regions, r) free(r); + free(ovl); +} + +static Overlay_Polygon * +_overlay_polygon_new(Widget_Data *wd, Color c) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(wd, NULL); + + Overlay_Polygon *ovl = ELM_NEW(Overlay_Polygon); + ovl->wd = wd; + ovl->obj = evas_object_polygon_add(evas_object_evas_get(wd->obj)); + evas_object_smart_member_add(ovl->obj, wd->pan_smart); + _overlay_polygon_color_update(ovl, c); + return ovl; +} + +static void +_overlay_circle_color_update(Overlay_Circle *ovl, Color c) +{ + EINA_SAFETY_ON_NULL_RETURN(ovl); + Evas_Object *obj = elm_layout_edje_get(ovl->obj); + evas_object_color_set(obj, c.r, c.g, c.b, c.a); +} + +static void +_overlay_circle_hide(Overlay_Circle *ovl) +{ + EINA_SAFETY_ON_NULL_RETURN(ovl); + if (ovl->obj) evas_object_hide(ovl->obj); +} + +static void +_overlay_circle_show(Overlay_Circle *ovl) +{ + EINA_SAFETY_ON_NULL_RETURN(ovl); + double r; + Evas_Coord x, y; + Widget_Data *wd = ovl->wd; + + r = (ovl->ratio) * wd->size.w; + _region_to_coord_convert(wd, ovl->lon, ovl->lat, wd->size.w, &x, &y); + _coord_to_canvas(wd, x, y, &x, &y); + _obj_place(ovl->obj, x - r, y - r, r * 2, r * 2); +} + +static void +_overlay_circle_free(Overlay_Circle *ovl) +{ + EINA_SAFETY_ON_NULL_RETURN(ovl); + evas_object_del(ovl->obj); + free(ovl); +} + +static Overlay_Circle * +_overlay_circle_new(Widget_Data *wd, double lon, double lat, double radius, Color c) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(wd, NULL); + + Overlay_Circle *ovl = ELM_NEW(Overlay_Circle); + ovl->wd = wd; + ovl->lon = lon; + ovl->lat = lat; + ovl->radius = radius; + ovl->ratio = radius / wd->size.w; + + ovl->obj = elm_layout_add(wd->obj); + evas_object_smart_member_add(ovl->obj, wd->pan_smart); + evas_object_stack_above(ovl->obj, wd->sep_maps_markers); + elm_layout_theme_set(ovl->obj, "map/circle", "base", + elm_widget_style_get(wd->obj)); + _overlay_circle_color_update(ovl, c); + return ovl; +} + +static void +_overlay_scale_color_update(Overlay_Scale *ovl, Color c) +{ + EINA_SAFETY_ON_NULL_RETURN(ovl); + evas_object_color_set(ovl->obj, c.r, c.g, c.b, c.a); +} + +static void +_overlay_scale_hide(Overlay_Scale *ovl) +{ + EINA_SAFETY_ON_NULL_RETURN(ovl); + if (ovl->obj) evas_object_hide(ovl->obj); +} + + static void +_overlay_scale_show(Overlay_Scale *ovl) +{ + EINA_SAFETY_ON_NULL_RETURN(ovl); + Evas_Coord w; + double lon, lat; + double text; + char buf[32]; + double meter; + Widget_Data *wd = ovl->wd; + + if ((int)sizeof(_scale_tb) <= wd->zoom) + { + ERR("Zoom level is too high"); + return; + } + + elm_map_region_get(wd->obj, &lon, &lat); + meter = wd->src_tile->scale_cb(wd->obj, lon, lat, wd->zoom); + + w = (_scale_tb[wd->zoom] / meter) * (wd->zoom_detail - wd->zoom + 1); + + text = _scale_tb[wd->zoom]/1000; + if (text < 1) snprintf(buf, sizeof(buf), "%d m", (int)(text * 1000)); + else snprintf(buf, sizeof(buf), "%d km", (int)text); + + edje_object_part_text_set(elm_layout_edje_get(ovl->obj), "elm.text", buf); + _obj_place(ovl->obj, ovl->x, ovl->y, w, ovl->h); +} + + static void +_overlay_scale_free(Overlay_Scale *ovl) +{ + EINA_SAFETY_ON_NULL_RETURN(ovl); + evas_object_del(ovl->obj); + free(ovl); +} + +static Overlay_Scale * +_overlay_scale_new(Widget_Data *wd, Evas_Coord x, Evas_Coord y, Color c) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(wd, NULL); + const char *s; + + Overlay_Scale *ovl = ELM_NEW(Overlay_Scale); + ovl->wd = wd; + ovl->x = x; + ovl->y = y; + + ovl->obj = elm_layout_add(wd->obj); + evas_object_smart_member_add(ovl->obj, wd->pan_smart); + evas_object_stack_above(ovl->obj, wd->sep_maps_markers); + elm_layout_theme_set(ovl->obj, "map/scale", "base", + elm_widget_style_get(wd->obj)); + s = edje_object_data_get(elm_layout_edje_get(ovl->obj), "size_w"); + if (s) ovl->w = atoi(s); + else ovl->w = 100; + s = edje_object_data_get(elm_layout_edje_get(ovl->obj), "size_h"); + if (s) ovl->h = atoi(s); + else ovl->h = 60; + _overlay_scale_color_update(ovl, c); + return ovl; +} + +static void _overlay_grouping(Eina_List *clas_membs, Elm_Map_Overlay *boss) { EINA_SAFETY_ON_NULL_RETURN(clas_membs); @@ -2594,6 +2897,26 @@ _overlay_show(Elm_Map_Overlay *overlay) if (hide) _overlay_route_hide(overlay->ovl); else _overlay_route_show(overlay->ovl); } + else if (overlay->type == ELM_MAP_OVERLAY_TYPE_LINE) + { + if (hide) _overlay_line_hide(overlay->ovl); + else _overlay_line_show(overlay->ovl); + } + else if (overlay->type == ELM_MAP_OVERLAY_TYPE_POLYGON) + { + if (hide) _overlay_polygon_hide(overlay->ovl); + else _overlay_polygon_show(overlay->ovl); + } + else if (overlay->type == ELM_MAP_OVERLAY_TYPE_CIRCLE) + { + if (hide) _overlay_circle_hide(overlay->ovl); + else _overlay_circle_show(overlay->ovl); + } + else if (overlay->type == ELM_MAP_OVERLAY_TYPE_SCALE) + { + if (hide) _overlay_scale_hide(overlay->ovl); + else _overlay_scale_show(overlay->ovl); + } } static void @@ -3291,6 +3614,7 @@ _source_tile_mod_cb(Eina_Module *m, void *data) Elm_Map_Module_Tile_Url_Func url_cb; Elm_Map_Module_Tile_Geo_to_Coord_Func geo_to_coord; Elm_Map_Module_Tile_Coord_to_Geo_Func coord_to_geo; + Elm_Map_Module_Tile_Scale_Func scale_cb; const char *file; file = eina_module_file_get(m); @@ -3307,9 +3631,9 @@ _source_tile_mod_cb(Eina_Module *m, void *data) url_cb = eina_module_symbol_get(m, "map_module_tile_url_get"); geo_to_coord = eina_module_symbol_get(m, "map_module_tile_geo_to_coord"); coord_to_geo = eina_module_symbol_get(m, "map_module_tile_coord_to_geo"); - + scale_cb = eina_module_symbol_get(m, "map_module_tile_scale_get"); if ((!name_cb) || (!zoom_min) || (!zoom_max) || (!url_cb) || - (!geo_to_coord) || (!coord_to_geo)) + (!geo_to_coord) || (!coord_to_geo) || (!scale_cb)) { WRN("Could not find map module functions from module \"%s\": %s", file, eina_error_msg_get(eina_error_get())); @@ -3323,6 +3647,7 @@ _source_tile_mod_cb(Eina_Module *m, void *data) s->url_cb = url_cb; s->geo_to_coord = geo_to_coord; s->coord_to_geo = coord_to_geo; + s->scale_cb = scale_cb; wd->src_tiles = eina_list_append(wd->src_tiles, s); return EINA_TRUE; @@ -3345,6 +3670,7 @@ _source_tile_load(Widget_Data *wd) s->url_cb = src_tiles[idx].url_cb; s->geo_to_coord = src_tiles[idx].geo_to_coord; s->coord_to_geo = src_tiles[idx].coord_to_geo; + s->scale_cb = src_tiles[idx].scale_cb; wd->src_tiles = eina_list_append(wd->src_tiles, s); } @@ -3880,6 +4206,13 @@ _nominatim_url_cb(const Evas_Object *obj, int method, const char *name, double l return strdup(buf); } +static double +_scale_cb(const Evas_Object *obj __UNUSED__, double lon __UNUSED__, double lat, int zoom) +{ + if (zoom < 0 || zoom >= (int)sizeof(_osm_scale_meter)) return 0; + return _osm_scale_meter[zoom] / cos(lat * ELM_PI / 180.0); +} + static void _on_focus_hook(void *data __UNUSED__, Evas_Object *obj) { @@ -4952,6 +5285,14 @@ elm_map_overlay_del(Elm_Map_Overlay *overlay) _overlay_class_free(overlay->ovl); else if (overlay->type == ELM_MAP_OVERLAY_TYPE_ROUTE) _overlay_route_free(overlay->ovl); + else if (overlay->type == ELM_MAP_OVERLAY_TYPE_LINE) + _overlay_line_free(overlay->ovl); + else if (overlay->type == ELM_MAP_OVERLAY_TYPE_POLYGON) + _overlay_polygon_free(overlay->ovl); + else if (overlay->type == ELM_MAP_OVERLAY_TYPE_CIRCLE) + _overlay_circle_free(overlay->ovl); + else if (overlay->type == ELM_MAP_OVERLAY_TYPE_SCALE) + _overlay_scale_free(overlay->ovl); else ERR("Invalid overlay type: %d", overlay->type); overlay->wd->overlays = eina_list_remove(overlay->wd->overlays, overlay); @@ -5308,12 +5649,12 @@ elm_map_overlay_content_get(const Elm_Map_Overlay *overlay) if (overlay->type == ELM_MAP_OVERLAY_TYPE_DEFAULT) { const Overlay_Default *ovl = overlay->ovl; - return elm_object_part_content_get(ovl->layout, "elm.icon"); + return ovl->content; } else if (overlay->type == ELM_MAP_OVERLAY_TYPE_CLASS) { const Overlay_Class *ovl = overlay->ovl; - return ovl->icon; + return ovl->content; } else { @@ -5533,6 +5874,23 @@ elm_map_overlay_class_zoom_max_get(const Elm_Map_Overlay *clas) #endif } +EAPI Eina_List * +elm_map_overlay_group_members_get(const Elm_Map_Overlay *grp) +{ +#ifdef HAVE_ELEMENTARY_ECORE_CON + EINA_SAFETY_ON_NULL_RETURN_VAL(grp, NULL); + EINA_SAFETY_ON_NULL_RETURN_VAL(grp->wd, NULL); + ELM_CHECK_WIDTYPE(grp->wd->obj, widtype) NULL; + EINA_SAFETY_ON_FALSE_RETURN_VAL(grp->type == ELM_MAP_OVERLAY_TYPE_GROUP, NULL); + + Overlay_Group *ovl = grp->ovl; + return ovl->members; +#else + (void) clas; + return OVERLAY_CLASS_ZOOM_MAX; +#endif +} + EAPI Elm_Map_Overlay * elm_map_overlay_bubble_add(Evas_Object *obj) { @@ -5666,6 +6024,139 @@ elm_map_overlay_route_add(Evas_Object *obj, const Elm_Map_Route *route) #endif } +EAPI Elm_Map_Overlay * +elm_map_overlay_line_add(Evas_Object *obj, double flon, double flat, double tlon, double tlat) +{ +#ifdef HAVE_ELEMENTARY_ECORE_CON + ELM_CHECK_WIDTYPE(obj, widtype) NULL; + Widget_Data *wd = elm_widget_data_get(obj); + EINA_SAFETY_ON_NULL_RETURN_VAL(wd, NULL); + + Elm_Map_Overlay *overlay = ELM_NEW(Elm_Map_Overlay); + overlay->wd = wd; + overlay->type = ELM_MAP_OVERLAY_TYPE_LINE; + overlay->c.r = 0xff; + overlay->c.g = 0x00; + overlay->c.b = 0x00; + overlay->c.a = 0xff; + overlay->ovl = _overlay_line_new(wd, flon, flat, tlon, tlat, overlay->c); + overlay->grp = _overlay_group_new(wd); + wd->overlays = eina_list_append(wd->overlays, overlay); + + evas_object_smart_changed(wd->pan_smart); + return overlay; +#else + (void) obj; + (void) flon; + (void) flat + (void) tlon; + (void) tlat; + return NULL; +#endif +} + +EAPI Elm_Map_Overlay * +elm_map_overlay_polygon_add(Evas_Object *obj) +{ +#ifdef HAVE_ELEMENTARY_ECORE_CON + ELM_CHECK_WIDTYPE(obj, widtype) NULL; + Widget_Data *wd = elm_widget_data_get(obj); + EINA_SAFETY_ON_NULL_RETURN_VAL(wd, NULL); + + Elm_Map_Overlay *overlay = ELM_NEW(Elm_Map_Overlay); + overlay->wd = wd; + overlay->type = ELM_MAP_OVERLAY_TYPE_POLYGON; + overlay->c.r = 0xdc; + overlay->c.g = 0x14; + overlay->c.b = 0x3c; + overlay->c.a = 200; + overlay->ovl = _overlay_polygon_new(wd, overlay->c); + overlay->grp = _overlay_group_new(wd); + wd->overlays = eina_list_append(wd->overlays, overlay); + evas_object_smart_changed(wd->pan_smart); + return overlay; +#else + (void) obj; + return NULL; +#endif +} + +EAPI void +elm_map_overlay_polygon_region_add(Elm_Map_Overlay *overlay, double lon, double lat) +{ +#ifdef HAVE_ELEMENTARY_ECORE_CON + EINA_SAFETY_ON_NULL_RETURN(overlay); + ELM_CHECK_WIDTYPE(overlay->wd->obj, widtype); + EINA_SAFETY_ON_FALSE_RETURN(overlay->type == ELM_MAP_OVERLAY_TYPE_POLYGON); + + Overlay_Polygon *ovl = overlay->ovl; + Region *r = ELM_NEW(Region); + r->lon = lon; + r->lat = lat; + ovl->regions = eina_list_append(ovl->regions, r); + + evas_object_smart_changed(ovl->wd->pan_smart); +#else + (void) overlay; + (void) lon; + (void) lat + #endif +} + +EAPI Elm_Map_Overlay * +elm_map_overlay_circle_add(Evas_Object *obj, double lon, double lat, double radius) +{ +#ifdef HAVE_ELEMENTARY_ECORE_CON + ELM_CHECK_WIDTYPE(obj, widtype) NULL; + Widget_Data *wd = elm_widget_data_get(obj); + EINA_SAFETY_ON_NULL_RETURN_VAL(wd, NULL); + + Elm_Map_Overlay *overlay = ELM_NEW(Elm_Map_Overlay); + overlay->wd = wd; + overlay->type = ELM_MAP_OVERLAY_TYPE_CIRCLE; + overlay->c.r = 0xdc; + overlay->c.g = 0x14; + overlay->c.b = 0x3c; + overlay->c.a = 200; + overlay->ovl = _overlay_circle_new(wd, lon, lat, radius, overlay->c); + overlay->grp = _overlay_group_new(wd); + wd->overlays = eina_list_append(wd->overlays, overlay); + + evas_object_smart_changed(wd->pan_smart); + return overlay; +#else + (void) obj; + return NULL; +#endif +} + +EAPI Elm_Map_Overlay * +elm_map_overlay_scale_add(Evas_Object *obj, Evas_Coord x, Evas_Coord y) +{ +#ifdef HAVE_ELEMENTARY_ECORE_CON + ELM_CHECK_WIDTYPE(obj, widtype) NULL; + Widget_Data *wd = elm_widget_data_get(obj); + EINA_SAFETY_ON_NULL_RETURN_VAL(wd, NULL); + + Elm_Map_Overlay *overlay = ELM_NEW(Elm_Map_Overlay); + overlay->wd = wd; + overlay->type = ELM_MAP_OVERLAY_TYPE_SCALE; + overlay->c.r = 0; + overlay->c.g = 0; + overlay->c.b = 0; + overlay->c.a = 255; + overlay->ovl = _overlay_scale_new(wd, x, y, overlay->c); + overlay->grp = _overlay_group_new(wd); + wd->overlays = eina_list_append(wd->overlays, overlay); + + evas_object_smart_changed(wd->pan_smart); + return overlay; +#else + (void) obj; + return NULL; +#endif +} + #ifdef ELM_EMAP EAPI Evas_Object * elm_map_track_add(Evas_Object *obj, void *emap) diff --git a/src/lib/elm_map.h b/src/lib/elm_map.h index 8b68156..b0b89dc 100644 --- a/src/lib/elm_map.h +++ b/src/lib/elm_map.h @@ -165,9 +165,14 @@ typedef enum _Elm_Map_Overlay_Type ELM_MAP_OVERLAY_TYPE_NONE = 0, ELM_MAP_OVERLAY_TYPE_DEFAULT, ELM_MAP_OVERLAY_TYPE_CLASS, + ELM_MAP_OVERLAY_TYPE_GROUP, ELM_MAP_OVERLAY_TYPE_BUBBLE, ELM_MAP_OVERLAY_TYPE_ROUTE, - ELM_MAP_OVERLAY_TYPE_GROUP + ELM_MAP_OVERLAY_TYPE_LINE, + ELM_MAP_OVERLAY_TYPE_POLYGON, + ELM_MAP_OVERLAY_TYPE_CIRCLE, + ELM_MAP_OVERLAY_TYPE_SCALE + } Elm_Map_Overlay_Type; typedef struct _Elm_Map_Marker Elm_Map_Marker; /**< A marker to be shown in a specific point of the map. Can be created with elm_map_marker_add() and deleted with elm_map_marker_remove(). */ @@ -935,6 +940,10 @@ EAPI void elm_map_overlays_show(Eina_List *overlays); * * If the overlay is clicked, the callback wll be called. * The clicked overlay is returned by callback. + * + * You can add callback to the class overlay. If one of the group overlays in this class + * is clicked, callback will be called and return a virtual group overlays. + * * You can delete this callback function by setting @c NULL. * * @ingroup Map @@ -956,7 +965,7 @@ EAPI void elm_map_overlay_get_cb_set(Elm_Map_Overlay *overlay, Elm_Map_Overlay_G * * You can change the state (hidden, paused, etc.) or set the content * or icon of the group overlays by chaning the state of the class overlay. - * Do not control the group overlay itself. + * Do not modifty the group overlay itself. * * Also these changes have a influence on the overlays in the same class * even if each overlay is alone and is not grouped. @@ -1024,6 +1033,27 @@ EAPI void elm_map_overlay_class_zoom_max_set(Elm_Map_Overlay *c EAPI int elm_map_overlay_class_zoom_max_get(const Elm_Map_Overlay *clas); /** + * Get the overlay members of the group overlay. + * + * @param clas The group overlay has overlay members. + * + * @return The list of group overlay memebers. + * + * The group overlays are virtualy overlays. Those are shown and hidden dynamically. + * You can add callback to the class overlay. If one of the group overlays in this class + * is clicked, callback will be called and return a virtual group overlays. + * + * You can change the state (hidden, paused, etc.) or set the content + * or icon of the group overlays by chaning the state of the class overlay. + * Do not modifty the group overlay itself. + * + * @see elm_map_overlay_class_add() + * + * @ingroup Map + */ +EAPI Eina_List * elm_map_overlay_group_members_get(const Elm_Map_Overlay *grp); + +/** * Add a new bubble overlay to the map object. * This overlay has a bubble type. * @@ -1114,6 +1144,98 @@ EAPI void elm_map_overlay_bubble_content_clear(Elm_Map_Overlay EAPI Elm_Map_Overlay * elm_map_overlay_route_add(Evas_Object *obj, const Elm_Map_Route *route); /** + * Add a new line overlay to the map object. + * This overlay has a line type. + * + * @param obj The map object to add a new overlay. + * @param flon The start longitude. + * @param flat The start latitude. + * @param tlon The destination longitude. + * @param tlat The destination latitude. + * @return The created overlay or @c NULL upon failure. + * + * Overlay created with this method can be deleted with elm_map_overlay_del(). + * + * @see elm_map_overlay_del() + * + * @ingroup Map + */ +EAPI Elm_Map_Overlay * elm_map_overlay_line_add(Evas_Object *obj, double flon, double flat, double tlon, double tlat); + +/** + * Add a new polygon overlay to the map object. + * This overlay has a polygon type. + * + * @param obj The map object to add a new overlay. + * @return The created overlay or @c NULL upon failure. + * + * At least 3 regions should be added to show the polygon overlay. + * + * Overlay created with this method can be deleted with elm_map_overlay_del(). + * + * @see elm_map_overlay_polygon_region_add() + * @see elm_map_overlay_del() + * + * @ingroup Map + */ +EAPI Elm_Map_Overlay * elm_map_overlay_polygon_add(Evas_Object *obj); + +/** + * Add a geographic coordinates to the polygon overlay. + * + * @param overlay The polygon overlay to get a region. + * @param lon The longitude. + * @param lat The latitude. + * + * At least 3 regions should be added to show the polygon overlay. + * + * Overlay created with this method can be deleted with elm_map_overlay_del(). + * + * @see elm_map_overlay_polygon_add() + * @see elm_map_overlay_del() + * + * @ingroup Map + */ +EAPI void elm_map_overlay_polygon_region_add(Elm_Map_Overlay *overlay, double lon, double lat); + +/** + * Add a new circle overlay to the map object. + * This overlay has a circle type. + * + * @param obj The map object to add a new overlay. + * @param lon The center longitude. + * @param lat The center latitude. + * @param radius The pixel length of radius. + * @return The created overlay or @c NULL upon failure. + * + * Overlay created with this method can be deleted with elm_map_overlay_del(). + * + * @see elm_map_overlay_del() + * + * @ingroup Map + */ +EAPI Elm_Map_Overlay * elm_map_overlay_circle_add(Evas_Object *obj, double lon, double lat, double radius); + +/** + * Add a new scale overlay to the map object. + * This overlay has a scale type. + * + * @param obj The map object to add a new overlay. + * @param x horizontal pixel coordinate. + * @param y vertical pixel coordinate + * @return The created overlay or @c NULL upon failure. + * + * The scale overlay shows the ratio of a distance on the map to the corresponding distance. + * + * Overlay created with this method can be deleted with elm_map_overlay_del(). + * + * @see elm_map_overlay_del() + * + * @ingroup Map + */ +EAPI Elm_Map_Overlay * elm_map_overlay_scale_add(Evas_Object *obj, Evas_Coord x, Evas_Coord y); + +/** * Get the information of tile load status. * * @param obj The map object. -- 2.7.4