jpeg pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=32635ad7bdc5410cfa2b57b686846fd7fedcbf43
commit 32635ad7bdc5410cfa2b57b686846fd7fedcbf43 Author: Sungtaek Hong <sth253.h...@samsung.com> Date: Tue Dec 6 14:17:31 2016 +0900 elm_map: add copyright_cb for osm tile source. Summary: - According to Copyright and license in Openstreetmap (https://www.openstreetmap.org/copyright/en) credit has to be in the corner of map. - Add copyright_cb which returns an object to show copyright. Test Plan: 1. Excecute elementary_test->map 2. Right click->source->set any tile source 3. Observe copyright is added. Reviewers: cedric, Hermet, jpeg Subscribers: conr2d Differential Revision: https://phab.enlightenment.org/D4449 --- src/lib/elementary/elm_map.c | 64 +++++++++++++++++++++++++++++++---- src/lib/elementary/elm_widget_map.h | 3 ++ src/modules/elementary/test_map/mod.c | 6 ++++ 3 files changed, 67 insertions(+), 6 deletions(-) diff --git a/src/lib/elementary/elm_map.c b/src/lib/elementary/elm_map.c index 1f88385..647ea0e 100644 --- a/src/lib/elementary/elm_map.c +++ b/src/lib/elementary/elm_map.c @@ -264,14 +264,27 @@ _scale_cb(const Evas_Object *obj EINA_UNUSED, return _osm_scale_meter[zoom] * cos(lat * ELM_PI / 180.0); } +static Evas_Object * +_osm_copyright_cb(Evas_Object *obj) +{ + Evas_Object *label; + + label = elm_label_add(obj); + elm_object_text_set(label, "<color=#000000FF><backing=on><backing_color=#FCFCFBFF><shadow_color=#00000000>" + "openstreetmap.org opendatacommons.org creativecommons.org" + "</shadow_color></backing_color></backing></color>"); + + return label; +} + static const Source_Tile src_tiles[] = { - {"Mapnik", 0, 18, _mapnik_url_cb, NULL, NULL, _scale_cb}, - {"Osmarender", 0, 17, _osmarender_url_cb, NULL, NULL, _scale_cb}, - {"CycleMap", 0, 16, _cyclemap_url_cb, NULL, NULL, _scale_cb}, - {"MapQuest", 0, 18, _mapquest_url_cb, NULL, NULL, _scale_cb}, + {"Mapnik", 0, 18, _mapnik_url_cb, NULL, NULL, _scale_cb, _osm_copyright_cb}, + {"Osmarender", 0, 17, _osmarender_url_cb, NULL, NULL, _scale_cb, _osm_copyright_cb}, + {"CycleMap", 0, 16, _cyclemap_url_cb, NULL, NULL, _scale_cb, _osm_copyright_cb}, + {"MapQuest", 0, 18, _mapquest_url_cb, NULL, NULL, _scale_cb, _osm_copyright_cb}, {"MapQuest Open Aerial", 0, 11, _mapquest_aerial_url_cb, NULL, NULL, - _scale_cb} + _scale_cb, _osm_copyright_cb} }; static void _kml_parse(Elm_Map_Route *r); @@ -2651,6 +2664,18 @@ _overlay_show(Elm_Map_Overlay *overlay) } static void +_copyright_place(Elm_Map_Data *sd) +{ + Evas_Coord w, h; + Evas_Coord vw, vx, vy, vh; + + _viewport_coord_get(sd, &vx, &vy, &vw, &vh); + _coord_to_canvas_no_rotation(sd, vx, vy, &vx, &vy); + evas_object_size_hint_min_get(sd->copyright, &w, &h); + _obj_place(sd->copyright, vx + vw - w, vy + vh - h, w, h); +} + +static void _overlay_place(Elm_Map_Data *sd) { Eina_List *l, *ll; @@ -3406,6 +3431,17 @@ _source_tile_set(Elm_Map_Data *sd, if (sd->src_tile->zoom_min > sd->zoom_min) sd->zoom_min = sd->src_tile->zoom_min; + ELM_SAFE_FREE(sd->copyright, evas_object_del); + if (sd->src_tile->copyright_cb) + { + sd->copyright = sd->src_tile->copyright_cb(sd->obj); + if (sd->copyright) + { + evas_object_smart_member_add(sd->copyright, sd->pan_obj); + evas_object_stack_above(sd->copyright, sd->sep_maps_overlays); + } + } + _grid_all_clear(sd); _grid_all_create(sd); _zoom_do(sd, sd->zoom); @@ -3477,6 +3513,7 @@ _source_mod_cb(Eina_Module *m, Elm_Map_Module_Source_Name_Func name_cb; Elm_Map_Module_Tile_Url_Func tile_url_cb; Elm_Map_Module_Tile_Scale_Func scale_cb; + Elm_Map_Module_Tile_Copyright_Func copyright_cb; Elm_Map_Module_Tile_Zoom_Min_Func zoom_min; Elm_Map_Module_Tile_Zoom_Max_Func zoom_max; Elm_Map_Module_Tile_Geo_to_Coord_Func geo_to_coord; @@ -3503,7 +3540,6 @@ _source_mod_cb(Eina_Module *m, return EINA_FALSE; } free(dir); - if (!eina_module_load(m)) return EINA_FALSE; name_cb = eina_module_symbol_get(m, "map_module_source_name_get"); @@ -3520,6 +3556,7 @@ _source_mod_cb(Eina_Module *m, geo_to_coord = eina_module_symbol_get(m, "map_module_tile_geo_to_coord"); coord_to_geo = eina_module_symbol_get(m, "map_module_tile_coord_to_geo"); scale_cb = eina_module_symbol_get(m, "map_module_tile_scale_get"); + copyright_cb = eina_module_symbol_get(m, "map_module_tile_copyright_get"); if (tile_url_cb && zoom_min && zoom_max && geo_to_coord && coord_to_geo && scale_cb) { @@ -3533,6 +3570,7 @@ _source_mod_cb(Eina_Module *m, s->geo_to_coord = geo_to_coord; s->coord_to_geo = coord_to_geo; s->scale_cb = scale_cb; + s->copyright_cb = copyright_cb; sd->src_tiles = eina_list_append(sd->src_tiles, s); } @@ -3629,6 +3667,7 @@ _source_all_load(Elm_Map_Data *sd) src_tile->geo_to_coord = src_tiles[idx].geo_to_coord; src_tile->coord_to_geo = src_tiles[idx].coord_to_geo; src_tile->scale_cb = src_tiles[idx].scale_cb; + src_tile->copyright_cb = src_tiles[idx].copyright_cb; sd->src_tiles = eina_list_append(sd->src_tiles, src_tile); } // Load hard coded ROUTE source @@ -3885,6 +3924,8 @@ _elm_map_pan_efl_canvas_group_group_calculate(Eo *obj, Elm_Map_Pan_Data *psd) if (w <= 0 || h <= 0) return; _grid_place(psd->wsd); + if (psd->wsd->copyright) + _copyright_place(psd->wsd); _overlay_place(psd->wsd); _track_place(psd->wsd); _calc_job(psd->wsd); @@ -4150,6 +4191,16 @@ _elm_map_efl_canvas_group_group_add(Eo *obj, Elm_Map_Data *priv) if (!ecore_file_download_protocol_available("http://")) ERR("Ecore must be built with curl support for the map widget!"); + + if (priv->src_tile->copyright_cb) + { + priv->copyright = priv->src_tile->copyright_cb(obj); + if (priv->copyright) + { + evas_object_smart_member_add(priv->copyright, priv->pan_obj); + evas_object_stack_above(priv->copyright, priv->sep_maps_overlays); + } + } } EOLIAN static void @@ -4209,6 +4260,7 @@ _elm_map_efl_canvas_group_group_del(Eo *obj, Elm_Map_Data *sd) evas_object_del(sd->pan_obj); sd->pan_obj = NULL; + ELM_SAFE_FREE(sd->copyright, evas_object_del); efl_canvas_group_del(efl_super(obj, MY_CLASS)); } diff --git a/src/lib/elementary/elm_widget_map.h b/src/lib/elementary/elm_widget_map.h index 4e2da1b..56ebf2c 100644 --- a/src/lib/elementary/elm_widget_map.h +++ b/src/lib/elementary/elm_widget_map.h @@ -51,6 +51,7 @@ typedef double (*Elm_Map_Module_Tile_Scale_Func)(const Evas_Object *, double, double, int); +typedef Evas_Object *(*Elm_Map_Module_Tile_Copyright_Func)(Evas_Object *); typedef char *(*Elm_Map_Module_Route_Url_Func)(const Evas_Object *, const char *, int, @@ -79,6 +80,7 @@ struct _Source_Tile Elm_Map_Module_Tile_Geo_to_Coord_Func geo_to_coord; Elm_Map_Module_Tile_Coord_to_Geo_Func coord_to_geo; Elm_Map_Module_Tile_Scale_Func scale_cb; + Elm_Map_Module_Tile_Copyright_Func copyright_cb; }; typedef struct _Source_Route Source_Route; @@ -490,6 +492,7 @@ struct _Elm_Map_Data Eina_Bool zoom_animator : 1; Calc_Job calc_job; + Evas_Object *copyright; }; typedef struct _Elm_Map_Pan_Data Elm_Map_Pan_Data; diff --git a/src/modules/elementary/test_map/mod.c b/src/modules/elementary/test_map/mod.c index df300f7..9dfc352 100644 --- a/src/modules/elementary/test_map/mod.c +++ b/src/modules/elementary/test_map/mod.c @@ -87,6 +87,12 @@ map_module_tile_scale_get(const Evas_Object *obj EINA_UNUSED, double lon EINA_UN return 0; } +EAPI Evas_Object * +map_module_tile_copyright_get(Evas_Object *obj EINA_UNUSED) +{ + return NULL; +} + static Eina_Bool _module_init(void) { --