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