[ctxpopup] apply dragable area
authorShinwoo Kim <cinoo.kim@samsung.com>
Mon, 23 May 2011 12:22:44 +0000 (21:22 +0900)
committerShinwoo Kim <cinoo.kim@samsung.com>
Tue, 24 May 2011 08:38:55 +0000 (17:38 +0900)
Change-Id: I03ad73bfb1cbc3cd5c8ddd1900a892e14578f16b

src/lib/elc_ctxpopup.c

index 0122634..a0973d1 100644 (file)
@@ -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);