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:
parent
19f45ab1c9
commit
4c4016ad02
|
@ -1581,18 +1581,51 @@ _gadget_util_ctxpopup_visibility(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Ev
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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();
|
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_API void
|
||||||
e_gadget_util_ctxpopup_place(Evas_Object *g, Evas_Object *ctx, Evas_Object *pos_obj)
|
e_gadget_util_ctxpopup_place(Evas_Object *g, Evas_Object *ctx, Evas_Object *pos_obj)
|
||||||
{
|
{
|
||||||
int x, y, w, h;
|
int x, y, w, h;
|
||||||
|
int zx, zy, zw, zh;
|
||||||
|
int pw = 1, ph = 1;
|
||||||
E_Layer layer;
|
E_Layer layer;
|
||||||
E_Gadget_Config *zgc;
|
E_Gadget_Config *zgc;
|
||||||
Evas_Object *content;
|
Evas_Object *content;
|
||||||
|
E_Zone *zone;
|
||||||
Elm_Ctxpopup_Direction first, second;
|
Elm_Ctxpopup_Direction first, second;
|
||||||
|
|
||||||
EINA_SAFETY_ON_NULL_RETURN(g);
|
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);
|
layer = MAX(evas_object_layer_get(pos_obj ?: g), E_LAYER_POPUP);
|
||||||
evas_object_layer_set(ctx, layer);
|
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);
|
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)
|
if (zgc->site->anchor & E_GADGET_SITE_ANCHOR_TOP)
|
||||||
y += h;
|
y += h;
|
||||||
if (zgc->site->anchor & E_GADGET_SITE_ANCHOR_LEFT)
|
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)
|
if (zgc->site->orient == E_GADGET_SITE_ORIENT_HORIZONTAL)
|
||||||
{
|
{
|
||||||
x += w / 2;
|
x += w / 2;
|
||||||
|
x = E_CLAMP(x, zx, zx + zw - MAX(pw, w));
|
||||||
first = ELM_CTXPOPUP_DIRECTION_UP, second = ELM_CTXPOPUP_DIRECTION_DOWN;
|
first = ELM_CTXPOPUP_DIRECTION_UP, second = ELM_CTXPOPUP_DIRECTION_DOWN;
|
||||||
if (zgc->site->anchor & E_GADGET_SITE_ANCHOR_TOP)
|
if (zgc->site->anchor & E_GADGET_SITE_ANCHOR_TOP)
|
||||||
first = ELM_CTXPOPUP_DIRECTION_DOWN, second = ELM_CTXPOPUP_DIRECTION_UP;
|
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)
|
else if (zgc->site->orient == E_GADGET_SITE_ORIENT_VERTICAL)
|
||||||
{
|
{
|
||||||
y += h / 2;
|
y += h / 2;
|
||||||
|
y = E_CLAMP(y, zy, zy + zh - MAX(ph, h));
|
||||||
first = ELM_CTXPOPUP_DIRECTION_LEFT, second = ELM_CTXPOPUP_DIRECTION_RIGHT;
|
first = ELM_CTXPOPUP_DIRECTION_LEFT, second = ELM_CTXPOPUP_DIRECTION_RIGHT;
|
||||||
if (zgc->site->anchor & E_GADGET_SITE_ANCHOR_LEFT)
|
if (zgc->site->anchor & E_GADGET_SITE_ANCHOR_LEFT)
|
||||||
first = ELM_CTXPOPUP_DIRECTION_RIGHT, second = ELM_CTXPOPUP_DIRECTION_LEFT;
|
first = ELM_CTXPOPUP_DIRECTION_RIGHT, second = ELM_CTXPOPUP_DIRECTION_LEFT;
|
||||||
}
|
}
|
||||||
else
|
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))
|
if (x < zx + (zw / 2))
|
||||||
{
|
{
|
||||||
second = ELM_CTXPOPUP_DIRECTION_RIGHT;
|
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);
|
evas_object_event_callback_add(ctx, EVAS_CALLBACK_HIDE, _gadget_util_ctxpopup_visibility, NULL);
|
||||||
if (content)
|
if (content)
|
||||||
{
|
{
|
||||||
evas_object_event_callback_add(content, EVAS_CALLBACK_MOVE, _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_moveresize, 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);
|
evas_object_smart_callback_call(zgc->site->layout, "gadget_site_popup", ctx);
|
||||||
if (evas_object_visible_get(ctx))
|
if (evas_object_visible_get(ctx))
|
||||||
|
|
Loading…
Reference in New Issue