cedric pushed a commit to branch master.

http://git.enlightenment.org/core/elementary.git/commit/?id=d19f943d8dc94584c529d7b9423de5ee3eb3a211

commit d19f943d8dc94584c529d7b9423de5ee3eb3a211
Author: divyesh purohit <div.puro...@samsung.com>
Date:   Mon Jan 4 15:08:49 2016 -0800

    hoversel: fix hover position in hoversel, when it goes out of the viewport
    
    Summary:
    Hoversel Widget is designed in such a way that it accepts 
top/bottom/left/right directions , internally it uses hover widget which does 
not take care if its content goes of it's parent (Elm_Win in most cases) . this 
patch ensures that the drop-down content remains restricted in visible 
hover_parent. it would fix  T2965
    Signed-off-by: divyesh purohit <div.puro...@samsung.com>
    Signed-off-by: Jee-Yong Um <con...@gmail.com>
    
    Test Plan:
    Open entry widget and right click to show a hoversel widget, check if the 
hoversel or hover content goes out of the window.
    
    this is what hoversel would look like after this patch {F27551}
    
    Screenshots of top-left / top-right/ bottom-left and bottom-right corners 
in entry after this patch
    
    {F27553}
    
    {F27554}
    
    {F27555}
    
    {F27557}
    
    Reviewers: shilpasingh, conr2d, raster, cedric, Hermet
    
    Subscribers: rajeshps, govi
    
    Projects: #elementary
    
    Maniphest Tasks: T2965
    
    Differential Revision: https://phab.enlightenment.org/D3513
    
    Signed-off-by: Cedric BAIL <ced...@osg.samsung.com>
---
 data/themes/edc/elm/button.edc |   4 +-
 data/themes/edc/elm/hover.edc  | 169 +++++++++++++++++++++++++++++++++--------
 src/lib/elc_hoversel.c         |  15 +++-
 src/lib/elm_entry.c            |  20 ++---
 4 files changed, 160 insertions(+), 48 deletions(-)

