From 3ea84d923fdbf35b62c1e94ea8ae710318b8aebe Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Sun, 23 Jul 2006 19:33:27 +0000 Subject: [PATCH] more external aspect support - all working nicely now SVN revision: 24148 --- legacy/edje/src/lib/Edje.h | 12 ++++- legacy/edje/src/lib/edje_calc.c | 81 +++++++++++++++++++----------- legacy/edje/src/lib/edje_private.h | 1 + legacy/edje/src/lib/edje_util.c | 23 ++++++--- 4 files changed, 79 insertions(+), 38 deletions(-) diff --git a/legacy/edje/src/lib/Edje.h b/legacy/edje/src/lib/Edje.h index 7ef0704077..c1e282ee77 100644 --- a/legacy/edje/src/lib/Edje.h +++ b/legacy/edje/src/lib/Edje.h @@ -47,6 +47,16 @@ enum _Edje_Message_Type }; typedef enum _Edje_Message_Type Edje_Message_Type; +enum _Edje_Aspect_Control +{ + EDJE_ASPECT_CONTROL_NONE = 0, + EDJE_ASPECT_CONTROL_NEITHER = 1, + EDJE_ASPECT_CONTROL_HORIZONTAL = 2, + EDJE_ASPECT_CONTROL_VERTICAL = 3, + EDJE_ASPECT_CONTROL_BOTH = 4 +}; +typedef enum _Edje_Aspect_Control Edje_Aspect_Control; + typedef struct _Edje_Message_String Edje_Message_String; typedef struct _Edje_Message_Int Edje_Message_Int; typedef struct _Edje_Message_Float Edje_Message_Float; @@ -175,7 +185,7 @@ extern "C" { EAPI void edje_text_class_set(const char *text_class, const char *font, Evas_Font_Size size); EAPI void edje_extern_object_min_size_set (Evas_Object *obj, Evas_Coord minw, Evas_Coord minh); EAPI void edje_extern_object_max_size_set (Evas_Object *obj, Evas_Coord maxw, Evas_Coord maxh); - EAPI void edje_extern_object_aspect_set(Evas_Object *obj, Evas_Coord aw, Evas_Coord ah); + EAPI void edje_extern_object_aspect_set(Evas_Object *obj, Edje_Aspect_Control aspect, Evas_Coord aw, Evas_Coord ah); /* edje_smart.c */ EAPI Evas_Object *edje_object_add (Evas *evas); diff --git a/legacy/edje/src/lib/edje_calc.c b/legacy/edje/src/lib/edje_calc.c index dde84d1028..df7236cd2c 100644 --- a/legacy/edje/src/lib/edje_calc.c +++ b/legacy/edje/src/lib/edje_calc.c @@ -251,6 +251,22 @@ _edje_part_recalc_single(Edje *ed, flags = FLAG_XY; +// if (flags & FLAG_X) + { + minw = desc->min.w; + if (ep->swallow_params.min.w > desc->min.w) minw = ep->swallow_params.min.w; + maxw = desc->max.w; + if ((ep->swallow_params.max.w >= 0) && + (ep->swallow_params.max.w < maxw)) maxw = ep->swallow_params.max.w; + } +// if (flags & FLAG_Y) + { + minh = desc->min.h; + if (ep->swallow_params.min.h > desc->min.h) minh = ep->swallow_params.min.h; + maxh = desc->max.h; + if ((ep->swallow_params.max.h >= 0) && + (ep->swallow_params.max.h < maxh)) maxh = ep->swallow_params.max.h; + } /* relative coords of top left & bottom right */ if (flags & FLAG_X) { @@ -291,6 +307,7 @@ _edje_part_recalc_single(Edje *ed, if ((params->h > 0) && (((flags | ep->calculated) & FLAG_XY) == FLAG_XY)) { + int apref; double aspect, amax, amin; double new_w, new_h, want_x, want_y, want_w, want_h; @@ -300,7 +317,14 @@ _edje_part_recalc_single(Edje *ed, want_y = params->y; want_h = new_h = params->h; + if ((maxw >= 0) && (new_w > maxw)) new_w = maxw; + if (new_w < minw) new_w = minw; + + if ((maxh >= 0) && (new_h > maxh)) new_h = maxh; + if (new_h < minh) new_h = minh; + aspect = (double)params->w / (double)params->h; + apref = desc->aspect.prefer; amax = desc->aspect.max; amin = desc->aspect.min; if ((ep->swallow_params.aspect.w > 0) && @@ -308,8 +332,27 @@ _edje_part_recalc_single(Edje *ed, amin = amax = (double)ep->swallow_params.aspect.w / (double)ep->swallow_params.aspect.h; - - if (desc->aspect.prefer == EDJE_ASPECT_PREFER_NONE) /* keep both dimensions in check */ + if (ep->swallow_params.aspect.mode > EDJE_ASPECT_CONTROL_NONE) + { + switch (ep->swallow_params.aspect.mode) + { + case EDJE_ASPECT_CONTROL_NEITHER: + apref = EDJE_ASPECT_PREFER_NONE; + break; + case EDJE_ASPECT_CONTROL_HORIZONTAL: + apref = EDJE_ASPECT_PREFER_HORIZONTAL; + break; + case EDJE_ASPECT_CONTROL_VERTICAL: + apref = EDJE_ASPECT_PREFER_VERTICAL; + break; + case EDJE_ASPECT_CONTROL_BOTH: + apref = EDJE_ASPECT_PREFER_BOTH; + break; + default: + break; + } + } + if (apref == EDJE_ASPECT_PREFER_NONE) /* keep both dimensions in check */ { /* adjust for max aspect (width / height) */ if ((amax > 0.0) && (aspect > amax)) @@ -324,7 +367,7 @@ _edje_part_recalc_single(Edje *ed, new_w = (params->h * amin); } } /* prefer vertical size as determiner */ - else if (desc->aspect.prefer == EDJE_ASPECT_PREFER_VERTICAL) /* keep both dimensions in check */ + else if (apref == EDJE_ASPECT_PREFER_VERTICAL) /* keep both dimensions in check */ { /* adjust for max aspect (width / height) */ if ((amax > 0.0) && (aspect > amax)) @@ -333,7 +376,7 @@ _edje_part_recalc_single(Edje *ed, if ((amin > 0.0) && (aspect < amin)) new_w = (params->h * amin); } /* prefer horizontal size as determiner */ - else if (desc->aspect.prefer == EDJE_ASPECT_PREFER_HORIZONTAL) /* keep both dimensions in check */ + else if (apref == EDJE_ASPECT_PREFER_HORIZONTAL) /* keep both dimensions in check */ { /* adjust for max aspect (width / height) */ if ((amax > 0.0) && (aspect > amax)) @@ -342,7 +385,7 @@ _edje_part_recalc_single(Edje *ed, if ((amin > 0.0) && (aspect < amin)) new_h = (params->w / amin); } - else if (desc->aspect.prefer == EDJE_ASPECT_PREFER_BOTH) /* keep both dimensions in check */ + else if (apref == EDJE_ASPECT_PREFER_BOTH) /* keep both dimensions in check */ { /* adjust for max aspect (width / height) */ if ((amax > 0.0) && (aspect > amax)) @@ -358,7 +401,7 @@ _edje_part_recalc_single(Edje *ed, } } /* do real adjustment */ - if (desc->aspect.prefer == EDJE_ASPECT_PREFER_BOTH) + if (apref == EDJE_ASPECT_PREFER_BOTH) { /* fix h and vary w */ if (new_w > params->w) @@ -375,7 +418,7 @@ _edje_part_recalc_single(Edje *ed, params->h = new_h; else if (params->h > new_h) params->h = new_h; - if (desc->aspect.prefer == EDJE_ASPECT_PREFER_VERTICAL) + if (apref == EDJE_ASPECT_PREFER_VERTICAL) params->w = new_w; } else @@ -384,7 +427,7 @@ _edje_part_recalc_single(Edje *ed, params->w = new_w; else if (params->w > new_w) params->w = new_w; - if (desc->aspect.prefer == EDJE_ASPECT_PREFER_HORIZONTAL) + if (apref == EDJE_ASPECT_PREFER_HORIZONTAL) params->h = new_h; } } @@ -427,16 +470,6 @@ _edje_part_recalc_single(Edje *ed, } } } - if (flags & FLAG_X) - { - minw = desc->min.w; - if (ep->swallow_params.min.w > desc->min.w) minw = ep->swallow_params.min.w; - } - if (flags & FLAG_Y) - { - minh = desc->min.h; - if (ep->swallow_params.min.h > desc->min.h) minh = ep->swallow_params.min.h; - } /* if we have text that wants to make the min size the text size... */ if ((chosen_desc) && (ep->part->type == EDJE_PART_TYPE_TEXTBLOCK)) { @@ -710,18 +743,6 @@ _edje_part_recalc_single(Edje *ed, } } } - if (flags & FLAG_X) - { - maxw = desc->max.w; - if ((ep->swallow_params.max.w >= 0) && - (ep->swallow_params.max.w < maxw)) maxw = ep->swallow_params.max.w; - } - if (flags & FLAG_Y) - { - maxh = desc->max.h; - if ((ep->swallow_params.max.h >= 0) && - (ep->swallow_params.max.h < maxh)) maxh = ep->swallow_params.max.h; - } /* adjust for max size */ if (flags & FLAG_X) { diff --git a/legacy/edje/src/lib/edje_private.h b/legacy/edje/src/lib/edje_private.h index b53e7d034f..ba9bb2aee9 100644 --- a/legacy/edje/src/lib/edje_private.h +++ b/legacy/edje/src/lib/edje_private.h @@ -582,6 +582,7 @@ struct _Edje_Real_Part int w, h; } min, max; struct { + unsigned char mode; int w, h; } aspect; } swallow_params; diff --git a/legacy/edje/src/lib/edje_util.c b/legacy/edje/src/lib/edje_util.c index 5d5af69547..1bf6ae1048 100644 --- a/legacy/edje/src/lib/edje_util.c +++ b/legacy/edje/src/lib/edje_util.c @@ -744,20 +744,22 @@ edje_object_part_swallow(Evas_Object *obj, const char *part, Evas_Object *obj_sw rp->swallow_params.max.h = h; } { - int w1, h1, w2, h2, aw, ah; + int w1, h1, w2, h2, am, aw, ah; w1 = (int)evas_object_data_get(obj_swallow, "\377 edje.minw"); h1 = (int)evas_object_data_get(obj_swallow, "\377 edje.minh"); w2 = (int)evas_object_data_get(obj_swallow, "\377 edje.maxw"); h2 = (int)evas_object_data_get(obj_swallow, "\377 edje.maxh"); + am = (int)evas_object_data_get(obj_swallow, "\377 edje.aspm"); aw = (int)evas_object_data_get(obj_swallow, "\377 edje.aspw"); ah = (int)evas_object_data_get(obj_swallow, "\377 edje.asph"); rp->swallow_params.min.w = w1; rp->swallow_params.min.h = h1; if (w2 > 0) rp->swallow_params.max.w = w2; if (h2 > 0) rp->swallow_params.max.h = h2; - if (aw > 0) rp->swallow_params.aspect.w = aw; - if (ah > 0) rp->swallow_params.aspect.h = ah; + rp->swallow_params.aspect.mode = am; + rp->swallow_params.aspect.w = aw; + rp->swallow_params.aspect.h = ah; } ed->dirty = 1; _edje_recalc(ed); @@ -815,6 +817,7 @@ edje_extern_object_max_size_set(Evas_Object *obj, Evas_Coord maxw, Evas_Coord ma /** Set the object aspect size * @param obj A valid Evas_Object handle + * @param aspect The aspect control axes * @param aw The aspect radio width * @param ah The aspect ratio height * @@ -824,17 +827,23 @@ edje_extern_object_max_size_set(Evas_Object *obj, Evas_Coord maxw, Evas_Coord ma * scale of both aspwct width and height. */ EAPI void -edje_extern_object_aspect_set(Evas_Object *obj, Evas_Coord aw, Evas_Coord ah) +edje_extern_object_aspect_set(Evas_Object *obj, Edje_Aspect_Control aspect, Evas_Coord aw, Evas_Coord ah) { int mw, mh; - + int mc; + + mc = aspect; mw = aw; mh = ah; - if (mw >= 0) + if (mc > 0) + evas_object_data_set(obj, "\377 edje.aspm", (void *)mc); + else + evas_object_data_del(obj, "\377 edje.aspm"); + if (mw > 0) evas_object_data_set(obj, "\377 edje.aspw", (void *)mw); else evas_object_data_del(obj, "\377 edje.aspw"); - if (mh >= 0) + if (mh > 0) evas_object_data_set(obj, "\377 edje.asph", (void *)mh); else evas_object_data_del(obj, "\377 edje.asph");