allow code to specify an aspect for swallowed objects

SVN revision: 24145
This commit is contained in:
Carsten Haitzler 2006-07-23 13:50:02 +00:00
parent 5607a495c5
commit 5de5999b5a
4 changed files with 66 additions and 23 deletions

View File

@ -175,7 +175,8 @@ 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);
/* edje_smart.c */
EAPI Evas_Object *edje_object_add (Evas *evas);

View File

@ -291,7 +291,7 @@ _edje_part_recalc_single(Edje *ed,
if ((params->h > 0) &&
(((flags | ep->calculated) & FLAG_XY) == FLAG_XY))
{
double aspect;
double aspect, amax, amin;
double new_w, new_h, want_x, want_y, want_w, want_h;
want_x = params->x;
@ -301,52 +301,60 @@ _edje_part_recalc_single(Edje *ed,
want_h = new_h = params->h;
aspect = (double)params->w / (double)params->h;
amax = desc->aspect.max;
amin = desc->aspect.min;
if ((ep->swallow_params.aspect.w > 0) &&
(ep->swallow_params.aspect.h > 0))
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 */
{
/* adjust for max aspect (width / height) */
if ((desc->aspect.max > 0.0) && (aspect > desc->aspect.max))
if ((amax > 0.0) && (aspect > amax))
{
new_h = (params->w / desc->aspect.max);
new_w = (params->h * desc->aspect.max);
new_h = (params->w / amax);
new_w = (params->h * amax);
}
/* adjust for min aspect (width / height) */
if ((desc->aspect.min > 0.0) && (aspect < desc->aspect.min))
if ((amin > 0.0) && (aspect < amin))
{
new_h = (params->w / desc->aspect.min);
new_w = (params->h * desc->aspect.min);
new_h = (params->w / amin);
new_w = (params->h * amin);
}
} /* prefer vertical size as determiner */
else if (desc->aspect.prefer == EDJE_ASPECT_PREFER_VERTICAL) /* keep both dimensions in check */
{
/* adjust for max aspect (width / height) */
if ((desc->aspect.max > 0.0) && (aspect > desc->aspect.max))
new_w = (params->h * desc->aspect.max);
if ((amax > 0.0) && (aspect > amax))
new_w = (params->h * amax);
/* adjust for min aspect (width / height) */
if ((desc->aspect.min > 0.0) && (aspect < desc->aspect.min))
new_w = (params->h * desc->aspect.min);
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 */
{
/* adjust for max aspect (width / height) */
if ((desc->aspect.max > 0.0) && (aspect > desc->aspect.max))
new_h = (params->w / desc->aspect.max);
if ((amax > 0.0) && (aspect > amax))
new_h = (params->w / amax);
/* adjust for min aspect (width / height) */
if ((desc->aspect.min > 0.0) && (aspect < desc->aspect.min))
new_h = (params->w / desc->aspect.min);
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 */
{
/* adjust for max aspect (width / height) */
if ((desc->aspect.max > 0.0) && (aspect > desc->aspect.max))
if ((amax > 0.0) && (aspect > amax))
{
new_w = (params->h * desc->aspect.max);
new_h = (params->w / desc->aspect.max);
new_w = (params->h * amax);
new_h = (params->w / amax);
}
/* adjust for min aspect (width / height) */
if ((desc->aspect.min > 0.0) && (aspect < desc->aspect.min))
if ((amin > 0.0) && (aspect < amin))
{
new_w = (params->h * desc->aspect.min);
new_h = (params->w / desc->aspect.min);
new_w = (params->h * amin);
new_h = (params->w / amin);
}
}
/* do real adjustment */

View File

@ -581,6 +581,9 @@ struct _Edje_Real_Part
struct {
int w, h;
} min, max;
struct {
int w, h;
} aspect;
} swallow_params;
unsigned char calculated;
unsigned char calculating;

View File

@ -744,16 +744,20 @@ 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;
int w1, h1, w2, h2, 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");
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;
}
ed->dirty = 1;
_edje_recalc(ed);
@ -809,6 +813,33 @@ edje_extern_object_max_size_set(Evas_Object *obj, Evas_Coord maxw, Evas_Coord ma
evas_object_data_del(obj, "\377 edje.maxh");
}
/** Set the object aspect size
* @param obj A valid Evas_Object handle
* @param aw The aspect radio width
* @param ah The aspect ratio height
*
* This sets the desired aspect ratio to keep an object that will be swallowed
* by Edje. The width and height define a preferred size ASPECT and the
* object may be scaled to be larger or smaller, but retaining the relative
* scale of both aspwct width and height.
*/
EAPI void
edje_extern_object_aspect_set(Evas_Object *obj, Evas_Coord aw, Evas_Coord ah)
{
int mw, mh;
mw = aw;
mh = ah;
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)
evas_object_data_set(obj, "\377 edje.asph", (void *)mh);
else
evas_object_data_del(obj, "\377 edje.asph");
}
/** Unswallow an object
* @param obj A valid Evas_Object handle
* @param obj_swallow The swallowed object