11c0ece7fbaeed93d6ac7a0d29cb36087e03ebe9
[framework/uifw/elementary.git] / elm_map.c
1 #include <assert.h>
2
3 #include "private.h"
4
5 typedef struct _Elm_Params_Map
6 {
7    Elm_Params base;
8    const char *map_source;
9    const char *zoom_mode;
10    double zoom;
11    Eina_Bool zoom_set:1;
12 } Elm_Params_Map;
13
14 static const char *zoom_choices[] = {"manual",  "auto fit", "auto fill", NULL};
15
16 static const char *source_choices[] =
17   {"Mapnik", "Osmarender", "CycleMap", "Maplint"};
18
19 static Elm_Map_Zoom_Mode
20 _zoom_mode_get(const char *map_src)
21 {
22    unsigned int i;
23
24    assert(sizeof(zoom_choices)/sizeof(zoom_choices[0]) ==
25           ELM_MAP_ZOOM_MODE_LAST + 1);
26
27    for (i = 0; i < ELM_MAP_ZOOM_MODE_LAST; i++)
28      if (!strcmp(map_src, zoom_choices[i])) return i;
29
30    return ELM_MAP_ZOOM_MODE_LAST;
31 }
32
33 static void
34 external_map_state_set(void *data __UNUSED__, Evas_Object *obj, const void *from_params, const void *to_params, float pos __UNUSED__)
35 {
36    const Elm_Params_Map *p;
37
38    if (to_params) p = to_params;
39    else if (from_params) p = from_params;
40    else return;
41
42    if (p->map_source)
43      {
44             elm_map_source_set(obj, ELM_MAP_SOURCE_TYPE_TILE, p->map_source);
45      }
46    if (p->zoom_mode)
47      {
48             Elm_Map_Zoom_Mode set = _zoom_mode_get(p->zoom_mode);
49             if (set == ELM_MAP_ZOOM_MODE_LAST) return;
50             elm_map_zoom_mode_set(obj, set);
51      }
52    if (p->zoom_set) elm_map_zoom_set(obj, p->zoom);
53 }
54
55 static Eina_Bool
56 external_map_param_set(void *data __UNUSED__, Evas_Object *obj, const Edje_External_Param *param)
57 {
58    if (!strcmp(param->name, "map source"))
59      {
60         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_CHOICE)
61           {
62              elm_map_source_set(obj, ELM_MAP_SOURCE_TYPE_TILE, param->s);
63              return EINA_TRUE;
64           }
65      }
66    else if (!strcmp(param->name, "zoom mode"))
67      {
68         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_CHOICE)
69           {
70              Elm_Map_Zoom_Mode set = _zoom_mode_get(param->s);
71              if (set == ELM_MAP_ZOOM_MODE_LAST) return EINA_FALSE;
72              elm_map_zoom_mode_set(obj, set);
73              return EINA_TRUE;
74           }
75      }
76    else if (!strcmp(param->name, "zoom level"))
77      {
78         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_DOUBLE)
79           {
80              elm_map_zoom_set(obj, param->d);
81              return EINA_TRUE;
82           }
83      }
84
85    ERR("unknown parameter '%s' of type '%s'",
86        param->name, edje_external_param_type_str(param->type));
87
88    return EINA_FALSE;
89 }
90
91 static Eina_Bool
92 external_map_param_get(void *data __UNUSED__, const Evas_Object *obj, Edje_External_Param *param)
93 {
94    if (!strcmp(param->name, "map source"))
95      {
96         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_CHOICE)
97           {
98              const char *set = elm_map_source_get(obj, ELM_MAP_SOURCE_TYPE_TILE);
99              param->s = set;
100              return EINA_TRUE;
101           }
102      }
103    else if (!strcmp(param->name, "zoom mode"))
104      {
105         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_CHOICE)
106           {
107              Elm_Map_Zoom_Mode set = elm_map_zoom_mode_get(obj);
108              if (set == ELM_MAP_ZOOM_MODE_LAST) return EINA_FALSE;
109              param->s = zoom_choices[set];
110              return EINA_TRUE;
111           }
112      }
113    else if (!strcmp(param->name, "zoom level"))
114      {
115         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_DOUBLE)
116           {
117              param->d = elm_map_zoom_get(obj);
118              return EINA_TRUE;
119           }
120      }
121
122    ERR("unknown parameter '%s' of type '%s'",
123        param->name, edje_external_param_type_str(param->type));
124
125    return EINA_FALSE;
126 }
127
128 static void *
129 external_map_params_parse(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const Eina_List *params)
130 {
131    Elm_Params_Map *mem;
132    Edje_External_Param *param;
133    const Eina_List *l;
134
135    mem = calloc(1, sizeof(Elm_Params_Map));
136    if (!mem)
137      return NULL;
138
139    EINA_LIST_FOREACH(params, l, param)
140      {
141         if (!strcmp(param->name, "map source"))
142           mem->map_source = eina_stringshare_add(param->s);
143         if (!strcmp(param->name, "zoom mode"))
144           mem->zoom_mode = eina_stringshare_add(param->s);
145         else if (!strcmp(param->name, "zoom level"))
146           {
147              mem->zoom = param->d;
148              mem->zoom_set = EINA_TRUE;
149           }
150      }
151
152    return mem;
153 }
154
155 static Evas_Object *external_map_content_get(void *data __UNUSED__,
156                 const Evas_Object *obj __UNUSED__, const char *content __UNUSED__)
157 {
158         ERR("No content.");
159         return NULL;
160 }
161
162 static void
163 external_map_params_free(void *params)
164 {
165    Elm_Params_Map *mem = params;
166
167    if (mem->map_source)
168      eina_stringshare_del(mem->map_source);
169    if (mem->zoom_mode)
170      eina_stringshare_del(mem->zoom_mode);
171    free(mem);
172 }
173
174 static Edje_External_Param_Info external_map_params[] =
175   {
176     DEFINE_EXTERNAL_COMMON_PARAMS,
177     EDJE_EXTERNAL_PARAM_INFO_CHOICE_FULL("map source", "Mapnik", source_choices),
178     EDJE_EXTERNAL_PARAM_INFO_CHOICE_FULL("zoom mode", "manual", zoom_choices),
179     EDJE_EXTERNAL_PARAM_INFO_DOUBLE("zoom level"),
180     EDJE_EXTERNAL_PARAM_INFO_SENTINEL
181   };
182
183 DEFINE_EXTERNAL_ICON_ADD(map, "map")
184 DEFINE_EXTERNAL_TYPE_SIMPLE(map, "Map")
185