diff --git a/legacy/elementary/data/themes/default.edc b/legacy/elementary/data/themes/default.edc index 8b050bb2b8..cda5f4c3b1 100644 --- a/legacy/elementary/data/themes/default.edc +++ b/legacy/elementary/data/themes/default.edc @@ -25610,6 +25610,7 @@ collections { ///////////////////////////////////////////////////////////////////////////// group { name: "elm/panel/base/left"; + alias: "elm/panel/base/top"; images { image: "bt_base1.png" COMP; @@ -25620,8 +25621,35 @@ collections { image: "icon_arrow_left.png" COMP; image: "icon_arrow_right.png" COMP; } + data { + item: "focus_highlight" "on"; + } parts { + part { name: "focus_highlight"; + description { state: "default" 0.0; + visible: 0; + color: 255 255 255 0; + rel1 { + to: "btn"; + offset: -8 -8; + } + rel2 { + to: "btn"; + offset: 7 7; + } + image { + normal: "frame_2.png"; + border: 5 5 32 26; + middle: 0; + } + } + description { state: "enabled" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 255 255 255 255; + } + } part { name: "bg"; @@ -25631,14 +25659,19 @@ collections { { state: "default" 0.0; color: 255 255 255 0; - rel1.offset: 30 0; - rel2.relative: 0.0 1.0; + rel1.relative: 0.0 0.0; + rel1.offset: 0 0; + rel2.relative: 1.0 1.0; + rel2.offset: -1 -1; } description { - state: "visible" 0.0; + state: "hidden" 0.0; inherit: "default" 0.0; - rel2.relative: 1.0 1.0; + rel1.relative: -1.0 0.0; + rel1.offset: 21 0; + rel2.relative: 0.0 1.0; + rel2.offset: 20 -1; } } part @@ -25649,11 +25682,9 @@ collections { description { state: "default" 0.0; - rel2 - { - offset: -20 -1; - to_x: "bg"; - } + rel1.to: "bg"; + rel2.to: "bg"; + rel2.offset: -20 -1; image { normal: "bt_dis_base.png"; @@ -25804,13 +25835,13 @@ collections { align: 0.5 0.5; min: 16 16; max: 16 16; - image.normal: "icon_arrow_right.png"; + image.normal: "icon_arrow_left.png"; } description { - state: "visible" 0.0; + state: "hidden" 0.0; inherit: "default" 0.0; - image.normal: "icon_arrow_left.png"; + image.normal: "icon_arrow_right.png"; } } } @@ -25821,26 +25852,9 @@ collections { name: "show"; signal: "elm,action,show"; source: "elm"; - action: STATE_SET "visible" 0.0; - target: "bg"; - target: "btn_icon"; - transition: LINEAR 0.5; - } - program - { - name: "show2"; - signal: "show"; action: STATE_SET "default" 0.0; target: "bg"; target: "btn_icon"; - after: "show3"; - } - program - { - name: "show3"; - action: STATE_SET "visible" 0.0; - target: "bg"; - target: "btn_icon"; transition: LINEAR 0.5; } program @@ -25848,7 +25862,7 @@ collections { name: "hide"; signal: "elm,action,hide"; source: "elm"; - action: STATE_SET "default" 0.0; + action: STATE_SET "hidden" 0.0; target: "bg"; target: "btn_icon"; transition: LINEAR 0.5; @@ -25889,15 +25903,30 @@ collections { program { name: "btn_unclick3"; - signal: "mouse,up,1"; + signal: "mouse,clicked,1"; source: "btn_over2"; action: SIGNAL_EMIT "elm,action,panel,toggle" ""; } + program { name: "highlight_show"; + signal: "elm,action,focus_highlight,show"; + source: "elm"; + action: STATE_SET "enabled" 0.0; + transition: ACCELERATE 0.3; + target: "focus_highlight"; + } + program { name: "highlight_hide"; + signal: "elm,action,focus_highlight,hide"; + source: "elm"; + action: STATE_SET "default" 0.0; + transition: DECELERATE 0.3; + target: "focus_highlight"; + } } } group { name: "elm/panel/base/right"; + alias: "elm/panel/base/bottom"; images { image: "bt_base1.png" COMP; @@ -25910,6 +25939,30 @@ collections { } parts { + part { name: "focus_highlight"; + description { state: "default" 0.0; + visible: 0; + color: 255 255 255 0; + rel1 { + to: "btn"; + offset: -8 -8; + } + rel2 { + to: "btn"; + offset: 7 7; + } + image { + normal: "frame_2.png"; + border: 5 5 32 26; + middle: 0; + } + } + description { state: "enabled" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 255 255 255 255; + } + } part { name: "bg"; @@ -25919,14 +25972,19 @@ collections { { state: "default" 0.0; color: 255 255 255 0; - rel1.relative: 1 0; - rel2.offset: -31 0; + rel1.relative: 0.0 0.0; + rel1.offset: 0 0; + rel2.relative: 1.0 1.0; + rel2.offset: -1 -1; } description { - state: "visible" 0.0; + state: "hidden" 0.0; inherit: "default" 0.0; - rel1.relative: 0 0; + rel1.relative: 1.0 0.0; + rel1.offset: -22 0; + rel2.relative: 2.0 1.0; + rel2.offset: -23 -1; } } part @@ -25937,12 +25995,9 @@ collections { description { state: "default" 0.0; - rel1 - { - offset: 20 0; - to_x: "bg"; - } - rel2.offset: -1 -1; + rel1.to: "bg"; + rel1.offset: 20 0; + rel2.to: "bg"; image { normal: "bt_dis_base.png"; @@ -26096,13 +26151,13 @@ collections { align: 0.5 0.5; min: 16 16; max: 16 16; - image.normal: "icon_arrow_left.png"; + image.normal: "icon_arrow_right.png"; } description { - state: "visible" 0.0; + state: "hidden" 0.0; inherit: "default" 0.0; - image.normal: "icon_arrow_right.png"; + image.normal: "icon_arrow_left.png"; } } } @@ -26113,26 +26168,9 @@ collections { name: "show"; signal: "elm,action,show"; source: "elm"; - action: STATE_SET "visible" 0.0; - target: "bg"; - target: "btn_icon"; - transition: LINEAR 0.5; - } - program - { - name: "show2"; - signal: "show"; action: STATE_SET "default" 0.0; target: "bg"; target: "btn_icon"; - after: "show3"; - } - program - { - name: "show3"; - action: STATE_SET "visible" 0.0; - target: "bg"; - target: "btn_icon"; transition: LINEAR 0.5; } program @@ -26140,7 +26178,7 @@ collections { name: "hide"; signal: "elm,action,hide"; source: "elm"; - action: STATE_SET "default" 0.0; + action: STATE_SET "hidden" 0.0; target: "bg"; target: "btn_icon"; transition: LINEAR 0.5; @@ -26185,6 +26223,20 @@ collections { source: "btn_over2"; action: SIGNAL_EMIT "elm,action,panel,toggle" ""; } + program { name: "highlight_show"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "enabled" 0.0; + transition: ACCELERATE 0.3; + target: "focus_highlight"; + } + program { name: "highlight_hide"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + transition: DECELERATE 0.3; + target: "focus_highlight"; + } } } diff --git a/legacy/elementary/src/bin/test_focus.c b/legacy/elementary/src/bin/test_focus.c index 8237acef55..a30455bc0f 100644 --- a/legacy/elementary/src/bin/test_focus.c +++ b/legacy/elementary/src/bin/test_focus.c @@ -1,6 +1,5 @@ /* Test for Focus Chain Linear*/ #include -#include /* needed for testing hacks */ static void _on_key_down(void *data, Evas *e, Evas_Object *obj, void *einfo) @@ -49,7 +48,6 @@ test_focus(void *data, Evas_Object *obj, void *event_info) { //First Col Evas_Object *bx = elm_box_add(win); - //evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_box_pack_end(mainbx, bx); @@ -274,7 +272,7 @@ test_focus(void *data, Evas_Object *obj, void *event_info) { //Panel Evas_Object *panel = elm_panel_add(win); - elm_panel_orient_set(panel, ELM_PANEL_ORIENT_BOTTOM); + elm_panel_orient_set(panel, ELM_PANEL_ORIENT_LEFT); evas_object_size_hint_weight_set(panel, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(panel, EVAS_HINT_FILL, EVAS_HINT_FILL); diff --git a/legacy/elementary/src/bin/test_panel.c b/legacy/elementary/src/bin/test_panel.c index b9530d04a1..3e3b98cf14 100644 --- a/legacy/elementary/src/bin/test_panel.c +++ b/legacy/elementary/src/bin/test_panel.c @@ -215,6 +215,7 @@ test_panel(void *data, Evas_Object *obj, void *event_info) elm_panel_orient_set(panel, ELM_PANEL_ORIENT_RIGHT); evas_object_size_hint_weight_set(panel, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(panel, 1, EVAS_HINT_FILL); + elm_panel_hidden_set(panel, EINA_TRUE); list = elm_genlist_add(win); evas_object_size_hint_min_set(list, 100, -1); @@ -235,6 +236,7 @@ test_panel(void *data, Evas_Object *obj, void *event_info) elm_panel_orient_set(panel, ELM_PANEL_ORIENT_BOTTOM); evas_object_size_hint_weight_set(panel, EVAS_HINT_EXPAND, 0); evas_object_size_hint_align_set(panel, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_panel_hidden_set(panel, EINA_TRUE); toolbar = elm_toolbar_add(win); elm_toolbar_homogenous_set(toolbar, 0); diff --git a/legacy/elementary/src/lib/elm_panel.c b/legacy/elementary/src/lib/elm_panel.c index d9f9aecfb3..70590e586a 100644 --- a/legacy/elementary/src/lib/elm_panel.c +++ b/legacy/elementary/src/lib/elm_panel.c @@ -28,6 +28,7 @@ struct _Widget_Data static const char *widtype = NULL; static void _del_hook(Evas_Object *obj); static void _theme_hook(Evas_Object *obj); +static void _on_focus_hook(void *data, Evas_Object *obj); static void _sizing_eval(Evas_Object *obj); static void _resize(void *data, Evas *evas, Evas_Object *obj, void *event); static void _layout(Evas_Object *o, Evas_Object_Box_Data *priv, void *data); @@ -46,12 +47,36 @@ _theme_hook(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); if (!wd) return; - elm_smart_scroller_object_theme_set(obj, wd->scr, "panel", "base", elm_widget_style_get(obj)); -// scale = (elm_widget_scale_get(obj) * _elm_config->scale); -// edje_object_scale_set(wd->scr, scale); + if (wd->scr) + { + Evas_Object *edj; + const char *str; + + elm_smart_scroller_object_theme_set(obj, wd->scr, "panel", "base", + elm_widget_style_get(obj)); + // scale = (elm_widget_scale_get(obj) * _elm_config->scale); + // edje_object_scale_set(wd->scr, scale); + edj = elm_smart_scroller_edje_object_get(wd->scr); + str = edje_object_data_get(edj, "focus_highlight"); + if (str && !strcmp(str, "on")) + elm_widget_highlight_in_theme_set(obj, EINA_TRUE); + else + elm_widget_highlight_in_theme_set(obj, EINA_FALSE); + } _sizing_eval(obj); } +static void +_on_focus_hook(void *data __UNUSED__, Evas_Object *obj) +{ + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + if (elm_widget_focus_get(obj)) + evas_object_focus_set(obj, EINA_TRUE); + else + evas_object_focus_set(obj, EINA_FALSE); +} + static Eina_Bool _elm_panel_focus_cycle_hook(Evas_Object *obj, Elm_Focus_Direction dir, Eina_Bool circular) { @@ -82,6 +107,34 @@ _elm_panel_focus_cycle_hook(Evas_Object *obj, Elm_Focus_Direction dir, Eina_Bool return EINA_FALSE; } +static void +_signal_emit_hook(Evas_Object *obj, const char *emission, const char *source) +{ + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + edje_object_signal_emit(elm_smart_scroller_edje_object_get(wd->scr), + emission, source); +} + +static void +_signal_callback_add_hook(Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source), void *data) +{ + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + edje_object_signal_callback_add(elm_smart_scroller_edje_object_get(wd->scr), + emission, source, func_cb, data); +} + +static void * +_signal_callback_del_hook(Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source)) +{ + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return NULL; + return edje_object_signal_callback_del( + elm_smart_scroller_edje_object_get(wd->scr), emission, source, + func_cb); +} + static void _sizing_eval(Evas_Object *obj) { @@ -134,7 +187,7 @@ _layout(Evas_Object *o, Evas_Object_Box_Data *priv, void *data) } static void -_toggle_panel(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__) +_toggle_panel(void *data, Evas_Object *obj, const char *emission __UNUSED__, const char *source __UNUSED__) { Widget_Data *wd = elm_widget_data_get(data); if (!wd) return; @@ -143,15 +196,42 @@ _toggle_panel(void *data, Evas_Object *obj __UNUSED__, const char *emission __UN edje_object_signal_emit(elm_smart_scroller_edje_object_get(wd->scr), "elm,action,show", "elm"); wd->hidden = EINA_FALSE; + evas_object_repeat_events_set(obj, EINA_FALSE); } else { edje_object_signal_emit(elm_smart_scroller_edje_object_get(wd->scr), "elm,action,hide", "elm"); wd->hidden = EINA_TRUE; + evas_object_repeat_events_set(obj, EINA_TRUE); + if (elm_widget_focus_get(wd->content)) + { + elm_widget_focused_object_clear(obj); + elm_widget_focus_steal(obj); + } } } +static Eina_Bool +_event_hook(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_Type type, void *event_info) +{ + if ((src != obj) || (type != EVAS_CALLBACK_KEY_DOWN)) return EINA_FALSE; + + Evas_Event_Key_Down *ev = event_info; + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return EINA_FALSE; + + if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE; + + if (strcmp(ev->keyname, "Return") && strcmp(ev->keyname, "space")) + return EINA_FALSE; + + _toggle_panel(obj, NULL, "elm,action,panel,toggle", "*"); + + ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; + return EINA_TRUE; +} + /** * Adds a panel object * @@ -177,12 +257,18 @@ elm_panel_add(Evas_Object *parent) elm_widget_data_set(obj, wd); elm_widget_del_hook_set(obj, _del_hook); elm_widget_theme_hook_set(obj, _theme_hook); + elm_widget_on_focus_hook_set(obj, _on_focus_hook, NULL); + elm_widget_signal_emit_hook_set(obj, _signal_emit_hook); + elm_widget_signal_callback_add_hook_set(obj, _signal_callback_add_hook); + elm_widget_signal_callback_del_hook_set(obj, _signal_callback_del_hook); elm_widget_focus_cycle_hook_set(obj, _elm_panel_focus_cycle_hook); - elm_widget_can_focus_set(obj, EINA_FALSE); + elm_widget_can_focus_set(obj, EINA_TRUE); + elm_widget_highlight_in_theme_set(obj, EINA_TRUE); + elm_widget_event_hook_set(obj, _event_hook); wd->scr = elm_smart_scroller_add(evas); elm_smart_scroller_widget_set(wd->scr, obj); - elm_smart_scroller_object_theme_set(obj, wd->scr, "panel", "base", "left"); + _theme_hook(obj); elm_smart_scroller_bounce_allow_set(wd->scr, 0, 0); elm_widget_resize_object_set(obj, wd->scr); elm_smart_scroller_policy_set(wd->scr, ELM_SMART_SCROLLER_POLICY_OFF, @@ -232,7 +318,10 @@ elm_panel_orient_set(Evas_Object *obj, Elm_Panel_Orient orient) switch (orient) { case ELM_PANEL_ORIENT_TOP: + elm_smart_scroller_object_theme_set(obj, wd->scr, "panel", "base", "top"); + break; case ELM_PANEL_ORIENT_BOTTOM: + elm_smart_scroller_object_theme_set(obj, wd->scr, "panel", "base", "bottom"); break; case ELM_PANEL_ORIENT_LEFT: elm_smart_scroller_object_theme_set(obj, wd->scr, "panel", "base", "left"); @@ -240,8 +329,6 @@ elm_panel_orient_set(Evas_Object *obj, Elm_Panel_Orient orient) case ELM_PANEL_ORIENT_RIGHT: elm_smart_scroller_object_theme_set(obj, wd->scr, "panel", "base", "right"); break; - default: - break; } _sizing_eval(obj); } @@ -332,7 +419,6 @@ elm_panel_hidden_set(Evas_Object *obj, Eina_Bool hidden) Widget_Data *wd = elm_widget_data_get(obj); if (!wd) return; if (wd->hidden == hidden) return; - wd->hidden = hidden; _toggle_panel(obj, NULL, "elm,action,panel,toggle", "*"); }