{
Evas_Coord x, y;
Evas_Coord_Rectangle arrow_size;
+ Evas_Coord_Rectangle base_size;
Widget_Data *wd;
wd = elm_widget_data_get(obj);
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);
}
_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);