Launching : initial version
[apps/native/sample/adventure.git] / src / main_view.c
1 #include <Elementary.h>
2
3 #include "main.h"
4 #include "main_view.h"
5 #include "log.h"
6 #include "scroller.h"
7 #include "city.h"
8 #include "util.h"
9
10 const char *const MAIN_VIEW_EDJE = "main_view.edj";
11 const char *const PREDICT_ITEM_EDJE = "predict_item.edj";
12
13 static void _update_predict_scroller(Evas_Object *predict_scroller, const char *str);
14
15 static void _change_entry_cb(void *data, Evas_Object *obj, void *event_info)
16 {
17         main_view_s *main_view_info = data;
18         Evas_Object *entry = obj;
19         const char *str = NULL;
20
21         ret_if(!main_view_info);
22
23         str = elm_entry_entry_get(entry);
24         if (!str)
25                 return;
26
27         _update_predict_scroller(main_view_info->predict_scroller, str);
28 }
29
30 static void _focus_entry_cb(void *data, Evas_Object *obj, void *event_info)
31 {
32 }
33
34 static void _unfocus_entry_cb(void *data, Evas_Object *obj, void *event_info)
35 {
36 }
37
38 static void
39 _resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
40 {
41         int x, y, w, h;
42         evas_object_geometry_get(obj, &x, &y, &w, &h);
43         _D("%s (%d:%d:%d:%d)", data, x, y, w, h);
44 }
45
46 static Evas_Object *_create_search_entry(Evas_Object *parent, main_view_s *main_view_info)
47 {
48         Evas_Object *entry = NULL;
49
50         retv_if(!parent, NULL);
51
52         entry = elm_entry_add(parent);
53         retv_if(!entry, NULL);
54
55         elm_entry_single_line_set(entry, EINA_TRUE);
56         elm_entry_scrollable_set(entry, EINA_TRUE);
57         elm_entry_cnp_mode_set(entry, ELM_CNP_MODE_PLAINTEXT);
58         elm_object_part_text_set(entry, "elm.guide", "Search");
59
60         evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
61         evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
62
63         evas_object_smart_callback_add(entry, "changed", _change_entry_cb, main_view_info);
64         evas_object_smart_callback_add(entry, "focused", _focus_entry_cb, main_view_info);
65         evas_object_smart_callback_add(entry, "unfocused", _unfocus_entry_cb, main_view_info);
66
67         evas_object_show(entry);
68
69         return entry;
70 }
71
72 static void _destroy_search_entry(Evas_Object *entry)
73 {
74         ret_if(!entry);
75         evas_object_del(entry);
76 }
77
78 static Evas_Object *_create_map(Evas_Object *parent)
79 {
80         Evas_Object *map = NULL;
81         Evas *e = NULL;
82
83         retv_if(!parent, NULL);
84
85         e = evas_object_evas_get(parent);
86         retv_if(!e, NULL);
87
88         map = evas_object_rectangle_add(e);
89         retv_if(!map, NULL);
90
91         evas_object_color_set(map, 0, 0, 200, 255);
92         evas_object_size_hint_min_set(map, 480, 400);
93         evas_object_show(map);
94
95         return map;
96 }
97
98 static void _destroy_map(Evas_Object *map)
99 {
100         ret_if(!map);
101
102         evas_object_del(map);
103 }
104
105 static void _click_result_button_cb(void *data, Evas_Object *obj, void *event_info)
106 {
107         main_view_s *main_view_info = data;
108
109         _D("result button is clicked");
110
111         ret_if(!main_view_info);
112 }
113
114 static Evas_Object *_create_result_button(Evas_Object *parent, main_view_s *main_view_info)
115 {
116         Evas_Object *result_button = NULL;
117
118         retv_if(!parent, NULL);
119
120         result_button = elm_button_add(parent);
121         retv_if(!result_button, NULL);
122
123         elm_object_text_set(result_button, "Result");
124         evas_object_size_hint_weight_set(result_button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
125         evas_object_size_hint_align_set(result_button, EVAS_HINT_FILL, EVAS_HINT_FILL);
126         evas_object_smart_callback_add(result_button, "clicked", _click_result_button_cb, main_view_info);
127
128         return result_button;
129 }
130
131 static void _destroy_result_button(Evas_Object *result_button)
132 {
133         ret_if(!result_button);
134         evas_object_del(result_button);
135 }
136
137 static Evas_Object *_create_selected_scroller(Evas_Object *parent)
138 {
139         Evas_Object *selected_scroller = NULL;
140
141         retv_if(!parent, NULL);
142
143         selected_scroller = scroller_create(parent);
144         retv_if(!selected_scroller, NULL);
145
146         return selected_scroller;
147 }
148
149 static void _destroy_selected_scroller(Evas_Object *selected_scroller)
150 {
151         ret_if(!selected_scroller);
152
153         evas_object_del(selected_scroller);
154 }
155
156 static void _click_plus_button_cb(void *data, Evas_Object *obj, void *event_info)
157 {
158         moment_info_s *moment_info = data;
159
160         _D("Add button is clicked");
161
162         ret_if(!moment_info);
163
164         /* Show the entry */
165 }
166
167 static Evas_Object *_create_plus_button(Evas_Object *parent, main_view_s *main_view_info)
168 {
169         Evas_Object *plus_button = NULL;
170
171         retv_if(!parent, NULL);
172
173         plus_button = elm_button_add(parent);
174         retv_if(!plus_button, NULL);
175
176         elm_object_text_set(plus_button, "+Add");
177         evas_object_size_hint_weight_set(plus_button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
178         evas_object_size_hint_align_set(plus_button, EVAS_HINT_FILL, EVAS_HINT_FILL);
179         evas_object_smart_callback_add(plus_button, "clicked", _click_plus_button_cb, main_view_info);
180
181         return plus_button;
182 }
183
184 static void _destroy_plus_button(Evas_Object *plus_button)
185 {
186         ret_if(!plus_button);
187         evas_object_del(plus_button);
188 }
189
190 static Evas_Object *_create_predict_item(Evas_Object *parent, const char *city, const char *nation)
191 {
192         Evas_Object *predict_item = NULL;
193
194         char *path = NULL;
195         char full_path[PATH_LEN] = {0, };
196         char city_name[PATH_LEN] = {0, };
197
198         retv_if(!parent, NULL);
199
200         path = app_get_resource_path();
201         retv_if(!path, NULL);
202
203         snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, PREDICT_ITEM_EDJE);
204         free(path);
205
206         predict_item = elm_layout_add(parent);
207         retv_if(!predict_item, NULL);
208
209         elm_layout_file_set(predict_item, full_path, "main");
210         evas_object_size_hint_weight_set(predict_item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
211         evas_object_size_hint_align_set(predict_item, EVAS_HINT_FILL, EVAS_HINT_FILL);
212         evas_object_show(predict_item);
213
214         snprintf(city_name, sizeof(city_name), "%s, %s", city, nation);
215         elm_object_part_text_set(predict_item, "city", city_name);
216
217         return predict_item;
218 }
219
220 static void _destroy_predict_item(Evas_Object *predict_item)
221 {
222         ret_if(!predict_item);
223         evas_object_del(predict_item);
224 }
225
226 static Evas_Object *_create_predict_scroller(Evas_Object *parent)
227 {
228         Evas_Object *predict_scroller = NULL;
229
230         retv_if(!parent, NULL);
231
232         predict_scroller = scroller_create(parent);
233         retv_if(!predict_scroller, NULL);
234
235         return predict_scroller;
236 }
237
238 static void _destroy_predict_scroller(Evas_Object *predict_scroller)
239 {
240         ret_if(!predict_scroller);
241
242         evas_object_del(predict_scroller);
243 }
244
245 static void _clean_predict_scroller(Evas_Object *predict_scroller)
246 {
247         Evas_Object *box = NULL;
248         Evas_Object *predict_item = NULL;
249         Eina_List *list = NULL;
250
251         ret_if(!predict_scroller);
252
253         box = elm_object_content_get(predict_scroller);
254         ret_if(!box);
255
256         list = elm_box_children_get(box);
257         ret_if(!list);
258
259         EINA_LIST_FREE(list, predict_item) {
260                 _destroy_predict_item(predict_item);
261         }
262 }
263
264 static void _append_item_to_predict_scroller(Evas_Object *predict_scroller, Evas_Object *item)
265 {
266         Evas_Object *box = NULL;
267
268         ret_if(!predict_scroller);
269         ret_if(!item);
270
271         box = elm_object_content_get(predict_scroller);
272         ret_if(!box);
273
274         elm_box_pack_end(box, item);
275 }
276
277 static void _remove_item_in_predict_scroller(Evas_Object *predict_scroller, Evas_Object *item)
278 {
279         Evas_Object *box = NULL;
280
281         ret_if(!predict_scroller);
282         ret_if(!item);
283
284         box = elm_object_content_get(predict_scroller);
285         ret_if(!box);
286
287         elm_box_unpack(box, item);
288 }
289
290 static void _update_predict_scroller(Evas_Object *predict_scroller, const char *str)
291 {
292         city_s *city_info = NULL;
293         register int i = 0;
294
295         ret_if(!predict_scroller);
296
297         if (!str)
298                 _clean_predict_scroller(predict_scroller);
299
300         city_info = city_get();
301         ret_if(!city_info);
302
303         for (; i < CITY_MAX; i++) {
304                 int matched = 0;
305                 if (city_info[i].name && strstr(city_info[i].name, str))
306                         matched = 1;
307                 else if (city_info[i].nation && strstr(city_info[i].nation, str))
308                         matched = 1;
309
310                 if (matched) {
311                         Evas_Object *predict_item = NULL;
312                         predict_item = _create_predict_item(predict_scroller, city_info[i].name, city_info[i].nation);
313                         if (predict_item)
314                                 _append_item_to_predict_scroller(predict_scroller, predict_item);
315                 }
316         }
317 }
318
319 Evas_Object *main_view_create(Evas_Object *parent, moment_info_s *moment_info)
320 {
321         main_view_s *main_view_info = NULL;
322         char *path = NULL;
323         char full_path[PATH_LEN] = {0, };
324
325         retv_if(!parent, NULL);
326
327         path = app_get_resource_path();
328         retv_if(!path, NULL);
329
330         snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, MAIN_VIEW_EDJE);
331         free(path);
332
333         _D("main_view is created with %s", full_path);
334
335         main_view_info = calloc(1, sizeof(main_view_s));
336         retv_if(!main_view_info, NULL);
337
338         main_view_info->main_view = elm_layout_add(parent);
339         if (!main_view_info->main_view) {
340                 free(main_view_info);
341                 return NULL;
342         }
343
344         elm_layout_file_set(main_view_info->main_view, full_path, "main");
345         evas_object_size_hint_weight_set(main_view_info->main_view, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
346         evas_object_size_hint_align_set(main_view_info->main_view, EVAS_HINT_FILL, EVAS_HINT_FILL);
347         evas_object_show(main_view_info->main_view);
348         evas_object_data_set(main_view_info->main_view, DATA_KEY_INFO, main_view_info);
349         evas_object_event_callback_add(main_view_info->main_view, EVAS_CALLBACK_RESIZE, _resize_cb, "main_view");
350
351         elm_object_part_text_set(main_view_info->main_view, "title", "No cities");
352         elm_object_part_text_set(main_view_info->main_view, "description", "After you add cities, they will be shown here.");
353
354         main_view_info->entry = _create_search_entry(main_view_info->main_view, main_view_info);
355         if (main_view_info->entry)
356                 elm_object_part_content_set(main_view_info->main_view, "entry", main_view_info->entry);
357
358         main_view_info->map = _create_map(main_view_info->main_view);
359         if (main_view_info->map)
360                 elm_object_part_content_set(main_view_info->main_view, "map", main_view_info->map);
361
362         main_view_info->result_button = _create_result_button(main_view_info->main_view, main_view_info);
363         if (main_view_info->result_button)
364                 elm_object_part_content_set(main_view_info->main_view, "result_button", main_view_info->result_button);
365
366         main_view_info->selected_scroller = _create_selected_scroller(main_view_info->main_view);
367         if (main_view_info->selected_scroller)
368                 elm_object_part_content_set(main_view_info->main_view, "selected_scroller", main_view_info->selected_scroller);
369
370         main_view_info->plus_button = _create_plus_button(main_view_info->main_view, main_view_info);
371         if (main_view_info->plus_button)
372                 elm_object_part_content_set(main_view_info->main_view, "plus_button", main_view_info->plus_button);
373
374         main_view_info->predict_scroller = _create_predict_scroller(main_view_info->main_view);
375         if (main_view_info->predict_scroller)
376                 elm_object_part_content_set(main_view_info->main_view, "predict_scroller", main_view_info->predict_scroller);
377
378         return main_view_info->main_view;
379 }
380
381 void main_view_destroy(Evas_Object *main_view)
382 {
383         Evas_Object *button = NULL;
384         main_view_s *main_view_info = NULL;
385
386         ret_if(!main_view);
387
388         main_view_info = evas_object_data_del(main_view_info->main_view, DATA_KEY_INFO);
389         ret_if(!main_view_info);
390
391         if (main_view_info->predict_scroller)
392                 _destroy_predict_scroller(main_view_info->predict_scroller);
393
394         if (main_view_info->plus_button)
395                 _destroy_plus_button(main_view_info->plus_button);
396
397         if (main_view_info->selected_scroller)
398                 _destroy_selected_scroller(main_view_info->selected_scroller);
399
400         if (main_view_info->result_button)
401                 _destroy_result_button(button);
402
403         if (main_view_info->map)
404                 _destroy_map(main_view_info->map);
405
406         if (main_view_info->entry)
407                 _destroy_search_entry(main_view_info->entry);
408
409         free(main_view_info);
410
411         evas_object_del(main_view);
412 }