2 * Copyright 2012 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://floralicense.org/license/
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include "quickpanel-ui.h"
21 #include "list_util.h"
22 #include "quickpanel_def.h"
23 #include "noti_listbox.h"
24 #include "noti_list_item.h"
26 #define E_DATA_LAYOUT_PORTRAIT "layout_portrait"
27 #define E_DATA_LAYOUT_LANDSCAPE "layout_landscape"
28 #define E_DATA_CB_DELETE_ITEM "cb_delete_item"
29 #define E_DATA_CB_REMOVED "cb_removed"
30 #define E_DATA_APP_DATA "app_data"
32 typedef struct _listbox_info_layout {
42 } listbox_info_layout;
44 typedef struct _listbox_info_animation {
48 void (*update_cb)(Evas_Object *list, void *data, int is_prepend);
49 Evas_Object *container;
52 } listbox_info_animation;
54 Evas_Object *listbox_create(Evas_Object *parent, void *data) {
55 struct appdata *ad = data;
56 Evas_Object *listbox = NULL;
58 retif(parent == NULL, NULL, "invalid parameter");
59 retif(data == NULL, NULL, "invalid parameter");
61 listbox = elm_box_add(parent);
62 evas_object_size_hint_weight_set(listbox, EVAS_HINT_EXPAND,
64 evas_object_size_hint_align_set(listbox, EVAS_HINT_FILL, EVAS_HINT_FILL);
65 elm_box_horizontal_set(listbox, EINA_FALSE);
66 evas_object_show(listbox);
68 evas_object_data_set(listbox, E_DATA_CB_DELETE_ITEM, NULL);
69 evas_object_data_set(listbox, E_DATA_APP_DATA, ad);
72 = quickpanel_list_util_item_new(QP_ITEM_TYPE_ONGOING_NOTI, NULL);
73 quickpanel_list_util_item_set_tag(listbox, qid);
78 void listbox_remove(Evas_Object *listbox) {
80 retif(listbox == NULL, , "invalid parameter");
82 listbox_remove_all_item(listbox, 0);
83 evas_object_data_del(listbox, E_DATA_CB_DELETE_ITEM);
84 evas_object_data_del(listbox, E_DATA_APP_DATA);
85 quickpanel_list_util_item_del_tag(listbox);
86 evas_object_del(listbox);
89 void listbox_set_item_deleted_cb(Evas_Object *listbox,
90 void(*deleted_cb)(void *data, Evas_Object *obj)) {
91 retif(listbox == NULL, , "invalid parameter");
92 retif(deleted_cb == NULL, , "invalid parameter");
94 evas_object_data_set(listbox, E_DATA_CB_DELETE_ITEM, deleted_cb);
97 static void _listbox_call_item_deleted_cb(Evas_Object *listbox, void *data,
99 retif(listbox == NULL, , "invalid parameter");
101 void (*deleted_cb)(void *data, Evas_Object *obj) = NULL;
103 deleted_cb = evas_object_data_get(listbox, E_DATA_CB_DELETE_ITEM);
105 if (deleted_cb != NULL) {
106 deleted_cb(data, obj);
110 void listbox_add_item(Evas_Object *listbox, Evas_Object *item, int is_prepend) {
111 const char *signal = NULL;
113 retif(listbox == NULL, , "invalid parameter");
114 retif(item == NULL, , "invalid parameter");
116 struct appdata *ad = evas_object_data_get(listbox, E_DATA_APP_DATA);
119 if (ad->angle == 270 || ad->angle == 90) {
120 signal = "box.landscape";
122 signal = "box.portrait";
126 DBG("set to %s, %x", signal, item);
128 elm_object_signal_emit(item, signal, "box.prog");
129 edje_object_message_signal_process(_EDJ(item));
130 elm_layout_sizing_eval(item);
132 if (is_prepend == LISTBOX_PREPEND)
133 elm_box_pack_start(listbox, item);
135 elm_box_pack_end(listbox, item);
138 static void _listbox_remove_item_anim_cb(void *data, Elm_Transit *transit) {
140 retif(data == NULL, , "invalid parameter");
141 retif(transit == NULL, , "invalid parameter");
143 listbox_info_animation *info_animation = data;
145 retif(info_animation->listbox == NULL, , "invalid parameter");
146 retif(info_animation->item == NULL, , "invalid parameter");
148 DBG("remove:%p", info_animation->item);
149 void *node = noti_list_item_node_get(info_animation->item);
150 elm_box_unpack(info_animation->listbox, info_animation->item);
151 noti_list_item_remove(info_animation->item);
152 _listbox_call_item_deleted_cb(info_animation->listbox,
155 if (info_animation->update_cb != NULL) {
156 retif(info_animation->container == NULL, , "invalid parameter");
157 retif(info_animation->noti == NULL, , "invalid parameter");
159 info_animation->update_cb(info_animation->container,
160 info_animation->noti, info_animation->pos);
163 free(info_animation);
164 info_animation = NULL;
167 void listbox_remove_item(Evas_Object *listbox, Evas_Object *item, int with_animation) {
168 retif(listbox == NULL, , "invalid parameter");
169 retif(item == NULL, , "invalid parameter");
171 if (noti_list_item_get_status(item) == STATE_DELETING) {
174 noti_list_item_set_status(item, STATE_DELETING);
176 DBG("remove:%p", item);
178 if (with_animation == 1) {
179 listbox_info_animation *info_animation = (listbox_info_animation *) malloc(
180 sizeof(listbox_info_animation));
181 if (info_animation == NULL)
183 info_animation->listbox = listbox;
184 info_animation->item = item;
185 info_animation->update_cb = NULL;
186 info_animation->container = NULL;
187 info_animation->noti = NULL;
188 info_animation->pos = 0;
190 Elm_Transit *transit = elm_transit_add();
191 //Fade in and out with layout object.
192 elm_transit_object_add(transit, item);
193 elm_transit_effect_fade_add(transit);
194 elm_transit_duration_set(transit, 0.7);
195 elm_transit_del_cb_set(transit, _listbox_remove_item_anim_cb,
197 elm_transit_go(transit);
200 void *node = noti_list_item_node_get(item);
201 elm_box_unpack(listbox, item);
202 noti_list_item_remove(item);
203 _listbox_call_item_deleted_cb(listbox,
208 void listbox_remove_all_item(Evas_Object *listbox, int with_animation) {
210 retif(listbox == NULL, , "invalid parameter");
215 Eina_List *item_list = elm_box_children_get(listbox);
217 EINA_LIST_FOREACH_SAFE(item_list, l, l_next, obj)
220 // call deleted callback
221 listbox_remove_item(listbox, obj, with_animation);
226 void listbox_update(Evas_Object *listbox) {
227 retif(listbox == NULL, , "invalid parameter");
232 Eina_List *item_list = elm_box_children_get(listbox);
234 DBG("all count:%d", eina_list_count(item_list));
236 EINA_LIST_FOREACH_SAFE(item_list, l, l_next, obj)
239 noti_list_item_update(obj);
244 void listbox_update_item(Evas_Object *listbox, Evas_Object *item) {
245 retif(listbox == NULL, , "invalid parameter");
246 retif(item == NULL, , "invalid parameter");
248 noti_list_item_update(item);
251 void listbox_remove_and_add_item(Evas_Object *listbox, Evas_Object *item
252 ,void (*update_cb)(Evas_Object *list, void *data, int is_prepend)
253 ,void *container, void *data, int pos) {
255 retif(listbox == NULL, , "invalid parameter");
256 retif(item == NULL, , "invalid parameter");
257 retif(update_cb == NULL, , "invalid parameter");
258 retif(container == NULL, , "invalid parameter");
259 retif(data == NULL, , "invalid parameter");
261 if (noti_list_item_get_status(item) == STATE_DELETING) {
264 noti_list_item_set_status(item, STATE_DELETING);
266 listbox_info_animation *info_animation = (listbox_info_animation *) malloc(
267 sizeof(listbox_info_animation));
268 if (info_animation == NULL)
270 info_animation->listbox = listbox;
271 info_animation->item = item;
272 info_animation->update_cb = update_cb;
273 info_animation->container = container;
274 info_animation->noti = data;
275 info_animation->pos = pos;
277 Elm_Transit *transit = elm_transit_add();
278 //Fade in and out with layout object.
279 elm_transit_object_add(transit, item);
280 elm_transit_effect_fade_add(transit);
281 elm_transit_duration_set(transit, 0.4);
282 elm_transit_del_cb_set(transit, _listbox_remove_item_anim_cb,
284 elm_transit_go(transit);
287 static void listbox_finalize_rotation_cb(void *data) {
288 retif(data == NULL, , "invalid parameter");
289 Evas_Object *listbox = data;
291 elm_box_recalculate(listbox);
294 void listbox_rotation(Evas_Object *listbox, int angle) {
295 const char *signal = NULL;
297 retif(listbox == NULL, , "invalid parameter");
302 Eina_List *item_list = elm_box_children_get(listbox);
304 if (angle == 270 || angle == 90) {
305 signal = "box.landscape";
307 signal = "box.portrait";
310 DBG("all count:%d", eina_list_count(item_list));
312 EINA_LIST_FOREACH_SAFE(item_list, l, l_next, obj)
315 elm_object_signal_emit(obj, signal, "box.prog");
316 edje_object_message_signal_process(_EDJ(obj));
317 elm_layout_sizing_eval(obj);
318 DBG("set to %s, %x", signal, obj);
322 DBG("Angle Rotation is %d", angle);