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" />



:oops:

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.