Page 1 of 1
Editbox/button text align
Posted: Mon Jul 18, 2005 18:10
by J_A_X
I just wanted to see if it's possible. I know that the static text is easily alignable, but I wanna know for buttons and edit boxes. I can't seem to find a function/property that does so.
Re: Editbox/button text align
Posted: Tue Jul 19, 2005 09:10
by CrazyEddie
The only thing we have in the current releases is a "TextXOffset" property which shifts the text by the given offset.
Re: Editbox/button text align
Posted: Tue Jul 19, 2005 13:35
by J_A_X
only in the x direction eh?
darn, I needed it for y :/
Re: Editbox/button text align
Posted: Wed Jul 20, 2005 08:24
by CrazyEddie
There is a patch of the tracker that adds this ability. The patch was done by me (so you know it's good, right

). This will not however be making it to the core system.
http://sourceforge.net/tracker/index.ph ... tid=605424
Re: Editbox/button text align
Posted: Wed Jul 20, 2005 12:15
by Acrion
How will Falagard handle this in relation to your patch? Will they be compatible?
Re: Editbox/button text align
Posted: Wed Jul 20, 2005 17:35
by CrazyEddie
The "Falagard" system would not respect these settings, which is one reason they will not be put in.
Currently the "Falagard" system has much better configurability on a per-skinned-type basis. There may be other extended possibilities added also, I have not decided yet

