elementary/ctxpopup - patched by kimcinoo@gmail.com

Dear All, Hi!

Previously, the ctxpopup have used only direction up or down if there is no
enough area to display.
So, there was some dead codes and TODO list for this..

By using wd->horizontal, we can decide between "up/down" and "left/right"
If elc_ctxpopup is horizontal, "up/down" is more proper than "left/right"
and vice versa.

Sincerely,
Shinwoo Kim.



SVN revision: 62420
This commit is contained in:
ChunEon Park 2011-08-13 05:40:16 +00:00
parent 49843b1dad
commit b88a8a186a
1 changed files with 56 additions and 51 deletions

View File

@ -388,61 +388,66 @@ _calc_base_geometry(Evas_Object *obj, Evas_Coord_Rectangle *rect)
//In this case, all directions are invalid because of lack of space. //In this case, all directions are invalid because of lack of space.
if (idx == 4) if (idx == 4)
{ {
//TODO 1: Find the largest space direction.
Evas_Coord length[2]; Evas_Coord length[2];
length[0] = pos.y - hover_area.y; if(!wd->horizontal)
length[1] = (hover_area.y + hover_area.h) - pos.y;
if (length[0] > length[1])
idx = ELM_CTXPOPUP_DIRECTION_UP;
else
idx = ELM_CTXPOPUP_DIRECTION_DOWN;
//TODO 2: determine x , y
switch (idx)
{ {
case ELM_CTXPOPUP_DIRECTION_UP: length[0] = pos.y - hover_area.y;
_adjust_pos_x(&pos, &base_size, &hover_area); length[1] = (hover_area.y + hover_area.h) - pos.y;
pos.y -= base_size.y;
arrow = ELM_CTXPOPUP_DIRECTION_DOWN; if (length[0] > length[1])
if (pos.y < hover_area.y + arrow_size.y) {
{ // ELM_CTXPOPUP_DIRECTION_UP
base_size.y -= ((hover_area.y + arrow_size.y) - pos.y); _adjust_pos_x(&pos, &base_size, &hover_area);
pos.y = hover_area.y + arrow_size.y; pos.y -= base_size.y;
} arrow = ELM_CTXPOPUP_DIRECTION_DOWN;
break; if (pos.y < hover_area.y + arrow_size.y)
case ELM_CTXPOPUP_DIRECTION_LEFT: {
_adjust_pos_y(&pos, &base_size, &hover_area); base_size.y -= ((hover_area.y + arrow_size.y) - pos.y);
pos.x -= base_size.x; pos.y = hover_area.y + arrow_size.y;
arrow = ELM_CTXPOPUP_DIRECTION_RIGHT; }
if (pos.x < hover_area.x + arrow_size.x) }
{ else
base_size.x -= ((hover_area.x + arrow_size.x) - pos.x); {
pos.x = hover_area.x + arrow_size.x; //ELM_CTXPOPUP_DIRECTION_DOWN
} _adjust_pos_x(&pos, &base_size, &hover_area);
break; arrow = ELM_CTXPOPUP_DIRECTION_UP;
case ELM_CTXPOPUP_DIRECTION_RIGHT: if (pos.y + arrow_size.y + base_size.y >
_adjust_pos_y(&pos, &base_size, &hover_area); hover_area.y + hover_area.h)
arrow = ELM_CTXPOPUP_DIRECTION_LEFT; base_size.y -=
if (pos.x + arrow_size.x + base_size.x > ((pos.y + arrow_size.y + base_size.y) -
hover_area.x + hover_area.w) (hover_area.y + hover_area.h));
base_size.x -= }
((pos.x + arrow_size.x + base_size.x) -
(hover_area.x + hover_area.w));
break;
case ELM_CTXPOPUP_DIRECTION_DOWN:
_adjust_pos_x(&pos, &base_size, &hover_area);
arrow = ELM_CTXPOPUP_DIRECTION_UP;
if (pos.y + arrow_size.y + base_size.y >
hover_area.y + hover_area.h)
base_size.y -=
((pos.y + arrow_size.y + base_size.y) -
(hover_area.y + hover_area.h));
break;
default:
break;
} }
else
{
length[0] = pos.x - hover_area.x;
length[1] = (hover_area.x + hover_area.w) - pos.x;
if (length[0] > length[1])
{
//ELM_CTXPOPUP_DIRECTION_LEFT
_adjust_pos_y(&pos, &base_size, &hover_area);
pos.x -= base_size.x;
arrow = ELM_CTXPOPUP_DIRECTION_RIGHT;
if (pos.x < hover_area.x + arrow_size.x)
{
base_size.x -= ((hover_area.x + arrow_size.x) - pos.x);
pos.x = hover_area.x + arrow_size.x;
}
}
else
{
//ELM_CTXPOPUP_DIRECTION_RIGHT
_adjust_pos_y(&pos, &base_size, &hover_area);
arrow = ELM_CTXPOPUP_DIRECTION_LEFT;
if (pos.x + arrow_size.x + base_size.x >
hover_area.x + hover_area.w)
base_size.x -=
((pos.x + arrow_size.x + base_size.x) -
(hover_area.x + hover_area.w));
}
}
} }
//Final position and size. //Final position and size.