Page 1 of 1

StaticText without Scrollbars

Posted: Fri Nov 07, 2008 18:52
by daves
What is the easiest way for me to create a custom widget that is identical to a StaticText widget (in terms of the properties and the setters), except that it does not include any child scrollbars, nor any of the functionality associated with scrollbars?

I was thinking of taking the looknfeel definition of a StaticText and simply stripping out everything that relates to scrollbar. However when I look at the scheme file entry for StaticText it is associated with a Falagard/StaticText. Does the Falagard/StaticText expect to find child scrollbars?

Within one of my specialized functions, I currently instantiate a number of these StaticText items and never use the scrollbars. I want to eliminate them for performance reasons only. So I want to do a simple refactor that replaces my creation of StaticText items (for the specific function of interest only) with the trimmed down object. I want to refactor in a fashion that I can be sure that all the current properties and functions of the StaticText still work.

The Falagard documentation says:
Child widget definitions:

* Scrollbar based widget with name suffix "__auto_vscrollbar__". This widget will be used to control vertical scroll position.
* Scrollbar based widget with name suffix "__auto_hscrollbar__". This widget will be used to control horizontal scroll position.


These seem to be required, though the area elements are optional:
# TextRenderAreaHScroll – Target area where text will appear when the horizontal scrollbar is visible. Optional.
# TextRenderAreaVScroll – Target area where text will appear when the vertical scrollbar is visible. Optional.
# TextRenderAreaHVScroll – Target area where text will appear when both the horizontal and vertical scrollbars are visible. Optional.

Posted: Sat Nov 08, 2008 10:23
by CrazyEddie
Hi,

From a technical standpoint, within the code there is no such thing as a StaticText widget - it's just a DefaultWindow that is customised via the WindowRenderer. And no, I'm actually not going to say you need to write a new WindowRenderer :P

I've looked over the StaticText WindowRenderer and I can't quite make out why those non-scrollbar related properties are there and not implemented via the WidgetLook specification.

Anyway, as far as I can tell you can get what you need (a widget that displays text with configurable colours and horz/vert formatting) by using the default window / default window renderer and a WidgetLook definition that first adds the required properties (TextColours, HorzFormatting and VertFormatting) via PropertyDefinition elements. The core of the widget would then be a TextComponent element that defines an area for the text to appear and uses ColourRectProperty, HorzFormatProperty and VertFormatProperty to fetch the required formatting from the earlier defined properties. Beyond this, the rest of the widget imagery can be coped from the existing static text.

No specific example since I think you have the experience to understand the above :) If you need a specific example, ask and I'll do my best.

CE.

Posted: Sat Nov 08, 2008 13:52
by daves
thx, i'll give it a crank, btw i've been away from the forums for almost two months, indeed i've been away from my cegui project for about that long. Its good to get back into it (even if i only get a chance to do a little bit). I'm still waiting for our company to kick in some real R&D dollars to keep on building.

thx for the help.

Posted: Mon Nov 10, 2008 09:11
by Pompei2
Hi Daves, I have something that may make you happy. That is no R&D Dollars ;) but I made a widget named "Label" that I use to render text, without any scrollbar or text wrapping functionality whatsoever.

Here is ArkanaLook.Label.looknfeel:

Code: Select all

<?xml version="1.0" ?>

<Falagard>
   <!--
   ***************************************************
   Just simple text, nothing more.
   ***************************************************
   -->

   <WidgetLook name="ArkanaLook/Label">

      <!-- The Property definitions. These are properties you can set in your layout/code. -->
      <!-- ******************************************************************************* -->

      <PropertyDefinition name="TextColourNormal" initialValue="FF373737" redrawOnWrite="true" />
      <PropertyDefinition name="TextColourDisabled" initialValue="FF1B56A0" redrawOnWrite="true" />
      <PropertyDefinition name="VertFormat" initialValue="CentreAligned" redrawOnWrite="true" />
      <PropertyDefinition name="HorzFormat" initialValue="LeftAligned" redrawOnWrite="true" />

      <Property name="WantsMultiClickEvents" value="False" />
      <Property name="Font" value="old2" />

      <!-- The Imagery sections. This specifies how a section is drawn. -->
      <!-- ************************************************************ -->

      <!-- This section draws the text and that's all. -->
      <ImagerySection name="label">
         <TextComponent>
            <Area>
               <Dim type="LeftEdge"><AbsoluteDim value="0" /></Dim>
               <Dim type="TopEdge"><AbsoluteDim value="0" /></Dim>
               <Dim type="Width"><UnifiedDim scale="1" type="Width" /></Dim>
               <Dim type="Height"><UnifiedDim scale="1" type="Height" /></Dim>
            </Area>
            <VertFormatProperty name="VertFormat" />
            <HorzFormatProperty name="HorzFormat" />
         </TextComponent>
      </ImagerySection>

      <!-- The Imagery states. This specifies what sections are drawn in wich state. -->
      <!-- ************************************************************************* -->

      <!-- Enabled -->
      <StateImagery name="Enabled">
         <Layer>
            <Section section="label">
               <ColourProperty name="TextColourNormal" />
            </Section>
         </Layer>
      </StateImagery>

      <!-- Disabled -->
      <StateImagery name="Disabled">
         <Layer>
            <Section section="label">
               <ColourProperty name="TextColourDisabled" />
            </Section>
         </Layer>
      </StateImagery>

   </WidgetLook>
