From: Michal Skorupinski Date: Mon, 15 May 2017 16:13:04 +0000 (+0200) Subject: [UI] Fix in the datetime popup's reaction to keyboard events. X-Git-Tag: submit/tizen/20170614.011152~26^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=fc1555d8424b948da5ed9c6065eea740454f248e;p=profile%2Ftv%2Fapps%2Fnative%2Fair_settings.git [UI] Fix in the datetime popup's reaction to keyboard events. The time value was set regardless of the 'back' or 'ok' button being pressed. Change-Id: Idf04854d7ab71d34dcd4bbf489b2a83ea3c5288c Signed-off-by: Michal Skorupinski --- diff --git a/include/view/common/view_datetime.h b/include/view/common/view_datetime.h index 882b324..d663ede 100644 --- a/include/view/common/view_datetime.h +++ b/include/view/common/view_datetime.h @@ -20,7 +20,9 @@ #include "common/viewmgr.h" #include "common/inputmgr.h" -Evas_Object *view_datetime_create(Evas_Object *parent, const char *part, bool is_date); +typedef void (*view_datetime_hide_cb)(void *data, Evas_Object *dt, bool is_ok); + +Evas_Object *view_datetime_create(Evas_Object *parent, const char *part, bool is_date, view_datetime_hide_cb hide_cb, void *cb_data); Evas_Object *view_datetime_get_spinner(Evas_Object *datetime, int field); Evas_Object *view_datetime_get_spinner_button(Evas_Object *datetime, int field); void view_datetime_set_time_mode(Evas_Object *popup, Evas_Object *datetime, bool is_date, bool is_24); diff --git a/src/view/common/view_datetime.c b/src/view/common/view_datetime.c index ec4c1ac..5050300 100644 --- a/src/view/common/view_datetime.c +++ b/src/view/common/view_datetime.c @@ -26,13 +26,20 @@ #include "common/viewmgr.h" #include "view/common/view_datetime.h" +typedef struct { + Evas_Object *popup; + view_datetime_hide_cb hide_cb; + void *hide_cb_data; +} view_datetime_data_t; + static void _DBG_datetime(Evas_Object *datetime); -static void _set_spinner_btn_callbacks(Evas_Object *popup, Evas_Object *dt, int start_field, int end_field); +static void _set_spinner_btn_callbacks(Evas_Object *popup, Evas_Object *dt, int start_field, int end_field, view_datetime_data_t *datetime_data); static void _set_datetime_focus_chain(Evas_Object *datetime, int start_field, int end_field); static void _datetime_btn_keydown_cb(int id, void *data, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev); static void _datetime_focused_cb(int id, void *data, Evas_Object *obj, Elm_Object_Item *item); static void _datetime_unfocused_cb(int id, void *data, Evas_Object *obj, Elm_Object_Item *item); static void _datetime_keydown_cb(int id, void *data, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev); +static void _datetime_destroy_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); static input_handler datetime_btn_handler = { .key_down = _datetime_btn_keydown_cb, @@ -44,7 +51,7 @@ static input_handler datetime_handler = { .key_down = _datetime_keydown_cb, }; -Evas_Object *view_datetime_create(Evas_Object *parent, const char *part, bool is_date) +Evas_Object *view_datetime_create(Evas_Object *parent, const char *part, bool is_date, view_datetime_hide_cb hide_cb, void *cb_data) { SETTING_TRACE_BEGIN; @@ -56,6 +63,7 @@ Evas_Object *view_datetime_create(Evas_Object *parent, const char *part, bool is Eina_Bool field_ampm = !is_date; Evas_Object *datetime = utils_add_datetime(parent, part, field_year, field_month, field_date, field_hour, field_minute, field_ampm, NULL); + view_datetime_data_t *datetime_data = calloc(1, sizeof(view_datetime_data_t)); if (!datetime) { dlog_print(DLOG_ERROR, LOG_TAG, "[%s:%d] datetime == NULL", __FILE__, __LINE__); @@ -65,9 +73,14 @@ Evas_Object *view_datetime_create(Evas_Object *parent, const char *part, bool is evas_object_repeat_events_set(datetime, EINA_FALSE); elm_object_focus_allow_set(datetime, EINA_TRUE); + datetime_data->popup = parent; + datetime_data->hide_cb = hide_cb; + datetime_data->hide_cb_data = cb_data; + _DBG_datetime(datetime); - _set_spinner_btn_callbacks(parent, datetime, 0, 5); + _set_spinner_btn_callbacks(parent, datetime, 0, 5, datetime_data); inputmgr_add_callback(datetime, 0, &datetime_handler, NULL); + evas_object_event_callback_add(datetime, EVAS_CALLBACK_DEL, _datetime_destroy_cb, (void *)datetime_data); SETTING_TRACE_END; return datetime; @@ -96,6 +109,11 @@ void view_datetime_set_time_mode(Evas_Object *popup, Evas_Object *datetime, bool _DBG_datetime(datetime); } +static void _datetime_destroy_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + free(data); +} + static void _DBG_datetime(Evas_Object *datetime) { const char *datetime_style = elm_object_style_get(datetime); @@ -182,15 +200,15 @@ static void _set_datetime_focus_chain(Evas_Object *datetime, int start_field, in static void _datetime_btn_keydown_cb(int id, void *data, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { - Evas_Object *popup = (Evas_Object *)data; - Evas_Object *dt = elm_object_content_get(popup); + view_datetime_data_t *datetime_data = (view_datetime_data_t *)data; + Evas_Object *dt = elm_object_content_get(datetime_data->popup); Evas_Object *spinner = view_datetime_get_spinner(dt, id); double value = elm_spinner_value_get(spinner); switch (ev->keycode) { case KEY_ID_BACK: case KEY_ID_ENTER: - evas_object_hide(popup); + evas_object_hide(datetime_data->popup); dlog_print(DLOG_DEBUG, LOG_TAG, "[%s:%d] btn PRESSED [KEY_ID_BACK]", __FILE__, __LINE__); break; case KEY_ID_UP: @@ -202,15 +220,18 @@ static void _datetime_btn_keydown_cb(int id, void *data, Evas *e, Evas_Object * dlog_print(DLOG_DEBUG, LOG_TAG, "[%s:%d] btn PRESSED [KEY_ID_DOWN]", __FILE__, __LINE__); break; } + + if (datetime_data->hide_cb) + datetime_data->hide_cb(datetime_data->hide_cb_data, dt, (ev->keycode == KEY_ID_ENTER)); } -static void _set_spinner_btn_callbacks(Evas_Object *popup, Evas_Object *dt, int start_field, int end_field) +static void _set_spinner_btn_callbacks(Evas_Object *popup, Evas_Object *dt, int start_field, int end_field, view_datetime_data_t *datetime_data) { Evas_Object *btn; int i; for (i = start_field; i <= end_field; ++i) { btn = view_datetime_get_spinner_button(dt, i); - inputmgr_add_callback(btn, i, &datetime_btn_handler, popup); + inputmgr_add_callback(btn, i, &datetime_btn_handler, datetime_data); evas_object_propagate_events_set(btn, EINA_FALSE); } } diff --git a/src/view/system/view_clock.c b/src/view/system/view_clock.c index ef61af9..9393d06 100755 --- a/src/view/system/view_clock.c +++ b/src/view/system/view_clock.c @@ -248,12 +248,14 @@ static bool _add_clock_setting(clock_view_priv_data *priv) return true; } -static void _datetime_popup_callback_hide_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +static void _datetime_popup_hide_cb(void *data, Evas_Object *dt, bool is_ok) { clock_view_priv_data *priv = data; - elm_datetime_value_get(priv->datetime_popup_datetime, &priv->displayed_time); - _set_displayed_time(priv, &priv->displayed_time, elm_check_state_get(priv->check_24)); + if (is_ok) { + elm_datetime_value_get(priv->datetime_popup_datetime, &priv->displayed_time); + _set_displayed_time(priv, &priv->displayed_time, elm_check_state_get(priv->check_24)); + } } static bool _datetime_popup_create(clock_view_priv_data *priv) @@ -266,14 +268,13 @@ static bool _datetime_popup_create(clock_view_priv_data *priv) elm_object_style_set(priv->datetime_popup, "settings"); - priv->datetime_popup_datetime = view_datetime_create(priv->datetime_popup, NULL, false); + priv->datetime_popup_datetime = view_datetime_create(priv->datetime_popup, NULL, false, _datetime_popup_hide_cb, priv); if (!priv->datetime_popup_datetime) { dlog_print(DLOG_ERROR, LOG_TAG, "[%s:%d] priv->datetime_popup == NULL", __FILE__, __LINE__); return false; } elm_object_content_set(priv->datetime_popup, priv->datetime_popup_datetime); - evas_object_event_callback_add(priv->datetime_popup, EVAS_CALLBACK_HIDE, _datetime_popup_callback_hide_cb, priv); return true; }