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