* edje: Make Edje_Real_Part_Drag a pointer. Win 100 bytes per states.

SVN revision: 41685
This commit is contained in:
Cedric BAIL 2009-08-11 12:47:00 +00:00
parent 9807d2e4c8
commit d16bbd3953
7 changed files with 294 additions and 236 deletions

View File

@ -196,9 +196,9 @@ _edje_recalc_do(Edje *ed)
int int
_edje_part_dragable_calc(Edje *ed, Edje_Real_Part *ep, double *x, double *y) _edje_part_dragable_calc(Edje *ed, Edje_Real_Part *ep, double *x, double *y)
{ {
if ((ep->part->dragable.x != 0) || (ep->part->dragable.y != 0)) if (ep->drag)
{ {
if (ep->drag.confine_to) if (ep->drag->confine_to)
{ {
double dx, dy, dw, dh; double dx, dy, dw, dh;
int ret = 0; int ret = 0;
@ -208,13 +208,13 @@ _edje_part_dragable_calc(Edje *ed, Edje_Real_Part *ep, double *x, double *y)
else if (ep->part->dragable.x != 0) ret = 1; else if (ep->part->dragable.x != 0) ret = 1;
else if (ep->part->dragable.y != 0) ret = 2; else if (ep->part->dragable.y != 0) ret = 2;
dx = ep->x - ep->drag.confine_to->x; dx = ep->x - ep->drag->confine_to->x;
dw = ep->drag.confine_to->w - ep->w; dw = ep->drag->confine_to->w - ep->w;
if (dw != 0.0) dx /= dw; if (dw != 0.0) dx /= dw;
else dx = 0.0; else dx = 0.0;
dy = ep->y - ep->drag.confine_to->y; dy = ep->y - ep->drag->confine_to->y;
dh = ep->drag.confine_to->h - ep->h; dh = ep->drag->confine_to->h - ep->h;
if (dh != 0) dy /= dh; if (dh != 0) dy /= dh;
else dy = 0.0; else dy = 0.0;
@ -225,8 +225,8 @@ _edje_part_dragable_calc(Edje *ed, Edje_Real_Part *ep, double *x, double *y)
} }
else else
{ {
if (x) *x = (double)(ep->drag.tmp.x + ep->drag.x); if (x) *x = (double)(ep->drag->tmp.x + ep->drag->x);
if (y) *y = (double)(ep->drag.tmp.y + ep->drag.y); if (y) *y = (double)(ep->drag->tmp.y + ep->drag->y);
return 0; return 0;
} }
} }
@ -240,26 +240,26 @@ void
_edje_dragable_pos_set(Edje *ed, Edje_Real_Part *ep, double x, double y) _edje_dragable_pos_set(Edje *ed, Edje_Real_Part *ep, double x, double y)
{ {
/* check whether this part is dragable at all */ /* check whether this part is dragable at all */
if (!ep->part->dragable.x && !ep->part->dragable.y) return; if (!ep->drag) return ;
/* instead of checking for equality, we really should check that /* instead of checking for equality, we really should check that
* the difference is greater than foo, but I have no idea what * the difference is greater than foo, but I have no idea what
* value we would set foo to, because it would depend on the * value we would set foo to, because it would depend on the
* size of the dragable... * size of the dragable...
*/ */
if (ep->drag.x != x || ep->drag.tmp.x) if (ep->drag->x != x || ep->drag->tmp.x)
{ {
ep->drag.x = x; ep->drag->x = x;
ep->drag.tmp.x = 0; ep->drag->tmp.x = 0;
ep->drag.need_reset = 0; ep->drag->need_reset = 0;
ed->dirty = 1; ed->dirty = 1;
} }
if (ep->drag.y != y || ep->drag.tmp.y) if (ep->drag->y != y || ep->drag->tmp.y)
{ {
ep->drag.y = y; ep->drag->y = y;
ep->drag.tmp.y = 0; ep->drag->tmp.y = 0;
ep->drag.need_reset = 0; ep->drag->need_reset = 0;
ed->dirty = 1; ed->dirty = 1;
} }
@ -950,106 +950,110 @@ _edje_part_recalc_single(Edje *ed,
} }
} }
} }
/* confine */
if (confine_to) if (ep->drag)
{ {
int offset; /* confine */
int step; if (confine_to)
double v;
/* complex dragable params */
if (flags & FLAG_X)
{ {
v = ep->drag.size.x * confine_to->w; int offset;
int step;
double v;
if ((minw > 0) && (v < minw)) params->w = minw; /* complex dragable params */
else if ((maxw >= 0) && (v > maxw)) params->w = maxw; if (flags & FLAG_X)
else params->w = v; {
v = ep->drag->size.x * confine_to->w;
offset = (ep->drag.x * (confine_to->w - params->w)) + if ((minw > 0) && (v < minw)) params->w = minw;
ep->drag.tmp.x; else if ((maxw >= 0) && (v > maxw)) params->w = maxw;
if (ep->part->dragable.step_x > 0) else params->w = v;
{
params->x = confine_to->x +
((offset / ep->part->dragable.step_x) * ep->part->dragable.step_x);
}
else if (ep->part->dragable.count_x > 0)
{
step = (confine_to->w - params->w) / ep->part->dragable.count_x;
if (step < 1) step = 1;
params->x = confine_to->x +
((offset / step) * step);
}
params->req_drag.x = params->x;
params->req_drag.w = params->w;
}
if (flags & FLAG_Y)
{
v = ep->drag.size.y * confine_to->h;
if ((minh > 0) && (v < minh)) params->h = minh; offset = (ep->drag->x * (confine_to->w - params->w)) +
else if ((maxh >= 0) && (v > maxh)) params->h = maxh; ep->drag->tmp.x;
else params->h = v; if (ep->part->dragable.step_x > 0)
{
params->x = confine_to->x +
((offset / ep->part->dragable.step_x) * ep->part->dragable.step_x);
}
else if (ep->part->dragable.count_x > 0)
{
step = (confine_to->w - params->w) / ep->part->dragable.count_x;
if (step < 1) step = 1;
params->x = confine_to->x +
((offset / step) * step);
}
params->req_drag.x = params->x;
params->req_drag.w = params->w;
}
if (flags & FLAG_Y)
{
v = ep->drag->size.y * confine_to->h;
offset = (ep->drag.y * (confine_to->h - params->h)) + if ((minh > 0) && (v < minh)) params->h = minh;
ep->drag.tmp.y; else if ((maxh >= 0) && (v > maxh)) params->h = maxh;
if (ep->part->dragable.step_y > 0) else params->h = v;
{
params->y = confine_to->y + offset = (ep->drag->y * (confine_to->h - params->h)) +
((offset / ep->part->dragable.step_y) * ep->part->dragable.step_y); ep->drag->tmp.y;
if (ep->part->dragable.step_y > 0)
{
params->y = confine_to->y +
((offset / ep->part->dragable.step_y) * ep->part->dragable.step_y);
}
else if (ep->part->dragable.count_y > 0)
{
step = (confine_to->h - params->h) / ep->part->dragable.count_y;
if (step < 1) step = 1;
params->y = confine_to->y +
((offset / step) * step);
}
params->req_drag.y = params->y;
params->req_drag.h = params->h;
} }
else if (ep->part->dragable.count_y > 0) /* limit to confine */
if (flags & FLAG_X)
{ {
step = (confine_to->h - params->h) / ep->part->dragable.count_y; if (params->x < confine_to->x)
if (step < 1) step = 1; {
params->y = confine_to->y + params->x = confine_to->x;
((offset / step) * step); }
if ((params->x + params->w) > (confine_to->x + confine_to->w))
{
params->x = confine_to->x + (confine_to->w - params->w);
}
} }
params->req_drag.y = params->y; if (flags & FLAG_Y)
params->req_drag.h = params->h;
}
/* limit to confine */
if (flags & FLAG_X)
{
if (params->x < confine_to->x)
{ {
params->x = confine_to->x; if (params->y < confine_to->y)
} {
if ((params->x + params->w) > (confine_to->x + confine_to->w)) params->y = confine_to->y;
{ }
params->x = confine_to->x + (confine_to->w - params->w); if ((params->y + params->h) > (confine_to->y + confine_to->h))
{
params->y = confine_to->y + (confine_to->h - params->h);
}
} }
} }
if (flags & FLAG_Y) else
{ {
if (params->y < confine_to->y) /* simple dragable params */
if (flags & FLAG_X)
{ {
params->y = confine_to->y; params->x += ep->drag->x + ep->drag->tmp.x;
params->req_drag.x = params->x;
params->req_drag.w = params->w;
} }
if ((params->y + params->h) > (confine_to->y + confine_to->h)) if (flags & FLAG_Y)
{ {
params->y = confine_to->y + (confine_to->h - params->h); params->y += ep->drag->y + ep->drag->tmp.y;
params->req_drag.y = params->y;
params->req_drag.h = params->h;
} }
} }
} }
else
{
/* simple dragable params */
if (flags & FLAG_X)
{
params->x += ep->drag.x + ep->drag.tmp.x;
params->req_drag.x = params->x;
params->req_drag.w = params->w;
}
if (flags & FLAG_Y)
{
params->y += ep->drag.y + ep->drag.tmp.y;
params->req_drag.y = params->y;
params->req_drag.h = params->h;
}
}
/* fill */ /* fill */
if (ep->part->type == EDJE_PART_TYPE_GRADIENT && desc->gradient.use_rel && (!desc->gradient.type || !strcmp(desc->gradient.type, "linear"))) if (ep->part->type == EDJE_PART_TYPE_GRADIENT && desc->gradient.use_rel && (!desc->gradient.type || !strcmp(desc->gradient.type, "linear")))
{ {
int x2, y2; int x2, y2;
@ -1404,6 +1408,7 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
#endif #endif
Edje_Calc_Params *p1, *pf; Edje_Calc_Params *p1, *pf;
Edje_Part_Description *chosen_desc; Edje_Part_Description *chosen_desc;
Edje_Real_Part *confine_to = NULL;
double pos = 0.0; double pos = 0.0;
if ((ep->calculated & FLAG_XY) == FLAG_XY) if ((ep->calculated & FLAG_XY) == FLAG_XY)
@ -1509,11 +1514,12 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
#endif #endif
} }
} }
if (ep->drag.confine_to) if (ep->drag && ep->drag->confine_to)
{ {
_edje_part_recalc(ed, ep->drag.confine_to, flags); confine_to = ep->drag->confine_to;
_edje_part_recalc(ed, confine_to, flags);
#ifdef EDJE_CALC_CACHE #ifdef EDJE_CALC_CACHE
statec = ep->drag.confine_to->state; statec = confine_to->state;
#endif #endif
} }
// if (ep->text.source) _edje_part_recalc(ed, ep->text.source, flags); // if (ep->text.source) _edje_part_recalc(ed, ep->text.source, flags);
@ -1546,7 +1552,7 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
{ {
_edje_part_recalc_single(ed, ep, ep->param1.description, chosen_desc, _edje_part_recalc_single(ed, ep, ep->param1.description, chosen_desc,
ep->param1.rel1_to_x, ep->param1.rel1_to_y, ep->param1.rel2_to_x, ep->param1.rel2_to_y, ep->param1.rel1_to_x, ep->param1.rel1_to_y, ep->param1.rel2_to_x, ep->param1.rel2_to_y,
ep->drag.confine_to, confine_to,
p1, p1,
flags); flags);
#ifdef EDJE_CALC_CACHE #ifdef EDJE_CALC_CACHE
@ -1576,7 +1582,7 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
{ {
_edje_part_recalc_single(ed, ep, ep->param2.description, chosen_desc, _edje_part_recalc_single(ed, ep, ep->param2.description, chosen_desc,
ep->param2.rel1_to_x, ep->param2.rel1_to_y, ep->param2.rel2_to_x, ep->param2.rel2_to_y, ep->param2.rel1_to_x, ep->param2.rel1_to_y, ep->param2.rel2_to_x, ep->param2.rel2_to_y,
ep->drag.confine_to, confine_to,
p2, p2,
flags); flags);
#ifdef EDJE_CALC_CACHE #ifdef EDJE_CALC_CACHE
@ -1685,18 +1691,18 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
#endif #endif
ep->req = pf->req; ep->req = pf->req;
if (ep->drag.need_reset) if (ep->drag && ep->drag->need_reset)
{ {
double dx, dy; double dx, dy;
dx = 0; dx = 0;
dy = 0; dy = 0;
_edje_part_dragable_calc(ed, ep, &dx, &dy); _edje_part_dragable_calc(ed, ep, &dx, &dy);
ep->drag.x = dx; ep->drag->x = dx;
ep->drag.y = dy; ep->drag->y = dy;
ep->drag.tmp.x = 0; ep->drag->tmp.x = 0;
ep->drag.tmp.y = 0; ep->drag->tmp.y = 0;
ep->drag.need_reset = 0; ep->drag->need_reset = 0;
} }
if (!ed->calc_only) if (!ed->calc_only)
{ {

View File

@ -89,25 +89,25 @@ _edje_mouse_down_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
_edje_emit(ed, buf, rp->part->name); _edje_emit(ed, buf, rp->part->name);
} }
if (rp->drag.events_to) if (rp->drag && rp->drag->events_to)
{ {
int x = 0, y = 0; int x = 0, y = 0;
Edje_Real_Part *events; Edje_Real_Part *events;
events = rp->drag.events_to; events = rp->drag->events_to;
evas_object_geometry_get(rp->object, &x, &y, NULL, NULL); evas_object_geometry_get(rp->object, &x, &y, NULL, NULL);
if ((events->part->dragable.x) || (events->part->dragable.y)) if ((events->part->dragable.x) || (events->part->dragable.y))
{ {
if (events->part->dragable.x) if (events->part->dragable.x)
{ {
events->drag.down.x = ev->canvas.x; events->drag->down.x = ev->canvas.x;
events->drag.tmp.x = 0; events->drag->tmp.x = 0;
} }
if (events->part->dragable.y) if (events->part->dragable.y)
{ {
events->drag.down.y = ev->canvas.y; events->drag->down.y = ev->canvas.y;
events->drag.tmp.y = 0; events->drag->tmp.y = 0;
} }
if (!ignored) if (!ignored)
@ -134,17 +134,17 @@ _edje_mouse_down_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
dir = _edje_part_dragable_calc(ed, rp, &dx, &dy); dir = _edje_part_dragable_calc(ed, rp, &dx, &dy);
if ((dx != rp->drag.val.x) || (dy != rp->drag.val.y)) if ((dx != rp->drag->val.x) || (dy != rp->drag->val.y))
{ {
rp->drag.val.x = dx; rp->drag->val.x = dx;
rp->drag.val.y = dy; rp->drag->val.y = dy;
if (!ignored) if (!ignored)
_edje_emit(ed, "drag", rp->part->name); _edje_emit(ed, "drag", rp->part->name);
ed->dirty = 1; ed->dirty = 1;
#ifdef EDJE_CALC_CACHE #ifdef EDJE_CALC_CACHE
rp->invalidate = 1; rp->invalidate = 1;
#endif #endif
rp->drag.need_reset = 1; rp->drag->need_reset = 1;
_edje_recalc_do(ed); _edje_recalc_do(ed);
} }
} }
@ -152,16 +152,16 @@ _edje_mouse_down_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
if ((rp->part->dragable.x) || (rp->part->dragable.y)) if ((rp->part->dragable.x) || (rp->part->dragable.y))
{ {
if (rp->drag.down.count == 0) if (rp->drag->down.count == 0)
{ {
if (rp->part->dragable.x) if (rp->part->dragable.x)
rp->drag.down.x = ev->canvas.x; rp->drag->down.x = ev->canvas.x;
if (rp->part->dragable.y) if (rp->part->dragable.y)
rp->drag.down.y = ev->canvas.y; rp->drag->down.y = ev->canvas.y;
if (!ignored) if (!ignored)
_edje_emit(ed, "drag,start", rp->part->name); _edje_emit(ed, "drag,start", rp->part->name);
} }
rp->drag.down.count++; rp->drag->down.count++;
} }
if (rp->clicked_button == 0) if (rp->clicked_button == 0)
{ {
@ -200,24 +200,24 @@ _edje_mouse_up_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
_edje_emit(ed, buf, rp->part->name); _edje_emit(ed, buf, rp->part->name);
} }
if (rp->drag.events_to) if (rp->drag)
{ {
rp = rp->drag.events_to; if (rp->drag->events_to)
if (!ignored)
{ {
snprintf(buf, sizeof(buf), "mouse,up,%i", ev->button); rp = rp->drag->events_to;
_edje_emit(ed, buf, rp->part->name); if (!ignored)
}
}
if ((rp->part->dragable.x) || (rp->part->dragable.y))
{
if (rp->drag.down.count > 0)
{
rp->drag.down.count--;
if (rp->drag.down.count == 0)
{ {
rp->drag.need_reset = 1; snprintf(buf, sizeof(buf), "mouse,up,%i", ev->button);
_edje_emit(ed, buf, rp->part->name);
}
}
if (rp->drag->down.count > 0)
{
rp->drag->down.count--;
if (rp->drag->down.count == 0)
{
rp->drag->need_reset = 1;
ed->dirty = 1; ed->dirty = 1;
#ifdef EDJE_CALC_CACHE #ifdef EDJE_CALC_CACHE
rp->invalidate = 1; rp->invalidate = 1;
@ -227,6 +227,7 @@ _edje_mouse_up_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
} }
} }
} }
if ((rp->still_in) && (rp->clicked_button == ev->button) && (!ignored)) if ((rp->still_in) && (rp->clicked_button == ev->button) && (!ignored))
{ {
snprintf(buf, sizeof(buf), "mouse,clicked,%i", ev->button); snprintf(buf, sizeof(buf), "mouse,clicked,%i", ev->button);
@ -254,7 +255,7 @@ _edje_mouse_move_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
ed = data; ed = data;
rp = evas_object_data_get(obj, "real_part"); rp = evas_object_data_get(obj, "real_part");
if (!rp) return; if (!rp) return;
if (rp->drag.events_to) rp = rp->drag.events_to; if (rp->drag && rp->drag->events_to) rp = rp->drag->events_to;
ignored = rp->part->ignore_flags & ev->event_flags; ignored = rp->part->ignore_flags & ev->event_flags;
@ -281,33 +282,31 @@ _edje_mouse_move_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
rp->still_in = 1; rp->still_in = 1;
} }
_edje_freeze(ed); _edje_freeze(ed);
if ((rp->part->dragable.x) || (rp->part->dragable.y)) if (rp->drag)
{ {
if (rp->drag.down.count > 0) if (rp->drag->down.count > 0)
{ {
if (rp->part->dragable.x) if (rp->part->dragable.x)
rp->drag.tmp.x = ev->cur.canvas.x - rp->drag.down.x; rp->drag->tmp.x = ev->cur.canvas.x - rp->drag->down.x;
if (rp->part->dragable.y) if (rp->part->dragable.y)
rp->drag.tmp.y = ev->cur.canvas.y - rp->drag.down.y; rp->drag->tmp.y = ev->cur.canvas.y - rp->drag->down.y;
ed->dirty = 1; ed->dirty = 1;
#ifdef EDJE_CALC_CACHE #ifdef EDJE_CALC_CACHE
rp->invalidate = 1; rp->invalidate = 1;
#endif #endif
} }
_edje_recalc_do(ed); _edje_recalc_do(ed);
}
if ((rp->part->dragable.x) || (rp->part->dragable.y)) if (rp->drag->down.count > 0)
{
if (rp->drag.down.count > 0)
{ {
double dx, dy; double dx, dy;
int dir; int dir;
dir = _edje_part_dragable_calc(ed, rp, &dx, &dy); dir = _edje_part_dragable_calc(ed, rp, &dx, &dy);
if ((dx != rp->drag.val.x) || (dy != rp->drag.val.y)) if ((dx != rp->drag->val.x) || (dy != rp->drag->val.y))
{ {
rp->drag.val.x = dx; rp->drag->val.x = dx;
rp->drag.val.y = dy; rp->drag->val.y = dy;
if (!ignored) if (!ignored)
_edje_emit(ed, "drag", rp->part->name); _edje_emit(ed, "drag", rp->part->name);
ed->dirty = 1; ed->dirty = 1;

View File

@ -1549,8 +1549,6 @@ edje_edit_part_add(Evas_Object *obj, const char* name, unsigned char type)
} }
evas_object_clip_set(rp->object, ed->clipper); evas_object_clip_set(rp->object, ed->clipper);
} }
rp->drag.step.x = ep->dragable.step_x;
rp->drag.step.y = ep->dragable.step_y;
rp->gradient_id = -1; rp->gradient_id = -1;
@ -1937,6 +1935,21 @@ edje_edit_part_drag_x_set(Evas_Object *obj, const char *part, int drag)
GET_RP_OR_RETURN(); GET_RP_OR_RETURN();
printf("Set dragX for part: %s\n", part); printf("Set dragX for part: %s\n", part);
rp->part->dragable.x = drag; rp->part->dragable.x = drag;
if (!drag && !rp->part->dragable.y)
{
free(rp->drag);
rp->drag = NULL;
return ;
}
if (rp->drag) return;
rp->drag = mem_alloc(sizeof (Edje_Real_Part_Drag));
if (!rp->drag) return;
rp->drag->step.x = rp->part->dragable.step_x;
rp->drag->step.y = rp->part->dragable.step_y;
} }
EAPI int EAPI int
@ -1953,6 +1966,21 @@ edje_edit_part_drag_y_set(Evas_Object *obj, const char *part, int drag)
GET_RP_OR_RETURN(); GET_RP_OR_RETURN();
printf("Set dragY for part: %s\n", part); printf("Set dragY for part: %s\n", part);
rp->part->dragable.y = drag; rp->part->dragable.y = drag;
if (!drag && !rp->part->dragable.x)
{
free(rp->drag);
rp->drag = NULL;
return ;
}
if (rp->drag) return;
rp->drag = mem_alloc(sizeof (Edje_Real_Part_Drag));
if (!rp->drag) return;
rp->drag->step.x = rp->part->dragable.step_x;
rp->drag->step.y = rp->part->dragable.step_y;
} }
EAPI int EAPI int

View File

@ -352,6 +352,21 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
ed->load_error = EDJE_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED; ed->load_error = EDJE_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
return 0; return 0;
} }
if ((ep->dragable.x != 0) || (ep->dragable.y != 0))
{
rp->drag = calloc(1, sizeof (Edje_Real_Part_Drag));
if (!rp->drag)
{
ed->load_error = EDJE_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
free(rp);
return 0;
}
rp->drag->step.x = ep->dragable.step_x;
rp->drag->step.y = ep->dragable.step_y;
}
rp->edje = ed; rp->edje = ed;
_edje_ref(rp->edje); _edje_ref(rp->edje);
rp->part = ep; rp->part = ep;
@ -424,8 +439,6 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
if (rp->part->clip_to_id < 0) if (rp->part->clip_to_id < 0)
evas_object_clip_set(rp->object, ed->clipper); evas_object_clip_set(rp->object, ed->clipper);
} }
rp->drag.step.x = ep->dragable.step_x;
rp->drag.step.y = ep->dragable.step_y;
rp->gradient_id = -1; rp->gradient_id = -1;
} }
if (n > 0) if (n > 0)
@ -462,20 +475,23 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
evas_object_clip_set(rp->object, rp->clip_to->object); evas_object_clip_set(rp->object, rp->clip_to->object);
} }
} }
if (rp->part->dragable.confine_id >= 0) if (rp->drag)
rp->drag.confine_to = ed->table_parts[rp->part->dragable.confine_id % ed->table_parts_size];
/* replay events for dragable */
if (rp->part->dragable.events_id >= 0)
{ {
rp->drag.events_to = if (rp->part->dragable.confine_id >= 0)
ed->table_parts[rp->part->dragable.events_id % ed->table_parts_size]; rp->drag->confine_to = ed->table_parts[rp->part->dragable.confine_id % ed->table_parts_size];
/* events_to may be used only with dragable */
if (!rp->drag.events_to->part->dragable.x && /* replay events for dragable */
!rp->drag.events_to->part->dragable.y) if (rp->part->dragable.events_id >= 0)
rp->drag.events_to = NULL; {
rp->drag->events_to =
ed->table_parts[rp->part->dragable.events_id % ed->table_parts_size];
/* events_to may be used only with dragable */
if (!rp->drag->events_to->part->dragable.x &&
!rp->drag->events_to->part->dragable.y)
rp->drag->events_to = NULL;
}
} }
rp->swallow_params.min.w = 0; rp->swallow_params.min.w = 0;
rp->swallow_params.min.w = 0; rp->swallow_params.min.w = 0;
rp->swallow_params.max.w = -1; rp->swallow_params.max.w = -1;
@ -527,9 +543,12 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
rp = ed->table_parts[i]; rp = ed->table_parts[i];
evas_object_show(rp->object); evas_object_show(rp->object);
if (_edje_block_break(ed)) break; if (_edje_block_break(ed)) break;
if (rp->part->dragable.x < 0) rp->drag.val.x = 1.0; if (rp->drag)
if (rp->part->dragable.y < 0) rp->drag.val.x = 1.0; {
_edje_dragable_pos_set(ed, rp, rp->drag.val.x, rp->drag.val.y); if (rp->part->dragable.x < 0) rp->drag->val.x = 1.0;
if (rp->part->dragable.y < 0) rp->drag->val.x = 1.0;
_edje_dragable_pos_set(ed, rp, rp->drag->val.x, rp->drag->val.y);
}
} }
ed->dirty = 1; ed->dirty = 1;
#ifdef EDJE_CALC_CACHE #ifdef EDJE_CALC_CACHE

