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