diff options
-rw-r--r-- | include/defs.h | 1 | ||||
-rw-r--r-- | src/view/view_user_edit.c | 166 |
2 files changed, 133 insertions, 34 deletions
diff --git a/include/defs.h b/include/defs.h index e87fc90..328503b 100644 --- a/include/defs.h +++ b/include/defs.h @@ -175,5 +175,6 @@ #define MESSAGE_CANCEL "Cancel" #define MESSAGE_OK "OK" #define MESSAGE_DONE "Done" +#define MESSAGE_DISCARD "Discard" #endif /* __AIR_HOME_DEFS_H__ */ diff --git a/src/view/view_user_edit.c b/src/view/view_user_edit.c index 15f3ce4..5f4e8d9 100644 --- a/src/view/view_user_edit.c +++ b/src/view/view_user_edit.c @@ -27,6 +27,7 @@ #include "utils.h" #define MESSAGE_DELETE_CONTENTS "If you delete this user, their data will also be deleted." +#define MESSAGE_DISCARD_CONTENTS "Discard all entered data?<br>If you are out of this screen, data won't be saved" #define MESSAGE_ENTRY_NAME "User Name" #define MESSAGE_ENTRY_PIN "Pin code" @@ -71,6 +72,15 @@ struct _priv { struct datamgr_item *di; }; +static void _discard_key_down(int id, void *data, Evas *e, Evas_Object *obj, + Evas_Event_Key_Down *ev); + +static void _cancel_user_key_down(int id, void *data, Evas *e, Evas_Object *obj, + Evas_Event_Key_Down *ev); + +static void _delete_user_key_down(int id, void *data, Evas *e, Evas_Object *obj, + Evas_Event_Key_Down *ev); + static void _get_profile(struct _priv *priv, const char **name, const char **photo, const char **pin) { @@ -113,10 +123,125 @@ static input_handler done_handler = { .key_down = _done_key_down }; +static void _delete_popup(struct _priv *priv, input_handler *handler, + Evas_Object *obj) +{ + inputmgr_remove_callback(obj, handler); + evas_object_del(priv->popup); + priv->popup = NULL; +} + +static input_handler cancel_user_handler = { + .key_down = _cancel_user_key_down +}; + +static void _cancel_user_key_down(int id, void *data, Evas *e, Evas_Object *obj, + Evas_Event_Key_Down *ev) +{ + struct _priv *priv; + + if (!data) { + _ERR("Invalid argument"); + return; + } + + priv = data; + + if (!strcmp(ev->keyname, KEY_ENTER) || + !strcmp(ev->keyname, KEY_ENTER_REMOTE) || + !strcmp(ev->keyname, KEY_BACK) || + !strcmp(ev->keyname, KEY_BACK_REMOTE)) { + _delete_popup(priv, &cancel_user_handler, obj); + } +} + +static input_handler discard_handler = { + .key_down = _discard_key_down +}; + +static void _discard_key_down(int id, void *data, Evas *e, Evas_Object *obj, + Evas_Event_Key_Down *ev) +{ + struct _priv *priv; + + if (!data) { + _ERR("Invalid argument"); + return; + } + + priv = data; + + if (!strcmp(ev->keyname, KEY_ENTER) || + !strcmp(ev->keyname, KEY_ENTER_REMOTE)) { + _delete_popup(priv, &discard_handler, obj); + viewmgr_pop_view(); + } else if (!strcmp(ev->keyname, KEY_BACK) || + !strcmp(ev->keyname, KEY_BACK_REMOTE)) { + _delete_popup(priv, &discard_handler, obj); + } +} + +static void _add_discard_popup(struct _priv *priv) +{ + Evas_Object *popup, *discard_btn, *cancel_btn; + + popup = utils_add_popup(priv->base, MESSAGE_DISCARD, + MESSAGE_DISCARD_CONTENTS); + if (!popup) { + _ERR("failed to add popup"); + return; + } + priv->popup = popup; + + discard_btn = utils_add_button(popup, MESSAGE_DISCARD, + PART_POPUP_BUTTON_1); + if (!discard_btn) { + _ERR("failed to add delete btn"); + evas_object_del(popup); + return; + } + inputmgr_add_callback(discard_btn, 0, &discard_handler, priv); + + cancel_btn = utils_add_button(popup, MESSAGE_CANCEL, + PART_POPUP_BUTTON_2); + if (!cancel_btn) { + _ERR("failed to add cancel btn"); + evas_object_del(popup); + return; + } + inputmgr_add_callback(cancel_btn, 0, &cancel_user_handler, priv); + elm_object_focus_set(cancel_btn, EINA_TRUE); +} + +static bool _check_changed_input(struct _priv *priv) +{ + const char *photo, *name, *pin; + + _get_profile(priv, &name, &photo, &pin); + + if (priv->di) { + if (!strcmp(name, priv->di->title) && !strcmp(pin, "") && + !strcmp(photo, priv->di->icon)) + return false; + } else { + if (!strcmp(name, MESSAGE_ENTRY_NAME) && + !strcmp(pin, MESSAGE_ENTRY_PIN) && + !strcmp(photo, IMAGE_USER_DEFAULT)) + return false; + } + + return true; +} + static void _cancel_key_down(int id, void *data, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { if (!strcmp(ev->keyname, KEY_ENTER)) { + if (_check_changed_input(data)) { + _add_discard_popup(data); + return; + } + viewmgr_pop_view(); } } @@ -144,7 +269,7 @@ static bool _add_btns(struct _priv *priv) evas_object_del(done); return false; } - inputmgr_add_callback(cancel, 0, &cancel_handler, NULL); + inputmgr_add_callback(cancel, 0, &cancel_handler, priv); priv->cancel = cancel; priv->done = done; @@ -468,6 +593,10 @@ static Evas_Object *_create(Evas_Object *win, void *data) return base; } +static input_handler delete_user_handler = { + .key_down = _delete_user_key_down +}; + static void _delete_user_key_down(int id, void *data, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { @@ -482,47 +611,16 @@ static void _delete_user_key_down(int id, void *data, Evas *e, Evas_Object *obj, if (!strcmp(ev->keyname, KEY_ENTER) || !strcmp(ev->keyname, KEY_ENTER_REMOTE)) { - evas_object_del(priv->popup); - priv->popup = NULL; + _delete_popup(priv, &delete_user_handler, obj); priv->di->action = ITEM_SELECT_ACTION_DELETE; datamgr_select_item(priv->dm, priv->di); viewmgr_pop_view(); } else if (!strcmp(ev->keyname, KEY_BACK) || !strcmp(ev->keyname, KEY_BACK_REMOTE)) { - evas_object_del(priv->popup); - priv->popup = NULL; - } -} - -static input_handler delete_user_handler = { - .key_down = _delete_user_key_down -}; - -static void _cancel_user_key_down(int id, void *data, Evas *e, Evas_Object *obj, - Evas_Event_Key_Down *ev) -{ - struct _priv *priv; - - if (!data) { - _ERR("Invalid argument"); - return; - } - - priv = data; - - if (!strcmp(ev->keyname, KEY_ENTER) || - !strcmp(ev->keyname, KEY_ENTER_REMOTE) || - !strcmp(ev->keyname, KEY_BACK) || - !strcmp(ev->keyname, KEY_BACK_REMOTE)) { - evas_object_del(priv->popup); - priv->popup = NULL; + _delete_popup(priv, &delete_user_handler, obj); } } -static input_handler cancel_user_handler = { - .key_down = _cancel_user_key_down -}; - static void _add_delete_popup(struct _priv *priv) { Evas_Object *popup, *delete_btn, *cancel_btn; |