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