</Falagard>


and this is the scheme entry:

Code: Select all

    <LookNFeel Filename="ArkanaLook.Label.looknfeel" />
    <FalagardMapping WindowType="ArkanaLook/Label" TargetType="DefaultWindow" Renderer="Falagard/Default" LookNFeel="ArkanaLook/Label" />


Hope that is useful for you.

Posted: Mon Nov 10, 2008 17:03
by daves
Thanks. One more quick comment, though I am not using the scrollbars associated with the StaticText, I have been using the "frame" (sometimes showing it, sometimes not). There are a number of "with frame" and "without frame" sections to the StaticText looknfeel. I'm trying to figure out how to reuse all these, so that the only thing that I've eliminated is the scrollbars themselves.

Posted: Mon Nov 10, 2008 18:32
by Jamarr
How do you even get scrollbars working with the StaticText widget? Like this guy, geniephics, the scrollbars for the default StaticText widget are never shown, even though the widget is properly defined to have them in the .looknfeel (TaharezLook and WindowsLook). It also does not provide word wrapping.

Are you using version of cegui checked out from SVN or something?

Posted: Tue Nov 11, 2008 09:52
by CrazyEddie
daves wrote:There are a number of "with frame" and "without frame" sections to the StaticText looknfeel. I'm trying to figure out how to reuse all these, so that the only thing that I've eliminated is the scrollbars themselves.


There will be limits to the amount of what I will call reuse without redefinition that will be possible. We already reuse ImageySections from the common "StaticShared" definition for the supplied StaticImage and StaticText definitions. This is done by specifying a WidgetLook within the Section element(s) when specifying the imagery layers in the StateImagery definitions (obviously if you're basing this on a DefaultWindow, you just have the Enabled and Disabled states to work with. But anyway, as seen here:

Code: Select all

<Section look="TaharezLook/StaticShared" section="frame" />

This can be placed in any other WidgetLook and it will reuse that section that was defined within "TaharezLook/StaticShared" WidgetLook.

Obviously when using the DefaultWindow WindowRenderer you lose some of the customisations as far as enabling and disabling the frame, although you can get some of that back by the use of control properties. Basically you define a property that will be set to boolean "True" or "False", and then use that property to control whether or not a particular Section within the StateImagery will be drawn or not. For example:

Code: Select all

<Section look="TaharezLook/StaticShared" section="frame" controlProperty="FrameEnabled" />

(this assumes that you added a PropertyDefinition for the "FrameEnabled" property earlier in the WidgetLook Definition.

Jamarr wrote:How do you even get scrollbars working with the StaticText widget?

The scrollbar use is disabled by default, to enable to scrollbar do something like:

Code: Select all

myStaticText->setProperty( "VertScrollbar", "True" );

Or you can obviously use the property in a layout.

HTH

CE

Posted: Sat Nov 15, 2008 23:12
by Pompei2
Jamarr wrote:How do you even get scrollbars working with the StaticText widget? Like this guy, geniephics, the scrollbars for the default StaticText widget are never shown, even though the widget is properly defined to have them in the .looknfeel (TaharezLook and WindowsLook). It also does not provide word wrapping.

Are you using version of cegui checked out from SVN or something?

Huh ? I am still using some 0.5 svn version from before 0.6 was out ! Had to do nothing special, word wrapping and scrollbars, just put this into your layout:

Code: Select all

            <Property Name="HorzFormatting"  Value="WordWrapLeftAligned" />
            <Property Name="VertScrollbar"   Value="True" />
            <Property Name="HorzScrollbar"   Value="True" />