From 62a09f69a111892e9b5534c0c78c96c6db807622 Mon Sep 17 00:00:00 2001 From: Woochan Lee Date: Mon, 23 Jul 2018 15:49:10 +0900 Subject: [PATCH] Efl.Ui.Calendar, elm_calendar: Code fixed to support auto repeat feature. Summary: 1. Why there is a edje signal callback in elm_calendar? and do we need to maintain? We used edje part like a button before (3 years ago?), So there is a callbacks to get edje signal. Im pretty sure it is not use anymore. but we need to maintain backward compatibility. 2. elm_calendar using using repeat feature in efl_ui_button for it. why did i change it to manual timer? We opend elm_calendar_interval_set() APIs. Support this API the manual timer is proper then using button's feature. 3. why scroll freeze? and why only elm_calendar does it? When the user long press calendar button area and then move the scroll will be activated. it can prevent that weird action. efl_ui_calendar using button's feature. i not sure scroll freeze is deserve to attached in button side as a feature or not. So i will consider more for this case. 4. Why efl_ui_calendar doesn't have year buttons (double spinner case) After interface work, we don't accept style change in the runtime. so that featrue will be supported as API. The year_button_set/get() property should be added. but i dont know is it really needed... If the app developer want use year inc/dec button for efl_ui_calendar. they can inherit the class and make it easily. Test Plan: View, Action, API test in the elementary-test sample App. Ps. The issue of the calendar2 crash when it closed. It's not relative with this commit. its focus. i will look around. Reviewers: Hermet, zmike, ManMower, segfaultxavi, devilhorns Reviewed By: Hermet Subscribers: cedric, #committers, zmike Tags: #efl Differential Revision: https://phab.enlightenment.org/D6626 --- src/lib/elementary/efl_ui_calendar.c | 140 +++------- src/lib/elementary/efl_ui_calendar_private.h | 8 +- src/lib/elementary/elm_calendar.c | 254 +++++-------------- src/lib/elementary/elm_widget_calendar.h | 5 +- 4 files changed, 108 insertions(+), 299 deletions(-) diff --git a/src/lib/elementary/efl_ui_calendar.c b/src/lib/elementary/efl_ui_calendar.c index 7eedec1f1f..ae1e648c94 100644 --- a/src/lib/elementary/efl_ui_calendar.c +++ b/src/lib/elementary/efl_ui_calendar.c @@ -21,6 +21,9 @@ #define EFL_UI_CALENDAR_BUTTON_YEAR_LEFT "efl.calendar.button_year.left" #define EFL_UI_CALENDAR_BUTTON_YEAR_RIGHT "efl.calendar.button_year.right" +#define FIRST_INTERVAL 0.85 +#define INTERVAL 0.2 + static const char PART_NAME_DEC_BUTTON[] = "dec_button"; static const char PART_NAME_INC_BUTTON[] = "inc_button"; @@ -36,20 +39,12 @@ static const Evas_Smart_Cb_Description _smart_callbacks[] = { }; static void -_button_widget_month_dec_start(void *data, - const Efl_Event *ev EINA_UNUSED); +_inc_dec_btn_clicked_cb(void *data, + const Efl_Event *ev); static void -_button_widget_month_dec_start_click(void *data, - const Efl_Event *ev EINA_UNUSED); - -static void -_button_widget_month_inc_start(void *data, - const Efl_Event *ev EINA_UNUSED); - -static void -_button_widget_month_inc_start_click(void *data, - const Efl_Event *ev EINA_UNUSED); +_inc_dec_btn_repeated_cb(void *data, + const Efl_Event *ev); static Eina_Bool _key_action_activate(Evas_Object *obj, const char *params); @@ -253,7 +248,7 @@ _access_calendar_item_register(Evas_Object *obj) { snprintf(pname, sizeof(pname), "efl.cit_%d.access", i); _elm_access_edje_object_part_object_unregister - (obj, elm_layout_edje_get(obj), pname); + (obj, elm_layout_edje_get(obj), pname); } } } @@ -282,9 +277,6 @@ _access_calendar_spinner_register(Evas_Object *obj) ai = _elm_access_info_get(sd->month_access); _elm_access_text_set(ai, ELM_ACCESS_TYPE, E_("calendar month")); - ai = _elm_access_info_get(sd->year_access); - _elm_access_text_set(ai, ELM_ACCESS_TYPE, E_("calendar year")); - o = elm_layout_edje_get(obj); edje_object_freeze(o); po = (Evas_Object *)edje_object_part_object_get(o, "month_text"); @@ -311,7 +303,6 @@ _flush_calendar_composite_elements(Evas_Object *obj, Efl_Ui_Calendar_Data *sd) EXTEND(sd->month_access); EXTEND(sd->dec_btn_month); EXTEND(sd->inc_btn_month); - EXTEND(sd->year_access); #undef EXTEND @@ -461,6 +452,21 @@ _set_headers(Evas_Object *obj) elm_layout_thaw(obj); } +static Eo * +_btn_create(Eo *obj, const char *style, char *part) +{ + return efl_add(EFL_UI_BUTTON_CLASS, obj, + elm_widget_element_update(obj, efl_added, style), + efl_ui_autorepeat_enabled_set(efl_added, EINA_TRUE), + efl_ui_autorepeat_initial_timeout_set(efl_added, FIRST_INTERVAL), + efl_ui_autorepeat_gap_timeout_set(efl_added, INTERVAL), + efl_event_callback_add(efl_added, EFL_UI_EVENT_CLICKED, + _inc_dec_btn_clicked_cb, obj), + efl_event_callback_add(efl_added, EFL_UI_EVENT_REPEATED, + _inc_dec_btn_repeated_cb, obj), + efl_content_set(efl_part(obj, part), efl_added)); +} + static void _spinner_buttons_add(Evas_Object *obj, Efl_Ui_Calendar_Data *sd) { @@ -476,21 +482,9 @@ _spinner_buttons_add(Evas_Object *obj, Efl_Ui_Calendar_Data *sd) } if (!sd->dec_btn_month) - { - sd->dec_btn_month = - efl_add(EFL_UI_BUTTON_CLASS, obj, - elm_widget_element_update(obj, efl_added, PART_NAME_DEC_BUTTON), - efl_ui_autorepeat_enabled_set(efl_added, EINA_TRUE), - efl_ui_autorepeat_initial_timeout_set(efl_added, 0.5), - efl_ui_autorepeat_gap_timeout_set(efl_added, 0.2)); - - efl_event_callback_add(sd->dec_btn_month, EFL_UI_EVENT_CLICKED, - _button_widget_month_dec_start_click, obj); - efl_event_callback_add(sd->dec_btn_month, EFL_UI_EVENT_REPEATED, - _button_widget_month_dec_start, obj); - } - elm_layout_content_set(obj, EFL_UI_CALENDAR_BUTTON_LEFT, sd->dec_btn_month); + sd->dec_btn_month = _btn_create(obj, PART_NAME_DEC_BUTTON, EFL_UI_CALENDAR_BUTTON_LEFT); } + else if (sd->dec_btn_month && !efl_isa(sd->dec_btn_month, ELM_ACCESS_CLASS)) { evas_object_del(sd->dec_btn_month); @@ -507,20 +501,7 @@ _spinner_buttons_add(Evas_Object *obj, Efl_Ui_Calendar_Data *sd) } if (!sd->inc_btn_month) - { - sd->inc_btn_month = - efl_add(EFL_UI_BUTTON_CLASS, obj, - elm_widget_element_update(obj, efl_added, PART_NAME_INC_BUTTON), - efl_ui_autorepeat_enabled_set(efl_added, EINA_TRUE), - efl_ui_autorepeat_initial_timeout_set(efl_added, 0.5), - efl_ui_autorepeat_gap_timeout_set(efl_added, 0.2)); - - efl_event_callback_add(sd->inc_btn_month, EFL_UI_EVENT_CLICKED, - _button_widget_month_inc_start_click, obj); - efl_event_callback_add(sd->inc_btn_month, EFL_UI_EVENT_REPEATED, - _button_widget_month_inc_start, obj); - } - elm_layout_content_set(obj, EFL_UI_CALENDAR_BUTTON_RIGHT, sd->inc_btn_month); + sd->inc_btn_month = _btn_create(obj, PART_NAME_INC_BUTTON, EFL_UI_CALENDAR_BUTTON_RIGHT); } else if (sd->inc_btn_month && !efl_isa(sd->inc_btn_month, ELM_ACCESS_CLASS)) { @@ -645,77 +626,35 @@ _update_data(Evas_Object *obj, int delta) return EINA_TRUE; } -static Eina_Bool -_spin_month_value(void *data) +static void +_spin_value(void *data) { EFL_UI_CALENDAR_DATA_GET(data, sd); if (_update_data(data, sd->spin_speed)) evas_object_smart_changed(data); - - sd->interval = sd->interval / 1.05; - ecore_timer_interval_set(sd->spin_month, sd->interval); - - return ECORE_CALLBACK_RENEW; } static void -_button_widget_month_inc_start_click(void *data, - const Efl_Event *ev EINA_UNUSED) +_inc_dec_btn_clicked_cb(void *data, + const Efl_Event *ev) { EFL_UI_CALENDAR_DATA_GET(data, sd); - if (sd->month_repeated) - { - sd->month_repeated = EINA_FALSE; - return; - } - sd->interval = sd->first_interval; - sd->spin_speed = 1; - _spin_month_value(data); + sd->spin_speed = (ev->object == sd->inc_btn_month) ? 1 : -1; + + _spin_value(data); } static void -_button_widget_month_inc_start(void *data, - const Efl_Event *ev EINA_UNUSED) +_inc_dec_btn_repeated_cb(void *data, + const Efl_Event *ev) { EFL_UI_CALENDAR_DATA_GET(data, sd); - sd->spin_speed = 1; - if (!sd->month_repeated) - sd->interval = sd->first_interval; - sd->month_repeated = EINA_TRUE; - _spin_month_value(data); + sd->spin_speed = (ev->object == sd->inc_btn_month) ? 1 : -1; -} - -static void -_button_widget_month_dec_start_click(void *data, - const Efl_Event *ev EINA_UNUSED) -{ - EFL_UI_CALENDAR_DATA_GET(data, sd); - if (sd->month_repeated) - { - sd->month_repeated = EINA_FALSE; - return; - } - - sd->interval = sd->first_interval; - sd->spin_speed = -1; - _spin_month_value(data); -} - -static void -_button_widget_month_dec_start(void *data, - const Efl_Event *ev EINA_UNUSED) -{ - EFL_UI_CALENDAR_DATA_GET(data, sd); - - sd->spin_speed = -1; - if (!sd->month_repeated) - sd->interval = sd->first_interval; - sd->month_repeated = EINA_TRUE; - _spin_month_value(data); + _spin_value(data); } static int @@ -900,8 +839,6 @@ _efl_ui_calendar_efl_object_destructor(Eo *obj, Efl_Ui_Calendar_Data *sd) { int i; - ecore_timer_del(sd->spin_month); - ecore_timer_del(sd->spin_year); ecore_timer_del(sd->update_timer); efl_ui_format_cb_set(obj, NULL, NULL, NULL); @@ -936,7 +873,7 @@ _access_obj_process(Evas_Object *obj, Eina_Bool is_access) snprintf(pname, sizeof(pname), "efl.cit_%d.access", i); _elm_access_edje_object_part_object_unregister - (obj, elm_layout_edje_get(obj), pname); + (obj, elm_layout_edje_get(obj), pname); } } @@ -975,7 +912,6 @@ _efl_ui_calendar_constructor_internal(Eo *obj, Efl_Ui_Calendar_Data *priv) elm_widget_sub_object_parent_add(obj); - priv->first_interval = 0.85; priv->date_min.tm_year = 2; priv->date_min.tm_mon = 0; priv->date_min.tm_mday = 1; diff --git a/src/lib/elementary/efl_ui_calendar_private.h b/src/lib/elementary/efl_ui_calendar_private.h index 1341dd565e..6cce25d130 100644 --- a/src/lib/elementary/efl_ui_calendar_private.h +++ b/src/lib/elementary/efl_ui_calendar_private.h @@ -31,15 +31,12 @@ struct _Efl_Ui_Calendar_Data double interval, first_interval; int spin_speed; int today_it, selected_it, focused_it; - Ecore_Timer *spin_month, *spin_year, *update_timer; + Ecore_Timer *update_timer; const char *weekdays[ELM_DAY_LAST]; struct tm current_date, shown_date, date, date_min, date_max; Evas_Object *inc_btn_month; Evas_Object *dec_btn_month; Evas_Object *month_access; - Evas_Object *inc_btn_year; - Evas_Object *dec_btn_year; - Evas_Object *year_access; Eo *items[42]; Efl_Ui_Calendar_Weekday first_week_day; @@ -51,11 +48,8 @@ struct _Efl_Ui_Calendar_Data Eina_Strbuf *format_strbuf; Eina_Bool selected : 1; - Eina_Bool double_spinners : 1; Eina_Bool filling : 1; Eina_Bool weekdays_set : 1; - Eina_Bool month_repeated : 1; - Eina_Bool year_repeated : 1; }; /** diff --git a/src/lib/elementary/elm_calendar.c b/src/lib/elementary/elm_calendar.c index e8bf210c0f..5c3398a1f9 100644 --- a/src/lib/elementary/elm_calendar.c +++ b/src/lib/elementary/elm_calendar.c @@ -65,38 +65,19 @@ static const Evas_Smart_Cb_Description _smart_callbacks[] = { * But, it is replaced by elm_button widget objects. The following * callback functions are also newly added for button objects. * We still keep the old signal callback functions for backward compatibility. */ + static void -_button_widget_month_inc_start_click(void *data, - Evas_Object *obj EINA_UNUSED, - void *event_info EINA_UNUSED); +_inc_dec_button_clicked_cb(void *data, const Efl_Event *event EINA_UNUSED); static void -_button_widget_month_inc_start(void *data, - Evas_Object *obj EINA_UNUSED, - void *event_info EINA_UNUSED); +_inc_dec_button_pressed_cb(void *data, const Efl_Event *event); static void -_button_widget_month_dec_start_click(void *data, - Evas_Object *obj EINA_UNUSED, - void *event_info EINA_UNUSED); -static void -_button_widget_month_dec_start(void *data, - Evas_Object *obj EINA_UNUSED, - void *event_info EINA_UNUSED); -static void -_button_widget_year_inc_start_click(void *data, - Evas_Object *obj EINA_UNUSED, - void *event_info EINA_UNUSED); -static void -_button_widget_year_inc_start(void *data, - Evas_Object *obj EINA_UNUSED, - void *event_info EINA_UNUSED); -static void -_button_widget_year_dec_start_click(void *data, - Evas_Object *obj EINA_UNUSED, - void *event_info EINA_UNUSED); -static void -_button_widget_year_dec_start(void *data, - Evas_Object *obj EINA_UNUSED, - void *event_info EINA_UNUSED); +_inc_dec_button_unpressed_cb(void *data, const Efl_Event *event EINA_UNUSED); + +EFL_CALLBACKS_ARRAY_DEFINE( _inc_dec_button_cb, + { EFL_UI_EVENT_CLICKED, _inc_dec_button_clicked_cb}, + { EFL_UI_EVENT_PRESSED, _inc_dec_button_pressed_cb}, + { EFL_UI_EVENT_UNPRESSED, _inc_dec_button_unpressed_cb} +); static Eina_Bool _key_action_activate(Evas_Object *obj, const char *params); @@ -776,11 +757,7 @@ _spinner_buttons_add(Evas_Object *obj, Elm_Calendar_Data *sd) if (!sd->dec_btn_month) { sd->dec_btn_month = elm_button_add(obj); - elm_button_autorepeat_set(sd->dec_btn_month, EINA_TRUE); - elm_button_autorepeat_initial_timeout_set(sd->dec_btn_month, 0.5); - elm_button_autorepeat_gap_timeout_set(sd->dec_btn_month, 0.2); - evas_object_smart_callback_add(sd->dec_btn_month, "clicked", _button_widget_month_dec_start_click, obj); - evas_object_smart_callback_add(sd->dec_btn_month, "repeated", _button_widget_month_dec_start, obj); + efl_event_callback_array_add(sd->dec_btn_month, _inc_dec_button_cb(), obj); } elm_object_style_set(sd->dec_btn_month, left_buf); @@ -804,11 +781,7 @@ _spinner_buttons_add(Evas_Object *obj, Elm_Calendar_Data *sd) if (!sd->inc_btn_month) { sd->inc_btn_month = elm_button_add(obj); - elm_button_autorepeat_set(sd->inc_btn_month, EINA_TRUE); - elm_button_autorepeat_initial_timeout_set(sd->inc_btn_month, 0.5); - elm_button_autorepeat_gap_timeout_set(sd->inc_btn_month, 0.2); - evas_object_smart_callback_add(sd->inc_btn_month, "clicked", _button_widget_month_inc_start_click, obj); - evas_object_smart_callback_add(sd->inc_btn_month, "repeated", _button_widget_month_inc_start, obj); + efl_event_callback_array_add(sd->inc_btn_month, _inc_dec_button_cb(), obj); } elm_object_style_set(sd->inc_btn_month, right_buf); @@ -832,12 +805,8 @@ _spinner_buttons_add(Evas_Object *obj, Elm_Calendar_Data *sd) if (!sd->dec_btn_year) { sd->dec_btn_year = elm_button_add(obj); - elm_button_autorepeat_set(sd->dec_btn_year, EINA_TRUE); - elm_button_autorepeat_initial_timeout_set(sd->dec_btn_year, 0.5); - elm_button_autorepeat_gap_timeout_set(sd->dec_btn_year, 0.2); - evas_object_smart_callback_add(sd->dec_btn_year, "clicked", _button_widget_year_dec_start_click, obj); - evas_object_smart_callback_add(sd->dec_btn_year, "repeated", _button_widget_year_dec_start, obj); - } + efl_event_callback_array_add(sd->dec_btn_year, _inc_dec_button_cb(), obj); + } elm_object_style_set(sd->dec_btn_year, left_buf); elm_layout_content_set(obj, ELM_CALENDAR_BUTTON_YEAR_LEFT, sd->dec_btn_year); @@ -860,11 +829,7 @@ _spinner_buttons_add(Evas_Object *obj, Elm_Calendar_Data *sd) if (!sd->inc_btn_year) { sd->inc_btn_year = elm_button_add(obj); - elm_button_autorepeat_set(sd->inc_btn_year, EINA_TRUE); - elm_button_autorepeat_initial_timeout_set(sd->inc_btn_year, 0.5); - elm_button_autorepeat_gap_timeout_set(sd->inc_btn_year, 0.2); - evas_object_smart_callback_add(sd->inc_btn_year, "clicked", _button_widget_year_inc_start_click, obj); - evas_object_smart_callback_add(sd->inc_btn_year, "repeated", _button_widget_year_inc_start, obj); + efl_event_callback_array_add(sd->inc_btn_year, _inc_dec_button_cb(), obj); } elm_object_style_set(sd->inc_btn_year, right_buf); @@ -1004,29 +969,15 @@ _update_data(Evas_Object *obj, Eina_Bool month, } static Eina_Bool -_spin_month_value(void *data) +_spin_value(void *data) { ELM_CALENDAR_DATA_GET(data, sd); - if (_update_data(data, EINA_TRUE, sd->spin_speed)) + if (_update_data(data, sd->month_btn_clicked, sd->spin_speed)) evas_object_smart_changed(data); sd->interval = sd->interval / 1.05; - ecore_timer_interval_set(sd->spin_month, sd->interval); - - return ECORE_CALLBACK_RENEW; -} - -static Eina_Bool -_spin_year_value(void *data) -{ - ELM_CALENDAR_DATA_GET(data, sd); - - if (_update_data(data, EINA_FALSE, sd->spin_speed)) - evas_object_smart_changed(data); - - sd->interval = sd->interval / 1.05; - ecore_timer_interval_set(sd->spin_year, sd->interval); + ecore_timer_interval_set(sd->spin_timer, sd->interval); return ECORE_CALLBACK_RENEW; } @@ -1042,10 +993,13 @@ _button_month_inc_start(void *data, sd->interval = sd->first_interval; sd->spin_speed = 1; - ecore_timer_del(sd->spin_month); - sd->spin_month = ecore_timer_add(sd->interval, _spin_month_value, data); + sd->month_btn_clicked = EINA_TRUE; + ecore_timer_del(sd->spin_timer); + sd->spin_timer = ecore_timer_add(sd->interval, _spin_value, data); - _spin_month_value(data); + elm_widget_scroll_freeze_push(data); + + _spin_value(data); } /* Legacy callbacks for signals from edje */ @@ -1059,10 +1013,13 @@ _button_month_dec_start(void *data, sd->interval = sd->first_interval; sd->spin_speed = -1; - ecore_timer_del(sd->spin_month); - sd->spin_month = ecore_timer_add(sd->interval, _spin_month_value, data); + sd->month_btn_clicked = EINA_TRUE; + ecore_timer_del(sd->spin_timer); + sd->spin_timer = ecore_timer_add(sd->interval, _spin_value, data); - _spin_month_value(data); + elm_widget_scroll_freeze_push(data); + + _spin_value(data); } /* Legacy callbacks for signals from edje */ @@ -1075,7 +1032,9 @@ _button_month_stop(void *data, ELM_CALENDAR_DATA_GET(data, sd); sd->interval = sd->first_interval; - ELM_SAFE_FREE(sd->spin_month, ecore_timer_del); + ELM_SAFE_FREE(sd->spin_timer, ecore_timer_del); + + elm_widget_scroll_freeze_pop(obj); } /* Legacy callbacks for signals from edje */ @@ -1089,10 +1048,13 @@ _button_year_inc_start(void *data, sd->interval = sd->first_interval; sd->spin_speed = 1; - ecore_timer_del(sd->spin_year); - sd->spin_year = ecore_timer_add(sd->interval, _spin_year_value, data); + sd->month_btn_clicked = EINA_FALSE; + ecore_timer_del(sd->spin_timer); + sd->spin_timer = ecore_timer_add(sd->interval, _spin_value, data); - _spin_year_value(data); + elm_widget_scroll_freeze_push(data); + + _spin_value(data); } /* Legacy callbacks for signals from edje */ @@ -1106,10 +1068,13 @@ _button_year_dec_start(void *data, sd->interval = sd->first_interval; sd->spin_speed = -1; - ecore_timer_del(sd->spin_year); - sd->spin_year = ecore_timer_add(sd->interval, _spin_year_value, data); + sd->month_btn_clicked = EINA_FALSE; + ecore_timer_del(sd->spin_timer); + sd->spin_timer = ecore_timer_add(sd->interval, _spin_value, data); - _spin_year_value(data); + elm_widget_scroll_freeze_push(data); + + _spin_value(data); } /* Legacy callbacks for signals from edje */ @@ -1122,132 +1087,48 @@ _button_year_stop(void *data, ELM_CALENDAR_DATA_GET(data, sd); sd->interval = sd->first_interval; - ELM_SAFE_FREE(sd->spin_year, ecore_timer_del); + ELM_SAFE_FREE(sd->spin_timer, ecore_timer_del); + + elm_widget_scroll_freeze_pop(obj); } static void -_button_widget_month_inc_start_click(void *data, - Evas_Object *obj EINA_UNUSED, - void *event_info EINA_UNUSED) +_inc_dec_button_clicked_cb(void *data, const Efl_Event *event EINA_UNUSED) { ELM_CALENDAR_DATA_GET(data, sd); - if (sd->month_repeated) - { - sd->month_repeated = EINA_FALSE; - return; - } sd->interval = sd->first_interval; - sd->spin_speed = 1; - _spin_month_value(data); -} + ELM_SAFE_FREE(sd->spin_timer, ecore_timer_del); + _spin_value(data); +} static void -_button_widget_month_inc_start(void *data, - Evas_Object *obj EINA_UNUSED, - void *event_info EINA_UNUSED) +_inc_dec_button_pressed_cb(void *data, const Efl_Event *event) { ELM_CALENDAR_DATA_GET(data, sd); - sd->spin_speed = 1; - if (!sd->month_repeated) - sd->interval = sd->first_interval; - sd->month_repeated = EINA_TRUE; - _spin_month_value(data); - -} - -static void -_button_widget_month_dec_start_click(void *data, - Evas_Object *obj EINA_UNUSED, - void *event_info EINA_UNUSED) -{ - ELM_CALENDAR_DATA_GET(data, sd); - if (sd->month_repeated) - { - sd->month_repeated = EINA_FALSE; - return; - } - sd->interval = sd->first_interval; - sd->spin_speed = -1; - _spin_month_value(data); + sd->spin_speed = ((sd->inc_btn_month == event->object) || + (sd->inc_btn_year == event->object)) ? 1 : -1; + + sd->month_btn_clicked = ((sd->inc_btn_month == event->object) || + (sd->dec_btn_month == event->object)) ? EINA_TRUE : EINA_FALSE; + + ELM_SAFE_FREE(sd->spin_timer, ecore_timer_del); + sd->spin_timer = ecore_timer_add(sd->interval, _spin_value, data); + + elm_widget_scroll_freeze_push(data); } static void -_button_widget_month_dec_start(void *data, - Evas_Object *obj EINA_UNUSED, - void *event_info EINA_UNUSED) +_inc_dec_button_unpressed_cb(void *data, const Efl_Event *event EINA_UNUSED) { ELM_CALENDAR_DATA_GET(data, sd); - sd->spin_speed = -1; - if (!sd->month_repeated) - sd->interval = sd->first_interval; - sd->month_repeated = EINA_TRUE; - _spin_month_value(data); -} - -static void -_button_widget_year_inc_start_click(void *data, - Evas_Object *obj EINA_UNUSED, - void *event_info EINA_UNUSED) -{ - ELM_CALENDAR_DATA_GET(data, sd); - if (sd->year_repeated) - { - sd->year_repeated = EINA_FALSE; - return; - } - sd->interval = sd->first_interval; - sd->spin_speed = 1; - _spin_year_value(data); -} + ELM_SAFE_FREE(sd->spin_timer, ecore_timer_del); -static void -_button_widget_year_inc_start(void *data, - Evas_Object *obj EINA_UNUSED, - void *event_info EINA_UNUSED) -{ - ELM_CALENDAR_DATA_GET(data, sd); - - sd->spin_speed = 1; - if (!sd->year_repeated) - sd->interval = sd->first_interval; - sd->year_repeated = EINA_TRUE; - _spin_year_value(data); -} - -static void -_button_widget_year_dec_start_click(void *data, - Evas_Object *obj EINA_UNUSED, - void *event_info EINA_UNUSED) -{ - ELM_CALENDAR_DATA_GET(data, sd); - if (sd->year_repeated) - { - sd->year_repeated = EINA_FALSE; - return; - } - - sd->interval = sd->first_interval; - sd->spin_speed = -1; - _spin_year_value(data); -} - -static void -_button_widget_year_dec_start(void *data, - Evas_Object *obj EINA_UNUSED, - void *event_info EINA_UNUSED) -{ - ELM_CALENDAR_DATA_GET(data, sd); - - sd->spin_speed = -1; - if (!sd->year_repeated) - sd->interval = sd->first_interval; - sd->year_repeated = EINA_TRUE; - _spin_year_value(data); + elm_widget_scroll_freeze_pop(data); } static int @@ -1530,8 +1411,7 @@ _elm_calendar_efl_canvas_group_group_del(Eo *obj, Elm_Calendar_Data *sd) int i; Elm_Calendar_Mark *mark; - ecore_timer_del(sd->spin_month); - ecore_timer_del(sd->spin_year); + ecore_timer_del(sd->spin_timer); ecore_timer_del(sd->update_timer); if (sd->marks) diff --git a/src/lib/elementary/elm_widget_calendar.h b/src/lib/elementary/elm_widget_calendar.h index e68c490f9d..e3d82480cc 100644 --- a/src/lib/elementary/elm_widget_calendar.h +++ b/src/lib/elementary/elm_widget_calendar.h @@ -39,7 +39,7 @@ struct _Elm_Calendar_Data double interval, first_interval; int spin_speed; int today_it, selected_it, focused_it; - Ecore_Timer *spin_month, *spin_year, *update_timer; + Ecore_Timer *update_timer, *spin_timer; Elm_Calendar_Format_Cb format_func; const char *weekdays[ELM_DAY_LAST]; struct tm current_time, selected_time, shown_time, date_min, date_max; @@ -62,8 +62,7 @@ struct _Elm_Calendar_Data Eina_Bool double_spinners : 1; Eina_Bool filling : 1; Eina_Bool weekdays_set : 1; - Eina_Bool month_repeated : 1; - Eina_Bool year_repeated : 1; + Eina_Bool month_btn_clicked : 1; }; struct _Elm_Calendar_Mark