[Solved] Framewindow inner rect problem

For help with general CEGUI usage:
- Questions about the usage of CEGUI and its features, if not explained in the documentation.
- Problems with the CMAKE configuration or problems occuring during the build process/compilation.
- Errors or unexpected behaviour.

Moderators: CEGUI Team, CEGUI Tools Developer, CEGUI MVP

[Solved] Framewindow inner rect problem

Postby fedyakin » Thu Sep 24, 2009 6:40 pm

I'm experiencing a problem with frame windows that appears to be inner rect related. When the window is first show, it does not appear to account for the titlebar when calculating the inner rect. If the window is moved and then deactivated the area is closer to correct. Resizing it results in the expected area. Hopefully the following pictures make clear the problem.
First Shown:
Image
Moved:
Image
Resized:
Image

The behavior occurs with both the AquaLook and TaharezLook schemes, so it doesn't seem to be related to the skin being used. I've tried using setArea() and invalidate() on the windows after loading the layout, but that had no effect. Is anyone experiencing a similar problem?

CEGUI Log:
11:11:09.234(0688)@INFO:CEGUI@ ---- Version 0.7.0 (Build: Sep 22 2009 Debug Microsoft Windows MSVC++ 8.0 32 bit) ----
11:11:09.234(0688)@INFO:CEGUI@ ---- Renderer module is: CEGUI::OgreRenderer - Official OGRE based 2nd generation renderer module. ----
11:11:09.234(0688)@INFO:CEGUI@ ---- XML Parser module is: CEGUI::TinyXMLParser - Official tinyXML based parser module for CEGUI ----
11:11:09.250(0688)@INFO:CEGUI@ ---- Image Codec module is: OgreImageCodec - Integrated ImageCodec using the Ogre engine. ----
11:11:09.250(0688)@INFO:CEGUI@ ---- Scripting module is: None ----
Last edited by fedyakin on Fri Sep 25, 2009 5:29 pm, edited 1 time in total.
fedyakin
Not too shy to talk
Not too shy to talk
 
Posts: 22
Joined: Thu Apr 17, 2008 6:13 am
Location: Arizona, United States of America

Re: Framewindow inner rect problem

Postby CrazyEddie » Thu Sep 24, 2009 8:27 pm

Hi,

I just ran a quick test, but did not reproduce the issue. Can you tell us if you're creating the layout in code or via XML, if via XML can you post the XML (or PM if you don't want to post publicly). Also is the frame window being rendered to a texture target or a normal viewport type target.

Cheers,

CE.
User avatar
CrazyEddie
CEGUI Project Lead
 
Posts: 6753
Joined: Wed Jan 12, 2005 12:06 pm
Location: England

Re: Framewindow inner rect problem

Postby fedyakin » Thu Sep 24, 2009 8:58 pm

The interface should be rendering to a viewport target (its using the default constructor of CEGUI::OgreRenderer). I think the frame window is rendering to a texture though because AutoRenderingSurface is true for FrameWindow in the looknfeel file. Changing that property had no effect.

The window is from the following layout. We make use of the PropertyCallback to loadWindowLayout, so you might have to comment out a property or two to use the layout. (As an aside, I was impressed by the foresight in that feature :) )
Code: Select all
<?xml version="1.0" encoding="UTF-8"?>
<GUILayout >
    <Window Type="TaharezLook/FrameWindow" Name="DevelopmentWin" >
        <Property Name="SaveVis" Value="True" />
        <Property Name="Visible" Value="False" />
        <Property Name="AlwaysOnTop" Value="True" />
        <Property Name="CloseButtonEnabled" Value="False" />
        <Property Name="Text" Value="Interface Development" />
        <Property Name="UnifiedAreaRect" Value="{{1,-349},{0,63},{1,0},{0,313}}" />
        <Window Type="TaharezLook/MultiLineEditbox" Name="DevelopmentWin_Result" >
            <Property Name="ReadOnly" Value="True" />
            <Property Name="Text" Value="
