Class KFGUI_FloatingWindow extends KFGUI_Page
    abstract;

var() string WindowTitle; // Title of this window.
var float DragOffset[2], OpenAnimSpeed;
var KFGUI_FloatingWindowHeader HeaderComp;
var bool bDragWindow,bUseAnimation;

var float WindowFadeInTime;
var transient float OpenStartTime,OpenEndTime;

function InitMenu()
{
    Super.InitMenu();
    HeaderComp = new (Self) class'KFGUI_FloatingWindowHeader';
    AddComponent(HeaderComp);
}
function ShowMenu()
{
    Super.ShowMenu();
    
    OpenStartTime = GetPlayer().WorldInfo.RealTimeSeconds;
    OpenEndTime = GetPlayer().WorldInfo.RealTimeSeconds + OpenAnimSpeed;
}
function DrawMenu()
{
    local float TempSize;
    
    if( bUseAnimation )
    {
        TempSize = `TimeSinceEx(GetPlayer(), OpenStartTime);
        if ( WindowFadeInTime - TempSize > 0 && FrameOpacity != default.FrameOpacity )
            FrameOpacity = (1.f - ((WindowFadeInTime - TempSize) / WindowFadeInTime)) * default.FrameOpacity;
    }
    
    Owner.CurrentStyle.RenderFramedWindow(Self);
    
    if( HeaderComp!=None )
    {
        HeaderComp.CompPos[3] = Owner.CurrentStyle.DefaultHeight;
        HeaderComp.YSize = HeaderComp.CompPos[3] / CompPos[3]; // Keep header height fit the window height.
    }
}
function SetWindowDrag( bool bDrag )
{
    bDragWindow = bDrag;
    if( bDrag )
    {
        DragOffset[0] = Owner.MousePosition.X-CompPos[0];
        DragOffset[1] = Owner.MousePosition.Y-CompPos[1];
    }
}
function bool CaptureMouse()
{
    local int i;
    
    if( bDragWindow && HeaderComp!=None ) // Always keep focus on window frame now!
    {
        MouseArea = HeaderComp;
        return true;
    }
    
    for( i=0; i<Components.Length; i++ )
    {
        if( Components[i].CaptureMouse() )
        {
            MouseArea = Components[i];
            return true;
        }
    }
    
    MouseArea = None;
    
    return Super(KFGUI_Base).CaptureMouse();
}
function PreDraw()
{
    local float Frac, CenterX, CenterY;
    
    if( bUseAnimation )
    {
        Frac = Owner.CurrentStyle.TimeFraction(OpenStartTime, OpenEndTime, GetPlayer().WorldInfo.RealTimeSeconds);
        XSize = Lerp(default.XSize*0.75, default.XSize, Frac);
        YSize = Lerp(default.YSize*0.75, default.YSize, Frac);
        
        CenterX = (default.XPosition + default.XSize * 0.5) - ((default.XSize*0.75)/2);
        CenterY = (default.YPosition + default.YSize * 0.5) - ((default.YSize*0.75)/2);
        
        XPosition = Lerp(CenterX, default.XPosition, Frac);
        YPosition = Lerp(CenterY, default.YPosition, Frac);
        
        if( bDragWindow )
        {
            XPosition = FClamp(Owner.MousePosition.X-DragOffset[0],0,InputPos[2]-CompPos[2]) / InputPos[2];
            YPosition = FClamp(Owner.MousePosition.Y-DragOffset[1],0,InputPos[3]-CompPos[3]) / InputPos[3];
        }
    }
    
    Super.PreDraw();
}

defaultproperties
{
    bUseAnimation=true
    OpenAnimSpeed=0.05f
    WindowFadeInTime=0.2f
}