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.
if (idx == 4)
{
//TODO 1: Find the largest space direction.
Evas_Coord length[2];
length[0] = pos.y - hover_area.y;
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)
if(!wd->horizontal)
{
case ELM_CTXPOPUP_DIRECTION_UP:
_adjust_pos_x(&pos, &base_size, &hover_area);
pos.y -= base_size.y;
arrow = ELM_CTXPOPUP_DIRECTION_DOWN;
if (pos.y < hover_area.y + arrow_size.y)
{
base_size.y -= ((hover_area.y + arrow_size.y) - pos.y);
pos.y = hover_area.y + arrow_size.y;
}
break;
case 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;
}
break;
case 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));
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;
length[0] = pos.y - hover_area.y;
length[1] = (hover_area.y + hover_area.h) - pos.y;
if (length[0] > length[1])
{
// ELM_CTXPOPUP_DIRECTION_UP
_adjust_pos_x(&pos, &base_size, &hover_area);
pos.y -= base_size.y;
arrow = ELM_CTXPOPUP_DIRECTION_DOWN;
if (pos.y < hover_area.y + arrow_size.y)
{
base_size.y -= ((hover_area.y + arrow_size.y) - pos.y);
pos.y = hover_area.y + arrow_size.y;
}
}
else
{
//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));
}
}
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.