diff --git a/data/themes/edc/elm/button.edc b/data/themes/edc/elm/button.edc
index 8b9811c..2134d41 100644
--- a/data/themes/edc/elm/button.edc
+++ b/data/themes/edc/elm/button.edc
@@ -1069,7 +1069,7 @@ group { name: 
"elm/button/base/hoversel_vertical_entry/default";
       image { "base"; nomouse;
          desc { "default";
             fixed: 1 1;
-            rel1.offset: -6 0;
+            rel1.offset: 0 0;
             image.normal: "vgrad_med_dark.png";
             fill.smooth: 0;
             TILED_HORIZ(120)
@@ -1174,7 +1174,7 @@ group { name: 
"elm/button/base/hoversel_vertical_entry/default";
             color_class: "hoversel_text";
             color3: 255 255 255 255;
             text { font: FN; size: 10;
-               align: -1 0.5;
+               align: 0.0 0.5;
                min: 0 0;
                text_class: "button";
             }
diff --git a/data/themes/edc/elm/hover.edc b/data/themes/edc/elm/hover.edc
index 7466f0d..8a7ed49 100644
--- a/data/themes/edc/elm/hover.edc
+++ b/data/themes/edc/elm/hover.edc
@@ -445,6 +445,24 @@ group { name: "elm/hover/base/hoversel_vertical/default";
    // max_size limits the maximum size of expanded hoversel
    // when it's scrollable.
    //data.item: "max_size" "60";
+   script {
+      public visible = 0;
+      public right = 0;
+      public topshow2() {
+         if (get_int(right) == 0)
+            run_program(PROGRAM:"topshow_default");
+         else
+            run_program(PROGRAM:"topshow_right");
+         set_int(visible, 1);
+      }
+      public bottomshow2() {
+         if (get_int(right) == 0)
+            run_program(PROGRAM:"bottomshow_default");
+         else
+            run_program(PROGRAM:"bottomshow_right");
+         set_int(visible, 1);
+      }
+   }
    parts {
       part { name: "elm.swallow.offset"; type: SWALLOW;
          description { state: "default" 0.0;
@@ -466,11 +484,11 @@ group { name: "elm/hover/base/hoversel_vertical/default";
          description { state: "default" 0.0;
             rel1.to_x: "limit0";
             rel1.to_y: "elm.swallow.slot.top";
-            rel1.offset: -10 -6;
+            rel1.offset: -2 -4;
             rel2.to_x: "limit1";
             rel2.to_y: "elm.swallow.slot.middle";
             rel2.relative: 1.0 0.0;
-            rel2.offset: 9 5;
+            rel2.offset: 9 4;
             image {
                normal: "button_normal.png";
                border: 7 7 7 7;
@@ -481,10 +499,10 @@ group { name: "elm/hover/base/hoversel_vertical/default";
             rel1.to_x: "limit0";
             rel1.to_y: "elm.swallow.slot.middle";
             rel1.relative: 0.0 1.0;
-            rel1.offset: -10 -4;
+            rel1.offset: -2 -4;
             rel2.to_x: "limit1";
             rel2.to_y: "elm.swallow.slot.bottom";
-            rel2.offset: 9 5;
+            rel2.offset: 9 4;
             image {
                normal: "button_normal.png";
                border: 7 7 7 7;
@@ -558,7 +576,7 @@ group { name: "elm/hover/base/hoversel_vertical/default";
          clip_to: "topclip";
          description { state: "default" 0.0;
             visible: 1;
-            align: 0.5 0.0;
+            align: 0.0 0.0;
             rel1.to: "elm.swallow.slot.middle";
             rel1.relative: 0.0 0.0;
             rel1.offset: 0 -1;
@@ -568,7 +586,17 @@ group { name: "elm/hover/base/hoversel_vertical/default";
          }
          description { state: "visible" 0.0;
             inherit: "default" 0.0;
-            align: 0.5 1.0;
+            align: 0.0 1.0;
+         }
+         description { state: "right" 0.0;
+            inherit: "default" 0.0;
+            align: 1.0 0.0;
+            rel2.offset: -9 0;
+         }
+         description { state: "right_visible" 0.0;
+            inherit: "default" 0.0;
+            align: 1.0 1.0;
+            rel2.offset: -9 0;
          }
       }
       part { name: "bottomclip"; type: RECT;
@@ -580,7 +608,7 @@ group { name: "elm/hover/base/hoversel_vertical/default";
       part { name: "elm.swallow.slot.bottom"; type: SWALLOW;
          clip_to: "bottomclip";
          description { state: "default" 0.0;
-            align: 0.5 1.0;
+            align: 0.0 1.0;
             rel1.to: "elm.swallow.slot.middle";
             rel1.relative: 0.0 1.0;
             rel1.offset: 0 2;
@@ -590,7 +618,17 @@ group { name: "elm/hover/base/hoversel_vertical/default";
          }
          description { state: "visible" 0.0;
             inherit: "default" 0.0;
-            align: 0.5 0.0;
+            align: 0.0 0.0;
+         }
+         description { state: "right" 0.0;
+            inherit: "default" 0.0;
+            align: 1.0 1.0;
+            rel2.offset: -9 0;
+         }
+         description { state: "right_visible" 0.0;
+            inherit: "default" 0.0;
+            align: 1.0 0.0;
+            rel2.offset: -9 0;
          }
       }
       part { name: "elm.swallow.slot.middle";
@@ -621,45 +659,114 @@ group { name: "elm/hover/base/hoversel_vertical/default";
       program { name: "hidefinished";
          action: SIGNAL_EMIT "elm,action,hide,finished" "elm";
       }
-      
       program { name: "topshow";
          signal: "elm,action,slot,top,show"; source: "elm";
+         script {
+            set_state(PART:"limit0", "visible", 0.0);
+            set_state(PART:"limit1", "visible", 0.0);
+            set_state(PART:"button_image", "default", 0.0);
+            topshow2();
+         }
+      }
+      program { name: "topshow_default";
          action: STATE_SET "visible" 0.0;
-         transition: DECELERATE 0.5;
          target: "elm.swallow.slot.top";
+         transition: DECELERATE 0.5;
       }
-      program { name: "topshow3";
-         signal: "elm,action,slot,top,show"; source: "elm";
-         action: STATE_SET "default" 0.0;
-         target: "button_image";
-         target: "limit0";
-         target: "limit1";
+      program { name: "topshow_right";
+         action: STATE_SET "right_visible" 0.0;
+         target: "elm.swallow.slot.top";
+         transition: DECELERATE 0.5;
       }
       program { name: "tophide";
-         signal: "elm,action,slot,top,hide"; source: "elm";
+         signal: "elm,action,slot,top,hide";
+         source: "elm";
+         script {
+            if (get_int(right) == 0)
+               run_program(PROGRAM:"tophide_default");
+            else
+               run_program(PROGRAM:"tophide_right");
+            set_int(visible, 0);
+         }
+      }
+      program { name: "tophide_default";
          action: STATE_SET "default" 0.0;
+         target: "elm.swallow.slot.top";
          transition: DECELERATE 0.5;
+      }
+      program { name: "tophide_right";
+         action: STATE_SET "right" 0.0;
          target: "elm.swallow.slot.top";
+         transition: DECELERATE 0.5;
       }
-      
       program { name: "bottomshow";
          signal: "elm,action,slot,bottom,show"; source: "elm";
+         script {
+            set_state(PART:"limit0", "bottom", 0.0);
+            set_state(PART:"limit1", "bottom", 0.0);
+            set_state(PART:"button_image", "bottom", 0.0);
+            bottomshow2();
+         }
+      }
+      program { name: "bottomshow_default";
          action: STATE_SET "visible" 0.0;
-         transition: DECELERATE 0.5;
          target: "elm.swallow.slot.bottom";
+         transition: DECELERATE 0.5;
       }
-      program { name: "bottomshow3";
-         signal: "elm,action,slot,bottom,show"; source: "elm";
-         action: STATE_SET "bottom" 0.0;
-         target: "button_image";
-         target: "limit0";
-         target: "limit1";
+      program { name: "bottomshow_right";
+         action: STATE_SET "right_visible" 0.0;
+         target: "elm.swallow.slot.bottom";
+         transition: DECELERATE 0.5;
       }
       program { name: "bottomhide";
          signal: "elm,action,slot,bottom,hide"; source: "elm";
+         script {
+            if (get_int(right) == 0) {
+               run_program(PROGRAM:"bottomhide_default");
+            }
+            else {
+               run_program(PROGRAM:"bottomhide_right");
+            }
+            set_int(visible, 0);
+         }
+      }
+      program { name: "bottomhide_default";
          action: STATE_SET "default" 0.0;
+         target: "elm.swallow.slot.bottom";
          transition: DECELERATE 0.5;
+      }
+      program { name: "bottomhide_right";
+         action: STATE_SET "right" 0.0;
          target: "elm.swallow.slot.bottom";
+         transition: DECELERATE 0.5;
+      }
+      program { name: "align_right";
+         signal: "elm,state,align,right"; source: "elm";
+         script {
+            set_int(right, 1);
+            if (get_int(visible) == 0) {
+               set_state(PART:"elm.swallow.slot.top", "right", 0.0);
+               set_state(PART:"elm.swallow.slot.bottom", "right", 0.0);
+            }
+            else {
+               set_state(PART:"elm.swallow.slot.top", "right_visible", 0.0);
+               set_state(PART:"elm.swallow.slot.bottom", "right_visible", 0.0);
+            }
+         }
+      }
+      program { name: "align_default";
+         signal: "elm,state,align,default"; source: "elm";
+         script {
+            set_int(right, 0);
+            if (get_int(visible) == 0) {
+               set_state(PART:"elm.swallow.slot.top", "default", 0.0);
+               set_state(PART:"elm.swallow.slot.bottom", "default", 0.0);
+            }
+            else {
+               set_state(PART:"elm.swallow.slot.top", "visible", 0.0);
+               set_state(PART:"elm.swallow.slot.bottom", "visible", 0.0);
+            }
+         }
       }
    }
 }
@@ -701,7 +808,7 @@ group { name: "elm/hover/base/hoversel_horizontal/default";
          description { state: "default" 0.0;
             rel1.to_x: "elm.swallow.slot.left";
             rel1.to_y: "elm.swallow.slot.left";
-            rel1.offset: -10 -10;
+            rel1.offset: -10 0;
             rel2.to_x: "elm.swallow.slot.middle";
             rel2.to_y: "elm.swallow.slot.left";
             rel2.relative: 0.0 1.0;
@@ -716,7 +823,7 @@ group { name: "elm/hover/base/hoversel_horizontal/default";
             rel1.to_x: "elm.swallow.slot.middle";
             rel1.to_y: "elm.swallow.slot.right";
             rel1.relative: 1.0 0.0;
-            rel1.offset: -5 -10;
+            rel1.offset: -5 0;
             rel2.to_x: "elm.swallow.slot.right";
             rel2.to_y: "elm.swallow.slot.right";
             rel2.offset: 10 9;
@@ -737,7 +844,7 @@ group { name: "elm/hover/base/hoversel_horizontal/default";
       part { name: "elm.swallow.slot.left"; type: SWALLOW;
          clip_to: "leftclip";
          description { state: "default" 0.0;
-            align: 0.0 0.5;
+            align: 0.0 0.0;
             rel1.to: "elm.swallow.slot.middle";
             rel1.relative: 0.0 0.0;
             rel1.offset: -1 0;
@@ -749,7 +856,7 @@ group { name: "elm/hover/base/hoversel_horizontal/default";
             inherit: "default" 0.0;
             rel1.offset: -7 0;
             rel2.offset: -7 -1;
-            align: 1.0 0.5;
+            align: 1.0 0.0;
          }
       }
       part { name: "rightclip"; type: RECT;
@@ -761,7 +868,7 @@ group { name: "elm/hover/base/hoversel_horizontal/default";
       part { name: "elm.swallow.slot.right"; type: SWALLOW;
          clip_to: "rightclip";
          description { state: "default" 0.0;
-            align: 1.0 0.5;
+            align: 1.0 0.0;
             rel1.to: "elm.swallow.slot.middle";
             rel1.relative: 1.0 0.0;
             rel1.offset: 0 0;
@@ -773,7 +880,7 @@ group { name: "elm/hover/base/hoversel_horizontal/default";
             inherit: "default" 0.0;
             rel1.offset: 6 0;
             rel2.offset: -6 -1;
-            align: 0.0 0.5;
+            align: 0.0 0.0;
          }
       }
       part { name: "elm.swallow.slot.middle"; type: SWALLOW;
diff --git a/src/lib/elc_hoversel.c b/src/lib/elc_hoversel.c
index ab7271a..20285c4 100644
--- a/src/lib/elc_hoversel.c
+++ b/src/lib/elc_hoversel.c
@@ -334,9 +334,20 @@ _resizing_eval(Evas_Object *obj, Elm_Hoversel_Data *sd)
 
         if (xx < 0) xx = x;
         if ((xx + ww) > (x + w))
-          ww = (x + w) - xx;
+          {
+             if ((obj_x + obj_w - x) > ((x + w) - obj_x))
+               {
+                  elm_layout_signal_emit(sd->hover, "elm,state,align,right", 
"elm");
+                  if ((obj_x + obj_w - ww) < x)
+                    ww = obj_x + obj_w - x;
+               }
+             else
+               {
+                  elm_layout_signal_emit(sd->hover, "elm,state,align,default", 
"elm");
+                  ww = (x + w) - xx;
+               }
+          }
      }
-
    evas_object_size_hint_min_set(sd->spacer, ww, hh);
 }
 
diff --git a/src/lib/elm_entry.c b/src/lib/elm_entry.c
index abec604..4246f90 100644
--- a/src/lib/elm_entry.c
+++ b/src/lib/elm_entry.c
@@ -1235,13 +1235,13 @@ _elm_entry_elm_widget_sub_object_del(Eo *obj, 
Elm_Entry_Data *_pd EINA_UNUSED, E
 static void
 _hoversel_position(Evas_Object *obj)
 {
-   Evas_Coord cx, cy, cw, ch, x, y, mw, mh;
+   Evas_Coord cx, cy, cw, ch, x, y, mw, mh, w, h;
 
    ELM_ENTRY_DATA_GET(obj, sd);
 
    cx = cy = 0;
    cw = ch = 1;
-   evas_object_geometry_get(sd->entry_edje, &x, &y, NULL, NULL);
+   evas_object_geometry_get(sd->entry_edje, &x, &y, &w, &h);
    if (sd->use_down)
      {
         cx = sd->downx - x;
@@ -1254,18 +1254,12 @@ _hoversel_position(Evas_Object *obj)
        (sd->entry_edje, "elm.text", &cx, &cy, &cw, &ch);
 
    evas_object_size_hint_min_get(sd->hoversel, &mw, &mh);
-   if (cw < mw)
-     {
-        cx += (cw - mw) / 2;
-        cw = mw;
-     }
-   if (ch < mh)
-     {
-        cy += (ch - mh) / 2;
-        ch = mh;
-     }
+   if (cx + mw > w)
+     cx = w - mw;
+   if (cy + mh > h)
+     cy = h - mh;
    evas_object_move(sd->hoversel, x + cx, y + cy);
-   evas_object_resize(sd->hoversel, cw, ch);
+   evas_object_resize(sd->hoversel, mw, mh);
 }
 
 static void

-- 


Reply via email to