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
This commit is contained in:
Woochan Lee 2018-07-23 15:49:10 +09:00 committed by Hermet Park
parent 3ca3f865fd
commit 62a09f69a1
4 changed files with 108 additions and 299 deletions

View File

@ -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;

View File

@ -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;
};
/**

View File

@ -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)

View File

@ -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