From eac6fca60c7dbb024eb2995a2d0939daab92a676 Mon Sep 17 00:00:00 2001 From: Shinwoo Kim Date: Mon, 23 May 2011 21:22:44 +0900 Subject: [PATCH] [ctxpopup] apply dragable area Change-Id: I03ad73bfb1cbc3cd5c8ddd1900a892e14578f16b --- src/lib/elc_ctxpopup.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/src/lib/elc_ctxpopup.c b/src/lib/elc_ctxpopup.c index 0122634..a0973d1 100644 --- a/src/lib/elc_ctxpopup.c +++ b/src/lib/elc_ctxpopup.c @@ -489,6 +489,7 @@ _update_arrow(Evas_Object *obj, Elm_Ctxpopup_Direction dir) { Evas_Coord x, y; Evas_Coord_Rectangle arrow_size; + Evas_Coord_Rectangle base_size; Widget_Data *wd; wd = elm_widget_data_get(obj); @@ -497,33 +498,85 @@ _update_arrow(Evas_Object *obj, Elm_Ctxpopup_Direction dir) evas_object_geometry_get(obj, &x, &y, NULL, NULL); evas_object_geometry_get(wd->arrow, NULL, NULL, &arrow_size.w, &arrow_size.h); + evas_object_geometry_get(wd->base, &base_size.x, &base_size.y, + &base_size.w, &base_size.h); switch (dir) { case ELM_CTXPOPUP_DIRECTION_LEFT: edje_object_signal_emit(wd->arrow, "elm,state,left", "elm"); + + // if user does not use dragable part arrow_size.y = (y - (arrow_size.h * 0.5)); arrow_size.x = (x + elm_finger_size_get()); + + edje_object_part_swallow(wd->base, "elm.swallow.arrowLeft", wd->arrow); + if (base_size.h > 0) + { + if (y - base_size.y < 0) y = 0; + else if (y > base_size.y + base_size.h) y = base_size.h; + else y = y - base_size.y; + edje_object_part_drag_value_set(wd->base, "elm.swallow.arrowLeft", 0.5, + (double) (y) / (double) (base_size.h)); + } break; case ELM_CTXPOPUP_DIRECTION_RIGHT: edje_object_signal_emit(wd->arrow, "elm,state,right", "elm"); + + // if user does not use dragable part arrow_size.y = (y - (arrow_size.h * 0.5)); arrow_size.x = (x - elm_finger_size_get() - arrow_size.w); + + edje_object_part_swallow(wd->base, "elm.swallow.arrowRight", wd->arrow); + if (base_size.h > 0) + { + if (y -base_size.y < 0) y = 0; + else if (y > base_size.y + base_size.h) y = base_size.h; + else y = y - base_size.y; + edje_object_part_drag_value_set(wd->base, "elm.swallow.arrowRight", 0.5, + (double) (y) / (double) (base_size.h)); + } break; case ELM_CTXPOPUP_DIRECTION_UP: edje_object_signal_emit(wd->arrow, "elm,state,top", "elm"); + + // if user does not use dragable part arrow_size.x = (x - (arrow_size.w * 0.5)); arrow_size.y = (y + elm_finger_size_get()); + + edje_object_part_swallow(wd->base, "elm.swallow.arrowUp", wd->arrow); + if (base_size.w > 0) + { + if (x - base_size.x < 0) x = 0; + else if (x > base_size.x + base_size.w) x = base_size.w; + else x = x - base_size.x; + edje_object_part_drag_value_set(wd->base, "elm.swallow.arrowUp", + (double) (x) / (double) (base_size.w), 0.5); + } break; case ELM_CTXPOPUP_DIRECTION_DOWN: edje_object_signal_emit(wd->arrow, "elm,state,bottom", "elm"); + + // if user does not use dragable part arrow_size.x = (x - (arrow_size.w * 0.5)); arrow_size.y = (y - elm_finger_size_get() - arrow_size.h); + + edje_object_signal_emit(wd->arrow, "elm,state,bottom", "elm"); + edje_object_part_swallow(wd->base, "elm.swallow.arrowDown", wd->arrow); + if (base_size.w > 0) + { + if (x - base_size.x < 0) x = 0; + else if (x > base_size.x + base_size.w) x = base_size.w; + else x = x - base_size.x; + edje_object_part_drag_value_set(wd->base, "elm.swallow.arrowDown", + (double) (x) / (double) (base_size.w), 0.5); + } break; default: break; } + // if user does not use dragable part evas_object_move(wd->arrow, arrow_size.x, arrow_size.y); } @@ -572,10 +625,6 @@ _sizing_eval(Evas_Object *obj) _update_arrow(obj, wd->dir); _shift_base_by_arrow(wd->arrow, wd->dir, &rect); - //move base up, to avoid arrow above base contents - if (wd->dir == ELM_CTXPOPUP_DIRECTION_UP) - evas_object_layer_set(wd->base, evas_object_layer_get(wd->arrow) + 1); - //resize scroller according to final size. if (!wd->content) evas_object_smart_calculate(wd->scr); -- 2.7.4