3 * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
5 * Licensed under the Apache License, Version 2.0 (the License);
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an AS IS BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
18 #include <Elementary.h>
19 #include <app_debug.h>
24 #include "view_user_edit.h"
25 #include "view_photo.h"
29 #define MESSAGE_BTN_DONE "Done"
30 #define MESSAGE_BTN_CANCEL "Cancel"
31 #define MESSAGE_ADD_USER "Add user"
32 #define MESSAGE_EDIT_USER "Edit user"
33 #define MESSAGE_DELETE_USER "Delete user"
34 #define MESSAGE_DELETE_CONTENTS "If you delete this user, their data will also be deleted."
35 #define MESSAGE_DELETE "Delete"
36 #define MESSAGE_CANCEL "Cancel"
38 #define MESSAGE_ENTRY_NAME "User Name"
39 #define MESSAGE_ENTRY_ACCOUNT "sample@tizen.com"
40 #define MESSAGE_ENTRY_PIN "Pin code"
41 #define ICON_ADD "add"
42 #define KEY_ICON "icon"
43 #define KEY_FOCUS_ICON "focusicon"
45 #define CTXPOPUP_X 294
46 #define CTXPOPUP_Y 310
51 const char *focus_file;
53 const char *focus_message;
66 Evas_Object *focus_icon;
69 Evas_Object *ctxpopup;
76 static void _done_key_down(int id, void *data, Evas *e, Evas_Object *obj,
77 Evas_Event_Key_Down *ev)
79 if (!strcmp(ev->keyname, KEY_ENTER)) {
80 /* check state of user edit */
85 static input_handler done_handler = {
86 .key_down = _done_key_down
89 static void _cancel_key_down(int id, void *data, Evas *e, Evas_Object *obj,
90 Evas_Event_Key_Down *ev)
92 if (!strcmp(ev->keyname, KEY_ENTER)) {
97 static input_handler cancel_handler = {
98 .key_down = _cancel_key_down
101 static bool _add_btns(struct _priv *priv)
103 Evas_Object *done, *cancel;
105 done = utils_add_button(priv->base, MESSAGE_BTN_DONE,
106 PART_USER_EDIT_BTN_DONE);
108 _ERR("failed to add done btn");
111 inputmgr_add_callback(done, 0, &done_handler, NULL);
113 cancel = utils_add_button(priv->base, MESSAGE_BTN_CANCEL,
114 PART_USER_EDIT_BTN_CANCEL);
116 _ERR("failed to add cancel btn");
117 evas_object_del(done);
120 inputmgr_add_callback(cancel, 0, &cancel_handler, NULL);
122 priv->cancel = cancel;
128 static void _focused(int id, void *data, Evas_Object *obj,
129 Elm_Object_Item *item)
131 elm_object_signal_emit(obj, SIG_FOCUS, SRC_PROG);
134 static void _unfocused(int id, void *data, Evas_Object *obj,
135 Elm_Object_Item *item)
137 elm_object_signal_emit(obj, SIG_UNFOCUS, SRC_PROG);
140 static void _load_user_icon(struct _priv *priv, const char *file,
141 const char *focus_file)
143 Evas_Object *icon, *focus_icon;
145 icon = utils_add_icon(priv->photo, file, PART_USER_EDIT_PHOTO);
147 _ERR("failed to add icon");
149 focus_icon = utils_add_icon(priv->photo, focus_file,
150 PART_USER_EDIT_PHOTO_FOCUS);
152 _ERR("failed to add focus icon");
155 priv->focus_icon = focus_icon;
158 static void _eo_key_down(int id, void *data, Evas *e, Evas_Object *obj,
159 Evas_Event_Key_Down *ev)
162 const char *file, *focus_file;
169 if (!strcmp(ev->keyname, KEY_BACK) ||
170 !strcmp(ev->keyname, KEY_BACK_REMOTE)) {
171 evas_object_del(priv->ctxpopup);
172 priv->ctxpopup = NULL;
173 } else if (!strcmp(ev->keyname, KEY_ENTER) ||
174 !strcmp(ev->keyname, KEY_ENTER_REMOTE)) {
175 evas_object_del(priv->ctxpopup);
176 priv->ctxpopup = NULL;
178 file = evas_object_data_get(obj, KEY_ICON);
179 focus_file = evas_object_data_get(obj, KEY_FOCUS_ICON);
181 if (!strcmp(file, ICON_ADD) || !strcmp(focus_file, ICON_ADD))
182 viewmgr_push_view(VIEW_PHOTO);
184 _load_user_icon(priv, file, focus_file);
188 static input_handler icon_handler = {
190 .unfocused = _unfocused,
191 .key_down = _eo_key_down
194 static Evas_Object *_pack_icon(Evas_Object *table, struct _icon_info *icon_info, int i)
196 Evas_Object *eo, *ic, *focus_ic;
198 eo = utils_add_layout(table, GRP_USER_EDIT_ICON_LIST_ITEM, true, NULL);
200 _ERR("failed to add layout");
203 evas_object_show(eo);
204 elm_table_pack(table, eo, i % 4, i / 4, 1, 1);
206 ic = utils_add_icon(eo, icon_info->file, PART_USER_EDIT_ICON_LIST_ITEM);
208 _ERR("failed to add icon");
213 focus_ic = utils_add_icon(eo, icon_info->focus_file,
214 PART_USER_EDIT_ICON_LIST_ITEM_FOCUS);
216 _ERR("failed to add focus icon");
220 evas_object_data_set(eo, KEY_ICON, icon_info->message);
221 evas_object_data_set(eo, KEY_FOCUS_ICON, icon_info->focus_message);
226 static void _add_icon_list(struct _priv *priv)
228 Evas_Coord x, y, w, h;
229 Evas_Object *ctxpopup, *ly, *table, *eo;
231 struct _icon_info icon_info[] = {
234 IMAGE_USER_DEFAULT_FOCUS,
235 IMAGE_USER_CURRENT_DEFAULT,
236 IMAGE_USER_CURRENT_DEFAULT_FOCUS
239 IMAGE_USER_DEFAULT_02,
240 IMAGE_USER_DEFAULT_02_FOCUS,
241 IMAGE_USER_CURRENT_DEFAULT_02,
242 IMAGE_USER_CURRENT_DEFAULT_02_FOCUS
245 IMAGE_USER_DEFAULT_03,
246 IMAGE_USER_DEFAULT_03_FOCUS,
247 IMAGE_USER_CURRENT_DEFAULT_03,
248 IMAGE_USER_CURRENT_DEFAULT_03_FOCUS
251 IMAGE_USER_DEFAULT_04,
252 IMAGE_USER_DEFAULT_04_FOCUS,
253 IMAGE_USER_CURRENT_DEFAULT_04,
254 IMAGE_USER_CURRENT_DEFAULT_04_FOCUS
257 IMAGE_USER_DEFAULT_05,
258 IMAGE_USER_DEFAULT_05_FOCUS,
259 IMAGE_USER_CURRENT_DEFAULT_05,
260 IMAGE_USER_CURRENT_DEFAULT_05_FOCUS
263 IMAGE_USER_DEFAULT_06,
264 IMAGE_USER_DEFAULT_06_FOCUS,
265 IMAGE_USER_CURRENT_DEFAULT_06,
266 IMAGE_USER_CURRENT_DEFAULT_06_FOCUS
269 IMAGE_USER_DEFAULT_07,
270 IMAGE_USER_DEFAULT_07_FOCUS,
271 IMAGE_USER_CURRENT_DEFAULT_07,
272 IMAGE_USER_CURRENT_DEFAULT_07_FOCUS
276 IMAGE_USER_ADD_FOCUS,
282 ctxpopup = elm_ctxpopup_add(priv->base);
284 _ERR("failed to add ctxpopup");
287 elm_ctxpopup_horizontal_set(ctxpopup, EINA_TRUE);
288 elm_ctxpopup_auto_hide_disabled_set(ctxpopup, EINA_TRUE);
290 ly = utils_add_layout(ctxpopup, GRP_USER_EDIT_ICON_LIST, false, NULL);
292 _ERR("failed to layout");
293 evas_object_del(ctxpopup);
296 elm_object_content_set(ctxpopup, ly);
297 evas_object_show(ly);
298 evas_object_show(ctxpopup);
300 evas_object_geometry_get(priv->photo, &x, &y, &w, &h);
301 evas_object_move(ctxpopup,
302 (x + w + CTXPOPUP_X) * elm_config_scale_get(),
303 (y + CTXPOPUP_Y) * elm_config_scale_get());
305 table = utils_add_table(ly, true, PART_USER_EDIT_ICON_LIST);
307 _ERR("failed to add table");
308 evas_object_del(ctxpopup);
311 elm_table_padding_set(table, elm_config_scale_get() * 1,
312 elm_config_scale_get() * 1);
313 evas_object_size_hint_weight_set(table, EVAS_HINT_EXPAND,
316 for (i = 0; i < sizeof(icon_info) / sizeof(*icon_info); i++) {
317 eo = _pack_icon(table, &icon_info[i], i);
321 inputmgr_add_callback(eo, 0, &icon_handler, priv);
323 elm_object_focus_set(eo, EINA_TRUE);
326 priv->ctxpopup = ctxpopup;
329 static void _photo_key_down(int id, void *data, Evas *e, Evas_Object *obj,
330 Evas_Event_Key_Down *ev)
332 if (!strcmp(ev->keyname, KEY_ENTER)) {
333 _add_icon_list(data);
337 static input_handler photo_handler = {
339 .unfocused = _unfocused,
340 .key_down = _photo_key_down
343 static void _load_lock_icon(struct _priv *priv, Evas_Object *ly)
346 const char *file = NULL;
349 elm_image_file_get(priv->lock, &file, NULL);
350 elm_object_part_content_unset(priv->lock,
351 PART_USER_EDIT_SWITCH);
352 evas_object_del(priv->lock);
355 if (!file || !strcmp(file, IMAGE_SWITCH_OFF))
356 file = IMAGE_SWITCH_ON;
358 file = IMAGE_SWITCH_OFF;
359 lock = utils_add_icon(ly, file, PART_USER_EDIT_SWITCH);
364 static void _lock_key_down(int id, void *data, Evas *e, Evas_Object *obj,
365 Evas_Event_Key_Down *ev)
367 if (!strcmp(ev->keyname, KEY_ENTER))
368 _load_lock_icon(data, obj);
371 static input_handler lock_handler = {
373 .unfocused = _unfocused,
374 .key_down = _lock_key_down
377 static Evas_Object *_add_layout(struct _priv *priv)
379 Evas_Object *ly, *photo, *name, *pin, *account, *lock;
381 ly = utils_add_layout(priv->base, GRP_USER_EDIT_CONTENTS, false,
382 PART_USER_EDIT_CONTENTS);
384 _ERR("failed to add layout");
388 photo = utils_add_layout(ly, GRP_USER_EDIT_PHOTO, true,
389 PART_USER_EDIT_CONTENTS_PHOTO);
393 name = utils_add_entry(ly, MESSAGE_ENTRY_NAME, false,
394 PART_USER_EDIT_CONTENTS_NAME);
398 pin = utils_add_entry(ly, MESSAGE_ENTRY_PIN, false,
399 PART_USER_EDIT_CONTENTS_PIN);
403 account = utils_add_entry(ly, MESSAGE_ENTRY_ACCOUNT, false,
404 PART_USER_EDIT_CONTENTS_ACCOUNT);
408 lock = utils_add_layout(ly, GRP_USER_EDIT_SWITCH, true,
409 PART_USER_EDIT_CONTENTS_LOCK);
413 _load_lock_icon(priv, lock);
415 inputmgr_add_callback(lock, 0, &lock_handler, priv);
416 inputmgr_add_callback(photo, 0, &photo_handler, priv);
420 priv->account = account;
425 _ERR("failed to add layout");
430 static bool _add_user_edit(struct _priv *priv)
434 ly = _add_layout(priv);
436 _ERR("failed to add edit layout");
440 if (!_add_btns(priv)) {
441 _ERR("failed to add buttons");
446 /* It should be implemented later about function btn */
453 static Evas_Object *_create(Evas_Object *win, void *data)
459 _ERR("Invalid argument");
463 priv = calloc(1, sizeof(*priv));
465 _ERR("failed to calloc priv");
469 base = utils_add_layout(win, GRP_USER_EDIT, false, NULL);
471 _ERR("failed to create base");
475 evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND,
477 elm_win_resize_object_add(win, base);
483 if (!_add_user_edit(priv)) {
484 _ERR("failed to add user edit layout");
485 evas_object_del(base);
490 viewmgr_set_view_data(VIEW_USER_EDIT, priv);
491 viewmgr_add_view(view_photo_get_vclass(), NULL);
496 static void _delete_user_key_down(int id, void *data, Evas *e, Evas_Object *obj,
497 Evas_Event_Key_Down *ev)
502 _ERR("Invalid argument");
508 if (!strcmp(ev->keyname, KEY_ENTER) ||
509 !strcmp(ev->keyname, KEY_ENTER_REMOTE)) {
510 evas_object_del(priv->popup);
512 /* TODO: datamgr_select_item for deleting user */
513 } else if (!strcmp(ev->keyname, KEY_BACK) ||
514 !strcmp(ev->keyname, KEY_BACK_REMOTE)) {
515 evas_object_del(priv->popup);
520 static input_handler delete_user_handler = {
521 .key_down = _delete_user_key_down
524 static void _cancel_user_key_down(int id, void *data, Evas *e, Evas_Object *obj,
525 Evas_Event_Key_Down *ev)
530 _ERR("Invalid argument");
536 if (!strcmp(ev->keyname, KEY_ENTER) ||
537 !strcmp(ev->keyname, KEY_ENTER_REMOTE) ||
538 !strcmp(ev->keyname, KEY_BACK) ||
539 !strcmp(ev->keyname, KEY_BACK_REMOTE)) {
540 evas_object_del(priv->popup);
545 static input_handler cancel_user_handler = {
546 .key_down = _cancel_user_key_down
549 static void _add_delete_popup(struct _priv *priv)
551 Evas_Object *popup, *delete_btn, *cancel_btn;
554 popup = elm_popup_add(priv->base);
556 _ERR("failed to add popup");
559 elm_object_part_text_set(popup, PART_TITLE_TEXT, MESSAGE_DELETE_USER);
560 elm_popup_orient_set(popup, ELM_POPUP_ORIENT_CENTER);
561 evas_object_show(popup);
564 /* TODO: put the user name */
565 snprintf(buf, sizeof(buf), "%s %s?<br> %s", MESSAGE_DELETE,
566 "", MESSAGE_DELETE_CONTENTS);
567 elm_object_text_set(popup, buf);
569 delete_btn = utils_add_button(popup, MESSAGE_DELETE,
570 PART_POPUP_BUTTON_1);
572 _ERR("failed to add delete btn");
573 evas_object_del(popup);
576 inputmgr_add_callback(delete_btn, 0, &delete_user_handler, priv);
578 cancel_btn = utils_add_button(popup, MESSAGE_CANCEL,
579 PART_POPUP_BUTTON_2);
581 _ERR("failed to add cancel btn");
582 evas_object_del(popup);
585 inputmgr_add_callback(cancel_btn, 0, &cancel_user_handler, priv);
586 elm_object_focus_set(cancel_btn, EINA_TRUE);
589 static void _del_key_down(int id, void *data, Evas *e, Evas_Object *obj,
590 Evas_Event_Key_Down *ev)
592 if (!strcmp(ev->keyname, KEY_ENTER) ||
593 !strcmp(ev->keyname, KEY_ENTER_REMOTE)) {
594 _add_delete_popup(data);
598 static input_handler del_handler = {
600 .unfocused = _unfocused,
601 .key_down = _del_key_down
604 static void _load_del_btn(struct _priv *priv)
608 btn = utils_add_layout(priv->ly, GRP_USER_EDIT_DELETE, true,
609 PART_USER_EDIT_CONTENTS_DELETE);
611 _ERR("failed toa add delete button");
614 inputmgr_add_callback(btn, 0, &del_handler, priv);
619 static void _show(void *data)
624 _ERR("Invalid argument");
630 evas_object_show(priv->base);
631 elm_object_part_text_set(priv->base, PART_USER_EDIT_TITLE,
633 _load_user_icon(priv, IMAGE_USER_CURRENT_DEFAULT,
634 IMAGE_USER_CURRENT_DEFAULT_FOCUS);
638 static void _hide(void *data)
643 _ERR("Invalid argument");
649 inputmgr_remove_callback(priv->del, &del_handler);
650 evas_object_del(priv->del);
654 evas_object_hide(priv->base);
657 static void _destroy(void *data)
662 _ERR("Invalid argument");
668 inputmgr_remove_callback(priv->photo, &photo_handler);
669 inputmgr_remove_callback(priv->photo, &lock_handler);
670 inputmgr_remove_callback(priv->done, &done_handler);
671 inputmgr_remove_callback(priv->cancel, &cancel_handler);
672 viewmgr_remove_view(VIEW_PHOTO);
673 evas_object_del(priv->base);
677 static view_class vclass = {
678 .view_id = VIEW_USER_EDIT,
685 view_class *view_user_edit_get_vclass(void)