Fixes compilation instructions of examples to work on ubuntu.
[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 map_example_02.c -o map_example_02 `pkg-config --cflags --libs elementary`
9  * @endverbatim
10  */
11
12 #include <Elementary.h>
13 #ifndef DATA_DIR
14 # define DATA_DIR "/usr/share/elementary"
15 #endif
16
17 typedef struct _Overlay_Data
18 {
19    const char *name;
20    const char *file;
21 } Overlay_Data;
22
23 Overlay_Data data_argentina = {"Argentina",
24      DATA_DIR"/images/rock_01.jpg"};
25 Overlay_Data data_chile = {"Chile",
26      DATA_DIR"/images/rock_02.jpg"};
27 Overlay_Data data_sampa = {"São Paulo",
28      DATA_DIR"/images/sky_01.jpg"};
29 Overlay_Data data_rio = {"Rio de Janeiro",
30      DATA_DIR"/images/sky_02.jpg"};
31 Overlay_Data data_brasilia = {"Brasília",
32      DATA_DIR"/images/sky_03.jpg"};
33
34 static Elm_Map_Overlay *bubble;
35
36 static Evas_Object *
37 _icon_get(Evas_Object *obj, const char *file)
38 {
39    Evas_Object *icon = elm_icon_add(obj);
40    elm_icon_file_set(icon, file, NULL);
41    evas_object_show(icon);
42    return icon;
43 }
44
45 static Evas_Object *
46 _city_icon_get(Evas_Object *obj)
47 {
48    return _icon_get(obj, DATA_DIR"/images/icon_07.png");
49 }
50
51 static Evas_Object *
52 _clas_city_icon_get(Evas_Object *obj)
53 {
54    return _icon_get(obj, DATA_DIR"/images/icon_05.png");
55 }
56
57 static Evas_Object *
58 _country_icon_get(Evas_Object *obj)
59 {
60    return _icon_get(obj, DATA_DIR"/images/icon_06.png");
61 }
62
63 static Evas_Object *
64 _clas_country_icon_get(Evas_Object *obj)
65 {
66    return _icon_get(obj, DATA_DIR"/images/icon_04.png");
67 }
68
69 static Evas_Object *
70 _box_get(Evas_Object *obj, Overlay_Data *data)
71 {
72    Evas_Object *bx, *img, *label;
73    bx = elm_box_add(obj);
74    evas_object_show(bx);
75
76    img = evas_object_image_add(evas_object_evas_get(obj));
77    evas_object_image_file_set(img, data->file, NULL);
78    evas_object_image_filled_set(img, EINA_TRUE);
79    evas_object_size_hint_min_set(img, 64, 64);
80    evas_object_show(img);
81    elm_box_pack_end(bx, img);
82
83    label = elm_label_add(obj);
84    elm_object_text_set(label, data->name);
85    evas_object_show(label);
86    elm_box_pack_end(bx, label);
87    return bx;
88 }
89
90 static void
91 _overlay_cb(void *data, Evas_Object *map, void *ev)
92 {
93    printf("Overlay clicked\n");
94    Elm_Map_Overlay *overlay = ev;
95    Evas_Object *bx;
96
97    // prevent duplication
98    if (!bubble)  bubble = elm_map_overlay_bubble_add(map);
99
100    elm_map_overlay_bubble_follow(bubble, overlay);
101    elm_map_overlay_bubble_content_clear(bubble);
102    bx = _box_get(map, elm_map_overlay_data_get(overlay));
103    elm_map_overlay_bubble_content_append(bubble, bx);
104 }
105
106 static void
107 _bt_zoom_in(void *data, Evas_Object *obj, void *ev)
108 {
109    Evas_Object *map = data;
110    int zoom;
111
112    elm_map_zoom_mode_set(map, ELM_MAP_ZOOM_MODE_MANUAL);
113    zoom = elm_map_zoom_get(map);
114    elm_map_zoom_set(map, zoom + 1);
115 }
116
117 static void
118 _bt_zoom_out(void *data, Evas_Object *obj, void *ev)
119 {
120    Evas_Object *map = data;
121    int zoom;
122
123    elm_map_zoom_mode_set(map, ELM_MAP_ZOOM_MODE_MANUAL);
124    zoom = elm_map_zoom_get(map);
125    elm_map_zoom_set(map, zoom - 1);
126 }
127
128 static void
129 _bt_zoom_fit(void *data, Evas_Object *obj, void *event_info)
130 {
131    Evas_Object *map = data;
132    elm_map_zoom_mode_set(map, ELM_MAP_ZOOM_MODE_AUTO_FIT);
133 }
134
135 static void
136 _bt_zoom_fill(void *data, Evas_Object *obj, void *event_info)
137 {
138    Evas_Object *map = data;
139    elm_map_zoom_mode_set(map, ELM_MAP_ZOOM_MODE_AUTO_FILL);
140 }
141
142 static void
143 _on_done(void *data, Evas_Object *obj, void *event_info)
144 {
145    elm_exit();
146 }
147
148 /* FIXME: it shouldn't be required. For unknown reason map won't call
149  * pan_calculate until shot delay time, but then it will take a screenshot
150  * when the map isn't loaded yet (actually it won't be downloaded, because
151  * after the SS it will kill the example). */
152 static Eina_Bool
153 _nasty_hack(void *data)
154 {
155    Evas_Object *o = data;
156    Evas *e = evas_object_evas_get(o);
157    evas_smart_objects_calculate(e);
158    return ECORE_CALLBACK_CANCEL;
159 }
160
161 EAPI_MAIN int
162 elm_main(int argc, char **argv)
163 {
164    Evas_Object *win, *bg, *map, *box, *bt;
165    Eina_List *ovls = NULL;
166    Elm_Map_Overlay *ovl, *city_clas, *country_clas;
167
168    win = elm_win_add(NULL, "map", ELM_WIN_BASIC);
169    elm_win_title_set(win, "Map Overlay Example");
170    evas_object_smart_callback_add(win, "delete,request", _on_done, NULL);
171
172    bg = elm_bg_add(win);
173    elm_win_resize_object_add(win, bg);
174    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
175    evas_object_show(bg);
176
177    map = elm_map_add(win);
178    elm_win_resize_object_add(win, map);
179    evas_object_size_hint_weight_set(map, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
180    evas_object_show(map);
181
182    box = elm_box_add(win);
183    evas_object_show(box);
184
185    bt = elm_button_add(win);
186    elm_object_text_set(bt, "+");
187    elm_box_pack_end(box, bt);
188    evas_object_show(bt);
189    evas_object_smart_callback_add(bt, "clicked", _bt_zoom_in, map);
190
191    bt = elm_button_add(win);
192    elm_object_text_set(bt, "-");
193    elm_box_pack_end(box, bt);
194    evas_object_show(bt);
195    evas_object_smart_callback_add(bt, "clicked", _bt_zoom_out, map);
196
197    bt = elm_button_add(win);
198    elm_object_text_set(bt, "X");
199    elm_box_pack_end(box, bt);
200    evas_object_show(bt);
201    evas_object_smart_callback_add(bt, "clicked", _bt_zoom_fit, map);
202
203    bt = elm_button_add(win);
204    elm_object_text_set(bt, "#");
205    elm_box_pack_end(box, bt);
206    evas_object_show(bt);
207    evas_object_smart_callback_add(bt, "clicked", _bt_zoom_fill, map);
208
209    evas_object_smart_callback_add(map, "overlay,clicked", _overlay_cb, NULL);
210
211    city_clas = elm_map_overlay_class_add(map);
212    elm_map_overlay_displayed_zoom_min_set(city_clas, 3);
213    elm_map_overlay_icon_set(city_clas, _clas_city_icon_get(map));
214
215    country_clas = elm_map_overlay_class_add(map);
216    elm_map_overlay_displayed_zoom_min_set(country_clas, 1);
217    elm_map_overlay_icon_set(country_clas, _clas_country_icon_get(map));
218
219    ovl = elm_map_overlay_add(map, -43.2, -22.9);
220    elm_map_overlay_icon_set(ovl, _city_icon_get(map));
221    elm_map_overlay_data_set(ovl, &data_rio);
222    elm_map_overlay_class_append(city_clas, ovl);
223    ovls = eina_list_append(ovls, ovl);
224
225    ovl = elm_map_overlay_add(map, -46.63, -23.55);
226    elm_map_overlay_icon_set(ovl, _city_icon_get(map));
227    elm_map_overlay_data_set(ovl, &data_sampa);
228    elm_map_overlay_class_append(city_clas, ovl);
229    ovls = eina_list_append(ovls, ovl);
230
231    ovl = elm_map_overlay_add(map, -47.88, -15.78);
232    elm_map_overlay_icon_set(ovl, _city_icon_get(map));
233    elm_map_overlay_data_set(ovl, &data_brasilia);
234    elm_map_overlay_class_append(city_clas, ovl);
235    ovls = eina_list_append(ovls, ovl);
236
237    ovl = elm_map_overlay_add(map, -65.23, -35.1);
238    elm_map_overlay_icon_set(ovl, _country_icon_get(map));
239    elm_map_overlay_data_set(ovl, &data_argentina);
240    elm_map_overlay_class_append(country_clas, ovl);
241    ovls = eina_list_append(ovls, ovl);
242
243    ovl = elm_map_overlay_add(map, -71.3, -31.75);
244    elm_map_overlay_icon_set(ovl, _country_icon_get(map));
245    elm_map_overlay_data_set(ovl, &data_chile);
246    elm_map_overlay_class_append(country_clas, ovl);
247    ovls = eina_list_append(ovls, ovl);
248
249    elm_map_overlays_show(ovls);
250
251    evas_object_resize(win, 512, 512);
252    evas_object_show(win);
253
254    ecore_timer_add(1, _nasty_hack, win);
255
256    elm_run();
257    elm_shutdown();
258
259    return 0;
260 }
261 ELM_MAIN()