jaehyun pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=0005b3105e31556bdf22d0f124c6522d5a567387
commit 0005b3105e31556bdf22d0f124c6522d5a567387 Author: Taehyub Kim <taehyub....@samsung.com> Date: Thu Aug 17 17:37:54 2017 +0900 efl_ui_popup: add align and position properties Summary: add align feature and position properties (center, left, right, top, bottom) efl_ui_popup_position_set should be seperated from evas_object_move since evas_object_move can be called internally. Test Plan: 1. run elementary_test -to efluipopup Reviewers: Jaehyun_Cho, jpeg, cedric, thiepha, Blackmole, woohyun Reviewed By: Jaehyun_Cho Differential Revision: https://phab.enlightenment.org/D5105 --- src/bin/elementary/test_popup.c | 93 ++++++++++++++++++++++++++++++- src/lib/elementary/efl_ui_popup.c | 79 ++++++++++++++++++++++---- src/lib/elementary/efl_ui_popup.eo | 30 +++++++++- src/lib/elementary/efl_ui_popup_private.h | 2 + 4 files changed, 189 insertions(+), 15 deletions(-) diff --git a/src/bin/elementary/test_popup.c b/src/bin/elementary/test_popup.c index cc9de42f82..e42b7dc4a9 100644 --- a/src/bin/elementary/test_popup.c +++ b/src/bin/elementary/test_popup.c @@ -967,6 +967,48 @@ _image_change_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, k = !k; } +static void +_center_align_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + efl_ui_popup_align_set(data, EFL_UI_POPUP_ALIGN_CENTER); +} + +static void +_left_align_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + efl_ui_popup_align_set(data, EFL_UI_POPUP_ALIGN_LEFT); +} + +static void +_right_align_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + efl_ui_popup_align_set(data, EFL_UI_POPUP_ALIGN_RIGHT); +} + +static void +_top_align_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + efl_ui_popup_align_set(data, EFL_UI_POPUP_ALIGN_TOP); +} + +static void +_bottom_align_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + efl_ui_popup_align_set(data, EFL_UI_POPUP_ALIGN_BOTTOM); +} + +static void +_position_set_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + efl_ui_popup_position_set(data, 0, 0); +} + void test_efl_ui_popup(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { @@ -975,7 +1017,7 @@ test_efl_ui_popup(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *ev win = elm_win_util_standard_add("Efl UI Popup", "Efl UI Popup"); elm_win_autodel_set(win, EINA_TRUE); - evas_object_resize(win, 320, 320); + evas_object_resize(win, 500, 500); evas_object_show(win); btn = elm_button_add(win); @@ -988,7 +1030,6 @@ test_efl_ui_popup(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *ev evas_object_smart_callback_add(efl_ui_popup, "bg,clicked", _bg_clicked, NULL); - evas_object_move(efl_ui_popup, 80, 80); evas_object_resize(efl_ui_popup, 160, 160); evas_object_show(efl_ui_popup); @@ -1001,5 +1042,53 @@ test_efl_ui_popup(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *ev evas_object_smart_callback_add(btn, "clicked", _image_change_btn_cb, efl_ui_popup); evas_object_show(btn); + Evas_Object *center_btn; + center_btn = elm_button_add(win); + elm_object_text_set(center_btn, "Center Align"); + evas_object_move(center_btn, 0, 300); + evas_object_resize(center_btn, 100, 50); + evas_object_show(center_btn); + evas_object_smart_callback_add(center_btn, "clicked", _center_align_cb, efl_ui_popup); + + Evas_Object *left_btn; + left_btn = elm_button_add(win); + elm_object_text_set(left_btn, "Left Align"); + evas_object_move(left_btn, 100, 300); + evas_object_resize(left_btn, 100, 50); + evas_object_show(left_btn); + evas_object_smart_callback_add(left_btn, "clicked", _left_align_cb, efl_ui_popup); + + Evas_Object *right_btn; + right_btn = elm_button_add(win); + elm_object_text_set(right_btn, "Right Align"); + evas_object_move(right_btn, 200, 300); + evas_object_resize(right_btn, 100, 50); + evas_object_show(right_btn); + evas_object_smart_callback_add(right_btn, "clicked", _right_align_cb, efl_ui_popup); + + Evas_Object *top_btn; + top_btn = elm_button_add(win); + elm_object_text_set(top_btn, "Top Align"); + evas_object_move(top_btn, 0, 350); + evas_object_resize(top_btn, 100, 50); + evas_object_show(top_btn); + evas_object_smart_callback_add(top_btn, "clicked", _top_align_cb, efl_ui_popup); + + Evas_Object *bottom_btn; + bottom_btn = elm_button_add(win); + elm_object_text_set(bottom_btn, "Bottom Align"); + evas_object_move(bottom_btn, 100, 350); + evas_object_resize(bottom_btn, 100, 50); + evas_object_show(bottom_btn); + evas_object_smart_callback_add(bottom_btn, "clicked", _bottom_align_cb, efl_ui_popup); + + Evas_Object *position_btn; + position_btn = elm_button_add(win); + elm_object_text_set(position_btn, "Position Set"); + evas_object_move(position_btn, 200, 350); + evas_object_resize(position_btn, 100, 50); + evas_object_show(position_btn); + evas_object_smart_callback_add(position_btn, "clicked", _position_set_cb, efl_ui_popup); + efl_content_set(efl_ui_popup, btn); } diff --git a/src/lib/elementary/efl_ui_popup.c b/src/lib/elementary/efl_ui_popup.c index 972342b5ca..a8404cb89f 100644 --- a/src/lib/elementary/efl_ui_popup.c +++ b/src/lib/elementary/efl_ui_popup.c @@ -30,20 +30,51 @@ _efl_ui_popup_efl_gfx_position_set(Eo *obj, Efl_Ui_Popup_Data *pd EINA_UNUSED, E } static void -_parent_geom_cb(void *data, const Efl_Event *ev) +_calc_align(Efl_Ui_Popup_Data *pd) { - Evas_Object *event_bg = data; Evas_Coord x, y, w, h; - evas_object_geometry_get(ev->object, &x, &y, &w, &h); + evas_object_geometry_get(pd->win_parent, &x, &y, &w, &h); + + x = 0; + y = 0; + + evas_object_move(pd->event_bg, x, y); + evas_object_resize(pd->event_bg, w, h); + + Evas_Coord pw, ph; + evas_object_geometry_get(pd->self, NULL, NULL, &pw, &ph); - if (efl_isa(ev->object, EFL_UI_WIN_CLASS)) + Efl_Ui_Popup_Align align; + align = efl_ui_popup_align_get(pd->self); + + switch (align) { - x = 0; - y = 0; + case EFL_UI_POPUP_ALIGN_CENTER: + evas_object_move(pd->self, x + ((w - pw ) / 2), y + ((h - ph) / 2)); + break; + case EFL_UI_POPUP_ALIGN_LEFT: + evas_object_move(pd->self, x, y + ((h - ph) / 2)); + break; + case EFL_UI_POPUP_ALIGN_RIGHT: + evas_object_move(pd->self, x + (w - pw), ((h - ph) / 2)); + break; + case EFL_UI_POPUP_ALIGN_TOP: + evas_object_move(pd->self, x + ((w - pw) / 2), y); + break; + case EFL_UI_POPUP_ALIGN_BOTTOM: + evas_object_move(pd->self, x + ((w - pw) / 2), y + (h - ph)); + break; + default: + break; } +} + - evas_object_move(event_bg, x, y); - evas_object_resize(event_bg, w, h); +static void +_parent_geom_cb(void *data, const Efl_Event *ev EINA_UNUSED) +{ + Efl_Ui_Popup_Data *pd = data; + _calc_align(pd); } EOLIAN static void @@ -61,8 +92,8 @@ _efl_ui_popup_elm_widget_widget_parent_set(Eo *obj, Efl_Ui_Popup_Data *pd EINA_U evas_object_move(pd->event_bg, x, y); evas_object_resize(pd->event_bg, w, h); - efl_event_callback_add(pd->win_parent, EFL_GFX_EVENT_RESIZE, _parent_geom_cb, pd->event_bg); - efl_event_callback_add(pd->win_parent, EFL_GFX_EVENT_MOVE, _parent_geom_cb, pd->event_bg); + efl_event_callback_add(pd->win_parent, EFL_GFX_EVENT_RESIZE, _parent_geom_cb, pd); + efl_event_callback_add(pd->win_parent, EFL_GFX_EVENT_MOVE, _parent_geom_cb, pd); } EOLIAN static Eina_Bool @@ -89,6 +120,26 @@ _efl_ui_popup_parent_window_get(Eo *obj EINA_UNUSED, Efl_Ui_Popup_Data *pd) return pd->win_parent; } +EOLIAN void +_efl_ui_popup_position_set(Eo *obj, Efl_Ui_Popup_Data *pd, int x, int y) +{ + evas_object_move(obj, x, y); + pd->align = EFL_UI_POPUP_ALIGN_NONE; +} + +EOLIAN static void +_efl_ui_popup_align_set(Eo *obj EINA_UNUSED, Efl_Ui_Popup_Data *pd, Efl_Ui_Popup_Align type) +{ + pd->align = type; + _calc_align(pd); +} + +EOLIAN static Efl_Ui_Popup_Align +_efl_ui_popup_align_get(Eo *obj EINA_UNUSED, Efl_Ui_Popup_Data *pd) +{ + return pd->align; +} + EOLIAN static void _efl_ui_popup_efl_canvas_group_group_add(Eo *obj, Efl_Ui_Popup_Data *pd) { @@ -97,6 +148,8 @@ _efl_ui_popup_efl_canvas_group_group_add(Eo *obj, Efl_Ui_Popup_Data *pd) efl_canvas_group_add(efl_super(obj, MY_CLASS)); elm_widget_sub_object_parent_add(obj); + pd->self = obj; + elm_widget_can_focus_set(obj, EINA_TRUE); elm_layout_theme_set(obj, "popup", "base", "view"); @@ -106,14 +159,16 @@ _efl_ui_popup_efl_canvas_group_group_add(Eo *obj, Efl_Ui_Popup_Data *pd) evas_object_stack_below(pd->event_bg, wd->resize_obj); edje_object_signal_callback_add(pd->event_bg, "elm,action,clicked", "*", _bg_clicked_cb, obj); + + pd->align = EFL_UI_POPUP_ALIGN_CENTER; } EOLIAN static void _efl_ui_popup_efl_canvas_group_group_del(Eo *obj, Efl_Ui_Popup_Data *pd) { ELM_SAFE_FREE(pd->event_bg, evas_object_del); - efl_event_callback_del(pd->win_parent, EFL_GFX_EVENT_RESIZE, _parent_geom_cb, pd->event_bg); - efl_event_callback_del(pd->win_parent, EFL_GFX_EVENT_MOVE, _parent_geom_cb, pd->event_bg); + efl_event_callback_del(pd->win_parent, EFL_GFX_EVENT_RESIZE, _parent_geom_cb, pd); + efl_event_callback_del(pd->win_parent, EFL_GFX_EVENT_MOVE, _parent_geom_cb, pd); efl_canvas_group_del(efl_super(obj, MY_CLASS)); } diff --git a/src/lib/elementary/efl_ui_popup.eo b/src/lib/elementary/efl_ui_popup.eo index 07b415955e..14a30ca14e 100644 --- a/src/lib/elementary/efl_ui_popup.eo +++ b/src/lib/elementary/efl_ui_popup.eo @@ -1,6 +1,14 @@ +enum Efl.Ui.Popup.Align { + none = 0, + center, + left, + right, + top, + bottom +} + class Efl.Ui.Popup(Efl.Ui.Layout) { - legacy_prefix: elm_popup; methods { @property parent_window @protected { get { @@ -31,6 +39,26 @@ class Efl.Ui.Popup(Efl.Ui.Layout) repeat: bool; [[If $true, events are passed to lower objects.]] } } + @property position { + set { + [[Set the current popup position.]] + } + values { + x: int; + y: int; + } + } + @property align { + set { + [[ Set the popup alignment.]] + } + get { + [[ Get the current popup alignment.]] + } + values { + type: Efl.Ui.Popup.Align; + } + } } implements { class.constructor; diff --git a/src/lib/elementary/efl_ui_popup_private.h b/src/lib/elementary/efl_ui_popup_private.h index 191a5544de..dd979b318e 100644 --- a/src/lib/elementary/efl_ui_popup_private.h +++ b/src/lib/elementary/efl_ui_popup_private.h @@ -4,8 +4,10 @@ typedef struct _Efl_Ui_Popup_Data Efl_Ui_Popup_Data; struct _Efl_Ui_Popup_Data { + Evas_Object *self; Evas_Object *win_parent; Evas_Object *event_bg; + Efl_Ui_Popup_Align align; Eina_Bool bg_repeat_events : 1; }; --