2 * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include <Elementary.h>
28 #define UBAR_POPUP_PADDING_X 30
30 #define UBAR_ITEM_MAX 3
31 #define UBAR_ITEM_WIDTH 180
33 #define MESSAGE_ID "ID"
34 #define MESSAGE_PW "Password"
35 #define MESSAGE_WRONG_PW "Wrong Password"
36 #define TITLE_DELETE_POPUP "Delete User"
37 #define TITLE_ADD_POPUP "Add User"
38 #define TITLE_LOGIN_POPUP "Login"
39 #define TITLE_EDIT_POPUP "Edit User"
40 #define MESSAGE_DELETE_POPUP "Are you sure you want to delete"
42 #define USER_NAME_GUEST "guest"
43 #define USER_NAME_OWNER "owner"
45 #define ASSERT(exp) if (!(exp)) { _ERR(#exp); abort(); }
51 UBAR_STATE_USER_CTXPOPUP,
52 UBAR_STATE_ITEM_CTXPOPUP,
53 UBAR_STATE_USER_POPUP,
68 struct _ubar_item *user;
75 struct _ubar_item *cur;
76 struct _ubar_item *popup_cur;
77 struct bar_cb focus_cb;
78 enum _ubar_state state;
79 Eina_List *popup_list;
80 Evas_Object *popup_scr;
81 Evas_Object *popup_box;
89 Evas_Object *ctxpopup;
90 Evas_Object *btn[BTN_MAX];
92 Evas_Object *id_entry;
93 Evas_Object *pw_entry;
94 Evas_Object *left_arrow;
95 Evas_Object *right_arrow;
96 struct engine_ubar_item *it;
97 struct _ubar_data *bar;
98 enum _popup_state state;
105 void (*click_cb)(void *, Evas *, Evas_Object *, void *);
108 static const char *icon_path[] = {
109 IMAGEDIR"/ico_family_mini.png",
110 IMAGEDIR"/ico_man.png",
111 IMAGEDIR"/ico_woman_mini.png",
112 IMAGEDIR"/ico_grandfather_mini.png",
113 IMAGEDIR"/ico_grandmother_mini.png",
114 IMAGEDIR"/ico_boy_mini.png",
115 IMAGEDIR"/ico_girl_mini.png"
118 static void _update_arrow(Evas_Object *scr, Evas_Object *left_arrow,
119 Evas_Object *right_arrow)
121 Evas_Coord rx, ry, rw, rh, cw;
123 if (!scr || !left_arrow || !right_arrow) {
124 _ERR("Invalid argument");
128 elm_scroller_region_get(scr, &rx, &ry, &rw, &rh);
129 elm_scroller_child_size_get(scr, &cw, NULL);
135 elm_object_signal_emit(left_arrow, SIG_SHOW_ARROW, SRC_PROG);
136 elm_object_signal_emit(right_arrow, SIG_HIDE_ARROW, SRC_PROG);
137 } else if (rx + rw == cw) {
138 elm_object_signal_emit(left_arrow, SIG_HIDE_ARROW, SRC_PROG);
139 elm_object_signal_emit(right_arrow, SIG_SHOW_ARROW, SRC_PROG);
141 elm_object_signal_emit(left_arrow, SIG_SHOW_ARROW, SRC_PROG);
142 elm_object_signal_emit(right_arrow, SIG_SHOW_ARROW, SRC_PROG);
146 static void _scroll_cb(void *data, Evas_Object *obj,
147 const char *emission, const char *source)
149 struct _ubar_data *bar;
152 _ERR("Invalid arguement");
158 switch (bar->state) {
159 case UBAR_STATE_ITEM:
160 _update_arrow(bar->scr, bar->arrow, bar->ly);
162 case UBAR_STATE_ITEM_POPUP:
163 if (bar->cur->state == POPUP_STATE_ADD ||
164 bar->cur->state == POPUP_STATE_EDIT)
165 _update_arrow(bar->popup_scr, bar->cur->right_arrow,
166 bar->cur->left_arrow);
173 static void _focused(void *data, Evas_Object *obj, void *ei)
175 struct _ubar_data *bar;
176 struct _ubar_item *foc;
179 _ERR("Invalid argument");
186 bar->focus_cb.func(bar->focus_cb.data, foc->eo);
188 switch (bar->state) {
189 case UBAR_STATE_HIDE:
190 elm_object_signal_emit(bar->user->eo,
191 SIG_FOCUS_FROM_DOWN, SRC_PROG);
192 bar->state = UBAR_STATE_USER;
194 case UBAR_STATE_USER:
195 elm_object_signal_emit(bar->user->eo, SIG_HIGHLIGHT, SRC_PROG);
196 bar->state = UBAR_STATE_ITEM;
198 case UBAR_STATE_ITEM:
199 if (foc == bar->user) {
200 elm_object_signal_emit(bar->user->eo,
201 SIG_FOCUS_FROM_RIGHT, SRC_PROG);
202 bar->state = UBAR_STATE_USER;
212 static void _mouse_over(void *data, Evas *e, Evas_Object *obj, void *ei)
215 _ERR("Invalid argument");
219 if (elm_object_focus_get(obj))
222 elm_object_focus_set(obj, EINA_TRUE);
225 static int _add_init_user(struct _ubar_data *bar, Evas_Object *base)
227 struct _ubar_item *item;
228 Evas_Object *ly, *ic_bg, *ic;
231 _ERR("Invalid argument");
235 item = calloc(1, sizeof(*item));
237 _ERR("calloc failed");
241 ly = elm_layout_add(base);
243 _ERR("layout add failed");
247 elm_layout_file_set(ly, EDJEFILE, GRP_USER);
249 ic_bg = elm_icon_add(ly);
251 _ERR("image add failed");
256 elm_object_part_content_set(ly, PART_USER_THUMB_BG, ic_bg);
258 ic = elm_icon_add(ly);
260 _ERR("image add failed");
265 elm_object_part_content_set(ly, PART_USER_THUMB, ic);
266 elm_object_part_content_set(base, PART_USER, ly);
268 evas_object_event_callback_add(ly,
269 EVAS_CALLBACK_MOUSE_MOVE, _mouse_over, NULL);
270 evas_object_smart_callback_add(ly, "focused", _focused, item);
282 static void _arrow_clicked(void *data, Evas_Object *obj,
283 const char *emission, const char *source)
285 struct _ubar_data *bar;
286 Evas_Coord rx, ry, rw, rh, cw;
289 _ERR("Invalid argument");
295 elm_scroller_region_get(bar->scr, &rx, &ry, &rw, &rh);
296 elm_scroller_child_size_get(bar->scr, &cw, NULL);
301 if (obj == bar->arrow)
302 rx = rx + UBAR_ITEM_WIDTH;
304 rx = rx - UBAR_ITEM_WIDTH;
306 elm_scroller_region_bring_in(bar->scr, rx, ry, rw, rh);
307 _update_arrow(bar->scr, bar->ly, bar->arrow);
310 static int _add_items(struct _ubar_data *bar, Evas_Object *base)
312 Evas_Object *ly, *scr, *bx;
315 _ERR("Invalid argument");
319 ly = elm_layout_add(base);
321 _ERR("layout add failed");
324 elm_layout_file_set(ly, EDJEFILE, GRP_UBAR);
326 scr = elm_scroller_add(ly);
328 _ERR("scroller add failed");
332 elm_scroller_policy_set(scr, ELM_SCROLLER_POLICY_OFF,
333 ELM_SCROLLER_POLICY_OFF);
334 elm_object_signal_callback_add(scr, SIG_SCROLL_RIGHT, SRC_ELM,
336 elm_object_signal_callback_add(scr, SIG_SCROLL_LEFT, SRC_ELM,
339 bx = elm_box_add(scr);
341 _ERR("box add failed");
345 evas_object_size_hint_align_set(bx, 0.0, EVAS_HINT_FILL);
346 evas_object_size_hint_weight_set(bx, 0.0, EVAS_HINT_EXPAND);
347 elm_box_horizontal_set(bx, EINA_TRUE);
349 elm_object_part_content_set(ly, PART_UBAR_CONTENT, scr);
351 evas_object_show(bx);
352 elm_object_content_set(scr, bx);
354 elm_object_signal_callback_add(ly, SIG_ARROW_CLICKED, SRC_EDJE,
355 _arrow_clicked, bar);
356 elm_object_part_content_set(base, PART_UBAR, ly);
366 static int _add_bar(struct bar_info *info, Evas_Object *base)
368 struct _ubar_data *bar;
371 if (!info || !info->data || !base) {
372 _ERR("Invalid argument");
378 r = _add_init_user(bar, base);
382 r = _add_items(bar, base);
389 static int _update_user(struct _ubar_data *bar, struct engine *eng)
391 struct _ubar_item *item;
392 const char *thumb_bg;
397 _ERR("Invalid argument");
407 engine_get_user_info(eng, &name, &thumb_bg, &thumb);
408 elm_image_file_set(item->ic_bg,
409 thumb_bg ? thumb_bg : DEF_USER_THUMB_BG, NULL);
410 elm_image_file_set(item->ic,
411 thumb ? thumb : DEF_USER_THUMB, NULL);
412 elm_object_part_text_set(item->eo,
413 PART_USER_NAME, name ? name : DEF_USER_NAME);
418 static Eina_Bool _create_ctxpopup(struct _ubar_item *);
420 /* FIXME: check user status */
421 static Eina_Bool _check_guest_user(struct _ubar_item *user)
426 static Eina_Bool _load_add_popup(struct _ubar_item *item);
428 static void _clicked(void *data, Evas *e, Evas_Object *obj, void *ei)
430 struct _ubar_data *bar;
433 _ERR("Invalid argument");
438 if (_check_guest_user(bar->user)) {
439 if (!bar->cur->is_user){
440 _load_add_popup(bar->cur);
441 elm_object_signal_emit(bar->cur->eo,
442 SIG_HLIGHT_FROM_POPOVER,
444 bar->state = UBAR_STATE_ITEM_POPUP;
446 _create_ctxpopup(bar->cur);
447 bar->state = UBAR_STATE_ITEM_CTXPOPUP;
452 static void _lbl_start_slide(void *data, Evas_Object *obj, void *ei)
454 elm_label_ellipsis_set(data, EINA_FALSE);
455 elm_label_slide_mode_set(data, ELM_LABEL_SLIDE_MODE_AUTO);
456 elm_label_slide_go(data);
459 static void _lbl_stop_slide(void *data, Evas_Object *obj, void *ei)
461 elm_label_ellipsis_set(data, EINA_TRUE);
462 elm_label_slide_mode_set(data, ELM_LABEL_SLIDE_MODE_NONE);
463 elm_label_slide_go(data);
466 static Evas_Object *_add_label(Evas_Object *ly, const char *name,
473 _ERR("Invalid argument");
477 lbl = elm_label_add(ly);
479 _ERR("failed to add label");
484 elm_object_style_set(lbl, style);
486 s = edje_object_data_get(elm_layout_edje_get(ly),
489 elm_label_wrap_width_set(lbl, atoi(s));
491 _ERR("No title width exist");
493 elm_object_text_set(lbl, name ? name : "");
494 elm_label_slide_speed_set(lbl, LABEL_SLIDE_SPEED);
495 evas_object_smart_callback_add(ly, "focused", _lbl_start_slide, lbl);
496 evas_object_smart_callback_add(ly, "unfocused", _lbl_stop_slide, lbl);
501 static struct _ubar_item *_pack_item(struct _ubar_data *bar,
502 struct engine_ubar_item *it)
504 Evas_Object *ly, *ic_bg, *ic, *lbl;
505 struct _ubar_item *item;
506 const char *name, *thumb_bg, *thumb;
511 item = calloc(1, sizeof(*item));
513 _ERR("calloc failed");
517 engine_ubar_item_get_info(it, &name, &thumb_bg, &thumb, NULL);
519 ly = elm_layout_add(bar->bx);
521 _ERR("layout add failed");
525 elm_layout_file_set(ly, EDJEFILE, GRP_UBAR_ITEM);
527 ic_bg = elm_icon_add(ly);
530 elm_object_part_content_set(ly, PART_USER_THUMB_BG, ic_bg);
532 ic = elm_icon_add(ly);
535 elm_object_part_content_set(ly, PART_USER_THUMB, ic);
537 evas_object_show(ly);
538 elm_object_focus_allow_set(ly, EINA_TRUE);
540 lbl = _add_label(ly, name, STYLE_LABEL_SLIDE_CENTER_22);
542 _ERR("failed to create name");
546 elm_object_part_content_set(ly, PART_USER_NAME, lbl);
553 item->is_user = true;
555 if (!strcmp(name, DEF_ADD_NAME))
556 item->is_user = false;
558 elm_image_file_set(item->ic_bg,
559 thumb_bg ? thumb_bg : DEF_UBAR_ITEM_THUMB_BG, NULL);
560 elm_image_file_set(item->ic,
561 thumb ? thumb : DEF_UBAR_ITEM_THUMB, NULL);
563 evas_object_event_callback_add(ly,
564 EVAS_CALLBACK_MOUSE_UP, _clicked, bar);
565 evas_object_event_callback_add(ly,
566 EVAS_CALLBACK_MOUSE_MOVE, _mouse_over, NULL);
567 evas_object_smart_callback_add(ly, "focused", _focused, item);
569 elm_box_pack_end(bar->bx, ly);
573 _ERR("image add failed");
579 static void _pack_arrow(struct _ubar_data *bar, int size)
584 _ERR("Invalid argument");
588 ly = elm_layout_add(bar->bx);
590 _ERR("failed to create layout");
593 elm_layout_file_set(ly, EDJEFILE, GRP_UBAR_ITEM_RIGHT_ARROW);
594 evas_object_show(ly);
596 elm_object_signal_callback_add(ly, SIG_ARROW_CLICKED, SRC_EDJE,
597 _arrow_clicked, bar);
599 if (size == UBAR_ITEM_MAX) {
600 elm_object_part_content_set(bar->base,
601 PART_UBAR_RIGHT_ARROW, ly);
602 } else if (size > UBAR_ITEM_MAX) {
603 elm_object_part_content_set(bar->base,
604 PART_UBAR_RIGHT_ARROW, ly);
605 elm_object_signal_emit(ly, SIG_SHOW_ARROW, SRC_PROG);
607 elm_box_pack_end(bar->bx, ly);
613 static int _update_items(struct _ubar_data *bar, void *eng)
615 const Eina_List *list;
617 struct engine_ubar_item *it;
618 struct _ubar_item *item;
621 _ERR("Invalid argument");
625 EINA_LIST_FREE(bar->list, item)
630 elm_box_clear(bar->bx);
632 list = engine_get_ubar_items(eng);
636 EINA_LIST_FOREACH((Eina_List *)list, l, it) {
637 item = _pack_item(bar, it);
641 bar->list = eina_list_append(bar->list, item);
644 _pack_arrow(bar, eina_list_count(bar->list));
646 elm_object_focus_allow_set(bar->user->eo, EINA_TRUE);
647 evas_object_focus_set(bar->user->eo, EINA_TRUE);
648 elm_object_signal_emit(bar->ly, SIG_SHOW, SRC_PROG);
653 static int _update(struct bar_info *info, void *eng, void *data)
655 struct _ubar_data *bar;
658 if (!info || !info->data || !eng) {
659 _ERR("Invalid argument");
665 r = _update_user(bar, eng);
669 r = _update_items(bar, eng);
678 static Evas_Object *_get_item(struct bar_info *info)
680 struct _ubar_data *bar;
682 if (!info || !info->data) {
683 _ERR("Invalid argument");
690 bar->cur = bar->user;
695 static Eina_Bool _move_user(struct bar_info *info)
697 struct _ubar_data *bar;
699 if (!info || !info->data) {
700 _ERR("Invalid argument");
706 elm_object_focus_set(bar->user->eo, EINA_TRUE);
711 static Eina_Bool _move_item(struct bar_info *info)
713 struct _ubar_data *bar;
714 struct _ubar_item *item;
716 if (!info || !info->data) {
717 _ERR("Invalid argument");
723 item = eina_list_data_get(bar->list);
727 elm_object_focus_set(item->eo, EINA_TRUE);
732 static Eina_Bool _is_move(struct bar_info *info, int dir)
734 struct _ubar_data *bar;
736 if (!info || !info->data) {
737 _ERR("Invalid argument");
746 if (bar->state != UBAR_STATE_USER)
749 if (bar->cur == bar->user)
760 static enum bar_event _move_right(struct bar_info *info)
762 struct _ubar_data *bar;
765 if (!info || !info->data) {
766 _ERR("Invalid argument");
767 return BAR_EVENT_ERROR;
772 if (bar->state == UBAR_STATE_USER)
773 r = _move_item(info);
777 return r ? BAR_EVENT_DONE : BAR_EVENT_PASS;
780 static enum bar_event _move_left(struct bar_info *info)
782 struct _ubar_data *bar;
785 if (!info || !info->data) {
786 _ERR("Invalid argumnet");
787 return BAR_EVENT_ERROR;
792 if (bar->state != UBAR_STATE_USER &&
793 bar->state != UBAR_STATE_ITEM)
794 return BAR_EVENT_ERROR;
796 if (eina_list_data_get(bar->list) == bar->cur)
797 r = _move_user(info);
801 return r ? BAR_EVENT_DONE : BAR_EVENT_PASS;
804 static void _destroy_ctxpopup(struct _ubar_item *item)
810 evas_object_del(item->ctxpopup);
811 item->ctxpopup = NULL;
812 for (i = 0; i < BTN_MAX; i++) {
813 memset(item->btn, 0x00, sizeof(item->btn));
818 static void _destroy_popup(struct _ubar_item *item)
824 evas_object_del(item->popup);
826 item->state = POPUP_STATE_NONE;
828 for (i = 0; i < BTN_MAX; i++) {
829 memset(item->btn, 0x00, sizeof(item->btn));
833 switch (item->bar->state) {
834 case UBAR_STATE_USER_POPUP:
835 item->bar->state = UBAR_STATE_USER;
837 case UBAR_STATE_ITEM_POPUP:
838 item->bar->state = UBAR_STATE_ITEM;
845 static enum bar_event _back(struct bar_info *info)
847 struct _ubar_data *bar;
850 if (!info || !info->data) {
851 _ERR("Invalid argument");
852 return BAR_EVENT_ERROR;
857 switch (bar->state) {
858 case UBAR_STATE_USER:
861 case UBAR_STATE_ITEM:
862 r = _move_user(info) ? BAR_EVENT_DONE : BAR_EVENT_PASS;
864 case UBAR_STATE_USER_CTXPOPUP:
865 _destroy_ctxpopup(bar->user);
866 bar->state = UBAR_STATE_USER;
869 case UBAR_STATE_ITEM_CTXPOPUP:
870 _destroy_ctxpopup(bar->cur);
871 bar->state = UBAR_STATE_ITEM;
874 case UBAR_STATE_USER_POPUP:
875 _destroy_popup(bar->user);
878 case UBAR_STATE_ITEM_POPUP:
879 _destroy_popup(bar->cur);
883 return BAR_EVENT_ERROR;
889 static Eina_Bool _add_popup_btn(Evas_Object *p, struct _ubar_item *item,
890 struct _btn_info *btn_info, int size)
895 if (!p || !item || !btn_info) {
896 _ERR("Invalid argument");
900 for (i = 0; i < size; i++) {
901 btn = elm_button_add(p);
903 _ERR("failed to create button");
904 memset(item->btn, 0x00, sizeof(item->btn));
907 elm_object_part_content_set(p, btn_info[i].part, btn);
908 elm_object_text_set(btn, btn_info[i].text);
909 evas_object_show(btn);
912 evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_DOWN,
913 btn_info[i].click_cb, item);
914 evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_MOVE,
921 static void _popup_cancel_clicked(void *data, Evas *e, Evas_Object *obj,
924 struct _ubar_item *item;
927 _ERR("Invalid argument");
933 item->pw_entry = NULL;
934 _destroy_popup(item);
937 static Evas_Object *_add_popup(Evas_Object *base, const char *title,
940 Evas_Object *popup, *win;
942 if (!base || !title) {
943 _ERR("Invalid argument");
947 win = elm_object_parent_widget_get(base);
949 _ERR("failed to get win eo");
953 popup = elm_popup_add(win);
955 _ERR("failed to create popup");
959 elm_object_style_set(popup, style);
960 elm_object_part_text_set(popup, PART_POPUP_TEXT, title);
961 elm_popup_orient_set(popup, ELM_POPUP_ORIENT_CENTER);
962 elm_object_focus_allow_set(popup, EINA_FALSE);
967 static void _show_message(struct _ubar_item *item, const char *signal)
971 if (!item || !signal) {
972 _ERR("Invalid argument");
976 elm_entry_entry_set(item->pw_entry, "");
977 ly = elm_object_parent_widget_get(item->pw_entry);
979 _ERR("failed to get parent widget");
983 elm_object_signal_emit(ly, signal, SRC_PROG);
986 static Eina_Bool _check_delete_user(struct _ubar_item *item)
988 struct _ubar_data *bar;
989 const char *password;
992 _ERR("Invalid argument");
998 password = elm_entry_entry_get(item->pw_entry);
999 if (!password || strlen(password) == 0) {
1000 _ERR("wrong password");
1001 _show_message(item, SIG_SHOW_WRONG_PW);
1005 if (!engine_ubar_item_delete(bar->eng, item->it, password)) {
1006 _ERR("failed to delete user");
1007 _show_message(item, SIG_SHOW_SYSTEM_FAIL);
1011 _destroy_popup(item);
1013 evas_object_del(bar->ly);
1016 _add_items(bar, bar->base);
1017 _update_items(bar, bar->eng);
1022 static void _popup_delete_clicked(void *data, Evas *e, Evas_Object *obj,
1025 _check_delete_user(data);
1028 static Evas_Object *_add_arrow(struct _ubar_item *item, Evas_Object *p,
1029 const char *group, const char *part)
1033 if (!item || !p || !part || !group) {
1034 _ERR("Invalid argument");
1038 ly = elm_layout_add(p);
1040 _ERR("failed to create icon");
1044 elm_layout_file_set(ly, EDJEFILE, group);
1045 elm_object_part_content_set(p, part, ly);
1046 evas_object_show(ly);
1048 evas_object_event_callback_add(ly, EVAS_CALLBACK_MOUSE_MOVE,
1054 static void _popup_user_focused(void *data, Evas_Object *obj, void *ei)
1056 struct _ubar_data *bar;
1057 struct _ubar_item *foc;
1060 _ERR("Invalid argument");
1067 _update_arrow(bar->popup_scr, bar->cur->right_arrow,
1068 bar->cur->left_arrow);
1070 bar->popup_cur = foc;
1073 static void _scroll_focused(void *data, Evas_Object *obj, void *ei)
1075 struct _ubar_data *bar;
1078 _ERR("Invalid argument");
1083 if (!bar || !bar->popup_cur)
1086 elm_object_focus_set(bar->popup_cur->eo, EINA_TRUE);
1089 static struct _ubar_item *_pack_icon(struct _ubar_data *bar, const char *icon,
1092 Evas_Object *ly, *ic, *ic_bg;
1093 struct _ubar_item *item;
1095 if (!bar || !icon || !p) {
1096 _ERR("Invalid argument");
1100 item = calloc(1, sizeof(*item));
1102 _ERR("calloc failed");
1106 ly = elm_layout_add(p);
1108 _ERR("failed to create layout");
1112 elm_layout_file_set(ly, EDJEFILE, GRP_UBAR_POPUP_ITEM);
1114 ic = elm_icon_add(ly);
1116 _ERR("failed to create icon");
1120 elm_object_part_content_set(ly, PART_USER_THUMB, ic);
1122 ic_bg = elm_icon_add(ly);
1124 _ERR("failed to create icon");
1128 elm_object_focus_allow_set(ly, EINA_TRUE);
1129 elm_object_part_content_set(ly, PART_USER_THUMB_BG, ic_bg);
1130 evas_object_show(ly);
1132 elm_image_file_set(ic, icon, NULL);
1133 elm_image_file_set(ic_bg, DEF_UBAR_ITEM_THUMB_BG, NULL);
1134 elm_box_pack_end(p, ly);
1136 evas_object_smart_callback_add(ly, "focused", _popup_user_focused,
1138 evas_object_event_callback_add(ly, EVAS_CALLBACK_MOUSE_MOVE,
1148 static Eina_Bool _load_users(struct _ubar_data *bar, Evas_Object *p)
1150 Evas_Object *scr, *box;
1151 struct _ubar_item *item, *_item;
1155 _ERR("Invalid argument");
1159 scr = elm_scroller_add(p);
1161 _ERR("failed to create scroll");
1165 evas_object_smart_callback_add(scr, "focused", _scroll_focused, bar);
1166 elm_scroller_policy_set(scr, ELM_SCROLLER_POLICY_OFF,
1167 ELM_SCROLLER_POLICY_OFF);
1168 elm_object_signal_callback_add(scr, SIG_SCROLL_RIGHT, SRC_ELM,
1170 elm_object_signal_callback_add(scr, SIG_SCROLL_LEFT, SRC_ELM,
1173 box = elm_box_add(scr);
1175 _ERR("failed to create box");
1179 evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND,
1181 elm_box_horizontal_set(box, EINA_TRUE);
1182 elm_box_padding_set(box,
1183 elm_config_scale_get() * UBAR_POPUP_PADDING_X, 0);
1185 elm_object_part_content_set(p, PART_POPUP_USER, scr);
1186 evas_object_show(box);
1187 elm_object_content_set(scr, box);
1189 bar->popup_scr = scr;
1190 bar->popup_box = box;
1192 bar->popup_list = NULL;
1193 bar->popup_cur = NULL;
1194 EINA_LIST_FREE(bar->popup_list, _item)
1197 for (i = 0; i < sizeof(icon_path) / sizeof(*icon_path); i++) {
1198 item = _pack_icon(bar, icon_path[i], box);
1202 bar->popup_list = eina_list_append(bar->popup_list, item);
1208 static Evas_Object *_add_entry(Evas_Object *p, const char *part, bool password)
1213 _ERR("Invalid argument");
1217 entry = elm_entry_add(p);
1219 _ERR("failed to create entry");
1224 elm_entry_password_set(entry, EINA_TRUE);
1225 elm_config_password_show_last_set(EINA_FALSE);
1227 elm_object_style_set(entry, STYLE_ENTRY);
1228 elm_entry_single_line_set(entry, EINA_TRUE);
1229 elm_entry_input_panel_language_set(entry,
1230 ELM_INPUT_PANEL_LANG_ALPHABET);
1231 elm_entry_cursor_end_set(entry);
1232 elm_entry_scrollable_set(entry, EINA_TRUE);
1233 elm_scroller_policy_set(entry, ELM_SCROLLER_POLICY_OFF,
1234 ELM_SCROLLER_POLICY_OFF);
1235 elm_object_part_content_set(p, part, entry);
1236 evas_object_show(entry);
1241 static void _popup_arrow_clicked(void *data, Evas_Object *obj,
1242 const char *emission, const char *source)
1244 struct _ubar_item *item;
1246 Evas_Coord rx, ry, rw, rh, cw;
1249 _ERR("Invalid argument");
1254 scr = item->bar->popup_scr;
1256 elm_scroller_region_get(scr, &rx, &ry, &rw, &rh);
1257 elm_scroller_child_size_get(scr, &cw, NULL);
1262 if (obj == item->left_arrow)
1263 rx = rx - UBAR_ITEM_WIDTH;
1264 else if (obj == item->right_arrow)
1265 rx = rx + UBAR_ITEM_WIDTH;
1267 elm_scroller_region_bring_in(scr, rx, ry, rw, rh);
1268 _update_arrow(scr, item->right_arrow, item->left_arrow);
1271 static void _pw_entry_focused(void *data, Evas_Object *obj, void *ei)
1273 if (!elm_entry_is_empty(obj))
1276 elm_object_signal_emit(data, SIG_HIDE_PW, SRC_PROG);
1279 static void _pw_entry_unfocused(void *data, Evas_Object *obj, void *ei)
1281 if (!elm_entry_is_empty(obj))
1284 elm_object_signal_emit(data, SIG_SHOW_PW, SRC_PROG);
1287 static Evas_Object *_add_popup_items(struct _ubar_item *item, Evas_Object *popup)
1289 Evas_Object *ly, *pw_entry, *right_arrow, *left_arrow;
1291 if (!item || !popup) {
1292 _ERR("Invalid argument");
1296 ly = elm_layout_add(popup);
1298 _ERR("failed to create layout");
1301 elm_layout_file_set(ly, EDJEFILE, GRP_UBAR_POPUP);
1302 evas_object_show(ly);
1303 elm_object_content_set(popup, ly);
1305 left_arrow = _add_arrow(item, ly, GRP_UBAR_LEFT_ARROW, PART_LEFT_ARROW);
1307 _ERR("failed to create left arrow");
1308 evas_object_del(ly);
1311 elm_object_signal_callback_add(left_arrow, SIG_ARROW_CLICKED, SRC_EDJE,
1312 _popup_arrow_clicked, item);
1314 right_arrow = _add_arrow(item, ly, GRP_UBAR_RIGHT_ARROW,
1317 _ERR("failed to create right arrow");
1318 evas_object_del(ly);
1321 elm_object_signal_callback_add(right_arrow, SIG_ARROW_CLICKED, SRC_EDJE,
1322 _popup_arrow_clicked, item);
1324 if (!_load_users(item->bar, ly)) {
1325 _ERR("failed to create users");
1326 evas_object_del(ly);
1330 pw_entry = _add_entry(ly, PART_POPUP_ENTRY_PW, true);
1332 _ERR("failed to create pw entry");
1333 evas_object_del(ly);
1336 elm_object_focus_next_object_set(pw_entry, item->btn[0],
1338 elm_object_signal_emit(ly, SIG_SHOW_PW, SRC_PROG);
1339 evas_object_smart_callback_add(pw_entry, "focused",
1340 _pw_entry_focused, ly);
1341 evas_object_smart_callback_add(pw_entry, "unfocused",
1342 _pw_entry_unfocused, ly);
1344 item->left_arrow = left_arrow;
1345 item->right_arrow = right_arrow;
1346 item->pw_entry = pw_entry;
1351 static Eina_Bool _check_edit_user(struct _ubar_item *item)
1353 struct _ubar_data *bar;
1354 struct _ubar_item *cur;
1355 const char *icon, *password;
1358 _ERR("Invalid argument");
1363 cur = bar->popup_cur;
1365 password = elm_entry_entry_get(item->pw_entry);
1366 if (!password || strlen(password) == 0) {
1367 _ERR("wrong password");
1368 _show_message(item, SIG_SHOW_WRONG_PW);
1372 elm_image_file_get(cur->ic, &icon, NULL);
1373 if (!engine_ubar_item_update(bar->eng, item->it, icon, password)) {
1374 _ERR("failed to update user");
1375 _show_message(item, SIG_SHOW_SYSTEM_FAIL);
1379 _destroy_popup(item);
1381 evas_object_del(bar->ly);
1384 _add_items(bar, bar->base);
1385 _update_items(bar, bar->eng);
1390 static void _popup_edit_clicked(void *data, Evas *e, Evas_Object *obj,
1393 _check_edit_user(data);
1396 static void _delete_ctxpopup(struct _ubar_data *bar)
1399 _ERR("Invalid argument");
1403 switch (bar->state) {
1404 case UBAR_STATE_USER_CTXPOPUP:
1405 _destroy_ctxpopup(bar->user);
1406 bar->state = UBAR_STATE_USER_POPUP;
1408 case UBAR_STATE_ITEM_CTXPOPUP:
1409 _destroy_ctxpopup(bar->cur);
1410 bar->state = UBAR_STATE_ITEM_POPUP;
1417 static Eina_Bool _load_edit_popup(struct _ubar_item *item)
1419 struct _ubar_data *bar;
1420 Evas_Object *popup, *lbl, *ly;
1421 struct _ubar_item *cur;
1423 const char *icon, *name, *thumb;
1424 struct _btn_info btn_info[] = {
1433 _popup_cancel_clicked
1438 _ERR("Invalid argument");
1443 _delete_ctxpopup(bar);
1445 popup = _add_popup(bar->base, TITLE_EDIT_POPUP, NULL);
1447 _ERR("failed to create popup");
1451 if (!_add_popup_btn(popup, item, btn_info,
1452 sizeof(btn_info) / sizeof(btn_info[0]))) {
1453 _ERR("failed to create popup button");
1454 evas_object_del(popup);
1458 ly = _add_popup_items(item, popup);
1460 _ERR("failed to create popup user");
1461 evas_object_del(popup);
1464 evas_object_show(popup);
1466 engine_ubar_item_get_info(item->it, &name, NULL, &thumb, NULL);
1468 lbl = elm_label_add(ly);
1470 _ERR("failed to create label");
1471 evas_object_del(popup);
1474 elm_object_part_content_set(ly, PART_POPUP_ENTRY_NAME, lbl);
1475 elm_object_text_set(lbl, name);
1476 elm_object_style_set(lbl, STYLE_LABEL_SLIDE_LEFT_28);
1477 elm_label_slide_speed_set(lbl, LABEL_SLIDE_SPEED);
1478 elm_label_slide_mode_set(lbl, ELM_LABEL_SLIDE_MODE_AUTO);
1480 engine_ubar_item_get_info(item->it, &name, NULL, &thumb, NULL);
1481 if (bar->popup_list) {
1482 EINA_LIST_FOREACH(bar->popup_list, l, cur) {
1483 elm_image_file_get(cur->ic, &icon, NULL);
1484 if (!strcmp(icon, thumb))
1485 elm_object_focus_set(cur->eo, EINA_TRUE);
1489 elm_object_signal_emit(item->eo, SIG_HLIGHT_FROM_POPOVER, SRC_PROG);
1491 item->popup = popup;
1492 item->state = POPUP_STATE_EDIT;
1497 static Eina_Bool _add_delete_item(Evas_Object *p, struct _ubar_item *item)
1499 Evas_Object *ly, *entry, *lbl;
1503 if (!p || !item || !item->it) {
1504 _ERR("Invalid argument");
1508 ly = elm_layout_add(p);
1510 _ERR("failed to create layout");
1513 elm_layout_file_set(ly, EDJEFILE, GRP_UBAR_DELETE);
1514 elm_object_content_set(p, ly);
1515 evas_object_show(ly);
1517 engine_ubar_item_get_info(item->it, &name, NULL, NULL, NULL);
1518 snprintf(buf, sizeof(buf), "%s %s?", MESSAGE_DELETE_POPUP,
1521 lbl = elm_label_add(ly);
1523 _ERR("failed to create label");
1524 evas_object_del(ly);
1527 elm_object_text_set(lbl, buf);
1528 elm_object_style_set(lbl, STYLE_LABEL_SLIDE_CENTER_22);
1529 elm_label_slide_speed_set(lbl, LABEL_SLIDE_SPEED);
1530 elm_label_slide_mode_set(lbl, ELM_LABEL_SLIDE_MODE_AUTO);
1531 elm_object_part_content_set(ly, PART_USER_DELETE_MESSAGE, lbl);
1533 entry = _add_entry(ly, PART_USER_LOGIN_PW, true);
1535 _ERR("failed to create entry");
1536 evas_object_del(ly);
1539 elm_object_signal_emit(ly, SIG_SHOW_PW, SRC_PROG);
1540 evas_object_smart_callback_add(entry, "focused", _pw_entry_focused, ly);
1541 evas_object_smart_callback_add(entry, "unfocused", _pw_entry_unfocused,
1544 item->pw_entry = entry;
1549 static Eina_Bool _load_delete_popup(struct _ubar_item *item)
1551 struct _ubar_data *bar;
1553 struct _btn_info btn_info[] = {
1557 _popup_delete_clicked
1562 _popup_cancel_clicked
1567 _ERR("Invalid argument");
1572 _delete_ctxpopup(bar);
1574 popup = _add_popup(bar->base, TITLE_DELETE_POPUP, NULL);
1576 _ERR("failed to create popup");
1580 if (!_add_popup_btn(popup, item, btn_info,
1581 sizeof(btn_info) / sizeof(btn_info[0]))) {
1582 _ERR("failed to create popup button");
1583 evas_object_del(popup);
1586 evas_object_show(popup);
1588 if (!_add_delete_item(popup, item)) {
1589 _ERR("failed to create login item");
1590 evas_object_del(popup);
1595 elm_object_focus_set(item->pw_entry, EINA_TRUE);
1597 elm_object_signal_emit(item->eo, SIG_HLIGHT_FROM_POPOVER, SRC_PROG);
1599 item->state = POPUP_STATE_DELETE;
1600 item->popup = popup;
1605 static void _cancel_clicked(void *data, Evas *e, Evas_Object *obj, void *ei)
1607 struct _ubar_item *item;
1610 _ERR("Invalid argument");
1616 item->pw_entry = NULL;
1617 _destroy_popup(item);
1620 static Eina_Bool _check_login_user(struct _ubar_item *item)
1622 const char *password;
1625 _ERR("Invalid argument");
1629 password = elm_entry_entry_get(item->pw_entry);
1630 if (!password || strlen(password) == 0) {
1631 _ERR("wrong password");
1632 _show_message(item, SIG_SHOW_WRONG_PW);
1636 if (!engine_ubar_item_change_user(item->bar->eng, item->it, password)) {
1637 _ERR("failed to delete user");
1638 _show_message(item, SIG_SHOW_SYSTEM_FAIL);
1642 item->pw_entry = NULL;
1643 _destroy_popup(item);
1648 static void _login_clicked(void *data, Evas *e, Evas_Object *obj, void *ei)
1650 _check_login_user(data);
1653 static Eina_Bool _add_login_item(Evas_Object *p, struct _ubar_item *item)
1655 Evas_Object *ly, *ic, *lbl, *entry;
1656 const char *name, *thumb;
1658 if (!p || !item || !item->it) {
1659 _ERR("Invalid argument");
1663 engine_ubar_item_get_info(item->it, &name, NULL, &thumb, NULL);
1665 ly = elm_layout_add(p);
1667 _ERR("failed to create layout");
1670 elm_layout_file_set(ly, EDJEFILE, GRP_UBAR_LOGIN);
1671 elm_object_content_set(p, ly);
1672 evas_object_show(ly);
1674 ic = elm_icon_add(ly);
1676 _ERR("failed to create icon");
1677 evas_object_del(ly);
1680 elm_image_file_set(ic, thumb ? thumb : DEF_UBAR_ITEM_THUMB, NULL);
1681 evas_object_color_set(ic, 66, 71, 108, 255);
1682 elm_object_part_content_set(ly, PART_USER_LOGIN_THUMB, ic);
1684 lbl = elm_label_add(ly);
1686 _ERR("failed to create label");
1687 evas_object_del(ly);
1690 elm_object_part_content_set(ly, PART_USER_LOGIN_NAME, lbl);
1691 elm_object_text_set(lbl, name);
1692 elm_object_style_set(lbl, STYLE_LABEL_SLIDE_LEFT_28);
1693 elm_label_slide_speed_set(lbl, LABEL_SLIDE_SPEED);
1694 elm_label_slide_mode_set(lbl, ELM_LABEL_SLIDE_MODE_AUTO);
1696 entry = _add_entry(ly, PART_USER_LOGIN_PW, true);
1698 _ERR("failed to create entry");
1699 evas_object_del(ly);
1702 elm_object_focus_next_object_set(entry, item->btn[0],
1704 elm_object_signal_emit(ly, SIG_SHOW_PW, SRC_PROG);
1705 evas_object_smart_callback_add(entry, "focused", _pw_entry_focused, ly);
1706 evas_object_smart_callback_add(entry, "unfocused", _pw_entry_unfocused,
1709 item->pw_entry = entry;
1714 static Eina_Bool _load_login_popup(struct _ubar_item *item)
1717 struct _btn_info btn_info[] = {
1731 _ERR("Invalid argument");
1735 _delete_ctxpopup(item->bar);
1737 popup = _add_popup(item->bar->base, TITLE_LOGIN_POPUP, NULL);
1739 _ERR("failed to create popup");
1743 if (!_add_popup_btn(popup, item, btn_info,
1744 sizeof(btn_info) / sizeof(btn_info[0]))) {
1745 _ERR("failed to create popup button");
1746 evas_object_del(popup);
1749 evas_object_show(popup);
1751 if (!_add_login_item(popup, item)) {
1752 _ERR("failed to create login item");
1753 evas_object_del(popup);
1758 elm_object_focus_set(item->pw_entry, EINA_TRUE);
1760 elm_object_signal_emit(item->eo, SIG_HLIGHT_FROM_POPOVER, SRC_PROG);
1762 item->popup = popup;
1763 item->state = POPUP_STATE_LOGIN;
1768 static void _ctxpopup_edit_clicked(void *data, Evas *e, Evas_Object *obj,
1771 _load_edit_popup(data);
1774 static void _ctxpopup_delete_clicked(void *data, Evas *e, Evas_Object *obj,
1777 _load_delete_popup(data);
1780 static void _ctxpopup_login_clicked(void *data, Evas *e, Evas_Object *obj,
1783 _load_login_popup(data);
1786 static bool _check_user(struct _ubar_item *item)
1789 _ERR("Invalid argument");
1793 return engine_ubar_item_get_privilege(item->bar->eng);
1796 static Eina_Bool _add_ctxpopup_btn(struct _ubar_item *item, Evas_Object *base)
1798 Evas_Object *btn, *firstbtn;
1800 struct _btn_info btn_info[] = {
1804 _ctxpopup_login_clicked
1809 _ctxpopup_edit_clicked
1814 _ctxpopup_delete_clicked
1818 if (!item || !base) {
1819 _ERR("Invalid argument");
1823 for (i = 0; i < sizeof(btn_info) / sizeof(*btn_info); i++) {
1824 btn = elm_button_add(base);
1826 _ERR("failed to add button");
1827 memset(item->btn, 0x00, sizeof(item->btn));
1831 elm_object_text_set(btn, btn_info[i].text);
1832 evas_object_show(btn);
1838 evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_MOVE,
1841 if (i > 0 && !_check_user(item)) {
1842 elm_object_style_set(btn, STYLE_BTN_DIM_HOVERTEXT);
1843 elm_object_focus_allow_set(btn, EINA_FALSE);
1845 elm_object_style_set(btn, STYLE_BTN_HOVERTEXT);
1846 evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_DOWN,
1847 btn_info[i].click_cb, item);
1850 elm_box_pack_end(base, btn);
1854 elm_object_focus_set(firstbtn, EINA_TRUE);
1859 static Eina_Bool _create_ctxpopup(struct _ubar_item *item)
1861 Evas_Object *ctxpopup, *box, *win;
1866 _ERR("Invalid argument");
1870 win = elm_object_parent_widget_get(item->bar->base);
1872 _ERR("failed to get win");
1876 ctxpopup = elm_ctxpopup_add(win);
1878 _ERR("failed to create ctxpopup");
1881 elm_object_style_set(ctxpopup, STYLE_CTXPOPUP_HOVER);
1882 elm_ctxpopup_direction_priority_set(ctxpopup, 0, 0, 0, 0);
1883 evas_object_geometry_get(item->ic, &x, NULL, &w, NULL);
1884 s = edje_object_data_get(elm_layout_edje_get(item->eo),
1886 evas_object_move(ctxpopup, (x + atoi(s) / 2) * elm_config_scale_get(),
1887 POSITION_CTXPOPUP_Y *elm_config_scale_get());
1889 box = elm_box_add(ctxpopup);
1891 _ERR("failed to create popup box");
1892 evas_object_del(ctxpopup);
1895 elm_object_content_set(ctxpopup, box);
1896 evas_object_show(box);
1897 evas_object_show(ctxpopup);
1899 if (!_add_ctxpopup_btn(item, box)) {
1900 _ERR("failed to create popup button");
1901 evas_object_del(ctxpopup);
1905 elm_object_signal_emit(item->eo, SIG_HLIGHT_FROM_POPOVER, SRC_PROG);
1906 item->ctxpopup = ctxpopup;
1911 static Eina_Bool _check_add_user(struct _ubar_item *item)
1913 struct _ubar_data *bar;
1914 struct _ubar_item *cur;
1915 const char *id, *password, *icon;
1918 _ERR("Invalid argument");
1923 cur = bar->popup_cur;
1924 if (!cur || !item->pw_entry || !item->id_entry) {
1925 _ERR("failed to get current item");
1929 id = elm_entry_entry_get(item->id_entry);
1933 password = elm_entry_entry_get(item->pw_entry);
1934 if (!password || strlen(password) == 0) {
1935 _ERR("wrong password");
1936 _show_message(item, SIG_SHOW_WRONG_PW);
1940 elm_image_file_get(cur->ic, &icon, NULL);
1941 if (!engine_ubar_item_add(bar->eng, id, password, icon)) {
1942 _ERR("failed to add user");
1943 _show_message(item, SIG_SHOW_SYSTEM_FAIL);
1947 _destroy_popup(item);
1949 evas_object_del(bar->ly);
1952 _add_items(bar, bar->base);
1953 _update_items(bar, bar->eng);
1958 static Eina_Bool _check_popup_state(struct _ubar_item *item)
1960 struct _ubar_data *bar;
1964 _ERR("Invalid argument");
1971 switch (item->state) {
1972 case POPUP_STATE_ADD:
1973 if (elm_object_focus_get(item->btn[0])) {
1974 if (_check_add_user(item))
1976 } else if (elm_object_focus_get(item->btn[1])) {
1977 _destroy_popup(item);
1979 } else if (bar->popup_cur &&
1980 elm_object_focus_get(bar->popup_cur->eo)) {
1981 elm_object_focus_set(item->id_entry, EINA_TRUE);
1985 case POPUP_STATE_LOGIN:
1986 if (elm_object_focus_get(item->btn[0])) {
1987 if (_check_login_user(item))
1989 } else if (elm_object_focus_get(item->btn[1])) {
1990 _destroy_popup(item);
1994 case POPUP_STATE_DELETE:
1995 if (elm_object_focus_get(item->btn[0])) {
1996 if (_check_delete_user(item))
1998 } else if (elm_object_focus_get(item->btn[1])) {
1999 _destroy_popup(item);
2003 case POPUP_STATE_EDIT:
2004 if (elm_object_focus_get(item->btn[0])) {
2005 if (_check_edit_user(item))
2007 } else if (elm_object_focus_get(item->btn[1])){
2008 _destroy_popup(item);
2010 } else if (bar->popup_cur &&
2011 elm_object_focus_get(bar->popup_cur->eo)) {
2012 elm_object_focus_set(item->pw_entry, EINA_TRUE);
2023 static void _popup_add_clicked(void *data, Evas *e, Evas_Object *obj,
2026 _check_add_user(data);
2029 static void _id_entry_focused(void *data, Evas_Object *obj, void *ei)
2031 if (!elm_entry_is_empty(obj))
2034 elm_object_signal_emit(data, SIG_HIDE_ID, SRC_PROG);
2037 static void _id_entry_unfocused(void *data, Evas_Object *obj, void *ei)
2039 if (!elm_entry_is_empty(obj))
2042 elm_object_signal_emit(data, SIG_SHOW_ID, SRC_PROG);
2045 static Eina_Bool _load_add_popup(struct _ubar_item *item)
2047 struct _ubar_data *bar;
2048 Evas_Object *popup, *id_entry, *ly;
2049 struct _ubar_item *cur;
2050 struct _btn_info btn_info[] = {
2059 _popup_cancel_clicked
2064 _ERR("Invalid argument");
2070 popup = _add_popup(bar->base, TITLE_ADD_POPUP, NULL);
2072 _ERR("failed to create popup");
2076 if (!_add_popup_btn(popup, item, btn_info,
2077 sizeof(btn_info) / sizeof(btn_info[0]))) {
2078 _ERR("failed to create popup button");
2079 evas_object_del(popup);
2083 ly = _add_popup_items(item, popup);
2085 _ERR("failed to create popup user");
2086 evas_object_del(popup);
2089 evas_object_show(popup);
2091 id_entry = _add_entry(ly, PART_POPUP_ENTRY_NAME, false);
2093 _ERR("failed to create name entry");
2094 evas_object_del(ly);
2097 elm_object_signal_emit(ly, SIG_SHOW_ID, SRC_PROG);
2098 evas_object_smart_callback_add(id_entry, "focused", _id_entry_focused, ly);
2099 evas_object_smart_callback_add(id_entry, "unfocused", _id_entry_unfocused, ly);
2101 if (bar->popup_list) {
2102 cur = eina_list_data_get(bar->popup_list);
2104 elm_object_focus_set(cur->eo, EINA_TRUE);
2107 elm_object_signal_emit(item->eo, SIG_HLIGHT_FROM_POPOVER, SRC_PROG);
2109 item->id_entry = id_entry;
2110 item->popup = popup;
2111 item->state = POPUP_STATE_ADD;
2116 static enum bar_event _enter(struct bar_info *info)
2118 struct _ubar_data *bar;
2121 if (!info || !info->data) {
2122 _ERR("Invalid argument");
2123 return BAR_EVENT_ERROR;
2129 switch (bar->state) {
2130 case UBAR_STATE_USER:
2132 if (_check_guest_user(bar->user))
2135 case UBAR_STATE_ITEM:
2137 if (_check_guest_user(bar->user)) {
2138 if (!bar->cur->is_user){
2139 _load_add_popup(bar->cur);
2140 bar->state = UBAR_STATE_ITEM_POPUP;
2142 _create_ctxpopup(bar->cur);
2143 bar->state = UBAR_STATE_ITEM_CTXPOPUP;
2147 case UBAR_STATE_USER_CTXPOPUP:
2150 case UBAR_STATE_ITEM_CTXPOPUP:
2151 if (!bar->cur->ctxpopup)
2154 if (elm_object_focus_get(bar->cur->btn[0]))
2155 r = _load_login_popup(bar->cur);
2156 else if (elm_object_focus_get(bar->cur->btn[1])) {
2157 r = _load_edit_popup(bar->cur);
2158 } else if (elm_object_focus_get(bar->cur->btn[2])) {
2159 r = _load_delete_popup(bar->cur);
2162 case UBAR_STATE_USER_POPUP:
2163 if (!bar->user->popup)
2166 _destroy_popup(bar->user);
2169 case UBAR_STATE_ITEM_POPUP:
2170 if (!bar->cur->popup)
2173 r = _check_popup_state(bar->cur);
2176 return BAR_EVENT_ERROR;
2179 return r ? BAR_EVENT_DONE : BAR_EVENT_PASS;
2182 static enum bar_event _key_down(struct bar_info *info, void *ei)
2184 Ecore_Event_Key *ev;
2188 return BAR_EVENT_ERROR;
2192 if (!strcmp(ev->keyname, KEY_ESC) ||
2193 !strcmp(ev->keyname, KEY_ESC_REMOTE))
2195 else if (!strcmp(ev->keyname, KEY_RIGHT))
2196 r = _move_right(info);
2197 else if (!strcmp(ev->keyname, KEY_LEFT))
2198 r = _move_left(info);
2199 else if (!strcmp(ev->keyname, KEY_ENTER) ||
2200 !strcmp(ev->keyname, KEY_ENTER_REMOTE))
2208 static void _hide(struct bar_info *info)
2210 struct _ubar_data *bar;
2212 if (!info || !info->data) {
2213 _ERR("Invalid argument");
2219 elm_object_signal_emit(bar->user->eo, SIG_UNFOCUS_TO_DOWN, SRC_PROG);
2221 bar->state = UBAR_STATE_HIDE;
2224 static void _hide_bar(struct _ubar_data *bar)
2226 struct _ubar_item *item;
2230 _ERR("Invalid argument");
2234 elm_object_signal_emit(bar->user->eo, SIG_HIDE, SRC_PROG);
2236 EINA_LIST_FOREACH(bar->list, l, item)
2237 elm_object_signal_emit(item->eo, SIG_HIDE, SRC_PROG);
2239 elm_object_signal_emit(bar->ly, SIG_HIDE, SRC_PROG);
2242 static void _release(struct bar_info *info)
2244 struct _ubar_data *bar;
2245 struct _ubar_item *item;
2247 if (!info || !info->data) {
2248 _ERR("Invalid argument");
2257 EINA_LIST_FREE(bar->list, item) {
2258 evas_object_del(item->eo);
2261 evas_object_del(bar->user->eo);
2263 evas_object_del(bar->ly);
2272 static struct bar_ops ubar_ops = {
2273 .add_bar = _add_bar,
2275 .get_item = _get_item,
2277 .is_move = _is_move,
2279 .key_down = _key_down,
2280 .release = _release,
2283 int init_user_bar(struct bar_info *info)
2285 struct _ubar_data *bar;
2290 bar = calloc(1, sizeof(*bar));
2292 _ERR("calloc failed");
2297 info->ops = &ubar_ops;
2299 if (!info->cb.func) {
2300 _ERR("invalid callback function");
2305 bar->focus_cb = info->cb;