On Dec 18, 2008, at 6:20 PM, Sciss wrote:
not sure this has been made clear, but in
the current svn version, stringBounds _is_ asynchronous and must be
called on a routine. i don't see any other way of accomplishing the
functionality otherwise...
If it's asynchronous, then at least all of the following break.
There might be some other cases that I missed.
The crucial stuff is especially painful. It means you will not
be able to put any GUI that uses something that uses String:bounds into
any view that has a flow layout decorator, because the decorator needs
to know the bounds synchronously to update properly.
It won't be possible to wrap the uses within crucial library
inside routines, because the user might be putting other views in the
same container. The user's code will continue before crucial's code
gets the bounds back from the swing server. Then the FlowLayout is all
screwed up. That pushes the responsibility for routine-izing gui code
onto users who have the intention of writing crucialized,
cross-platform code ("crucialized" including such basic extensions as
ActionButton, for instance).
I'm not sure if it's possible, but if it is, the best solution
would be to have compiler switches in _String_GetBounds so that it can
be done transparently. The current hack in String:bounds (which
replaces the call to the swing server with an estimate by
multiplication) is an inaccurate hack; asking the server for exact
bounds but requiring every user to be aware of this is (IMO) an ugly
hack. But they're both hacks.
Sorry for being blunt -- I know this is a difficult problem, and
I don't know anything about how to solve it in Linux or Windows. So
maybe I should keep my mouth shut :-)
hjh
StringPlusGUI
drawLeftJustIn
{ arg rect, font, color;
var pos,
bounds;
bounds =
this.bounds( font );
pos =
bounds.centerIn(rect);
pos.x =
rect.left + 2;
this.drawAtPoint(pos,
font, color);
}
drawRightJustIn
{ arg rect, font, color;
var pos,
bounds;
bounds =
this.bounds( font );
pos =
bounds.centerIn(rect);
pos.x =
rect.right - 2 - bounds.width;
this.drawAtPoint(pos,
font, color);
}
ActionButton
init
{ arg layout,title,function,minWidth=20,minHeight,color,backcolor,font;
var
environment,optimalWidth;
title =
title.asString;
if(title.size
> 40,{ title = title.copyRange(0,40) });
if(font.isNil,{
font = GUI.font.new(*GUI.skin.fontSpecs) });
optimalWidth
= title.bounds(font).width;
PatchGui
argNameWidth
= model.instr.argNames.maxValue({ |an| an.asString.bounds(font).width +
7 });
: H. James Harkins
.::!:.:.......:.::........:..!.::.::...:..:...:.:.:.:..:
"Come said the Muse,
Sing me a song no poet has yet chanted,
Sing me the universal." -- Whitman