track gadget ctxpopups and reposition within zone on resize

this attempts to shift the ctxpopup content vertically and horizontally to
keep it on the same screen that the gadget is on

fix T5945
This commit is contained in:
Mike Blumenkrantz 2017-09-01 13:40:12 -04:00
parent 19f45ab1c9
commit 4c4016ad02
1 changed files with 42 additions and 5 deletions

View File

@ -1581,18 +1581,51 @@ _gadget_util_ctxpopup_visibility(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Ev
}
static void
_gadget_util_ctxpopup_moveresize(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
_gadget_util_ctxpopup_move(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
e_comp_shape_queue();
}
static void
_gadget_util_ctxpopup_resize(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
{
int x, y, w, h;
int zx, zy, zw, zh;
evas_object_geometry_get(obj, &x, &y, &w, &h);
e_zone_useful_geometry_get(e_comp_object_util_zone_get(obj), &zx, &zy, &zw, &zh);
if (!E_CONTAINS(zx, zy, zw, zh, x, y, w, h))
{
evas_object_hide(obj);
if (!E_CONTAINS(zx, zy, zw, zh, x, y, 1, h))
{
if (!E_CONTAINS(zx, zy, zw, zh, x, y, 1, 1))
evas_object_move(data, x, zy + (h / 2) + 10);
else
evas_object_move(data, x, zy + zh - (h / 2) - 10);
}
else
{
if (!E_CONTAINS(zx, zy, zw, zh, x, y, 1, 1))
evas_object_move(data, zx + (w / 2) + 10, y);
else
evas_object_move(data, zx + zw - (w / 2) - 10, y);
}
evas_object_show(obj);
}
e_comp_shape_queue();
}
E_API void
e_gadget_util_ctxpopup_place(Evas_Object *g, Evas_Object *ctx, Evas_Object *pos_obj)
{
int x, y, w, h;
int zx, zy, zw, zh;
int pw = 1, ph = 1;
E_Layer layer;
E_Gadget_Config *zgc;
Evas_Object *content;
E_Zone *zone;
Elm_Ctxpopup_Direction first, second;
EINA_SAFETY_ON_NULL_RETURN(g);
@ -1604,7 +1637,11 @@ e_gadget_util_ctxpopup_place(Evas_Object *g, Evas_Object *ctx, Evas_Object *pos_
layer = MAX(evas_object_layer_get(pos_obj ?: g), E_LAYER_POPUP);
evas_object_layer_set(ctx, layer);
if (content) evas_object_geometry_get(content, NULL, NULL, &pw, &ph);
evas_object_geometry_get(pos_obj ?: g, &x, &y, &w, &h);
zone = e_comp_object_util_zone_get(pos_obj ?: g);
e_zone_useful_geometry_get(zone, &zx, &zy, &zw, &zh);
if (zgc->site->anchor & E_GADGET_SITE_ANCHOR_TOP)
y += h;
if (zgc->site->anchor & E_GADGET_SITE_ANCHOR_LEFT)
@ -1612,6 +1649,7 @@ e_gadget_util_ctxpopup_place(Evas_Object *g, Evas_Object *ctx, Evas_Object *pos_
if (zgc->site->orient == E_GADGET_SITE_ORIENT_HORIZONTAL)
{
x += w / 2;
x = E_CLAMP(x, zx, zx + zw - MAX(pw, w));
first = ELM_CTXPOPUP_DIRECTION_UP, second = ELM_CTXPOPUP_DIRECTION_DOWN;
if (zgc->site->anchor & E_GADGET_SITE_ANCHOR_TOP)
first = ELM_CTXPOPUP_DIRECTION_DOWN, second = ELM_CTXPOPUP_DIRECTION_UP;
@ -1619,14 +1657,13 @@ e_gadget_util_ctxpopup_place(Evas_Object *g, Evas_Object *ctx, Evas_Object *pos_
else if (zgc->site->orient == E_GADGET_SITE_ORIENT_VERTICAL)
{
y += h / 2;
y = E_CLAMP(y, zy, zy + zh - MAX(ph, h));
first = ELM_CTXPOPUP_DIRECTION_LEFT, second = ELM_CTXPOPUP_DIRECTION_RIGHT;
if (zgc->site->anchor & E_GADGET_SITE_ANCHOR_LEFT)
first = ELM_CTXPOPUP_DIRECTION_RIGHT, second = ELM_CTXPOPUP_DIRECTION_LEFT;
}
else
{
int zx, zy, zw, zh;
e_zone_useful_geometry_get(e_comp_object_util_zone_get(pos_obj ?: g), &zx, &zy, &zw, &zh);
if (x < zx + (zw / 2))
{
second = ELM_CTXPOPUP_DIRECTION_RIGHT;
@ -1648,8 +1685,8 @@ e_gadget_util_ctxpopup_place(Evas_Object *g, Evas_Object *ctx, Evas_Object *pos_
evas_object_event_callback_add(ctx, EVAS_CALLBACK_HIDE, _gadget_util_ctxpopup_visibility, NULL);
if (content)
{
evas_object_event_callback_add(content, EVAS_CALLBACK_MOVE, _gadget_util_ctxpopup_moveresize, NULL);
evas_object_event_callback_add(content, EVAS_CALLBACK_RESIZE, _gadget_util_ctxpopup_moveresize, NULL);
evas_object_event_callback_add(content, EVAS_CALLBACK_MOVE, _gadget_util_ctxpopup_move, NULL);
evas_object_event_callback_add(content, EVAS_CALLBACK_RESIZE, _gadget_util_ctxpopup_resize, ctx);
}
evas_object_smart_callback_call(zgc->site->layout, "gadget_site_popup", ctx);
if (evas_object_visible_get(ctx))