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