1 #ifdef HAVE_CONFIG_H
2 # include "elementary_config.h"
3 #endif
4 
5 #define EFL_ACCESS_OBJECT_PROTECTED
6 #define EFL_UI_L10N_PROTECTED
7 #define EFL_PART_PROTECTED
8 
9 #include <Elementary.h>
10 #include "elm_priv.h"
11 #include "elm_widget_dayselector.h"
12 #include "elm_widget_container.h"
13 
14 #include "elm_dayselector_part.eo.h"
15 #include "elm_part_helper.h"
16 
17 #define MY_CLASS ELM_DAYSELECTOR_CLASS
18 
19 #define MY_CLASS_NAME "Elm_Dayselector"
20 #define MY_CLASS_NAME_LEGACY "elm_dayselector"
21 
22 /* signals to edc */
23 #define ITEM_TYPE_WEEKDAY_DEFAULT "elm,type,weekday,default"
24 #define ITEM_TYPE_WEEKDAY_STYLE1  "elm,type,weekday,style1"
25 #define ITEM_TYPE_WEEKEND_DEFAULT "elm,type,weekend,default"
26 #define ITEM_TYPE_WEEKEND_STYLE1  "elm,type,weekend,style1"
27 #define ITEM_POS_LEFT             "elm,pos,check,left"
28 #define ITEM_POS_RIGHT            "elm,pos,check,right"
29 #define ITEM_POS_MIDDLE           "elm,pos,check,middle"
30 
31 static const char SIG_CHANGED[] = "dayselector,changed";
32 static const Evas_Smart_Cb_Description _smart_callbacks[] = {
33    {SIG_CHANGED, ""},
34    {SIG_WIDGET_LANG_CHANGED, ""}, /**< handled by elm_widget */
35    {SIG_WIDGET_ACCESS_CHANGED, ""}, /**< handled by elm_widget */
36    {NULL, NULL}
37 };
38 
39 static void
_dayselector_resize(void * data,Evas * e EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)40 _dayselector_resize(void *data,
41                     Evas *e EINA_UNUSED,
42                     Evas_Object *obj EINA_UNUSED,
43                     void *event_info EINA_UNUSED)
44 {
45    elm_layout_sizing_eval(data);
46 }
47 
48 EOLIAN static void
_elm_dayselector_efl_ui_l10n_translation_update(Eo * obj EINA_UNUSED,Elm_Dayselector_Data * sd)49 _elm_dayselector_efl_ui_l10n_translation_update(Eo *obj EINA_UNUSED, Elm_Dayselector_Data *sd)
50 {
51    time_t t;
52    Eina_List *l;
53    char buf[1024];
54    struct tm time_daysel;
55    Elm_Dayselector_Item_Data *it;
56 
57    if (sd->weekdays_names_set)
58      return;
59 
60    t = time(NULL);
61    localtime_r(&t, &time_daysel);
62    EINA_LIST_FOREACH(sd->items, l, it)
63      {
64         time_daysel.tm_wday = it->day;
65         strftime(buf, sizeof(buf), "%a", &time_daysel);
66         elm_object_text_set(VIEW(it), buf);
67      }
68 
69    efl_ui_l10n_translation_update(efl_super(obj, MY_CLASS));
70 }
71 
72 static void
_update_items(Evas_Object * obj)73 _update_items(Evas_Object *obj)
74 {
75    Eina_List *l;
76    Eina_Bool rtl;
77    unsigned int last_day;
78    Elm_Dayselector_Item_Data *it;
79 
80    ELM_DAYSELECTOR_DATA_GET(obj, sd);
81 
82    last_day = sd->week_start + ELM_DAYSELECTOR_MAX - 1;
83    if (last_day >= ELM_DAYSELECTOR_MAX)
84      last_day = last_day % ELM_DAYSELECTOR_MAX;
85 
86    rtl = efl_ui_mirrored_get(obj);
87    EINA_LIST_FOREACH(sd->items, l, it)
88      {
89         elm_object_signal_emit(VIEW(it), it->day_style, ""); // XXX: compat
90         elm_object_signal_emit(VIEW(it), it->day_style, "elm");
91         if (it->day == sd->week_start)
92           {
93              if (rtl) elm_object_signal_emit(VIEW(it), ITEM_POS_RIGHT, "elm");
94              else elm_object_signal_emit(VIEW(it), ITEM_POS_LEFT, "elm");
95           }
96         else if (it->day == last_day)
97           {
98              if (rtl) elm_object_signal_emit(VIEW(it), ITEM_POS_LEFT, "elm");
99              else elm_object_signal_emit(VIEW(it), ITEM_POS_RIGHT, "elm");
100           }
101         else
102           elm_object_signal_emit(VIEW(it), ITEM_POS_MIDDLE, "elm");
103      }
104 }
105 
106 static inline unsigned int
_item_location_get(Elm_Dayselector_Data * sd,Elm_Dayselector_Item_Data * it)107 _item_location_get(Elm_Dayselector_Data *sd,
108                    Elm_Dayselector_Item_Data *it)
109 {
110    return (ELM_DAYSELECTOR_MAX - sd->week_start + it->day) %
111           ELM_DAYSELECTOR_MAX;
112 }
113 
114 EOLIAN static Eina_Error
_elm_dayselector_efl_ui_widget_theme_apply(Eo * obj,Elm_Dayselector_Data * sd)115 _elm_dayselector_efl_ui_widget_theme_apply(Eo *obj, Elm_Dayselector_Data *sd)
116 {
117    Eina_Error int_ret = EFL_UI_THEME_APPLY_ERROR_GENERIC;
118 
119    Eina_List *l;
120    char buf[1024];
121    Elm_Dayselector_Item_Data *it;
122 
123    int_ret = efl_ui_widget_theme_apply(efl_super(obj, MY_CLASS));
124    if (int_ret == EFL_UI_THEME_APPLY_ERROR_GENERIC) return int_ret;
125 
126    EINA_LIST_FOREACH(sd->items, l, it)
127      {
128         snprintf
129           (buf, sizeof(buf), "dayselector/%s", elm_object_style_get(obj));
130         elm_object_style_set(VIEW(it), buf);
131 
132         /* XXX kept for legacy compatibility, remove eventually */
133         snprintf
134           (buf, sizeof(buf), "day%d,visible", _item_location_get(sd, it));
135         elm_layout_signal_emit(obj, buf, "elm");
136         /* XXX */
137         snprintf
138           (buf, sizeof(buf), "elm,day%d,visible", _item_location_get(sd, it));
139         elm_layout_signal_emit(obj, buf, "elm");
140      }
141 
142    _update_items(obj);
143    elm_layout_sizing_eval(obj);
144 
145    return int_ret;
146 }
147 
148 static void
_item_del_cb(void * data,Evas * e EINA_UNUSED,Evas_Object * obj,void * event_info EINA_UNUSED)149 _item_del_cb(void *data,
150              Evas *e EINA_UNUSED,
151              Evas_Object *obj,
152              void *event_info EINA_UNUSED)
153 {
154    Eina_List *l;
155    char buf[1024];
156    Elm_Dayselector_Item_Data *it;
157 
158    ELM_DAYSELECTOR_DATA_GET(data, sd);
159 
160    EINA_LIST_FOREACH(sd->items, l, it)
161      {
162         if (obj == VIEW(it))
163           {
164              sd->items = eina_list_remove(sd->items, it);
165              eina_stringshare_del(it->day_style);
166              /* XXX kept for legacy compatibility, remove eventually */
167              snprintf(buf, sizeof(buf), "day%d,default",
168                       _item_location_get(sd, it));
169              elm_layout_signal_emit(obj, buf, "elm");
170              /* XXX */
171              snprintf(buf, sizeof(buf), "elm,day%d,default",
172                       _item_location_get(sd, it));
173              elm_layout_signal_emit(obj, buf, "elm");
174 
175              // The object is already being deleted, there is no point in calling efl_del on it nore setting it to NULL.
176 
177              elm_layout_sizing_eval(obj);
178              break;
179           }
180      }
181 }
182 
183 static void
_item_signal_emit_cb(void * data,Evas_Object * obj EINA_UNUSED,const char * emission,const char * source EINA_UNUSED)184 _item_signal_emit_cb(void *data,
185                      Evas_Object *obj EINA_UNUSED,
186                      const char *emission,
187                      const char *source EINA_UNUSED)
188 {
189    Elm_Dayselector_Item_Data *it = data;
190 
191    eina_stringshare_replace(&it->day_style, emission);
192 }
193 
194 static void
_item_clicked_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info)195 _item_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
196 {
197    Elm_Dayselector_Item_Data *it = data;
198 
199    evas_object_smart_callback_call(WIDGET(it), "changed", event_info);
200 }
201 
202 static Elm_Dayselector_Item_Data *
_item_find(const Evas_Object * obj,Elm_Dayselector_Day day)203 _item_find(const Evas_Object *obj,
204            Elm_Dayselector_Day day)
205 {
206    Eina_List *l;
207    Elm_Dayselector_Item_Data *it;
208 
209    ELM_DAYSELECTOR_DATA_GET(obj, sd);
210 
211    EINA_LIST_FOREACH(sd->items, l, it)
212      if (day == it->day) return it;
213 
214    return NULL;
215 }
216 
217 static Eina_Bool
_elm_dayselector_content_set(Eo * obj,Elm_Dayselector_Data * sd,const char * item,Evas_Object * content)218 _elm_dayselector_content_set(Eo *obj, Elm_Dayselector_Data *sd, const char *item, Evas_Object *content)
219 {
220    Eina_Bool int_ret = EINA_FALSE;
221 
222    int day;
223    char buf[1024];
224    Elm_Dayselector_Item_Data *it = NULL;
225 
226    EINA_SAFETY_ON_FALSE_RETURN_VAL(efl_isa(content, EFL_UI_CHECK_CLASS), EINA_FALSE);
227    if (!item) return EINA_FALSE;
228 
229    day = atoi(item + (strlen(item) - 1));
230    if (day < 0 || day > ELM_DAYSELECTOR_MAX) return EINA_FALSE;
231 
232    it = _item_find(obj, day);
233    if (it)
234      {
235         snprintf(buf, sizeof(buf), "elm.swallow.day%d", _item_location_get(sd, it));
236 
237         int_ret = efl_content_set(efl_part(efl_super(obj, MY_CLASS), buf), content);
238         if (!int_ret)
239           {
240              /* XXX kept for legacy compatibility, remove eventually */
241              snprintf(buf, sizeof(buf), "day%d", _item_location_get(sd, it));
242 
243              int_ret = efl_content_set(efl_part(efl_super(obj, MY_CLASS), buf), content);
244              /* XXX */
245           }
246         if (!int_ret) return EINA_FALSE;
247 
248         if (!content) return EINA_TRUE; /* item deletion already handled */
249 
250         evas_object_del(VIEW(it));
251         VIEW_SET(it, content);
252      }
253    else
254      {
255         Eo *eo_it = efl_add(ELM_DAYSELECTOR_ITEM_CLASS, obj);
256         it = efl_data_scope_get(eo_it, ELM_DAYSELECTOR_ITEM_CLASS);
257         it->day = day;
258 
259         snprintf(buf, sizeof(buf), "elm.swallow.day%d", _item_location_get(sd, it));
260 
261         int_ret = efl_content_set(efl_part(efl_super(obj, MY_CLASS), buf), content);
262         if (!int_ret)
263           {
264              /* XXX kept for legacy compatibility, remove eventually */
265              snprintf(buf, sizeof(buf), "day%d", _item_location_get(sd, it));
266 
267              int_ret = efl_content_set(efl_part(efl_super(obj, MY_CLASS), buf), content);
268              /* XXX */
269           }
270         if (!int_ret)
271           {
272              efl_del(eo_it);
273              return EINA_FALSE;
274           }
275 
276         sd->items = eina_list_append(sd->items, it);
277         VIEW_SET(it, content);
278      }
279 
280    snprintf(buf, sizeof(buf), "elm,day%d,visible", _item_location_get(sd, it));
281    elm_layout_signal_emit(obj, buf, "elm");
282    /* XXX kept for legacy compatibility, remove eventually */
283    snprintf(buf, sizeof(buf), "day%d,visible", _item_location_get(sd, it));
284    elm_layout_signal_emit(obj, buf, "elm");
285 
286    evas_object_smart_callback_add(VIEW(it), "changed", _item_clicked_cb, it);
287    evas_object_event_callback_add
288      (VIEW(it), EVAS_CALLBACK_DEL, _item_del_cb, obj);
289 
290    elm_object_signal_callback_add
291      (VIEW(it), ITEM_TYPE_WEEKDAY_DEFAULT, "*", _item_signal_emit_cb, it);
292    elm_object_signal_callback_add
293      (VIEW(it), ITEM_TYPE_WEEKDAY_STYLE1, "*", _item_signal_emit_cb, it);
294    elm_object_signal_callback_add
295      (VIEW(it), ITEM_TYPE_WEEKEND_DEFAULT, "*", _item_signal_emit_cb, it);
296    elm_object_signal_callback_add
297      (VIEW(it), ITEM_TYPE_WEEKEND_STYLE1, "*", _item_signal_emit_cb, it);
298 
299    elm_layout_sizing_eval(obj);
300    _update_items(obj);
301 
302    return EINA_TRUE;
303 }
304 
305 EOLIAN static Eo *
_elm_dayselector_item_efl_object_constructor(Eo * eo_item,Elm_Dayselector_Item_Data * item)306 _elm_dayselector_item_efl_object_constructor(Eo *eo_item, Elm_Dayselector_Item_Data *item)
307 {
308    eo_item = efl_constructor(efl_super(eo_item, ELM_DAYSELECTOR_ITEM_CLASS));
309    item->base = efl_data_scope_get(eo_item, ELM_WIDGET_ITEM_CLASS);
310 
311    return eo_item;
312 }
313 
314 static Evas_Object*
_elm_dayselector_content_unset(Eo * obj,Elm_Dayselector_Data * sd,const char * item)315 _elm_dayselector_content_unset(Eo *obj, Elm_Dayselector_Data *sd, const char *item)
316 {
317    int day;
318    char buf[1024];
319    Evas_Object *content;
320    Elm_Dayselector_Item_Data *it = NULL;
321 
322    day = atoi(item + (strlen(item) - 1));
323    if (day < 0 || day > ELM_DAYSELECTOR_MAX) return NULL;
324 
325    it = _item_find(obj, day);
326    if (!it) return NULL;
327 
328    content = efl_content_unset(efl_part(efl_super(obj, MY_CLASS), buf));
329    if (!content) return NULL;
330 
331    sd->items = eina_list_remove(sd->items, it);
332    evas_object_smart_callback_del_full(content, "changed", _item_clicked_cb, it);
333    evas_object_event_callback_del(content, EVAS_CALLBACK_DEL, _item_del_cb);
334 
335    elm_object_signal_callback_del
336      (content, ITEM_TYPE_WEEKDAY_DEFAULT, "*", _item_signal_emit_cb);
337    elm_object_signal_callback_del
338      (content, ITEM_TYPE_WEEKDAY_STYLE1, "*", _item_signal_emit_cb);
339    elm_object_signal_callback_del
340      (content, ITEM_TYPE_WEEKEND_DEFAULT, "*", _item_signal_emit_cb);
341    elm_object_signal_callback_del
342      (content, ITEM_TYPE_WEEKEND_STYLE1, "*", _item_signal_emit_cb);
343 
344    snprintf(buf, sizeof(buf), "elm,day%d,default", _item_location_get(sd, it));
345    elm_layout_signal_emit(obj, buf, "elm");
346    /* XXX kept for legacy compatibility, remove eventually */
347    snprintf(buf, sizeof(buf), "day%d,default", _item_location_get(sd, it));
348    elm_layout_signal_emit(obj, buf, "elm");
349 
350    efl_del(EO_OBJ(it));
351 
352    elm_layout_sizing_eval(obj);
353 
354    return content;
355 }
356 
357 static void
_items_style_set(Evas_Object * obj)358 _items_style_set(Evas_Object *obj)
359 {
360    Eina_List *l;
361    Elm_Dayselector_Item_Data *it;
362    unsigned int weekend_last;
363 
364    ELM_DAYSELECTOR_DATA_GET(obj, sd);
365 
366    weekend_last = sd->weekend_start + sd->weekend_len - 1;
367    if (weekend_last >= ELM_DAYSELECTOR_MAX)
368      weekend_last = weekend_last % ELM_DAYSELECTOR_MAX;
369 
370    EINA_LIST_FOREACH(sd->items, l, it)
371      {
372         if (weekend_last >= sd->weekend_start)
373           {
374              if ((it->day >= sd->weekend_start) && (it->day <= weekend_last))
375                eina_stringshare_replace(&it->day_style,
376                                         ITEM_TYPE_WEEKEND_DEFAULT);
377              else
378                eina_stringshare_replace(&it->day_style,
379                                         ITEM_TYPE_WEEKDAY_DEFAULT);
380           }
381         else
382           {
383              if ((it->day >= sd->weekend_start) || (it->day <= weekend_last))
384                eina_stringshare_replace(&it->day_style,
385                                         ITEM_TYPE_WEEKEND_DEFAULT);
386              else
387                eina_stringshare_replace(&it->day_style,
388                                         ITEM_TYPE_WEEKDAY_DEFAULT);
389           }
390      }
391 }
392 
393 static void
_items_create(Evas_Object * obj)394 _items_create(Evas_Object *obj)
395 {
396    time_t t;
397    char buf[1024];
398    unsigned int idx;
399    struct tm time_daysel;
400 
401    t = time(NULL);
402    localtime_r(&t, &time_daysel);
403 
404    for (idx = 0; idx < ELM_DAYSELECTOR_MAX; idx++)
405      {
406         Evas_Object *chk;
407 
408         chk = elm_check_add(obj);
409         elm_object_style_set(chk, "dayselector/default");
410 
411         time_daysel.tm_wday = idx;
412         strftime(buf, sizeof(buf), "%a", &time_daysel);
413         elm_object_text_set(chk, buf);
414 
415         snprintf(buf, sizeof(buf), "elm.swallow.day%u", idx);
416         if (!elm_layout_content_set(obj, buf, chk))
417           {
418              snprintf(buf, sizeof(buf), "day%u", idx);
419              elm_layout_content_set(obj, buf, chk);
420           }
421 
422         // XXX: ACCESS
423         _elm_access_text_set(_elm_access_info_get(chk),
424                  ELM_ACCESS_TYPE, E_("day selector item"));
425      }
426 
427    _items_style_set(obj);
428    _update_items(obj);
429 }
430 
431 EOLIAN static void
_elm_dayselector_efl_canvas_group_group_add(Eo * obj,Elm_Dayselector_Data * priv)432 _elm_dayselector_efl_canvas_group_group_add(Eo *obj, Elm_Dayselector_Data *priv)
433 {
434    efl_canvas_group_add(efl_super(obj, MY_CLASS));
435 
436    if (!elm_layout_theme_set(obj, "dayselector", "base",
437                              elm_widget_style_get(obj)))
438      CRI("Failed to set layout!");
439 
440    priv->week_start = _elm_config->week_start;
441    priv->weekend_start = _elm_config->weekend_start;
442    priv->weekend_len = _elm_config->weekend_len;
443    efl_ui_layout_finger_size_multiplier_set(obj, ELM_DAYSELECTOR_MAX, 1);
444    _items_create(obj);
445 
446    evas_object_event_callback_add
447      (obj, EVAS_CALLBACK_RESIZE, _dayselector_resize, obj);
448 
449    elm_layout_sizing_eval(obj);
450 }
451 
452 EOLIAN static void
_elm_dayselector_efl_canvas_group_group_del(Eo * obj,Elm_Dayselector_Data * sd)453 _elm_dayselector_efl_canvas_group_group_del(Eo *obj, Elm_Dayselector_Data *sd)
454 {
455    Elm_Dayselector_Item_Data *it;
456 
457    EINA_LIST_FREE(sd->items, it)
458      {
459         sd->items = eina_list_remove(sd->items, it);
460         eina_stringshare_del(it->day_style);
461         // No need to efl_del the object as they have been created by efl_add and are dead by now.
462      }
463 
464    /* handles freeing sd */
465    efl_canvas_group_del(efl_super(obj, MY_CLASS));
466 }
467 
468 EAPI Evas_Object *
elm_dayselector_add(Evas_Object * parent)469 elm_dayselector_add(Evas_Object *parent)
470 {
471    EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
472    return elm_legacy_add(MY_CLASS, parent);
473 }
474 
475 EOLIAN static Eo *
_elm_dayselector_efl_object_constructor(Eo * obj,Elm_Dayselector_Data * _pd EINA_UNUSED)476 _elm_dayselector_efl_object_constructor(Eo *obj, Elm_Dayselector_Data *_pd EINA_UNUSED)
477 {
478    obj = efl_constructor(efl_super(obj, MY_CLASS));
479    efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY);
480    evas_object_smart_callbacks_descriptions_set(obj, _smart_callbacks);
481    efl_access_object_role_set(obj, EFL_ACCESS_ROLE_PANEL);
482 
483    return obj;
484 }
485 
486 EOLIAN static void
_elm_dayselector_day_selected_set(Eo * obj,Elm_Dayselector_Data * _pd EINA_UNUSED,Elm_Dayselector_Day day,Eina_Bool selected)487 _elm_dayselector_day_selected_set(Eo *obj, Elm_Dayselector_Data *_pd EINA_UNUSED, Elm_Dayselector_Day day, Eina_Bool selected)
488 {
489    Elm_Dayselector_Item_Data *it = _item_find(obj, day);
490    if (!it)
491      {
492         ERR("Failed to find item");
493         return;
494      }
495    elm_check_state_set(VIEW(it), selected);
496 }
497 
498 EOLIAN static Eina_Bool
_elm_dayselector_day_selected_get(const Eo * obj,Elm_Dayselector_Data * _pd EINA_UNUSED,Elm_Dayselector_Day day)499 _elm_dayselector_day_selected_get(const Eo *obj, Elm_Dayselector_Data *_pd EINA_UNUSED, Elm_Dayselector_Day day)
500 {
501    Elm_Dayselector_Item_Data *it = _item_find(obj, day);
502    if (!it)
503      {
504         ERR("Failed to find item");
505         return EINA_FALSE;
506      }
507    return elm_check_state_get(VIEW(it));
508 }
509 
510 EOLIAN static void
_elm_dayselector_week_start_set(Eo * obj,Elm_Dayselector_Data * sd,Elm_Dayselector_Day day)511 _elm_dayselector_week_start_set(Eo *obj, Elm_Dayselector_Data *sd, Elm_Dayselector_Day day)
512 {
513    ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
514    Eina_List *l;
515    char buf[1024];
516    Elm_Dayselector_Item_Data *it;
517 
518    /* just shuffling items, so swalling them directly */
519    sd->week_start = day;
520    EINA_LIST_FOREACH(sd->items, l, it)
521      {
522         snprintf(buf, sizeof(buf), "elm.swallow.day%d", _item_location_get(sd, it));
523         if (!edje_object_part_swallow(wd->resize_obj, buf, VIEW(it)))
524           {
525              snprintf(buf, sizeof(buf), "day%d", _item_location_get(sd, it));
526              edje_object_part_swallow(wd->resize_obj, buf, VIEW(it));
527           }
528      }
529 
530    _update_items(obj);
531 }
532 
533 EOLIAN static Elm_Dayselector_Day
_elm_dayselector_week_start_get(const Eo * obj EINA_UNUSED,Elm_Dayselector_Data * sd)534 _elm_dayselector_week_start_get(const Eo *obj EINA_UNUSED, Elm_Dayselector_Data *sd)
535 {
536    return sd->week_start;
537 }
538 
539 EOLIAN static void
_elm_dayselector_weekend_start_set(Eo * obj,Elm_Dayselector_Data * sd,Elm_Dayselector_Day day)540 _elm_dayselector_weekend_start_set(Eo *obj, Elm_Dayselector_Data *sd, Elm_Dayselector_Day day)
541 {
542    sd->weekend_start = day;
543 
544    _items_style_set(obj);
545    _update_items(obj);
546 }
547 
548 EOLIAN static Elm_Dayselector_Day
_elm_dayselector_weekend_start_get(const Eo * obj EINA_UNUSED,Elm_Dayselector_Data * sd)549 _elm_dayselector_weekend_start_get(const Eo *obj EINA_UNUSED, Elm_Dayselector_Data *sd)
550 {
551    return sd->weekend_start;
552 }
553 
554 EOLIAN static void
_elm_dayselector_weekend_length_set(Eo * obj,Elm_Dayselector_Data * sd,unsigned int length)555 _elm_dayselector_weekend_length_set(Eo *obj, Elm_Dayselector_Data *sd, unsigned int length)
556 {
557    sd->weekend_len = length;
558 
559    _items_style_set(obj);
560    _update_items(obj);
561 }
562 
563 EOLIAN static unsigned int
_elm_dayselector_weekend_length_get(const Eo * obj EINA_UNUSED,Elm_Dayselector_Data * sd)564 _elm_dayselector_weekend_length_get(const Eo *obj EINA_UNUSED, Elm_Dayselector_Data *sd)
565 {
566    return sd->weekend_len;
567 }
568 
569 EOLIAN static void
_elm_dayselector_weekdays_names_set(Eo * obj,Elm_Dayselector_Data * sd,const char ** weekdays)570 _elm_dayselector_weekdays_names_set(Eo *obj, Elm_Dayselector_Data *sd, const char **weekdays)
571 {
572    int idx;
573    time_t now;
574    struct tm time_daysel;
575    Elm_Dayselector_Item_Data *it;
576    char buf[1024];
577 
578    if (weekdays)
579      sd->weekdays_names_set = EINA_TRUE;
580    else
581      {
582         now = time(NULL);
583         localtime_r(&now, &time_daysel);
584         sd->weekdays_names_set = EINA_FALSE;
585      }
586 
587    for (idx = 0; idx < ELM_DAYSELECTOR_MAX; idx++)
588      {
589         it = _item_find(obj, idx);
590         if (!it) continue;
591 
592         if (sd->weekdays_names_set)
593           elm_object_text_set(VIEW(it), weekdays[idx]);
594         else
595           {
596              time_daysel.tm_wday = idx;
597              strftime(buf, sizeof(buf), "%a", &time_daysel);
598              elm_object_text_set(VIEW(it), buf);
599           }
600      }
601 }
602 
603 EOLIAN static Eina_List *
_elm_dayselector_weekdays_names_get(const Eo * obj,Elm_Dayselector_Data * sd EINA_UNUSED)604 _elm_dayselector_weekdays_names_get(const Eo *obj, Elm_Dayselector_Data *sd EINA_UNUSED)
605 {
606    int idx;
607    const char *weekday;
608    Elm_Dayselector_Item_Data *it;
609    Eina_List *weekdays = NULL;
610 
611    for (idx = 0; idx < ELM_DAYSELECTOR_MAX; idx++)
612      {
613         it = _item_find(obj, idx);
614         if (!it) continue ;
615 
616         weekday = elm_object_text_get(VIEW(it));
617         weekdays = eina_list_append(weekdays, eina_stringshare_add(weekday));
618      }
619    return weekdays;
620 }
621 
622 static void
_elm_dayselector_class_constructor(Efl_Class * klass)623 _elm_dayselector_class_constructor(Efl_Class *klass)
624 {
625    evas_smart_legacy_type_register(MY_CLASS_NAME_LEGACY, klass);
626 }
627 
628 /* Efl.Part begin */
629 
630 ELM_PART_OVERRIDE(elm_dayselector, ELM_DAYSELECTOR, Elm_Dayselector_Data)
631 ELM_PART_OVERRIDE_CONTENT_SET(elm_dayselector, ELM_DAYSELECTOR, Elm_Dayselector_Data)
632 ELM_PART_OVERRIDE_CONTENT_UNSET(elm_dayselector, ELM_DAYSELECTOR, Elm_Dayselector_Data)
633 #include "elm_dayselector_part.eo.c"
634 
635 /* Efl.Part end */
636 
637 /* Internal EO APIs and hidden overrides */
638 
639 #define ELM_DAYSELECTOR_EXTRA_OPS \
640    EFL_CANVAS_GROUP_ADD_DEL_OPS(elm_dayselector)
641 
642 #include "elm_dayselector_eo.c"
643 #include "elm_dayselector_item_eo.c"
644 
645