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