View File

@ -808,7 +808,7 @@ struct _Edje_Real_Part
Edje_Aspect aspect; // 12 Edje_Aspect aspect; // 12
} swallow_params; // 28 // FIXME: only if type SWALLOW } swallow_params; // 28 // FIXME: only if type SWALLOW
Edje_Real_Part_Drag drag; // 104 // FIME: make drag pointer to struct optional Edje_Real_Part_Drag *drag; // 4
struct { struct {
Edje_Real_Part *source; // 4 Edje_Real_Part *source; // 4
@ -856,8 +856,8 @@ struct _Edje_Real_Part
#ifdef EDJE_CALC_CACHE #ifdef EDJE_CALC_CACHE
unsigned char invalidate : 1; unsigned char invalidate : 1;
#endif #endif
}; // 394 }; // 294
// WITH EDJE_CALC_CACHE: 874 // WITH EDJE_CALC_CACHE: 774
struct _Edje_Running_Program struct _Edje_Running_Program
{ {

View File

@ -671,15 +671,15 @@ _edje_program_run(Edje *ed, Edje_Program *pr, int force, const char *ssig, const
if (pt->id >= 0) if (pt->id >= 0)
{ {
rp = ed->table_parts[pt->id % ed->table_parts_size]; rp = ed->table_parts[pt->id % ed->table_parts_size];
if ((rp) && (rp->drag.down.count == 0)) if ((rp) && (rp->drag) && (rp->drag->down.count == 0))
{ {
rp->drag.val.x = pr->value; rp->drag->val.x = pr->value;
rp->drag.val.y = pr->value2; rp->drag->val.y = pr->value2;
if (rp->drag.val.x < 0.0) rp->drag.val.x = 0.0; if (rp->drag->val.x < 0.0) rp->drag->val.x = 0.0;
else if (rp->drag.val.x > 1.0) rp->drag.val.x = 1.0; else if (rp->drag->val.x > 1.0) rp->drag->val.x = 1.0;
if (rp->drag.val.y < 0.0) rp->drag.val.y = 0.0; if (rp->drag->val.y < 0.0) rp->drag->val.y = 0.0;
else if (rp->drag.val.y > 1.0) rp->drag.val.y = 1.0; else if (rp->drag->val.y > 1.0) rp->drag->val.y = 1.0;
_edje_dragable_pos_set(ed, rp, rp->drag.val.x, rp->drag.val.y); _edje_dragable_pos_set(ed, rp, rp->drag->val.x, rp->drag->val.y);
_edje_emit(ed, "drag,set", rp->part->name); _edje_emit(ed, "drag,set", rp->part->name);
if (_edje_block_break(ed)) goto break_prog; if (_edje_block_break(ed)) goto break_prog;
} }
@ -697,15 +697,15 @@ _edje_program_run(Edje *ed, Edje_Program *pr, int force, const char *ssig, const
if (pt->id >= 0) if (pt->id >= 0)
{ {
rp = ed->table_parts[pt->id % ed->table_parts_size]; rp = ed->table_parts[pt->id % ed->table_parts_size];
if ((rp) && (rp->drag.down.count == 0)) if ((rp) && (rp->drag) && (rp->drag->down.count == 0))
{ {
rp->drag.val.x += pr->value * rp->drag.step.x * rp->part->dragable.x; rp->drag->val.x += pr->value * rp->drag->step.x * rp->part->dragable.x;
rp->drag.val.y += pr->value2 * rp->drag.step.y * rp->part->dragable.y; rp->drag->val.y += pr->value2 * rp->drag->step.y * rp->part->dragable.y;
if (rp->drag.val.x < 0.0) rp->drag.val.x = 0.0; if (rp->drag->val.x < 0.0) rp->drag->val.x = 0.0;
else if (rp->drag.val.x > 1.0) rp->drag.val.x = 1.0; else if (rp->drag->val.x > 1.0) rp->drag->val.x = 1.0;
if (rp->drag.val.y < 0.0) rp->drag.val.y = 0.0; if (rp->drag->val.y < 0.0) rp->drag->val.y = 0.0;
else if (rp->drag.val.y > 1.0) rp->drag.val.y = 1.0; else if (rp->drag->val.y > 1.0) rp->drag->val.y = 1.0;
_edje_dragable_pos_set(ed, rp, rp->drag.val.x, rp->drag.val.y); _edje_dragable_pos_set(ed, rp, rp->drag->val.x, rp->drag->val.y);
_edje_emit(ed, "drag,step", rp->part->name); _edje_emit(ed, "drag,step", rp->part->name);
if (_edje_block_break(ed)) goto break_prog; if (_edje_block_break(ed)) goto break_prog;
} }
@ -723,15 +723,15 @@ _edje_program_run(Edje *ed, Edje_Program *pr, int force, const char *ssig, const
if (pt->id >= 0) if (pt->id >= 0)
{ {
rp = ed->table_parts[pt->id % ed->table_parts_size]; rp = ed->table_parts[pt->id % ed->table_parts_size];
if ((rp) && (rp->drag.down.count == 0)) if ((rp) && (rp->drag) && (rp->drag->down.count == 0))
{ {
rp->drag.val.x += pr->value * rp->drag.page.x * rp->part->dragable.x; rp->drag->val.x += pr->value * rp->drag->page.x * rp->part->dragable.x;
rp->drag.val.y += pr->value2 * rp->drag.page.y * rp->part->dragable.y; rp->drag->val.y += pr->value2 * rp->drag->page.y * rp->part->dragable.y;
if (rp->drag.val.x < 0.0) rp->drag.val.x = 0.0; if (rp->drag->val.x < 0.0) rp->drag->val.x = 0.0;
else if (rp->drag.val.x > 1.0) rp->drag.val.x = 1.0; else if (rp->drag->val.x > 1.0) rp->drag->val.x = 1.0;
if (rp->drag.val.y < 0.0) rp->drag.val.y = 0.0; if (rp->drag->val.y < 0.0) rp->drag->val.y = 0.0;
else if (rp->drag.val.y > 1.0) rp->drag.val.y = 1.0; else if (rp->drag->val.y > 1.0) rp->drag->val.y = 1.0;
_edje_dragable_pos_set(ed, rp, rp->drag.val.x, rp->drag.val.y); _edje_dragable_pos_set(ed, rp, rp->drag->val.x, rp->drag->val.y);
_edje_emit(ed, "drag,page", rp->part->name); _edje_emit(ed, "drag,page", rp->part->name);
if (_edje_block_break(ed)) goto break_prog; if (_edje_block_break(ed)) goto break_prog;
} }

View File

@ -2156,7 +2156,8 @@ edje_object_part_drag_value_set(Evas_Object *obj, const char *part, double dx, d
if ((!ed) || (!part)) return; if ((!ed) || (!part)) return;
rp = _edje_real_part_recursive_get(ed, (char *)part); rp = _edje_real_part_recursive_get(ed, (char *)part);
if (!rp) return; if (!rp) return;
if (rp->drag.down.count > 0) return; if (!rp->drag) return;
if (rp->drag->down.count > 0) return;
if (rp->part->dragable.confine_id != -1) if (rp->part->dragable.confine_id != -1)
{ {
dx = CLAMP(dx, 0.0, 1.0); dx = CLAMP(dx, 0.0, 1.0);
@ -2164,9 +2165,9 @@ edje_object_part_drag_value_set(Evas_Object *obj, const char *part, double dx, d
} }
if (rp->part->dragable.x < 0) dx = 1.0 - dx; if (rp->part->dragable.x < 0) dx = 1.0 - dx;
if (rp->part->dragable.y < 0) dy = 1.0 - dy; if (rp->part->dragable.y < 0) dy = 1.0 - dy;
if ((rp->drag.val.x == dx) && (rp->drag.val.y == dy)) return; if ((rp->drag->val.x == dx) && (rp->drag->val.y == dy)) return;
rp->drag.val.x = dx; rp->drag->val.x = dx;
rp->drag.val.y = dy; rp->drag->val.y = dy;
#ifdef EDJE_CALC_CACHE #ifdef EDJE_CALC_CACHE
rp->invalidate = 1; rp->invalidate = 1;
#endif #endif
@ -2202,14 +2203,14 @@ edje_object_part_drag_value_get(const Evas_Object *obj, const char *part, double
_edje_recalc_do(ed); _edje_recalc_do(ed);
rp = _edje_real_part_recursive_get(ed, (char *)part); rp = _edje_real_part_recursive_get(ed, (char *)part);
if (!rp) if (!rp || !rp->drag)
{ {
if (dx) *dx = 0; if (dx) *dx = 0;
if (dy) *dy = 0; if (dy) *dy = 0;
return; return;
} }
ddx = rp->drag.val.x; ddx = rp->drag->val.x;
ddy = rp->drag.val.y; ddy = rp->drag->val.y;
if (rp->part->dragable.x < 0) ddx = 1.0 - ddx; if (rp->part->dragable.x < 0) ddx = 1.0 - ddx;
if (rp->part->dragable.y < 0) ddy = 1.0 - ddy; if (rp->part->dragable.y < 0) ddy = 1.0 - ddy;
if (dx) *dx = ddx; if (dx) *dx = ddx;
@ -2234,13 +2235,14 @@ edje_object_part_drag_size_set(Evas_Object *obj, const char *part, double dw, do
if ((!ed) || (!part)) return; if ((!ed) || (!part)) return;
rp = _edje_real_part_recursive_get(ed, (char *)part); rp = _edje_real_part_recursive_get(ed, (char *)part);
if (!rp) return; if (!rp) return;
if (!rp->drag) return;
if (dw < 0.0) dw = 0.0; if (dw < 0.0) dw = 0.0;
else if (dw > 1.0) dw = 1.0; else if (dw > 1.0) dw = 1.0;
if (dh < 0.0) dh = 0.0; if (dh < 0.0) dh = 0.0;
else if (dh > 1.0) dh = 1.0; else if (dh > 1.0) dh = 1.0;
if ((rp->drag.size.x == dw) && (rp->drag.size.y == dh)) return; if ((rp->drag->size.x == dw) && (rp->drag->size.y == dh)) return;
rp->drag.size.x = dw; rp->drag->size.x = dw;
rp->drag.size.y = dh; rp->drag->size.y = dh;
rp->edje->dirty = 1; rp->edje->dirty = 1;
#ifdef EDJE_CALC_CACHE #ifdef EDJE_CALC_CACHE
rp->invalidate = 1; rp->invalidate = 1;
@ -2274,14 +2276,14 @@ edje_object_part_drag_size_get(const Evas_Object *obj, const char *part, double
_edje_recalc_do(ed); _edje_recalc_do(ed);
rp = _edje_real_part_recursive_get(ed, (char *)part); rp = _edje_real_part_recursive_get(ed, (char *)part);
if (!rp) if (!rp || !rp->drag)
{ {
if (dw) *dw = 0; if (dw) *dw = 0;
if (dh) *dh = 0; if (dh) *dh = 0;
return; return;
} }
if (dw) *dw = rp->drag.size.x; if (dw) *dw = rp->drag->size.x;
if (dh) *dh = rp->drag.size.y; if (dh) *dh = rp->drag->size.y;
} }
/** Sets the drag step increment /** Sets the drag step increment
@ -2302,12 +2304,13 @@ edje_object_part_drag_step_set(Evas_Object *obj, const char *part, double dx, do
if ((!ed) || (!part)) return; if ((!ed) || (!part)) return;
rp = _edje_real_part_recursive_get(ed, (char *)part); rp = _edje_real_part_recursive_get(ed, (char *)part);
if (!rp) return; if (!rp) return;
if (!rp->drag) return;
if (dx < 0.0) dx = 0.0; if (dx < 0.0) dx = 0.0;
else if (dx > 1.0) dx = 1.0; else if (dx > 1.0) dx = 1.0;
if (dy < 0.0) dy = 0.0; if (dy < 0.0) dy = 0.0;
else if (dy > 1.0) dy = 1.0; else if (dy > 1.0) dy = 1.0;
rp->drag.step.x = dx; rp->drag->step.x = dx;
rp->drag.step.y = dy; rp->drag->step.y = dy;
#ifdef EDJE_CALC_CACHE #ifdef EDJE_CALC_CACHE
rp->invalidate = 1; rp->invalidate = 1;
#endif #endif
@ -2339,14 +2342,14 @@ edje_object_part_drag_step_get(const Evas_Object *obj, const char *part, double
_edje_recalc_do(ed); _edje_recalc_do(ed);
rp = _edje_real_part_recursive_get(ed, (char *)part); rp = _edje_real_part_recursive_get(ed, (char *)part);
if (!rp) if (!rp || !rp->drag)
{ {
if (dx) *dx = 0; if (dx) *dx = 0;
if (dy) *dy = 0; if (dy) *dy = 0;
return; return;
} }
if (dx) *dx = rp->drag.step.x; if (dx) *dx = rp->drag->step.x;
if (dy) *dy = rp->drag.step.y; if (dy) *dy = rp->drag->step.y;
} }
/** Sets the page step increments /** Sets the page step increments
@ -2367,12 +2370,13 @@ edje_object_part_drag_page_set(Evas_Object *obj, const char *part, double dx, do
if ((!ed) || (!part)) return; if ((!ed) || (!part)) return;
rp = _edje_real_part_recursive_get(ed, (char *)part); rp = _edje_real_part_recursive_get(ed, (char *)part);
if (!rp) return; if (!rp) return;
if (!rp->drag) return;
if (dx < 0.0) dx = 0.0; if (dx < 0.0) dx = 0.0;
else if (dx > 1.0) dx = 1.0; else if (dx > 1.0) dx = 1.0;
if (dy < 0.0) dy = 0.0; if (dy < 0.0) dy = 0.0;
else if (dy > 1.0) dy = 1.0; else if (dy > 1.0) dy = 1.0;
rp->drag.page.x = dx; rp->drag->page.x = dx;
rp->drag.page.y = dy; rp->drag->page.y = dy;
#ifdef EDJE_CALC_CACHE #ifdef EDJE_CALC_CACHE
rp->invalidate = 1; rp->invalidate = 1;
#endif #endif
@ -2404,14 +2408,14 @@ edje_object_part_drag_page_get(const Evas_Object *obj, const char *part, double
_edje_recalc_do(ed); _edje_recalc_do(ed);
rp = _edje_real_part_recursive_get(ed, (char *)part); rp = _edje_real_part_recursive_get(ed, (char *)part);
if (!rp) if (!rp || !rp->drag)
{ {
if (dx) *dx = 0; if (dx) *dx = 0;
if (dy) *dy = 0; if (dy) *dy = 0;
return; return;
} }
if (dx) *dx = rp->drag.page.x; if (dx) *dx = rp->drag->page.x;
if (dy) *dy = rp->drag.page.y; if (dy) *dy = rp->drag->page.y;
} }
/** Steps the dragable x,y steps /** Steps the dragable x,y steps
@ -2434,18 +2438,19 @@ edje_object_part_drag_step(Evas_Object *obj, const char *part, double dx, double
if ((!ed) || (!part)) return; if ((!ed) || (!part)) return;
rp = _edje_real_part_recursive_get(ed, (char *)part); rp = _edje_real_part_recursive_get(ed, (char *)part);
if (!rp) return; if (!rp) return;
if (rp->drag.down.count > 0) return; if (!rp->drag) return;
px = rp->drag.val.x; if (rp->drag->down.count > 0) return;
py = rp->drag.val.y; px = rp->drag->val.x;
rp->drag.val.x += dx * rp->drag.step.x * rp->part->dragable.x; py = rp->drag->val.y;
rp->drag.val.y += dy * rp->drag.step.y * rp->part->dragable.y; rp->drag->val.x += dx * rp->drag->step.x * rp->part->dragable.x;
rp->drag.val.x = CLAMP (rp->drag.val.x, 0.0, 1.0); rp->drag->val.y += dy * rp->drag->step.y * rp->part->dragable.y;
rp->drag.val.y = CLAMP (rp->drag.val.y, 0.0, 1.0); rp->drag->val.x = CLAMP (rp->drag->val.x, 0.0, 1.0);
if ((px == rp->drag.val.x) && (py == rp->drag.val.y)) return; rp->drag->val.y = CLAMP (rp->drag->val.y, 0.0, 1.0);
if ((px == rp->drag->val.x) && (py == rp->drag->val.y)) return;
#ifdef EDJE_CALC_CACHE #ifdef EDJE_CALC_CACHE
rp->invalidate = 1; rp->invalidate = 1;
#endif #endif
_edje_dragable_pos_set(rp->edje, rp, rp->drag.val.x, rp->drag.val.y); _edje_dragable_pos_set(rp->edje, rp, rp->drag->val.x, rp->drag->val.y);
_edje_emit(rp->edje, "drag,step", rp->part->name); _edje_emit(rp->edje, "drag,step", rp->part->name);
} }
@ -2469,18 +2474,19 @@ edje_object_part_drag_page(Evas_Object *obj, const char *part, double dx, double
if ((!ed) || (!part)) return; if ((!ed) || (!part)) return;
rp = _edje_real_part_recursive_get(ed, (char *)part); rp = _edje_real_part_recursive_get(ed, (char *)part);
if (!rp) return; if (!rp) return;
if (rp->drag.down.count > 0) return; if (!rp->drag) return;
px = rp->drag.val.x; if (rp->drag->down.count > 0) return;
py = rp->drag.val.y; px = rp->drag->val.x;
rp->drag.val.x += dx * rp->drag.page.x * rp->part->dragable.x; py = rp->drag->val.y;
rp->drag.val.y += dy * rp->drag.page.y * rp->part->dragable.y; rp->drag->val.x += dx * rp->drag->page.x * rp->part->dragable.x;
rp->drag.val.x = CLAMP (rp->drag.val.x, 0.0, 1.0); rp->drag->val.y += dy * rp->drag->page.y * rp->part->dragable.y;
rp->drag.val.y = CLAMP (rp->drag.val.y, 0.0, 1.0); rp->drag->val.x = CLAMP (rp->drag->val.x, 0.0, 1.0);
if ((px == rp->drag.val.x) && (py == rp->drag.val.y)) return; rp->drag->val.y = CLAMP (rp->drag->val.y, 0.0, 1.0);
if ((px == rp->drag->val.x) && (py == rp->drag->val.y)) return;
#ifdef EDJE_CALC_CACHE #ifdef EDJE_CALC_CACHE
rp->invalidate = 1; rp->invalidate = 1;
#endif #endif
_edje_dragable_pos_set(rp->edje, rp, rp->drag.val.x, rp->drag.val.y); _edje_dragable_pos_set(rp->edje, rp, rp->drag->val.x, rp->drag->val.y);
_edje_emit(rp->edje, "drag,page", rp->part->name); _edje_emit(rp->edje, "drag,page", rp->part->name);
} }