Page 1 of 1

[Solved] Framewindow inner rect problem

Posted: Thu Sep 24, 2009 18:40
by fedyakin
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 ----

Re: Framewindow inner rect problem

Posted: Thu Sep 24, 2009 20:27
by CrazyEddie
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.

Re: Framewindow inner rect problem

Posted: Thu Sep 24, 2009 20:58
by fedyakin
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>

Re: Framewindow inner rect problem

Posted: Fri Sep 25, 2009 01:52
by fedyakin
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);

Re: Framewindow inner rect problem

Posted: Fri Sep 25, 2009 08:31
by CrazyEddie
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.

Re: Framewindow inner rect problem

Posted: Fri Sep 25, 2009 13:41
by CrazyEddie
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.

Re: Framewindow inner rect problem

Posted: Fri Sep 25, 2009 17:29
by fedyakin
That was fast, thanks :)