more external aspect support - all working nicely now

SVN revision: 24148
This commit is contained in:
Carsten Haitzler 2006-07-23 19:33:27 +00:00
parent 5de5999b5a
commit 3ea84d923f
4 changed files with 79 additions and 38 deletions

View File

@ -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);

View File

@ -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)
{

View File

@ -582,6 +582,7 @@ struct _Edje_Real_Part
int w, h;
} min, max;
struct {
unsigned char mode;
int w, h;
} aspect;
} swallow_params;

View File

@ -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");