Elementary migration revision 69832
[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    wd->timer = NULL;
498    if (wd->timeout > 0.0)
499      wd->timer = ecore_timer_add(wd->timeout, _timer_cb, WIDGET(item));
500    _item_realize(next);
501    edje_object_part_swallow(wd->slideshow, "elm.swallow.2", VIEW(next));
502    snprintf(buf, sizeof(buf), "%s,next", wd->transition);
503    edje_object_signal_emit(wd->slideshow, buf, "slideshow");
504    wd->previous = wd->current;
505    wd->current = next;
506    evas_object_smart_callback_call(WIDGET(item), SIG_CHANGED, wd->current);
507 }
508
509 EAPI void
510 elm_slideshow_next(Evas_Object *obj)
511 {
512    char buf[1024];
513    Elm_Slideshow_Item *next = NULL;
514    ELM_CHECK_WIDTYPE(obj, widtype);
515    Widget_Data *wd = elm_widget_data_get(obj);
516
517    if (!wd) return;
518
519    if (wd->current)
520      next = _item_next_get(wd->current);
521
522    if ((!next) || (next == wd->current)) return;
523
524    _end(obj, obj, NULL, NULL);
525
526    if (wd->timer) ecore_timer_del(wd->timer);
527    wd->timer = NULL;
528    if (wd->timeout > 0.0)
529      wd->timer = ecore_timer_add(wd->timeout, _timer_cb, obj);
530
531    _item_realize(next);
532
533    edje_object_part_swallow(wd->slideshow, "elm.swallow.2", VIEW(next));
534
535    snprintf(buf, sizeof(buf), "%s,next", wd->transition);
536    edje_object_signal_emit(wd->slideshow, buf, "slideshow");
537
538    wd->previous = wd->current;
539    wd->current = next;
540    evas_object_smart_callback_call(obj, SIG_CHANGED, wd->current);
541 }
542
543 EAPI void
544 elm_slideshow_previous(Evas_Object *obj)
545 {
546    char buf[1024];
547    Elm_Slideshow_Item *prev = NULL;
548    ELM_CHECK_WIDTYPE(obj, widtype);
549    Widget_Data *wd = elm_widget_data_get(obj);
550
551    if (!wd) return;
552
553    if (wd->current)
554      prev = _item_prev_get(wd->current);
555
556    if ((!prev) ||  (prev == wd->current)) return;
557
558    _end(obj, obj, NULL, NULL);
559
560    if (wd->timer) ecore_timer_del(wd->timer);
561    wd->timer = NULL;
562    if (wd->timeout > 0.0)
563      wd->timer = ecore_timer_add(wd->timeout, _timer_cb, obj);
564
565    _item_realize(prev);
566
567    edje_object_part_swallow(wd->slideshow, "elm.swallow.2", VIEW(prev));
568
569    snprintf(buf, 1024, "%s,previous", wd->transition);
570    edje_object_signal_emit(wd->slideshow, buf, "slideshow");
571
572    wd->previous = wd->current;
573    wd->current = prev;
574    evas_object_smart_callback_call(obj, SIG_CHANGED, wd->current);
575 }
576
577 EAPI const Eina_List *
578 elm_slideshow_transitions_get(const Evas_Object *obj)
579 {
580    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
581    Widget_Data *wd = elm_widget_data_get(obj);
582    if (!wd) return NULL;
583    return wd->transitions;
584 }
585
586 EAPI const Eina_List *
587 elm_slideshow_layouts_get(const Evas_Object *obj)
588 {
589    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
590    Widget_Data *wd = elm_widget_data_get(obj);
591    if (!wd) return NULL;
592    return wd->layout.list;
593 }
594
595 EAPI void
596 elm_slideshow_transition_set(Evas_Object *obj, const char *transition)
597 {
598    ELM_CHECK_WIDTYPE(obj, widtype);
599    Widget_Data *wd = elm_widget_data_get(obj);
600    if (!wd) return;
601    eina_stringshare_replace(&wd->transition, transition);
602 }
603
604 EAPI const char *
605 elm_slideshow_transition_get(const Evas_Object *obj)
606 {
607    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
608    Widget_Data *wd = elm_widget_data_get(obj);
609    if (!wd) return NULL;
610    return wd->transition;
611 }
612
613 EAPI void
614 elm_slideshow_timeout_set(Evas_Object *obj, double timeout)
615 {
616    ELM_CHECK_WIDTYPE(obj, widtype);
617    Widget_Data *wd = elm_widget_data_get(obj);
618    if (!wd) return;
619    wd->timeout = timeout;
620    if (wd->timer) ecore_timer_del(wd->timer);
621    wd->timer = NULL;
622    if (timeout > 0.0)
623      wd->timer = ecore_timer_add(timeout, _timer_cb, obj);
624 }
625
626 EAPI double
627 elm_slideshow_timeout_get(const Evas_Object *obj)
628 {
629    ELM_CHECK_WIDTYPE(obj, widtype) -1.0;
630    Widget_Data *wd = elm_widget_data_get(obj);
631    if (!wd) return -1.0;
632    return wd->timeout;
633 }
634
635 EAPI void
636 elm_slideshow_loop_set(Evas_Object *obj, Eina_Bool loop)
637 {
638    ELM_CHECK_WIDTYPE(obj, widtype);
639    Widget_Data *wd = elm_widget_data_get(obj);
640    if (!wd) return;
641    wd->loop = loop;
642 }
643
644 EAPI const char *
645 elm_slideshow_layout_get(const Evas_Object *obj)
646 {
647    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
648    Widget_Data *wd = elm_widget_data_get(obj);
649    if (!wd) return EINA_FALSE;
650    return wd->layout.current;
651 }
652
653 EAPI void
654 elm_slideshow_layout_set(Evas_Object *obj, const char *layout)
655 {
656    char buf[PATH_MAX];
657    ELM_CHECK_WIDTYPE(obj, widtype);
658    Widget_Data *wd = elm_widget_data_get(obj);
659    if (!wd) return;
660
661    wd->layout.current = layout;
662    snprintf(buf, sizeof(buf), "layout,%s", layout);
663    edje_object_signal_emit(wd->slideshow, buf, "slideshow");
664 }
665
666 EAPI Eina_Bool
667 elm_slideshow_loop_get(const Evas_Object *obj)
668 {
669    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
670    Widget_Data *wd = elm_widget_data_get(obj);
671    if (!wd) return EINA_FALSE;
672    return wd->loop;
673 }
674
675 EAPI void
676 elm_slideshow_clear(Evas_Object *obj)
677 {
678    Elm_Slideshow_Item *item;
679    ELM_CHECK_WIDTYPE(obj, widtype);
680    Widget_Data *wd = elm_widget_data_get(obj);
681    if (!wd) return;
682    wd->previous = NULL;
683    wd->current = NULL;
684    EINA_LIST_FREE(wd->items_built, item)
685      {
686         if (item->itc->func.del)
687           item->itc->func.del(elm_widget_item_data_get(item), VIEW(item));
688      }
689
690    EINA_LIST_FREE(wd->items, item)
691      elm_widget_item_free(item);
692 }
693
694 EAPI const Eina_List *
695 elm_slideshow_items_get(const Evas_Object *obj)
696 {
697    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
698    Widget_Data *wd = elm_widget_data_get(obj);
699    if (!wd) return NULL;
700    return wd->items;
701 }
702
703 EAPI Elm_Object_Item *
704 elm_slideshow_item_current_get(const Evas_Object *obj)
705 {
706    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
707    Widget_Data *wd = elm_widget_data_get(obj);
708    if (!wd) return NULL;
709    return (Elm_Object_Item *) wd->current;
710 }
711
712 EAPI Evas_Object *
713 elm_slideshow_item_object_get(const Elm_Object_Item * it)
714 {
715    ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
716    return VIEW(it);
717 }
718
719 EAPI int
720 elm_slideshow_cache_before_get(const Evas_Object *obj)
721 {
722    ELM_CHECK_WIDTYPE(obj, widtype) -1;
723    Widget_Data *wd = elm_widget_data_get(obj);
724    if (!wd) return -1;
725    return wd->count_item_pre_before;
726 }
727
728 EAPI void
729 elm_slideshow_cache_before_set(Evas_Object *obj, int count)
730 {
731    ELM_CHECK_WIDTYPE(obj, widtype);
732    Widget_Data *wd = elm_widget_data_get(obj);
733    if (!wd) return;
734    if (count < 0) count = 0;
735    wd->count_item_pre_before = count;
736 }
737
738 EAPI int
739 elm_slideshow_cache_after_get(const Evas_Object *obj)
740 {
741    ELM_CHECK_WIDTYPE(obj, widtype) -1;
742    Widget_Data *wd = elm_widget_data_get(obj);
743    if (!wd) return -1;
744    return wd->count_item_pre_after;
745 }
746
747 EAPI void
748 elm_slideshow_cache_after_set(Evas_Object *obj, int count)
749 {
750    ELM_CHECK_WIDTYPE(obj, widtype);
751    Widget_Data *wd = elm_widget_data_get(obj);
752    if (!wd) return;
753    if (count < 0) count = 0;
754    wd->count_item_pre_after = count;
755 }
756
757 EAPI Elm_Object_Item *
758 elm_slideshow_item_nth_get(const Evas_Object *obj, unsigned int nth)
759 {
760    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
761    Widget_Data *wd = elm_widget_data_get(obj);
762    if (!wd) return NULL;
763    return eina_list_nth(wd->items, nth);
764 }
765
766 EAPI unsigned int
767 elm_slideshow_count_get(const Evas_Object *obj)
768 {
769    ELM_CHECK_WIDTYPE(obj, widtype) 0;
770    Widget_Data *wd = elm_widget_data_get(obj);
771    if (!wd) return 0;
772    return eina_list_count(wd->items);
773 }