1 #ifdef HAVE_CONFIG_H
2 # include "elementary_config.h"
3 #endif
4 
5 #define EFL_ACCESS_OBJECT_PROTECTED
6 #define EFL_ACCESS_WIDGET_ACTION_PROTECTED
7 
8 #define ELM_WIDGET_ITEM_PROTECTED
9 #include <Elementary.h>
10 
11 #include "elm_priv.h"
12 #include "elm_slideshow_eo.h"
13 #include "elm_slideshow_item_eo.h"
14 #include "elm_widget_slideshow.h"
15 
16 #define MY_CLASS ELM_SLIDESHOW_CLASS
17 
18 #define MY_CLASS_NAME "Elm_Slideshow"
19 #define MY_CLASS_NAME_LEGACY "elm_slideshow"
20 
21 static const char SIG_CHANGED[] = "changed";
22 static const char SIG_TRANSITION_END[] = "transition,end";
23 
24 static const Evas_Smart_Cb_Description _smart_callbacks[] = {
25    {SIG_CHANGED, ""},
26    {SIG_TRANSITION_END, ""},
27    {SIG_WIDGET_LANG_CHANGED, ""}, /**< handled by elm_widget */
28    {SIG_WIDGET_ACCESS_CHANGED, ""}, /**< handled by elm_widget */
29    {SIG_LAYOUT_FOCUSED, ""}, /**< handled by elm_layout */
30    {SIG_LAYOUT_UNFOCUSED, ""}, /**< handled by elm_layout */
31    {NULL, NULL}
32 };
33 
34 static Eina_Bool _key_action_move(Evas_Object *obj, const char *params);
35 static Eina_Bool _key_action_pause(Evas_Object *obj, const char *params);
36 
37 static const Elm_Action key_actions[] = {
38    {"move", _key_action_move},
39    {"pause", _key_action_pause},
40    {NULL, NULL}
41 };
42 
43 static Eina_Bool
_key_action_move(Evas_Object * obj,const char * params)44 _key_action_move(Evas_Object *obj, const char *params)
45 {
46    const char *dir = params;
47 
48    _elm_widget_focus_auto_show(obj);
49    if (!strcmp(dir, "left"))
50      {
51         elm_slideshow_previous(obj);
52      }
53    else if (!strcmp(dir, "right"))
54      {
55         elm_slideshow_next(obj);
56      }
57    else return EINA_FALSE;
58    return EINA_TRUE;
59 }
60 
61 static Eina_Bool
_key_action_pause(Evas_Object * obj,const char * params EINA_UNUSED)62 _key_action_pause(Evas_Object *obj, const char *params EINA_UNUSED)
63 {
64    ELM_SLIDESHOW_DATA_GET(obj, sd);
65 
66    if (EINA_DBL_NONZERO(sd->timeout))
67      {
68         if (sd->timer)
69           ELM_SAFE_FREE(sd->timer, ecore_timer_del);
70         else
71           elm_slideshow_timeout_set(obj, sd->timeout);
72      }
73 
74    return EINA_TRUE;
75 }
76 
77 static Elm_Slideshow_Item_Data *
_item_prev_get(Elm_Slideshow_Item_Data * item)78 _item_prev_get(Elm_Slideshow_Item_Data *item)
79 {
80    ELM_SLIDESHOW_DATA_GET(WIDGET(item), sd);
81    Elm_Object_Item *eo_prev = eina_list_data_get(eina_list_prev(item->l));
82 
83    if ((!eo_prev) && (sd->loop))
84      eo_prev = eina_list_data_get(eina_list_last(item->l));
85 
86    ELM_SLIDESHOW_ITEM_DATA_GET(eo_prev, prev);
87    return prev;
88 }
89 
90 static Elm_Slideshow_Item_Data *
_item_next_get(Elm_Slideshow_Item_Data * item)91 _item_next_get(Elm_Slideshow_Item_Data *item)
92 {
93    ELM_SLIDESHOW_DATA_GET(WIDGET(item), sd);
94    Elm_Object_Item *eo_next = eina_list_data_get(eina_list_next(item->l));
95 
96    if ((!eo_next) && (sd->loop))
97      eo_next = eina_list_data_get(sd->items);
98 
99    ELM_SLIDESHOW_ITEM_DATA_GET(eo_next, next);
100    return next;
101 }
102 
103 static void
_on_size_hints_changed(void * data,Evas * e EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)104 _on_size_hints_changed(void *data,
105                        Evas *e EINA_UNUSED,
106                        Evas_Object *obj EINA_UNUSED,
107                        void *event_info EINA_UNUSED)
108 {
109    elm_layout_sizing_eval(data);
110 }
111 
112 static void
_item_realize(Elm_Slideshow_Item_Data * item)113 _item_realize(Elm_Slideshow_Item_Data *item)
114 {
115    Elm_Slideshow_Item_Data *_item_prev, *_item_next;
116    Evas_Object *obj = WIDGET(item);
117    int ac, bc, lc, ic = 0;
118 
119    ELM_SLIDESHOW_DATA_GET_OR_RETURN(obj, sd);
120 
121    if ((!VIEW(item)) && (item->itc->func.get))
122      {
123         VIEW_SET(item, item->itc->func.get(elm_object_item_data_get(EO_OBJ(item)), obj));
124         item->l_built = eina_list_append(NULL, item);
125         sd->items_built = eina_list_merge(sd->items_built, item->l_built);
126         //FIXME: item could be shown by obj
127         evas_object_hide(VIEW(item));
128      }
129    else if (item->l_built)
130      sd->items_built = eina_list_demote_list(sd->items_built, item->l_built);
131 
132    //pre-create previous and next item
133    ac = sd->count_item_pre_after;
134    _item_next = item;
135    bc = sd->count_item_pre_before;
136    _item_prev = item;
137    lc = eina_list_count(sd->items) - 1;
138 
139    while (lc > 0 && ((ac > 0) || (bc > 0)))
140      {
141         if (lc > 0 && ac > 0)
142           {
143              --ac;
144              --lc;
145              if (_item_next)
146                {
147                   _item_next = _item_next_get(_item_next);
148                   if ((_item_next)
149                       && (!VIEW(_item_next))
150                       && (_item_next->itc->func.get))
151                     {
152                        ic++;
153                        VIEW_SET(_item_next,
154                          _item_next->itc->func.get(
155                                                    elm_object_item_data_get(EO_OBJ(_item_next)), obj));
156                        _item_next->l_built =
157                          eina_list_append(NULL, _item_next);
158                        sd->items_built = eina_list_merge
159                            (sd->items_built, _item_next->l_built);
160                        //FIXME: _item_next could be shown by obj later
161                        evas_object_hide(VIEW(_item_next));
162                     }
163                   else if (_item_next && _item_next->l_built)
164                     {
165                        ic++;
166                        sd->items_built =
167                          eina_list_demote_list
168                            (sd->items_built, _item_next->l_built);
169                     }
170                }
171           }
172 
173         if (lc > 0 && bc > 0)
174           {
175              --bc;
176              --lc;
177              if (_item_prev)
178                {
179                   _item_prev = _item_prev_get(_item_prev);
180                   if ((_item_prev)
181                       && (!VIEW(_item_prev))
182                       && (_item_prev->itc->func.get))
183                     {
184                        ic++;
185                        VIEW_SET(_item_prev,
186                          _item_prev->itc->func.get(
187                                                    elm_object_item_data_get(EO_OBJ(_item_prev)), obj));
188                        _item_prev->l_built =
189                          eina_list_append(NULL, _item_prev);
190                        sd->items_built = eina_list_merge
191                            (sd->items_built, _item_prev->l_built);
192                        //FIXME: _item_prev could be shown by obj later
193                        evas_object_hide(VIEW(_item_prev));
194                     }
195                   else if (_item_prev && _item_prev->l_built)
196                     {
197                        ic++;
198                        sd->items_built =
199                          eina_list_demote_list
200                            (sd->items_built, _item_prev->l_built);
201                     }
202                }
203           }
204      }
205 
206    //delete unused items
207    lc = ic + 1;
208 
209    while ((int)eina_list_count(sd->items_built) > lc)
210      {
211         item = eina_list_data_get(sd->items_built);
212         sd->items_built = eina_list_remove_list
213             (sd->items_built, sd->items_built);
214         if (item->itc->func.del)
215           item->itc->func.del(elm_object_item_data_get(EO_OBJ(item)), VIEW(item));
216         ELM_SAFE_FREE(VIEW(item), evas_object_del);
217         item->l_built = NULL;
218      }
219 }
220 
221 static void
_on_slideshow_end(void * data,Evas_Object * obj EINA_UNUSED,const char * emission,const char * source EINA_UNUSED)222 _on_slideshow_end(void *data,
223                   Evas_Object *obj EINA_UNUSED,
224                   const char *emission,
225                   const char *source EINA_UNUSED)
226 {
227    Elm_Slideshow_Item_Data *item;
228    ELM_SLIDESHOW_DATA_GET(data, sd);
229 
230    item = sd->previous;
231    if (item)
232      {
233         elm_layout_content_unset(data, "elm.swallow.1");
234         evas_object_hide(VIEW(item));
235         sd->previous = NULL;
236      }
237 
238    item = sd->current;
239    if ((!item) || (!VIEW(item))) return;
240 
241    _item_realize(item);
242    elm_layout_content_unset(data, "elm.swallow.2");
243 
244    elm_layout_content_set(data, "elm.swallow.1", VIEW(item));
245    elm_layout_signal_emit(data, "elm,anim,end", "elm");
246    // XXX: fort backwards compat
247    elm_layout_signal_emit(data, "anim,end", "slideshow");
248 
249    if (emission != NULL)
250      efl_event_callback_legacy_call
251        (data, ELM_SLIDESHOW_EVENT_TRANSITION_END, EO_OBJ(sd->current));
252 }
253 
254 static Eina_Bool
_timer_cb(void * data)255 _timer_cb(void *data)
256 {
257    Evas_Object *obj = data;
258    ELM_SLIDESHOW_DATA_GET(obj, sd);
259 
260    sd->timer = NULL;
261    elm_slideshow_next(obj);
262 
263    return ECORE_CALLBACK_CANCEL;
264 }
265 
266 EOLIAN static void
_elm_slideshow_item_efl_object_destructor(Eo * eo_item,Elm_Slideshow_Item_Data * item)267 _elm_slideshow_item_efl_object_destructor(Eo *eo_item, Elm_Slideshow_Item_Data *item)
268 {
269    ELM_SLIDESHOW_DATA_GET_OR_RETURN(WIDGET(item), sd);
270 
271    if (sd->previous == item) sd->previous = NULL;
272    if (sd->current == item)
273      {
274         Eina_List *l = eina_list_data_find_list(sd->items, eo_item);
275         Eina_List *l2 = eina_list_next(l);
276         sd->current = NULL;
277         if (!l2)
278           {
279              l2 = eina_list_prev(l);
280              if (l2)
281                elm_slideshow_item_show(eina_list_data_get(l2));
282           }
283         else
284           elm_slideshow_item_show(eina_list_data_get(l2));
285      }
286 
287    sd->items = eina_list_remove_list(sd->items, item->l);
288    sd->items_built = eina_list_remove_list(sd->items_built, item->l_built);
289 
290    if ((VIEW(item)) && (item->itc->func.del))
291      item->itc->func.del(elm_object_item_data_get(eo_item), VIEW(item));
292 
293    efl_destructor(efl_super(eo_item, ELM_SLIDESHOW_ITEM_CLASS));
294 }
295 
296 EOLIAN static void
_elm_slideshow_efl_canvas_group_group_add(Eo * obj,Elm_Slideshow_Data * priv)297 _elm_slideshow_efl_canvas_group_group_add(Eo *obj, Elm_Slideshow_Data *priv)
298 {
299    ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
300 
301    efl_canvas_group_add(efl_super(obj, MY_CLASS));
302    efl_ui_layout_finger_size_multiplier_set(obj, 0, 0);
303 
304    priv->count_item_pre_before = 2;
305    priv->count_item_pre_after = 2;
306 
307    if (!elm_layout_theme_set
308        (obj, "slideshow", "base", elm_widget_style_get(obj)))
309      CRI("Failed to set layout!");
310 
311    priv->transitions = elm_widget_stringlist_get
312        (edje_object_data_get(wd->resize_obj,
313                              "transitions"));
314    if (eina_list_count(priv->transitions) > 0)
315      priv->transition =
316        eina_stringshare_add(eina_list_data_get(priv->transitions));
317 
318    priv->layout.list = elm_widget_stringlist_get
319        (edje_object_data_get(wd->resize_obj, "layouts"));
320 
321    if (eina_list_count(priv->layout.list) > 0)
322      priv->layout.current = eina_list_data_get(priv->layout.list);
323 
324    edje_object_signal_callback_add
325      (wd->resize_obj, "elm,end", "elm", _on_slideshow_end,
326      obj);
327    // XXX: for backwards compat :(
328    edje_object_signal_callback_add
329      (wd->resize_obj, "end", "slideshow", _on_slideshow_end,
330      obj);
331 
332    evas_object_event_callback_add
333      (obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _on_size_hints_changed, obj);
334 
335    elm_widget_can_focus_set(obj, EINA_TRUE);
336 
337    elm_layout_sizing_eval(obj);
338 }
339 
340 EOLIAN static void
_elm_slideshow_efl_canvas_group_group_del(Eo * obj,Elm_Slideshow_Data * sd)341 _elm_slideshow_efl_canvas_group_group_del(Eo *obj, Elm_Slideshow_Data *sd)
342 {
343    const char *layout;
344 
345    elm_slideshow_clear(obj);
346    elm_widget_stringlist_free(sd->transitions);
347    ecore_timer_del(sd->timer);
348 
349    EINA_LIST_FREE(sd->layout.list, layout)
350      eina_stringshare_del(layout);
351 
352    efl_canvas_group_del(efl_super(obj, MY_CLASS));
353 }
354 
355 EAPI Evas_Object *
elm_slideshow_add(Evas_Object * parent)356 elm_slideshow_add(Evas_Object *parent)
357 {
358    EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
359    return elm_legacy_add(MY_CLASS, parent);
360 }
361 
362 EOLIAN static Eo *
_elm_slideshow_efl_object_constructor(Eo * obj,Elm_Slideshow_Data * _pd EINA_UNUSED)363 _elm_slideshow_efl_object_constructor(Eo *obj, Elm_Slideshow_Data *_pd EINA_UNUSED)
364 {
365    obj = efl_constructor(efl_super(obj, MY_CLASS));
366    efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY);
367    evas_object_smart_callbacks_descriptions_set(obj, _smart_callbacks);
368    efl_access_object_role_set(obj, EFL_ACCESS_ROLE_DOCUMENT_PRESENTATION);
369    legacy_object_focus_handle(obj);
370 
371    return obj;
372 }
373 
374 EOLIAN static Eo *
_elm_slideshow_item_efl_object_constructor(Eo * obj,Elm_Slideshow_Item_Data * it)375 _elm_slideshow_item_efl_object_constructor(Eo *obj, Elm_Slideshow_Item_Data *it)
376 {
377    obj = efl_constructor(efl_super(obj, ELM_SLIDESHOW_ITEM_CLASS));
378    it->base = efl_data_scope_get(obj, ELM_WIDGET_ITEM_CLASS);
379 
380    return obj;
381 }
382 
383 EOLIAN static Elm_Object_Item*
_elm_slideshow_item_add(Eo * obj,Elm_Slideshow_Data * sd,const Elm_Slideshow_Item_Class * itc,const void * data)384 _elm_slideshow_item_add(Eo *obj, Elm_Slideshow_Data *sd, const Elm_Slideshow_Item_Class *itc, const void *data)
385 {
386    Eo *eo_item;
387 
388    eo_item = efl_add(ELM_SLIDESHOW_ITEM_CLASS, obj);
389    if (!eo_item) return NULL;
390 
391    ELM_SLIDESHOW_ITEM_DATA_GET(eo_item, item);
392 
393    item->itc = itc;
394    item->l = eina_list_append(item->l, eo_item);
395    WIDGET_ITEM_DATA_SET(eo_item, data);
396 
397    sd->items = eina_list_merge(sd->items, item->l);
398 
399    if (!sd->current) elm_slideshow_item_show(eo_item);
400 
401    return eo_item;
402 }
403 
404 EOLIAN static Elm_Object_Item*
_elm_slideshow_item_sorted_insert(Eo * obj,Elm_Slideshow_Data * sd,const Elm_Slideshow_Item_Class * itc,const void * data,Eina_Compare_Cb func)405 _elm_slideshow_item_sorted_insert(Eo *obj, Elm_Slideshow_Data *sd, const Elm_Slideshow_Item_Class *itc, const void *data, Eina_Compare_Cb func)
406 {
407    Eo *eo_item;
408 
409    eo_item = efl_add(ELM_SLIDESHOW_ITEM_CLASS, obj);
410    if (!eo_item) return NULL;
411 
412    ELM_SLIDESHOW_ITEM_DATA_GET(eo_item, item);
413 
414    item->itc = itc;
415    item->l = eina_list_append(item->l, eo_item);
416    WIDGET_ITEM_DATA_SET(eo_item, data);
417 
418    sd->items = eina_list_sorted_merge(sd->items, item->l, func);
419 
420    if (!sd->current) elm_slideshow_item_show(eo_item);
421 
422    return eo_item;
423 }
424 
425 EOLIAN static void
_elm_slideshow_item_show(Eo * eo_item EINA_UNUSED,Elm_Slideshow_Item_Data * item)426 _elm_slideshow_item_show(Eo *eo_item EINA_UNUSED, Elm_Slideshow_Item_Data *item)
427 {
428    char buf[1024];
429    Elm_Slideshow_Item_Data *next = NULL;
430 
431    ELM_SLIDESHOW_DATA_GET(WIDGET(item), sd);
432 
433    if (item == sd->current) return;
434 
435    next = item;
436    _on_slideshow_end(WIDGET(item), WIDGET(item), NULL, NULL);
437 
438    ELM_SAFE_FREE(sd->timer, ecore_timer_del);
439    if (sd->timeout > 0.0)
440      sd->timer = ecore_timer_add(sd->timeout, _timer_cb, WIDGET(item));
441 
442    _item_realize(next);
443    elm_layout_content_set(WIDGET(item), "elm.swallow.2", VIEW(next));
444 
445    if (!sd->transition)
446      sprintf(buf, "elm,none,next");
447    else
448      snprintf(buf, sizeof(buf), "elm,%s,next", sd->transition);
449    elm_layout_signal_emit(WIDGET(item), buf, "elm");
450    // XXX: for backwards compat
451    if (!sd->transition)
452      sprintf(buf,"none,next");
453    else
454      snprintf(buf, sizeof(buf), "%s,next", sd->transition);
455    elm_layout_signal_emit(WIDGET(item), buf, "slideshow");
456 
457    sd->previous = sd->current;
458    sd->current = next;
459    efl_event_callback_legacy_call
460      (WIDGET(item), ELM_SLIDESHOW_EVENT_CHANGED, EO_OBJ(sd->current));
461 }
462 
463 EOLIAN static void
_elm_slideshow_next(Eo * obj,Elm_Slideshow_Data * sd)464 _elm_slideshow_next(Eo *obj, Elm_Slideshow_Data *sd)
465 {
466    char buf[1024];
467    Elm_Slideshow_Item_Data *next = NULL;
468 
469    if (sd->current) next = _item_next_get(sd->current);
470 
471    if ((!next) || (next == sd->current)) return;
472 
473    _on_slideshow_end(obj, obj, NULL, NULL);
474 
475    ELM_SAFE_FREE(sd->timer, ecore_timer_del);
476    if (sd->timeout > 0.0)
477      sd->timer = ecore_timer_add(sd->timeout, _timer_cb, obj);
478 
479    _item_realize(next);
480 
481    elm_layout_content_set(obj, "elm.swallow.2", VIEW(next));
482 
483    if (!sd->transition)
484      sprintf(buf, "elm,none,next");
485    else
486      snprintf(buf, sizeof(buf), "elm,%s,next", sd->transition);
487    elm_layout_signal_emit(obj, buf, "elm");
488    // XXX: for backwards compat
489    if (!sd->transition)
490      sprintf(buf,"none,next");
491    else
492      snprintf(buf, sizeof(buf), "%s,next", sd->transition);
493    elm_layout_signal_emit(obj, buf, "slideshow");
494 
495    sd->previous = sd->current;
496    sd->current = next;
497    efl_event_callback_legacy_call
498      (obj, ELM_SLIDESHOW_EVENT_CHANGED, EO_OBJ(sd->current));
499 }
500 
501 EOLIAN static void
_elm_slideshow_previous(Eo * obj,Elm_Slideshow_Data * sd)502 _elm_slideshow_previous(Eo *obj, Elm_Slideshow_Data *sd)
503 {
504    char buf[1024];
505    Elm_Slideshow_Item_Data *prev = NULL;
506 
507    if (sd->current) prev = _item_prev_get(sd->current);
508 
509    if ((!prev) || (prev == sd->current)) return;
510 
511    _on_slideshow_end(obj, obj, NULL, NULL);
512 
513    ELM_SAFE_FREE(sd->timer, ecore_timer_del);
514    if (sd->timeout > 0.0)
515      sd->timer = ecore_timer_add(sd->timeout, _timer_cb, obj);
516 
517    _item_realize(prev);
518 
519    elm_layout_content_set(obj, "elm.swallow.2", VIEW(prev));
520 
521    if (!sd->transition)
522      sprintf(buf, "elm,none,previous");
523    else
524      snprintf(buf, 1024, "elm,%s,previous", sd->transition);
525    elm_layout_signal_emit(obj, buf, "elm");
526    // XXX: for backwards compat
527    if (!sd->transition)
528      sprintf(buf,"none,previous");
529    else
530      snprintf(buf, 1024, "%s,previous", sd->transition);
531    elm_layout_signal_emit(obj, buf, "slideshow");
532 
533    sd->previous = sd->current;
534    sd->current = prev;
535    efl_event_callback_legacy_call
536      (obj, ELM_SLIDESHOW_EVENT_CHANGED, EO_OBJ(sd->current));
537 }
538 
539 EOLIAN static const Eina_List*
_elm_slideshow_transitions_get(const Eo * obj EINA_UNUSED,Elm_Slideshow_Data * sd)540 _elm_slideshow_transitions_get(const Eo *obj EINA_UNUSED, Elm_Slideshow_Data *sd)
541 {
542    return sd->transitions;
543 }
544 
545 EOLIAN static const Eina_List*
_elm_slideshow_layouts_get(const Eo * obj EINA_UNUSED,Elm_Slideshow_Data * sd)546 _elm_slideshow_layouts_get(const Eo *obj EINA_UNUSED, Elm_Slideshow_Data *sd)
547 {
548    return sd->layout.list;
549 }
550 
551 EOLIAN static void
_elm_slideshow_transition_set(Eo * obj EINA_UNUSED,Elm_Slideshow_Data * sd,const char * transition)552 _elm_slideshow_transition_set(Eo *obj EINA_UNUSED, Elm_Slideshow_Data *sd, const char *transition)
553 {
554    eina_stringshare_replace(&sd->transition, transition);
555 }
556 
557 EOLIAN static const char*
_elm_slideshow_transition_get(const Eo * obj EINA_UNUSED,Elm_Slideshow_Data * sd)558 _elm_slideshow_transition_get(const Eo *obj EINA_UNUSED, Elm_Slideshow_Data *sd)
559 {
560    return sd->transition;
561 }
562 
563 EOLIAN static void
_elm_slideshow_timeout_set(Eo * obj EINA_UNUSED,Elm_Slideshow_Data * sd,double timeout)564 _elm_slideshow_timeout_set(Eo *obj EINA_UNUSED, Elm_Slideshow_Data *sd, double timeout)
565 {
566    sd->timeout = timeout;
567 
568    ELM_SAFE_FREE(sd->timer, ecore_timer_del);
569    if (timeout > 0.0)
570      sd->timer = ecore_timer_add(timeout, _timer_cb, obj);
571 }
572 
573 EOLIAN static double
_elm_slideshow_timeout_get(const Eo * obj EINA_UNUSED,Elm_Slideshow_Data * sd)574 _elm_slideshow_timeout_get(const Eo *obj EINA_UNUSED, Elm_Slideshow_Data *sd)
575 {
576    return sd->timeout;
577 }
578 
579 EOLIAN static void
_elm_slideshow_items_loop_set(Eo * obj,Elm_Slideshow_Data * sd,Eina_Bool loop)580 _elm_slideshow_items_loop_set(Eo *obj, Elm_Slideshow_Data *sd, Eina_Bool loop)
581 {
582    ELM_SLIDESHOW_CHECK(obj);
583    sd->loop = loop;
584 }
585 
586 EOLIAN static const char*
_elm_slideshow_layout_get(const Eo * obj EINA_UNUSED,Elm_Slideshow_Data * sd)587 _elm_slideshow_layout_get(const Eo *obj EINA_UNUSED, Elm_Slideshow_Data *sd)
588 {
589    return sd->layout.current;
590 }
591 
592 EOLIAN static void
_elm_slideshow_layout_set(Eo * obj,Elm_Slideshow_Data * sd,const char * layout)593 _elm_slideshow_layout_set(Eo *obj, Elm_Slideshow_Data *sd, const char *layout)
594 {
595    char buf[PATH_MAX];
596 
597 
598    sd->layout.current = layout;
599    snprintf(buf, sizeof(buf), "elm,layout,%s", layout);
600    elm_layout_signal_emit(obj, buf, "elm");
601    // XXX: for bakcwards compat
602    snprintf(buf, sizeof(buf), "layout,%s", layout);
603    elm_layout_signal_emit(obj, buf, "slideshow");
604 }
605 
606 EOLIAN static Eina_Bool
_elm_slideshow_items_loop_get(const Eo * obj EINA_UNUSED,Elm_Slideshow_Data * sd)607 _elm_slideshow_items_loop_get(const Eo *obj EINA_UNUSED, Elm_Slideshow_Data *sd)
608 {
609    return sd->loop;
610 }
611 
612 EOLIAN static void
_elm_slideshow_clear(Eo * obj EINA_UNUSED,Elm_Slideshow_Data * sd)613 _elm_slideshow_clear(Eo *obj EINA_UNUSED, Elm_Slideshow_Data *sd)
614 {
615    Eo *eo_item;
616    Eina_List *itr, *itr2;
617    sd->previous = NULL;
618    sd->current = NULL;
619 
620    EINA_LIST_FOREACH_SAFE(sd->items, itr, itr2, eo_item)
621       efl_del(eo_item);
622 }
623 
624 EOLIAN static const Eina_List*
_elm_slideshow_items_get(const Eo * obj EINA_UNUSED,Elm_Slideshow_Data * sd)625 _elm_slideshow_items_get(const Eo *obj EINA_UNUSED, Elm_Slideshow_Data *sd)
626 {
627    return sd->items;
628 }
629 
630 EOLIAN static Elm_Object_Item*
_elm_slideshow_item_current_get(const Eo * obj EINA_UNUSED,Elm_Slideshow_Data * sd)631 _elm_slideshow_item_current_get(const Eo *obj EINA_UNUSED, Elm_Slideshow_Data *sd)
632 {
633    return EO_OBJ(sd->current);
634 }
635 
636 EOLIAN static Evas_Object *
_elm_slideshow_item_object_get(const Eo * eo_item EINA_UNUSED,Elm_Slideshow_Item_Data * it)637 _elm_slideshow_item_object_get(const Eo *eo_item EINA_UNUSED, Elm_Slideshow_Item_Data *it)
638 {
639    return VIEW(it);
640 }
641 
642 EOLIAN static int
_elm_slideshow_cache_before_get(const Eo * obj EINA_UNUSED,Elm_Slideshow_Data * sd)643 _elm_slideshow_cache_before_get(const Eo *obj EINA_UNUSED, Elm_Slideshow_Data *sd)
644 {
645    return sd->count_item_pre_before;
646 }
647 
648 EOLIAN static void
_elm_slideshow_cache_before_set(Eo * obj EINA_UNUSED,Elm_Slideshow_Data * sd,int count)649 _elm_slideshow_cache_before_set(Eo *obj EINA_UNUSED, Elm_Slideshow_Data *sd, int count)
650 {
651    if (!sd) return;
652    if (count < 0) count = 0;
653    sd->count_item_pre_before = count;
654 }
655 
656 EOLIAN static int
_elm_slideshow_cache_after_get(const Eo * obj EINA_UNUSED,Elm_Slideshow_Data * sd)657 _elm_slideshow_cache_after_get(const Eo *obj EINA_UNUSED, Elm_Slideshow_Data *sd)
658 {
659    return sd->count_item_pre_after;
660 }
661 
662 EOLIAN static void
_elm_slideshow_cache_after_set(Eo * obj EINA_UNUSED,Elm_Slideshow_Data * sd,int count)663 _elm_slideshow_cache_after_set(Eo *obj EINA_UNUSED, Elm_Slideshow_Data *sd, int count)
664 {
665    if (count < 0) count = 0;
666    sd->count_item_pre_after = count;
667 }
668 
669 EOLIAN static Elm_Object_Item*
_elm_slideshow_item_nth_get(const Eo * obj EINA_UNUSED,Elm_Slideshow_Data * sd,unsigned int nth)670 _elm_slideshow_item_nth_get(const Eo *obj EINA_UNUSED, Elm_Slideshow_Data *sd, unsigned int nth)
671 {
672    return eina_list_nth(sd->items, nth);
673 }
674 
675 EOLIAN static unsigned int
_elm_slideshow_count_get(const Eo * obj EINA_UNUSED,Elm_Slideshow_Data * sd)676 _elm_slideshow_count_get(const Eo *obj EINA_UNUSED, Elm_Slideshow_Data *sd)
677 {
678    return eina_list_count(sd->items);
679 }
680 
681 EOLIAN static void
_elm_slideshow_class_constructor(Efl_Class * klass)682 _elm_slideshow_class_constructor(Efl_Class *klass)
683 {
684    evas_smart_legacy_type_register(MY_CLASS_NAME_LEGACY, klass);
685 }
686 
687 EOLIAN static const Efl_Access_Action_Data*
_elm_slideshow_efl_access_widget_action_elm_actions_get(const Eo * obj EINA_UNUSED,Elm_Slideshow_Data * sd EINA_UNUSED)688 _elm_slideshow_efl_access_widget_action_elm_actions_get(const Eo *obj EINA_UNUSED, Elm_Slideshow_Data *sd EINA_UNUSED)
689 {
690    static Efl_Access_Action_Data atspi_actions[] = {
691           { "move,left", "move", "left", _key_action_move},
692           { "move,right", "move", "right", _key_action_move},
693           { "pause", "pause", NULL, _key_action_pause},
694           { NULL, NULL, NULL, NULL }
695    };
696    return &atspi_actions[0];
697 }
698 
699 /* Standard widget overrides */
700 
701 ELM_WIDGET_KEY_DOWN_DEFAULT_IMPLEMENT(elm_slideshow, Elm_Slideshow_Data)
702 
703 /* Internal EO APIs and hidden overrides */
704 
705 #define ELM_SLIDESHOW_EXTRA_OPS \
706    EFL_CANVAS_GROUP_ADD_DEL_OPS(elm_slideshow)
707 
708 #include "elm_slideshow_item_eo.c"
709 #include "elm_slideshow_eo.c"
710