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");
316 elm_image_fill_outside_set(thumb, EINA_TRUE);
318 ic = utils_add_icon(eo, di->focus_icon, PART_RECENT_ICON);
320 _ERR("failed to add icon");
322 lbl = utils_add_label(eo, di->title, STYLE_LABEL_RECENT_TITLE,
325 _ERR("failed to add title");
332 sub_lbl = utils_add_label(eo, di->subtitle,
333 STYLE_LABEL_RECENT_SUBTITLE,
334 PART_RECENT_SUBTITLE);
336 _ERR("failed to add sub title");
339 elm_object_focus_next_object_set(eo, priv->del_btn, ELM_FOCUS_UP);
340 inputmgr_add_callback(eo, INPUT_HANDLER_TYPE_EO, &handler, bi);
341 elm_box_pack_end(box, eo);
349 static void _load_recent(struct _priv *priv)
352 Evas_Object *scr, *box;
353 struct _bar_item *bi;
354 struct datamgr_item *di;
356 list = datamgr_get_items(priv->dm);
358 elm_object_part_text_set(priv->base, PART_RECENT_NO_CONTENTS,
359 MESSAGE_NO_CONTENTS);
360 _add_delete_btn(priv, IMAGE_RECENT_DELETE_DIS,
361 IMAGE_RECENT_DELETE_DIS,
362 INPUT_HANDLER_TYPE_DISABLE_DELETE);
366 scr = utils_add_scroller(priv->base);
368 _ERR("failed to add scroller");
372 box = utils_add_box(scr, true);
374 _ERR("failed to add box");
375 evas_object_del(scr);
378 elm_object_content_set(scr, box);
379 elm_object_part_content_set(priv->base, PART_RECENT_CONTENTS, scr);
380 elm_object_part_text_set(priv->base, PART_RECENT_NO_CONTENTS, "");
381 elm_box_padding_set(box, PADDING_BOX * elm_config_scale_get(), 0);
383 _add_delete_btn(priv, IMAGE_RECENT_DELETE_NOR, IMAGE_RECENT_DELETE_FOC,
384 INPUT_HANDLER_TYPE_DELETE);
386 EINA_LIST_FOREACH(list, l, di) {
387 bi = _pack_item(priv, box, di);
392 priv->list = eina_list_append(priv->list, bi);
398 static void _show(void *data)
401 struct _bar_item *bi;
404 _ERR("Invalid argument");
410 evas_object_show(priv->base);
411 elm_object_signal_emit(priv->base, SIG_SHOW_RECENT, SRC_PROG);
416 elm_object_focus_set(priv->del_btn, EINA_TRUE);
418 bi = eina_list_data_get(priv->list);
419 elm_object_focus_set(bi->eo, EINA_TRUE);
423 static void _unload_recent(struct _priv *priv)
425 struct _bar_item *bi;
427 EINA_LIST_FREE(priv->list, bi) {
428 inputmgr_remove_callback(bi->eo, &handler);
429 evas_object_del(bi->eo);
433 elm_box_clear(priv->box);
434 evas_object_del(priv->scr);
435 inputmgr_remove_callback(priv->del_btn, &handler);
436 evas_object_del(priv->del_btn);
438 priv->del_btn = NULL;
444 static void _hide(void *data)
449 _ERR("Invalid argument");
455 _unload_recent(priv);
457 evas_object_hide(priv->base);
460 static void _destroy(void *data)
465 _ERR("Invalid argument");
471 _unload_recent(priv);
473 datamgr_fini(priv->dm);
474 evas_object_del(priv->base);
478 static view_class vclass = {
479 .view_id = VIEW_RECENT,
486 view_class *view_recent_get_vclass(void)