From d5ed155c250a0caad6d80602bba8382eb9dfe6c1 Mon Sep 17 00:00:00 2001 From: "kiso.chang" Date: Wed, 12 Oct 2016 16:34:16 +0900 Subject: [PATCH] Fix problem sw keyboard cover time widgets in clock Change-Id: I6456933afdd5d623fc66091c61016c1ec1bef26b Signed-off-by: kiso.chang --- src/view/system/view_clock.c | 150 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 148 insertions(+), 2 deletions(-) mode change 100644 => 100755 src/view/system/view_clock.c diff --git a/src/view/system/view_clock.c b/src/view/system/view_clock.c old mode 100644 new mode 100755 index 6a58cb6..5812d18 --- a/src/view/system/view_clock.c +++ b/src/view/system/view_clock.c @@ -27,6 +27,12 @@ #include "data/system/settings_clock.h" #include "app_string.h" + +#define DEFAULT_KEYPAD_POS 636 +#define PADDING_VKEYBOARD 30 + + + enum setup_type { TYPE_MANUAL = 0, TYPE_AUTO, @@ -46,6 +52,7 @@ static const char *str_setup_type_opt[] = { typedef struct { Evas_Object *win; Evas_Object *base; + Evas_Object *conformant; Evas_Object *done; Evas_Object *cancel; Evas_Object *auto_manual_setup_btn; @@ -55,6 +62,11 @@ typedef struct { Evas_Object *check_24; Evas_Object *time_part; enum setup_type cur_type; + + /* store input panel state */ + bool input_panel_show; + Evas_Object *focused_entry; + } clock_view_priv_data; enum input_handler_type { @@ -93,6 +105,104 @@ static void _get_time_from_controls(struct tm *result, const clock_view_priv_dat /* When auto/manual setup dropdown is active, focus should be only on it*/ static void _focused(int id, void *data, Evas_Object *obj, Elm_Object_Item *item); + + +static void _dt_focused_cb(int id, void *data, Evas_Object *obj, Elm_Object_Item *item) +{ + SETTING_TRACE_BEGIN + clock_view_priv_data *priv = data; + if (!priv) + return; + + priv->focused_entry = obj; + /* To prevent hiding virtual keyboard + * when user input ip address in sequence */ + priv->input_panel_show = true; +} + +static void _dt_unfocused_cb(int id, void *data, Evas_Object *obj, Elm_Object_Item *item) +{ + SETTING_TRACE_BEGIN + clock_view_priv_data *priv = data; + if (!priv) + return; +} + + +static bool display_status = false; + +static void _keypad_down_cb(void *data, Evas_Object *obj, void *event_info) +{ + SETTING_TRACE_BEGIN + clock_view_priv_data *priv = data; + Evas_Coord x, y, w, h; + Evas_Coord entry_y, entry_h; + + if (!priv) { + _ERR("invalid data"); + return; + } + + if (priv->input_panel_show && display_status) { + evas_object_geometry_get(priv->base, &x, &y, &w, &h); + evas_object_move(priv->base, x, 0); + + display_status = false; + } else if (priv->input_panel_show == false && display_status) { + evas_object_geometry_get(priv->base, &x, &y, &w, &h); + evas_object_move(priv->base, x, 0); + + display_status = false; + } + display_status = false; +} + +static void _keypad_up_cb(void *data, Evas_Object *obj, void *event_info) +{ + SETTING_TRACE_BEGIN + clock_view_priv_data *priv = data; + Evas_Coord x, y, w, h; + Evas_Coord entry_y, entry_h; + + if (!priv) { + _ERR("invalid data"); + return; + } + + if (priv->input_panel_show && display_status == false) { + evas_object_geometry_get(priv->focused_entry, &x, &entry_y, &w, &entry_h); + evas_object_geometry_get(priv->base, &x, &y, &w, &h); + + if (entry_y + entry_h >= (DEFAULT_KEYPAD_POS)) { + Evas_Coord moved_height; + moved_height = (DEFAULT_KEYPAD_POS - PADDING_VKEYBOARD) + - (entry_y + entry_h); + evas_object_move(priv->base, x, moved_height); + } else { + evas_object_move(priv->base, x, 0); + } + } else if (priv->input_panel_show && display_status) { + evas_object_geometry_get(priv->focused_entry, &x, &entry_y, &w, &entry_h); + evas_object_geometry_get(priv->base, &x, &y, &w, &h); + + /* If virtual keyboard is already displayed, + * entry height need to be compensated. */ + if (entry_y - y + entry_h >= (DEFAULT_KEYPAD_POS)) { + Evas_Coord moved_height; + moved_height = (DEFAULT_KEYPAD_POS - PADDING_VKEYBOARD) + - (entry_y - y + entry_h); + evas_object_move(priv->base, x, moved_height); + } else { + evas_object_move(priv->base, x, 0); + } + } + + display_status = true; + +} + + + static input_handler _auto_manual_setup_input_handler = { .mouse_move = _auto_manual_mouse_move_cb, .key_down = _auto_manual_setup_key_down_cb, @@ -120,7 +230,9 @@ static input_handler cancel_btn_handler = { }; static input_handler date_time_handler = { - .key_down = _any_item_back_key_down_cb + .key_down = _any_item_back_key_down_cb, + .focused = _dt_focused_cb, + .unfocused = _dt_unfocused_cb }; static void _destroy_setup_type_popup(clock_view_priv_data *priv) @@ -188,6 +300,8 @@ static void _draw_setup_type_popup(clock_view_priv_data *priv) static bool _add_clock_setting(clock_view_priv_data *priv) { + SETTING_TRACE_BEGIN + Evas_Object *done = NULL; Evas_Object *cancel = NULL; @@ -243,6 +357,7 @@ static bool _add_clock_setting(clock_view_priv_data *priv) inputmgr_add_callback(priv->date_part, INPUT_HANDLER_TYPE_DATE_TIME, &date_time_handler, priv); inputmgr_add_callback(priv->time_part, INPUT_HANDLER_TYPE_DATE_TIME, &date_time_handler, priv); + return true; } @@ -250,6 +365,7 @@ static Evas_Object *_create(Evas_Object *win, void *data) { SETTING_TRACE_BEGIN; clock_view_priv_data *priv = NULL; + Evas_Object *conformant = NULL; Evas_Object *base = NULL; if (!win) { @@ -257,6 +373,16 @@ static Evas_Object *_create(Evas_Object *win, void *data) return NULL; } + elm_win_conformant_set(win, EINA_TRUE); + conformant = elm_conformant_add(win); + if (!conformant) { + _ERR("Adding conformant failed."); + return NULL; + } +/* + evas_object_size_hint_weight_set(conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, conformant); +*/ priv = (clock_view_priv_data *)calloc(1, sizeof(clock_view_priv_data)); if (!priv) { _ERR("Calloc failed."); @@ -272,6 +398,15 @@ static Evas_Object *_create(Evas_Object *win, void *data) priv->win = win; priv->base = base; + priv->conformant = conformant; + +/* + elm_object_content_set(conformant, priv->base); + evas_object_show(conformant); +*/ + evas_object_smart_callback_add(priv->conformant, "virtualkeypad,state,on", _keypad_up_cb, priv); + evas_object_smart_callback_add(priv->conformant, "virtualkeypad,state,off", _keypad_down_cb, priv); + if (!_add_clock_setting(priv)) { _ERR("failed to add clock setting layout"); @@ -280,6 +415,8 @@ static Evas_Object *_create(Evas_Object *win, void *data) return NULL; } + + if (!viewmgr_set_view_data(VIEW_CLOCK, priv)) { _ERR("Set view data failed."); evas_object_del(base); @@ -359,8 +496,13 @@ static void _destroy(void *data) _ERR("Get data failed."); return; } - priv = (clock_view_priv_data *)data; + + + evas_object_smart_callback_del(priv->conformant, "virtualkeypad,state,on", _keypad_up_cb); + evas_object_smart_callback_del(priv->conformant, "virtualkeypad,state,off", _keypad_down_cb); + + evas_object_del(priv->base); free(priv); } @@ -565,3 +707,7 @@ static void _focused(int id, void *data, Evas_Object *obj, Elm_Object_Item *item if (priv && priv->setup_type_popup) elm_object_focus_set(priv->setup_type_popup, EINA_TRUE); } + + + + -- 2.7.4