"/> <!-- This newline is a workaround for a bug in multiline editboxes.  Don't remove it until that's fixed -->
            <Property Name="UnifiedAreaRect" Value="{{0,0},{0,0},{1,0},{.5,-3}}" />
        </Window>
        <Window Type="TaharezLook/MultiLineEditbox" Name="DevelopmentWin_Command" >
            <Property Name="MaxTextLength" Value="300" />
            <Property Name="UnifiedAreaRect" Value="{{0,0},{.5,3},{1,0},{1,-40}}" />
        </Window>
        <Window Type="TaharezLook/Button" Name="DevelopmentWin_Reload" >
            <Property Name="Tooltip" Value="Reload the entire UI, including scripts and layout files" />
            <Property Name="Text" Value="Reload" />
            <Property Name="UnifiedAreaRect" Value="{{0,0},{1,-40},{0,110},{1,0}}" />
        </Window>
        <Window Type="TaharezLook/Button" Name="DevelopmentWin_Game" >
            <Property Name="Tooltip" Value="Load the UI in Game mode" />
            <Property Name="Text" Value="G" />
            <Property Name="UnifiedAreaRect" Value="{{0.5,-50},{1,-40},{0.5,0},{1,0}}" />
        </Window>
        <Window Type="TaharezLook/Button" Name="DevelopmentWin_Startup" >
            <Property Name="Text" Value="S" />
            <Property Name="Tooltip" Value="Load the UI in Startup mode" />
            <Property Name="UnifiedAreaRect" Value="{{0.5,0},{1,-40},{0.5,50},{1,0}}" />
        </Window>
        <Window Type="TaharezLook/Button" Name="DevelopmentWin_Execute" >
            <Property Name="Tooltip" Value="Execute the entered script" />
            <Property Name="Text" Value="Execute" />
            <Property Name="UnifiedAreaRect" Value="{{1,-110},{1,-40},{1,0},{1,0}}" />
        </Window>
    </Window>
</GUILayout>
fedyakin
Not too shy to talk
Not too shy to talk
 
Posts: 22
Joined: Thu Apr 17, 2008 6:13 am
Location: Arizona, United States of America

Re: Framewindow inner rect problem

Postby fedyakin » Fri Sep 25, 2009 1:52 am

I believe I have figured out how to reproduce the problem. It occurs if the framewindow is never sized while visible. In the layout file above, the framewindow's 'Visible' property is set to false, and the window is shown in response to a key press.

In case it helps, the following snippet after loading a layout causes the window to be drawn as expected...
Code: Select all
const bool wasVisible = window->isVisible();
window->show();
const CEGUI::URect oldArea = window->getArea();
window->setArea(CEGUI::URect(CEGUI::UDim(0, 0), CEGUI::UDim(0, 0), CEGUI::UDim(1, 0), CEGUI::UDim(1, 0)));
window->setArea(oldArea);
window->setVisible(wasVisible);
fedyakin
Not too shy to talk
Not too shy to talk
 
Posts: 22
Joined: Thu Apr 17, 2008 6:13 am
Location: Arizona, United States of America

Re: Framewindow inner rect problem

Postby CrazyEddie » Fri Sep 25, 2009 8:31 am

Hi, thanks for posting the layout and other info; I'll test it out and get back to you about it, though basically it seems that somewhere we're not invalidating the cached area rects when we should be.

We make use of the PropertyCallback to loadWindowLayout ... I was impressed by the foresight in that feature :)

Thanks, this was put in after a feature request from a user some years back, since then it's proven useful in many scenarios :)

CE.
User avatar
CrazyEddie
CEGUI Project Lead
 
Posts: 6753
Joined: Wed Jan 12, 2005 12:06 pm
Location: England

Re: Framewindow inner rect problem

Postby CrazyEddie » Fri Sep 25, 2009 1:41 pm

Ok. This issue is fixed in svn branc v0-7 r2265.

Interesting point here: while for child content the issue only manifests itself in 0.7.0 because of the inner rect / client area fix in that release, the actual bug (checking titlebar visibility instead of the correct option setting) has been present for many years - so nice find :)

CE.
User avatar
CrazyEddie
CEGUI Project Lead
 
Posts: 6753
Joined: Wed Jan 12, 2005 12:06 pm
Location: England

Re: Framewindow inner rect problem

Postby fedyakin » Fri Sep 25, 2009 5:29 pm

That was fast, thanks :)
fedyakin
Not too shy to talk
Not too shy to talk
 
Posts: 22
Joined: Thu Apr 17, 2008 6:13 am
Location: Arizona, United States of America


Return to General Help

Who is online

Users browsing this forum: No registered users and 3 guests