elementary: slideshow fix cache build
[framework/uifw/elementary.git] / src / lib / elm_slideshow.c
1 #include <Elementary.h>
2 #include "elm_priv.h"
3
4 typedef struct _Widget_Data Widget_Data;
5
6 struct _Elm_Slideshow_Item
7 {
8    Elm_Widget_Item base;
9
10    Eina_List *l, *l_built;
11
12    const Elm_Slideshow_Item_Class *itc;
13 };
14
15 struct _Widget_Data
16 {
17    Evas_Object *slideshow;
18
19    // list of Elm_Slideshow_Item*
20    Eina_List *items;
21    Eina_List *items_built;
22
23    Elm_Slideshow_Item *current;
24    Elm_Slideshow_Item *previous;
25
26    Eina_List *transitions;
27    const char *transition;
28
29    int count_item_pre_before;
30    int count_item_pre_after;
31    Ecore_Timer *timer;
32    double timeout;
33    Eina_Bool loop:1;
34
35    struct {
36         const char *current;
37         Eina_List *list; //list of const char *
38    } layout;
39 };
40
41 static const char *widtype = NULL;
42 static void _del_hook(Evas_Object *obj);
43 static void _mirrored_set(Evas_Object *obj, Eina_Bool rtl);
44 static void _theme_hook(Evas_Object *obj);
45 static void _sizing_eval(Evas_Object *obj);
46 static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info);
47 static Eina_Bool _timer_cb(void *data);
48 static void _on_focus_hook(void *data, Evas_Object *obj);
49 static Eina_Bool _event_hook(Evas_Object *obj, Evas_Object *src,
50                              Evas_Callback_Type type, void *event_info);
51
52 static const char SIG_CHANGED[] = "changed";
53
54 static const Evas_Smart_Cb_Description _signals[] = {
55    {SIG_CHANGED, ""},
56    {NULL, NULL}
57 };
58
59 static Eina_Bool
60 _event_hook(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_Type type, void *event_info)
61 {
62    if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
63    Evas_Event_Key_Down *ev = event_info;
64    Widget_Data *wd = elm_widget_data_get(obj);
65    if (!wd) return EINA_FALSE;
66    if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
67    if (elm_widget_disabled_get(obj)) return EINA_FALSE;
68    if ((!strcmp(ev->keyname, "Left")) || (!strcmp(ev->keyname, "KP_Left")))
69      {
70         elm_slideshow_previous(obj);
71         ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
72         return EINA_TRUE;
73      }
74    if ((!strcmp(ev->keyname, "Right")) || (!strcmp(ev->keyname, "KP_Right")))
75      {
76         elm_slideshow_next(obj);
77         ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
78         return EINA_TRUE;
79      }
80    if ((!strcmp(ev->keyname, "Return")) ||
81        (!strcmp(ev->keyname, "KP_Enter")) ||
82        (!strcmp(ev->keyname, "space")))
83      {
84         if (wd->timeout)
85           {
86              if (wd->timer)
87                {
88                   ecore_timer_del(wd->timer);
89                   wd->timer = NULL;
90                }
91              else
92                elm_slideshow_timeout_set(obj, wd->timeout);
93           }
94         ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
95         return EINA_TRUE;
96      }
97    return EINA_FALSE;
98 }
99
100 static void
101 _del_hook(Evas_Object *obj)
102 {
103    const char *layout;
104    Widget_Data *wd = elm_widget_data_get(obj);
105    if (!wd) return;
106    elm_slideshow_clear(obj);
107    elm_widget_stringlist_free(wd->transitions);
108    if (wd->timer) ecore_timer_del(wd->timer);
109    EINA_LIST_FREE(wd->layout.list, layout)
110       eina_stringshare_del(layout);
111    free(wd);
112 }
113
114 static void
115 _on_focus_hook(void *data __UNUSED__, Evas_Object *obj)
116 {
117    Widget_Data *wd = elm_widget_data_get(obj);
118    if (!wd) return;
119    if (elm_widget_focus_get(obj))
120      {
121         edje_object_signal_emit(wd->slideshow, "elm,action,focus", "elm");
122         evas_object_focus_set(wd->slideshow, EINA_TRUE);
123      }
124    else
125      {
126         edje_object_signal_emit(wd->slideshow, "elm,action,unfocus", "elm");
127         evas_object_focus_set(wd->slideshow, EINA_FALSE);
128      }
129 }
130
131 static void
132 _mirrored_set(Evas_Object *obj, Eina_Bool rtl)
133 {
134    Widget_Data *wd = elm_widget_data_get(obj);
135    if (!wd) return;
136    edje_object_mirrored_set(wd->slideshow, rtl);
137 }
138
139 static void
140 _theme_hook(Evas_Object *obj)
141 {
142    Widget_Data *wd = elm_widget_data_get(obj);
143    if (!wd) return;
144    _elm_widget_mirrored_reload(obj);
145    _mirrored_set(obj, elm_widget_mirrored_get(obj));
146    _elm_theme_object_set(obj, wd->slideshow, "slideshow", "base", elm_widget_style_get(obj));
147    edje_object_scale_set(wd->slideshow, elm_widget_scale_get(obj) *
148                          _elm_config->scale);
149    _sizing_eval(obj);
150 }
151
152 static void
153 _sizing_eval(Evas_Object *obj)
154 {
155    Widget_Data *wd = elm_widget_data_get(obj);
156    Evas_Coord minw = -1, minh = -1;
157    if (!wd) return;
158    edje_object_size_min_calc(wd->slideshow, &minw, &minh);
159    evas_object_size_hint_min_set(obj, minw, minh);
160    evas_object_size_hint_max_set(obj, minw, minh);
161 }
162
163
164 static Elm_Slideshow_Item* _item_prev_get(Elm_Slideshow_Item* item)
165 {
166    Widget_Data *wd = elm_widget_data_get(item->base.widget);
167    Elm_Slideshow_Item* prev = eina_list_data_get(eina_list_prev(item->l));
168    if ((!prev) && (wd->loop))
169      prev = eina_list_data_get(eina_list_last(item->l));
170    return prev;
171 }
172
173 static Elm_Slideshow_Item* _item_next_get(Elm_Slideshow_Item* item)
174 {
175    Widget_Data *wd = elm_widget_data_get(item->base.widget);
176    Elm_Slideshow_Item* next = eina_list_data_get(eina_list_next(item->l));
177    if ((!next) && (wd->loop))
178      next = eina_list_data_get(wd->items);
179    return next;
180 }
181
182 static void
183 _changed_size_hints(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
184 {
185    _sizing_eval(data);
186 }
187
188 static void
189 _sub_del(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
190 {
191    ;
192 }
193
194 static void
195 _item_realize(Elm_Slideshow_Item *item)
196 {
197    Elm_Slideshow_Item *_item_prev, *_item_next;
198    Evas_Object *obj = item->base.widget;
199    Widget_Data *wd = elm_widget_data_get(obj);
200    int ac, bc, lc, ic = 0;
201
202    if (!wd) return;
203    if ((!item->base.view) && (item->itc->func.get))
204      {
205         item->base.view = item->itc->func.get((void*)item->base.data, obj);
206         evas_object_smart_member_add(item->base.view, obj);
207         item->l_built = eina_list_append(NULL, item);
208         wd->items_built = eina_list_merge(wd->items_built, item->l_built);
209         evas_object_hide(item->base.view);
210      }
211    else if (item->l_built)
212      wd->items_built = eina_list_demote_list(wd->items_built, item->l_built);
213
214    //pre-create previous and next item
215    ac = wd->count_item_pre_after;
216    _item_next = item;
217    bc = wd->count_item_pre_before;
218    _item_prev = item;
219    lc = eina_list_count(wd->items) - 1;
220    while (lc > 0 && ((ac > 0) || (bc > 0)))
221      {
222         if (lc > 0 && ac > 0)
223           {
224              --ac;
225              --lc;
226              if (_item_next)
227                {
228                   _item_next = _item_next_get(_item_next);
229                   if ((_item_next)
230                       && (!_item_next->base.view)
231                       && (_item_next->itc->func.get))
232                     {
233                        ic++;
234                        _item_next->base.view =
235                           _item_next->itc->func.get(
236                              (void*)_item_next->base.data, obj);
237                        evas_object_smart_member_add(_item_next->base.view, obj);
238                        _item_next->l_built = eina_list_append(NULL, _item_next);
239                        wd->items_built = eina_list_merge(wd->items_built,
240                                                          _item_next->l_built);
241                        evas_object_hide(_item_next->base.view);
242                     }
243                   else if (_item_next && _item_next->l_built)
244                     {
245                        ic++;
246                        wd->items_built =
247                            eina_list_demote_list(wd->items_built,
248                                              _item_next->l_built);
249                     }
250                }
251           }
252
253         if (lc > 0 && bc > 0)
254           {
255              --bc;
256              --lc;
257              if (_item_prev)
258                {
259                   _item_prev = _item_prev_get(_item_prev);
260                   if ((_item_prev)
261                       && (!_item_prev->base.view)
262                       && (_item_prev->itc->func.get))
263                     {
264                        ic++;
265                        _item_prev->base.view =
266                           _item_prev->itc->func.get(
267                              (void*)_item_prev->base.data, obj);
268                        evas_object_smart_member_add(_item_prev->base.view, obj);
269                        _item_prev->l_built = eina_list_append(NULL, _item_prev);
270                        wd->items_built = eina_list_merge(wd->items_built,
271                                                          _item_prev->l_built);
272                        evas_object_hide(_item_prev->base.view);
273                     }
274                   else if (_item_prev && _item_prev->l_built)
275                     {
276                        ic++;
277                        wd->items_built =
278                            eina_list_demote_list(wd->items_built,
279                                              _item_prev->l_built);
280                     }
281                }
282           }
283      }
284
285    //delete unused items
286    lc = ic + 1;
287    while ((int)eina_list_count(wd->items_built) > lc)
288      {
289         item = eina_list_data_get(wd->items_built);
290         wd->items_built = eina_list_remove_list(wd->items_built,
291                                                 wd->items_built);
292         if (item->itc->func.del)
293           item->itc->func.del((void*)item->base.data, item->base.view);
294         evas_object_del(item->base.view);
295         item->base.view = NULL;
296      }
297 }
298
299 static void
300 _end(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
301 {
302    Elm_Slideshow_Item *item;
303    Widget_Data *wd = elm_widget_data_get(data);
304    if (!wd) return;
305
306    item = wd->previous;
307    if (item)
308      {
309         edje_object_part_unswallow(NULL, item->base.view);
310         evas_object_hide(item->base.view);
311         wd->previous = NULL;
312      }
313
314
315    item = wd->current;
316    if ((!item) || (!item->base.view)) return;
317
318    _item_realize(item);
319    edje_object_part_unswallow(NULL, item->base.view);
320    evas_object_show(item->base.view);
321
322    edje_object_signal_emit(wd->slideshow, "anim,end", "slideshow");
323    edje_object_part_swallow(wd->slideshow, "elm.swallow.1", item->base.view);
324 }
325
326 static Eina_Bool
327 _timer_cb(void *data)
328 {
329    Evas_Object *obj = data;
330    Widget_Data *wd = elm_widget_data_get(obj);
331    if (!wd) return ECORE_CALLBACK_CANCEL;
332    wd->timer = NULL;
333    elm_slideshow_next(obj);
334    return ECORE_CALLBACK_CANCEL;
335 }
336
337 EAPI Evas_Object *
338 elm_slideshow_add(Evas_Object *parent)
339 {
340    Evas_Object *obj;
341    Evas *e;
342    Widget_Data *wd;
343
344    ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
345
346    ELM_SET_WIDTYPE(widtype, "slideshow");
347    elm_widget_type_set(obj, "slideshow");
348    elm_widget_sub_object_add(parent, obj);
349    elm_widget_on_focus_hook_set(obj, _on_focus_hook, NULL);
350    elm_widget_data_set(obj, wd);
351    elm_widget_del_hook_set(obj, _del_hook);
352    elm_widget_theme_hook_set(obj, _theme_hook);
353    elm_widget_can_focus_set(obj, EINA_TRUE);
354    elm_widget_event_hook_set(obj, _event_hook);
355
356    wd->current = NULL;
357    wd->previous = NULL;
358
359    wd->slideshow = edje_object_add(e);
360    _elm_theme_object_set(obj, wd->slideshow, "slideshow", "base", "default");
361    evas_object_smart_member_add(wd->slideshow, obj);
362    wd->count_item_pre_before = 2;
363    wd->count_item_pre_after = 2;
364    elm_widget_resize_object_set(obj, wd->slideshow);
365    evas_object_show(wd->slideshow);
366
367    wd->transitions = elm_widget_stringlist_get(edje_object_data_get(wd->slideshow, "transitions"));
368    if (eina_list_count(wd->transitions) > 0)
369      wd->transition = eina_stringshare_add(eina_list_data_get(wd->transitions));
370
371    wd->layout.list = elm_widget_stringlist_get(edje_object_data_get(wd->slideshow, "layouts"));
372    if (eina_list_count(wd->layout.list) > 0)
373      wd->layout.current = eina_list_data_get(wd->layout.list);
374
375    edje_object_signal_callback_add(wd->slideshow, "end", "slideshow", _end, obj);
376
377    evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj);
378    evas_object_event_callback_add(obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, obj);
379
380    evas_object_smart_callbacks_descriptions_set(obj, _signals);
381
382    _mirrored_set(obj, elm_widget_mirrored_get(obj));
383    _sizing_eval(obj);
384    return obj;
385 }
386
387 EAPI Elm_Slideshow_Item*
388 elm_slideshow_item_add(Evas_Object *obj, const Elm_Slideshow_Item_Class *itc, const void *data)
389 {
390    Elm_Slideshow_Item *item;
391    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
392    Widget_Data *wd = elm_widget_data_get(obj);
393
394    if (!wd) return NULL;
395    item = elm_widget_item_new(obj, Elm_Slideshow_Item);
396    item->base.data = data;
397    item->itc = itc;
398    item->l = eina_list_append(item->l, item);
399
400    wd->items = eina_list_merge(wd->items, item->l);
401
402    if (!wd->current) elm_slideshow_show(item);
403
404    return item;
405 }
406
407 EAPI Elm_Slideshow_Item*
408 elm_slideshow_item_sorted_insert(Evas_Object *obj, const Elm_Slideshow_Item_Class *itc, const void *data, Eina_Compare_Cb func)
409 {
410    Elm_Slideshow_Item *item;
411    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
412    Widget_Data *wd = elm_widget_data_get(obj);
413
414    if (!wd) return NULL;
415    item = elm_widget_item_new(obj, Elm_Slideshow_Item);
416    item->base.data = data;
417    item->itc = itc;
418    item->l = eina_list_append(item->l, item);
419
420    wd->items = eina_list_sorted_merge(wd->items, item->l, func);
421
422    if (!wd->current) elm_slideshow_show(item);
423
424    return item;
425 }
426
427 EAPI void
428 elm_slideshow_show(Elm_Slideshow_Item *item)
429 {
430    char buf[1024];
431    Elm_Slideshow_Item *next = NULL;
432    Widget_Data *wd;
433    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item);
434    wd = elm_widget_data_get(item->base.widget);
435    if (!wd)
436      return;
437    if (item == wd->current)
438      return;
439
440    next = item;
441    _end(item->base.widget, item->base.widget, NULL, NULL);
442
443    if (wd->timer) ecore_timer_del(wd->timer);
444    if (wd->timeout > 0.0)
445      wd->timer = ecore_timer_add(wd->timeout, _timer_cb, item->base.widget);
446    _item_realize(next);
447    edje_object_part_swallow(wd->slideshow, "elm.swallow.2", next->base.view);
448    evas_object_show(next->base.view);
449    snprintf(buf, sizeof(buf), "%s,next", wd->transition);
450    edje_object_signal_emit(wd->slideshow, buf, "slideshow");
451    wd->previous = wd->current;
452    wd->current = next;
453    evas_object_smart_callback_call(item->base.widget, SIG_CHANGED, wd->current);
454 }
455
456 EAPI void
457 elm_slideshow_next(Evas_Object *obj)
458 {
459    char buf[1024];
460    Elm_Slideshow_Item *next = NULL;
461    ELM_CHECK_WIDTYPE(obj, widtype);
462    Widget_Data *wd = elm_widget_data_get(obj);
463
464    if (!wd) return;
465
466    if (wd->current)
467      next = _item_next_get(wd->current);
468
469    if ((!next) || (next == wd->current)) return;
470
471    _end(obj, obj, NULL, NULL);
472
473    if (wd->timer) ecore_timer_del(wd->timer);
474    if (wd->timeout > 0.0)
475      wd->timer = ecore_timer_add(wd->timeout, _timer_cb, obj);
476
477    _item_realize(next);
478
479    edje_object_part_swallow(wd->slideshow, "elm.swallow.2", next->base.view);
480    evas_object_show(next->base.view);
481
482    snprintf(buf, sizeof(buf), "%s,next", wd->transition);
483    edje_object_signal_emit(wd->slideshow, buf, "slideshow");
484
485    wd->previous = wd->current;
486    wd->current = next;
487    evas_object_smart_callback_call(obj, SIG_CHANGED, wd->current);
488 }
489
490 EAPI void
491 elm_slideshow_previous(Evas_Object *obj)
492 {
493    char buf[1024];
494    Elm_Slideshow_Item *prev = NULL;
495    ELM_CHECK_WIDTYPE(obj, widtype);
496    Widget_Data *wd = elm_widget_data_get(obj);
497
498    if (!wd) return;
499
500    if (wd->current)
501      prev = _item_prev_get(wd->current);
502
503    if ((!prev) ||  (prev == wd->current)) return;
504
505    _end(obj, obj, NULL, NULL);
506
507    if (wd->timer) ecore_timer_del(wd->timer);
508    if (wd->timeout > 0.0)
509      wd->timer = ecore_timer_add(wd->timeout, _timer_cb, obj);
510
511    _item_realize(prev);
512
513    edje_object_part_swallow(wd->slideshow, "elm.swallow.2", prev->base.view);
514    evas_object_show(prev->base.view);
515
516    snprintf(buf, 1024, "%s,previous", wd->transition);
517    edje_object_signal_emit(wd->slideshow, buf, "slideshow");
518
519    wd->previous = wd->current;
520    wd->current = prev;
521    evas_object_smart_callback_call(obj, SIG_CHANGED, wd->current);
522 }
523
524 EAPI const Eina_List *
525 elm_slideshow_transitions_get(const Evas_Object *obj)
526 {
527    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
528    Widget_Data *wd = elm_widget_data_get(obj);
529    if (!wd) return NULL;
530    return wd->transitions;
531 }
532
533 EAPI const Eina_List *
534 elm_slideshow_layouts_get(const Evas_Object *obj)
535 {
536    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
537    Widget_Data *wd = elm_widget_data_get(obj);
538    if (!wd) return NULL;
539    return wd->layout.list;
540 }
541
542 EAPI void
543 elm_slideshow_transition_set(Evas_Object *obj, const char *transition)
544 {
545    ELM_CHECK_WIDTYPE(obj, widtype);
546    Widget_Data *wd = elm_widget_data_get(obj);
547    if (!wd) return;
548    eina_stringshare_replace(&wd->transition, transition);
549 }
550
551 EAPI const char *
552 elm_slideshow_transition_get(const Evas_Object *obj)
553 {
554    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
555    Widget_Data *wd = elm_widget_data_get(obj);
556    if (!wd) return NULL;
557    return wd->transition;
558 }
559
560 EAPI void
561 elm_slideshow_timeout_set(Evas_Object *obj, double timeout)
562 {
563    ELM_CHECK_WIDTYPE(obj, widtype);
564    Widget_Data *wd = elm_widget_data_get(obj);
565    if (!wd) return;
566    wd->timeout = timeout;
567    if (wd->timer) ecore_timer_del(wd->timer);
568    wd->timer = NULL;
569    if (timeout > 0.0)
570      wd->timer = ecore_timer_add(timeout, _timer_cb, obj);
571 }
572
573 EAPI double
574 elm_slideshow_timeout_get(const Evas_Object *obj)
575 {
576    ELM_CHECK_WIDTYPE(obj, widtype) -1.0;
577    Widget_Data *wd = elm_widget_data_get(obj);
578    if (!wd) return -1.0;
579    return wd->timeout;
580 }
581
582 EAPI void
583 elm_slideshow_loop_set(Evas_Object *obj, Eina_Bool loop)
584 {
585    ELM_CHECK_WIDTYPE(obj, widtype);
586    Widget_Data *wd = elm_widget_data_get(obj);
587    if (!wd) return;
588    wd->loop = loop;
589 }
590
591 EAPI const char *
592 elm_slideshow_layout_get(const Evas_Object *obj)
593 {
594    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
595    Widget_Data *wd = elm_widget_data_get(obj);
596    if (!wd) return EINA_FALSE;
597    return wd->layout.current;
598 }
599
600 EAPI void
601 elm_slideshow_layout_set(Evas_Object *obj, const char *layout)
602 {
603    char buf[PATH_MAX];
604    ELM_CHECK_WIDTYPE(obj, widtype);
605    Widget_Data *wd = elm_widget_data_get(obj);
606    if (!wd) return;
607
608    wd->layout.current = layout;
609    snprintf(buf, sizeof(buf), "layout,%s", layout);
610    edje_object_signal_emit(wd->slideshow, buf, "slideshow");
611 }
612
613 EAPI Eina_Bool
614 elm_slideshow_loop_get(const Evas_Object *obj)
615 {
616    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
617    Widget_Data *wd = elm_widget_data_get(obj);
618    if (!wd) return EINA_FALSE;
619    return wd->loop;
620 }
621
622 EAPI void
623 elm_slideshow_clear(Evas_Object *obj)
624 {
625    Elm_Slideshow_Item *item;
626    ELM_CHECK_WIDTYPE(obj, widtype);
627    Widget_Data *wd = elm_widget_data_get(obj);
628    if (!wd) return;
629    wd->previous = NULL;
630    wd->current = NULL;
631    EINA_LIST_FREE(wd->items_built, item)
632      {
633         if (item->itc->func.del)
634           item->itc->func.del((void*)item->base.data, item->base.view);
635         evas_object_del(item->base.view);
636         item->base.view = NULL;
637      }
638
639    EINA_LIST_FREE(wd->items, item)
640      {
641         elm_widget_item_del(item);
642      }
643 }
644
645 EAPI void
646 elm_slideshow_item_del(Elm_Slideshow_Item *item)
647 {
648    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item);
649    Widget_Data *wd = elm_widget_data_get(item->base.widget);
650    if (!wd) return;
651    if (wd->previous == item) wd->previous = NULL;
652    if (wd->current == item)
653      {
654         Elm_Slideshow_Item *p = NULL;
655         Eina_List *l = eina_list_data_find_list(wd->items, item);
656         Eina_List *l2 = eina_list_next(l);
657         wd->current = NULL;
658         if (!l2)
659           {
660             l2 = eina_list_prev(l);
661             if (l2)
662                elm_slideshow_show(eina_list_data_get(l2));
663
664           }
665         else
666           elm_slideshow_show(eina_list_data_get(l2));
667      }
668
669    wd->items = eina_list_remove_list(wd->items, item->l);
670    wd->items_built = eina_list_remove_list(wd->items_built, item->l_built);
671
672    if ((item->base.view) && (item->itc->func.del))
673      item->itc->func.del((void*)item->base.data, item->base.view);
674    if (item->base.view)
675      evas_object_del(item->base.view);
676    free(item);
677 }
678
679 EAPI const Eina_List *
680 elm_slideshow_items_get(const Evas_Object *obj)
681 {
682    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
683    Widget_Data *wd = elm_widget_data_get(obj);
684    if (!wd) return NULL;
685    return wd->items;
686 }
687
688 EAPI Elm_Slideshow_Item *
689 elm_slideshow_item_current_get(const Evas_Object *obj)
690 {
691    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
692    Widget_Data *wd = elm_widget_data_get(obj);
693    if (!wd) return NULL;
694    return wd->current;
695 }
696
697 EAPI Evas_Object *
698 elm_slideshow_item_object_get(const Elm_Slideshow_Item * item)
699 {
700    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item, NULL);
701    return item->base.view;
702 }
703
704 EAPI void *
705 elm_slideshow_item_data_get(const Elm_Slideshow_Item * item)
706 {
707    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item, NULL);
708    return elm_widget_item_data_get(item);
709 }
710
711 EAPI int
712 elm_slideshow_cache_before_get(const Evas_Object *obj)
713 {
714    ELM_CHECK_WIDTYPE(obj, widtype) -1;
715    Widget_Data *wd = elm_widget_data_get(obj);
716    if (!wd) return -1;
717    return wd->count_item_pre_before;
718 }
719
720 EAPI void
721 elm_slideshow_cache_before_set(Evas_Object *obj, int count)
722 {
723    ELM_CHECK_WIDTYPE(obj, widtype);
724    Widget_Data *wd = elm_widget_data_get(obj);
725    if (!wd) return;
726    if (count < 0) count = 0;
727    wd->count_item_pre_before = count;
728 }
729
730 EAPI int
731 elm_slideshow_cache_after_get(const Evas_Object *obj)
732 {
733    ELM_CHECK_WIDTYPE(obj, widtype) -1;
734    Widget_Data *wd = elm_widget_data_get(obj);
735    if (!wd) return -1;
736    return wd->count_item_pre_after;
737 }
738
739 EAPI void
740 elm_slideshow_cache_after_set(Evas_Object *obj, int count)
741 {
742    ELM_CHECK_WIDTYPE(obj, widtype);
743    Widget_Data *wd = elm_widget_data_get(obj);
744    if (!wd) return;
745    if (count < 0) count = 0;
746    wd->count_item_pre_after = count;
747 }
748
749 EAPI Elm_Slideshow_Item *
750 elm_slideshow_item_nth_get(const Evas_Object *obj, unsigned int nth)
751 {
752    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
753    Widget_Data *wd = elm_widget_data_get(obj);
754    if (!wd) return NULL;
755    return eina_list_nth(wd->items, nth);
756 }
757
758 EAPI unsigned int
759 elm_slideshow_count_get(const Evas_Object *obj)
760 {
761    ELM_CHECK_WIDTYPE(obj, widtype) 0;
762    Widget_Data *wd = elm_widget_data_get(obj);
763    if (!wd) return 0;
764    return eina_list_count(wd->items);
765 }