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; 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_String Edje_Message_String;
typedef struct _Edje_Message_Int Edje_Message_Int; typedef struct _Edje_Message_Int Edje_Message_Int;
typedef struct _Edje_Message_Float Edje_Message_Float; 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_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_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_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 */ /* edje_smart.c */
EAPI Evas_Object *edje_object_add (Evas *evas); EAPI Evas_Object *edje_object_add (Evas *evas);

View File

@ -251,6 +251,22 @@ _edje_part_recalc_single(Edje *ed,
flags = FLAG_XY; 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 */ /* relative coords of top left & bottom right */
if (flags & FLAG_X) if (flags & FLAG_X)
{ {
@ -291,6 +307,7 @@ _edje_part_recalc_single(Edje *ed,
if ((params->h > 0) && if ((params->h > 0) &&
(((flags | ep->calculated) & FLAG_XY) == FLAG_XY)) (((flags | ep->calculated) & FLAG_XY) == FLAG_XY))
{ {
int apref;
double aspect, amax, amin; double aspect, amax, amin;
double new_w, new_h, want_x, want_y, want_w, want_h; 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_y = params->y;
want_h = new_h = params->h; 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; aspect = (double)params->w / (double)params->h;
apref = desc->aspect.prefer;
amax = desc->aspect.max; amax = desc->aspect.max;
amin = desc->aspect.min; amin = desc->aspect.min;
if ((ep->swallow_params.aspect.w > 0) && if ((ep->swallow_params.aspect.w > 0) &&
@ -308,8 +332,27 @@ _edje_part_recalc_single(Edje *ed,
amin = amax = amin = amax =
(double)ep->swallow_params.aspect.w / (double)ep->swallow_params.aspect.w /
(double)ep->swallow_params.aspect.h; (double)ep->swallow_params.aspect.h;
if (ep->swallow_params.aspect.mode > EDJE_ASPECT_CONTROL_NONE)
if (desc->aspect.prefer == EDJE_ASPECT_PREFER_NONE) /* keep both dimensions in check */ {
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) */ /* adjust for max aspect (width / height) */
if ((amax > 0.0) && (aspect > amax)) if ((amax > 0.0) && (aspect > amax))
@ -324,7 +367,7 @@ _edje_part_recalc_single(Edje *ed,
new_w = (params->h * amin); new_w = (params->h * amin);
} }
} /* prefer vertical size as determiner */ } /* 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) */ /* adjust for max aspect (width / height) */
if ((amax > 0.0) && (aspect > amax)) if ((amax > 0.0) && (aspect > amax))
@ -333,7 +376,7 @@ _edje_part_recalc_single(Edje *ed,
if ((amin > 0.0) && (aspect < amin)) if ((amin > 0.0) && (aspect < amin))
new_w = (params->h * amin); new_w = (params->h * amin);
} /* prefer horizontal size as determiner */ } /* 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) */ /* adjust for max aspect (width / height) */
if ((amax > 0.0) && (aspect > amax)) if ((amax > 0.0) && (aspect > amax))
@ -342,7 +385,7 @@ _edje_part_recalc_single(Edje *ed,
if ((amin > 0.0) && (aspect < amin)) if ((amin > 0.0) && (aspect < amin))
new_h = (params->w / 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) */ /* adjust for max aspect (width / height) */
if ((amax > 0.0) && (aspect > amax)) if ((amax > 0.0) && (aspect > amax))
@ -358,7 +401,7 @@ _edje_part_recalc_single(Edje *ed,
} }
} }
/* do real adjustment */ /* do real adjustment */
if (desc->aspect.prefer == EDJE_ASPECT_PREFER_BOTH) if (apref == EDJE_ASPECT_PREFER_BOTH)
{ {
/* fix h and vary w */ /* fix h and vary w */
if (new_w > params->w) if (new_w > params->w)
@ -375,7 +418,7 @@ _edje_part_recalc_single(Edje *ed,
params->h = new_h; params->h = new_h;
else if (params->h > new_h) else if (params->h > new_h)
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; params->w = new_w;
} }
else else
@ -384,7 +427,7 @@ _edje_part_recalc_single(Edje *ed,
params->w = new_w; params->w = new_w;
else if (params->w > new_w) else if (params->w > new_w)
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; 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 we have text that wants to make the min size the text size... */
if ((chosen_desc) && (ep->part->type == EDJE_PART_TYPE_TEXTBLOCK)) 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 */ /* adjust for max size */
if (flags & FLAG_X) if (flags & FLAG_X)
{ {

View File

@ -582,6 +582,7 @@ struct _Edje_Real_Part
int w, h; int w, h;
} min, max; } min, max;
struct { struct {
unsigned char mode;
int w, h; int w, h;
} aspect; } aspect;
} swallow_params; } 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; 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"); w1 = (int)evas_object_data_get(obj_swallow, "\377 edje.minw");
h1 = (int)evas_object_data_get(obj_swallow, "\377 edje.minh"); h1 = (int)evas_object_data_get(obj_swallow, "\377 edje.minh");
w2 = (int)evas_object_data_get(obj_swallow, "\377 edje.maxw"); w2 = (int)evas_object_data_get(obj_swallow, "\377 edje.maxw");
h2 = (int)evas_object_data_get(obj_swallow, "\377 edje.maxh"); 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"); aw = (int)evas_object_data_get(obj_swallow, "\377 edje.aspw");
ah = (int)evas_object_data_get(obj_swallow, "\377 edje.asph"); ah = (int)evas_object_data_get(obj_swallow, "\377 edje.asph");
rp->swallow_params.min.w = w1; rp->swallow_params.min.w = w1;
rp->swallow_params.min.h = h1; rp->swallow_params.min.h = h1;
if (w2 > 0) rp->swallow_params.max.w = w2; if (w2 > 0) rp->swallow_params.max.w = w2;
if (h2 > 0) rp->swallow_params.max.h = h2; if (h2 > 0) rp->swallow_params.max.h = h2;
if (aw > 0) rp->swallow_params.aspect.w = aw; rp->swallow_params.aspect.mode = am;
if (ah > 0) rp->swallow_params.aspect.h = ah; rp->swallow_params.aspect.w = aw;
rp->swallow_params.aspect.h = ah;
} }
ed->dirty = 1; ed->dirty = 1;
_edje_recalc(ed); _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 /** Set the object aspect size
* @param obj A valid Evas_Object handle * @param obj A valid Evas_Object handle
* @param aspect The aspect control axes
* @param aw The aspect radio width * @param aw The aspect radio width
* @param ah The aspect ratio height * @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. * scale of both aspwct width and height.
*/ */
EAPI void 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 mw, mh;
int mc;
mc = aspect;
mw = aw; mw = aw;
mh = ah; 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); evas_object_data_set(obj, "\377 edje.aspw", (void *)mw);
else else
evas_object_data_del(obj, "\377 edje.aspw"); evas_object_data_del(obj, "\377 edje.aspw");
if (mh >= 0) if (mh > 0)
evas_object_data_set(obj, "\377 edje.asph", (void *)mh); evas_object_data_set(obj, "\377 edje.asph", (void *)mh);
else else
evas_object_data_del(obj, "\377 edje.asph"); evas_object_data_del(obj, "\377 edje.asph");