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