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

-- 


Reply via email to