808f7295a2ce653af055f64ceffd2ae5723a3d83
[framework/uifw/elementary.git] / src / examples / map_example_02.c
1 /**
2  * Simple Elementary's <b>map widget</b> example, illustrating overlays
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
14 typedef struct _Overlay_Data
15 {
16    const char *name;
17    const char *file;
18 } Overlay_Data;
19
20 Overlay_Data data_argentina = {"Argentina",
21      PACKAGE_DATA_DIR"/images/rock_01.jpg"};
22 Overlay_Data data_chile = {"Chile",
23      PACKAGE_DATA_DIR"/images/rock_02.jpg"};
24 Overlay_Data data_sampa = {"São Paulo",
25      PACKAGE_DATA_DIR"/images/sky_01.jpg"};
26 Overlay_Data data_rio = {"Rio de Janeiro",
27      PACKAGE_DATA_DIR"/images/sky_02.jpg"};
28 Overlay_Data data_brasilia = {"Brasília",
29      PACKAGE_DATA_DIR"/images/sky_03.jpg"};
30
31 static Elm_Map_Overlay *bubble;
32
33 static Evas_Object *
34 _icon_get(Evas_Object *obj, const char *file)
35 {
36    Evas_Object *icon = elm_icon_add(obj);
37    elm_icon_file_set(icon, file, NULL);
38    evas_object_show(icon);
39    return icon;
40 }
41
42 static Evas_Object *
43 _city_icon_get(Evas_Object *obj)
44 {
45    return _icon_get(obj, PACKAGE_DATA_DIR"/images/icon_07.png");
46 }
47
48 static Evas_Object *
49 _clas_city_icon_get(Evas_Object *obj)
50 {
51    return _icon_get(obj, PACKAGE_DATA_DIR"/images/icon_05.png");
52 }
53
54 static Evas_Object *
55 _country_icon_get(Evas_Object *obj)
56 {
57    return _icon_get(obj, PACKAGE_DATA_DIR"/images/icon_06.png");
58 }
59
60 static Evas_Object *
61 _clas_country_icon_get(Evas_Object *obj)
62 {
63    return _icon_get(obj, PACKAGE_DATA_DIR"/images/icon_04.png");
64 }
65
66 static Evas_Object *
67 _box_get(Evas_Object *obj, Overlay_Data *data)
68 {
69    Evas_Object *bx, *img, *label;
70    bx = elm_box_add(obj);
71    evas_object_show(bx);
72
73    img = evas_object_image_add(evas_object_evas_get(obj));
74    evas_object_image_file_set(img, data->file, NULL);
75    evas_object_image_filled_set(img, EINA_TRUE);
76    evas_object_size_hint_min_set(img, 64, 64);
77    evas_object_show(img);
78    elm_box_pack_end(bx, img);
79
80    label = elm_label_add(obj);
81    elm_object_text_set(label, data->name);
82    evas_object_show(label);
83    elm_box_pack_end(bx, label);
84    return bx;
85 }
86
87 static void
88 _overlay_cb(void *data, Evas_Object *map, void *ev)
89 {
90    printf("Overlay clicked\n");
91    Elm_Map_Overlay *overlay = ev;
92    Evas_Object *bx;
93
94    // prevent duplication
95    if (!bubble)  bubble = elm_map_overlay_bubble_add(map);
96
97    elm_map_overlay_bubble_follow(bubble, overlay);
98    elm_map_overlay_bubble_content_clear(bubble);
99    bx = _box_get(map, elm_map_overlay_data_get(overlay));
100    elm_map_overlay_bubble_content_append(bubble, bx);
101 }
102
103 static void
104 _bt_zoom_in(void *data, Evas_Object *obj, void *ev)
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, void *ev)
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, void *event_info)
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, void *event_info)
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, Evas_Object *obj, void *event_info)
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, char **argv)
160 {
161    Evas_Object *win, *bg, *map, *box, *bt;
162    Eina_List *ovls = NULL;
163    Elm_Map_Overlay *ovl, *city_clas, *country_clas;
164
165    win = elm_win_add(NULL, "map", ELM_WIN_BASIC);
166    elm_win_title_set(win, "Map Overlay Example");
167    evas_object_smart_callback_add(win, "delete,request", _on_done, NULL);
168
169    bg = elm_bg_add(win);
170    elm_win_resize_object_add(win, bg);
171    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
172    evas_object_show(bg);
173
174    map = elm_map_add(win);
175    elm_win_resize_object_add(win, map);
176    evas_object_size_hint_weight_set(map, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
177    evas_object_show(map);
178
179    box = elm_box_add(win);
180    evas_object_show(box);
181
182    bt = elm_button_add(win);
183    elm_object_text_set(bt, "+");
184    elm_box_pack_end(box, bt);
185    evas_object_show(bt);
186    evas_object_smart_callback_add(bt, "clicked", _bt_zoom_in, map);
187
188    bt = elm_button_add(win);
189    elm_object_text_set(bt, "-");
190    elm_box_pack_end(box, bt);
191    evas_object_show(bt);
192    evas_object_smart_callback_add(bt, "clicked", _bt_zoom_out, map);
193
194    bt = elm_button_add(win);
195    elm_object_text_set(bt, "X");
196    elm_box_pack_end(box, bt);
197    evas_object_show(bt);
198    evas_object_smart_callback_add(bt, "clicked", _bt_zoom_fit, map);
199
200    bt = elm_button_add(win);
201    elm_object_text_set(bt, "#");
202    elm_box_pack_end(box, bt);
203    evas_object_show(bt);
204    evas_object_smart_callback_add(bt, "clicked", _bt_zoom_fill, map);
205
206    evas_object_smart_callback_add(map, "overlay,clicked", _overlay_cb, NULL);
207
208    city_clas = elm_map_overlay_class_add(map);
209    elm_map_overlay_displayed_zoom_min_set(city_clas, 3);
210    elm_map_overlay_icon_set(city_clas, _clas_city_icon_get(map));
211
212    country_clas = elm_map_overlay_class_add(map);
213    elm_map_overlay_displayed_zoom_min_set(country_clas, 1);
214    elm_map_overlay_icon_set(country_clas, _clas_country_icon_get(map));
215
216    ovl = elm_map_overlay_add(map, -43.2, -22.9);
217    elm_map_overlay_icon_set(ovl, _city_icon_get(map));
218    elm_map_overlay_data_set(ovl, &data_rio);
219    elm_map_overlay_class_append(city_clas, ovl);
220    ovls = eina_list_append(ovls, ovl);
221
222    ovl = elm_map_overlay_add(map, -46.63, -23.55);
223    elm_map_overlay_icon_set(ovl, _city_icon_get(map));
224    elm_map_overlay_data_set(ovl, &data_sampa);
225    elm_map_overlay_class_append(city_clas, ovl);
226    ovls = eina_list_append(ovls, ovl);
227
228    ovl = elm_map_overlay_add(map, -47.88, -15.78);
229    elm_map_overlay_icon_set(ovl, _city_icon_get(map));
230    elm_map_overlay_data_set(ovl, &data_brasilia);
231    elm_map_overlay_class_append(city_clas, ovl);
232    ovls = eina_list_append(ovls, ovl);
233
234    ovl = elm_map_overlay_add(map, -65.23, -35.1);
235    elm_map_overlay_icon_set(ovl, _country_icon_get(map));
236    elm_map_overlay_data_set(ovl, &data_argentina);
237    elm_map_overlay_class_append(country_clas, ovl);
238    ovls = eina_list_append(ovls, ovl);
239
240    ovl = elm_map_overlay_add(map, -71.3, -31.75);
241    elm_map_overlay_icon_set(ovl, _country_icon_get(map));
242    elm_map_overlay_data_set(ovl, &data_chile);
243    elm_map_overlay_class_append(country_clas, ovl);
244    ovls = eina_list_append(ovls, ovl);
245
246    elm_map_overlays_show(ovls);
247
248    evas_object_resize(win, 512, 512);
249    evas_object_show(win);
250
251    ecore_timer_add(1, _nasty_hack, win);
252
253    elm_run();
254    elm_shutdown();
255
256    return 0;
257 }
258 ELM_MAIN()