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
This commit is contained in:
Sungtaek Hong 2016-12-06 14:17:31 +09:00 committed by Jean-Philippe Andre
parent 6262cbfb62
commit 32635ad7bd
3 changed files with 67 additions and 6 deletions

View File

@ -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);
@ -2650,6 +2663,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)
{
@ -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));
}

View File

@ -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;

View File

@ -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)
{