3 * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
5 * Licensed under the Apache License, Version 2.0 (the License);
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an AS IS BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
18 #include <Elementary.h>
19 #include <app_debug.h>
25 #include "data_recent.h"
29 #define MESSAGE_NO_CONTENTS "No Contents"
30 #define PADDING_BOX 26
32 enum input_handler_type {
33 INPUT_HANDLER_TYPE_EO,
34 INPUT_HANDLER_TYPE_DELETE,
35 INPUT_HANDLER_TYPE_DISABLE_DELETE
38 enum recent_item_type {
39 RECENT_ITEM_ICON = 0x00,
40 RECENT_ITEM_PREVIEW = 0x01
51 struct _bar_item *cur;
58 struct datamgr_item *di;
62 static void _focused(int id, void *data, Evas_Object *obj,
63 Elm_Object_Item *item)
68 case INPUT_HANDLER_TYPE_EO:
75 case INPUT_HANDLER_TYPE_DELETE:
76 elm_object_signal_emit(obj, SIG_FOCUS, SRC_PROG);
83 static void _unfocused(int id, void *data, Evas_Object *obj,
84 Elm_Object_Item *item)
87 case INPUT_HANDLER_TYPE_EO:
88 case INPUT_HANDLER_TYPE_DELETE:
89 elm_object_signal_emit(obj, SIG_UNFOCUS, SRC_PROG);
96 static void _key_down(int id, void *data, Evas *e, Evas_Object *obj,
97 Evas_Event_Key_Down *ev)
100 struct _bar_item *bi;
103 _ERR("Invalid argument");
108 case INPUT_HANDLER_TYPE_EO:
112 if (!strcmp(ev->keyname, KEY_DOWN) ||
113 !strcmp(ev->keyname, KEY_BACK) ||
114 !strcmp(ev->keyname, KEY_BACK_REMOTE)) {
115 elm_object_signal_emit(priv->base, SIG_HIDE_RECENT,
117 } else if (!strcmp(ev->keyname, KEY_ENTER) ||
118 !strcmp(ev->keyname, KEY_ENTER_REMOTE)) {
119 datamgr_select_item(priv->dm, bi->di);
122 case INPUT_HANDLER_TYPE_DELETE:
125 if (!strcmp(ev->keyname, KEY_ENTER) ||
126 !strcmp(ev->keyname, KEY_ENTER_REMOTE)) {
127 elm_object_signal_emit(priv->base, SIG_HIDE_RECENT,
129 } else if (!strcmp(ev->keyname, KEY_ENTER) ||
130 !strcmp(ev->keyname, KEY_ENTER_REMOTE)) {
131 datamgr_clear_item(priv->dm);
132 elm_object_signal_emit(priv->base, SIG_HIDE_RECENT,
134 } else if (!strcmp(ev->keyname, KEY_DOWN)) {
136 priv->cur = eina_list_data_get(priv->list);
137 elm_object_focus_set(priv->cur->eo, EINA_TRUE);
140 case INPUT_HANDLER_TYPE_DISABLE_DELETE:
143 if (!strcmp(ev->keyname, KEY_DOWN) ||
144 !strcmp(ev->keyname, KEY_BACK) ||
145 !strcmp(ev->keyname, KEY_BACK_REMOTE)){
146 elm_object_signal_emit(priv->base, SIG_HIDE_RECENT,
155 static void _mouse_down(int id, void *data, Evas *e, Evas_Object *obj,
156 Evas_Event_Mouse_Down *ev)
158 struct _bar_item *bi;
162 _ERR("Invalid argument");
167 case INPUT_HANDLER_TYPE_EO:
171 datamgr_select_item(priv->dm, bi->di);
173 case INPUT_HANDLER_TYPE_DELETE:
176 datamgr_clear_item(priv->dm);
177 elm_object_signal_emit(priv->base, SIG_HIDE_RECENT,
185 static input_handler handler = {
187 .unfocused = _unfocused,
188 .key_down = _key_down,
189 .mouse_down = _mouse_down
192 static void _hide_done(void *data, Evas_Object *obj, const char *emission,
198 static void _add_delete_btn(struct _priv *priv, const char *ic_image,
199 const char *focus_ic_image, enum input_handler_type type)
201 Evas_Object *btn, *ic, *focus_ic;
203 btn = utils_add_layout(priv->base, GRP_RECENT_DELETE, true,
204 PART_RECENT_DELETE_ICON);
206 _ERR("failed to add delete icon");
209 evas_object_show(btn);
211 ic = utils_add_icon(btn, ic_image, PART_RECENT_DELETE);
213 _ERR("failed to add icon");
214 evas_object_del(btn);
218 focus_ic = utils_add_icon(btn, focus_ic_image,
219 PART_RECENT_DELETE_FOCUS);
221 _ERR("failed to add focus icon");
222 evas_object_del(btn);
226 inputmgr_add_callback(btn, type, &handler, priv);
231 static Evas_Object *_create(Evas_Object *win, void *data)
238 _ERR("Invalid argument");
242 priv = calloc(1, sizeof(*priv));
244 _ERR("failed to calloc priv");
248 dm = datamgr_init(datamgr_recent_get_dclass(), VIEW_RECENT);
250 _ERR("failed to initialize datamgr");
255 base = utils_add_layout(win, GRP_RECENT, false, NULL);
257 _ERR("failed to create base");
262 evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND,
264 elm_win_resize_object_add(win, base);
270 viewmgr_set_view_data(VIEW_RECENT, priv);
271 elm_object_signal_callback_add(base, SIG_HIDE_RECENT_DONE, SRC_EDJE,
277 static struct _bar_item *_pack_item(struct _priv *priv, Evas_Object *box,
278 struct datamgr_item *di)
280 Evas_Object *eo, *lbl, *sub_lbl, *thumb, *ic;
281 struct _bar_item *bi;
285 case RECENT_ITEM_PREVIEW:
286 group = GRP_RECENT_PREVIEW;
288 case RECENT_ITEM_ICON:
289 group = GRP_RECENT_ICON;
295 bi = calloc(1, sizeof(*bi));
297 _ERR("failed to calloc bar item");
301 eo = utils_add_layout(box, group, true, NULL);
303 _ERR("failed to add layout");
307 evas_object_show(eo);
309 thumb = utils_add_icon(eo, di->icon, PART_RECENT_THUMBNAIL);
311 _ERR("failed to add thumb");
317 ic = utils_add_icon(eo, di->focus_icon, PART_RECENT_ICON);
319 _ERR("failed to add icon");
321 lbl = utils_add_label(eo, di->title, STYLE_LABEL_RECENT_TITLE,
324 _ERR("failed to add title");
331 sub_lbl = utils_add_label(eo, di->subtitle,
332 STYLE_LABEL_RECENT_SUBTITLE,
333 PART_RECENT_SUBTITLE);
335 _ERR("failed to add sub title");
338 elm_object_focus_next_object_set(eo, priv->del_btn, ELM_FOCUS_UP);
339 inputmgr_add_callback(eo, INPUT_HANDLER_TYPE_EO, &handler, bi);
340 elm_box_pack_end(box, eo);
348 static void _load_recent(struct _priv *priv)
351 Evas_Object *scr, *box;
352 struct _bar_item *bi;
353 struct datamgr_item *di;
355 list = datamgr_get_items(priv->dm);
357 elm_object_part_text_set(priv->base, PART_RECENT_NO_CONTENTS,
358 MESSAGE_NO_CONTENTS);
359 _add_delete_btn(priv, IMAGE_RECENT_DELETE_DIS,
360 IMAGE_RECENT_DELETE_DIS,
361 INPUT_HANDLER_TYPE_DISABLE_DELETE);
365 scr = utils_add_scroller(priv->base);
367 _ERR("failed to add scroller");
371 box = utils_add_box(scr, true);
373 _ERR("failed to add box");
374 evas_object_del(scr);
377 elm_object_content_set(scr, box);
378 elm_object_part_content_set(priv->base, PART_RECENT_CONTENTS, scr);
379 elm_object_part_text_set(priv->base, PART_RECENT_NO_CONTENTS, "");
380 elm_box_padding_set(box, PADDING_BOX * elm_config_scale_get(), 0);
382 _add_delete_btn(priv, IMAGE_RECENT_DELETE_NOR, IMAGE_RECENT_DELETE_FOC,
383 INPUT_HANDLER_TYPE_DELETE);
385 EINA_LIST_FOREACH(list, l, di) {
386 bi = _pack_item(priv, box, di);
391 priv->list = eina_list_append(priv->list, bi);
397 static void _show(void *data)
400 struct _bar_item *bi;
403 _ERR("Invalid argument");
409 evas_object_show(priv->base);
410 elm_object_signal_emit(priv->base, SIG_SHOW_RECENT, SRC_PROG);
415 elm_object_focus_set(priv->del_btn, EINA_TRUE);
417 bi = eina_list_data_get(priv->list);
418 elm_object_focus_set(bi->eo, EINA_TRUE);
422 static void _unload_recent(struct _priv *priv)
424 struct _bar_item *bi;
426 EINA_LIST_FREE(priv->list, bi) {
427 inputmgr_remove_callback(bi->eo, &handler);
428 evas_object_del(bi->eo);
432 elm_box_clear(priv->box);
433 evas_object_del(priv->scr);
434 inputmgr_remove_callback(priv->del_btn, &handler);
435 evas_object_del(priv->del_btn);
437 priv->del_btn = NULL;
443 static void _hide(void *data)
448 _ERR("Invalid argument");
454 _unload_recent(priv);
456 evas_object_hide(priv->base);
459 static void _destroy(void *data)
464 _ERR("Invalid argument");
470 _unload_recent(priv);
472 datamgr_fini(priv->dm);
473 evas_object_del(priv->base);
477 static view_class vclass = {
478 .view_id = VIEW_RECENT,
485 view_class *view_recent_get_vclass(void)