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