Posted: Fri May 12, 2006 03:15
by Rackle
I was wondering if there was an update for this feature for an EditBox. Having the ability to left align (current implementation) is great for text but when displaying numbers a right alignment is more appropriate. Or maybe there's a function I'm not seeing...
Posted: Thu Feb 12, 2009 11:31
by kili
Hi,
I'm trying to add HorzFormatting property to FalEditbox.
In the looknfeel, I wish the Editbox Carat in the right edge
and wrote:
Code: Select all
<ImagerySection name="Carat">
<ImageryComponent>
<Area>
<Dim type="LeftEdge" >
<UnifiedDim scale="1" offset="-5" type="LeftEdge">
<DimOperator op="Subtract">
<ImageDim imageset="Test" image="EditBoxCarat" dimension="Width" />
</DimOperator>
</UnifiedDim>
</Dim>
<!--<Dim type="LeftEdge" ><AbsoluteDim value="0" /></Dim>-->
<Dim type="TopEdge" ><AbsoluteDim value="0" /></Dim>
<Dim type="Width" ><ImageDim imageset="Test" image="EditBoxCarat" dimension="Width" /></Dim>
<Dim type="BottomEdge" ><UnifiedDim scale="1.0" type="BottomEdge" /></Dim>
</Area>
<Image imageset="Test" image="EditBoxCarat" />
<VertFormat type="Stretched" />
<HorzFormat type="Stretched" />
</ImageryComponent>
</ImagerySection>but the carat's width enlarged from 6 pixel to 120 pixel in this line:
Code: Select all
float caratWidth = caratImagery.getBoundingRect(*w, textArea).getWidth();Is there anything wrong?
ps. What I add to the Editbox is
Code: Select all
<Property name="HorzFormatting" value="RightAligned" /> in looknfeel and
FalagardEditboxProperties::HorzFormatting
Posted: Fri Feb 13, 2009 09:45
by CrazyEddie
Hi,
This particular issue was raised in this thread:
http://www.cegui.org.uk/phpBB2/viewtopic.php?t=3651
No further advance has been made with regards to this issue, though I do agree it's something that needs addressing (a mantis ticket has now been added so it's not forgotten, though no ETA on resolution).
CE.
Posted: Fri Feb 13, 2009 10:13
by kili
This is my code today, HTH.
ps. there is a bug, I comment it below.
Code: Select all
void FalagardEditbox::render()
{
Editbox* w = (Editbox*)d_window;
const StateImagery* imagery;
// draw container etc
// get WidgetLookFeel for the assigned look.
const WidgetLookFeel& wlf = getLookNFeel();
// try and get imagery for the approprite state.
imagery = &wlf.getStateImagery(w->isDisabled() ? "Disabled" : (w->isReadOnly() ? "ReadOnly" : "Enabled"));
// peform the rendering operation for the container.
imagery->render(*w);
// get destination area for text
const Rect textArea(wlf.getNamedArea("TextArea").getArea().getPixelRect(*w));
//
// Required preliminary work for text rendering operations
//
Font* font = w->getFont();
// no font == no more rendering
if (!font)
return;
// This will point to the final string to be used for rendering. Useful because it means we
// do not have to have duplicate code or be copying d_text for handling masked/unmasked text.
String* editText;
// Create a 'masked' version of the string if needed.
String maskedText, windowText;
if (w->isTextMasked())
{
maskedText.insert(0, w->getText().length(), w->getMaskCodePoint());
editText = &maskedText;
}
// text not masked to editText will be the windows d_text String.
else
{
windowText = w->getText();
editText = &windowText;
}
// get carat imagery
const ImagerySection& caratImagery = wlf.getImagerySection("Carat");
// store carat width
float caratWidth = caratImagery.getBoundingRect(*w, textArea).getWidth();
// calculate best position to render text to ensure carat is always visible
float textOffset;
float extentToCarat;
float fTextLen; //Total text length
extentToCarat = font->getTextExtent(editText->substr(0, w->getCaratIndex()));
fTextLen = font->getTextExtent(editText->substr(0));
if(d_lastTextOffset == -1000.0f) //begin
{
if(d_horzFormatting == RightAligned)
d_lastTextOffset = textArea.getWidth() - fTextLen - caratWidth;
else
d_lastTextOffset = 0.0;
}
// if box is inactive
if (!w->hasInputFocus())
{
textOffset = d_lastTextOffset;
}
// if carat is to the left of the box
else if ((d_lastTextOffset + extentToCarat) < 0)
{
textOffset = -extentToCarat;
}
// if carat is off to the right.
else if ((d_lastTextOffset + extentToCarat) >= (textArea.getWidth() - caratWidth))
{
if(d_horzFormatting == RightAligned)
textOffset = textArea.getWidth() - fTextLen - caratWidth;
else
textOffset = textArea.getWidth() - extentToCarat - caratWidth;
}
// else carat is already within the box
else
{
//"BUG"-> if carat is off to the left, and right key pressed, this line causes it.
if(d_horzFormatting == RightAligned)
textOffset = textArea.getWidth() - fTextLen - caratWidth;
else
textOffset = d_lastTextOffset;
}
ColourRect colours;
float alpha_comp = w->getEffectiveAlpha();
//
// Draw label text
//
// setup initial rect for text formatting
Rect text_part_rect(textArea);
// allow for scroll position
text_part_rect.d_left += textOffset;
// centre text vertically within the defined text area
text_part_rect.d_top += (textArea.getHeight() - font->getFontHeight()) * 0.5f;
// get unhighlighted text colour (saves accessing property twice)
colour unselectedColour(getUnselectedTextColour());
// draw pre-highlight text
String sect = editText->substr(0, w->getSelectionStartIndex());
colours.setColours(unselectedColour);
colours.modulateAlpha(alpha_comp);
if(d_horzFormatting == RightAligned) //kili 20090213
text_part_rect.d_right = text_part_rect.d_left + font->getTextExtent(sect);
//w->getRenderCache().cacheText(sect, font, LeftAligned, text_part_rect, 0, colours, &textArea);
w->getRenderCache().cacheText(sect, font, (TextFormatting)d_horzFormatting, text_part_rect, 0, colours, &textArea); //kili 20090212
// adjust rect for next section
text_part_rect.d_left += font->getTextExtent(sect);
// draw highlight text
sect = editText->substr(w->getSelectionStartIndex(), w->getSelectionLength());
colours.setColours(getSelectedTextColour());
colours.modulateAlpha(alpha_comp);
if(d_horzFormatting == RightAligned) //kili 20090213
text_part_rect.d_right = text_part_rect.d_left + font->getTextExtent(sect);
//w->getRenderCache().cacheText(sect, font, LeftAligned, text_part_rect, 0, colours, &textArea);
w->getRenderCache().cacheText(sect, font, (TextFormatting)d_horzFormatting, text_part_rect, 0, colours, &textArea); //kili 20090212
// adjust rect for next section
text_part_rect.d_left += font->getTextExtent(sect);
// draw post-highlight text
sect = editText->substr(w->getSelectionEndIndex());
colours.setColours(unselectedColour);
colours.modulateAlpha(alpha_comp);
if(d_horzFormatting == RightAligned) //kili 20090213
text_part_rect.d_right = text_part_rect.d_left + font->getTextExtent(sect);
//w->getRenderCache().cacheText(sect, font, LeftAligned, text_part_rect, 0, colours, &textArea);
w->getRenderCache().cacheText(sect, font, (TextFormatting)d_horzFormatting, text_part_rect, 0, colours, &textArea); //kili 20090212
// remember this for next time.
d_lastTextOffset = textOffset;
// see if the editbox is active or inactive.
bool active = (!w->isReadOnly()) && w->hasInputFocus();
//
// Render selection imagery.
//
if (w->getSelectionLength() != 0)
{
// calculate required start and end offsets of selection imagery.
float selStartOffset = font->getTextExtent(editText->substr(0, w->getSelectionStartIndex()));
float selEndOffset = font->getTextExtent(editText->substr(0, w->getSelectionEndIndex()));
// calculate area for selection imagery.
Rect hlarea(textArea);
hlarea.d_left += textOffset + selStartOffset;
hlarea.d_right = hlarea.d_left + (selEndOffset - selStartOffset);
// render the selection imagery.
wlf.getStateImagery(active ? "ActiveSelection" : "InactiveSelection").render(*w, hlarea, 0, &textArea);
}
//
// Render carat
//
if (active)
{
Rect caratRect(textArea);
caratRect.d_left += extentToCarat + textOffset;
caratImagery.render(*w, caratRect, 0, 0, &textArea);
}
}
size_t FalagardEditbox::getTextIndexFromPosition(const Point& pt) const
{
Editbox* w = (Editbox*)d_window;
//
// calculate final window position to be checked
//
float wndx = CoordConverter::screenToWindowX(*w, pt.d_x);
wndx -= d_lastTextOffset;
if(wndx < 0 ) //kili 20090212
wndx = 0;
//
// Return the proper index
//
if (w->isTextMasked())
{
return w->getFont()->getCharAtPixel(String(w->getText().length(), w->getMaskCodePoint()), wndx);
}
else
{
return w->getFont()->getCharAtPixel(w->getText(), wndx);
}
}and the looknfeel different with TaharezLook is
Code: Select all
<Property name="HorzFormatting" value="RightAligned" />

Posted: Fri Feb 13, 2009 14:28
by CrazyEddie
Thanks, I'll try it out once I get time to work on this side of things
CE.