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