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