[UI] Fix in the datetime popup's reaction to keyboard events. 45/129245/2
authorMichal Skorupinski <m.skorupinsk@samsung.com>
Mon, 15 May 2017 16:13:04 +0000 (18:13 +0200)
committerRadek Kintop <r.kintop@samsung.com>
Thu, 18 May 2017 10:16:42 +0000 (12:16 +0200)
The time value was set regardless of the 'back' or 'ok' button being pressed.

Change-Id: Idf04854d7ab71d34dcd4bbf489b2a83ea3c5288c
Signed-off-by: Michal Skorupinski <m.skorupinsk@samsung.com>
include/view/common/view_datetime.h
src/view/common/view_datetime.c
src/view/system/view_clock.c

index 882b324..d663ede 100644 (file)
@@ -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);
index ec4c1ac..5050300 100644 (file)
 #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);
        }
 }
index ef61af9..9393d06 100755 (executable)
@@ -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;
 }