7557f2028f02a1e2ec8439310f950481b1e19de1
[framework/uifw/elementary.git] / src / examples / map_example_02.c
1 /**
2  * Simple Elementary's <b>map widget</b> example, illustrating markers
3  * usage.
4  *
5  * See stdout/stderr for output. Compile with:
6  *
7  * @verbatim
8  * gcc -g `pkg-config --cflags --libs elementary` map_example_02.c -o map_example_02
9  * @endverbatim
10  */
11
12 #include <Elementary.h>
13 #ifdef HAVE_CONFIG_H
14 # include "elementary_config.h"
15 #else
16 # define __UNUSED__
17 #endif
18
19 typedef struct _Marker_Data
20 {
21    const char *name;
22    const char *file;
23 } Marker_Data;
24
25 Marker_Data data_argentina = {"Argentina",
26      PACKAGE_DATA_DIR"/images/rock_01.jpg"};
27 Marker_Data data_chile = {"Chile",
28      PACKAGE_DATA_DIR"/images/rock_02.jpg"};
29 Marker_Data data_sampa = {"São Paulo",
30      PACKAGE_DATA_DIR"/images/sky_01.jpg"};
31 Marker_Data data_rio = {"Rio de Janeiro",
32      PACKAGE_DATA_DIR"/images/sky_02.jpg"};
33 Marker_Data data_brasilia = {"Brasília",
34      PACKAGE_DATA_DIR"/images/sky_03.jpg"};
35
36 static Evas_Object *
37 _marker_get(Evas_Object *obj, Elm_Map_Marker *marker __UNUSED__, void *data)
38 {
39    Evas_Object *bx, *im, *lbl;
40    Marker_Data *md = data;
41
42    bx = elm_box_add(obj);
43    evas_object_show(bx);
44
45    im = elm_image_add(obj);
46    elm_image_file_set(im, md->file, NULL);
47    evas_object_size_hint_min_set(im, 64, 64);
48    evas_object_show(im);
49    elm_box_pack_end(bx, im);
50
51    lbl = elm_label_add(obj);
52    elm_object_text_set(lbl, md->name);
53    evas_object_show(lbl);
54    elm_box_pack_end(bx, lbl);
55
56    return bx;
57 }
58
59 static Evas_Object *
60 _marker_city_content_get(Evas_Object *obj, Elm_Map_Marker *marker __UNUSED__, void *data __UNUSED__)
61 {
62    Evas_Object *icon = elm_icon_add(obj);
63    elm_icon_file_set(icon, PACKAGE_DATA_DIR"/images/icon_07.png", NULL);
64    evas_object_show(icon);
65
66    return icon;
67 }
68
69 static Evas_Object *
70 _group_city_content_get(Evas_Object *obj, void *data __UNUSED__)
71 {
72    Evas_Object *icon = elm_icon_add(obj);
73    elm_icon_file_set(icon, PACKAGE_DATA_DIR"/images/icon_05.png", NULL);
74    evas_object_show(icon);
75    return icon;
76 }
77
78 static Evas_Object *
79 _marker_country_content_get(Evas_Object *obj, Elm_Map_Marker *marker __UNUSED__, void *data __UNUSED__)
80 {
81    Evas_Object *icon = elm_icon_add(obj);
82    elm_icon_file_set(icon, PACKAGE_DATA_DIR"/images/icon_06.png", NULL);
83    evas_object_show(icon);
84    return icon;
85 }
86
87 static Evas_Object *
88 _group_country_content_get(Evas_Object *obj, void *data __UNUSED__)
89 {
90    Evas_Object *icon = elm_icon_add(obj);
91    elm_icon_file_set(icon, PACKAGE_DATA_DIR"/images/icon_04.png", NULL);
92    evas_object_show(icon);
93    return icon;
94 }
95
96 static void
97 _map_downloaded(void *data __UNUSED__, Evas_Object *obj, void *ev __UNUSED__)
98 {
99    elm_map_zoom_set(obj, 3);
100    evas_object_smart_callback_del(obj, "downloaded", _map_downloaded);
101 }
102
103 static void
104 _bt_zoom_in(void *data, Evas_Object *obj __UNUSED__, void *ev __UNUSED__)
105 {
106    Evas_Object *map = data;
107    int zoom;
108
109    elm_map_zoom_mode_set(map, ELM_MAP_ZOOM_MODE_MANUAL);
110    zoom = elm_map_zoom_get(map);
111    elm_map_zoom_set(map, zoom + 1);
112 }
113
114 static void
115 _bt_zoom_out(void *data, Evas_Object *obj __UNUSED__, void *ev __UNUSED__)
116 {
117    Evas_Object *map = data;
118    int zoom;
119
120    elm_map_zoom_mode_set(map, ELM_MAP_ZOOM_MODE_MANUAL);
121    zoom = elm_map_zoom_get(map);
122    elm_map_zoom_set(map, zoom - 1);
123 }
124
125 static void
126 _bt_zoom_fit(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
127 {
128    Evas_Object *map = data;
129    elm_map_zoom_mode_set(map, ELM_MAP_ZOOM_MODE_AUTO_FIT);
130 }
131
132 static void
133 _bt_zoom_fill(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
134 {
135    Evas_Object *map = data;
136    elm_map_zoom_mode_set(map, ELM_MAP_ZOOM_MODE_AUTO_FILL);
137 }
138
139 static void
140 _on_done(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
141 {
142    elm_exit();
143 }
144
145 /* FIXME: it shouldn't be required. For unknown reason map won't call
146  * pan_calculate until shot delay time, but then it will take a screenshot
147  * when the map isn't loaded yet (actually it won't be downloaded, because
148  * after the SS it will kill the example). */
149 static Eina_Bool
150 _nasty_hack(void *data)
151 {
152    Evas_Object *o = data;
153    Evas *e = evas_object_evas_get(o);
154    evas_smart_objects_calculate(e);
155    return ECORE_CALLBACK_CANCEL;
156 }
157
158 EAPI_MAIN int
159 elm_main(int argc __UNUSED__, char **argv __UNUSED__)
160 {
161    Evas_Object *win, *bg, *map, *box, *bt;
162    static Elm_Map_Marker_Class *mc_city, *mc_country;
163    static Elm_Map_Group_Class *gc_city, *gc_country;
164    Eina_List *markers = NULL;
165    Elm_Map_Marker *m;
166
167    win = elm_win_add(NULL, "map", ELM_WIN_BASIC);
168    elm_win_title_set(win, "Map Markers Example");
169    evas_object_smart_callback_add(win, "delete,request", _on_done, NULL);
170
171    bg = elm_bg_add(win);
172    elm_win_resize_object_add(win, bg);
173    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
174    evas_object_show(bg);
175
176    map = elm_map_add(win);
177    elm_win_resize_object_add(win, map);
178    evas_object_size_hint_weight_set(map, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
179    evas_object_show(map);
180
181    box = elm_box_add(win);
182    evas_object_show(box);
183
184    bt = elm_button_add(win);
185    elm_object_text_set(bt, "+");
186    elm_box_pack_end(box, bt);
187    evas_object_show(bt);
188    evas_object_smart_callback_add(bt, "clicked", _bt_zoom_in, map);
189
190    bt = elm_button_add(win);
191    elm_object_text_set(bt, "-");
192    elm_box_pack_end(box, bt);
193    evas_object_show(bt);
194    evas_object_smart_callback_add(bt, "clicked", _bt_zoom_out, map);
195
196    bt = elm_button_add(win);
197    elm_object_text_set(bt, "X");
198    elm_box_pack_end(box, bt);
199    evas_object_show(bt);
200    evas_object_smart_callback_add(bt, "clicked", _bt_zoom_fit, map);
201
202    bt = elm_button_add(win);
203    elm_object_text_set(bt, "#");
204    elm_box_pack_end(box, bt);
205    evas_object_show(bt);
206    evas_object_smart_callback_add(bt, "clicked", _bt_zoom_fill, map);
207
208    mc_city = elm_map_marker_class_new(map);
209    elm_map_marker_class_get_cb_set(mc_city, _marker_get);
210    elm_map_marker_class_icon_cb_set(mc_city, _marker_city_content_get);
211    elm_map_marker_class_style_set(mc_city, "radio");
212
213    gc_city = elm_map_group_class_new(map);
214    elm_map_group_class_style_set(gc_city, "radio2");
215    elm_map_group_class_icon_cb_set(gc_city, _group_city_content_get);
216    elm_map_group_class_zoom_displayed_set(gc_city, 3);
217
218    mc_country = elm_map_marker_class_new(map);
219    elm_map_marker_class_get_cb_set(mc_country, _marker_get);
220    elm_map_marker_class_icon_cb_set(mc_country, _marker_country_content_get);
221    elm_map_marker_class_style_set(mc_country, "empty");
222
223    gc_country = elm_map_group_class_new(map);
224    elm_map_group_class_style_set(gc_country, "empty");
225    elm_map_group_class_icon_cb_set(gc_country, _group_country_content_get);
226    elm_map_group_class_zoom_displayed_set(gc_country, 1);
227
228    m = elm_map_marker_add(map, -43.2, -22.9, mc_city, gc_city, &data_rio);
229    markers = eina_list_append(markers, m);
230    m = elm_map_marker_add(map, -46.63, -23.55, mc_city, gc_city, &data_sampa);
231    markers = eina_list_append(markers, m);
232    m = elm_map_marker_add(map, -47.88, -15.78, mc_city, gc_city,
233                           &data_brasilia);
234    markers = eina_list_append(markers, m);
235
236    m = elm_map_marker_add(map, -65.23, -35.1, mc_country, gc_country,
237                       &data_argentina);
238    markers = eina_list_append(markers, m);
239    m = elm_map_marker_add(map, -71.3, -31.75, mc_country, gc_country,
240                       &data_chile);
241    markers = eina_list_append(markers, m);
242
243    elm_map_markers_list_show(markers);
244    evas_object_smart_callback_add(map, "downloaded", _map_downloaded, NULL);
245
246    evas_object_resize(win, 512, 512);
247    evas_object_show(win);
248
249    ecore_timer_add(1, _nasty_hack, win);
250
251    elm_run();
252    return 0;
253 }
254 ELM_MAIN()