Fix conflicts: Map, Hover, Hoversel, Menu, Web
[framework/uifw/elementary.git] / src / examples / map_example_03.c
1 /**
2  * Simple Elementary's <b>map widget</b> example, illustrating route and
3  * name usage.
4  *
5  * See stdout/stderr for output. Compile with:
6  *
7  * @verbatim
8  * gcc -g `pkg-config --cflags --libs elementary` map_example_03.c -o map_example_03
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 _Example_Data
20 {
21    Evas_Object *map, *entry;
22    Elm_Map_Route *route;
23    double start_lon, start_lat, dest_lon, dest_lat;
24    Elm_Map_Name *name;
25    Elm_Map_Overlay *route_ovl;
26 } Example_Data;
27
28 static Example_Data example_data;
29
30 static void
31 _route_loaded(void *data, Evas_Object *obj, void *ev __UNUSED__)
32 {
33    Example_Data *example_data = data;
34
35    example_data->route_ovl = elm_map_overlay_route_add(obj, example_data->route);
36    elm_map_overlay_color_set(example_data->route_ovl, 0, 255, 0, 255);
37 }
38
39 static void
40 _name_loaded(void *data, Evas_Object *obj, void *ev __UNUSED__)
41 {
42    Example_Data *example_data = data;
43    Evas_Object *map = obj;
44
45    if (example_data->route)
46      elm_map_route_remove(example_data->route);
47
48    elm_map_name_region_get(example_data->name, &(example_data->dest_lon),
49                            &(example_data->dest_lat));
50
51    example_data->route = elm_map_route_add(map, ELM_MAP_ROUTE_TYPE_FOOT,
52                      ELM_MAP_ROUTE_METHOD_SHORTEST,
53                      example_data->start_lon, example_data->start_lat,
54                      example_data->dest_lon, example_data->dest_lat,
55                      NULL, NULL);
56 }
57
58 static void
59 _bt_route(void *data, Evas_Object *obj __UNUSED__, void *ev __UNUSED__)
60 {
61    Example_Data *example_data = data;
62    Evas_Object *map;
63    char *address;
64
65    map = example_data->map;
66    address = (char *)elm_object_text_get(example_data->entry);
67
68    example_data->name = elm_map_name_add(map, address, 0, 0, NULL, NULL);
69
70    evas_object_smart_callback_add(map, "name,loaded", _name_loaded, data);
71    evas_object_smart_callback_add(map, "route,loaded", _route_loaded, data);
72 }
73
74 static void
75 _bt_zoom_in(void *data, Evas_Object *obj __UNUSED__, void *ev __UNUSED__)
76 {
77    int zoom;
78    elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_MANUAL);
79    zoom = elm_map_zoom_get(data);
80    elm_map_zoom_set(data, zoom + 1);
81 }
82
83 static void
84 _bt_zoom_out(void *data, Evas_Object *obj __UNUSED__, void *ev __UNUSED__)
85 {
86    int zoom;
87    elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_MANUAL);
88    zoom = elm_map_zoom_get(data);
89    elm_map_zoom_set(data, zoom - 1);
90 }
91
92 static void
93 _bt_zoom_fit(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
94 {
95    elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_AUTO_FIT);
96 }
97
98 static void
99 _bt_zoom_fill(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
100 {
101    elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_AUTO_FILL);
102 }
103
104 static void
105 _on_done(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
106 {
107    elm_exit();
108 }
109
110 /* FIXME: it shouldn't be required. For unknown reason map won't call
111  * pan_calculate until shot delay time, but then it will take a screenshot
112  * when the map isn't loaded yet (actually it won't be downloaded, because
113  * after the SS it will kill the example). */
114 static Eina_Bool
115 _nasty_hack(void *data)
116 {
117    Evas_Object *o = data;
118    Evas *e = evas_object_evas_get(o);
119    evas_smart_objects_calculate(e);
120    return ECORE_CALLBACK_CANCEL;
121 }
122
123 EAPI_MAIN int
124 elm_main(int argc __UNUSED__, char **argv __UNUSED__)
125 {
126    Evas_Object *win, *bg, *map, *box, *bt, *entry;
127
128    win = elm_win_add(NULL, "map", ELM_WIN_BASIC);
129    elm_win_title_set(win, "Map Route Example");
130    evas_object_smart_callback_add(win, "delete,request", _on_done, NULL);
131
132    bg = elm_bg_add(win);
133    elm_win_resize_object_add(win, bg);
134    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
135    evas_object_show(bg);
136
137    map = elm_map_add(win);
138    elm_win_resize_object_add(win, map);
139    evas_object_size_hint_weight_set(map, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
140    evas_object_show(map);
141
142    box = elm_box_add(win);
143    evas_object_show(box);
144
145    bt = elm_button_add(win);
146    elm_object_text_set(bt, "+");
147    elm_box_pack_end(box, bt);
148    evas_object_show(bt);
149    evas_object_smart_callback_add(bt, "clicked", _bt_zoom_in, map);
150    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, 0);
151
152    bt = elm_button_add(win);
153    elm_object_text_set(bt, "-");
154    elm_box_pack_end(box, bt);
155    evas_object_show(bt);
156    evas_object_smart_callback_add(bt, "clicked", _bt_zoom_out, map);
157    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, 0);
158
159    bt = elm_button_add(win);
160    elm_object_text_set(bt, "X");
161    elm_box_pack_end(box, bt);
162    evas_object_show(bt);
163    evas_object_smart_callback_add(bt, "clicked", _bt_zoom_fit, map);
164    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, 0);
165
166    bt = elm_button_add(win);
167    elm_object_text_set(bt, "#");
168    elm_box_pack_end(box, bt);
169    evas_object_show(bt);
170    evas_object_smart_callback_add(bt, "clicked", _bt_zoom_fill, map);
171    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, 0);
172
173    elm_box_horizontal_set(box, EINA_TRUE);
174    elm_win_resize_object_add(win, box);
175    evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
176    evas_object_size_hint_align_set(box, EVAS_HINT_FILL, 0);
177
178    entry = elm_entry_add(win);
179    elm_entry_scrollable_set(entry, EINA_TRUE);
180    elm_entry_single_line_set(entry, EINA_TRUE);
181    elm_object_text_set(entry, "Jockey Club Brasileiro");
182    evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
183    evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, 0);
184    elm_box_pack_end(box, entry);
185    evas_object_show(entry);
186
187    bt = elm_button_add(win);
188    elm_object_text_set(bt, "Route");
189    elm_box_pack_end(box, bt);
190    evas_object_show(bt);
191    evas_object_smart_callback_add(bt, "clicked", _bt_route, &example_data);
192    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, 0);
193
194    example_data.map = map;
195    example_data.entry = entry;
196    example_data.route = NULL;
197    example_data.start_lon = -43.175;
198    example_data.start_lat = -22.97;
199
200    elm_map_zoom_set(map, 12);
201    elm_map_region_show(map, example_data.start_lon, example_data.start_lat);
202
203    evas_object_resize(win, 512, 512);
204    evas_object_show(win);
205
206    ecore_timer_add(0.5, _nasty_hack, win);
207
208    elm_run();
209    return 0;
210 }
211 ELM_MAIN()