1 #include <Elementary.h>
3 #include "elm_widget_map.h"
5 EAPI const char ELM_MAP_SMART_NAME[] = "elm_map";
6 EAPI const char ELM_MAP_PAN_SMART_NAME[] = "elm_map_pan";
8 #define INTERNAL_ENGINE_NAME "Elm_Map_Tile"
9 #define OVERLAY_CLASS_ZOOM_MAX 255
10 #define MAX_CONCURRENT_DOWNLOAD 10
12 #define ROUND(z) (((z) < 0) ? (int)ceil((z) - 0.005) : (int)floor((z) + 0.005))
13 #define EVAS_MAP_POINT 4
14 #define DEFAULT_TILE_SIZE 256
15 #define MARER_MAX_NUMBER 30
16 #define OVERLAY_GROUPING_SCALE 2
18 #define CACHE_ROOT "/elm_map"
19 #define CACHE_TILE_ROOT CACHE_ROOT "/%d/%d/%d"
20 #define CACHE_TILE_PATH "%s/%d.png"
21 #define CACHE_ROUTE_ROOT CACHE_ROOT "/route"
22 #define CACHE_NAME_ROOT CACHE_ROOT "/name"
24 #define ROUTE_YOURS_URL "http://www.yournavigation.org/api/dev/route.php"
25 #define ROUTE_TYPE_MOTORCAR "motocar"
26 #define ROUTE_TYPE_BICYCLE "bicycle"
27 #define ROUTE_TYPE_FOOT "foot"
28 #define YOURS_DISTANCE "distance"
29 #define YOURS_DESCRIPTION "description"
30 #define YOURS_COORDINATES "coordinates"
32 #define NAME_NOMINATIM_URL "http://nominatim.openstreetmap.org"
33 #define NOMINATIM_RESULT "result"
34 #define NOMINATIM_PLACE "place"
35 #define NOMINATIM_ATTR_LON "lon"
36 #define NOMINATIM_ATTR_LAT "lat"
37 #define NOMINATIM_ATTR_ADDRESS "display_name"
39 #ifdef HAVE_ELEMENTARY_ECORE_CON
41 static void _overlay_place(Elm_Map_Smart_Data *sd);
44 _mapnik_url_cb(const Evas_Object *obj __UNUSED__,
51 // ((x+y+zoom)%3)+'a' is requesting map images from distributed
52 // tile servers (eg., a, b, c)
53 snprintf(buf, sizeof(buf), "http://%c.tile.openstreetmap.org/%d/%d/%d.png",
54 ((x + y + zoom) % 3) + 'a', zoom, x, y);
59 _osmarender_url_cb(const Evas_Object *obj __UNUSED__,
66 snprintf(buf, sizeof(buf),
67 "http://%c.tah.openstreetmap.org/Tiles/tile/%d/%d/%d.png",
68 ((x + y + zoom) % 3) + 'a', zoom, x, y);
74 _cyclemap_url_cb(const Evas_Object *obj __UNUSED__,
81 snprintf(buf, sizeof(buf),
82 "http://%c.tile.opencyclemap.org/cycle/%d/%d/%d.png",
83 ((x + y + zoom) % 3) + 'a', zoom, x, y);
89 _mapquest_url_cb(const Evas_Object *obj __UNUSED__,
96 snprintf(buf, sizeof(buf),
97 "http://otile%d.mqcdn.com/tiles/1.0.0/osm/%d/%d/%d.png",
98 ((x + y + zoom) % 4) + 1, zoom, x, y);
104 _mapquest_aerial_url_cb(const Evas_Object *obj __UNUSED__,
111 snprintf(buf, sizeof(buf), "http://oatile%d.mqcdn.com/naip/%d/%d/%d.png",
112 ((x + y + zoom) % 4) + 1, zoom, x, y);
118 _yours_url_cb(const Evas_Object *obj __UNUSED__,
119 const char *type_name,
130 "%s?flat=%lf&flon=%lf&tlat=%lf&tlon=%lf&v=%s&fast=%d&instructions=1",
131 ROUTE_YOURS_URL, flat, flon, tlat, tlon, type_name, method);
136 // TODO: fix monav api
139 _monav_url_cb(const Evas_Object *obj __UNUSED__,
149 snprintf(buf, sizeof(buf),
150 "%s?flat=%f&flon=%f&tlat=%f&tlon=%f&v=%s&fast=%d&instructions=1",
151 ROUTE_MONAV_URL, flat, flon, tlat, tlon, type_name, method);
159 _ors_url_cb(const Evas_Object *obj __UNUSED__,
169 snprintf(buf, sizeof(buf),
170 "%s?flat=%f&flon=%f&tlat=%f&tlon=%f&v=%s&fast=%d&instructions=1",
171 ROUTE_ORS_URL, flat, flon, tlat, tlon, type_name, method);
178 _nominatim_url_cb(const Evas_Object *obj,
186 unsigned int ele, idx;
187 char search_url[PATH_MAX];
189 ELM_MAP_DATA_GET(obj, sd);
191 if (method == ELM_MAP_NAME_METHOD_SEARCH)
193 search_url[0] = '\0';
194 str = eina_str_split_full(name, " ", 0, &ele);
195 for (idx = 0; idx < ele; idx++)
197 eina_strlcat(search_url, str[idx], sizeof(search_url));
198 if (!(idx == (ele - 1)))
199 eina_strlcat(search_url, "+", sizeof(search_url));
201 snprintf(buf, sizeof(buf),
202 "%s/search?q=%s&format=xml&polygon=0&addressdetails=0",
203 NAME_NOMINATIM_URL, search_url);
207 if (str[0]) free(str[0]);
211 else if (method == ELM_MAP_NAME_METHOD_REVERSE)
212 snprintf(buf, sizeof(buf),
213 "%s/reverse?format=xml&lat=%lf&lon=%lf&zoom=%d&addressdetails=0",
214 NAME_NOMINATIM_URL, lat, lon, (int)sd->zoom);
215 else strcpy(buf, "");
220 // Refer : http://wiki.openstreetmap.org/wiki/FAQ
221 // meters per pixel when latitude is 0 (equator)
222 // meters per pixel = _osm_scale_meter[zoom] * cos (latitude)
223 const double _osm_scale_meter[] =
225 78206, 39135.758482, 19567.879241, 9783.939621, 4891.969810,
226 2445.984905, 1222.992453, 611.496226, 305.748113, 152.874057, 76.437028,
227 38.218514, 19.109257, 9.554629, 4.777314, 2.388657, 1.194329, 0.597164,
232 _scale_cb(const Evas_Object *obj __UNUSED__,
233 double lon __UNUSED__,
237 if (zoom < 0 || zoom >= (int)(sizeof(_osm_scale_meter)/sizeof(_osm_scale_meter[0]))) return 0;
238 return _osm_scale_meter[zoom] / cos(lat * ELM_PI / 180.0);
241 const Source_Tile src_tiles[] =
243 {"Mapnik", 0, 18, _mapnik_url_cb, NULL, NULL, _scale_cb},
244 {"Osmarender", 0, 17, _osmarender_url_cb, NULL, NULL, _scale_cb},
245 {"CycleMap", 0, 16, _cyclemap_url_cb, NULL, NULL, _scale_cb},
246 {"MapQuest", 0, 18, _mapquest_url_cb, NULL, NULL, _scale_cb},
247 {"MapQuest Open Aerial", 0, 11, _mapquest_aerial_url_cb, NULL, NULL,
251 // FIXME: Fix more open sources
252 const Source_Route src_routes[] =
254 {"Yours", _yours_url_cb} // http://www.yournavigation.org/
255 //{"Monav", _monav_url_cb},
256 //{"ORS", _ors_url_cb}, // http://www.openrouteservice.org
260 const double _scale_tb[] =
262 10000000, 5000000, 2000000, 1000000, 500000, 200000, 100000, 50000,
263 20000, 10000, 5000, 2000, 1000, 500, 500, 200, 100, 50, 20, 10, 5, 2, 1
266 // FIXME: Add more open sources
267 const Source_Name src_names[] =
269 {"Nominatim", _nominatim_url_cb}
272 static int id_num = 1;
274 static const char SIG_CLICKED[] = "clicked";
275 static const char SIG_CLICKED_DOUBLE[] = "clicked,double";
276 static const char SIG_PRESS[] = "press";
277 static const char SIG_LONGPRESSED[] = "longpressed";
278 static const char SIG_SCROLL[] = "scroll";
279 static const char SIG_SCROLL_DRAG_START[] = "scroll,drag,start";
280 static const char SIG_SCROLL_DRAG_STOP[] = "scroll,drag,stop";
281 static const char SIG_SCROLL_ANIM_START[] = "scroll,anim,start";
282 static const char SIG_SCROLL_ANIM_STOP[] = "scroll,anim,stop";
283 static const char SIG_ZOOM_START[] = "zoom,start";
284 static const char SIG_ZOOM_STOP[] = "zoom,stop";
285 static const char SIG_ZOOM_CHANGE[] = "zoom,change";
286 static const char SIG_LOADED[] = "loaded";
287 static const char SIG_TILE_LOAD[] = "tile,load";
288 static const char SIG_TILE_LOADED[] = "tile,loaded";
289 static const char SIG_TILE_LOADED_FAIL[] = "tile,loaded,fail";
290 static const char SIG_ROUTE_LOAD[] = "route,load";
291 static const char SIG_ROUTE_LOADED[] = "route,loaded";
292 static const char SIG_ROUTE_LOADED_FAIL[] = "route,loaded,fail";
293 static const char SIG_NAME_LOAD[] = "name,load";
294 static const char SIG_NAME_LOADED[] = "name,loaded";
295 static const char SIG_NAME_LOADED_FAIL[] = "name,loaded,fail";
296 static const char SIG_OVERLAY_CLICKED[] = "overlay,clicked";
297 static const char SIG_OVERLAY_DEL[] = "overlay,del";
298 static const char SIG_LANG_CHANGED[] = "language,changed";
300 static const Evas_Smart_Cb_Description _smart_callbacks[] = {
302 {SIG_CLICKED_DOUBLE, ""},
304 {SIG_LONGPRESSED, ""},
306 {SIG_SCROLL_DRAG_START, ""},
307 {SIG_SCROLL_DRAG_STOP, ""},
308 {SIG_SCROLL_ANIM_START, ""},
309 {SIG_SCROLL_ANIM_STOP, ""},
310 {SIG_ZOOM_START, ""},
312 {SIG_ZOOM_CHANGE, ""},
315 {SIG_TILE_LOADED, ""},
316 {SIG_TILE_LOADED_FAIL, ""},
317 {SIG_ROUTE_LOAD, ""},
318 {SIG_ROUTE_LOADED, ""},
319 {SIG_ROUTE_LOADED_FAIL, ""},
321 {SIG_NAME_LOADED, ""},
322 {SIG_NAME_LOADED_FAIL, ""},
323 {SIG_OVERLAY_CLICKED, ""},
324 {SIG_OVERLAY_DEL, ""},
325 {SIG_LANG_CHANGED, ""},
329 static const Evas_Smart_Interface *_smart_interfaces[] =
331 (Evas_Smart_Interface *)&ELM_SCROLLABLE_IFACE, NULL
334 EVAS_SMART_SUBCLASS_IFACE_NEW
335 (ELM_MAP_SMART_NAME, _elm_map, Elm_Map_Smart_Class,
336 Elm_Widget_Smart_Class, elm_widget_smart_class_get, _smart_callbacks,
339 ELM_INTERNAL_SMART_SUBCLASS_NEW
340 (ELM_MAP_PAN_SMART_NAME, _elm_map_pan, Elm_Map_Pan_Smart_Class,
341 Elm_Pan_Smart_Class, elm_pan_smart_class_get, NULL);
344 _elm_map_smart_translate(Evas_Object *obj)
346 evas_object_smart_callback_call(obj, SIG_LANG_CHANGED, NULL);
351 _edj_overlay_size_get(Elm_Map_Smart_Data *sd,
358 EINA_SAFETY_ON_NULL_RETURN(w);
359 EINA_SAFETY_ON_NULL_RETURN(h);
361 edj = edje_object_add(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
362 elm_widget_theme_object_set
363 (ELM_WIDGET_DATA(sd)->obj, edj, "map/marker", "radio",
364 elm_widget_style_get(ELM_WIDGET_DATA(sd)->obj));
366 s = edje_object_data_get(edj, "size_w");
370 s = edje_object_data_get(edj, "size_h");
374 evas_object_del(edj);
378 _rotate_do(Evas_Coord x,
386 double r = (degree * M_PI) / 180.0;
388 if (xx) *xx = ((x - cx) * cos(r)) + ((y - cy) * cos(r + M_PI_2)) + cx;
389 if (yy) *yy = ((x - cx) * sin(r)) + ((y - cy) * sin(r + M_PI_2)) + cy;
393 _obj_rotate(Elm_Map_Smart_Data *sd,
396 Evas_Coord w, h, ow, oh;
398 evas_map_util_points_populate_from_object(sd->map, obj);
400 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
401 evas_object_image_size_get(obj, &w, &h);
402 if ((w > ow) || (h > oh))
404 evas_map_point_image_uv_set(sd->map, 0, 0, 0);
405 evas_map_point_image_uv_set(sd->map, 1, w, 0);
406 evas_map_point_image_uv_set(sd->map, 2, w, h);
407 evas_map_point_image_uv_set(sd->map, 3, 0, h);
409 evas_map_util_rotate(sd->map, sd->pan_rotate.d, sd->pan_rotate.cx,
412 evas_object_map_set(obj, sd->map);
413 evas_object_map_enable_set(obj, EINA_TRUE);
417 _obj_place(Evas_Object *obj,
423 EINA_SAFETY_ON_NULL_RETURN(obj);
425 evas_object_move(obj, x, y);
426 evas_object_resize(obj, w, h);
427 evas_object_show(obj);
431 _coord_to_region_convert(Elm_Map_Smart_Data *sd,
440 EINA_SAFETY_ON_NULL_RETURN(sd);
442 zoom = floor(log(size / sd->size.tile) / log(2));
443 if ((sd->src_tile) && (sd->src_tile->coord_to_geo))
445 if (sd->src_tile->coord_to_geo
446 (ELM_WIDGET_DATA(sd)->obj, zoom, x, y, size, lon, lat))
450 if (lon) *lon = (x / (double)size * 360.0) - 180;
453 double n = ELM_PI - (2.0 * ELM_PI * y / size);
454 *lat = 180.0 / ELM_PI *atan(0.5 * (exp(n) - exp(-n)));
459 _region_to_coord_convert(Elm_Map_Smart_Data *sd,
468 EINA_SAFETY_ON_NULL_RETURN(sd);
470 zoom = floor(log(size / 256) / log(2));
472 if (strcmp(sd->engine->name, INTERNAL_ENGINE_NAME))
474 sd->engine->region_to_canvas
475 (ELM_WIDGET_DATA(sd)->obj, lon, lat, x, y);
479 if ((sd->src_tile) && (sd->src_tile->geo_to_coord))
481 if (sd->src_tile->geo_to_coord
482 (ELM_WIDGET_DATA(sd)->obj, zoom, lon, lat, size, x, y)) return;
485 if (x) *x = floor((lon + 180.0) / 360.0 * size);
487 *y = floor((1.0 - log(tan(lat * ELM_PI / 180.0) +
488 (1.0 / cos(lat * ELM_PI / 180.0)))
489 / ELM_PI) / 2.0 * size);
493 _viewport_coord_get(Elm_Map_Smart_Data *sd,
499 Evas_Coord x, y, w, h;
501 EINA_SAFETY_ON_NULL_RETURN(sd);
503 sd->s_iface->content_pos_get(ELM_WIDGET_DATA(sd)->obj, &x, &y);
504 sd->s_iface->content_viewport_size_get(ELM_WIDGET_DATA(sd)->obj, &w, &h);
506 if (w > sd->size.w) x -= ((w - sd->size.w) / 2);
507 if (h > sd->size.h) y -= ((h - sd->size.h) / 2);
514 // Map coordinates to canvas geometry without rotate
516 _coord_to_canvas_no_rotation(Elm_Map_Smart_Data *sd,
522 Evas_Coord vx, vy, sx, sy;
524 if (!strcmp(sd->engine->name, INTERNAL_ENGINE_NAME))
526 _viewport_coord_get(sd, &vx, &vy, NULL, NULL);
527 evas_object_geometry_get(sd->pan_obj, &sx, &sy, NULL, NULL);
528 if (xx) *xx = x - vx + sx;
529 if (yy) *yy = y - vy + sy;
538 // Map coordinates to canvas geometry
540 _coord_to_canvas(Elm_Map_Smart_Data *sd,
546 _coord_to_canvas_no_rotation(sd, x, y, &x, &y);
547 if (!strcmp(sd->engine->name, INTERNAL_ENGINE_NAME))
549 _rotate_do(x, y, sd->pan_rotate.cx, sd->pan_rotate.cy, sd->pan_rotate.d, &x, &y);
555 // Canvas geometry to map coordinates
557 _canvas_to_coord(Elm_Map_Smart_Data *sd,
563 Evas_Coord vx, vy, sx, sy;
565 _viewport_coord_get(sd, &vx, &vy, NULL, NULL);
566 evas_object_geometry_get(sd->pan_obj, &sx, &sy, NULL, NULL);
567 _rotate_do(x - sx + vx, y - sy + vy, sd->pan_rotate.cx - sx + vx,
568 sd->pan_rotate.cy - sy + vy, -sd->pan_rotate.d, &x, &y);
574 _grid_item_coord_get(Grid_Item *gi,
580 EINA_SAFETY_ON_NULL_RETURN(gi);
582 if (x) *x = gi->x * gi->wsd->size.tile;
583 if (y) *y = gi->y * gi->wsd->size.tile;
584 if (w) *w = gi->wsd->size.tile;
585 if (h) *h = gi->wsd->size.tile;
589 _grid_item_in_viewport(Grid_Item *gi)
591 Evas_Coord vx, vy, vw, vh;
592 Evas_Coord x, y, w, h;
594 EINA_SAFETY_ON_NULL_RETURN_VAL(gi, EINA_FALSE);
596 _viewport_coord_get(gi->wsd, &vx, &vy, &vw, &vh);
597 _grid_item_coord_get(gi, &x, &y, &w, &h);
599 return ELM_RECTS_INTERSECT(x, y, w, h, vx, vy, vw, vh);
603 _loaded_timeout_cb(void *data)
605 Elm_Map_Smart_Data *sd = data;
607 EINA_SAFETY_ON_NULL_RETURN_VAL(data, EINA_FALSE);
609 sd->loaded_timer = NULL;
610 if (!(sd->download_num) && !(sd->download_idler))
611 evas_object_smart_callback_call
612 (ELM_WIDGET_DATA(sd)->obj, SIG_LOADED, NULL);
613 return ECORE_CALLBACK_CANCEL;
617 _grid_item_update(Grid_Item *gi)
621 EINA_SAFETY_ON_NULL_RETURN(gi);
623 evas_object_image_file_set(gi->img, gi->file, NULL);
624 if (!gi->wsd->zoom_timer && !gi->wsd->scr_timer)
625 evas_object_image_smooth_scale_set(gi->img, EINA_TRUE);
626 else evas_object_image_smooth_scale_set(gi->img, EINA_FALSE);
628 err = evas_object_image_load_error_get(gi->img);
629 if (err != EVAS_LOAD_ERROR_NONE)
631 ERR("Image loading error (%s): %s", gi->file, evas_load_error_str(err));
632 ecore_file_remove(gi->file);
633 gi->file_have = EINA_FALSE;
637 Evas_Coord x, y, w, h;
639 _grid_item_coord_get(gi, &x, &y, &w, &h);
640 _coord_to_canvas_no_rotation(gi->wsd, x, y, &x, &y);
641 _obj_place(gi->img, x, y, w, h);
642 _obj_rotate(gi->wsd, gi->img);
643 gi->file_have = EINA_TRUE;
646 if (gi->wsd->loaded_timer) ecore_timer_del(gi->wsd->loaded_timer);
647 gi->wsd->loaded_timer = ecore_timer_add(0.25, _loaded_timeout_cb, gi->wsd);
651 _grid_item_load(Grid_Item *gi)
653 EINA_SAFETY_ON_NULL_RETURN(gi);
655 if (gi->file_have) _grid_item_update(gi);
658 gi->wsd->download_list = eina_list_remove(gi->wsd->download_list, gi);
659 gi->wsd->download_list = eina_list_append(gi->wsd->download_list, gi);
664 _grid_item_unload(Grid_Item *gi)
666 EINA_SAFETY_ON_NULL_RETURN(gi);
670 evas_object_hide(gi->img);
671 evas_object_image_file_set(gi->img, NULL, NULL);
675 ecore_file_download_abort(gi->job);
676 ecore_file_remove(gi->file);
680 else gi->wsd->download_list = eina_list_remove(gi->wsd->download_list, gi);
684 _grid_item_create(Grid *g,
693 EINA_SAFETY_ON_NULL_RETURN_VAL(g, NULL);
695 gi = ELM_NEW(Grid_Item);
701 gi->file_have = EINA_FALSE;
704 gi->img = evas_object_image_add
705 (evas_object_evas_get(ELM_WIDGET_DATA(g->wsd)->obj));
706 evas_object_image_smooth_scale_set(gi->img, EINA_FALSE);
707 evas_object_image_scale_hint_set(gi->img, EVAS_IMAGE_SCALE_HINT_DYNAMIC);
708 evas_object_image_filled_set(gi->img, EINA_TRUE);
709 evas_object_smart_member_add(gi->img, g->wsd->pan_obj);
710 evas_object_pass_events_set(gi->img, EINA_TRUE);
711 evas_object_stack_below(gi->img, g->wsd->sep_maps_overlays);
714 const char *cachedir;
717 snprintf(buf, sizeof(buf), "%s" CACHE_TILE_ROOT, efreet_cache_home_get(),
718 g->wsd->id, g->zoom, x);
721 cachedir = getenv("XDG_CACHE_HOME");
722 snprintf(buf, sizeof(buf), "%s/%s" CACHE_TILE_ROOT, getenv("HOME"),
723 cachedir ? : "/.config", g->wsd->id, g->zoom, x);
727 snprintf(buf2, sizeof(buf2), CACHE_TILE_PATH, buf, y);
728 if (!ecore_file_exists(buf)) ecore_file_mkpath(buf);
730 eina_stringshare_replace(&gi->file, buf2);
731 url = g->wsd->src_tile->url_cb(ELM_WIDGET_DATA(g->wsd)->obj, x, y, g->zoom);
732 if ((!url) || (!strlen(url)))
734 eina_stringshare_replace(&gi->url, NULL);
735 ERR("Getting source url failed: %s", gi->file);
737 else eina_stringshare_replace(&gi->url, url);
740 eina_matrixsparse_data_idx_set(g->grid, y, x, gi);
746 _grid_item_free(Grid_Item *gi)
748 EINA_SAFETY_ON_NULL_RETURN(gi);
750 _grid_item_unload(gi);
751 if (gi->g && gi->g->grid)
752 eina_matrixsparse_data_idx_set(gi->g->grid, gi->y, gi->x, NULL);
753 if (gi->url) eina_stringshare_del(gi->url);
754 if (gi->file_have) ecore_file_remove(gi->file);
755 if (gi->file) eina_stringshare_del(gi->file);
756 if (gi->img) evas_object_del(gi->img);
762 _downloaded_cb(void *data,
763 const char *file __UNUSED__,
766 Grid_Item *gi = data;
770 DBG("Download success from %s to %s", gi->url, gi->file);
772 _grid_item_update(gi);
773 gi->wsd->finish_num++;
774 evas_object_smart_callback_call
775 (ELM_WIDGET_DATA(gi->wsd)->obj, SIG_TILE_LOADED, NULL);
779 WRN("Download failed from %s to %s (%d) ", gi->url, gi->file, status);
781 ecore_file_remove(gi->file);
782 gi->file_have = EINA_FALSE;
783 evas_object_smart_callback_call
784 (ELM_WIDGET_DATA(gi->wsd)->obj, SIG_TILE_LOADED_FAIL, NULL);
788 gi->wsd->download_num--;
789 if (!gi->wsd->download_num)
790 edje_object_signal_emit(ELM_WIDGET_DATA(gi->wsd)->resize_obj,
791 "elm,state,busy,stop", "elm");
795 _download_job(void *data)
797 Elm_Map_Smart_Data *sd = data;
801 if (!eina_list_count(sd->download_list))
803 sd->download_idler = NULL;
804 return ECORE_CALLBACK_CANCEL;
807 EINA_LIST_REVERSE_FOREACH_SAFE(sd->download_list, l, ll, gi)
811 if ((gi->g->zoom != sd->zoom) || !(_grid_item_in_viewport(gi)))
813 sd->download_list = eina_list_remove(sd->download_list, gi);
816 if (sd->download_num >= MAX_CONCURRENT_DOWNLOAD)
817 return ECORE_CALLBACK_RENEW;
819 ret = ecore_file_download_full
820 (gi->url, gi->file, _downloaded_cb, NULL, gi, &(gi->job), sd->ua);
822 if ((!ret) || (!gi->job))
823 ERR("Can't start to download from %s to %s", gi->url, gi->file);
826 sd->download_list = eina_list_remove(sd->download_list, gi);
829 evas_object_smart_callback_call
830 (ELM_WIDGET_DATA(sd)->obj, SIG_TILE_LOAD, NULL);
831 if (sd->download_num == 1)
832 edje_object_signal_emit(ELM_WIDGET_DATA(sd)->resize_obj,
833 "elm,state,busy,start", "elm");
837 return ECORE_CALLBACK_RENEW;
841 _grid_viewport_get(Grid *g,
848 Evas_Coord vx, vy, vw, vh;
850 EINA_SAFETY_ON_NULL_RETURN(g);
852 _viewport_coord_get(g->wsd, &vx, &vy, &vw, &vh);
856 xx = (vx / g->wsd->size.tile) - 1;
859 yy = (vy / g->wsd->size.tile) - 1;
862 ww = (vw / g->wsd->size.tile) + 3;
863 if (xx + ww >= g->tw) ww = g->tw - xx;
865 hh = (vh / g->wsd->size.tile) + 3;
866 if (yy + hh >= g->th) hh = g->th - yy;
875 _grid_unload(Grid *g)
877 Eina_Matrixsparse_Cell *cell;
881 EINA_SAFETY_ON_NULL_RETURN(g);
883 it = eina_matrixsparse_iterator_new(g->grid);
884 EINA_ITERATOR_FOREACH(it, cell)
886 gi = eina_matrixsparse_cell_data_get(cell);
887 _grid_item_unload(gi);
889 eina_iterator_free(it);
895 Eina_Matrixsparse_Cell *cell;
896 int x, y, xx, yy, ww, hh;
900 EINA_SAFETY_ON_NULL_RETURN(g);
902 it = eina_matrixsparse_iterator_new(g->grid);
903 EINA_ITERATOR_FOREACH(it, cell)
905 gi = eina_matrixsparse_cell_data_get(cell);
906 if (!_grid_item_in_viewport(gi)) _grid_item_unload(gi);
908 eina_iterator_free(it);
910 _grid_viewport_get(g, &xx, &yy, &ww, &hh);
911 for (y = yy; y < yy + hh; y++)
913 for (x = xx; x < xx + ww; x++)
915 gi = eina_matrixsparse_data_idx_get(g->grid, y, x);
916 if (!gi) gi = _grid_item_create(g, x, y);
923 _grid_place(Elm_Map_Smart_Data *sd)
928 EINA_SAFETY_ON_NULL_RETURN(sd);
930 EINA_LIST_FOREACH(sd->grids, l, g)
932 if (sd->zoom == g->zoom) _grid_load(g);
933 else _grid_unload(g);
935 if (!sd->download_idler)
936 sd->download_idler = ecore_idler_add(_download_job, sd);
940 _grid_all_create(Elm_Map_Smart_Data *sd)
944 EINA_SAFETY_ON_NULL_RETURN(sd->src_tile);
946 for (zoom = sd->src_tile->zoom_min; zoom <= sd->src_tile->zoom_max; zoom++)
954 tnum = pow(2.0, g->zoom);
957 g->grid = eina_matrixsparse_new(g->th, g->tw, NULL, NULL);
958 sd->grids = eina_list_append(sd->grids, g);
963 _grid_all_clear(Elm_Map_Smart_Data *sd)
967 EINA_SAFETY_ON_NULL_RETURN(sd);
969 EINA_LIST_FREE (sd->grids, g)
971 Eina_Matrixsparse_Cell *cell;
972 Eina_Iterator *it = eina_matrixsparse_iterator_new(g->grid);
974 EINA_ITERATOR_FOREACH(it, cell)
978 gi = eina_matrixsparse_cell_data_get(cell);
979 if (gi) _grid_item_free(gi);
981 eina_iterator_free(it);
983 eina_matrixsparse_free(g->grid);
989 _track_place(Elm_Map_Smart_Data *sd)
995 Evas_Coord px, py, ow, oh;
996 int xmin, xmax, ymin, ymax;
1000 _viewport_coord_get(sd, NULL, NULL, &ow, &oh);
1004 EINA_LIST_FOREACH(sd->track, l, route)
1006 double lon_min, lon_max;
1007 double lat_min, lat_max;
1009 elm_route_longitude_min_max_get(route, &lon_min, &lon_max);
1010 elm_route_latitude_min_max_get(route, &lat_min, &lat_max);
1011 _region_to_coord_convert(sd, lon_min, lat_max, size, &xmin, &ymin);
1012 _region_to_coord_convert(sd, lon_max, lat_min, size, &xmax, &ymax);
1014 if ( !(xmin < px && xmax < px) && !(xmin > px + ow && xmax > px + ow))
1016 if ((ymin < py && ymax < py) ||
1017 (ymin > py + oh && ymax > py + oh))
1020 evas_object_move(route, xmin - px, ymin - py);
1021 evas_object_resize(route, xmax - xmin, ymax - ymin);
1023 evas_object_raise(route);
1024 _obj_rotate(sd, route);
1025 evas_object_show(route);
1030 //the route is not display
1031 evas_object_hide(route);
1039 _smooth_update(Elm_Map_Smart_Data *sd)
1044 EINA_LIST_FOREACH(sd->grids, l, g)
1046 Eina_Iterator *it = eina_matrixsparse_iterator_new(g->grid);
1047 Eina_Matrixsparse_Cell *cell;
1049 EINA_ITERATOR_FOREACH(it, cell)
1051 Grid_Item *gi = eina_matrixsparse_cell_data_get(cell);
1052 if (_grid_item_in_viewport(gi))
1053 evas_object_image_smooth_scale_set(gi->img, EINA_TRUE);
1055 eina_iterator_free(it);
1060 _zoom_timeout_cb(void *data)
1062 Elm_Map_Smart_Data *sd = data;
1065 sd->zoom_timer = NULL;
1066 evas_object_smart_callback_call
1067 (ELM_WIDGET_DATA(sd)->obj, SIG_ZOOM_STOP, NULL);
1069 return ECORE_CALLBACK_CANCEL;
1073 _zoom(Elm_Map_Smart_Data *sd, double zoom, int animation)
1075 if (zoom > sd->zoom_max) zoom = sd->zoom_max;
1076 else if (zoom < sd->zoom_min) zoom = sd->zoom_min;
1078 sd->engine->zoom(ELM_WIDGET_DATA(sd)->obj, zoom, animation);
1079 sd->zoom_detail = zoom;
1080 sd->zoom = ROUND(sd->zoom_detail);
1082 if (strcmp(sd->engine->name, INTERNAL_ENGINE_NAME))
1085 if (sd->zoom_timer) ecore_timer_del(sd->zoom_timer);
1087 evas_object_smart_callback_call
1088 (ELM_WIDGET_DATA(sd)->obj, SIG_ZOOM_START, NULL);
1090 sd->zoom_timer = ecore_timer_add(0.25, _zoom_timeout_cb, sd);
1091 evas_object_smart_callback_call
1092 (ELM_WIDGET_DATA(sd)->obj, SIG_ZOOM_CHANGE, NULL);
1096 _sizing_eval(Elm_Map_Smart_Data *sd)
1098 Evas_Coord maxw = -1, maxh = -1;
1100 evas_object_size_hint_max_get(ELM_WIDGET_DATA(sd)->obj, &maxw, &maxh);
1101 evas_object_size_hint_max_set(ELM_WIDGET_DATA(sd)->obj, maxw, maxh);
1105 _changed_size_hints_cb(void *data,
1107 Evas_Object *obj __UNUSED__,
1108 void *event_info __UNUSED__)
1114 _scr_timeout_cb(void *data)
1116 Elm_Map_Smart_Data *sd = data;
1119 sd->scr_timer = NULL;
1120 evas_object_smart_callback_call
1121 (ELM_WIDGET_DATA(sd)->obj, SIG_SCROLL_DRAG_STOP, NULL);
1123 return ECORE_CALLBACK_CANCEL;
1127 _scroll_cb(Evas_Object *obj,
1128 void *data __UNUSED__)
1130 ELM_MAP_DATA_GET(obj, sd);
1132 if (sd->scr_timer) ecore_timer_del(sd->scr_timer);
1134 evas_object_smart_callback_call
1135 (ELM_WIDGET_DATA(sd)->obj, SIG_SCROLL_DRAG_START, NULL);
1136 sd->scr_timer = ecore_timer_add(0.25, _scr_timeout_cb, sd);
1137 evas_object_smart_callback_call(ELM_WIDGET_DATA(sd)->obj, SIG_SCROLL, NULL);
1141 _scroll_animate_start_cb(Evas_Object *obj,
1142 void *data __UNUSED__)
1144 ELM_MAP_DATA_GET(obj, sd);
1146 evas_object_smart_callback_call
1147 (ELM_WIDGET_DATA(sd)->obj, SIG_SCROLL_ANIM_START, NULL);
1151 _scroll_animate_stop_cb(Evas_Object *obj,
1152 void *data __UNUSED__)
1154 ELM_MAP_DATA_GET(obj, sd);
1156 evas_object_smart_callback_call
1157 (ELM_WIDGET_DATA(sd)->obj, SIG_SCROLL_ANIM_STOP, NULL);
1161 _long_press_cb(void *data)
1163 Elm_Map_Smart_Data *sd = data;
1165 sd->long_timer = NULL;
1166 evas_object_smart_callback_call
1167 (ELM_WIDGET_DATA(sd)->obj, SIG_LONGPRESSED, &sd->ev);
1169 return ECORE_CALLBACK_CANCEL;
1173 _mouse_down_cb(void *data,
1174 Evas *evas __UNUSED__,
1175 Evas_Object *obj __UNUSED__,
1178 Elm_Map_Smart_Data *sd = data;
1179 Evas_Event_Mouse_Down *ev = event_info;
1181 if (ev->button != 1) return;
1182 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) sd->on_hold = EINA_TRUE;
1183 else sd->on_hold = EINA_FALSE;
1185 if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK)
1186 evas_object_smart_callback_call
1187 (ELM_WIDGET_DATA(sd)->obj, SIG_CLICKED_DOUBLE, ev);
1189 evas_object_smart_callback_call
1190 (ELM_WIDGET_DATA(sd)->obj, SIG_PRESS, ev);
1192 if (sd->long_timer) ecore_timer_del(sd->long_timer);
1195 ecore_timer_add(_elm_config->longpress_timeout, _long_press_cb, sd);
1199 _mouse_up_cb(void *data,
1200 Evas *evas __UNUSED__,
1201 Evas_Object *obj __UNUSED__,
1204 Elm_Map_Smart_Data *sd = data;
1205 Evas_Event_Mouse_Up *ev = event_info;
1207 EINA_SAFETY_ON_NULL_RETURN(ev);
1209 if (ev->button != 1) return;
1211 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) sd->on_hold = EINA_TRUE;
1212 else sd->on_hold = EINA_FALSE;
1216 ecore_timer_del(sd->long_timer);
1217 sd->long_timer = NULL;
1221 evas_object_smart_callback_call
1222 (ELM_WIDGET_DATA(sd)->obj, SIG_CLICKED, ev);
1223 sd->on_hold = EINA_FALSE;
1227 _mouse_wheel_cb(void *data,
1229 Evas_Object *obj __UNUSED__,
1232 Elm_Map_Smart_Data *sd = data;
1236 Evas_Event_Mouse_Wheel *ev = event_info;
1238 _zoom(sd, sd->zoom_detail - ((double)ev->z /10), 0);
1243 _region_max_min_get(Eina_List *overlays,
1244 double *max_longitude,
1245 double *min_longitude,
1246 double *max_latitude,
1247 double *min_latitude)
1249 double max_lon = -180, min_lon = 180;
1250 double max_lat = -90, min_lat = 90;
1251 Elm_Map_Overlay *overlay;
1253 EINA_LIST_FREE (overlays, overlay)
1257 if (overlay->type == ELM_MAP_OVERLAY_TYPE_DEFAULT)
1259 Overlay_Default *ovl = overlay->ovl;
1264 else if (overlay->type == ELM_MAP_OVERLAY_TYPE_CLASS)
1266 // FIXME: class center coord is alright??
1267 Overlay_Class *ovl = overlay->ovl;
1268 double max_lo, min_lo, max_la, min_la;
1271 (ovl->members, &max_lo, &min_lo, &max_la, &min_la);
1272 lon = (max_lo + min_lo) / 2;
1273 lat = (max_la + min_la) / 2;
1275 else if (overlay->type == ELM_MAP_OVERLAY_TYPE_BUBBLE)
1277 Overlay_Bubble *ovl = overlay->ovl;
1284 WRN("Not supported overlay type: %d", overlay->type);
1287 if (lon > max_lon) max_lon = lon;
1288 if (lon < min_lon) min_lon = lon;
1289 if (lat > max_lat) max_lat = lat;
1290 if (lat < min_lat) min_lat = lat;
1293 if (max_longitude) *max_longitude = max_lon;
1294 if (min_longitude) *min_longitude = min_lon;
1295 if (max_latitude) *max_latitude = max_lat;
1296 if (min_latitude) *min_latitude = min_lat;
1299 static Evas_Object *
1300 _icon_dup(Evas_Object *icon,
1301 Evas_Object *parent)
1306 if (!icon || !parent) return NULL;
1307 dupp = evas_object_image_filled_add(evas_object_evas_get(parent));
1308 evas_object_image_source_set(dupp, icon);
1309 // Set size as origin' sizse for proxy
1310 evas_object_geometry_get(icon, NULL, NULL, &w, &h);
1311 if (w <= 0 || h <= 0)
1313 evas_object_size_hint_min_get(icon, &w, &h);
1314 evas_object_size_hint_min_set(dupp, w, h);
1316 else evas_object_resize(dupp, w, h);
1317 // Original should have size for proxy
1318 evas_object_resize(icon, w, h);
1324 _overlay_clicked_cb(void *data,
1326 Evas_Object *obj __UNUSED__,
1327 void *ev __UNUSED__)
1329 Elm_Map_Overlay *overlay = data;
1331 EINA_SAFETY_ON_NULL_RETURN(data);
1333 evas_object_smart_callback_call
1334 (ELM_WIDGET_DATA(overlay->wsd)->obj, SIG_OVERLAY_CLICKED, overlay);
1336 overlay->cb(overlay->cb_data, ELM_WIDGET_DATA(overlay->wsd)->obj, overlay);
1340 _overlay_default_hide(Overlay_Default *ovl)
1342 EINA_SAFETY_ON_NULL_RETURN(ovl);
1344 if (ovl->content) evas_object_hide(ovl->content);
1345 if (ovl->icon) evas_object_hide(ovl->icon);
1346 if (ovl->clas_content) evas_object_hide(ovl->clas_content);
1347 if (ovl->clas_icon) evas_object_hide(ovl->clas_icon);
1348 if (ovl->layout) evas_object_hide(ovl->layout);
1352 _overlay_default_show(Overlay_Default *ovl)
1355 Evas_Coord x, y, w, h;
1357 EINA_SAFETY_ON_NULL_RETURN(ovl);
1359 evas_object_hide(ovl->layout);
1362 disp = ovl->content;
1363 evas_object_geometry_get(disp, NULL, NULL, &w, &h);
1364 if (w <= 0 || h <= 0) evas_object_size_hint_min_get(disp, &w, &h);
1368 else if (!(ovl->icon) && ovl->clas_content)
1370 disp = ovl->clas_content;
1372 evas_object_geometry_get(disp, NULL, NULL, &w, &h);
1373 if (w <= 0 || h <= 0) evas_object_size_hint_min_get(disp, &w, &h);
1377 if (ovl->icon) evas_object_show(ovl->icon);
1378 else if (ovl->clas_icon)
1379 evas_object_show(ovl->clas_icon);
1384 _coord_to_canvas(ovl->wsd, ovl->x, ovl->y, &x, &y);
1385 _obj_place(disp, x - (w / 2), y - (h / 2), w, h);
1389 _overlay_default_coord_get(Overlay_Default *ovl,
1395 EINA_SAFETY_ON_NULL_RETURN(ovl);
1404 _overlay_default_coord_set(Overlay_Default *ovl,
1408 EINA_SAFETY_ON_NULL_RETURN(ovl);
1415 _overlay_default_coord_update(Overlay_Default *ovl)
1417 EINA_SAFETY_ON_NULL_RETURN(ovl);
1419 _region_to_coord_convert
1420 (ovl->wsd, ovl->lon, ovl->lat, ovl->wsd->size.w, &ovl->x, &ovl->y);
1424 _overlay_default_layout_text_update(Overlay_Default *ovl,
1427 if (!ovl->content && !ovl->icon && !ovl->clas_content && !ovl->clas_icon)
1428 elm_layout_text_set(ovl->layout, "elm.text", text);
1432 _overlay_default_content_update(Overlay_Default *ovl,
1433 Evas_Object *content,
1434 Elm_Map_Overlay *overlay)
1436 EINA_SAFETY_ON_NULL_RETURN(ovl);
1438 if (ovl->content == content) return;
1439 if (ovl->content) evas_object_del(ovl->content);
1440 ovl->content = content;
1441 if (!strcmp(ovl->wsd->engine->name, INTERNAL_ENGINE_NAME))
1442 evas_object_smart_member_add(ovl->content, ovl->wsd->pan_obj);
1444 evas_object_smart_member_add(ovl->content, ELM_WIDGET_DATA(ovl->wsd)->obj);
1445 evas_object_stack_above(ovl->content, ovl->wsd->sep_maps_overlays);
1448 evas_object_event_callback_add(ovl->content, EVAS_CALLBACK_MOUSE_DOWN,
1449 _overlay_clicked_cb, overlay);
1453 _overlay_default_layout_update(Overlay_Default *ovl)
1455 EINA_SAFETY_ON_NULL_RETURN(ovl);
1459 evas_object_color_set(ovl->layout, 255, 255, 255, 255);
1460 elm_layout_theme_set
1461 (ovl->layout, "map/marker", "empty",
1462 elm_widget_style_get(ELM_WIDGET_DATA(ovl->wsd)->obj));
1463 elm_object_part_content_set(ovl->layout, "elm.icon", ovl->icon);
1465 else if (!ovl->icon && ovl->clas_icon)
1467 evas_object_color_set(ovl->layout, 255, 255, 255, 255);
1468 elm_layout_theme_set
1469 (ovl->layout, "map/marker", "empty",
1470 elm_widget_style_get(ELM_WIDGET_DATA(ovl->wsd)->obj));
1471 elm_object_part_content_set(ovl->layout, "elm.icon", ovl->clas_icon);
1475 evas_object_color_set
1476 (ovl->layout, ovl->c.r, ovl->c.g, ovl->c.b, ovl->c.a);
1477 elm_layout_theme_set
1478 (ovl->layout, "map/marker", "radio",
1479 elm_widget_style_get(ELM_WIDGET_DATA(ovl->wsd)->obj));
1484 _overlay_default_class_content_update(Overlay_Default *ovl,
1485 Evas_Object *content)
1487 EINA_SAFETY_ON_NULL_RETURN(ovl);
1489 if (ovl->clas_content) evas_object_del(ovl->clas_content);
1490 ovl->clas_content = _icon_dup(content, ovl->layout);
1491 if (!strcmp(ovl->wsd->engine->name, INTERNAL_ENGINE_NAME))
1492 evas_object_smart_member_add(ovl->clas_content, ovl->wsd->pan_obj);
1494 evas_object_smart_member_add(ovl->clas_content, ELM_WIDGET_DATA(ovl->wsd)->obj);
1495 evas_object_stack_above(ovl->clas_content, ovl->wsd->sep_maps_overlays);
1496 _overlay_default_layout_update(ovl);
1500 _overlay_default_icon_update(Overlay_Default *ovl,
1503 EINA_SAFETY_ON_NULL_RETURN(ovl);
1505 if (ovl->icon == icon) return;
1507 if (ovl->icon) evas_object_del(ovl->icon);
1509 _overlay_default_layout_update(ovl);
1513 _overlay_default_class_icon_update(Overlay_Default *ovl,
1516 EINA_SAFETY_ON_NULL_RETURN(ovl);
1518 if (ovl->clas_icon) evas_object_del(ovl->clas_icon);
1519 ovl->clas_icon = _icon_dup(icon, ovl->layout);
1520 _overlay_default_layout_update(ovl);
1524 _overlay_default_color_update(Overlay_Default *ovl,
1527 EINA_SAFETY_ON_NULL_RETURN(ovl);
1530 _overlay_default_layout_update(ovl);
1534 _overlay_default_free(Overlay_Default *ovl)
1536 EINA_SAFETY_ON_NULL_RETURN(ovl);
1538 if (ovl->content) evas_object_del(ovl->content);
1539 if (ovl->icon) evas_object_del(ovl->icon);
1540 if (ovl->clas_content) evas_object_del(ovl->clas_content);
1541 if (ovl->clas_icon) evas_object_del(ovl->clas_icon);
1542 if (ovl->layout) evas_object_del(ovl->layout);
1547 static Overlay_Default *
1548 _overlay_default_new(Elm_Map_Overlay *overlay,
1554 Overlay_Default *ovl;
1556 EINA_SAFETY_ON_NULL_RETURN_VAL(overlay, NULL);
1558 ovl = ELM_NEW(Overlay_Default);
1559 ovl->wsd = overlay->wsd;
1560 _edj_overlay_size_get(ovl->wsd, &(ovl->w), &(ovl->h));
1563 ovl->layout = elm_layout_add(ELM_WIDGET_DATA(ovl->wsd)->obj);
1564 if (!strcmp(ovl->wsd->engine->name, INTERNAL_ENGINE_NAME))
1565 evas_object_smart_member_add(ovl->layout, ovl->wsd->pan_obj);
1567 evas_object_smart_member_add(ovl->layout, ELM_WIDGET_DATA(ovl->wsd)->obj);
1568 evas_object_stack_above(ovl->layout, ovl->wsd->sep_maps_overlays);
1569 elm_layout_theme_set(ovl->layout, "map/marker", "radio",
1570 elm_widget_style_get(ELM_WIDGET_DATA(ovl->wsd)->obj));
1571 evas_object_event_callback_add(ovl->layout, EVAS_CALLBACK_MOUSE_DOWN,
1572 _overlay_clicked_cb, overlay);
1575 _overlay_default_color_update(ovl, c);
1581 _overlay_group_hide(Overlay_Group *grp)
1583 EINA_SAFETY_ON_NULL_RETURN(grp);
1585 if (grp->ovl) _overlay_default_hide(grp->ovl);
1589 _overlay_group_show(Overlay_Group *grp)
1591 EINA_SAFETY_ON_NULL_RETURN(grp);
1593 if (grp->ovl) _overlay_default_show(grp->ovl);
1597 _overlay_group_coord_member_update(Overlay_Group *grp,
1604 EINA_SAFETY_ON_NULL_RETURN(grp);
1606 if (!grp->ovl) return;
1608 _overlay_default_coord_set(grp->ovl, x, y);
1609 _coord_to_region_convert
1610 (grp->wsd, x, y, grp->wsd->size.w, &grp->lon, &grp->lat);
1612 if (grp->members) eina_list_free(grp->members);
1613 grp->members = members;
1614 snprintf(text, sizeof(text), "%d", eina_list_count(members));
1616 _overlay_default_layout_text_update(grp->ovl, text);
1620 _overlay_group_icon_update(Overlay_Group *grp,
1623 EINA_SAFETY_ON_NULL_RETURN(grp);
1626 _overlay_default_icon_update
1627 (grp->ovl, _icon_dup(icon, ELM_WIDGET_DATA(grp->wsd)->obj));
1631 _overlay_group_content_update(Overlay_Group *grp,
1632 Evas_Object *content,
1633 Elm_Map_Overlay *overlay)
1635 EINA_SAFETY_ON_NULL_RETURN(grp);
1637 _overlay_default_content_update
1638 (grp->ovl, _icon_dup(content, ELM_WIDGET_DATA(grp->wsd)->obj), overlay);
1644 _overlay_group_color_update(Overlay_Group *grp,
1647 EINA_SAFETY_ON_NULL_RETURN(grp);
1649 _overlay_default_color_update(grp->ovl, c);
1653 _overlay_group_cb_set(Overlay_Group *grp,
1654 Elm_Map_Overlay_Get_Cb cb,
1657 EINA_SAFETY_ON_NULL_RETURN(grp);
1659 grp->overlay->cb = cb;
1660 grp->overlay->data = data;
1664 _overlay_group_free(Overlay_Group *grp)
1666 EINA_SAFETY_ON_NULL_RETURN(grp);
1668 if (grp->overlay) free(grp->overlay);
1669 if (grp->ovl) _overlay_default_free(grp->ovl);
1670 if (grp->members) eina_list_free(grp->members);
1675 static Overlay_Group *
1676 _overlay_group_new(Elm_Map_Smart_Data *sd)
1679 Color c = {0x90, 0xee, 0x90, 0xff};
1681 grp = ELM_NEW(Overlay_Group);
1683 grp->overlay = ELM_NEW(Elm_Map_Overlay); // this is a virtual overlay
1684 grp->overlay->wsd = sd;
1685 grp->overlay->type = ELM_MAP_OVERLAY_TYPE_GROUP;
1686 grp->overlay->ovl = grp;
1687 grp->ovl = _overlay_default_new(grp->overlay, -1, -1, c, 1);
1693 _overlay_class_cb_set(Overlay_Class *ovl,
1694 Elm_Map_Overlay_Get_Cb cb,
1698 Elm_Map_Overlay *overlay;
1700 EINA_SAFETY_ON_NULL_RETURN(ovl);
1702 // Update class members' callbacks
1703 EINA_LIST_FOREACH(ovl->members, l, overlay)
1704 _overlay_group_cb_set(overlay->grp, cb, data);
1708 _overlay_class_icon_update(Overlay_Class *ovl,
1712 Elm_Map_Overlay *overlay;
1714 EINA_SAFETY_ON_NULL_RETURN(ovl);
1716 if (ovl->icon == icon) return;
1717 if (ovl->icon) evas_object_del(ovl->icon);
1719 // For using proxy, it should have size and be shown but moved away to hide.
1720 evas_object_resize(icon, 32, 32);
1721 evas_object_move(icon, -9999, -9999);
1722 evas_object_show(icon);
1724 // Update class members' class icons
1725 EINA_LIST_FOREACH(ovl->members, l, overlay)
1727 _overlay_group_icon_update(overlay->grp, icon);
1729 if (overlay->type == ELM_MAP_OVERLAY_TYPE_DEFAULT)
1730 _overlay_default_class_icon_update(overlay->ovl, icon);
1735 _overlay_class_content_update(Overlay_Class *ovl,
1736 Evas_Object *content)
1739 Elm_Map_Overlay *overlay;
1741 EINA_SAFETY_ON_NULL_RETURN(ovl);
1743 if (ovl->content == content) return;
1744 if (ovl->content) evas_object_del(ovl->content);
1745 ovl->content = content;
1746 // For using proxy, it should have size and be shown but moved away to hide.
1747 // content should have it's own size
1748 evas_object_move(content, -9999, -9999);
1750 // Update class members' class contents
1751 EINA_LIST_FOREACH(ovl->members, l, overlay)
1753 _overlay_group_content_update(overlay->grp, content, overlay);
1755 if (overlay->type == ELM_MAP_OVERLAY_TYPE_DEFAULT)
1756 _overlay_default_class_content_update(overlay->ovl, content);
1761 _overlay_class_color_update(Overlay_Class *ovl,
1765 Elm_Map_Overlay *overlay;
1767 EINA_SAFETY_ON_NULL_RETURN(ovl);
1769 // Update class members' class contents
1770 EINA_LIST_FOREACH(ovl->members, l, overlay)
1771 _overlay_group_color_update(overlay->grp, c);
1775 _overlay_class_free(Overlay_Class *clas)
1778 Elm_Map_Overlay *overlay;
1780 EINA_SAFETY_ON_NULL_RETURN(clas);
1782 // Update class members' class contents
1783 EINA_LIST_FOREACH(clas->members, l, overlay)
1785 overlay->grp->klass = NULL;
1786 _overlay_group_content_update(overlay->grp, NULL, NULL);
1787 _overlay_group_icon_update(overlay->grp, NULL);
1789 if (overlay->type == ELM_MAP_OVERLAY_TYPE_DEFAULT)
1791 _overlay_default_class_content_update(overlay->ovl, NULL);
1792 _overlay_default_class_icon_update(overlay->ovl, NULL);
1795 if (clas->icon) evas_object_del(clas->icon);
1796 if (clas->members) eina_list_free(clas->members);
1801 static Overlay_Class *
1802 _overlay_class_new(Elm_Map_Smart_Data *sd)
1806 ovl = ELM_NEW(Overlay_Class);
1809 ovl->zoom_max = OVERLAY_CLASS_ZOOM_MAX;
1815 _overlay_bubble_coord_update(Overlay_Bubble *bubble)
1817 EINA_SAFETY_ON_NULL_RETURN(bubble);
1821 Evas_Coord x, y, w, h;
1823 evas_object_geometry_get(bubble->pobj, &x, &y, &w, &h);
1824 bubble->x = x + (w / 2);
1825 bubble->y = y - (bubble->h / 2);
1827 (bubble->wsd, bubble->x, bubble->y, &(bubble->x), &(bubble->y));
1828 _coord_to_region_convert
1829 (bubble->wsd, bubble->x, bubble->y, bubble->wsd->size.w,
1830 &(bubble->lon), &(bubble->lat));
1834 _region_to_coord_convert(bubble->wsd, bubble->lon, bubble->lat,
1835 bubble->wsd->size.w, &bubble->x, &bubble->y);
1840 _overlay_bubble_coord_get(Overlay_Bubble *bubble,
1846 EINA_SAFETY_ON_NULL_RETURN(bubble);
1848 if (!(bubble->pobj))
1850 if (x) *x = bubble->x;
1851 if (y) *y = bubble->y;
1852 if (w) *w = bubble->w;
1853 if (h) *h = bubble->h;
1865 _overlay_bubble_show_hide(Overlay_Bubble *bubble,
1868 EINA_SAFETY_ON_NULL_RETURN_VAL(bubble, EINA_FALSE);
1869 EINA_SAFETY_ON_NULL_RETURN_VAL(bubble->obj, EINA_FALSE);
1871 if (!visible) evas_object_hide(bubble->obj);
1872 else if (bubble->pobj && !evas_object_visible_get(bubble->pobj))
1874 evas_object_hide(bubble->obj);
1875 visible = EINA_FALSE;
1880 (bubble->wsd, bubble->x, bubble->y, &(bubble->x), &(bubble->y));
1881 _obj_place(bubble->obj, bubble->x - (bubble->w / 2),
1882 bubble->y - (bubble->h / 2), bubble->w, bubble->h);
1883 evas_object_raise(bubble->obj);
1889 _overlay_bubble_free(Overlay_Bubble *bubble)
1891 EINA_SAFETY_ON_NULL_RETURN(bubble);
1893 evas_object_del(bubble->bx);
1894 evas_object_del(bubble->sc);
1895 evas_object_del(bubble->obj);
1900 static Overlay_Bubble *
1901 _overlay_bubble_new(Elm_Map_Overlay *overlay)
1905 Overlay_Bubble *bubble;
1907 EINA_SAFETY_ON_NULL_RETURN_VAL(overlay, NULL);
1909 bubble = ELM_NEW(Overlay_Bubble);
1910 bubble->wsd = overlay->wsd;
1913 edje_object_add(evas_object_evas_get(ELM_WIDGET_DATA(overlay->wsd)->obj));
1914 elm_widget_theme_object_set
1915 (ELM_WIDGET_DATA(overlay->wsd)->obj, bubble->obj, "map", "marker_bubble",
1916 elm_widget_style_get(ELM_WIDGET_DATA(overlay->wsd)->obj));
1918 evas_object_event_callback_add(bubble->obj, EVAS_CALLBACK_MOUSE_DOWN,
1919 _overlay_clicked_cb, overlay);
1921 bubble->sc = elm_scroller_add(bubble->obj);
1922 elm_widget_style_set(bubble->sc, "map_bubble");
1923 elm_scroller_content_min_limit(bubble->sc, EINA_FALSE, EINA_TRUE);
1924 elm_scroller_policy_set
1925 (bubble->sc, ELM_SCROLLER_POLICY_AUTO, ELM_SCROLLER_POLICY_OFF);
1926 elm_scroller_bounce_set
1927 (bubble->sc, _elm_config->thumbscroll_bounce_enable, EINA_FALSE);
1928 edje_object_part_swallow(bubble->obj, "elm.swallow.content", bubble->sc);
1930 bubble->bx = elm_box_add(bubble->sc);
1931 evas_object_size_hint_align_set(bubble->bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
1932 evas_object_size_hint_weight_set
1933 (bubble->bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1934 elm_box_horizontal_set(bubble->bx, EINA_TRUE);
1935 elm_object_content_set(bubble->sc, bubble->bx);
1937 s = edje_object_data_get(bubble->obj, "size_w");
1938 if (s) bubble->w = atoi(s);
1941 edje_object_size_min_calc(bubble->obj, NULL, &(bubble->h));
1942 s = edje_object_data_get(bubble->obj, "size_h");
1946 if (bubble->h < h) bubble->h = h;
1957 _overlay_route_color_update(Overlay_Route *ovl,
1960 EINA_SAFETY_ON_NULL_RETURN(ovl);
1962 evas_object_color_set(ovl->obj, c.r, c.g, c.b, c.a);
1966 _overlay_route_hide(Overlay_Route *ovl)
1968 EINA_SAFETY_ON_NULL_RETURN(ovl);
1970 evas_object_hide(ovl->obj);
1974 _overlay_route_show(Overlay_Route *r)
1980 EINA_SAFETY_ON_NULL_RETURN(r);
1981 EINA_SAFETY_ON_NULL_RETURN(r->wsd);
1983 evas_object_polygon_points_clear(r->obj);
1984 EINA_LIST_FOREACH(r->nodes, l, n)
1986 p = eina_list_nth(r->paths, n->idx);
1989 _region_to_coord_convert
1990 (r->wsd, n->pos.lon, n->pos.lat, r->wsd->size.w, &p->x, &p->y);
1991 _coord_to_canvas(r->wsd, p->x, p->y, &p->x, &p->y);
1993 EINA_LIST_FOREACH(r->paths, l, p)
1994 evas_object_polygon_point_add(r->obj, p->x - 3, p->y - 3);
1996 EINA_LIST_REVERSE_FOREACH(r->paths, l, p)
1997 evas_object_polygon_point_add(r->obj, p->x + 3, p->y + 3);
1999 evas_object_show(r->obj);
2003 _overlay_route_free(Overlay_Route *route)
2008 EINA_SAFETY_ON_NULL_RETURN(route);
2010 evas_object_del(route->obj);
2012 EINA_LIST_FREE (route->paths, p)
2015 EINA_LIST_FREE (route->nodes, n)
2017 if (n->pos.address) eina_stringshare_del(n->pos.address);
2024 static Overlay_Route *
2025 _overlay_route_new(Elm_Map_Smart_Data *sd,
2026 const Elm_Map_Route *route,
2033 EINA_SAFETY_ON_NULL_RETURN_VAL(route, NULL);
2035 ovl = ELM_NEW(Overlay_Route);
2038 evas_object_polygon_add(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
2039 if (!strcmp(ovl->wsd->engine->name, INTERNAL_ENGINE_NAME))
2040 evas_object_smart_member_add(ovl->obj, sd->pan_obj);
2042 evas_object_smart_member_add(ovl->obj, ELM_WIDGET_DATA(ovl->wsd)->obj);
2044 _overlay_route_color_update(ovl, c);
2046 EINA_LIST_FOREACH(route->nodes, l, n)
2051 node = ELM_NEW(Path_Node);
2053 node->pos.lon = n->pos.lon;
2054 node->pos.lat = n->pos.lat;
2055 if (n->pos.address) node->pos.address = strdup(n->pos.address);
2056 ovl->nodes = eina_list_append(ovl->nodes, node);
2058 path = ELM_NEW(Path);
2059 ovl->paths = eina_list_append(ovl->paths, path);
2066 _overlay_line_color_update(Overlay_Line *ovl,
2069 EINA_SAFETY_ON_NULL_RETURN(ovl);
2071 evas_object_color_set(ovl->obj, c.r, c.g, c.b, c.a);
2075 _overlay_line_hide(Overlay_Line *ovl)
2077 EINA_SAFETY_ON_NULL_RETURN(ovl);
2079 if (ovl->obj) evas_object_hide(ovl->obj);
2083 _overlay_line_show(Overlay_Line *ovl)
2085 Evas_Coord fx, fy, tx, ty;
2086 Elm_Map_Smart_Data *sd = ovl->wsd;
2088 _region_to_coord_convert(sd, ovl->flon, ovl->flat, sd->size.w, &fx, &fy);
2089 _region_to_coord_convert(sd, ovl->tlon, ovl->tlat, sd->size.w, &tx, &ty);
2090 _coord_to_canvas(sd, fx, fy, &fx, &fy);
2091 _coord_to_canvas(sd, tx, ty, &tx, &ty);
2092 evas_object_line_xy_set(ovl->obj, fx, fy, tx, ty);
2093 evas_object_show(ovl->obj);
2097 _overlay_line_free(Overlay_Line *ovl)
2099 EINA_SAFETY_ON_NULL_RETURN(ovl);
2101 evas_object_del(ovl->obj);
2105 static Overlay_Line *
2106 _overlay_line_new(Elm_Map_Smart_Data *sd,
2115 ovl = ELM_NEW(Overlay_Line);
2122 evas_object_line_add(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
2123 evas_object_smart_member_add(ovl->obj, sd->pan_obj);
2124 _overlay_line_color_update(ovl, c);
2130 _overlay_polygon_color_update(Overlay_Polygon *ovl,
2133 EINA_SAFETY_ON_NULL_RETURN(ovl);
2135 evas_object_color_set(ovl->obj, c.r, c.g, c.b, c.a);
2139 _overlay_polygon_hide(Overlay_Polygon *ovl)
2141 EINA_SAFETY_ON_NULL_RETURN(ovl);
2143 if (ovl->obj) evas_object_hide(ovl->obj);
2147 _overlay_polygon_show(Overlay_Polygon *ovl)
2151 Elm_Map_Smart_Data *sd;
2153 EINA_SAFETY_ON_NULL_RETURN(ovl);
2157 evas_object_polygon_points_clear(ovl->obj);
2158 EINA_LIST_FOREACH(ovl->regions, l, r)
2162 _region_to_coord_convert(sd, r->lon, r->lat, sd->size.w, &x, &y);
2163 _coord_to_canvas(sd, x, y, &x, &y);
2164 evas_object_polygon_point_add(ovl->obj, x, y);
2166 evas_object_show(ovl->obj);
2170 _overlay_polygon_free(Overlay_Polygon *ovl)
2174 EINA_SAFETY_ON_NULL_RETURN(ovl);
2176 evas_object_del(ovl->obj);
2178 EINA_LIST_FREE (ovl->regions, r)
2184 static Overlay_Polygon *
2185 _overlay_polygon_new(Elm_Map_Smart_Data *sd, Color c)
2187 Overlay_Polygon *ovl;
2189 ovl = ELM_NEW(Overlay_Polygon);
2192 evas_object_polygon_add(evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
2193 evas_object_smart_member_add(ovl->obj, sd->pan_obj);
2194 _overlay_polygon_color_update(ovl, c);
2200 _overlay_circle_color_update(Overlay_Circle *ovl,
2205 EINA_SAFETY_ON_NULL_RETURN(ovl);
2207 obj = elm_layout_edje_get(ovl->obj);
2208 evas_object_color_set(obj, c.r, c.g, c.b, c.a);
2212 _overlay_circle_hide(Overlay_Circle *ovl)
2214 EINA_SAFETY_ON_NULL_RETURN(ovl);
2216 if (ovl->obj) evas_object_hide(ovl->obj);
2220 _overlay_circle_show(Overlay_Circle *ovl)
2224 Elm_Map_Smart_Data *sd;
2226 EINA_SAFETY_ON_NULL_RETURN(ovl);
2230 r = (ovl->ratio) * sd->size.w;
2231 _region_to_coord_convert(sd, ovl->lon, ovl->lat, sd->size.w, &x, &y);
2232 _coord_to_canvas(sd, x, y, &x, &y);
2233 _obj_place(ovl->obj, x - r, y - r, r * 2, r * 2);
2237 _overlay_circle_free(Overlay_Circle *ovl)
2239 EINA_SAFETY_ON_NULL_RETURN(ovl);
2241 evas_object_del(ovl->obj);
2245 static Overlay_Circle *
2246 _overlay_circle_new(Elm_Map_Smart_Data *sd,
2252 Overlay_Circle *ovl;
2254 ovl = ELM_NEW(Overlay_Circle);
2258 ovl->radius = radius;
2259 ovl->ratio = radius / sd->size.w;
2261 ovl->obj = elm_layout_add(ELM_WIDGET_DATA(sd)->obj);
2262 evas_object_smart_member_add(ovl->obj, sd->pan_obj);
2263 evas_object_stack_above(ovl->obj, sd->sep_maps_overlays);
2264 elm_layout_theme_set(ovl->obj, "map/circle", "base",
2265 elm_widget_style_get(ELM_WIDGET_DATA(sd)->obj));
2266 _overlay_circle_color_update(ovl, c);
2272 _overlay_scale_color_update(Overlay_Scale *ovl,
2275 EINA_SAFETY_ON_NULL_RETURN(ovl);
2277 evas_object_color_set(ovl->obj, c.r, c.g, c.b, c.a);
2281 _overlay_scale_hide(Overlay_Scale *ovl)
2283 EINA_SAFETY_ON_NULL_RETURN(ovl);
2285 if (ovl->obj) evas_object_hide(ovl->obj);
2289 _overlay_scale_show(Overlay_Scale *ovl)
2296 Elm_Map_Smart_Data *sd;
2298 EINA_SAFETY_ON_NULL_RETURN(ovl);
2302 if ((int)(sizeof(_scale_tb)/sizeof(double)) <= sd->zoom)
2304 ERR("Zoom level is too high");
2308 elm_map_region_get(ELM_WIDGET_DATA(sd)->obj, &lon, &lat);
2310 sd->src_tile->scale_cb(ELM_WIDGET_DATA(sd)->obj, lon, lat, sd->zoom);
2314 ERR("Scale callback returns a value below zero");
2318 w = (_scale_tb[sd->zoom] / meter) * (sd->zoom_detail - sd->zoom + 1);
2320 text = _scale_tb[sd->zoom] / 1000;
2321 if (text < 1) snprintf(buf, sizeof(buf), "%d m", (int)(text * 1000));
2322 else snprintf(buf, sizeof(buf), "%d km", (int)text);
2324 elm_layout_text_set(ovl->obj, "elm.text", buf);
2325 _obj_place(ovl->obj, ovl->x, ovl->y, w, ovl->h);
2329 _overlay_scale_free(Overlay_Scale *ovl)
2331 EINA_SAFETY_ON_NULL_RETURN(ovl);
2333 evas_object_del(ovl->obj);
2337 static Overlay_Scale *
2338 _overlay_scale_new(Elm_Map_Smart_Data *sd,
2346 ovl = ELM_NEW(Overlay_Scale);
2351 ovl->obj = elm_layout_add(ELM_WIDGET_DATA(sd)->obj);
2352 evas_object_smart_member_add(ovl->obj, sd->pan_obj);
2353 evas_object_stack_above(ovl->obj, sd->sep_maps_overlays);
2354 elm_layout_theme_set(ovl->obj, "map/scale", "base",
2355 elm_widget_style_get(ELM_WIDGET_DATA(sd)->obj));
2356 s = edje_object_data_get(elm_layout_edje_get(ovl->obj), "size_w");
2358 if (s) ovl->w = atoi(s);
2361 s = edje_object_data_get(elm_layout_edje_get(ovl->obj), "size_h");
2362 if (s) ovl->h = atoi(s);
2365 _overlay_scale_color_update(ovl, c);
2371 _overlay_grouping(Eina_List *clas_membs,
2372 Elm_Map_Overlay *boss)
2375 Elm_Map_Overlay *memb;
2376 Eina_List *grp_membs = NULL;
2377 int sum_x = 0, sum_y = 0, cnt = 0;
2378 Evas_Coord bx = 0, by = 0, bw = 0, bh = 0;
2380 EINA_SAFETY_ON_NULL_RETURN(clas_membs);
2381 EINA_SAFETY_ON_NULL_RETURN(boss);
2383 if (boss->type == ELM_MAP_OVERLAY_TYPE_DEFAULT)
2384 _overlay_default_coord_get(boss->ovl, &bx, &by, &bw, &bh);
2385 else if (boss->type == ELM_MAP_OVERLAY_TYPE_BUBBLE)
2386 _overlay_bubble_coord_get(boss->ovl, &bx, &by, &bw, &bh);
2388 EINA_LIST_FOREACH(clas_membs, l, memb)
2390 Evas_Coord x = 0, y = 0, w = 0, h = 0;
2392 if (boss == memb || memb->grp->in) continue;
2393 if ((memb->hide) || (memb->zoom_min > memb->wsd->zoom)) continue;
2395 if (memb->type == ELM_MAP_OVERLAY_TYPE_DEFAULT)
2396 _overlay_default_coord_get(memb->ovl, &x, &y, &w, &h);
2397 else if (memb->type == ELM_MAP_OVERLAY_TYPE_BUBBLE)
2398 _overlay_bubble_coord_get(memb->ovl, &x, &y, &w, &h);
2400 if (bw <= 0 || bh <= 0 || w <= 0 || h <= 0) continue;
2401 if (ELM_RECTS_INTERSECT(x, y, w, h, bx, by,
2402 bw * OVERLAY_GROUPING_SCALE,
2403 bh * OVERLAY_GROUPING_SCALE))
2406 memb->grp->boss = EINA_FALSE;
2407 memb->grp->in = EINA_TRUE;
2411 grp_membs = eina_list_append(grp_membs, memb);
2418 boss->grp->boss = EINA_TRUE;
2419 boss->grp->in = EINA_TRUE;
2420 sum_x = (sum_x + bx) / (cnt + 1);
2421 sum_y = (sum_y + by) / (cnt + 1);
2422 grp_membs = eina_list_append(grp_membs, boss);
2423 _overlay_group_coord_member_update(boss->grp, sum_x, sum_y, grp_membs);
2425 // Append group to all overlay list
2426 boss->wsd->group_overlays =
2427 eina_list_append(boss->wsd->group_overlays, boss->grp->overlay);
2432 _overlay_show(Elm_Map_Overlay *overlay)
2434 Elm_Map_Smart_Data *sd = overlay->wsd;
2436 if (overlay->paused) return;
2437 if ((overlay->grp) && (overlay->grp->klass) && (overlay->grp->klass->paused))
2440 overlay->visible = EINA_TRUE;
2441 if (overlay->type == ELM_MAP_OVERLAY_TYPE_CLASS)
2443 overlay->visible = EINA_FALSE;
2448 if ((overlay->grp->in) ||
2449 (overlay->hide) || (overlay->zoom_min > sd->zoom))
2450 overlay->visible = EINA_FALSE;
2452 if ((overlay->grp->klass) &&
2453 ((overlay->grp->klass->hide) ||
2454 (overlay->grp->klass->zoom_min > sd->zoom)))
2455 overlay->visible = EINA_FALSE;
2458 switch (overlay->type)
2460 case ELM_MAP_OVERLAY_TYPE_DEFAULT:
2461 if (overlay->visible) _overlay_default_show(overlay->ovl);
2462 else _overlay_default_hide(overlay->ovl);
2465 case ELM_MAP_OVERLAY_TYPE_GROUP:
2466 if (overlay->visible) _overlay_group_show(overlay->ovl);
2467 else _overlay_group_hide(overlay->ovl);
2470 case ELM_MAP_OVERLAY_TYPE_BUBBLE:
2472 _overlay_bubble_show_hide(overlay->ovl, overlay->visible);
2475 case ELM_MAP_OVERLAY_TYPE_ROUTE:
2476 if (overlay->visible) _overlay_route_show(overlay->ovl);
2477 else _overlay_route_hide(overlay->ovl);
2480 case ELM_MAP_OVERLAY_TYPE_LINE:
2481 if (overlay->visible) _overlay_line_show(overlay->ovl);
2482 else _overlay_line_hide(overlay->ovl);
2485 case ELM_MAP_OVERLAY_TYPE_POLYGON:
2486 if (overlay->visible) _overlay_polygon_show(overlay->ovl);
2487 else _overlay_polygon_hide(overlay->ovl);
2490 case ELM_MAP_OVERLAY_TYPE_CIRCLE:
2491 if (overlay->visible) _overlay_circle_show(overlay->ovl);
2492 else _overlay_circle_hide(overlay->ovl);
2495 case ELM_MAP_OVERLAY_TYPE_SCALE:
2496 if (overlay->visible) _overlay_scale_show(overlay->ovl);
2497 else _overlay_scale_hide(overlay->ovl);
2501 ERR("Invalid overlay type to show: %d", overlay->type);
2506 _overlay_place(Elm_Map_Smart_Data *sd)
2509 Elm_Map_Overlay *overlay;
2511 eina_list_free(sd->group_overlays);
2512 sd->group_overlays = NULL;
2514 EINA_LIST_FOREACH(sd->overlays, l, overlay)
2517 if (overlay->type == ELM_MAP_OVERLAY_TYPE_CLASS) continue;
2518 overlay->grp->in = EINA_FALSE;
2519 overlay->grp->boss = EINA_FALSE;
2520 _overlay_group_hide(overlay->grp);
2522 // Update overlays' coord
2523 if (overlay->type == ELM_MAP_OVERLAY_TYPE_DEFAULT)
2524 _overlay_default_coord_update(overlay->ovl);
2525 else if (overlay->type == ELM_MAP_OVERLAY_TYPE_BUBBLE)
2526 _overlay_bubble_coord_update(overlay->ovl);
2529 // Classify into group boss or follwer
2530 EINA_LIST_FOREACH(sd->overlays, l, overlay)
2532 Elm_Map_Overlay *boss;
2533 Overlay_Class *clas;
2535 if (overlay->type != ELM_MAP_OVERLAY_TYPE_CLASS) continue;
2536 if (overlay->hide || (overlay->zoom_min > sd->zoom)) continue;
2538 clas = overlay->ovl;
2539 if (clas->zoom_max < sd->zoom) continue;
2540 EINA_LIST_FOREACH(clas->members, ll, boss)
2542 if (boss->type == ELM_MAP_OVERLAY_TYPE_CLASS) continue;
2543 if (boss->hide || (boss->zoom_min > sd->zoom)) continue;
2544 if (boss->grp->in) continue;
2545 _overlay_grouping(clas->members, boss);
2549 // Place group overlays and overlays
2550 EINA_LIST_FOREACH(sd->group_overlays, l, overlay)
2551 _overlay_show(overlay);
2552 EINA_LIST_FOREACH(sd->overlays, l, overlay)
2553 _overlay_show(overlay);
2556 static Evas_Object *
2557 _overlay_obj_get(const Elm_Map_Overlay *overlay)
2559 EINA_SAFETY_ON_NULL_RETURN_VAL(overlay, NULL);
2561 if (overlay->type == ELM_MAP_OVERLAY_TYPE_GROUP)
2563 Overlay_Group *ovl = overlay->ovl;
2564 Overlay_Default *df = ovl->ovl;
2568 else if (overlay->type == ELM_MAP_OVERLAY_TYPE_DEFAULT)
2570 Overlay_Default *ovl = overlay->ovl;
2576 ERR("Not supported overlay type: %d", overlay->type);
2582 _xml_name_attrs_dump_cb(void *data,
2586 Name_Dump *dump = (Name_Dump *)data;
2588 EINA_SAFETY_ON_NULL_RETURN_VAL(dump, EINA_FALSE);
2589 EINA_SAFETY_ON_NULL_RETURN_VAL(key, EINA_FALSE);
2590 EINA_SAFETY_ON_NULL_RETURN_VAL(value, EINA_FALSE);
2592 if (!strncmp(key, NOMINATIM_ATTR_LON, sizeof(NOMINATIM_ATTR_LON)))
2593 dump->lon = _elm_atof(value);
2594 else if (!strncmp(key, NOMINATIM_ATTR_LAT, sizeof(NOMINATIM_ATTR_LAT)))
2595 dump->lat = _elm_atof(value);
2596 else if (!strncmp(key, NOMINATIM_ATTR_ADDRESS, sizeof(NOMINATIM_ATTR_ADDRESS)))
2599 dump->address = strdup(value);
2606 _xml_route_dump_cb(void *data,
2607 Eina_Simple_XML_Type type,
2609 unsigned offset __UNUSED__,
2612 Route_Dump *dump = data;
2614 EINA_SAFETY_ON_NULL_RETURN_VAL(dump, EINA_FALSE);
2615 EINA_SAFETY_ON_NULL_RETURN_VAL(value, EINA_FALSE);
2619 case EINA_SIMPLE_XML_OPEN:
2620 case EINA_SIMPLE_XML_OPEN_EMPTY:
2624 attrs = eina_simple_xml_tag_attributes_find(value, length);
2627 if (!strncmp(value, YOURS_DISTANCE, length))
2628 dump->id = ROUTE_XML_DISTANCE;
2629 else if (!strncmp(value, YOURS_DESCRIPTION, length))
2630 dump->id = ROUTE_XML_DESCRIPTION;
2631 else if (!strncmp(value, YOURS_COORDINATES, length))
2632 dump->id = ROUTE_XML_COORDINATES;
2633 else dump->id = ROUTE_XML_NONE;
2638 case EINA_SIMPLE_XML_DATA:
2640 char *buf = malloc(length);
2642 if (!buf) return EINA_FALSE;
2644 snprintf(buf, length, "%s", value);
2645 if (dump->id == ROUTE_XML_DISTANCE) dump->distance = _elm_atof(buf);
2646 else if (!(dump->description) && (dump->id == ROUTE_XML_DESCRIPTION))
2647 dump->description = strdup(buf);
2648 else if (dump->id == ROUTE_XML_COORDINATES)
2649 dump->coordinates = strdup(buf);
2663 _xml_name_dump_cb(void *data,
2664 Eina_Simple_XML_Type type,
2666 unsigned offset __UNUSED__,
2669 Name_Dump *dump = data;
2671 EINA_SAFETY_ON_NULL_RETURN_VAL(dump, EINA_FALSE);
2672 EINA_SAFETY_ON_NULL_RETURN_VAL(value, EINA_FALSE);
2676 case EINA_SIMPLE_XML_OPEN:
2677 case EINA_SIMPLE_XML_OPEN_EMPTY:
2680 attrs = eina_simple_xml_tag_attributes_find(value, length);
2683 if (!strncmp(value, NOMINATIM_RESULT,
2684 sizeof(NOMINATIM_RESULT) - 1))
2685 dump->id = NAME_XML_NAME;
2686 else dump->id = NAME_XML_NONE;
2688 eina_simple_xml_attributes_parse
2689 (attrs, length - (attrs - value), _xml_name_attrs_dump_cb,
2695 case EINA_SIMPLE_XML_DATA:
2697 char *buf = malloc(length + 1);
2699 if (!buf) return EINA_FALSE;
2700 snprintf(buf, length + 1, "%s", value);
2701 if (dump->id == NAME_XML_NAME) dump->address = strdup(buf);
2714 _xml_name_dump_list_cb(void *data,
2715 Eina_Simple_XML_Type type,
2720 Elm_Map_Name_List *name_list = data;
2722 Name_Dump dump = {0, NULL, 0.0, 0.0};
2723 _xml_name_dump_cb(&dump, type, value, offset, length);
2724 name = calloc(1, sizeof(Elm_Map_Name));
2725 if (!name) return EINA_FALSE;
2728 name->address = strdup(dump.address);
2729 name->lon = dump.lon;
2730 name->lat = dump.lat;
2731 name->wsd = name_list->wsd;
2732 name_list->names = eina_list_append(name_list->names, name);
2733 name->wsd->names = eina_list_append(name->wsd->names, name);
2743 _kml_parse(Elm_Map_Route *r)
2748 unsigned int ele, idx;
2750 EINA_SAFETY_ON_NULL_RETURN(r);
2751 EINA_SAFETY_ON_NULL_RETURN(r->fname);
2753 Route_Dump dump = {0, r->fname, 0.0, NULL, NULL};
2755 f = fopen(r->fname, "rb");
2760 fseek(f, 0, SEEK_END);
2764 char *buf = malloc(sz + 1);
2767 memset(buf, 0, sz + 1);
2769 if (fread(buf, 1, sz, f))
2771 eina_simple_xml_parse
2772 (buf, sz, EINA_TRUE, _xml_route_dump_cb, &dump);
2780 if (dump.distance) r->info.distance = dump.distance;
2781 if (dump.description)
2783 eina_stringshare_replace(&r->info.waypoints, dump.description);
2784 str = eina_str_split_full(dump.description, "\n", 0, &ele);
2785 r->info.waypoint_count = ele;
2786 for (idx = 0; idx < ele; idx++)
2788 Path_Waypoint *wp = ELM_NEW(Path_Waypoint);
2793 wp->point = eina_stringshare_add(str[idx]);
2794 DBG("%s", str[idx]);
2795 r->waypoint = eina_list_append(r->waypoint, wp);
2804 else WRN("description is not found !");
2806 if (dump.coordinates)
2808 eina_stringshare_replace(&r->info.nodes, dump.coordinates);
2809 str = eina_str_split_full(dump.coordinates, "\n", 0, &ele);
2810 r->info.node_count = ele;
2811 for (idx = 0; idx < ele; idx++)
2813 Path_Node *n = ELM_NEW(Path_Node);
2815 sscanf(str[idx], "%lf,%lf", &lon, &lat);
2822 DBG("%lf:%lf", lon, lat);
2823 n->pos.address = NULL;
2824 r->nodes = eina_list_append(r->nodes, n);
2837 _name_parse(Elm_Map_Name *n)
2841 EINA_SAFETY_ON_NULL_RETURN(n);
2842 EINA_SAFETY_ON_NULL_RETURN(n->fname);
2844 Name_Dump dump = {0, NULL, 0.0, 0.0};
2846 f = fopen(n->fname, "rb");
2851 fseek(f, 0, SEEK_END);
2855 char *buf = malloc(sz + 1);
2858 memset(buf, 0, sz + 1);
2860 if (fread(buf, 1, sz, f))
2862 eina_simple_xml_parse
2863 (buf, sz, EINA_TRUE, _xml_name_dump_cb, &dump);
2872 INF("[%lf : %lf] ADDRESS : %s", n->lon, n->lat, dump.address);
2873 n->address = strdup(dump.address);
2881 _name_list_parse(Elm_Map_Name_List *nl)
2884 EINA_SAFETY_ON_NULL_RETURN(nl);
2885 EINA_SAFETY_ON_NULL_RETURN(nl->fname);
2887 f = fopen(nl->fname, "rb");
2892 fseek(f, 0, SEEK_END);
2896 char *buf = malloc(sz + 1);
2899 memset(buf, 0, sz + 1);
2901 if (fread(buf, 1, sz, f))
2903 eina_simple_xml_parse
2904 (buf, sz, EINA_TRUE, _xml_name_dump_list_cb, nl);
2915 _route_cb(void *data,
2919 Elm_Map_Route *route;
2920 Elm_Map_Smart_Data *sd;
2922 EINA_SAFETY_ON_NULL_RETURN(data);
2923 EINA_SAFETY_ON_NULL_RETURN(file);
2932 INF("Route request success from (%lf, %lf) to (%lf, %lf)",
2933 route->flon, route->flat, route->tlon, route->tlat);
2934 if (route->cb) route->cb(route->data, ELM_WIDGET_DATA(sd)->obj, route);
2935 evas_object_smart_callback_call
2936 (ELM_WIDGET_DATA(sd)->obj, SIG_ROUTE_LOADED, NULL);
2940 ERR("Route request failed: %d", status);
2941 if (route->cb) route->cb(route->data, ELM_WIDGET_DATA(sd)->obj, NULL);
2942 evas_object_smart_callback_call
2943 (ELM_WIDGET_DATA(sd)->obj, SIG_ROUTE_LOADED_FAIL, NULL);
2946 edje_object_signal_emit(ELM_WIDGET_DATA(sd)->resize_obj,
2947 "elm,state,busy,stop", "elm");
2951 _name_cb(void *data,
2956 Elm_Map_Smart_Data *sd;
2958 EINA_SAFETY_ON_NULL_RETURN(data);
2959 EINA_SAFETY_ON_NULL_RETURN(file);
2968 INF("Name request success address:%s, lon:%lf, lat:%lf",
2969 name->address, name->lon, name->lat);
2970 if (name->cb) name->cb(name->data, ELM_WIDGET_DATA(sd)->obj, name);
2971 evas_object_smart_callback_call
2972 (ELM_WIDGET_DATA(sd)->obj, SIG_NAME_LOADED, NULL);
2976 ERR("Name request failed: %d", status);
2977 if (name->cb) name->cb(name->data, ELM_WIDGET_DATA(sd)->obj, NULL);
2978 evas_object_smart_callback_call
2979 (ELM_WIDGET_DATA(sd)->obj, SIG_NAME_LOADED_FAIL, NULL);
2981 edje_object_signal_emit(ELM_WIDGET_DATA(sd)->resize_obj,
2982 "elm,state,busy,stop", "elm");
2986 _name_list_cb(void *data,
2990 Elm_Map_Name_List *name_list;
2991 Elm_Map_Smart_Data *sd;
2993 EINA_SAFETY_ON_NULL_RETURN(data);
2994 EINA_SAFETY_ON_NULL_RETURN(file);
2997 sd = name_list->wsd;
2999 name_list->job = NULL;
3002 _name_list_parse(name_list);
3003 INF("Name List request success address");
3005 name_list->cb(name_list->data, ELM_WIDGET_DATA(sd)->obj,
3007 evas_object_smart_callback_call
3008 (ELM_WIDGET_DATA(sd)->obj, SIG_NAME_LOADED, NULL);
3012 ERR("Name List request failed: %d", status);
3014 name_list->cb(name_list->data, ELM_WIDGET_DATA(sd)->obj, NULL);
3015 evas_object_smart_callback_call
3016 (ELM_WIDGET_DATA(sd)->obj, SIG_NAME_LOADED_FAIL, NULL);
3018 edje_object_signal_emit(ELM_WIDGET_DATA(sd)->resize_obj,
3019 "elm,state,busy,stop", "elm");
3020 free(name_list->fname);
3028 char fname[PATH_MAX];
3030 const char *cachedir;
3033 snprintf(fname, sizeof(fname), "%s" CACHE_NAME_ROOT,
3034 efreet_cache_home_get());
3037 cachedir = getenv("XDG_CACHE_HOME");
3038 snprintf(fname, sizeof(fname), "%s/%s" CACHE_NAME_ROOT, getenv("HOME"),
3039 cachedir ? : "/.config");
3041 if (!ecore_file_exists(fname)) ecore_file_mkpath(fname);
3043 return strdup(fname);
3047 static Elm_Map_Name *
3048 _name_request(const Evas_Object *obj,
3050 const char *address,
3053 Elm_Map_Name_Cb name_cb,
3058 char *fname, fname2[PATH_MAX];
3060 ELM_MAP_DATA_GET(obj, sd);
3061 EINA_SAFETY_ON_NULL_RETURN_VAL(sd->src_name, NULL);
3063 fname = _prepare_download();
3064 url = sd->src_name->url_cb
3065 (ELM_WIDGET_DATA(sd)->obj, method, address, lon, lat);
3068 ERR("Name URL is NULL");
3073 name = ELM_NEW(Elm_Map_Name);
3075 snprintf(fname2, sizeof(fname2), "%s/%d", fname, rand());
3076 name->fname = strdup(fname2);
3077 name->method = method;
3078 if (method == ELM_MAP_NAME_METHOD_SEARCH) name->address = strdup(address);
3079 else if (method == ELM_MAP_NAME_METHOD_REVERSE)
3087 if (!ecore_file_download_full(url, name->fname, _name_cb, NULL, name,
3088 &(name->job), sd->ua) || !(name->job))
3090 ERR("Can't request Name from %s to %s", url, name->fname);
3091 if (name->address) free(name->address);
3097 INF("Name requested from %s to %s", url, name->fname);
3101 sd->names = eina_list_append(sd->names, name);
3102 evas_object_smart_callback_call
3103 (ELM_WIDGET_DATA(sd)->obj, SIG_NAME_LOAD, name);
3104 edje_object_signal_emit(ELM_WIDGET_DATA(sd)->resize_obj,
3105 "elm,state,busy,start", "elm");
3111 _name_list_request(const Evas_Object *obj,
3113 const char *address,
3116 Elm_Map_Name_List_Cb name_cb,
3120 Elm_Map_Name_List *name_list;
3121 char *fname, fname2[PATH_MAX];
3123 ELM_MAP_DATA_GET(obj, sd);
3124 EINA_SAFETY_ON_NULL_RETURN_VAL(sd->src_name, NULL);
3126 fname = _prepare_download();
3127 url = sd->src_name->url_cb
3128 (ELM_WIDGET_DATA(sd)->obj, method, address, lon, lat);
3131 ERR("Name URL is NULL");
3135 name_list = ELM_NEW(Elm_Map_Name_List);
3136 name_list->wsd = sd;
3137 snprintf(fname2, sizeof(fname2), "%s/%d", fname, rand());
3138 name_list->fname = strdup(fname2);
3139 name_list->cb = name_cb;
3140 name_list->data = data;
3141 if (!ecore_file_download_full(url, name_list->fname, _name_list_cb,
3143 &(name_list->job), sd->ua) || !(name_list->job))
3145 ERR("Can't request Name from %s to %s", url, name_list->fname);
3146 free(name_list->fname);
3151 INF("Name requested from %s to %s", url, name_list->fname);
3155 evas_object_smart_callback_call
3156 (ELM_WIDGET_DATA(sd)->obj, SIG_NAME_LOAD, name_list->names);
3157 edje_object_signal_emit(ELM_WIDGET_DATA(sd)->resize_obj,
3158 "elm,state,busy,start", "elm");
3159 return name_list->names;
3163 static Evas_Event_Flags
3164 _pinch_zoom_start_cb(void *data,
3165 void *event_info __UNUSED__)
3167 Elm_Map_Smart_Data *sd = data;
3169 EINA_SAFETY_ON_NULL_RETURN_VAL(data, EVAS_EVENT_FLAG_NONE);
3171 sd->pinch_zoom = sd->zoom_detail;
3173 return EVAS_EVENT_FLAG_NONE;
3176 static Evas_Event_Flags
3177 _pinch_zoom_cb(void *data,
3180 Elm_Map_Smart_Data *sd = data;
3182 EINA_SAFETY_ON_NULL_RETURN_VAL(sd, EVAS_EVENT_FLAG_NONE);
3186 Elm_Gesture_Zoom_Info *ei = event_info;
3188 _zoom(sd, sd->pinch_zoom + ei->zoom - 1, 0);
3191 return EVAS_EVENT_FLAG_NONE;
3194 static Evas_Event_Flags
3195 _pinch_rotate_cb(void *data,
3198 Elm_Map_Smart_Data *sd = data;
3200 EINA_SAFETY_ON_NULL_RETURN_VAL(sd, EVAS_EVENT_FLAG_NONE);
3206 Elm_Gesture_Rotate_Info *ei = event_info;
3207 evas_object_geometry_get(ELM_WIDGET_DATA(sd)->obj, &x, &y, &w, &h);
3208 sd->pinch_rotate.d = sd->pinch_rotate.a + ei->angle - ei->base_angle;
3209 angle = (int)(sd->pinch_rotate.d);
3210 x = x + ((double)w * 0.5);
3211 y = y + ((double)h * 0.5);
3212 sd->engine->rotate(ELM_WIDGET_DATA(sd)->obj, angle, x, y, 0);
3216 return EVAS_EVENT_FLAG_NONE;
3219 static Evas_Event_Flags
3220 _pinch_rotate_end_cb(void *data,
3221 void *event_info __UNUSED__)
3223 Elm_Map_Smart_Data *sd = data;
3225 EINA_SAFETY_ON_NULL_RETURN_VAL(sd, EVAS_EVENT_FLAG_NONE);
3227 sd->pinch_rotate.a = sd->pinch_rotate.d;
3229 return EVAS_EVENT_FLAG_NONE;
3232 static Evas_Event_Flags
3233 _pinch_momentum_start_cb(void *data,
3236 Elm_Map_Smart_Data *sd = data;
3237 EINA_SAFETY_ON_NULL_RETURN_VAL(sd, EVAS_EVENT_FLAG_NONE);
3238 Elm_Gesture_Momentum_Info *mi = ei;
3240 if (strcmp(sd->engine->name, INTERNAL_ENGINE_NAME) &&
3243 sd->pinch_pan.st = mi->tx;
3244 sd->pinch_pan.x = mi->x1;
3245 sd->pinch_pan.y = mi->y1;
3248 // FIXME: Because n line move has some bouncing bug,
3249 // perpect is calculated here
3250 if (sd->pinch_pan.perspect >= 90)
3251 sd->pinch_pan.perspect = 90;
3252 else if (sd->pinch_pan.perspect <= 0)
3253 sd->pinch_pan.perspect = 0;
3254 sd->pinch_pan.perspect_y = mi->y1;
3256 return EVAS_EVENT_FLAG_NONE;
3259 static Evas_Event_Flags
3260 _pinch_momentum_move_cb(void *data,
3263 Elm_Map_Smart_Data *sd = data;
3264 EINA_SAFETY_ON_NULL_RETURN_VAL(sd, EVAS_EVENT_FLAG_NONE);
3265 Elm_Gesture_Momentum_Info *mi = ei;
3267 if (strcmp(sd->engine->name, INTERNAL_ENGINE_NAME) &&
3270 sd->engine->pan(ELM_WIDGET_DATA(sd)->obj, sd->pinch_pan.x,
3271 sd->pinch_pan.y, mi->x2, mi->y2);
3272 sd->pinch_pan.x = mi->x2;
3273 sd->pinch_pan.y = mi->y2;
3276 // FIXME: Because n line move has some bouncing bug,
3277 // perpect is calculated here
3278 sd->pinch_pan.perspect += (mi->y2 - sd->pinch_pan.perspect_y);
3279 sd->pinch_pan.perspect_y = mi->y2;
3281 return EVAS_EVENT_FLAG_NONE;
3284 static Evas_Event_Flags
3285 _pinch_momentum_end_cb(void *data,
3288 Elm_Map_Smart_Data *sd = data;
3289 EINA_SAFETY_ON_NULL_RETURN_VAL(sd, EVAS_EVENT_FLAG_NONE);
3290 Elm_Gesture_Momentum_Info *mi = ei;
3292 if (strcmp(sd->engine->name, INTERNAL_ENGINE_NAME) &&
3295 sd->engine->pan(ELM_WIDGET_DATA(sd)->obj, sd->pinch_pan.x,
3297 sd->pinch_pan.x + (mi->mx)/25,
3298 sd->pinch_pan.y + (mi->my)/25);
3302 return EVAS_EVENT_FLAG_NONE;
3305 static Evas_Event_Flags
3306 _pinch_n_lines_move_cb(void *data,
3309 Elm_Map_Smart_Data *sd = data;
3310 EINA_SAFETY_ON_NULL_RETURN_VAL(sd, EVAS_EVENT_FLAG_NONE);
3311 Elm_Gesture_Line_Info *li = ei;
3313 if (strcmp(sd->engine->name, INTERNAL_ENGINE_NAME) &&
3314 (li->momentum.n == 2) &&
3315 (((170 <= li->angle) && (li->angle <=190)) ||
3316 (350 <= li->angle) || (li->angle <=10)))
3318 sd->engine->perpective(ELM_WIDGET_DATA(sd)->obj, sd->pinch_pan.perspect, 0);
3321 return EVAS_EVENT_FLAG_NONE;
3324 static Evas_Event_Flags
3325 _pinch_n_lines_end_cb(void *data,
3328 Elm_Map_Smart_Data *sd = data;
3329 EINA_SAFETY_ON_NULL_RETURN_VAL(sd, EVAS_EVENT_FLAG_NONE);
3330 Elm_Gesture_Line_Info *li = ei;
3332 if (strcmp(sd->engine->name, INTERNAL_ENGINE_NAME) &&
3333 (li->momentum.n == 2) &&
3334 (((170 <= li->angle) && (li->angle <=190)) ||
3335 (350 <= li->angle) || (li->angle <=10)))
3337 sd->engine->perpective(ELM_WIDGET_DATA(sd)->obj, sd->pinch_pan.perspect, 0);
3340 return EVAS_EVENT_FLAG_NONE;
3343 _elm_map_pan_smart_pos_set(Evas_Object *obj,
3347 ELM_MAP_PAN_DATA_GET(obj, psd);
3349 if ((x == psd->wsd->pan_x) && (y == psd->wsd->pan_y)) return;
3351 psd->wsd->pan_x = x;
3352 psd->wsd->pan_y = y;
3354 evas_object_smart_changed(obj);
3358 _elm_map_pan_smart_pos_get(const Evas_Object *obj,
3362 ELM_MAP_PAN_DATA_GET(obj, psd);
3364 if (x) *x = psd->wsd->pan_x;
3365 if (y) *y = psd->wsd->pan_y;
3369 _elm_map_pan_smart_pos_max_get(const Evas_Object *obj,
3375 ELM_MAP_PAN_DATA_GET(obj, psd);
3377 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
3378 ow = psd->wsd->size.w - ow;
3379 oh = psd->wsd->size.h - oh;
3388 _elm_map_pan_smart_pos_min_get(const Evas_Object *obj __UNUSED__,
3397 _elm_map_pan_smart_content_size_get(const Evas_Object *obj,
3401 ELM_MAP_PAN_DATA_GET(obj, psd);
3403 if (w) *w = psd->wsd->size.w;
3404 if (h) *h = psd->wsd->size.h;
3408 _elm_map_pan_smart_add(Evas_Object *obj)
3410 /* here just to allocate our extended data */
3411 EVAS_SMART_DATA_ALLOC(obj, Elm_Map_Pan_Smart_Data);
3413 ELM_PAN_CLASS(_elm_map_pan_parent_sc)->base.add(obj);
3417 _elm_map_pan_smart_resize(Evas_Object *obj,
3418 Evas_Coord w __UNUSED__,
3419 Evas_Coord h __UNUSED__)
3421 ELM_MAP_PAN_DATA_GET(obj, psd);
3423 _sizing_eval(psd->wsd);
3424 if (!psd->wsd->calc_job.zoom_changed)
3426 psd->wsd->calc_job.zoom_changed = EINA_TRUE;
3427 psd->wsd->calc_job.zoom_anim = EINA_FALSE;
3428 psd->wsd->calc_job.zoom = psd->wsd->zoom;
3430 evas_object_smart_changed(obj);
3433 static Evas_Object *
3434 _map_pan_add(Evas_Object *obj)
3436 Evas_Coord minw, minh;
3437 ELM_MAP_DATA_GET(obj, sd);
3441 sd->layout = edje_object_add(evas_object_evas_get(obj));
3442 elm_widget_theme_object_set
3443 (obj, sd->layout , "map", "base", elm_widget_style_get(obj));
3445 /* common scroller hit rectangle setup */
3446 sd->hit_rect = evas_object_rectangle_add(evas_object_evas_get(obj));
3447 evas_object_smart_member_add(sd->hit_rect, obj);
3448 elm_widget_sub_object_add(obj, sd->hit_rect);
3449 evas_object_color_set(sd->hit_rect, 0, 0, 0, 0);
3450 evas_object_show(sd->hit_rect);
3451 evas_object_repeat_events_set(sd->hit_rect, EINA_TRUE);
3453 /* interface's add() routine issued AFTER the object's smart_add() */
3454 sd->s_iface = evas_object_smart_interface_get
3455 (obj, ELM_SCROLLABLE_IFACE_NAME);
3457 sd->s_iface->objects_set(obj, sd->layout, sd->hit_rect);
3458 edje_object_size_min_calc(sd->layout, &minw, &minh);
3459 evas_object_size_hint_min_set(obj, minw, minh);
3460 sd->s_iface->wheel_disabled_set(obj, EINA_TRUE);
3461 sd->s_iface->bounce_allow_set
3462 (obj, _elm_config->thumbscroll_bounce_enable,
3463 _elm_config->thumbscroll_bounce_enable);
3464 sd->s_iface->extern_pan_set(obj, sd->pan_obj);
3468 evas_object_show(sd->layout);
3469 sd->s_iface->animate_start_cb_set(obj, _scroll_animate_start_cb);
3470 sd->s_iface->animate_stop_cb_set(obj, _scroll_animate_stop_cb);
3471 sd->s_iface->scroll_cb_set(obj, _scroll_cb);
3473 sd->sep_maps_overlays =
3474 evas_object_rectangle_add(evas_object_evas_get(obj));
3475 elm_widget_sub_object_add(obj, sd->sep_maps_overlays);
3476 evas_object_smart_member_add(sd->sep_maps_overlays, sd->pan_obj);
3478 sd->map = evas_map_new(EVAS_MAP_POINT);
3481 sd->id = ((int)getpid() << 16) | id_num;
3483 _grid_all_create(sd);
3485 // FIXME: Tile Provider is better to provide default tile size!
3486 sd->tsize = DEFAULT_TILE_SIZE;
3487 sd->size.w = sd->tsize;
3488 sd->size.h = sd->tsize;
3489 sd->size.tile = sd->tsize;
3491 if (!ecore_file_download_protocol_available("http://"))
3492 ERR("Ecore must be built with curl support for the map widget!");
3497 _map_pan_del(Evas_Object *obj)
3503 Elm_Map_Overlay *overlay;
3504 ELM_MAP_DATA_GET(obj, sd);
3506 EINA_LIST_FOREACH_SAFE(sd->routes, l, ll, r)
3507 elm_map_route_del(r);
3508 eina_list_free(sd->routes);
3511 EINA_LIST_FOREACH_SAFE(sd->names, l, ll, na)
3512 elm_map_name_del(na);
3513 eina_list_free(sd->names);
3516 EINA_LIST_FOREACH_SAFE(sd->overlays, l, ll, overlay)
3517 elm_map_overlay_del(overlay);
3518 eina_list_free(sd->overlays);
3519 sd->overlays = NULL;
3521 eina_list_free(sd->group_overlays);
3522 sd->group_overlays = NULL;
3523 eina_list_free(sd->all_overlays);
3524 sd->all_overlays = NULL;
3526 EINA_LIST_FREE (sd->track, track)
3527 evas_object_del(track);
3532 ecore_timer_del(sd->scr_timer);
3533 sd->scr_timer = NULL;
3535 if (sd->zoom_animator)
3537 ecore_animator_del(sd->zoom_animator);
3538 sd->zoom_animator = NULL;
3540 _grid_all_clear(sd);
3541 if (sd->download_idler) ecore_idler_del(sd->download_idler);
3542 if (sd->download_list) eina_list_free(sd->download_list);
3546 const char *cachedir;
3549 snprintf(buf, sizeof(buf), "%s" CACHE_ROOT, efreet_cache_home_get());
3552 cachedir = getenv("XDG_CACHE_HOME");
3553 snprintf(buf, sizeof(buf), "%s/%s" CACHE_ROOT, getenv("HOME"),
3554 cachedir ? : "/.config");
3556 if (!ecore_file_recursive_rm(buf))
3557 ERR("Deletion of %s failed", buf);
3561 evas_map_free(sd->map);
3565 evas_object_smart_member_del(sd->sep_maps_overlays);
3566 elm_widget_sub_object_del(obj, sd->sep_maps_overlays);
3567 evas_object_del(sd->sep_maps_overlays);
3568 sd->sep_maps_overlays = NULL;
3570 sd->s_iface->scroll_cb_set(obj, NULL);
3571 sd->s_iface->animate_stop_cb_set(obj, NULL);
3572 sd->s_iface->animate_start_cb_set(obj, NULL);
3576 _map_pan_show(Evas_Object *obj, double lon, double lat, int animation)
3579 ELM_MAP_DATA_GET(obj, sd);
3581 _region_to_coord_convert
3582 (sd, lon, lat, sd->size.w, &x, &y);
3583 _viewport_coord_get(sd, NULL, NULL, &w, &h);
3588 sd->s_iface->region_bring_in(ELM_WIDGET_DATA(sd)->obj, x, y, w, h);
3590 sd->s_iface->content_region_show(ELM_WIDGET_DATA(sd)->obj, x, y, w, h);
3594 _map_pan_zoom_do(Elm_Map_Smart_Data *sd,
3597 Evas_Coord vx, vy, vw, vh;
3600 if (zoom > sd->src_tile->zoom_max) zoom = sd->src_tile->zoom_max;
3601 else if (zoom < sd->src_tile->zoom_min)
3602 zoom = sd->src_tile->zoom_min;
3606 sd->size.tile = pow(2.0, (zoom - sd->zoom)) * sd->tsize;
3607 sd->size.w = pow(2.0, sd->zoom) * sd->size.tile;
3608 sd->size.h = sd->size.w;
3610 // Fix to zooming with (viewport center vx, vy) as the center to prevent
3611 // from zooming with (0,0) as the cetner. (scroller default behavior)
3612 _viewport_coord_get(sd, &vx, &vy, &vw, &vh);
3613 if ((vw > 0) && (vh > 0) && (ow > 0) && (oh > 0))
3618 if (vw > ow) sx = 0.5;
3619 else sx = (double)(vx + (double)(vw / 2)) / ow;
3620 if (vh > oh) sy = 0.5;
3621 else sy = (double)(vy + (double)(vh / 2)) / oh;
3623 if (sx > 1.0) sx = 1.0;
3624 if (sy > 1.0) sy = 1.0;
3626 x = ceil((sx * sd->size.w) - (vw / 2));
3627 y = ceil((sy * sd->size.h) - (vh / 2));
3629 else if (x > (sd->size.w - vw))
3630 x = sd->size.w - vw;
3632 else if (y > (sd->size.h - vh))
3633 y = sd->size.h - vh;
3634 sd->s_iface->content_region_show
3635 (ELM_WIDGET_DATA(sd)->obj, x, y, vw, vh);
3638 evas_object_smart_callback_call(sd->pan_obj, "changed", NULL);
3639 evas_object_smart_changed(sd->pan_obj);
3643 _zoom_anim_cb(void *data)
3645 Elm_Map_Smart_Data *sd = data;
3647 if (sd->ani.cnt <= 0)
3649 sd->zoom_animator = NULL;
3650 evas_object_smart_changed(sd->pan_obj);
3652 return ECORE_CALLBACK_CANCEL;
3656 sd->ani.zoom += sd->ani.diff;
3658 sd->zoom_detail = sd->ani.zoom;
3659 sd->zoom = ROUND(sd->zoom_detail);
3660 _map_pan_zoom_do(sd, sd->ani.zoom);
3662 return ECORE_CALLBACK_RENEW;
3667 _map_pan_zoom(Evas_Object *obj, double zoom, int animation)
3669 ELM_MAP_DATA_GET(obj, sd);
3671 if (sd->mode == ELM_MAP_ZOOM_MODE_MANUAL)
3676 sd->ani.zoom = sd->zoom;
3677 sd->ani.diff = (double)(zoom - sd->zoom) / 10;
3678 if (sd->zoom_animator) ecore_animator_del(sd->zoom_animator);
3679 sd->zoom_animator = ecore_animator_add(_zoom_anim_cb, sd);
3683 sd->zoom_detail = zoom;
3684 sd->zoom = ROUND(sd->zoom_detail);
3685 _map_pan_zoom_do(sd, zoom);
3696 _viewport_coord_get(sd, NULL, NULL, &vw, &vh);
3698 if (sd->mode == ELM_MAP_ZOOM_MODE_AUTO_FIT)
3700 if ((w < vw) && (h < vh))
3703 while ((w < vw) && (h < vh))
3706 w = pow(2.0, zoom) * sd->tsize;
3707 h = pow(2.0, zoom) * sd->tsize;
3713 while ((w > vw) || (h > vh))
3716 w = pow(2.0, zoom) * sd->tsize;
3717 h = pow(2.0, zoom) * sd->tsize;
3721 else if (sd->mode == ELM_MAP_ZOOM_MODE_AUTO_FILL)
3723 if ((w < vw) || (h < vh))
3726 while ((w < vw) || (h < vh))
3729 w = pow(2.0, zoom) * sd->tsize;
3730 h = pow(2.0, zoom) * sd->tsize;
3736 while ((w > vw) && (h > vh))
3739 w = pow(2.0, zoom) * sd->tsize;
3740 h = pow(2.0, zoom) * sd->tsize;
3744 sd->zoom_detail = zoom;
3745 sd->zoom = ROUND(sd->zoom_detail);
3746 _map_pan_zoom_do(sd, zoom);
3751 _map_pan_rotate(Evas_Object *obj, double angle, int x, int y, int animation __UNUSED__)
3753 ELM_MAP_DATA_GET(obj, sd);
3754 sd->pan_rotate.d = angle;
3755 sd->pan_rotate.cx = x;
3756 sd->pan_rotate.cy = y;
3757 evas_object_smart_changed(sd->pan_obj);
3761 _map_pan_rotate_get(const Evas_Object *obj, double *angle, int *x, int *y)
3763 ELM_MAP_DATA_GET(obj, sd);
3764 if (angle) *angle = sd->pan_rotate.d;
3765 if (x) *x = sd->pan_rotate.cx;
3766 if (y) *y = sd->pan_rotate.cy;
3770 _map_pan_perspective_set(Evas_Object *obj __UNUSED__, double perpective __UNUSED__, int animate __UNUSED__)
3772 WRN("Not implemented function");
3776 _map_pan_region_get(const Evas_Object *obj, double *lon, double *lat)
3779 Evas_Coord vx, vy, vw, vh;
3780 ELM_MAP_DATA_GET(obj, sd);
3782 _viewport_coord_get(sd, &vx, &vy, &vw, &vh);
3783 _coord_to_region_convert
3784 (sd, vx + vw / 2, vy + vh / 2, sd->size.w, &tlon, &tlat);
3785 if (lon) *lon = tlon;
3786 if (lat) *lat = tlat;
3790 _map_pan_canvas_to_region(const Evas_Object *obj, int x, int y, double *lon, double *lat)
3792 ELM_MAP_DATA_GET(obj, sd);
3793 _canvas_to_coord(sd, x, y, &x, &y);
3794 _coord_to_region_convert(sd, x, y, sd->size.w, lon, lat);
3798 _map_pan_region_to_canvas(const Evas_Object *obj, double lon, double lat, int *x, int *y)
3800 ELM_MAP_DATA_GET(obj, sd);
3801 _region_to_coord_convert(sd, lon, lat, sd->size.w, x, y);
3802 _coord_to_canvas(sd, *x, *y, x, y);
3806 _move_unimplemented(Evas_Object *obj __UNUSED__, int x __UNUSED__, int y __UNUSED__)
3808 WRN("move is not implemented");
3812 _resize_unimplemented(Evas_Object *obj __UNUSED__, int w __UNUSED__, int y __UNUSED__)
3814 WRN("resize is not implemented");
3818 _pan_unimplemented(Evas_Object *obj __UNUSED__, int x_1 __UNUSED__, int y_1 __UNUSED__, int x_2 __UNUSED__, int y_2 __UNUSED__)
3820 WRN("pan is not implemented");
3824 _canvas_to_region_unimplemented(const Evas_Object *obj __UNUSED__, int x __UNUSED__, int y __UNUSED__, double *lon __UNUSED__, double *lat __UNUSED__)
3826 WRN("canvas to region is not implemented");
3830 _region_to_canvas_unimplemented(const Evas_Object *obj __UNUSED__, double lon __UNUSED__, double lat __UNUSED__, int *x __UNUSED__, int *y __UNUSED__)
3832 WRN("region to canvas is not implemented");
3836 _map_pan_overlays_show(Elm_Map_Smart_Data *sd, Eina_List *overlays)
3838 double max_lon, min_lon, max_lat, min_lat, lon, lat;
3842 EINA_SAFETY_ON_NULL_RETURN(sd);
3843 EINA_SAFETY_ON_NULL_RETURN(overlays);
3845 _region_max_min_get(overlays, &max_lon, &min_lon, &max_lat, &min_lat);
3846 lon = (max_lon + min_lon) / 2;
3847 lat = (max_lat + min_lat) / 2;
3849 zoom = sd->src_tile->zoom_min;
3850 _viewport_coord_get(sd, NULL, NULL, &vw, &vh);
3851 if (sd->src_tile->zoom_max < sd->zoom_max)
3852 zoom_max = sd->src_tile->zoom_max;
3853 else zoom_max = sd->zoom_max;
3854 while (zoom <= zoom_max)
3856 Evas_Coord size, max_x, max_y, min_x, min_y;
3858 size = pow(2.0, zoom) * sd->tsize;
3859 _region_to_coord_convert
3860 (sd, min_lon, max_lat, size, &min_x, &max_y);
3861 _region_to_coord_convert
3862 (sd, max_lon, min_lat, size, &max_x, &min_y);
3863 if ((max_x - min_x) > vw || (max_y - min_y) > vh) break;
3868 sd->engine->zoom(ELM_WIDGET_DATA(sd)->obj, zoom, 0);
3869 sd->engine->show(ELM_WIDGET_DATA(sd)->obj, lon, lat, EINA_FALSE);
3873 _calc_job(Elm_Map_Smart_Data *sd)
3875 if (sd->calc_job.zoom_changed)
3877 _map_pan_zoom(ELM_WIDGET_DATA(sd)->obj, sd->calc_job.zoom, sd->calc_job.zoom_anim);
3878 sd->calc_job.zoom_changed = EINA_FALSE;
3880 if (!sd->zoom_animator && sd->calc_job.show_changed)
3882 _map_pan_show(ELM_WIDGET_DATA(sd)->obj, sd->calc_job.lon, sd->calc_job.lat,
3883 sd->calc_job.show_anim);
3884 sd->calc_job.show_changed = EINA_FALSE;
3886 if (!sd->zoom_animator && sd->calc_job.overlays_changed)
3888 _map_pan_overlays_show(sd, sd->calc_job.overlays);
3889 sd->calc_job.overlays_changed = EINA_FALSE;
3894 _elm_map_pan_smart_calculate(Evas_Object *obj)
3898 ELM_MAP_PAN_DATA_GET(obj, psd);
3900 evas_object_geometry_get(obj, NULL, NULL, &w, &h);
3901 if (w <= 0 || h <= 0) return;
3903 _grid_place(psd->wsd);
3904 _overlay_place(psd->wsd);
3905 _track_place(psd->wsd);
3906 _calc_job(psd->wsd);
3910 _elm_map_pan_smart_move(Evas_Object *obj,
3911 Evas_Coord x __UNUSED__,
3912 Evas_Coord y __UNUSED__)
3914 EINA_SAFETY_ON_NULL_RETURN(obj);
3916 evas_object_smart_changed(obj);
3920 _elm_map_pan_smart_set_user(Elm_Map_Pan_Smart_Class *sc)
3922 ELM_PAN_CLASS(sc)->base.add = _elm_map_pan_smart_add;
3923 ELM_PAN_CLASS(sc)->base.move = _elm_map_pan_smart_move;
3924 ELM_PAN_CLASS(sc)->base.resize = _elm_map_pan_smart_resize;
3925 ELM_PAN_CLASS(sc)->base.calculate = _elm_map_pan_smart_calculate;
3927 ELM_PAN_CLASS(sc)->pos_set = _elm_map_pan_smart_pos_set;
3928 ELM_PAN_CLASS(sc)->pos_get = _elm_map_pan_smart_pos_get;
3929 ELM_PAN_CLASS(sc)->pos_max_get = _elm_map_pan_smart_pos_max_get;
3930 ELM_PAN_CLASS(sc)->pos_min_get = _elm_map_pan_smart_pos_min_get;
3931 ELM_PAN_CLASS(sc)->content_size_get =
3932 _elm_map_pan_smart_content_size_get;
3936 _elm_map_smart_on_focus(Evas_Object *obj)
3938 ELM_MAP_DATA_GET(obj, sd);
3940 if (elm_widget_focus_get(obj))
3942 edje_object_signal_emit
3943 (ELM_WIDGET_DATA(sd)->resize_obj, "elm,action,focus", "elm");
3944 evas_object_focus_set(ELM_WIDGET_DATA(sd)->resize_obj, EINA_TRUE);
3948 edje_object_signal_emit
3949 (ELM_WIDGET_DATA(sd)->resize_obj, "elm,action,unfocus", "elm");
3950 evas_object_focus_set(ELM_WIDGET_DATA(sd)->resize_obj, EINA_FALSE);
3957 _elm_map_smart_theme(Evas_Object *obj)
3959 ELM_MAP_DATA_GET(obj, sd);
3961 if (!ELM_WIDGET_CLASS(_elm_map_parent_sc)->theme(obj))
3970 _elm_map_smart_event(Evas_Object *obj,
3971 Evas_Object *src __UNUSED__,
3972 Evas_Callback_Type type,
3977 Evas_Event_Key_Down *ev = event_info;
3978 Evas_Coord step_x, step_y, page_x, page_y;
3980 ELM_MAP_DATA_GET(obj, sd);
3982 if (elm_widget_disabled_get(obj)) return EINA_FALSE;
3983 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
3984 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
3986 sd->s_iface->content_pos_get(obj, &x, &y);
3987 sd->s_iface->step_size_get(obj, &step_x, &step_y);
3988 sd->s_iface->page_size_get(obj, &page_x, &page_y);
3989 sd->s_iface->content_viewport_size_get(obj, NULL, &vh);
3991 if ((!strcmp(ev->keyname, "Left")) ||
3992 ((!strcmp(ev->keyname, "KP_Left")) && (!ev->string)))
3996 else if ((!strcmp(ev->keyname, "Right")) ||
3997 ((!strcmp(ev->keyname, "KP_Right")) && (!ev->string)))
4001 else if ((!strcmp(ev->keyname, "Up")) ||
4002 ((!strcmp(ev->keyname, "KP_Up")) && (!ev->string)))
4006 else if ((!strcmp(ev->keyname, "Down")) ||
4007 ((!strcmp(ev->keyname, "KP_Down")) && (!ev->string)))
4011 else if ((!strcmp(ev->keyname, "Prior")) ||
4012 ((!strcmp(ev->keyname, "KP_Prior")) && (!ev->string)))
4015 y -= -(page_y * vh) / 100;
4019 else if ((!strcmp(ev->keyname, "Next")) ||
4020 ((!strcmp(ev->keyname, "KP_Next")) && (!ev->string)))
4023 y += -(page_y * vh) / 100;
4027 else if (!strcmp(ev->keyname, "KP_Add"))
4029 _zoom(sd, sd->zoom + 1, 1);
4032 else if (!strcmp(ev->keyname, "KP_Subtract"))
4034 _zoom(sd, sd->zoom - 1, 1);
4037 else return EINA_FALSE;
4039 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
4040 sd->s_iface->content_pos_set(obj, x, y, EINA_TRUE);
4046 _source_tile_set(Elm_Map_Smart_Data *sd,
4047 const char *source_name)
4052 EINA_SAFETY_ON_NULL_RETURN(source_name);
4054 if (sd->src_tile && !strcmp(sd->src_tile->name, source_name))
4057 EINA_LIST_FOREACH(sd->src_tiles, l, s)
4059 if (!strcmp(s->name, source_name))
4067 ERR("source name (%s) is not found", source_name);
4071 if (sd->src_tile->zoom_max < sd->zoom)
4072 sd->zoom = sd->src_tile->zoom_max;
4073 else if (sd->src_tile->zoom_min > sd->zoom)
4074 sd->zoom = sd->src_tile->zoom_min;
4076 if (sd->src_tile->zoom_max < sd->zoom_max)
4077 sd->zoom_max = sd->src_tile->zoom_max;
4078 if (sd->src_tile->zoom_min > sd->zoom_min)
4079 sd->zoom_min = sd->src_tile->zoom_min;
4081 _grid_all_clear(sd);
4082 _grid_all_create(sd);
4083 sd->zoom_detail = sd->zoom;
4084 _map_pan_zoom_do(sd, sd->zoom);
4088 _source_route_set(Elm_Map_Smart_Data *sd,
4089 const char *source_name)
4094 EINA_SAFETY_ON_NULL_RETURN(source_name);
4096 if (sd->src_route && !strcmp(sd->src_route->name, source_name))
4099 EINA_LIST_FOREACH(sd->src_routes, l, s)
4101 if (!strcmp(s->name, source_name))
4109 ERR("source name (%s) is not found", source_name);
4115 _source_name_set(Elm_Map_Smart_Data *sd,
4116 const char *source_name)
4121 EINA_SAFETY_ON_NULL_RETURN(source_name);
4123 if (sd->src_name && !strcmp(sd->src_name->name, source_name))
4126 EINA_LIST_FOREACH(sd->src_names, l, s)
4128 if (!strcmp(s->name, source_name))
4136 ERR("source name (%s) is not found", source_name);
4142 _source_mod_cb(Eina_Module *m,
4146 Elm_Map_Smart_Data *sd = data;
4148 Elm_Map_Module_Source_Name_Func name_cb;
4149 Elm_Map_Module_Add_Func add_cb;
4150 Elm_Map_Module_Del_Func del_cb;
4151 Elm_Map_Module_Move_Func move_cb;
4152 Elm_Map_Module_Resize_Func resize_cb;
4153 Elm_Map_Module_Region_Get_Func region_get_cb;
4154 Elm_Map_Module_Pan_Func pan_cb;
4155 Elm_Map_Module_Show_Func show_cb;
4156 Elm_Map_Module_Zoom_Func zoom_cb;
4157 Elm_Map_Module_Rotate_Func rotate_cb;
4158 Elm_Map_Module_Rotate_Get_Func rotate_get_cb;
4159 Elm_Map_Module_Canvas_to_Region_Func canvas_to_region_cb;
4160 Elm_Map_Module_Region_to_Canvas_Func region_to_canvas_cb;
4161 Elm_Map_Module_Perspective_Set_Func perpective_cb;
4162 Elm_Map_Module_Tile_Url_Func tile_url_cb;
4163 Elm_Map_Module_Tile_Scale_Func scale_cb;
4164 Elm_Map_Module_Tile_Zoom_Min_Func zoom_min;
4165 Elm_Map_Module_Tile_Zoom_Max_Func zoom_max;
4166 Elm_Map_Module_Tile_Geo_to_Coord_Func geo_to_coord;
4167 Elm_Map_Module_Tile_Coord_to_Geo_Func coord_to_geo;
4168 Elm_Map_Module_Route_Url_Func route_url_cb;
4169 Elm_Map_Module_Name_Url_Func name_url_cb;
4171 EINA_SAFETY_ON_NULL_RETURN_VAL(data, EINA_FALSE);
4173 file = eina_module_file_get(m);
4174 if (!eina_module_load(m))
4176 ERR("Could not load module \"%s\": %s", file,
4177 eina_error_msg_get(eina_error_get()));
4180 name_cb = eina_module_symbol_get(m, "map_module_source_name_get");
4183 name_cb = eina_module_symbol_get(m, "map_module_name_get");
4186 WRN("Could not find map module name from module \"%s\": %s",
4187 file, eina_error_msg_get(eina_error_get()));
4188 eina_module_unload(m);
4194 zoom_min = eina_module_symbol_get(m, "map_module_zoom_min_get");
4195 zoom_max = eina_module_symbol_get(m, "map_module_zoom_max_get");
4196 add_cb = eina_module_symbol_get(m, "map_module_add");
4197 del_cb = eina_module_symbol_get(m, "map_module_del");
4198 move_cb = eina_module_symbol_get(m, "map_module_move");
4199 resize_cb = eina_module_symbol_get(m, "map_module_resize");
4200 region_get_cb = eina_module_symbol_get(m, "map_module_region_get");
4201 pan_cb = eina_module_symbol_get(m, "map_module_pan");
4202 show_cb = eina_module_symbol_get(m, "map_module_show");
4203 zoom_cb = eina_module_symbol_get(m, "map_module_zoom");
4204 rotate_cb = eina_module_symbol_get(m, "map_module_rotate");
4205 rotate_get_cb = eina_module_symbol_get(m, "map_module_rotate_get");
4206 perpective_cb = eina_module_symbol_get(m, "map_module_perpective_set");
4207 canvas_to_region_cb = eina_module_symbol_get(m, "map_module_canvas_to_region");
4208 region_to_canvas_cb = eina_module_symbol_get(m, "map_module_region_to_canvas");
4209 if (zoom_min && zoom_max && add_cb && del_cb && show_cb && zoom_cb && rotate_cb && rotate_get_cb && perpective_cb)
4211 INF("Map ENGINE module is loaded \"%s\"", file);
4213 s = ELM_NEW(Source_Engine);
4214 s->name = name_cb();
4215 s->zoom_min = zoom_min();
4216 s->zoom_max = zoom_max();
4219 if (move_cb) s->move = move_cb;
4220 else s->move = _move_unimplemented;
4221 if (resize_cb) s->resize = resize_cb;
4222 else s->resize = _resize_unimplemented;
4223 s->region_get = region_get_cb;
4224 if (pan_cb) s->pan = pan_cb;
4225 else s->pan = _pan_unimplemented;
4228 s->rotate = rotate_cb;
4229 s->rotate_get = rotate_get_cb;
4230 s->perpective = perpective_cb;
4231 if (canvas_to_region_cb) s->canvas_to_region = canvas_to_region_cb;
4232 else s->canvas_to_region = _canvas_to_region_unimplemented;
4233 if (region_to_canvas_cb) s->region_to_canvas = region_to_canvas_cb;
4234 else s->region_to_canvas = _region_to_canvas_unimplemented;
4236 sd->engines = eina_list_append(sd->engines, s);
4240 tile_url_cb = eina_module_symbol_get(m, "map_module_tile_url_get");
4241 zoom_min = eina_module_symbol_get(m, "map_module_tile_zoom_min_get");
4242 zoom_max = eina_module_symbol_get(m, "map_module_tile_zoom_max_get");
4243 geo_to_coord = eina_module_symbol_get(m, "map_module_tile_geo_to_coord");
4244 coord_to_geo = eina_module_symbol_get(m, "map_module_tile_coord_to_geo");
4245 scale_cb = eina_module_symbol_get(m, "map_module_tile_scale_get");
4246 if (tile_url_cb && zoom_min && zoom_max && geo_to_coord && coord_to_geo && scale_cb)
4248 INF("Map TILE module is loaded \"%s\"", file);
4250 s = ELM_NEW(Source_Tile);
4251 s->name = name_cb();
4252 s->zoom_min = zoom_min();
4253 s->zoom_max = zoom_max();
4254 s->url_cb = tile_url_cb;
4255 s->geo_to_coord = geo_to_coord;
4256 s->coord_to_geo = coord_to_geo;
4257 s->scale_cb = scale_cb;
4258 sd->src_tiles = eina_list_append(sd->src_tiles, s);
4261 // Find ROUTE module
4262 route_url_cb = eina_module_symbol_get(m, "map_module_route_url_get");
4265 INF("Map ROUTE module is loaded \"%s\"", file);
4267 s = ELM_NEW(Source_Tile);
4268 s->name = name_cb();
4269 s->url_cb = route_url_cb;
4270 sd->src_routes = eina_list_append(sd->src_routes, s);
4274 name_url_cb = eina_module_symbol_get(m, "map_module_name_url_get");
4277 INF("Map NAME module is loaded \"%s\"", file);
4279 s = ELM_NEW(Source_Tile);
4280 s->name = name_cb();
4281 s->url_cb = name_url_cb;
4282 sd->src_names = eina_list_append(sd->src_names, s);
4288 _source_all_unload(Elm_Map_Smart_Data *sd)
4293 for (idx = 0; sd->src_tile_names[idx]; idx++)
4294 eina_stringshare_del(sd->src_tile_names[idx]);
4295 for (idx = 0; sd->src_route_names[idx]; idx++)
4296 eina_stringshare_del(sd->src_route_names[idx]);
4297 for (idx = 0; sd->src_name_names[idx]; idx++)
4298 eina_stringshare_del(sd->src_name_names[idx]);
4300 EINA_LIST_FREE(sd->src_tiles, s) free(s);
4301 EINA_LIST_FREE(sd->src_routes, s) free(s);
4302 EINA_LIST_FREE(sd->src_names, s) free(s);
4304 eina_module_list_free(sd->src_mods);
4309 _source_all_load(Elm_Map_Smart_Data *sd)
4311 Source_Engine *engine;
4312 Source_Tile *src_tile;
4313 Source_Route *src_route;
4314 Source_Name *src_name;
4318 // Load hard coded TILE source
4319 for (idx = 0; idx < (sizeof(src_tiles) / sizeof(Source_Tile)); idx++)
4321 src_tile = ELM_NEW(Source_Tile);
4322 src_tile->name = src_tiles[idx].name;
4323 src_tile->zoom_min = src_tiles[idx].zoom_min;
4324 src_tile->zoom_max = src_tiles[idx].zoom_max;
4325 src_tile->url_cb = src_tiles[idx].url_cb;
4326 src_tile->geo_to_coord = src_tiles[idx].geo_to_coord;
4327 src_tile->coord_to_geo = src_tiles[idx].coord_to_geo;
4328 src_tile->scale_cb = src_tiles[idx].scale_cb;
4329 sd->src_tiles = eina_list_append(sd->src_tiles, src_tile);
4331 // Load hard coded ROUTE source
4332 for (idx = 0; idx < (sizeof(src_routes) / sizeof(Source_Route)); idx++)
4334 src_route = ELM_NEW(Source_Route);
4335 src_route->name = src_routes[idx].name;
4336 src_route->url_cb = src_routes[idx].url_cb;
4337 sd->src_routes = eina_list_append(sd->src_routes, src_route);
4339 // Load from hard coded NAME source
4340 for (idx = 0; idx < (sizeof(src_names) / sizeof(Source_Name)); idx++)
4342 src_name = ELM_NEW(Source_Name);
4343 src_name->name = src_names[idx].name;
4344 src_name->url_cb = src_names[idx].url_cb;
4345 sd->src_names = eina_list_append(sd->src_names, src_name);
4347 // Load Internal Default Map Engine
4348 engine = ELM_NEW(Source_Engine);
4349 engine->name = INTERNAL_ENGINE_NAME;
4350 engine->zoom_min = src_tiles[0].zoom_min;
4351 engine->zoom_max = src_tiles[0].zoom_max;
4352 engine->add = _map_pan_add;
4353 engine->del = _map_pan_del;
4354 engine->pan = _pan_unimplemented;
4355 engine->show = _map_pan_show;
4356 engine->zoom = _map_pan_zoom;
4357 engine->rotate = _map_pan_rotate;
4358 engine->rotate_get = _map_pan_rotate_get;
4359 engine->perpective = _map_pan_perspective_set;
4360 engine->region_get = _map_pan_region_get;
4361 engine->canvas_to_region = _map_pan_canvas_to_region;
4362 engine->region_to_canvas = _map_pan_region_to_canvas;
4363 sd->engines = eina_list_append(sd->engines, engine);
4365 // Load from modules
4366 sd->src_mods = eina_module_list_get(sd->src_mods, MODULES_PATH, 1,
4367 &_source_mod_cb, sd);
4369 // Set default source
4370 sd->engine = eina_list_nth(sd->engines, 0);
4371 sd->src_tile = eina_list_nth(sd->src_tiles, 0);
4372 sd->src_route = eina_list_nth(sd->src_routes, 0);
4373 sd->src_name = eina_list_nth(sd->src_names, 0);
4375 // Make name string of sources
4377 sd->engine_names = calloc((eina_list_count(sd->engines) + 1),
4378 sizeof(const char *));
4379 EINA_LIST_FOREACH(sd->engines, l, engine)
4381 eina_stringshare_replace(&sd->engine_names[idx], engine->name);
4382 INF("engine : %s", sd->engine_names[idx]);
4386 sd->src_tile_names = calloc((eina_list_count(sd->src_tiles) + 1),
4387 sizeof(const char *));
4388 EINA_LIST_FOREACH(sd->src_tiles, l, src_tile)
4390 eina_stringshare_replace(&sd->src_tile_names[idx], src_tile->name);
4391 INF("source tile: %s", sd->src_tile_names[idx]);
4395 sd->src_route_names = calloc((eina_list_count(sd->src_routes) + 1),
4396 sizeof(const char *));
4397 EINA_LIST_FOREACH(sd->src_routes, l, src_route)
4399 eina_stringshare_replace(&sd->src_route_names[idx], src_route->name);
4400 INF("source route: %s", sd->src_route_names[idx]);
4404 sd->src_name_names = calloc((eina_list_count(sd->src_names) + 1),
4405 sizeof(const char *));
4406 EINA_LIST_FOREACH(sd->src_names, l, src_name)
4408 eina_stringshare_replace(&sd->src_name_names[idx], src_name->name);
4409 INF("source name: %s", sd->src_name_names[idx]);
4415 _elm_map_smart_add(Evas_Object *obj)
4417 Evas_Object *layout;
4418 Elm_Map_Pan_Smart_Data *pan_data;
4419 EVAS_SMART_DATA_ALLOC(obj, Elm_Map_Smart_Data);
4421 ELM_WIDGET_CLASS(_elm_map_parent_sc)->base.add(obj);
4423 elm_widget_can_focus_set(obj, EINA_TRUE);
4425 priv->pan_obj = evas_object_smart_add
4426 (evas_object_evas_get(obj), _elm_map_pan_smart_class_new());
4427 pan_data = evas_object_smart_data_get(priv->pan_obj);
4428 pan_data->wsd = priv;
4430 _source_all_load(priv);
4431 layout = priv->engine->add(obj);
4432 elm_widget_resize_object_set(obj, layout);
4434 evas_object_event_callback_add
4435 (obj, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb, priv);
4436 evas_object_event_callback_add
4437 (obj, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb, priv);
4438 evas_object_event_callback_add
4439 (obj, EVAS_CALLBACK_MOUSE_WHEEL, _mouse_wheel_cb, priv);
4440 evas_object_event_callback_add
4441 (obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints_cb, priv);
4443 priv->g_layer = elm_gesture_layer_add(obj);
4444 if (!priv->g_layer) ERR("elm_gesture_layer_add() failed");
4445 elm_gesture_layer_attach(priv->g_layer, obj);
4446 elm_gesture_layer_cb_set
4447 (priv->g_layer, ELM_GESTURE_ZOOM, ELM_GESTURE_STATE_START,
4448 _pinch_zoom_start_cb, priv);
4449 elm_gesture_layer_cb_set
4450 (priv->g_layer, ELM_GESTURE_ZOOM, ELM_GESTURE_STATE_MOVE,
4451 _pinch_zoom_cb, priv);
4452 elm_gesture_layer_cb_set
4453 (priv->g_layer, ELM_GESTURE_ROTATE, ELM_GESTURE_STATE_MOVE,
4454 _pinch_rotate_cb, priv);
4455 elm_gesture_layer_cb_set
4456 (priv->g_layer, ELM_GESTURE_ROTATE, ELM_GESTURE_STATE_END,
4457 _pinch_rotate_end_cb, priv);
4458 elm_gesture_layer_cb_set
4459 (priv->g_layer, ELM_GESTURE_ROTATE, ELM_GESTURE_STATE_ABORT,
4460 _pinch_rotate_end_cb, priv);
4461 elm_gesture_layer_cb_set
4462 (priv->g_layer, ELM_GESTURE_MOMENTUM, ELM_GESTURE_STATE_START,
4463 _pinch_momentum_start_cb, priv);
4464 elm_gesture_layer_cb_set
4465 (priv->g_layer, ELM_GESTURE_MOMENTUM, ELM_GESTURE_STATE_MOVE,
4466 _pinch_momentum_move_cb, priv);
4467 elm_gesture_layer_cb_set
4468 (priv->g_layer, ELM_GESTURE_MOMENTUM, ELM_GESTURE_STATE_END,
4469 _pinch_momentum_end_cb, priv);
4470 elm_gesture_layer_cb_set
4471 (priv->g_layer, ELM_GESTURE_N_LINES, ELM_GESTURE_STATE_MOVE,
4472 _pinch_n_lines_move_cb, priv);
4473 elm_gesture_layer_cb_set
4474 (priv->g_layer, ELM_GESTURE_N_LINES, ELM_GESTURE_STATE_END,
4475 _pinch_n_lines_end_cb, priv);
4477 priv->mode = ELM_MAP_ZOOM_MODE_MANUAL;
4478 priv->zoom_min = priv->engine->zoom_min;
4479 priv->zoom_max = priv->engine->zoom_max;
4481 priv->zoom_detail = 0;
4483 priv->engine->zoom(obj, 0, 0);
4487 _elm_map_smart_del(Evas_Object *obj)
4489 ELM_MAP_DATA_GET(obj, sd);
4491 if (sd->zoom_timer) ecore_timer_del(sd->zoom_timer);
4492 if (sd->long_timer) ecore_timer_del(sd->long_timer);
4493 if (sd->loaded_timer) ecore_timer_del(sd->loaded_timer);
4495 if (sd->user_agent) eina_stringshare_del(sd->user_agent);
4496 if (sd->ua) eina_hash_free(sd->ua);
4498 sd->engine->del(obj);
4499 _source_all_unload(sd);
4501 evas_object_del(sd->pan_obj);
4502 ELM_WIDGET_CLASS(_elm_map_parent_sc)->base.del(obj);
4506 _elm_map_smart_calculate(Evas_Object *obj)
4508 ELM_MAP_DATA_GET(obj, sd);
4510 if (strcmp(sd->engine->name, INTERNAL_ENGINE_NAME))
4515 _elm_map_smart_move(Evas_Object *obj,
4519 ELM_MAP_DATA_GET(obj, sd);
4521 ELM_WIDGET_CLASS(_elm_map_parent_sc)->base.move(obj, x, y);
4523 if (!strcmp(sd->engine->name, INTERNAL_ENGINE_NAME))
4524 evas_object_move(sd->hit_rect, x, y);
4527 sd->engine->move(obj, x, y);
4533 _elm_map_smart_resize(Evas_Object *obj,
4537 ELM_MAP_DATA_GET(obj, sd);
4539 ELM_WIDGET_CLASS(_elm_map_parent_sc)->base.resize(obj, w, h);
4541 if (!strcmp(sd->engine->name, INTERNAL_ENGINE_NAME))
4542 evas_object_resize(sd->hit_rect, w, h);
4545 sd->engine->resize(obj, w, h);
4551 _elm_map_smart_member_add(Evas_Object *obj,
4552 Evas_Object *member)
4554 ELM_MAP_DATA_GET(obj, sd);
4556 ELM_WIDGET_CLASS(_elm_map_parent_sc)->base.member_add(obj, member);
4559 evas_object_raise(sd->hit_rect);
4563 _elm_map_smart_set_user(Elm_Map_Smart_Class *sc)
4565 ELM_WIDGET_CLASS(sc)->base.add = _elm_map_smart_add;
4566 ELM_WIDGET_CLASS(sc)->base.del = _elm_map_smart_del;
4567 ELM_WIDGET_CLASS(sc)->base.calculate = _elm_map_smart_calculate;
4569 ELM_WIDGET_CLASS(sc)->base.move = _elm_map_smart_move;
4570 ELM_WIDGET_CLASS(sc)->base.resize = _elm_map_smart_resize;
4571 ELM_WIDGET_CLASS(sc)->base.member_add = _elm_map_smart_member_add;
4573 ELM_WIDGET_CLASS(sc)->on_focus = _elm_map_smart_on_focus;
4574 ELM_WIDGET_CLASS(sc)->theme = _elm_map_smart_theme;
4575 ELM_WIDGET_CLASS(sc)->event = _elm_map_smart_event;
4576 ELM_WIDGET_CLASS(sc)->translate = _elm_map_smart_translate;
4580 EAPI const Elm_Map_Smart_Class *
4581 elm_map_smart_class_get(void)
4583 #ifdef HAVE_ELEMENTARY_ECORE_CON
4584 static Elm_Map_Smart_Class _sc =
4585 ELM_MAP_SMART_CLASS_INIT_NAME_VERSION(ELM_MAP_SMART_NAME);
4586 static const Elm_Map_Smart_Class *class = NULL;
4587 Evas_Smart_Class *esc = (Evas_Smart_Class *)&_sc;
4589 if (class) return class;
4591 _elm_map_smart_set(&_sc);
4592 esc->callbacks = _smart_callbacks;
4602 elm_map_add(Evas_Object *parent)
4604 #ifdef HAVE_ELEMENTARY_ECORE_CON
4607 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
4609 obj = elm_widget_add(_elm_map_smart_class_new(), parent);
4610 if (!obj) return NULL;
4612 if (!elm_widget_sub_object_add(parent, obj))
4613 ERR("could not add %p as sub object of %p", obj, parent);
4623 elm_map_zoom_set(Evas_Object *obj,
4626 #ifdef HAVE_ELEMENTARY_ECORE_CON
4629 ELM_MAP_DATA_GET(obj, sd);
4630 EINA_SAFETY_ON_NULL_RETURN(sd->src_tile);
4632 Eina_Bool animation;
4634 if (sd->mode != ELM_MAP_ZOOM_MODE_MANUAL) return;
4635 if (zoom < 0) zoom = 0;
4636 if (sd->zoom == zoom) return;
4638 if (sd->paused) animation = EINA_FALSE;
4639 else animation = EINA_TRUE;
4641 if (!strcmp(sd->engine->name, INTERNAL_ENGINE_NAME))
4643 sd->calc_job.zoom_changed = EINA_TRUE;
4644 sd->calc_job.zoom_anim = animation;
4645 sd->calc_job.zoom = zoom;
4646 evas_object_smart_changed(sd->pan_obj);
4648 else _zoom(sd, zoom, 1);
4657 elm_map_zoom_get(const Evas_Object *obj)
4659 #ifdef HAVE_ELEMENTARY_ECORE_CON
4660 ELM_MAP_CHECK(obj) 0;
4661 ELM_MAP_DATA_GET(obj, sd);
4671 elm_map_zoom_mode_set(Evas_Object *obj,
4672 Elm_Map_Zoom_Mode mode)
4674 #ifdef HAVE_ELEMENTARY_ECORE_CON
4676 ELM_MAP_DATA_GET(obj, sd);
4678 if ((mode == ELM_MAP_ZOOM_MODE_MANUAL) && (sd->mode == !!mode)) return;
4681 if (!strcmp(sd->engine->name, INTERNAL_ENGINE_NAME))
4683 sd->calc_job.zoom_changed = EINA_TRUE;
4684 sd->calc_job.zoom_anim = EINA_FALSE;
4685 sd->calc_job.zoom = sd->zoom;
4686 evas_object_smart_changed(sd->pan_obj);
4688 else ERR("Engine(%s) do not support zoom mode", sd->engine->name);
4696 EAPI Elm_Map_Zoom_Mode
4697 elm_map_zoom_mode_get(const Evas_Object *obj)
4699 #ifdef HAVE_ELEMENTARY_ECORE_CON
4700 ELM_MAP_CHECK(obj) ELM_MAP_ZOOM_MODE_MANUAL;
4701 ELM_MAP_DATA_GET(obj, sd);
4706 return ELM_MAP_ZOOM_MODE_MANUAL;
4711 elm_map_zoom_max_set(Evas_Object *obj,
4714 #ifdef HAVE_ELEMENTARY_ECORE_CON
4716 ELM_MAP_DATA_GET(obj, sd);
4717 EINA_SAFETY_ON_NULL_RETURN(sd->src_tile);
4719 sd->zoom_max = zoom;
4727 elm_map_zoom_max_get(const Evas_Object *obj)
4729 #ifdef HAVE_ELEMENTARY_ECORE_CON
4730 ELM_MAP_CHECK(obj) - 1;
4731 ELM_MAP_DATA_GET(obj, sd);
4732 EINA_SAFETY_ON_NULL_RETURN_VAL(sd->src_tile, -1);
4734 return sd->zoom_max;
4742 elm_map_zoom_min_set(Evas_Object *obj,
4745 #ifdef HAVE_ELEMENTARY_ECORE_CON
4747 ELM_MAP_DATA_GET(obj, sd);
4748 EINA_SAFETY_ON_NULL_RETURN(sd->src_tile);
4750 sd->zoom_min = zoom;
4758 elm_map_zoom_min_get(const Evas_Object *obj)
4760 #ifdef HAVE_ELEMENTARY_ECORE_CON
4761 ELM_MAP_CHECK(obj) - 1;
4762 ELM_MAP_DATA_GET(obj, sd);
4763 EINA_SAFETY_ON_NULL_RETURN_VAL(sd->src_tile, -1);
4765 return sd->zoom_min;
4773 elm_map_region_bring_in(Evas_Object *obj,
4777 #ifdef HAVE_ELEMENTARY_ECORE_CON
4779 ELM_MAP_DATA_GET(obj, sd);
4781 if (!strcmp(sd->engine->name, INTERNAL_ENGINE_NAME))
4783 sd->calc_job.show_changed = EINA_TRUE;
4784 sd->calc_job.show_anim = EINA_TRUE;
4785 sd->calc_job.lon = lon;
4786 sd->calc_job.lat = lat;
4787 evas_object_smart_changed(sd->pan_obj);
4791 sd->engine->show(obj, lon, lat, 1);
4802 elm_map_region_show(Evas_Object *obj,
4806 #ifdef HAVE_ELEMENTARY_ECORE_CON
4808 ELM_MAP_DATA_GET(obj, sd);
4810 if (!strcmp(sd->engine->name, INTERNAL_ENGINE_NAME))
4812 sd->calc_job.show_changed = EINA_TRUE;
4813 sd->calc_job.show_anim = EINA_FALSE;
4814 sd->calc_job.lon = lon;
4815 sd->calc_job.lat = lat;
4816 evas_object_smart_changed(sd->pan_obj);
4820 sd->engine->show(obj, lon, lat, 0);
4832 elm_map_region_get(const Evas_Object *obj,
4836 #ifdef HAVE_ELEMENTARY_ECORE_CON
4839 ELM_MAP_DATA_GET(obj, sd);
4842 sd->engine->region_get(obj, &tlon, &tlat);
4843 if (lon) *lon = tlon;
4844 if (lat) *lat = tlat;
4853 elm_map_paused_set(Evas_Object *obj,
4856 #ifdef HAVE_ELEMENTARY_ECORE_CON
4858 ELM_MAP_DATA_GET(obj, sd);
4860 if (sd->paused == !!paused) return;
4861 sd->paused = !!paused;
4863 if (!strcmp(sd->engine->name, INTERNAL_ENGINE_NAME))
4867 if (sd->zoom_animator)
4869 if (sd->zoom_animator) ecore_animator_del(sd->zoom_animator);
4870 sd->zoom_animator = NULL;
4871 sd->zoom_detail = sd->zoom;
4872 _map_pan_zoom_do(sd, sd->zoom);
4874 edje_object_signal_emit(ELM_WIDGET_DATA(sd)->resize_obj,
4875 "elm,state,busy,stop", "elm");
4879 if (sd->download_num >= 1)
4880 edje_object_signal_emit(ELM_WIDGET_DATA(sd)->resize_obj,
4881 "elm,state,busy,start", "elm");
4892 elm_map_paused_get(const Evas_Object *obj)
4894 #ifdef HAVE_ELEMENTARY_ECORE_CON
4895 ELM_MAP_CHECK(obj) EINA_FALSE;
4896 ELM_MAP_DATA_GET(obj, sd);
4906 elm_map_rotate_set(Evas_Object *obj,
4911 #ifdef HAVE_ELEMENTARY_ECORE_CON
4913 ELM_MAP_DATA_GET(obj, sd);
4915 sd->engine->rotate(obj, degree, cx, cy, degree);
4925 elm_map_rotate_get(const Evas_Object *obj,
4930 #ifdef HAVE_ELEMENTARY_ECORE_CON
4932 ELM_MAP_DATA_GET(obj, sd);
4934 sd->engine->rotate_get(obj, degree, cx, cy);
4944 elm_map_wheel_disabled_set(Evas_Object *obj,
4947 #ifdef HAVE_ELEMENTARY_ECORE_CON
4949 ELM_MAP_DATA_GET(obj, sd);
4951 if ((!sd->wheel_disabled) && (disabled))
4952 evas_object_event_callback_del_full
4953 (obj, EVAS_CALLBACK_MOUSE_WHEEL, _mouse_wheel_cb, sd);
4954 else if ((sd->wheel_disabled) && (!disabled))
4955 evas_object_event_callback_add
4956 (obj, EVAS_CALLBACK_MOUSE_WHEEL, _mouse_wheel_cb, sd);
4957 sd->wheel_disabled = !!disabled;
4965 elm_map_wheel_disabled_get(const Evas_Object *obj)
4967 #ifdef HAVE_ELEMENTARY_ECORE_CON
4968 ELM_MAP_CHECK(obj) EINA_FALSE;
4969 ELM_MAP_DATA_GET(obj, sd);
4971 return sd->wheel_disabled;
4979 elm_map_tile_load_status_get(const Evas_Object *obj,
4983 #ifdef HAVE_ELEMENTARY_ECORE_CON
4985 ELM_MAP_DATA_GET(obj, sd);
4987 if (try_num) *try_num = sd->try_num;
4988 if (finish_num) *finish_num = sd->finish_num;
4997 elm_map_canvas_to_region_convert(const Evas_Object *obj,
5003 #ifdef HAVE_ELEMENTARY_ECORE_CON
5005 ELM_MAP_DATA_GET(obj, sd);
5006 EINA_SAFETY_ON_NULL_RETURN(lon);
5007 EINA_SAFETY_ON_NULL_RETURN(lat);
5009 sd->engine->canvas_to_region(obj, x, y, lon, lat);
5020 elm_map_region_to_canvas_convert(const Evas_Object *obj,
5026 #ifdef HAVE_ELEMENTARY_ECORE_CON
5028 ELM_MAP_DATA_GET(obj, sd);
5029 EINA_SAFETY_ON_NULL_RETURN(x);
5030 EINA_SAFETY_ON_NULL_RETURN(y);
5032 sd->engine->region_to_canvas(obj, lon, lat, x, y);
5043 elm_map_user_agent_set(Evas_Object *obj,
5044 const char *user_agent)
5046 #ifdef HAVE_ELEMENTARY_ECORE_CON
5048 ELM_MAP_DATA_GET(obj, sd);
5049 EINA_SAFETY_ON_NULL_RETURN(user_agent);
5051 eina_stringshare_replace(&sd->user_agent, user_agent);
5053 if (!sd->ua) sd->ua = eina_hash_string_small_new(NULL);
5054 eina_hash_set(sd->ua, "User-Agent", sd->user_agent);
5062 elm_map_user_agent_get(const Evas_Object *obj)
5064 #ifdef HAVE_ELEMENTARY_ECORE_CON
5065 ELM_MAP_CHECK(obj) NULL;
5066 ELM_MAP_DATA_GET(obj, sd);
5068 return sd->user_agent;
5076 elm_map_engine_set(Evas_Object *obj,
5077 const char *engine_name)
5080 ELM_MAP_DATA_GET(obj, sd);
5081 EINA_SAFETY_ON_NULL_RETURN(engine_name);
5083 Source_Engine *engine = NULL;
5086 Evas_Object *layout;
5089 if (sd->engine && !strcmp(sd->engine->name, engine_name))
5092 EINA_LIST_FOREACH(sd->engines, l, e)
5094 if (!strcmp(e->name, engine_name))
5102 ERR("Engine name (%s) is not found", engine_name);
5105 layout = engine->add(obj);
5109 ERR("%s engine can not be added", engine->name);
5112 sd->engine->region_get(obj, &lon, &lat);
5113 sd->engine->del(obj);
5114 sd->engine = engine;
5116 if (sd->engine->zoom_max < sd->zoom)
5117 sd->zoom = sd->engine->zoom_max;
5118 else if (sd->engine->zoom_min > sd->zoom)
5119 sd->zoom = sd->engine->zoom_min;
5121 if (sd->engine->zoom_max < sd->zoom_max)
5122 sd->zoom_max = sd->engine->zoom_max;
5123 if (sd->engine->zoom_min > sd->zoom_min)
5124 sd->zoom_min = sd->engine->zoom_min;
5126 evas_object_hide(ELM_WIDGET_DATA(sd)->resize_obj);
5127 elm_widget_resize_object_set(obj, layout);
5128 sd->engine->zoom(obj, sd->zoom, 0);
5129 sd->engine->show(obj, lon, lat, 0);
5133 elm_map_engine_get(const Evas_Object *obj)
5135 ELM_MAP_CHECK(obj) NULL;
5136 ELM_MAP_DATA_GET(obj, sd);
5138 EINA_SAFETY_ON_NULL_RETURN_VAL(sd->src_tile, NULL);
5140 return sd->engine->name;
5144 elm_map_engines_get(const Evas_Object *obj)
5146 ELM_MAP_CHECK(obj) NULL;
5147 ELM_MAP_DATA_GET(obj, sd);
5149 return sd->engine_names;
5153 elm_map_source_set(Evas_Object *obj,
5154 Elm_Map_Source_Type type,
5155 const char *source_name)
5157 #ifdef HAVE_ELEMENTARY_ECORE_CON
5159 ELM_MAP_DATA_GET(obj, sd);
5160 EINA_SAFETY_ON_NULL_RETURN(source_name);
5162 if (strcmp(sd->engine->name, INTERNAL_ENGINE_NAME))
5164 ERR("Current engine is not %s", INTERNAL_ENGINE_NAME);
5168 if (type == ELM_MAP_SOURCE_TYPE_TILE)
5169 _source_tile_set(sd, source_name);
5170 else if (type == ELM_MAP_SOURCE_TYPE_ROUTE)
5171 _source_route_set(sd, source_name);
5172 else if (type == ELM_MAP_SOURCE_TYPE_NAME)
5173 _source_name_set(sd, source_name);
5174 else ERR("Not supported map source type: %d", type);
5184 elm_map_source_get(const Evas_Object *obj,
5185 Elm_Map_Source_Type type)
5187 #ifdef HAVE_ELEMENTARY_ECORE_CON
5188 ELM_MAP_CHECK(obj) NULL;
5189 ELM_MAP_DATA_GET(obj, sd);
5191 if (strcmp(sd->engine->name, INTERNAL_ENGINE_NAME))
5193 ERR("Current engine is not %s", INTERNAL_ENGINE_NAME);
5196 EINA_SAFETY_ON_NULL_RETURN_VAL(sd->src_tile, NULL);
5198 if (type == ELM_MAP_SOURCE_TYPE_TILE) return sd->src_tile->name;
5199 else if (type == ELM_MAP_SOURCE_TYPE_ROUTE)
5200 return sd->src_route->name;
5201 else if (type == ELM_MAP_SOURCE_TYPE_NAME)
5202 return sd->src_name->name;
5203 else ERR("Not supported map source type: %d", type);
5214 elm_map_sources_get(const Evas_Object *obj,
5215 Elm_Map_Source_Type type)
5217 #ifdef HAVE_ELEMENTARY_ECORE_CON
5218 ELM_MAP_CHECK(obj) NULL;
5219 ELM_MAP_DATA_GET(obj, sd);
5221 if (type == ELM_MAP_SOURCE_TYPE_TILE) return sd->src_tile_names;
5222 else if (type == ELM_MAP_SOURCE_TYPE_ROUTE)
5223 return sd->src_route_names;
5224 else if (type == ELM_MAP_SOURCE_TYPE_NAME)
5225 return sd->src_name_names;
5226 else ERR("Not supported map source type: %d", type);
5236 EAPI Elm_Map_Route *
5237 elm_map_route_add(Evas_Object *obj,
5238 Elm_Map_Route_Type type,
5239 Elm_Map_Route_Method method,
5244 Elm_Map_Route_Cb route_cb,
5247 #ifdef HAVE_ELEMENTARY_ECORE_CON
5250 Elm_Map_Route *route;
5251 char fname[PATH_MAX], fname2[PATH_MAX];
5253 ELM_MAP_CHECK(obj) NULL;
5254 ELM_MAP_DATA_GET(obj, sd);
5256 EINA_SAFETY_ON_NULL_RETURN_VAL(sd->src_route, NULL);
5259 const char *cachedir;
5262 snprintf(fname, sizeof(fname), "%s" CACHE_ROUTE_ROOT,
5263 efreet_cache_home_get());
5266 cachedir = getenv("XDG_CACHE_HOME");
5267 snprintf(fname, sizeof(fname), "%s/%s" CACHE_ROUTE_ROOT, getenv("HOME"),
5268 cachedir ? : "/.config");
5270 if (!ecore_file_exists(fname)) ecore_file_mkpath(fname);
5273 if (type == ELM_MAP_ROUTE_TYPE_MOTOCAR)
5274 type_name = strdup(ROUTE_TYPE_MOTORCAR);
5275 else if (type == ELM_MAP_ROUTE_TYPE_BICYCLE)
5276 type_name = strdup(ROUTE_TYPE_BICYCLE);
5277 else if (type == ELM_MAP_ROUTE_TYPE_FOOT)
5278 type_name = strdup(ROUTE_TYPE_FOOT);
5279 else type_name = NULL;
5281 url = sd->src_route->url_cb(obj, type_name, method, flon, flat, tlon, tlat);
5284 ERR("Route URL is NULL");
5285 if (type_name) free(type_name);
5288 if (type_name) free(type_name);
5290 route = ELM_NEW(Elm_Map_Route);
5292 snprintf(fname2, sizeof(fname2), "%s/%d", fname, rand());
5293 route->fname = strdup(fname2);
5295 route->method = method;
5300 route->cb = route_cb;
5303 if (!ecore_file_download_full(url, route->fname, _route_cb, NULL, route,
5304 &(route->job), sd->ua) || !(route->job))
5306 ERR("Can't request Route from %s to %s", url, route->fname);
5311 INF("Route requested from %s to %s", url, route->fname);
5314 sd->routes = eina_list_append(sd->routes, route);
5315 evas_object_smart_callback_call
5316 (ELM_WIDGET_DATA(sd)->obj, SIG_ROUTE_LOAD, route);
5317 edje_object_signal_emit(ELM_WIDGET_DATA(sd)->resize_obj,
5318 "elm,state,busy,start", "elm");
5335 elm_map_route_del(Elm_Map_Route *route)
5337 #ifdef HAVE_ELEMENTARY_ECORE_CON
5341 EINA_SAFETY_ON_NULL_RETURN(route);
5342 EINA_SAFETY_ON_NULL_RETURN(route->wsd);
5343 ELM_MAP_CHECK(ELM_WIDGET_DATA(route->wsd)->obj);
5345 if (route->job) ecore_file_download_abort(route->job);
5347 EINA_LIST_FREE (route->waypoint, w)
5349 if (w->point) eina_stringshare_del(w->point);
5353 EINA_LIST_FREE (route->nodes, n)
5355 if (n->pos.address) eina_stringshare_del(n->pos.address);
5361 ecore_file_remove(route->fname);
5365 route->wsd->routes = eina_list_remove(route->wsd->routes, route);
5373 elm_map_route_distance_get(const Elm_Map_Route *route)
5375 #ifdef HAVE_ELEMENTARY_ECORE_CON
5376 EINA_SAFETY_ON_NULL_RETURN_VAL(route, 0.0);
5377 return route->info.distance;
5385 elm_map_route_node_get(const Elm_Map_Route *route)
5387 #ifdef HAVE_ELEMENTARY_ECORE_CON
5388 EINA_SAFETY_ON_NULL_RETURN_VAL(route, NULL);
5389 return route->info.nodes;
5397 elm_map_route_waypoint_get(const Elm_Map_Route *route)
5399 #ifdef HAVE_ELEMENTARY_ECORE_CON
5400 EINA_SAFETY_ON_NULL_RETURN_VAL(route, NULL);
5401 return route->info.waypoints;
5409 elm_map_name_add(const Evas_Object *obj,
5410 const char *address,
5413 Elm_Map_Name_Cb name_cb,
5416 #ifdef HAVE_ELEMENTARY_ECORE_CON
5417 ELM_MAP_CHECK(obj) NULL;
5420 return _name_request(obj, ELM_MAP_NAME_METHOD_SEARCH, address, 0, 0,
5423 return _name_request(obj, ELM_MAP_NAME_METHOD_REVERSE, NULL, lon, lat,
5437 elm_map_name_search(const Evas_Object *obj,
5438 const char *address,
5439 Elm_Map_Name_List_Cb name_cb,
5442 #ifdef HAVE_ELEMENTARY_ECORE_CON
5445 _name_list_request(obj, ELM_MAP_NAME_METHOD_SEARCH, address, 0, 0,
5456 elm_map_name_del(Elm_Map_Name *name)
5458 #ifdef HAVE_ELEMENTARY_ECORE_CON
5459 EINA_SAFETY_ON_NULL_RETURN(name);
5460 EINA_SAFETY_ON_NULL_RETURN(name->wsd);
5461 ELM_MAP_CHECK(ELM_WIDGET_DATA(name->wsd)->obj);
5463 if (name->job) ecore_file_download_abort(name->job);
5464 if (name->address) free(name->address);
5467 ecore_file_remove(name->fname);
5471 name->wsd->names = eina_list_remove(name->wsd->names, name);
5479 elm_map_name_address_get(const Elm_Map_Name *name)
5481 #ifdef HAVE_ELEMENTARY_ECORE_CON
5482 EINA_SAFETY_ON_NULL_RETURN_VAL(name, NULL);
5483 EINA_SAFETY_ON_NULL_RETURN_VAL(name->wsd, NULL);
5484 ELM_MAP_CHECK(ELM_WIDGET_DATA(name->wsd)->obj) NULL;
5486 return name->address;
5494 elm_map_name_region_get(const Elm_Map_Name *name,
5498 #ifdef HAVE_ELEMENTARY_ECORE_CON
5499 EINA_SAFETY_ON_NULL_RETURN(name);
5500 EINA_SAFETY_ON_NULL_RETURN(name->wsd);
5501 ELM_MAP_CHECK(ELM_WIDGET_DATA(name->wsd)->obj);
5503 if (lon) *lon = name->lon;
5504 if (lat) *lat = name->lat;
5512 EAPI Elm_Map_Overlay *
5513 elm_map_overlay_add(Evas_Object *obj,
5517 #ifdef HAVE_ELEMENTARY_ECORE_CON
5518 Elm_Map_Overlay *overlay;
5520 ELM_MAP_CHECK(obj) NULL;
5521 ELM_MAP_DATA_GET(obj, sd);
5523 overlay = ELM_NEW(Elm_Map_Overlay);
5525 overlay->type = ELM_MAP_OVERLAY_TYPE_DEFAULT;
5526 overlay->c.r = 0x87;
5527 overlay->c.g = 0xce;
5528 overlay->c.b = 0xeb;
5530 overlay->ovl = _overlay_default_new(overlay, lon, lat, overlay->c, 1);
5531 overlay->grp = _overlay_group_new(sd);
5532 sd->overlays = eina_list_append(sd->overlays, overlay);
5534 evas_object_smart_changed(sd->pan_obj);
5546 elm_map_overlays_get(Evas_Object *obj)
5548 #ifdef HAVE_ELEMENTARY_ECORE_CON
5550 Elm_Map_Overlay *ovl;
5552 ELM_MAP_CHECK(obj) NULL;
5553 ELM_MAP_DATA_GET(obj, sd);
5555 eina_list_free(sd->all_overlays);
5556 sd->all_overlays = NULL;
5558 EINA_LIST_FOREACH(sd->overlays, l, ovl)
5559 sd->all_overlays = eina_list_append(sd->all_overlays, ovl);
5560 EINA_LIST_FOREACH(sd->group_overlays, l, ovl)
5561 sd->all_overlays = eina_list_append(sd->all_overlays, ovl);
5563 return sd->all_overlays;
5571 elm_map_overlay_del(Elm_Map_Overlay *overlay)
5573 #ifdef HAVE_ELEMENTARY_ECORE_CON
5574 EINA_SAFETY_ON_NULL_RETURN(overlay);
5575 EINA_SAFETY_ON_NULL_RETURN(overlay->wsd);
5576 ELM_MAP_CHECK(ELM_WIDGET_DATA(overlay->wsd)->obj);
5578 evas_object_smart_callback_call
5579 (ELM_WIDGET_DATA(overlay->wsd)->obj, SIG_OVERLAY_DEL, overlay);
5580 if (overlay->del_cb)
5582 (overlay->del_cb_data, ELM_WIDGET_DATA(overlay->wsd)->obj, overlay);
5586 if (overlay->grp->klass)
5587 elm_map_overlay_class_remove(overlay->grp->klass, overlay);
5588 _overlay_group_free(overlay->grp);
5591 if (overlay->type == ELM_MAP_OVERLAY_TYPE_DEFAULT)
5592 _overlay_default_free(overlay->ovl);
5593 else if (overlay->type == ELM_MAP_OVERLAY_TYPE_BUBBLE)
5594 _overlay_bubble_free(overlay->ovl);
5595 else if (overlay->type == ELM_MAP_OVERLAY_TYPE_CLASS)
5596 _overlay_class_free(overlay->ovl);
5597 else if (overlay->type == ELM_MAP_OVERLAY_TYPE_ROUTE)
5598 _overlay_route_free(overlay->ovl);
5599 else if (overlay->type == ELM_MAP_OVERLAY_TYPE_LINE)
5600 _overlay_line_free(overlay->ovl);
5601 else if (overlay->type == ELM_MAP_OVERLAY_TYPE_POLYGON)
5602 _overlay_polygon_free(overlay->ovl);
5603 else if (overlay->type == ELM_MAP_OVERLAY_TYPE_CIRCLE)
5604 _overlay_circle_free(overlay->ovl);
5605 else if (overlay->type == ELM_MAP_OVERLAY_TYPE_SCALE)
5606 _overlay_scale_free(overlay->ovl);
5607 else ERR("Invalid overlay type: %d", overlay->type);
5609 overlay->wsd->overlays = eina_list_remove(overlay->wsd->overlays, overlay);
5610 evas_object_smart_changed(overlay->wsd->pan_obj);
5618 EAPI Elm_Map_Overlay_Type
5619 elm_map_overlay_type_get(const Elm_Map_Overlay *overlay)
5621 #ifdef HAVE_ELEMENTARY_ECORE_CON
5622 EINA_SAFETY_ON_NULL_RETURN_VAL(overlay, ELM_MAP_OVERLAY_TYPE_NONE);
5623 EINA_SAFETY_ON_NULL_RETURN_VAL(overlay->wsd, ELM_MAP_OVERLAY_TYPE_NONE);
5624 ELM_MAP_CHECK(ELM_WIDGET_DATA(overlay->wsd)->obj) ELM_MAP_OVERLAY_TYPE_NONE;
5626 return overlay->type;
5629 return ELM_MAP_OVERLAY_TYPE_NONE;
5634 elm_map_overlay_data_set(Elm_Map_Overlay *overlay,
5637 #ifdef HAVE_ELEMENTARY_ECORE_CON
5638 EINA_SAFETY_ON_NULL_RETURN(overlay);
5639 EINA_SAFETY_ON_NULL_RETURN(overlay->wsd);
5640 ELM_MAP_CHECK(ELM_WIDGET_DATA(overlay->wsd)->obj);
5642 overlay->data = data;
5650 elm_map_overlay_data_get(const Elm_Map_Overlay *overlay)
5652 #ifdef HAVE_ELEMENTARY_ECORE_CON
5653 EINA_SAFETY_ON_NULL_RETURN_VAL(overlay, NULL);
5654 EINA_SAFETY_ON_NULL_RETURN_VAL(overlay->wsd, NULL);
5655 ELM_MAP_CHECK(ELM_WIDGET_DATA(overlay->wsd)->obj) NULL;
5657 return overlay->data;
5665 elm_map_overlay_hide_set(Elm_Map_Overlay *overlay,
5668 #ifdef HAVE_ELEMENTARY_ECORE_CON
5669 EINA_SAFETY_ON_NULL_RETURN(overlay);
5670 EINA_SAFETY_ON_NULL_RETURN(overlay->wsd);
5671 ELM_MAP_CHECK(ELM_WIDGET_DATA(overlay->wsd)->obj);
5673 if (overlay->hide == !!hide) return;
5674 overlay->hide = hide;
5676 evas_object_smart_changed(overlay->wsd->pan_obj);
5684 elm_map_overlay_hide_get(const Elm_Map_Overlay *overlay)
5686 #ifdef HAVE_ELEMENTARY_ECORE_CON
5687 EINA_SAFETY_ON_NULL_RETURN_VAL(overlay, EINA_FALSE);
5688 EINA_SAFETY_ON_NULL_RETURN_VAL(overlay->wsd, EINA_FALSE);
5689 ELM_MAP_CHECK(ELM_WIDGET_DATA(overlay->wsd)->obj) EINA_FALSE;
5691 return overlay->hide;
5699 elm_map_overlay_displayed_zoom_min_set(Elm_Map_Overlay *overlay,
5702 #ifdef HAVE_ELEMENTARY_ECORE_CON
5703 EINA_SAFETY_ON_NULL_RETURN(overlay);
5704 EINA_SAFETY_ON_NULL_RETURN(overlay->wsd);
5705 ELM_MAP_CHECK(ELM_WIDGET_DATA(overlay->wsd)->obj);
5707 overlay->zoom_min = zoom;
5708 evas_object_smart_changed(overlay->wsd->pan_obj);
5716 elm_map_overlay_displayed_zoom_min_get(const Elm_Map_Overlay *overlay)
5718 #ifdef HAVE_ELEMENTARY_ECORE_CON
5719 EINA_SAFETY_ON_NULL_RETURN_VAL(overlay, 0);
5720 EINA_SAFETY_ON_NULL_RETURN_VAL(overlay->wsd, 0);
5721 ELM_MAP_CHECK(ELM_WIDGET_DATA(overlay->wsd)->obj) 0;
5723 return overlay->zoom_min;
5731 elm_map_overlay_paused_set(Elm_Map_Overlay *overlay,
5734 #ifdef HAVE_ELEMENTARY_ECORE_CON
5735 EINA_SAFETY_ON_NULL_RETURN(overlay);
5736 EINA_SAFETY_ON_NULL_RETURN(overlay->wsd);
5737 ELM_MAP_CHECK(ELM_WIDGET_DATA(overlay->wsd)->obj);
5739 if (overlay->paused == !!paused) return;
5740 overlay->paused = paused;
5742 evas_object_smart_changed(overlay->wsd->pan_obj);
5750 elm_map_overlay_paused_get(const Elm_Map_Overlay *overlay)
5752 #ifdef HAVE_ELEMENTARY_ECORE_CON
5753 EINA_SAFETY_ON_NULL_RETURN_VAL(overlay, EINA_FALSE);
5754 EINA_SAFETY_ON_NULL_RETURN_VAL(overlay->wsd, EINA_FALSE);
5755 ELM_MAP_CHECK(ELM_WIDGET_DATA(overlay->wsd)->obj) EINA_FALSE;
5757 return overlay->paused;
5765 elm_map_overlay_visible_get(const Elm_Map_Overlay *overlay)
5767 #ifdef HAVE_ELEMENTARY_ECORE_CON
5768 EINA_SAFETY_ON_NULL_RETURN_VAL(overlay, EINA_FALSE);
5769 EINA_SAFETY_ON_NULL_RETURN_VAL(overlay->wsd, EINA_FALSE);
5770 ELM_MAP_CHECK(ELM_WIDGET_DATA(overlay->wsd)->obj) EINA_FALSE;
5772 return overlay->visible;
5780 elm_map_overlay_show(Elm_Map_Overlay *overlay)
5782 #ifdef HAVE_ELEMENTARY_ECORE_CON
5783 EINA_SAFETY_ON_NULL_RETURN(overlay);
5784 EINA_SAFETY_ON_NULL_RETURN(overlay->wsd);
5785 ELM_MAP_CHECK(ELM_WIDGET_DATA(overlay->wsd)->obj);
5787 if (overlay->type == ELM_MAP_OVERLAY_TYPE_DEFAULT)
5789 Overlay_Default *ovl = overlay->ovl;
5792 (ELM_WIDGET_DATA(overlay->wsd)->obj, ovl->lon, ovl->lat);
5794 else if (overlay->type == ELM_MAP_OVERLAY_TYPE_BUBBLE)
5796 Overlay_Bubble *ovl = overlay->ovl;
5799 (ELM_WIDGET_DATA(overlay->wsd)->obj, ovl->lon, ovl->lat);
5801 else if (overlay->type == ELM_MAP_OVERLAY_TYPE_CLASS)
5803 Overlay_Class *ovl = overlay->ovl;
5804 double lon, lat, max_lo, min_lo, max_la, min_la;
5806 _region_max_min_get(ovl->members, &max_lo, &min_lo, &max_la, &min_la);
5807 lon = (max_lo + min_lo) / 2;
5808 lat = (max_la + min_la) / 2;
5809 elm_map_region_show(ELM_WIDGET_DATA(overlay->wsd)->obj, lon, lat);
5811 else ERR("Not supported overlay type: %d", overlay->type);
5813 evas_object_smart_changed(overlay->wsd->pan_obj);
5820 elm_map_overlays_show(Eina_List *overlays)
5822 #ifdef HAVE_ELEMENTARY_ECORE_CON
5823 Elm_Map_Smart_Data *sd;
5824 Elm_Map_Overlay *overlay;
5826 EINA_SAFETY_ON_NULL_RETURN(overlays);
5827 EINA_SAFETY_ON_FALSE_RETURN(eina_list_count(overlays));
5829 overlay = eina_list_data_get(overlays);
5832 if (!strcmp(sd->engine->name, INTERNAL_ENGINE_NAME))
5834 sd->calc_job.overlays_changed = EINA_TRUE;
5835 sd->calc_job.overlays = overlays;
5836 evas_object_smart_changed(sd->pan_obj);
5838 else ERR("Engine(%s) do not support overlays show", sd->engine->name);
5846 elm_map_overlay_region_set(Elm_Map_Overlay *overlay,
5850 #ifdef HAVE_ELEMENTARY_ECORE_CON
5851 EINA_SAFETY_ON_NULL_RETURN(overlay);
5852 EINA_SAFETY_ON_NULL_RETURN(overlay->wsd);
5853 ELM_MAP_CHECK(ELM_WIDGET_DATA(overlay->wsd)->obj);
5855 if (overlay->type == ELM_MAP_OVERLAY_TYPE_DEFAULT)
5857 Overlay_Default *ovl = overlay->ovl;
5862 else if (overlay->type == ELM_MAP_OVERLAY_TYPE_BUBBLE)
5864 Overlay_Bubble *ovl = overlay->ovl;
5870 else ERR("Not supported overlay type: %d", overlay->type);
5872 if (!strcmp(overlay->wsd->engine->name, INTERNAL_ENGINE_NAME))
5873 evas_object_smart_changed(overlay->wsd->pan_obj);
5874 else _overlay_place(overlay->wsd);
5883 elm_map_overlay_region_get(const Elm_Map_Overlay *overlay,
5887 #ifdef HAVE_ELEMENTARY_ECORE_CON
5888 EINA_SAFETY_ON_NULL_RETURN(overlay);
5889 EINA_SAFETY_ON_NULL_RETURN(overlay->wsd);
5890 ELM_MAP_CHECK(ELM_WIDGET_DATA(overlay->wsd)->obj);
5892 if (overlay->type == ELM_MAP_OVERLAY_TYPE_GROUP)
5894 Overlay_Group *ovl = overlay->ovl;
5896 if (lon) *lon = ovl->lon;
5897 if (lat) *lat = ovl->lat;
5899 else if (overlay->type == ELM_MAP_OVERLAY_TYPE_DEFAULT)
5901 const Overlay_Default *ovl = overlay->ovl;
5903 if (lon) *lon = ovl->lon;
5904 if (lat) *lat = ovl->lat;
5906 else if (overlay->type == ELM_MAP_OVERLAY_TYPE_BUBBLE)
5908 const Overlay_Bubble *ovl = overlay->ovl;
5910 if (lon) *lon = ovl->lon;
5911 if (lat) *lat = ovl->lat;
5913 else ERR("Not supported overlay type: %d", overlay->type);
5922 elm_map_overlay_icon_set(Elm_Map_Overlay *overlay,
5925 #ifdef HAVE_ELEMENTARY_ECORE_CON
5926 EINA_SAFETY_ON_NULL_RETURN(overlay);
5927 EINA_SAFETY_ON_NULL_RETURN(icon);
5928 EINA_SAFETY_ON_NULL_RETURN(overlay->wsd);
5929 ELM_MAP_CHECK(ELM_WIDGET_DATA(overlay->wsd)->obj);
5931 if (overlay->type == ELM_MAP_OVERLAY_TYPE_DEFAULT)
5932 _overlay_default_icon_update(overlay->ovl, icon);
5933 else if (overlay->type == ELM_MAP_OVERLAY_TYPE_CLASS)
5934 _overlay_class_icon_update(overlay->ovl, icon);
5935 else ERR("Not supported overlay type: %d", overlay->type);
5937 evas_object_smart_changed(overlay->wsd->pan_obj);
5944 EAPI const Evas_Object *
5945 elm_map_overlay_icon_get(const Elm_Map_Overlay *overlay)
5947 #ifdef HAVE_ELEMENTARY_ECORE_CON
5948 EINA_SAFETY_ON_NULL_RETURN_VAL(overlay, NULL);
5949 EINA_SAFETY_ON_NULL_RETURN_VAL(overlay->wsd, NULL);
5950 ELM_MAP_CHECK(ELM_WIDGET_DATA(overlay->wsd)->obj) NULL;
5952 if (overlay->type == ELM_MAP_OVERLAY_TYPE_DEFAULT)
5954 const Overlay_Default *ovl = overlay->ovl;
5958 else if (overlay->type == ELM_MAP_OVERLAY_TYPE_CLASS)
5960 const Overlay_Class *ovl = overlay->ovl;
5966 ERR("Not supported overlay type: %d", overlay->type);
5976 elm_map_overlay_content_set(Elm_Map_Overlay *overlay,
5977 Evas_Object *content)
5979 #ifdef HAVE_ELEMENTARY_ECORE_CON
5980 EINA_SAFETY_ON_NULL_RETURN(overlay);
5981 EINA_SAFETY_ON_NULL_RETURN(content);
5982 EINA_SAFETY_ON_NULL_RETURN(overlay->wsd);
5983 ELM_MAP_CHECK(ELM_WIDGET_DATA(overlay->wsd)->obj);
5985 if (overlay->type == ELM_MAP_OVERLAY_TYPE_DEFAULT)
5986 _overlay_default_content_update(overlay->ovl, content, overlay);
5987 else if (overlay->type == ELM_MAP_OVERLAY_TYPE_CLASS)
5988 _overlay_class_content_update(overlay->ovl, content);
5989 else ERR("Not supported overlay type: %d", overlay->type);
5991 evas_object_smart_changed(overlay->wsd->pan_obj);
5998 EAPI const Evas_Object *
5999 elm_map_overlay_content_get(const Elm_Map_Overlay *overlay)
6001 #ifdef HAVE_ELEMENTARY_ECORE_CON
6002 EINA_SAFETY_ON_NULL_RETURN_VAL(overlay, NULL);
6003 EINA_SAFETY_ON_NULL_RETURN_VAL(overlay->wsd, NULL);
6005 ELM_MAP_CHECK(ELM_WIDGET_DATA(overlay->wsd)->obj) NULL;
6007 if (overlay->type == ELM_MAP_OVERLAY_TYPE_DEFAULT)
6009 const Overlay_Default *ovl = overlay->ovl;
6010 return ovl->content;
6012 else if (overlay->type == ELM_MAP_OVERLAY_TYPE_CLASS)
6014 const Overlay_Class *ovl = overlay->ovl;
6015 return ovl->content;
6019 ERR("Not supported overlay type: %d", overlay->type);
6029 elm_map_overlay_color_set(Elm_Map_Overlay *overlay,
6035 #ifdef HAVE_ELEMENTARY_ECORE_CON
6036 EINA_SAFETY_ON_NULL_RETURN(overlay);
6037 EINA_SAFETY_ON_NULL_RETURN(overlay->wsd);
6038 ELM_MAP_CHECK(ELM_WIDGET_DATA(overlay->wsd)->obj);
6045 if (overlay->type == ELM_MAP_OVERLAY_TYPE_CLASS)
6046 _overlay_class_color_update(overlay->ovl, overlay->c);
6047 else if (overlay->type == ELM_MAP_OVERLAY_TYPE_DEFAULT)
6048 _overlay_default_color_update(overlay->ovl, overlay->c);
6049 else if (overlay->type == ELM_MAP_OVERLAY_TYPE_ROUTE)
6050 _overlay_route_color_update(overlay->ovl, overlay->c);
6053 ERR("Not supported overlay type: %d", overlay->type);
6066 elm_map_overlay_color_get(const Elm_Map_Overlay *overlay,
6072 #ifdef HAVE_ELEMENTARY_ECORE_CON
6073 EINA_SAFETY_ON_NULL_RETURN(overlay);
6074 EINA_SAFETY_ON_NULL_RETURN(overlay->wsd);
6075 ELM_MAP_CHECK(ELM_WIDGET_DATA(overlay->wsd)->obj);
6077 if (overlay->type == ELM_MAP_OVERLAY_TYPE_ROUTE)
6079 if (r) *r = overlay->c.r;
6080 if (g) *g = overlay->c.g;
6081 if (b) *b = overlay->c.b;
6082 if (a) *a = overlay->c.a;
6084 else ERR("Not supported overlay type: %d", overlay->type);
6095 elm_map_overlay_get_cb_set(Elm_Map_Overlay *overlay,
6096 Elm_Map_Overlay_Get_Cb get_cb,
6099 #ifdef HAVE_ELEMENTARY_ECORE_CON
6100 EINA_SAFETY_ON_NULL_RETURN(overlay);
6101 EINA_SAFETY_ON_NULL_RETURN(overlay->wsd);
6102 ELM_MAP_CHECK(ELM_WIDGET_DATA(overlay->wsd)->obj);
6104 overlay->cb = get_cb;
6105 overlay->cb_data = data;
6107 if (overlay->type == ELM_MAP_OVERLAY_TYPE_CLASS)
6108 _overlay_class_cb_set(overlay->ovl, get_cb, data);
6117 elm_map_overlay_del_cb_set(Elm_Map_Overlay *overlay,
6118 Elm_Map_Overlay_Del_Cb del_cb,
6121 #ifdef HAVE_ELEMENTARY_ECORE_CON
6122 EINA_SAFETY_ON_NULL_RETURN(overlay);
6123 EINA_SAFETY_ON_NULL_RETURN(overlay->wsd);
6124 ELM_MAP_CHECK(ELM_WIDGET_DATA(overlay->wsd)->obj);
6126 overlay->del_cb = del_cb;
6127 overlay->del_cb_data = data;
6135 EAPI Elm_Map_Overlay *
6136 elm_map_overlay_class_add(Evas_Object *obj)
6138 #ifdef HAVE_ELEMENTARY_ECORE_CON
6139 Elm_Map_Overlay *overlay;
6141 ELM_MAP_CHECK(obj) NULL;
6142 ELM_MAP_DATA_GET(obj, sd);
6144 overlay = ELM_NEW(Elm_Map_Overlay);
6146 overlay->type = ELM_MAP_OVERLAY_TYPE_CLASS;
6147 overlay->ovl = _overlay_class_new(sd);
6148 overlay->c.r = 0x90;
6149 overlay->c.g = 0xee;
6150 overlay->c.b = 0x90;
6151 overlay->c.a = 0xff;
6152 sd->overlays = eina_list_append(sd->overlays, overlay);
6154 evas_object_smart_changed(sd->pan_obj);
6163 elm_map_overlay_class_append(Elm_Map_Overlay *klass,
6164 Elm_Map_Overlay *overlay)
6166 #ifdef HAVE_ELEMENTARY_ECORE_CON
6167 Overlay_Class *class_ovl;
6169 EINA_SAFETY_ON_NULL_RETURN(klass);
6170 EINA_SAFETY_ON_NULL_RETURN(overlay);
6171 EINA_SAFETY_ON_NULL_RETURN(klass->wsd);
6172 ELM_MAP_CHECK(ELM_WIDGET_DATA(klass->wsd)->obj);
6173 EINA_SAFETY_ON_FALSE_RETURN(klass->type == ELM_MAP_OVERLAY_TYPE_CLASS);
6175 class_ovl = klass->ovl;
6176 if (eina_list_data_find(class_ovl->members, overlay))
6178 ERR("Already added overlay into clas");
6181 class_ovl->members = eina_list_append(class_ovl->members, overlay);
6183 // Update group by class
6184 overlay->grp->klass = klass;
6185 _overlay_group_icon_update(overlay->grp, class_ovl->icon);
6186 _overlay_group_content_update(overlay->grp, class_ovl->content, overlay);
6187 _overlay_group_color_update(overlay->grp, klass->c);
6188 _overlay_group_cb_set(overlay->grp, klass->cb, klass->data);
6189 if (overlay->type == ELM_MAP_OVERLAY_TYPE_DEFAULT)
6191 _overlay_default_class_icon_update(overlay->ovl, class_ovl->icon);
6192 _overlay_default_class_content_update
6193 (overlay->ovl, class_ovl->content);
6196 evas_object_smart_changed(klass->wsd->pan_obj);
6204 elm_map_overlay_class_remove(Elm_Map_Overlay *klass,
6205 Elm_Map_Overlay *overlay)
6207 #ifdef HAVE_ELEMENTARY_ECORE_CON
6210 EINA_SAFETY_ON_NULL_RETURN(klass);
6211 EINA_SAFETY_ON_NULL_RETURN(overlay);
6212 EINA_SAFETY_ON_NULL_RETURN(klass->wsd);
6213 ELM_MAP_CHECK(ELM_WIDGET_DATA(klass->wsd)->obj);
6214 EINA_SAFETY_ON_FALSE_RETURN(klass->type == ELM_MAP_OVERLAY_TYPE_CLASS);
6217 ovl->members = eina_list_remove(ovl->members, overlay);
6219 overlay->grp->klass = NULL;
6220 _overlay_group_icon_update(overlay->grp, NULL);
6221 _overlay_group_content_update(overlay->grp, NULL, NULL);
6222 if (overlay->type == ELM_MAP_OVERLAY_TYPE_DEFAULT)
6224 _overlay_default_class_icon_update(overlay->ovl, NULL);
6225 _overlay_default_class_content_update(overlay->ovl, NULL);
6228 evas_object_smart_changed(klass->wsd->pan_obj);
6236 elm_map_overlay_class_zoom_max_set(Elm_Map_Overlay *klass,
6239 #ifdef HAVE_ELEMENTARY_ECORE_CON
6242 EINA_SAFETY_ON_NULL_RETURN(klass);
6243 EINA_SAFETY_ON_NULL_RETURN(klass->wsd);
6244 ELM_MAP_CHECK(ELM_WIDGET_DATA(klass->wsd)->obj);
6245 EINA_SAFETY_ON_FALSE_RETURN(klass->type == ELM_MAP_OVERLAY_TYPE_CLASS);
6248 if (ovl->zoom_max == !!zoom) return;
6249 ovl->zoom_max = zoom;
6251 evas_object_smart_changed(klass->wsd->pan_obj);
6259 elm_map_overlay_class_zoom_max_get(const Elm_Map_Overlay *klass)
6261 #ifdef HAVE_ELEMENTARY_ECORE_CON
6262 const Overlay_Class *ovl;
6264 EINA_SAFETY_ON_NULL_RETURN_VAL(klass, OVERLAY_CLASS_ZOOM_MAX);
6265 EINA_SAFETY_ON_NULL_RETURN_VAL(klass->wsd, OVERLAY_CLASS_ZOOM_MAX);
6266 ELM_MAP_CHECK(ELM_WIDGET_DATA(klass->wsd)->obj) OVERLAY_CLASS_ZOOM_MAX;
6268 EINA_SAFETY_ON_FALSE_RETURN_VAL
6269 (klass->type == ELM_MAP_OVERLAY_TYPE_CLASS, OVERLAY_CLASS_ZOOM_MAX);
6272 return ovl->zoom_max;
6275 return OVERLAY_CLASS_ZOOM_MAX;
6280 elm_map_overlay_group_members_get(const Elm_Map_Overlay *grp)
6282 #ifdef HAVE_ELEMENTARY_ECORE_CON
6285 EINA_SAFETY_ON_NULL_RETURN_VAL(grp, NULL);
6286 EINA_SAFETY_ON_NULL_RETURN_VAL(grp->wsd, NULL);
6287 ELM_MAP_CHECK(ELM_WIDGET_DATA(grp->wsd)->obj) NULL;
6289 EINA_SAFETY_ON_FALSE_RETURN_VAL
6290 (grp->type == ELM_MAP_OVERLAY_TYPE_GROUP, NULL);
6293 return ovl->members;
6300 EAPI Elm_Map_Overlay *
6301 elm_map_overlay_bubble_add(Evas_Object *obj)
6303 #ifdef HAVE_ELEMENTARY_ECORE_CON
6304 Elm_Map_Overlay *overlay;
6306 ELM_MAP_CHECK(obj) NULL;
6307 ELM_MAP_DATA_GET(obj, sd);
6309 overlay = ELM_NEW(Elm_Map_Overlay);
6311 overlay->type = ELM_MAP_OVERLAY_TYPE_BUBBLE;
6316 overlay->ovl = _overlay_bubble_new(overlay);
6317 overlay->grp = _overlay_group_new(sd);
6318 sd->overlays = eina_list_append(sd->overlays, overlay);
6320 evas_object_smart_changed(sd->pan_obj);
6329 elm_map_overlay_bubble_follow(Elm_Map_Overlay *bubble,
6330 const Elm_Map_Overlay *parent)
6332 #ifdef HAVE_ELEMENTARY_ECORE_CON
6333 Overlay_Bubble *ovl;
6336 EINA_SAFETY_ON_NULL_RETURN(bubble);
6337 EINA_SAFETY_ON_NULL_RETURN(parent);
6338 ELM_MAP_CHECK(ELM_WIDGET_DATA(bubble->wsd)->obj);
6339 EINA_SAFETY_ON_FALSE_RETURN(bubble->type == ELM_MAP_OVERLAY_TYPE_BUBBLE);
6342 pobj = _overlay_obj_get(parent);
6346 evas_object_smart_changed(bubble->wsd->pan_obj);
6354 elm_map_overlay_bubble_content_append(Elm_Map_Overlay *bubble,
6355 Evas_Object *content)
6357 #ifdef HAVE_ELEMENTARY_ECORE_CON
6360 EINA_SAFETY_ON_NULL_RETURN(bubble);
6361 EINA_SAFETY_ON_NULL_RETURN(content);
6362 ELM_MAP_CHECK(ELM_WIDGET_DATA(bubble->wsd)->obj);
6363 EINA_SAFETY_ON_FALSE_RETURN(bubble->type == ELM_MAP_OVERLAY_TYPE_BUBBLE);
6366 elm_box_pack_end(bb->bx, content);
6368 evas_object_smart_changed(bubble->wsd->pan_obj);
6376 elm_map_overlay_bubble_content_clear(Elm_Map_Overlay *bubble)
6378 #ifdef HAVE_ELEMENTARY_ECORE_CON
6381 EINA_SAFETY_ON_NULL_RETURN(bubble);
6382 ELM_MAP_CHECK(ELM_WIDGET_DATA(bubble->wsd)->obj);
6383 EINA_SAFETY_ON_FALSE_RETURN(bubble->type == ELM_MAP_OVERLAY_TYPE_BUBBLE);
6386 elm_box_clear(bb->bx);
6388 evas_object_smart_changed(bubble->wsd->pan_obj);
6394 EAPI Elm_Map_Overlay *
6395 elm_map_overlay_route_add(Evas_Object *obj,
6396 const Elm_Map_Route *route)
6398 #ifdef HAVE_ELEMENTARY_ECORE_CON
6399 Elm_Map_Overlay *overlay;
6401 ELM_MAP_CHECK(obj) NULL;
6402 ELM_MAP_DATA_GET(obj, sd);
6404 EINA_SAFETY_ON_NULL_RETURN_VAL(route, NULL);
6405 EINA_SAFETY_ON_NULL_RETURN_VAL(route->wsd, NULL);
6406 EINA_SAFETY_ON_FALSE_RETURN_VAL
6407 (obj == ELM_WIDGET_DATA(route->wsd)->obj, NULL);
6409 overlay = ELM_NEW(Elm_Map_Overlay);
6411 overlay->type = ELM_MAP_OVERLAY_TYPE_ROUTE;
6412 overlay->c.r = 0xff;
6413 overlay->c.g = 0x00;
6414 overlay->c.b = 0x00;
6415 overlay->c.a = 0xff;
6416 overlay->ovl = _overlay_route_new(sd, route, overlay->c);
6417 overlay->grp = _overlay_group_new(sd);
6418 sd->overlays = eina_list_append(sd->overlays, overlay);
6420 evas_object_smart_changed(sd->pan_obj);
6429 EAPI Elm_Map_Overlay *
6430 elm_map_overlay_line_add(Evas_Object *obj,
6436 #ifdef HAVE_ELEMENTARY_ECORE_CON
6437 Elm_Map_Overlay *overlay;
6439 ELM_MAP_CHECK(obj) NULL;
6440 ELM_MAP_DATA_GET(obj, sd);
6442 overlay = ELM_NEW(Elm_Map_Overlay);
6444 overlay->type = ELM_MAP_OVERLAY_TYPE_LINE;
6445 overlay->c.r = 0xff;
6446 overlay->c.g = 0x00;
6447 overlay->c.b = 0x00;
6448 overlay->c.a = 0xff;
6449 overlay->ovl = _overlay_line_new(sd, flon, flat, tlon, tlat, overlay->c);
6450 overlay->grp = _overlay_group_new(sd);
6451 sd->overlays = eina_list_append(sd->overlays, overlay);
6453 evas_object_smart_changed(sd->pan_obj);
6465 EAPI Elm_Map_Overlay *
6466 elm_map_overlay_polygon_add(Evas_Object *obj)
6468 #ifdef HAVE_ELEMENTARY_ECORE_CON
6469 Elm_Map_Overlay *overlay;
6471 ELM_MAP_CHECK(obj) NULL;
6472 ELM_MAP_DATA_GET(obj, sd);
6474 overlay = ELM_NEW(Elm_Map_Overlay);
6476 overlay->type = ELM_MAP_OVERLAY_TYPE_POLYGON;
6477 overlay->c.r = 0xdc;
6478 overlay->c.g = 0x14;
6479 overlay->c.b = 0x3c;
6481 overlay->ovl = _overlay_polygon_new(sd, overlay->c);
6482 overlay->grp = _overlay_group_new(sd);
6483 sd->overlays = eina_list_append(sd->overlays, overlay);
6484 evas_object_smart_changed(sd->pan_obj);
6493 elm_map_overlay_polygon_region_add(Elm_Map_Overlay *overlay,
6497 #ifdef HAVE_ELEMENTARY_ECORE_CON
6498 Overlay_Polygon *ovl;
6501 EINA_SAFETY_ON_NULL_RETURN(overlay);
6502 ELM_MAP_CHECK(ELM_WIDGET_DATA(overlay->wsd)->obj);
6503 EINA_SAFETY_ON_FALSE_RETURN(overlay->type == ELM_MAP_OVERLAY_TYPE_POLYGON);
6506 r = ELM_NEW(Region);
6509 ovl->regions = eina_list_append(ovl->regions, r);
6511 evas_object_smart_changed(ovl->wsd->pan_obj);
6519 EAPI Elm_Map_Overlay *
6520 elm_map_overlay_circle_add(Evas_Object *obj,
6525 #ifdef HAVE_ELEMENTARY_ECORE_CON
6526 Elm_Map_Overlay *overlay;
6528 ELM_MAP_CHECK(obj) NULL;
6529 ELM_MAP_DATA_GET(obj, sd);
6531 overlay = ELM_NEW(Elm_Map_Overlay);
6533 overlay->type = ELM_MAP_OVERLAY_TYPE_CIRCLE;
6534 overlay->c.r = 0xdc;
6535 overlay->c.g = 0x14;
6536 overlay->c.b = 0x3c;
6538 overlay->ovl = _overlay_circle_new(sd, lon, lat, radius, overlay->c);
6539 overlay->grp = _overlay_group_new(sd);
6540 sd->overlays = eina_list_append(sd->overlays, overlay);
6542 evas_object_smart_changed(sd->pan_obj);
6553 EAPI Elm_Map_Overlay *
6554 elm_map_overlay_scale_add(Evas_Object *obj,
6558 #ifdef HAVE_ELEMENTARY_ECORE_CON
6559 Elm_Map_Overlay *overlay;
6561 ELM_MAP_CHECK(obj) NULL;
6562 ELM_MAP_DATA_GET(obj, sd);
6564 overlay = ELM_NEW(Elm_Map_Overlay);
6566 overlay->type = ELM_MAP_OVERLAY_TYPE_SCALE;
6571 overlay->ovl = _overlay_scale_new(sd, x, y, overlay->c);
6572 overlay->grp = _overlay_group_new(sd);
6573 sd->overlays = eina_list_append(sd->overlays, overlay);
6575 evas_object_smart_changed(sd->pan_obj);
6587 elm_map_track_add(Evas_Object *obj,
6590 #ifdef HAVE_ELEMENTARY_ECORE_CON
6591 EMap_Route *emapr = emap;
6594 ELM_MAP_CHECK(obj) NULL;
6595 ELM_MAP_DATA_GET(obj, sd);
6597 route = elm_route_add(obj);
6598 elm_route_emap_set(route, emapr);
6599 sd->track = eina_list_append(sd->track, route);
6610 elm_map_track_remove(Evas_Object *obj,
6613 #ifdef HAVE_ELEMENTARY_ECORE_CON
6615 ELM_MAP_DATA_GET(obj, sd);
6617 sd->track = eina_list_remove(sd->track, route);
6618 evas_object_del(route);
6627 elm_map_track_add(Evas_Object *obj __UNUSED__,
6628 void *emap __UNUSED__)
6634 elm_map_track_remove(Evas_Object *obj __UNUSED__,
6635 Evas_Object *route __UNUSED__)