diff --git a/data/themes/default_button.edc b/data/themes/default_button.edc index 69d99ba9d..6196efe57 100644 --- a/data/themes/default_button.edc +++ b/data/themes/default_button.edc @@ -4,6 +4,7 @@ images { image: "e17_titlebar_glint1.png" COMP; image: "e17_titlebar_glint2.png" COMP; image: "e17_titlebar_glint3.png" COMP; + image: "focus.png" COMP; } group { @@ -15,6 +16,7 @@ group { mouse_events: 1; description { state: "default" 0.0; + min: 64 16; image { normal: "e17_button.png"; border: 8 8 8 8; @@ -37,12 +39,12 @@ group { color: 0 0 0 0; rel1 { relative: 0.0 0.0; - offset: 0 11; + offset: 7 11; to: "button_image"; } rel2 { relative: 0.0 1.0; - offset: 0 -12; + offset: 6 -12; to: "button_image"; } } @@ -245,6 +247,29 @@ group { color: 255 255 255 255; } } + part { + name: "focus"; + mouse_events: 0; + description { + state: "default" 0.0; + visible: 0; + color: 255 255 255 0; + image { + normal: "focus.png"; + border: 7 7 7 7; + middle: 0; + } + fill { + smooth: 0; + } + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 255 255 255 255; + } + } } programs { program { @@ -331,5 +356,21 @@ group { target: "glint2"; target: "glint3"; } + program { + name: "focus_in"; + signal: "focus_in"; + source: ""; + action: STATE_SET "focused" 0.0; + transition: DECELERATE 0.2; + target: "focus"; + } + program { + name: "focus_out"; + signal: "focus_out"; + source: ""; + action: STATE_SET "default" 0.0; + transition: ACCELERATE 0.5; + target: "focus"; + } } } diff --git a/data/themes/default_check.edc b/data/themes/default_check.edc index 424c12160..a881109cf 100644 --- a/data/themes/default_check.edc +++ b/data/themes/default_check.edc @@ -1,6 +1,7 @@ images { image: "e17_menu_check1.png" COMP; image: "e17_menu_check2.png" COMP; + image: "focus.png" COMP; } group { name: "widgets/check"; @@ -89,6 +90,29 @@ group { color: 0 0 0 0; } } + part { + name: "focus"; + mouse_events: 0; + description { + state: "default" 0.0; + visible: 0; + color: 255 255 255 0; + image { + normal: "focus.png"; + border: 7 7 7 7; + middle: 0; + } + fill { + smooth: 0; + } + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 255 255 255 255; + } + } } programs { program { @@ -124,5 +148,21 @@ group { } } } + program { + name: "focus_in"; + signal: "focus_in"; + source: ""; + action: STATE_SET "focused" 0.0; + transition: DECELERATE 0.2; + target: "focus"; + } + program { + name: "focus_out"; + signal: "focus_out"; + source: ""; + action: STATE_SET "default" 0.0; + transition: ACCELERATE 0.5; + target: "focus"; + } } } diff --git a/data/themes/default_dialog.edc b/data/themes/default_dialog.edc index 7de4b3503..160029194 100644 --- a/data/themes/default_dialog.edc +++ b/data/themes/default_dialog.edc @@ -1,158 +1,7 @@ -#define FOCUS_COLOR 255 255 255 200 - -#define FOCUS_RECT(x1, y1, x2, y2, offx1, offy1, offx2, offy2) \ -part { \ - name: "focus_rect_top"; \ - mouse_events: 0; \ - description { \ - state: "default" 0.0; \ - visible: 0; \ - color: FOCUS_COLOR; \ - rel1 { \ - relative: x1 y1; \ - offset: offx1 offy1; \ - } \ - rel2 { \ - relative: x2 y1; \ - offset: offx2 offy1; \ - } \ - image { \ - normal: "focus.png"; \ - } \ - fill { \ - smooth: 0; \ - size { \ - relative: 0 0; \ - offset: 32 32; \ - } \ - } \ - } \ - description { \ - state: "focused" 0.0; \ - inherit: "default" 0.0; \ - visible: 1; \ - } \ -} \ -part { \ - name: "focus_rect_bottom"; \ - mouse_events: 0; \ - description { \ - state: "default" 0.0; \ - visible: 0; \ - color: FOCUS_COLOR; \ - rel1 { \ - relative: x1 y2; \ - offset: offx1 offy2; \ - } \ - rel2 { \ - relative: x2 y2; \ - offset: offx2 offy2; \ - } \ - image { \ - normal: "focus.png"; \ - } \ - fill { \ - smooth: 0; \ - size { \ - relative: 0 0; \ - offset: 32 32; \ - } \ - } \ - } \ - description { \ - state: "focused" 0.0; \ - inherit: "default" 0.0; \ - visible: 1; \ - } \ -} \ -part { \ - name: "focus_rect_left"; \ - mouse_events: 0; \ - description { \ - state: "default" 0.0; \ - visible: 0; \ - color: FOCUS_COLOR; \ - rel1 { \ - relative: x1 y1; \ - offset: offx1 (offy1 + 1); \ - } \ - rel2 { \ - relative: x1 y2; \ - offset: offx1 (offy2 - 1); \ - } \ - image { \ - normal: "focus.png"; \ - } \ - fill { \ - smooth: 0; \ - size { \ - relative: 0 0; \ - offset: 32 32; \ - } \ - } \ - } \ - description { \ - state: "focused" 0.0; \ - inherit: "default" 0.0; \ - visible: 1; \ - } \ -} \ -part { \ - name: "focus_rect_right"; \ - mouse_events: 0; \ - description { \ - state: "default" 0.0; \ - visible: 0; \ - color: FOCUS_COLOR; \ - rel1 { \ - relative: x2 y1; \ - offset: offx2 (offy1 + 1); \ - } \ - rel2 { \ - relative: x2 y2; \ - offset: offx2 (offy2 - 1); \ - } \ - image { \ - normal: "focus.png"; \ - } \ - fill { \ - smooth: 0; \ - size { \ - relative: 0 0; \ - offset: 32 32; \ - } \ - } \ - } \ - description { \ - state: "focused" 0.0; \ - inherit: "default" 0.0; \ - visible: 1; \ - } \ -} - -#define FOCUS_ACTION \ -action: STATE_SET "focused" 0.0; \ -target: "focus_rect_top"; \ -target: "focus_rect_bottom"; \ -target: "focus_rect_left"; \ -target: "focus_rect_right"; - -#define UNFOCUS_ACTION \ -action: STATE_SET "default" 0.0; \ -target: "focus_rect_top"; \ -target: "focus_rect_bottom"; \ -target: "focus_rect_left"; \ -target: "focus_rect_right"; - images { image: "e17_menu_bg_border.png" COMP; -// image: "e17_menu_bg.png" COMP; -// image: "e17_winlist_top.png" COMP; image: "e17_winlist_bottom.png" COMP; - image: "e17_button2.png" COMP; - image: "e17_button.png" COMP; image: "e17_dialog_watermark.png" COMP; - image: "focus.png" COMP; } styles @@ -178,7 +27,6 @@ group { rel1 { relative: 0.0 0.0; offset: 1 1; -// to_y: "base2"; } rel2 { relative: 1.0 1.0; @@ -209,31 +57,6 @@ group { } } } - /* - part { - name: "base2"; - mouse_events: 0; - description { - state: "default" 0.0; - max: 99999 48; - align: 0.5 0.0; - rel1 { - relative: 0.0 0.0; - offset: 1 1; - } - rel2 { - relative: 1.0 1.0; - offset: -2 -2; - } - image { - normal: "e17_menu_bg.png"; - } - fill { - smooth: 0; - } - } - } - */ part { name: "base3"; mouse_events: 0; @@ -294,31 +117,6 @@ group { } } } -/* - part { - name: "top"; - mouse_events: 0; - description { - state: "default" 0.0; - rel1 { - relative: 0.0 0.0; - offset: 1 1; - } - rel2 { - relative: 1.0 0.0; - offset: -2 16; - to_y: "content_swallow"; - } - image { - normal: "e17_winlist_top.png"; - border: 0 0 0 19; - } - fill { - smooth: 0; - } - } - } - */ part { name: "bottom"; mouse_events: 0; @@ -363,350 +161,6 @@ group { } } -group { - name: "widgets/dialog/button"; - parts { - part { - name: "button_image"; - type: IMAGE; - mouse_events: 1; - description { - state: "default" 0.0; - min: 64 32; - image { - normal: "e17_button.png"; - border: 8 8 8 8; - } - } - description { - state: "clicked" 0.0; - min: 64 32; - image { - normal: "e17_button2.png"; - border: 8 8 8 8; - } - } - } - part { - name: "icon_swallow"; - type: SWALLOW; - description { - state: "default" 0.0; - align: 0.0 0.5; - color: 0 0 0 0; - rel1 { - relative: 0.0 0.0; - offset: 0 0; - to: "button_image"; - } - rel2 { - relative: 0.0 1.0; - offset: 0 -7; - to: "button_image"; - } - } - description { - state: "visible" 0.0; - inherit: "default" 0.0; - aspect: 1.0 1.0; - aspect_preference: VERTICAL; - align: 0.0 0.5; - color: 0 0 0 0; - rel1 { - relative: 0.0 0.0; - offset: 6 6; - to: "button_image"; - } - rel2 { - relative: 0.0 1.0; - offset: 5 -7; - to: "button_image"; - } - } - } - part { - name: "button_text"; - type: TEXT; - effect: SHADOW; - mouse_events: 0; - description { - state: "default" 0.0; - rel1 { - relative: 1.0 0.0; - offset: 6 6; - to_x: "icon_swallow"; - to_y: "button_image"; - } - rel2 { - relative: 1.0 1.0; - offset: -7 -7; - to: "button_image"; - } - color: 0 0 0 255; - color3: 255 255 255 128; - text { - text: "OK"; - font: "Edje-Vera"; - size: 10; - min: 1 1; - align: 0.5 0.5; - } - } - } - part { - name: "glint_clip"; - type: RECT; - mouse_events: 0; - description { - state: "default" 0.0; - color: 255 255 255 255; - rel1 { - relative: 0.0 0.0; - offset: 3 3; - } - rel2 { - relative: 1.0 1.0; - offset: -4 -4; - } - } - } - part { - name: "glint1"; - mouse_events: 0; - description { - state: "default" 0.0; - visible: 0; - color: 255 255 255 0; - align: 0.0 0.0; - max: 34 13; - rel1 { - relative: 0.0 0.0; - offset: 2 2; - } - rel2 { - relative: 1.0 1.0; - offset: -3 -3; - } - image { - normal: "e17_titlebar_glint1.png"; - border: 5 0 5 0; - } - fill { - smooth: 0; - } - } - description { - state: "active" 0.0; - inherit: "default" 0.0; - visible: 1; - color: 255 255 255 255; - } - } - part { - name: "glint2"; - mouse_events: 0; - clip_to: "glint_clip"; - description { - state: "default" 0.0; - visible: 0; - color: 255 255 255 0; - align: 1.0 0.5; - max: 0 0; - rel1 { - relative: 0.0 0.0; - offset: 3 3; - } - rel2 { - relative: 0.0 1.0; - offset: 3 -4; - } - image { - normal: "e17_titlebar_glint2.png"; - border: 0 0 5 5; - } - fill { - smooth: 0; - } - } - description { - state: "active" 0.0; - inherit: "default" 0.0; - visible: 1; - color: 255 255 255 255; - max: 169 9999; - min: 169 8; - align: 0.5 0.5; - } - description { - state: "active2" 0.0; - inherit: "default" 0.0; - visible: 1; - color: 255 255 255 128; - max: 169 9999; - min: 169 8; - align: 0.5 0.5; - rel1 { - relative: 1.0 0.0; - offset: -4 3; - } - rel2 { - relative: 1.0 1.0; - offset: -4 -4; - } - } - description { - state: "active3" 0.0; - inherit: "default" 0.0; - visible: 0; - color: 255 255 255 0; - max: 169 9999; - min: 169 8; - align: 0.0 0.5; - rel1 { - relative: 1.0 0.0; - offset: -4 3; - } - rel2 { - relative: 1.0 1.0; - offset: -4 -4; - } - } - } - part { - name: "glint3"; - mouse_events: 0; - description { - state: "default" 0.0; - visible: 0; - color: 255 255 255 0; - align: 1.0 1.0; - max: 34 13; - rel1 { - relative: 0.0 0.0; - offset: 2 2; - } - rel2 { - relative: 1.0 1.0; - offset: -3 -3; - } - image { - normal: "e17_titlebar_glint3.png"; - border: 0 5 0 5; - } - fill { - smooth: 0; - } - } - description { - state: "active" 0.0; - inherit: "default" 0.0; - visible: 1; - color: 255 255 255 255; - } - } - - FOCUS_RECT(0.0, 0.0, 1.0, 1.0, 7, 7, -8, -8) - } - programs { - program { - name: "button_click"; - signal: "mouse,down,1"; - source: "button_image"; - action: STATE_SET "clicked" 0.0; - target: "button_image"; - } - program { - name: "button_unclick"; - signal: "mouse,up,1"; - source: "button_image"; - action: STATE_SET "default" 0.0; - target: "button_image"; - } - program { - name: "button_unclick2"; - signal: "mouse,clicked,1"; - source: "button_image"; - action: SIGNAL_EMIT "click" ""; - } - program { - name: "icon_visible"; - signal: "icon_visible"; - source: ""; - action: STATE_SET "visible" 0.0; - target: "icon_swallow"; - } - program { - name: "button_in"; - signal: "mouse,in"; - source: "button_image"; - action: SIGNAL_EMIT "enter" ""; - } - program { - name: "button_enter"; - signal: "enter"; - source: ""; - script { - run_program(PROGRAM:"go_active"); - } - } - program { - name: "go_active"; - action: STATE_SET "active" 0.0; - target: "glint1"; - target: "glint2"; - transition: LINEAR 0.05; - after: "go_active2"; - after: "go_active2b"; - } - program { - name: "go_active2"; - action: STATE_SET "active2" 0.0; - target: "glint2"; - transition: LINEAR 0.2; - after: "go_active3"; - after: "go_active3b"; - } - program { - name: "go_active2b"; - action: STATE_SET "active" 0.0; - target: "glint3"; - transition: LINEAR 0.2; - } - program { - name: "go_active3"; - action: STATE_SET "active3" 0.0; - target: "glint2"; - transition: LINEAR 0.05; - } - program { - name: "go_active3b"; - action: STATE_SET "default" 0.0; - target: "glint3"; - transition: LINEAR 0.1; - after: "go_active4"; - } - program { - name: "go_active4"; - action: STATE_SET "default" 0.0; - target: "glint1"; - target: "glint2"; - target: "glint3"; - } - program { - name: "button_focus"; - signal: "focus"; - source: ""; - FOCUS_ACTION - } - program { - name: "button_unfocus"; - signal: "unfocus"; - source: ""; - UNFOCUS_ACTION - } - } -} - group { name: "widgets/dialog/text"; parts { diff --git a/data/themes/default_radio.edc b/data/themes/default_radio.edc index 10959d11a..fa8f8079c 100644 --- a/data/themes/default_radio.edc +++ b/data/themes/default_radio.edc @@ -1,6 +1,7 @@ images { image: "e17_menu_radio1.png" COMP; image: "e17_menu_radio2.png" COMP; + image: "focus.png" COMP; } group { name: "widgets/radio"; @@ -89,6 +90,29 @@ group { color: 0 0 0 0; } } + part { + name: "focus"; + mouse_events: 0; + description { + state: "default" 0.0; + visible: 0; + color: 255 255 255 0; + image { + normal: "focus.png"; + border: 7 7 7 7; + middle: 0; + } + fill { + smooth: 0; + } + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 255 255 255 255; + } + } } programs { program { @@ -117,5 +141,21 @@ group { name: "click2"; action: SIGNAL_EMIT "toggled" "on"; } + program { + name: "focus_in"; + signal: "focus_in"; + source: ""; + action: STATE_SET "focused" 0.0; + transition: DECELERATE 0.2; + target: "focus"; + } + program { + name: "focus_out"; + signal: "focus_out"; + source: ""; + action: STATE_SET "default" 0.0; + transition: ACCELERATE 0.5; + target: "focus"; + } } } diff --git a/data/themes/images/focus.png b/data/themes/images/focus.png index 114e04961..376e9455b 100644 Binary files a/data/themes/images/focus.png and b/data/themes/images/focus.png differ diff --git a/src/bin/e_dialog.c b/src/bin/e_dialog.c index 290681e45..4e9d1a321 100644 --- a/src/bin/e_dialog.c +++ b/src/bin/e_dialog.c @@ -3,23 +3,12 @@ */ #include "e.h" -struct _E_Dialog_Button -{ - E_Dialog *dialog; - Evas_Object *obj, *obj_icon; - char *label; - char *icon; - void (*func) (void *data, E_Dialog *dia); - void *data; -}; - /* local subsystem functions */ static void _e_dialog_free(E_Dialog *dia); -static void _e_dialog_cb_button_clicked(void *data, Evas_Object *obj, const char *emission, const char *source); -static void _e_dialog_button_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event); +static void _e_dialog_del_func_cb(void *data, E_Dialog *dia); static void _e_dialog_cb_delete(E_Win *win); static void _e_dialog_cb_key_down(void *data, Evas *e, Evas_Object *obj, void *event); - +static void _e_dialog_cb_wid_on_focus(void *data, Evas_Object *obj); /* local subsystem globals */ @@ -59,14 +48,11 @@ e_dialog_new(E_Container *con) "widgets/dialog/main"); evas_object_move(o, 0, 0); evas_object_show(o); - - o = e_box_add(e_win_evas_get(dia->win)); + + o = e_widget_list_add(e_win_evas_get(dia->win), 1, 1); + e_widget_on_focus_hook_set(o, _e_dialog_cb_wid_on_focus, dia); dia->box_object = o; - e_box_orientation_set(o, 1); - e_box_homogenous_set(o, 1); - e_box_align_set(o, 0.5, 0.5); edje_object_part_swallow(dia->bg_object, "buttons_swallow", o); - evas_object_show(o); o = evas_object_rectangle_add(e_win_evas_get(dia->win)); dia->event_object = o; @@ -83,109 +69,27 @@ e_dialog_new(E_Container *con) evas_object_event_callback_add(o, EVAS_CALLBACK_KEY_DOWN, _e_dialog_cb_key_down, dia); - dia->focused = NULL; - return dia; } void e_dialog_button_add(E_Dialog *dia, char *label, char *icon, void (*func) (void *data, E_Dialog *dia), void *data) { - E_Dialog_Button *db; - Evas_Coord mw, mh; - - db = E_NEW(E_Dialog_Button, 1); - db->dialog = dia; - if (label) db->label = strdup(label); - if (icon) db->icon = strdup(icon); - db->func = func; - db->data = data; - db->obj = edje_object_add(e_win_evas_get(dia->win)); - e_theme_edje_object_set(db->obj, "base/theme/dialog", - "widgets/dialog/button"); - edje_object_signal_callback_add(db->obj, "click", "", - _e_dialog_cb_button_clicked, db); - edje_object_part_text_set(db->obj, "button_text", db->label); - - evas_object_event_callback_add(db->obj, EVAS_CALLBACK_MOUSE_DOWN, _e_dialog_button_cb_mouse_down, db); - - if (icon) - { - db->obj_icon = edje_object_add(e_win_evas_get(dia->win)); - e_util_edje_icon_set(db->obj_icon, icon); - edje_object_part_swallow(db->obj, "icon_swallow", db->obj_icon); - edje_object_signal_emit(db->obj, "icon_visible", ""); - edje_object_message_signal_process(db->obj); - evas_object_show(db->obj_icon); - } - edje_object_size_min_calc(db->obj, &mw, &mh); - e_box_pack_end(dia->box_object, db->obj); - e_box_pack_options_set(db->obj, - 1, 1, /* fill */ - 0, 1, /* expand */ - 0.5, 0.5, /* align */ - mw, mh, /* min */ - 9999, mh /* max */ - ); - evas_object_show(db->obj); - - dia->buttons = evas_list_append(dia->buttons, db); + Evas_Object *o; + + if (!func) func = _e_dialog_del_func_cb; + o = e_widget_button_add(e_win_evas_get(dia->win), label, icon, func, data, dia); + e_widget_list_object_append(dia->box_object, o, 1, 1, 0.5); + dia->buttons = evas_list_append(dia->buttons, o); } int e_dialog_button_focus_num(E_Dialog *dia, int button) { - E_Dialog_Button *db = NULL; - - if (button < 0) - return 0; + Evas_Object *o; - db = evas_list_nth(dia->buttons, button); - - if (!db) - return 0; - - if (dia->focused) - { - E_Dialog_Button *focused; - - focused = dia->focused->data; - if (focused) - edje_object_signal_emit(focused->obj, "unfocus", ""); - } - - dia->focused = evas_list_nth_list(dia->buttons, button); - edje_object_signal_emit(db->obj, "focus", ""); - - return 1; -} - -int -e_dialog_button_focus_button(E_Dialog *dia, E_Dialog_Button *button) -{ - E_Dialog_Button *db = NULL; - - if (!button) - return 0; - - db = evas_list_find(dia->buttons, button); - - if (!db) - return 0; - - if (dia->focused) - { - E_Dialog_Button *focused; - - focused = dia->focused->data; - if (focused) - edje_object_signal_emit(focused->obj, "unfocus", ""); - } - - dia->focused = evas_list_find_list(dia->buttons, button); - edje_object_signal_emit(db->obj, "focus", ""); - - return 1; + o = evas_list_nth(dia->buttons, button); + if (o) e_widget_focus_steal(o); } void @@ -226,6 +130,8 @@ e_dialog_icon_set(E_Dialog *dia, char *icon, Evas_Coord size) void e_dialog_content_set(E_Dialog *dia, Evas_Object *obj, Evas_Coord minw, Evas_Coord minh) { + dia->content_object = obj; + e_widget_on_focus_hook_set(obj, _e_dialog_cb_wid_on_focus, dia); edje_extern_object_min_size_set(obj, minw, minh); edje_object_part_swallow(dia->bg_object, "content_swallow", obj); evas_object_show(obj); @@ -246,7 +152,7 @@ e_dialog_show(E_Dialog *dia) } o = dia->box_object; - e_box_min_size_get(o, &mw, &mh); + e_widget_min_size_get(o, &mw, &mh); edje_extern_object_min_size_set(o, mw, mh); edje_object_part_swallow(dia->bg_object, "buttons_swallow", o); @@ -256,58 +162,30 @@ e_dialog_show(E_Dialog *dia) e_win_size_min_set(dia->win, mw, mh); e_win_size_max_set(dia->win, mw, mh); e_win_show(dia->win); + + if (!e_widget_focus_get(dia->box_object)) + e_widget_focus_set(dia->box_object, 1); } /* local subsystem functions */ static void _e_dialog_free(E_Dialog *dia) { - while (dia->buttons) - { - E_Dialog_Button *db; - - db = dia->buttons->data; - dia->buttons = evas_list_remove_list(dia->buttons, dia->buttons); - E_FREE(db->label); - E_FREE(db->icon); - evas_object_del(db->obj); - if (db->obj_icon) evas_object_del(db->obj_icon); - free(db); - } + if (dia->buttons) evas_list_free(dia->buttons); if (dia->text_object) evas_object_del(dia->text_object); if (dia->icon_object) evas_object_del(dia->icon_object); if (dia->box_object) evas_object_del(dia->box_object); if (dia->bg_object) evas_object_del(dia->bg_object); + if (dia->content_object) evas_object_del(dia->content_object); if (dia->event_object) evas_object_del(dia->event_object); e_object_del(E_OBJECT(dia->win)); free(dia); } static void -_e_dialog_cb_button_clicked(void *data, Evas_Object *obj, const char *emission, const char *source) +_e_dialog_del_func_cb(void *data, E_Dialog *dia) { - E_Dialog_Button *db; - - db = data; - if (db->func) - { - edje_object_signal_emit(db->obj, "focus", ""); - db->func(db->data, db->dialog); - } - else - e_object_del(E_OBJECT(db->dialog)); -} - -static void -_e_dialog_button_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event) -{ - E_Dialog *dia; - E_Dialog_Button *db; - - db = data; - dia = db->dialog; - - e_dialog_button_focus_button(dia, db); + e_object_del(E_OBJECT(dia)); } static void @@ -318,52 +196,64 @@ _e_dialog_cb_key_down(void *data, Evas *e, Evas_Object *obj, void *event) ev = event; dia = data; - if (!strcmp(ev->keyname, "Tab")) { - if ((dia->focused) && (dia->buttons)) + if (evas_key_modifier_is_set(evas_key_modifier_get(e_win_evas_get(dia->win)), "Shift")) { - E_Dialog_Button *db, *ndb; - - db = dia->focused->data; - if (evas_key_modifier_is_set(evas_key_modifier_get(e_win_evas_get(dia->win)), "Shift")) + if (e_widget_focus_get(dia->box_object)) { - if (dia->focused->prev) dia->focused = dia->focused->prev; - else dia->focused = evas_list_last(dia->buttons); + if (!e_widget_focus_jump(dia->box_object, 0)) + { + if (dia->text_object) + e_widget_focus_set(dia->box_object, 0); + else + { + e_widget_focus_set(dia->content_object, 0); + if (!e_widget_focus_get(dia->content_object)) + e_widget_focus_set(dia->box_object, 0); + } + } } else { - if (dia->focused->next) dia->focused = dia->focused->next; - else dia->focused = dia->buttons; + if (!e_widget_focus_jump(dia->content_object, 0)) + e_widget_focus_set(dia->box_object, 0); } - ndb = dia->focused->data; - if (ndb != db) - { - edje_object_signal_emit(db->obj, "unfocus", ""); - edje_object_signal_emit(ndb->obj, "focus", ""); - edje_object_signal_emit(ndb->obj, "enter", ""); - } - } - else + else { - E_Dialog_Button *db; - - dia->focused = dia->buttons; - - db = dia->focused->data; - edje_object_signal_emit(db->obj, "focus", ""); - edje_object_signal_emit(db->obj, "enter", ""); + if (e_widget_focus_get(dia->box_object)) + { + if (!e_widget_focus_jump(dia->box_object, 1)) + { + if (dia->text_object) + e_widget_focus_set(dia->box_object, 1); + else + { + e_widget_focus_set(dia->content_object, 1); + if (!e_widget_focus_get(dia->content_object)) + e_widget_focus_set(dia->box_object, 1); + } + } + } + else + { + if (!e_widget_focus_jump(dia->content_object, 1)) + e_widget_focus_set(dia->box_object, 1); + } } } else if (((!strcmp(ev->keyname, "Return")) || (!strcmp(ev->keyname, "KP_Enter")) || - (!strcmp(ev->keyname, "space"))) && dia->focused) + (!strcmp(ev->keyname, "space")))) { - E_Dialog_Button *db; - - db = evas_list_data(dia->focused); - edje_object_signal_emit(db->obj, "click", ""); + Evas_Object *o = NULL; + + if ((dia->content_object) && (e_widget_focus_get(dia->content_object))) + o = e_widget_focused_object_get(dia->content_object); + else + o = e_widget_focused_object_get(dia->box_object); + if (o) e_widget_activate(o); } } @@ -375,3 +265,16 @@ _e_dialog_cb_delete(E_Win *win) dia = win->data; e_object_del(E_OBJECT(dia)); } + +static void +_e_dialog_cb_wid_on_focus(void *data, Evas_Object *obj) +{ + E_Dialog *dia; + + dia = data; + if (obj == dia->content_object) + e_widget_focused_object_clear(dia->box_object); + else if (dia->content_object) + e_widget_focused_object_clear(dia->content_object); +} + diff --git a/src/bin/e_dialog.h b/src/bin/e_dialog.h index 061d73b6b..c3f47ea10 100644 --- a/src/bin/e_dialog.h +++ b/src/bin/e_dialog.h @@ -20,17 +20,16 @@ struct _E_Dialog Evas_Object *bg_object; Evas_Object *box_object; Evas_Object *text_object; + Evas_Object *content_object; Evas_Object *icon_object; Evas_Object *event_object; Evas_List *buttons; - Evas_List *focused; void *data; }; EAPI E_Dialog *e_dialog_new (E_Container *con); EAPI void e_dialog_button_add (E_Dialog *dia, char *label, char *icon, void (*func) (void *data, E_Dialog *dia), void *data); EAPI int e_dialog_button_focus_num (E_Dialog *dia, int button); -EAPI int e_dialog_button_focus_button (E_Dialog *dia, E_Dialog_Button *button); EAPI void e_dialog_title_set (E_Dialog *dia, char *title); EAPI void e_dialog_text_set (E_Dialog *dia, char *text); EAPI void e_dialog_icon_set (E_Dialog *dia, char *icon, Evas_Coord size); diff --git a/src/bin/e_pan.c b/src/bin/e_pan.c index 8d6d3e71d..9e770833c 100644 --- a/src/bin/e_pan.c +++ b/src/bin/e_pan.c @@ -4,7 +4,7 @@ #include "e.h" #define SMART_NAME "e_pan" -#define API_ENTRY E_Smart_Data *sd; sd = evas_object_smart_data_get(obj); if (!sd) +#define API_ENTRY E_Smart_Data *sd; sd = evas_object_smart_data_get(obj); if ((!obj) || (!sd) || (evas_object_type_get(obj) && strcmp(evas_object_type_get(obj), SMART_NAME))) #define INTERNAL_ENTRY E_Smart_Data *sd; sd = evas_object_smart_data_get(obj); if (!sd) return; typedef struct _E_Smart_Data E_Smart_Data; diff --git a/src/bin/e_test.c b/src/bin/e_test.c index 27f916494..19b92366e 100644 --- a/src/bin/e_test.c +++ b/src/bin/e_test.c @@ -309,7 +309,13 @@ _e_test_internal(E_Container *con) } #elif 0 static int my_val = 0; +static int my_val2 = 0; +static int my_val3 = 0; +static int my_val4 = 0; +static int my_val5 = 0; +static int my_val6 = 0; static int my_rval = 1; +static int my_rval2 = 1; static void _e_test_internal(E_Container *con) @@ -326,18 +332,18 @@ _e_test_internal(E_Container *con) e = e_win_evas_get(dia->win); - ol = e_widget_list_add(e, 0); + ol = e_widget_list_add(e, 0, 0); - hb = e_widget_list_add(e, 1); + hb = e_widget_list_add(e, 1, 1); o = e_widget_framelist_add(e, "My Checklist", 0); e_widget_framelist_object_append(o, e_widget_check_add(e, "Checkbox 1", &my_val)); - e_widget_framelist_object_append(o, e_widget_check_add(e, "Checkbox 2", &my_val)); - e_widget_framelist_object_append(o, e_widget_check_add(e, "Checkbox 3", &my_val)); - e_widget_framelist_object_append(o, e_widget_check_add(e, "Checkbox and some long text", &my_val)); - e_widget_framelist_object_append(o, e_widget_check_add(e, "Checkbox 7", &my_val)); - e_widget_framelist_object_append(o, e_widget_check_add(e, "Koneko", &my_val)); + e_widget_framelist_object_append(o, e_widget_check_add(e, "Checkbox 2", &my_val2)); + e_widget_framelist_object_append(o, e_widget_check_add(e, "Checkbox 3", &my_val3)); + e_widget_framelist_object_append(o, e_widget_check_add(e, "Checkbox and some long text", &my_val4)); + e_widget_framelist_object_append(o, e_widget_check_add(e, "Checkbox 7", &my_val5)); + e_widget_framelist_object_append(o, e_widget_check_add(e, "Koneko", &my_val6)); rg = e_widget_radio_group_new(&my_rval); e_widget_framelist_object_append(o, e_widget_radio_add(e, "Rad 0", 0, rg)); @@ -350,7 +356,7 @@ _e_test_internal(E_Container *con) o = e_widget_framelist_add(e, "My Checklist on the right", 0); - rg = e_widget_radio_group_new(&my_rval); + rg = e_widget_radio_group_new(&my_rval2); e_widget_framelist_object_append(o, e_widget_radio_add(e, "Rad 0", 0, rg)); e_widget_framelist_object_append(o, e_widget_radio_add(e, "Rad 1", 1, rg)); e_widget_framelist_object_append(o, e_widget_radio_add(e, "Rad 2", 2, rg)); diff --git a/src/bin/e_widget.c b/src/bin/e_widget.c index ca58e0af2..eac84f13e 100644 --- a/src/bin/e_widget.c +++ b/src/bin/e_widget.c @@ -4,18 +4,26 @@ #include "e.h" #define SMART_NAME "e_widget" -#define API_ENTRY E_Smart_Data *sd; sd = evas_object_smart_data_get(obj); if (!sd) +#define API_ENTRY E_Smart_Data *sd; sd = evas_object_smart_data_get(obj); if ((!obj) || (!sd) || (evas_object_type_get(obj) && strcmp(evas_object_type_get(obj), SMART_NAME))) #define INTERNAL_ENTRY E_Smart_Data *sd; sd = evas_object_smart_data_get(obj); if (!sd) return; typedef struct _E_Smart_Data E_Smart_Data; struct _E_Smart_Data { + Evas_Object *parent_obj; Evas_Coord x, y, w, h; - Evas_Coord minw, minh, maxw, maxh; + Evas_Coord minw, minh; Evas_List *subobjs; Evas_Object *resize_obj; void (*del_func) (Evas_Object *obj); + void (*focus_func) (Evas_Object *obj); + void (*activate_func) (Evas_Object *obj); + void (*on_focus_func) (void *data, Evas_Object *obj); + void *on_focus_data; void *data; + unsigned char can_focus : 1; + unsigned char child_can_focus : 1; + unsigned char focused : 1; }; /* local subsystem functions */ @@ -54,6 +62,28 @@ e_widget_del_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj)) sd->del_func = func; } +void +e_widget_focus_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj)) +{ + API_ENTRY return; + sd->focus_func = func; +} + +void +e_widget_activate_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj)) +{ + API_ENTRY return; + sd->activate_func = func; +} + +void +e_widget_on_focus_hook_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data) +{ + API_ENTRY return; + sd->on_focus_func = func; + sd->on_focus_data = data; +} + void e_widget_data_set(Evas_Object *obj, void *data) { @@ -84,34 +114,20 @@ e_widget_min_size_get(Evas_Object *obj, Evas_Coord *minw, Evas_Coord *minh) if (minh) *minh = sd->minh; } -void -e_widget_max_size_set(Evas_Object *obj, Evas_Coord maxw, Evas_Coord maxh) -{ - API_ENTRY return; - sd->minw = maxw; - sd->maxh = maxh; -} - -void -e_widget_max_size_get(Evas_Object *obj, Evas_Coord *maxw, Evas_Coord *maxh) -{ - API_ENTRY return; - if (maxw) *maxw = sd->maxw; - if (maxh) *maxh = sd->maxh; -} - void e_widget_sub_object_add(Evas_Object *obj, Evas_Object *sobj) { API_ENTRY return; sd->subobjs = evas_list_append(sd->subobjs, sobj); -} - -void -e_widget_sub_object_del(Evas_Object *obj, Evas_Object *sobj) -{ - API_ENTRY return; - sd->subobjs = evas_list_remove(sd->subobjs, sobj); + if (!sd->child_can_focus) + { + if (e_widget_can_focus_get(sobj)) sd->child_can_focus = 1; + } + if (!strcmp(evas_object_type_get(sobj), SMART_NAME)) + { + sd = evas_object_smart_data_get(sobj); + if (sd) sd->parent_obj = obj; + } } void @@ -124,6 +140,238 @@ e_widget_resize_object_set(Evas_Object *obj, Evas_Object *sobj) _e_smart_reconfigure(sd); } +void +e_widget_can_focus_set(Evas_Object *obj, int can_focus) +{ + API_ENTRY return; + sd->can_focus = can_focus; +} + +int +e_widget_can_focus_get(Evas_Object *obj) +{ + API_ENTRY return 0; + if (sd->can_focus) return 1; + if (sd->child_can_focus) return 1; + return 0; +} + +int +e_widget_focus_get(Evas_Object *obj) +{ + API_ENTRY return 0; + return sd->focused; +} + +Evas_Object * +e_widget_focused_object_get(Evas_Object *obj) +{ + Evas_List *l; + API_ENTRY return NULL; + if (!sd->focused) return NULL; + for (l = sd->subobjs; l; l = l->next) + { + Evas_Object *fobj; + + fobj = e_widget_focused_object_get(l->data); + if (fobj) return fobj; + } + return obj; +} + +int +e_widget_focus_jump(Evas_Object *obj, int forward) +{ + API_ENTRY return 0; + if (!e_widget_can_focus_get(obj)) return 0; + /* if it has a focus func its an end-point widget like a button */ + if (sd->focus_func) + { + if (!sd->focused) sd->focused = 1; + else sd->focused = 0; + sd->focus_func(obj); + if (sd->on_focus_func) sd->on_focus_func(sd->on_focus_data, obj); + return sd->focused; + } + /* its some container */ + else + { + Evas_List *l; + int focus_next; + + focus_next = 0; + if (!sd->focused) + { + e_widget_focus_set(obj, forward); + sd->focused = 1; + if (sd->on_focus_func) sd->on_focus_func(sd->on_focus_data, obj); + return 1; + } + else + { + if (forward) + { + for (l = sd->subobjs; l; l = l->next) + { + if (e_widget_can_focus_get(l->data)) + { + if (focus_next) + { + /* the previous focused item was unfocused - so focus + * the next one (that can be focused) */ + if (e_widget_focus_jump(l->data, forward)) return 1; + else break; + } + else + { + if (e_widget_focus_get(l->data)) + { + /* jump to the next focused item or focus this item */ + if (e_widget_focus_jump(l->data, forward)) return 1; + /* it returned 0 - it got to the last item and is past it */ + focus_next = 1; + } + } + } + } + } + else + { + for (l = evas_list_last(sd->subobjs); l; l = l->prev) + { + if (e_widget_can_focus_get(l->data)) + { + if (focus_next) + { + /* the previous focused item was unfocused - so focus + * the next one (that can be focused) */ + if (e_widget_focus_jump(l->data, forward)) return 1; + else break; + } + else + { + if (e_widget_focus_get(l->data)) + { + /* jump to the next focused item or focus this item */ + if (e_widget_focus_jump(l->data, forward)) return 1; + /* it returned 0 - it got to the last item and is past it */ + focus_next = 1; + } + } + } + } + } + } + } + /* no next item can be focused */ + sd->focused = 0; + return 0; +} + +void +e_widget_focus_set(Evas_Object *obj, int first) +{ + API_ENTRY return; + if (!sd->focused) + { + sd->focused = 1; + if (sd->on_focus_func) sd->on_focus_func(sd->on_focus_data, obj); + } + if (sd->focus_func) + { + sd->focus_func(obj); + return; + } + else + { + Evas_List *l; + + if (first) + { + for (l = sd->subobjs; l; l = l->next) + { + if (e_widget_can_focus_get(l->data)) + { + e_widget_focus_set(l->data, first); + break; + } + } + } + else + { + for (l = evas_list_last(sd->subobjs); l; l = l->prev) + { + if (e_widget_can_focus_get(l->data)) + { + e_widget_focus_set(l->data, first); + break; + } + } + } + } +} + +Evas_Object * +e_widget_parent_get(Evas_Object *obj) +{ + API_ENTRY return NULL; + return sd->parent_obj; +} + +void +e_widget_focused_object_clear(Evas_Object *obj) +{ + Evas_List *l; + API_ENTRY return; + if (!sd->focused) return; + sd->focused = 0; + for (l = sd->subobjs; l; l = l->next) + { + if (e_widget_focus_get(l->data)) + { + e_widget_focused_object_clear(l->data); + break; + } + } + if (sd->focus_func) sd->focus_func(obj); +} + +void +e_widget_focus_steal(Evas_Object *obj) +{ + Evas_Object *parent, *o; + API_ENTRY return; + if (sd->focused) return; + parent = obj; + for (;;) + { + o = e_widget_parent_get(parent); + if (!o) break; + parent = o; + } + e_widget_focused_object_clear(parent); + parent = obj; + for (;;) + { + sd = evas_object_smart_data_get(parent); + sd->focused = 1; + if (sd->on_focus_func) sd->on_focus_func(sd->on_focus_data, parent); + o = e_widget_parent_get(parent); + if (!o) break; + parent = o; + } + sd = evas_object_smart_data_get(obj); + if (sd->focus_func) sd->focus_func(obj); + return; +} + +void +e_widget_activate(Evas_Object *obj) +{ + API_ENTRY return; + if (sd->activate_func) sd->activate_func(obj); +} + /* local subsystem functions */ static void _e_smart_reconfigure(E_Smart_Data *sd) @@ -146,6 +394,7 @@ _e_smart_add(Evas_Object *obj) sd->y = 0; sd->w = 0; sd->h = 0; + sd->can_focus = 1; evas_object_smart_data_set(obj, sd); } @@ -263,4 +512,3 @@ _e_smart_init(void) _e_smart_show, _e_smart_hide, _e_smart_color_set, _e_smart_clip_set, _e_smart_clip_unset, NULL); } - diff --git a/src/bin/e_widget.h b/src/bin/e_widget.h index c9b3bbb23..bf877795d 100644 --- a/src/bin/e_widget.h +++ b/src/bin/e_widget.h @@ -8,15 +8,25 @@ EAPI Evas_Object *e_widget_add(Evas *evas); EAPI void e_widget_del_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj)); +EAPI void e_widget_focus_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj)); +EAPI void e_widget_activate_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj)); +EAPI void e_widget_on_focus_hook_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data); EAPI void e_widget_data_set(Evas_Object *obj, void *data); EAPI void *e_widget_data_get(Evas_Object *obj); EAPI void e_widget_min_size_set(Evas_Object *obj, Evas_Coord minw, Evas_Coord minh); EAPI void e_widget_min_size_get(Evas_Object *obj, Evas_Coord *minw, Evas_Coord *minh); -EAPI void e_widget_max_size_set(Evas_Object *obj, Evas_Coord maxw, Evas_Coord maxh); -EAPI void e_widget_max_size_get(Evas_Object *obj, Evas_Coord *maxw, Evas_Coord *maxh); EAPI void e_widget_sub_object_add(Evas_Object *obj, Evas_Object *sobj); -EAPI void e_widget_sub_object_del(Evas_Object *obj, Evas_Object *sobj); EAPI void e_widget_resize_object_set(Evas_Object *obj, Evas_Object *sobj); - +EAPI void e_widget_can_focus_set(Evas_Object *obj, int can_focus); +EAPI int e_widget_can_focus_get(Evas_Object *obj); +EAPI int e_widget_focus_get(Evas_Object *obj); +EAPI Evas_Object *e_widget_focused_object_get(Evas_Object *obj); +EAPI int e_widget_focus_jump(Evas_Object *obj, int forward); +EAPI void e_widget_focus_set(Evas_Object *obj, int first); +EAPI void e_widget_focused_object_clear(Evas_Object *obj); +EAPI Evas_Object *e_widget_parent_get(Evas_Object *obj); +EAPI void e_widget_focus_steal(Evas_Object *obj); +EAPI void e_widget_activate(Evas_Object *obj); + #endif #endif diff --git a/src/bin/e_widget_button.c b/src/bin/e_widget_button.c index 4cb2093cb..9ee236e88 100644 --- a/src/bin/e_widget_button.c +++ b/src/bin/e_widget_button.c @@ -14,7 +14,10 @@ struct _E_Widget_Data }; static void _e_wid_del_hook(Evas_Object *obj); +static void _e_wid_focus_hook(Evas_Object *obj); +static void _e_wid_activate_hook(Evas_Object *obj); static void _e_wid_signal_cb1(void *data, Evas_Object *obj, const char *emission, const char *source); +static void _e_wid_focus_steal(void *data, Evas *e, Evas_Object *obj, void *event_info); /* local subsystem functions */ /* externally accessible functions */ @@ -28,6 +31,8 @@ e_widget_button_add(Evas *evas, char *label, char *icon, void (*func) (void *dat obj = e_widget_add(evas); e_widget_del_hook_set(obj, _e_wid_del_hook); + e_widget_focus_hook_set(obj, _e_wid_focus_hook); + e_widget_activate_hook_set(obj, _e_wid_activate_hook); wd = calloc(1, sizeof(E_Widget_Data)); wd->func = func; wd->data = data; @@ -43,6 +48,7 @@ e_widget_button_add(Evas *evas, char *label, char *icon, void (*func) (void *dat evas_object_show(o); e_widget_sub_object_add(obj, o); + evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _e_wid_focus_steal, obj); e_widget_resize_object_set(obj, o); if (icon) @@ -73,10 +79,35 @@ _e_wid_del_hook(Evas_Object *obj) } static void -_e_wid_signal_cb1(void *data, Evas_Object *obj, const char *emission, const char *source) +_e_wid_focus_hook(Evas_Object *obj) { E_Widget_Data *wd; - wd = e_widget_data_get(data); + wd = e_widget_data_get(obj); + if (e_widget_focus_get(obj)) + edje_object_signal_emit(wd->o_button, "focus_in", ""); + else + edje_object_signal_emit(wd->o_button, "focus_out", ""); +} + +static void +_e_wid_activate_hook(Evas_Object *obj) +{ + E_Widget_Data *wd; + + wd = e_widget_data_get(obj); if (wd->func) wd->func(wd->data, wd->data2); } + +static void +_e_wid_signal_cb1(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + e_widget_focus_steal(data); + _e_wid_activate_hook(data); +} + +static void +_e_wid_focus_steal(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + e_widget_focus_steal(data); +} diff --git a/src/bin/e_widget_check.c b/src/bin/e_widget_check.c index b805988f9..70b94fefb 100644 --- a/src/bin/e_widget_check.c +++ b/src/bin/e_widget_check.c @@ -6,11 +6,17 @@ typedef struct _E_Widget_Data E_Widget_Data; struct _E_Widget_Data { + Evas_Object *o_check; int *valptr; }; static void _e_wid_del_hook(Evas_Object *obj); +static void _e_wid_focus_hook(Evas_Object *obj); +static void _e_wid_do(Evas_Object *obj); +static void _e_wid_activate_hook(Evas_Object *obj); static void _e_wid_signal_cb1(void *data, Evas_Object *obj, const char *emission, const char *source); +static void _e_wid_focus_steal(void *data, Evas *e, Evas_Object *obj, void *event_info); + /* local subsystem functions */ /* externally accessible functions */ @@ -24,11 +30,14 @@ e_widget_check_add(Evas *evas, char *label, int *val) obj = e_widget_add(evas); e_widget_del_hook_set(obj, _e_wid_del_hook); + e_widget_focus_hook_set(obj, _e_wid_focus_hook); + e_widget_activate_hook_set(obj, _e_wid_activate_hook); wd = calloc(1, sizeof(E_Widget_Data)); wd->valptr = val; e_widget_data_set(obj, wd); o = edje_object_add(evas); + wd->o_check = o; e_theme_edje_object_set(o, "base/theme/widgets", "widgets/check"); edje_object_signal_callback_add(o, "toggled", "*", _e_wid_signal_cb1, obj); @@ -42,6 +51,7 @@ e_widget_check_add(Evas *evas, char *label, int *val) } e_widget_sub_object_add(obj, o); + evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _e_wid_focus_steal, obj); e_widget_resize_object_set(obj, o); return obj; @@ -57,14 +67,52 @@ _e_wid_del_hook(Evas_Object *obj) } static void -_e_wid_signal_cb1(void *data, Evas_Object *obj, const char *emission, const char *source) +_e_wid_focus_hook(Evas_Object *obj) { E_Widget_Data *wd; - wd = e_widget_data_get(data); + wd = e_widget_data_get(obj); + if (e_widget_focus_get(obj)) + edje_object_signal_emit(wd->o_check, "focus_in", ""); + else + edje_object_signal_emit(wd->o_check, "focus_out", ""); +} + +static void +_e_wid_do(Evas_Object *obj) +{ + E_Widget_Data *wd; + + wd = e_widget_data_get(obj); if (wd->valptr) { - if (!strcmp(source, "on")) *(wd->valptr) = 1; + if (*(wd->valptr) == 0) *(wd->valptr) = 1; else *(wd->valptr) = 0; } } + +static void +_e_wid_activate_hook(Evas_Object *obj) +{ + E_Widget_Data *wd; + + wd = e_widget_data_get(obj); + _e_wid_do(obj); + if (wd->valptr) + { + if (*(wd->valptr)) edje_object_signal_emit(wd->o_check, "toggle_on", ""); + else edje_object_signal_emit(wd->o_check, "toggle_off", ""); + } +} + +static void +_e_wid_signal_cb1(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + _e_wid_do(data); +} + +static void +_e_wid_focus_steal(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + e_widget_focus_steal(data); +} diff --git a/src/bin/e_widget_list.c b/src/bin/e_widget_list.c index e2d862750..0b815779b 100644 --- a/src/bin/e_widget_list.c +++ b/src/bin/e_widget_list.c @@ -15,7 +15,7 @@ static void _e_wid_del_hook(Evas_Object *obj); /* externally accessible functions */ Evas_Object * -e_widget_list_add(Evas *evas, int horiz) +e_widget_list_add(Evas *evas, int homogenous, int horiz) { Evas_Object *obj, *o; E_Widget_Data *wd; @@ -29,7 +29,7 @@ e_widget_list_add(Evas *evas, int horiz) o = e_box_add(evas); wd->o_box = o; e_box_orientation_set(o, horiz); - e_box_homogenous_set(o, 0); + e_box_homogenous_set(o, homogenous); evas_object_show(o); e_widget_sub_object_add(obj, o); e_widget_resize_object_set(obj, o); diff --git a/src/bin/e_widget_list.h b/src/bin/e_widget_list.h index cf18914d3..29eb0b8d0 100644 --- a/src/bin/e_widget_list.h +++ b/src/bin/e_widget_list.h @@ -6,7 +6,7 @@ #ifndef E_WIDGET_LIST_H #define E_WIDGET_LIST_H -EAPI Evas_Object *e_widget_list_add(Evas *evas, int horiz); +EAPI Evas_Object *e_widget_list_add(Evas *evas, int homogenous, int horiz); EAPI void e_widget_list_object_append(Evas_Object *obj, Evas_Object *sobj, int fill, int expand, double align); diff --git a/src/bin/e_widget_radio.c b/src/bin/e_widget_radio.c index 1823f52f7..ab43be436 100644 --- a/src/bin/e_widget_radio.c +++ b/src/bin/e_widget_radio.c @@ -18,7 +18,11 @@ struct _E_Widget_Data }; static void _e_wid_del_hook(Evas_Object *obj); +static void _e_wid_focus_hook(Evas_Object *obj); +static void _e_wid_do(Evas_Object *obj); +static void _e_wid_activate_hook(Evas_Object *obj); static void _e_wid_signal_cb1(void *data, Evas_Object *obj, const char *emission, const char *source); +static void _e_wid_focus_steal(void *data, Evas *e, Evas_Object *obj, void *event_info); /* local subsystem functions */ /* externally accessible functions */ @@ -42,6 +46,8 @@ e_widget_radio_add(Evas *evas, char *label, int valnum, E_Radio_Group *group) obj = e_widget_add(evas); e_widget_del_hook_set(obj, _e_wid_del_hook); + e_widget_focus_hook_set(obj, _e_wid_focus_hook); + e_widget_activate_hook_set(obj, _e_wid_activate_hook); wd = calloc(1, sizeof(E_Widget_Data)); wd->group = group; wd->valnum = valnum; @@ -66,6 +72,7 @@ e_widget_radio_add(Evas *evas, char *label, int valnum, E_Radio_Group *group) } e_widget_sub_object_add(obj, o); + evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _e_wid_focus_steal, obj); e_widget_resize_object_set(obj, o); return obj; @@ -86,11 +93,23 @@ _e_wid_del_hook(Evas_Object *obj) } static void -_e_wid_signal_cb1(void *data, Evas_Object *obj, const char *emission, const char *source) +_e_wid_focus_hook(Evas_Object *obj) { E_Widget_Data *wd; - wd = e_widget_data_get(data); + wd = e_widget_data_get(obj); + if (e_widget_focus_get(obj)) + edje_object_signal_emit(wd->o_radio, "focus_in", ""); + else + edje_object_signal_emit(wd->o_radio, "focus_out", ""); +} + +static void +_e_wid_do(Evas_Object *obj) +{ + E_Widget_Data *wd; + + wd = e_widget_data_get(obj); if ((wd->group) && (wd->group->valptr)) { Evas_List *l; @@ -99,7 +118,7 @@ _e_wid_signal_cb1(void *data, Evas_Object *obj, const char *emission, const char for (l = wd->group->radios; l; l = l->next) { wd = e_widget_data_get(l->data); - if (l->data != data) + if (l->data != obj) { wd = e_widget_data_get(l->data); if (wd->valnum == *(wd->group->valptr)) @@ -111,7 +130,29 @@ _e_wid_signal_cb1(void *data, Evas_Object *obj, const char *emission, const char } } if (!toggled) return; - wd = e_widget_data_get(data); - if (!strcmp(source, "on")) *(wd->group->valptr) = wd->valnum; + wd = e_widget_data_get(obj); + *(wd->group->valptr) = wd->valnum; } } + +static void +_e_wid_activate_hook(Evas_Object *obj) +{ + E_Widget_Data *wd; + + wd = e_widget_data_get(obj); + _e_wid_do(obj); + edje_object_signal_emit(wd->o_radio, "toggle_on", ""); +} + +static void +_e_wid_signal_cb1(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + _e_wid_do(data); +} + +static void +_e_wid_focus_steal(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + e_widget_focus_steal(data); +}