summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/defs.h1
-rw-r--r--src/view/view_user_edit.c166
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;