//============================================================================== // Created on: 10/15/2003 // *cough*UWindows2*cough* // // Written by Ron Prestenback // © 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class FloatingWindow extends PopupPageBase; var automated GUIHeader t_WindowTitle; var() GUIButton b_ExitButton; var() localized string WindowName; var() float MinPageWidth, MinPageHeight, MaxPageHeight, MaxPageWidth; var() editconst bool bResizeWidthAllowed, bResizeHeightAllowed, bResizing, bMoveAllowed, bMoving; var() editconst bool TSizing, RSizing, LSizing, BtSizing, TLSizing, TRSizing, BRSizing, BLSizing; var() config float DefaultLeft, DefaultTop, DefaultWidth, DefaultHeight; var() int HeaderMouseCursorIndex; function InitComponent( GUIController MyController, GUIComponent MyOwner ) { Super.InitComponent( MyController, MyOwner ); t_WindowTitle.SetCaption(WindowName); if ( bMoveAllowed ) { // Set bAcceptsInput so that it will become the Controller's active control when moused over t_WindowTitle.bAcceptsInput = True; t_WindowTitle.MouseCursorIndex = HeaderMouseCursorIndex; } AddSystemMenu(); i_FrameBG.OnPreDraw=AlignFrame; } function bool AlignFrame(Canvas C) { i_FrameBG.WinHeight = i_FrameBG.RelativeHeight(ActualHeight() - t_WindowTitle.ActualHeight()*0.5); i_FrameBG.WinTop = i_FrameBG.RelativeTop(ActualTop() + t_WindowTitle.ActualHeight()*0.5); return bInit; } function AddSystemMenu() { local eFontScale tFontScale; b_ExitButton = GUIButton(t_WindowTitle.AddComponent( "XInterface.GUIButton" )); b_ExitButton.Style = Controller.GetStyle("CloseButton",tFontScale); b_ExitButton.OnClick = XButtonClicked; b_ExitButton.bNeverFocus=true; b_ExitButton.FocusInstead = t_WindowTitle; b_ExitButton.RenderWeight=1; b_ExitButton.bScaleToParent=false; b_ExitButton.OnPreDraw = SystemMenuPreDraw; // Do not want OnClick() called from MousePressed() b_ExitButton.bRepeatClick = False; } function bool SystemMenuPreDraw(canvas Canvas) { b_ExitButton.SetPosition( t_WindowTitle.ActualLeft() + (t_WindowTitle.ActualWidth()-35), t_WindowTitle.ActualTop(), 24, 24, true); return true; } function CheckBounds() { local float AH, AW, AL, AT; AW = FClamp(ActualWidth(), 0.0, Controller.ResX); AH = FClamp(ActualHeight(), 0.0, Controller.ResY); AT = FClamp(ActualTop(), 0.0, Controller.ResY - AH); AL = FClamp(ActualLeft(), 0.0, Controller.ResX - AW); SetPosition( AL, AT, AW, AH, True ); } function SetDefaultPosition() { local float RH, RW; if ( !bPositioned ) return; bInit = False; if ( !bResizeWidthAllowed ) DefaultWidth = WinWidth; if ( !bResizeHeightAllowed ) DefaultHeight = WinHeight; if ( !bMoveAllowed ) { DefaultLeft = WinLeft; DefaultTop = WinTop; } RW = FClamp( RelativeWidth(DefaultWidth), RelativeWidth(MinPageWidth), RelativeWidth(MaxPageWidth) ); RH = FClamp( RelativeHeight(DefaultHeight), RelativeHeight(MinPageHeight), RelativeHeight(MaxPageHeight) ); SetPosition( FClamp( RelativeLeft(DefaultLeft), 0.0, RelativeLeft(Controller.ResX) - RW), FClamp( RelativeTop(DefaultTop), 0.0, RelativeTop(Controller.ResY) - RH), RW, RH ); } function InternalOnCreateComponent(GUIComponent NewComp, GUIComponent Sender) { if ( Sender == Self ) { NewComp.bBoundToParent = True; NewComp.bScaleToParent = True; if ( !bResizeHeightAllowed && bResizeWidthAllowed ) NewComp.ScalingType = SCALE_X; else if ( !bResizeWidthAllowed && bResizeHeightAllowed ) NewComp.ScalingType = SCALE_Y; } } event SetFocus(GUIComponent Who) { if ( UT2K4GUIController(Controller) != None ) UT2K4GUIController(Controller).SetFocusTo(Self); Super.SetFocus(Who); } function FloatingMousePressed( GUIComponent Sender, bool bRepeat ) { if ( Controller == None || bRepeat ) return; // If ResizeAllowed, set bCaptureMouse in order to receive OnCapturedMouseMove() calls TSizing = bResizeHeightAllowed && HoveringTopBorder(); RSizing = bResizeWidthAllowed && HoveringRightBorder(); LSizing = bResizeWidthAllowed && HoveringLeftBorder(); BtSizing = bResizeHeightAllowed && HoveringBottomBorder(); bMoving = bMoveAllowed && Controller.ActiveControl == t_WindowTitle && !(TSizing || RSizing || BtSizing || LSizing); if ( TSizing ) { if ( RSizing || LSizing ) { TRSizing = RSizing; TLSizing = LSizing; TSizing = False; RSizing = False; LSizing = False; } } else if ( BtSizing ) { if ( RSizing || LSizing ) { BRSizing = RSizing; BLSizing = LSizing; BtSizing = False; RSizing = False; LSizing = False; } } if ( bMoving ) { SetMouseCursorIndex(1); UpdateOffset(ClientBounds[0], ClientBounds[1], ClientBounds[2], ClientBounds[3]); } bResizing = bMoving || TSizing || TRSizing || RSizing || BRSizing || BtSizing || BLSizing || LSizing || TLSizing; bCaptureMouse = bResizing; t_WindowTitle.bCaptureMouse = bCaptureMouse; } function FloatingMouseRelease( GUIComponent Sender ) { local bool bSave; // Unset bCaptureMouse bSave = bCaptureMouse; bResizing = False; bCaptureMouse = False; t_WindowTitle.bCaptureMouse = False; if ( bMoving ) { SetPosition( Controller.MouseX - MouseOffset[0], Controller.MouseY - MouseOffset[1], WinWidth, WinHeight, True ); CheckBounds(); } // Reset sizing vars bMoving = False; TSizing = False; BtSizing = False; RSizing = False; LSizing = False; TLSizing = False; BLSizing = False; TRSizing = False; BRSizing = False; SetMouseCursorIndex(default.MouseCursorIndex); UpdateOffset( -1, -1, -1, -1 ); if ( bSave ) SaveCurrentPosition(); } function SaveCurrentPosition() { DefaultLeft = WinLeft; DefaultTop = WinTop; DefaultWidth = WinWidth; DefaultHeight = WinHeight; SaveConfig(); } function bool FloatingHover( GUIComponent Sender ) { if ( !ResizeAllowed() ) return false; if ( bCaptureMouse ) return true; // If mouse is near a border, allow resizing if ( bResizeHeightAllowed && bResizeWidthAllowed && (BLSizing || TRSizing || HoveringBottomLeft()) ) SetMouseCursorIndex(2); else if ( bResizeHeightAllowed && bResizeWidthAllowed && (TLSizing || BRSizing || HoveringTopLeft()) ) SetMouseCursorIndex(4); else if ( bResizeHeightAllowed && (TSizing || BtSizing || HoveringTopBorder() || HoveringBottomBorder()) ) SetMouseCursorIndex(3); else if ( bResizeWidthAllowed && (LSizing || RSizing || HoveringLeftBorder() || HoveringRightBorder()) ) SetMouseCursorIndex(5); else SetMouseCursorIndex(default.MouseCursorIndex); return true; } function SetPanelPosition(Canvas C); function bool FloatingPreDraw( Canvas C ) { local float OldW, OldH, DiffX, DiffY, AW, AT, AH, AL; InternalOnPreDraw(C); if ( bInit ) SetDefaultPosition(); if ( !bCaptureMouse || bMoving ) return false; SetPanelPosition(C); AL = ActualLeft(); AT = ActualTop(); AW = ActualWidth(); AH = ActualHeight(); OldH = AH; OldW = AW; // Top Left if( TLSizing ) { DiffX = Controller.MouseX - AL; DiffY = Controller.MouseY - AT; WinWidth = RelativeWidth( FClamp( AW - DiffX, ActualWidth(MinPageWidth), ActualWidth(MaxPageWidth) ) ); WinHeight = RelativeHeight(FClamp(AH - DiffY, ActualHeight(MinPageHeight), ActualHeight(MaxPageHeight))); SetPosition( AL + OldW - ActualWidth(), AT + OldH - ActualHeight(), WinWidth, WinHeight, True ); ResizedBoth(); return true; } if ( TRSizing ) { DiffX = Controller.MouseX - (AL + AW); DiffY = Controller.MouseY - AT; WinHeight = RelativeHeight(FClamp(AH - DiffY, ActualHeight(MinPageHeight), ActualHeight(MaxPageHeight))); SetPosition( WinLeft, (AT + OldH) - ActualHeight(), FClamp(AW + DiffX, ActualWidth(MinPageWidth), ActualWidth(MaxPageWidth)), WinHeight, True ); ResizedBoth(); return true; } if ( BLSizing ) { DiffX = Controller.MouseX - AL; DiffY = Controller.MouseY - (AT + AH); WinWidth = RelativeWidth( FClamp(AW - DiffX, ActualWidth(MinPageWidth), ActualWidth(MaxPageWidth)) ); SetPosition( (AL + OldW) - ActualWidth(), WinTop, WinWidth, FClamp(AH + DiffY, ActualHeight(MinPageHeight), ActualHeight(MaxPageHeight)), True ); ResizedBoth(); return true; } if ( BRSizing ) { DiffX = Controller.MouseX - (AL + AW); DiffY = Controller.MouseY - (AT + AH); SetPosition( WinLeft, WinTop, FClamp(AW + DiffX, ActualWidth(MinPageWidth), ActualWidth(MaxPageWidth)), FClamp(AH + DiffY, ActualHeight(MinPageHeight), ActualHeight(MaxPageHeight)), True ); ResizedBoth(); return true; } // Top if ( TSizing ) { DiffY = Controller.MouseY - AT; WinHeight = RelativeHeight( FClamp(AH - DiffY, ActualHeight(MinPageHeight), ActualHeight(MaxPageHeight))); SetPosition( WinLeft, (AT + OldH) - ActualHeight(), WinWidth, WinHeight, True ); ResizedHeight(); return true; } // Left if( LSizing ) { DiffX = Controller.MouseX - AL; WinWidth = RelativeWidth( FClamp(AW - DiffX, ActualWidth(MinPageWidth), ActualWidth(MaxPageWidth)) ); SetPosition( (AL + OldW) - ActualWidth(), WinTop, WinWidth, WinHeight, True ); ResizedWidth(); return true; } // Right if( RSizing ) { DiffX = Controller.MouseX - (AL + AW); SetPosition( WinLeft, WinTop, FClamp(AW + DiffX, ActualWidth(MinPageWidth), ActualWidth(MaxPageWidth)), WinHeight, True ); ResizedWidth(); return true; } // Bottom if( BtSizing ) { DiffY = Controller.MouseY - (AT + AH); SetPosition( WinLeft, WinTop, WinWidth, FClamp(AH + DiffY, ActualHeight(MinPageHeight), ActualHeight(MaxPageHeight)), True ); ResizedHeight(); return true; } return false; } function FloatingRendered( Canvas C ) { if ( !bMoving ) return; C.SetPos( FClamp(Controller.MouseX - MouseOffset[0], 0.0, Controller.ResX - ActualWidth()), FClamp(Controller.MouseY - MouseOffset[1], 0.0, Controller.ResY - ActualHeight()) ); C.SetDrawColor(255,255,255,255); C.DrawTileStretched( Controller.WhiteBorder, ActualWidth(), ActualHeight() ); } // ===================================================================================================================== // ===================================================================================================================== // Notification // ===================================================================================================================== // ===================================================================================================================== event ResolutionChanged( int ResX, int ResY ) { bInit = True; Super.ResolutionChanged(ResX,ResY); } function ResizedBoth(); function ResizedWidth(); function ResizedHeight(); // ===================================================================================================================== // ===================================================================================================================== // Utility // ===================================================================================================================== // ===================================================================================================================== function bool ResizeAllowed() { return bResizeHeightAllowed || bResizeWidthAllowed; } function bool HoveringLeftBorder() { if ( Controller == None ) return false; return Controller.MouseX > (Bounds[0] - 5) && Controller.MouseX < (Bounds[0] + 5); } function bool HoveringRightBorder() { if ( Controller == None ) return false; return Controller.MouseX > (Bounds[2] - 5) && Controller.MouseX < (Bounds[2] + 5); } function bool HoveringTopBorder() { if ( Controller == None ) return false; return Controller.MouseY > (Bounds[1] - 5) && Controller.MouseY < (Bounds[1] + 5); } function bool HoveringBottomBorder() { if ( Controller == None ) return false; return Controller.MouseY > (Bounds[3] - 5) && Controller.MouseY < (Bounds[3] + 5); } function bool HoveringTopLeft() { return (HoveringLeftBorder() && HoveringTopBorder()) || (HoveringRightBorder() && HoveringBottomBorder()); } function bool HoveringBottomLeft() { return (HoveringRightBorder() && HoveringTopBorder()) || (HoveringLeftBorder() && HoveringBottomBorder()); } function bool XButtonClicked( GUIComponent Sender ) { Controller.CloseMenu(False); return true; } function SetMouseCursorIndex( int NewIndex ) { MouseCursorIndex = NewIndex; if ( MouseCursorIndex == default.MouseCursorIndex ) t_WindowTitle.MouseCursorIndex = HeaderMouseCursorIndex; else t_WindowTitle.MouseCursorIndex = NewIndex; } defaultproperties { bResizeHeightAllowed=True bResizeWidthAllowed=True bMoveAllowed=True bRequire640x480=False bRenderWorld=True bCaptureInput=False InactiveFadeColor=(R=255,B=255,G=255,A=255) HeaderMouseCursorIndex=1 Begin Object Class=GUIHeader Name=TitleBar WinWidth=1 WinHeight=0.043750 WinLeft=0 WinTop=0 RenderWeight=0.1 FontScale=FNS_Small bUseTextHeight=True bAcceptsInput=True bNeverFocus=False bBoundToParent=true bScaleToParent=true OnMousePressed=FloatingMousePressed OnMouseRelease=FloatingMouseRelease ScalingType=SCALE_X End Object t_WindowTitle=TitleBar DefaultLeft=0.2 DefaultTop=0.2 DefaultWidth=0.6 DefaultHeight=0.6 MinPageWidth=0.1 MaxPageWidth=1.0 MinPageHeight=0.1 MaxPageHeight=1.0 // The Magic OnCreateComponent=InternalOnCreateComponent OnMousePressed=FloatingMousePressed OnMouseRelease=FloatingMouseRelease OnHover=FloatingHover OnPreDraw=FloatingPreDraw OnRendered=FloatingRendered // Debugging The Magic // bDebugging=True }