tizen 2.3.1 release
[apps/home/b2-clocksetting.git] / src / setting-theme.c
1 /*
2  * setting-theme.c
3  *
4  *  Created on: Aug 7, 2014
5  *      Author: min-hoyun
6  */
7
8 #include <efl_assist.h>
9 #include <feedback.h>
10
11 #include "setting-theme.h"
12 #include "setting_view_toast.h"
13
14
15 static Thumbnail_Data thumbnail_arr[COLOR_THEME_COUNT] = {
16         { EA_THEME_COLOR_TABLE_1, EA_THEME_STYLE_DARK,  "settings_preview_dark.png"     },
17         { EA_THEME_COLOR_TABLE_1, EA_THEME_STYLE_LIGHT, "settings_preview_light.png"    },
18         { EA_THEME_COLOR_TABLE_1 + 1, EA_THEME_STYLE_DARK, "settings_preview_dark_blue.png"     },
19         { EA_THEME_COLOR_TABLE_1 + 1, EA_THEME_STYLE_LIGHT, "settings_preview_light_blue.png"   }
20 };
21
22 int center_item = 0;
23 static appdata *g_ad;
24
25 static Evas_Object *setting_theme_create_thumbnail_layout(void *data);
26 static void setting_theme_thumbnail_scroll(void *data, Evas_Object *obj, void *ei);
27 static void setting_theme_index_refresh(void *data);
28 static void     setting_theme_index_sync(void *data);
29 static void     setting_theme_layout_resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
30 static void     setting_theme_on_index_mouse_down_cb(void *data, Evas *e, Evas_Object *o, void *event_info);
31 static void     setting_theme_on_index_mouse_up_cb(void *data, Evas *e, Evas_Object *o, void *event_info);
32 static void     setting_theme_on_index_mouse_move_cb(void *data, Evas *e, Evas_Object *o, void *event_info);
33 static void     setting_theme_mouse_down_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info);
34 static void setting_theme_mouse_up_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info);
35 static void setting_theme_mouse_move_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info);
36 static void setting_theme_layout_del_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info);
37
38
39
40
41 void setting_theme_show_thumbnail(void *data, Evas_Object *obj, void *event_info)
42 {
43         DBG("setting_theme_show_thumbnail");
44
45         elm_genlist_item_selected_set((Elm_Object_Item *)event_info, EINA_FALSE);
46
47         appdata *ad = data;
48         if (ad == NULL)
49                 return;
50
51         Theme_Data *td = (Theme_Data *)calloc(1, sizeof(Theme_Data));
52         td->ad = ad;
53         td->curr_theme_id = 1;  /*EA_THEME_COLOR_TABLE_1; */
54         td->theme_layout = setting_theme_create_thumbnail_layout(td);
55         if (td->theme_layout) {
56                 Elm_Object_Item *it = elm_naviframe_item_push(ad->nf, NULL, NULL, NULL, td->theme_layout, NULL);
57                 elm_naviframe_item_title_enabled_set(it, EINA_FALSE, EINA_FALSE);
58         }
59
60         int ret;
61         ret = feedback_initialize();
62         if (ret != FEEDBACK_ERROR_NONE) {
63                 DBG("feedback_initialize failed");
64         }
65
66         g_ad = ad;
67 }
68
69 static Evas_Object *setting_theme_create_thumbnail_layout(void *data)
70 {
71         DBG("setting_display_create_brightness_layout");
72
73         Evas_Object *layout, *scroller, *box, *page_layout, *page, *mapbuf;
74         Eina_List *colors;
75         Ea_Theme_Color_hsv *hsv_color;
76         Evas_Object *image;
77
78         int start, r, g, b;
79
80         int i;
81
82         Theme_Data *td = data;
83         if (td == NULL)
84                 return NULL;
85
86         vconf_get_int("db/setting/color_theme_type", &td->curr_theme_type);
87
88         DBG("Color theme type: %d", td->curr_theme_type);
89
90         /* Create Layout */
91         layout = elm_layout_add(td->ad->nf);
92         elm_layout_file_set(layout, EDJE_PATH, "setting/index_thumbnail");
93         evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
94         evas_object_show(layout);
95         evas_object_event_callback_add(layout, EVAS_CALLBACK_DEL, setting_theme_layout_del_cb, td);
96
97         /* Create Scroller */
98         scroller = elm_scroller_add(layout);
99         elm_scroller_loop_set(scroller, EINA_FALSE, EINA_FALSE);
100         evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
101         evas_object_size_hint_align_set(scroller, EVAS_HINT_FILL, EVAS_HINT_FILL);
102         /*      elm_scroller_page_relative_set(scroller, 1.0, 0.0); */
103         elm_scroller_page_size_set(scroller, 248, 0);
104         elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
105         elm_scroller_page_scroll_limit_set(scroller, 1, 0);
106         elm_object_scroll_lock_y_set(scroller, EINA_TRUE);
107         elm_object_part_content_set(layout, "scroller", scroller);
108         elm_object_style_set(scroller, "effect");
109         evas_object_show(scroller);
110         td->scroller = scroller;
111
112         /* Create Box */
113         box = elm_box_add(scroller);
114         elm_box_horizontal_set(box, EINA_TRUE);
115         elm_object_content_set(scroller, box);
116         evas_object_show(box);
117
118         Evas_Object *rect = evas_object_rectangle_add(evas_object_evas_get(box));
119         evas_object_size_hint_min_set(rect, 56, 480);
120         /*      ea_theme_object_color_set(rect, "B011"); */
121         elm_box_pack_end(box, rect);
122
123         /* Create Pages */
124         for (i = 0; i < COLOR_THEME_COUNT; ++i) {
125                 page_layout = elm_layout_add(box);
126                 evas_object_size_hint_weight_set(page_layout, 0, 0);
127                 evas_object_size_hint_align_set(page_layout, 0, EVAS_HINT_FILL);
128                 elm_layout_theme_set(page_layout, "layout", "body_thumbnail", "default");
129                 evas_object_show(page_layout);
130
131                 image = elm_image_add(page_layout);
132                 elm_image_file_set(image, EDJE_PATH, thumbnail_arr[i].prev_img_path);
133                 evas_object_size_hint_align_set(image, EVAS_HINT_FILL, EVAS_HINT_FILL);
134                 evas_object_size_hint_weight_set(image, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
135
136                 /* touch event */
137                 evas_object_event_callback_add(image, EVAS_CALLBACK_MOUSE_DOWN, setting_theme_mouse_down_cb, NULL);
138                 evas_object_event_callback_add(image, EVAS_CALLBACK_MOUSE_UP, setting_theme_mouse_up_cb, (void *)i);
139                 evas_object_event_callback_add(image, EVAS_CALLBACK_MOUSE_MOVE, setting_theme_mouse_move_cb, NULL);
140
141                 elm_object_part_content_set(page_layout, "elm.icon", image);
142
143                 Evas_Object *ao = elm_access_object_register(image, page_layout);
144                 if (ao) {
145                         elm_access_activate_cb_set(ao, setting_theme_mouse_up_cb, (void *)i);
146                 }
147
148                 if (i == td->curr_theme_type) {
149                         elm_object_signal_emit(page_layout, "elm,state,thumbnail,focus", "*");
150                 } else {
151                         elm_object_signal_emit(page_layout, "elm,state,thumbnail,unfocus", "*");
152                 }
153
154                 mapbuf = elm_mapbuf_add(box);
155                 evas_object_size_hint_weight_set(mapbuf, 0, 0);
156                 evas_object_size_hint_align_set(mapbuf, 0, EVAS_HINT_FILL);
157                 evas_object_show(mapbuf);
158                 elm_object_content_set(mapbuf, page_layout);
159                 td->mapbuf[i] = mapbuf;
160
161                 elm_box_pack_end(box, mapbuf);
162         }
163
164         rect = evas_object_rectangle_add(evas_object_evas_get(box));
165         evas_object_size_hint_min_set(rect, 56, 480);
166         /*      ea_theme_object_color_set(rect, "B011"); */
167         elm_box_pack_end(box, rect);
168
169         /* Use Index */
170         evas_object_smart_callback_add(scroller, "scroll", setting_theme_thumbnail_scroll, td);
171
172         evas_object_event_callback_add(scroller, EVAS_CALLBACK_RESIZE, setting_theme_layout_resize_cb, td);
173
174         Evas_Object *index = elm_index_add(layout);
175         elm_object_style_set(index, "thumbnail");
176         evas_object_size_hint_weight_set(index, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
177         evas_object_size_hint_align_set(index, EVAS_HINT_FILL, EVAS_HINT_FILL);
178         elm_index_horizontal_set(index, EINA_TRUE);
179         elm_index_autohide_disabled_set(index, EINA_TRUE);
180         elm_object_part_content_set(layout, "controller", index);
181
182
183         for (i = 0; i < COLOR_THEME_COUNT; ++i) {
184                 td->it[i] = elm_index_item_append(index, NULL, NULL, (void *) i);
185         }
186
187         elm_object_item_style_set(td->it[center_item - 1] , "item/vertical/center");
188
189         td->min_page = 0;
190         td->max_page = COLOR_THEME_COUNT;
191
192         elm_index_level_go(index, 0);
193         elm_index_item_selected_set(td->it[0], EINA_TRUE);
194         td->curr_page = 0;
195         td->last_it = td->it[0];
196         td->index = index;
197
198         evas_object_event_callback_add(index, EVAS_CALLBACK_MOUSE_DOWN, setting_theme_on_index_mouse_down_cb, td);
199         evas_object_event_callback_add(index, EVAS_CALLBACK_MOUSE_MOVE, setting_theme_on_index_mouse_move_cb, td);
200         evas_object_event_callback_add(index, EVAS_CALLBACK_MOUSE_UP, setting_theme_on_index_mouse_up_cb, td);
201
202         return layout;
203 }
204
205 static void setting_theme_thumbnail_scroll(void *data, Evas_Object *obj, void *ei)
206 {
207         int cur_page;
208         Theme_Data *td = (Theme_Data *)data;
209         elm_scroller_current_page_get(td->scroller, &cur_page, NULL);
210         if (cur_page != td->curr_page) {
211                 DBG("scroll: %d\n", td->curr_page);
212
213                 td->curr_page = cur_page;
214
215                 setting_theme_index_sync(td);
216         }
217 }
218
219 static void     setting_theme_index_sync(void *data)
220 {
221         Theme_Data *td = (Theme_Data *)data;
222
223         Elm_Object_Item *it = elm_index_item_find(td->index, (void *)td->curr_page);
224         if (it) {
225                 elm_index_item_selected_set(it, EINA_TRUE);
226                 td->last_it = it;
227                 td->new_it  = it;
228         } else {
229                 setting_theme_index_refresh(td);
230         }
231 }
232
233 static void setting_theme_index_refresh(void *data)
234 {
235         int i;
236         Elm_Object_Item *it;
237         Theme_Data *td = (Theme_Data *)data;
238
239         elm_index_item_clear(td->index);
240         if (td->curr_page < td->min_page) {
241                 for (i = td->curr_page ; i < td->curr_page + COLOR_THEME_COUNT ; i++) {
242                         it = elm_index_item_append(td->index, NULL, NULL, (void *) i);
243
244                         if (i == center_item)
245                                 elm_object_item_style_set(it, "item/vertical/center");
246                 }
247                 td->min_page = td->curr_page;
248                 td->min_page = td->curr_page + COLOR_THEME_COUNT - 1;
249         } else {
250                 for (i = td->curr_page - 2 + 1; i < td->curr_page + 1 ; i++) {
251                         it = elm_index_item_append(td->index, NULL, NULL, (void *) i);
252                         if (i == center_item)
253                                 elm_object_item_style_set(it, "item/vertical/center");
254                 }
255                 td->min_page = td->curr_page - 2;
256                 td->min_page = td->curr_page - 1;
257         }
258         elm_index_level_go(td->index, 0);
259
260         setting_theme_index_sync(td);
261 }
262
263 static void     setting_theme_layout_resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
264 {
265         DBG("setting_theme_layout_resize_cb");
266
267         Theme_Data *td = (Theme_Data *)data;
268         if (td) {
269                 elm_scroller_page_show(obj, td->curr_theme_type, 0);
270
271                 td->curr_page = td->curr_theme_type;
272
273                 setting_theme_index_sync(td);
274         }
275 }
276
277 static void     setting_theme_on_index_mouse_down_cb(void *data, Evas *e, Evas_Object *o, void *event_info)
278 {
279         Theme_Data *pd = (Theme_Data *)data;
280
281         /* Keep the last index item active and save the selected index item */
282         if (!pd->last_it) return;
283
284         int level = elm_index_item_level_get(o);
285         pd->new_it = elm_index_selected_item_get(o, level);
286         elm_index_item_selected_set(pd->last_it, EINA_TRUE);
287 }
288
289 static void     setting_theme_on_index_mouse_up_cb(void *data, Evas *e, Evas_Object *o, void *event_info)
290 {
291         Theme_Data *pd = (Theme_Data *)data;
292
293         /* Keep the last index item active and move to the page of the currently selected index item */
294         if (!pd->last_it) return;
295         elm_index_item_selected_set(pd->last_it, EINA_TRUE);
296
297         if (!pd->new_it) return;
298
299         int idx = (int) elm_object_item_data_get(pd->new_it);
300         if (idx == pd->curr_page) return;
301
302         elm_scroller_page_bring_in(pd->scroller, idx, 0);
303 }
304
305 static void     setting_theme_on_index_mouse_move_cb(void *data, Evas *e, Evas_Object *o, void *event_info)
306 {
307         Theme_Data *pd = (Theme_Data *)data;
308
309         /* Keep the last index item active and save the currently selected index item */
310         if (!pd->last_it) return;
311
312         int level = elm_index_item_level_get(o);
313         pd->new_it = elm_index_selected_item_get(o, level);
314         elm_index_item_selected_set(pd->last_it, EINA_TRUE);
315 }
316
317 static int prev_x = 0;
318 static int touch_mode = NONE;
319
320 static void     setting_theme_mouse_down_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info)
321 {
322         touch_mode = TOUCH_DOWN;
323
324         Evas_Event_Mouse_Down *ev = event_info;
325         prev_x = ev->canvas.x;
326 }
327
328 static void setting_theme_mouse_up_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info)
329 {
330         if (touch_mode == TOUCH_MOVE)
331                 return;
332
333         feedback_play(FEEDBACK_PATTERN_TOUCH_TAP);
334
335         int id = (int *)data;
336
337         DBG("Id: %d", id);
338
339         int curr_theme_type = 0;
340         vconf_get_int("db/setting/color_theme_type", &curr_theme_type);
341
342         int ret = ea_theme_input_colors_set(thumbnail_arr[id].id, thumbnail_arr[id].theme_type);
343
344         DBG("ea_theme_input_colors_set ret : %d", ret);
345         if (!ret) {
346                 ERR("ea_theme_input_colors_set() failed!");
347                 /*return; */
348         }
349
350         if (id != curr_theme_type) {
351                 DBG("Color Id: %d, type: %d", thumbnail_arr[id].id, thumbnail_arr[id].theme_type);
352
353                 vconf_set_int("db/setting/color_theme_type", id);
354
355                 /* automatic freed!! */
356                 struct _toast_data *toast = _create_toast(g_ad, _("IDS_ST_TPOP_COLOUR_THEME_CHANGED"));
357                 if (toast) {
358                         _show_toast(g_ad, toast);
359                 }
360         } else {
361                 /* automatic freed!! */
362                 struct _toast_data *toast = _create_toast(g_ad, _("IDS_ST_TPOP_COLOUR_THEME_ALREADY_SET"));
363                 if (toast) {
364                         _show_toast(g_ad, toast);
365                 }
366         }
367
368         if (g_ad) {
369                 elm_naviframe_item_pop(g_ad->nf);
370         }
371 }
372
373 static void setting_theme_mouse_move_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info)
374 {
375         Evas_Event_Mouse_Move *ev = event_info;
376
377         int cur_x = ev->cur.canvas.x;
378         if (abs(cur_x - prev_x) > 15) {
379                 /* todo : confirm and remove */
380                 touch_mode = TOUCH_MOVE;
381         }
382 }
383
384 static void setting_theme_layout_del_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info)
385 {
386         DBG("setting_theme_layout_del_cb");
387
388         Theme_Data *td = data;
389         if (td)
390                 free(td);
391
392         int ret;
393         ret = feedback_deinitialize();
394         if (ret != FEEDBACK_ERROR_NONE) {
395                 DBG("feedback_deinitialize failed");
396         }
397 }