// Menu system written by Marco. Class KFGUI_Base extends Object abstract; var KF2GUIController Owner; var KFGUI_Base ParentComponent; // Parent component if any. var transient Canvas Canvas; enum EMenuSound { MN_Focus, MN_LostFocus, MN_ClickButton, MN_ClickCheckboxOn, MN_ClickCheckboxOff, MN_Dropdown, MN_DropdownChange, }; var() float XPosition,YPosition,XSize,YSize; var() name ID; // Just for internal purposes, you can give the components unique ID values. var() int IDValue; // Integer ID value. var transient float CompPos[4],InputPos[4]; var float TimerRate,TimerCounter; var localized string Caption; var localized string Hint; var transient KFGUI_Base MouseArea; // Next in recurse line of the mouse pointer focus area. var() bool bDisabled,bClickable,bCanFocus; var bool bFocusedPostDrawItem; // If this component has been given input focus, should it receive draw menu call after everything else been drawn? var bool bTimerActive,bLoopTimer; var transient bool bFocused; function InitMenu(); // Menu was initialized for the first time. function ShowMenu(); // Menu was opened. function PreDraw() { ComputeCoords(); Canvas.SetDrawColor(255,255,255); Canvas.SetOrigin(CompPos[0],CompPos[1]); Canvas.SetClip(CompPos[0]+CompPos[2],CompPos[1]+CompPos[3]); DrawMenu(); } function DrawMenu(); // Draw menu now. function CloseMenu(); // Menu was closed. function MenuTick(float DeltaTime) { if (bTimerActive && (TimerCounter-=DeltaTime)<=0.f) { if (bLoopTimer) TimerCounter = TimerRate; else bTimerActive = false; Timer(); } } final function SetTimer(float Rate, optional bool bLoop) { bTimerActive = (Rate>0.f); if (bTimerActive) { bLoopTimer = bLoop; TimerRate = Rate; TimerCounter = Rate; } } function Timer(); function MouseEnter() { bFocused = true; OnFocus(Self,True); } function MouseLeave() { bFocused = false; OnFocus(Self,False); } function MouseClick(bool bRight); function MouseRelease(bool bRight); function DoubleMouseClick(bool bRight) // User rapidly double clicked this component. { MouseClick(bRight); } function ScrollMouseWheel(bool bUp); final function PlayerController GetPlayer() { return Owner.PlayerOwner; } function SetDisabled(bool bDisable) { bDisabled = bDisable; } Delegate OnFocus(KFGUI_Base Sender, bool bBecame); final function ComputeCoords() { CompPos[0] = XPosition*InputPos[2]+InputPos[0]; CompPos[1] = YPosition*InputPos[3]+InputPos[1]; CompPos[2] = XSize*InputPos[2]; CompPos[3] = YSize*InputPos[3]; } function bool CaptureMouse() { return (Owner.MousePosition.X>=CompPos[0] && Owner.MousePosition.Y>=CompPos[1] && Owner.MousePosition.X<=(CompPos[0]+CompPos[2]) && Owner.MousePosition.Y<=(CompPos[1]+CompPos[3])); } final function KFGUI_Base GetMouseFocus() { local KFGUI_Base M; for (M=Self; M.MouseArea!=None; M=M.MouseArea) {} return M; } function DoClose() { if (ParentComponent!=None) ParentComponent.DoClose(); else Owner.PopCloseMenu(Self); } function byte GetCursorStyle() { return (bClickable ? 1 : 0); } function UserPressedEsc() // user pressed escape while this menu was active. { if (ParentComponent!=None) ParentComponent.UserPressedEsc(); else DoClose(); } function bool BringPageToFront() { if (ParentComponent!=None) return ParentComponent.BringPageToFront(); return true; // Allow user to bring this page to front. } final function bool IsTopMenu() { return (Owner.ActiveMenus.Length>0 && GetPageTop()==Owner.ActiveMenus[0]); } final function KFGUI_Page GetPageTop() { local KFGUI_Base M; for (M=Self; M.ParentComponent!=None; M=M.ParentComponent) {} return KFGUI_Page(M); } function KFGUI_Base FindComponentID(name InID) { if (ID==InID) return Self; return None; } function FindAllComponentID(name InID, out array Res) { if (ID==InID) Res[Res.Length] = Self; } function RemoveComponent(KFGUI_Base B); function GetInputFocus() { if (Owner.InputFocus!=None) Owner.InputFocus.LostInputFocus(); Owner.InputFocus = Self; } function DropInputFocus() { if (Owner.InputFocus==Self) { Owner.InputFocus.LostInputFocus(); Owner.InputFocus = None; } } function LostInputFocus(); // Obtain keyboard focus. final function GrabKeyFocus() { Owner.GrabInputFocus(Self); } final function ReleaseKeyFocus() { if (Owner.KeyboardFocus==Self) Owner.GrabInputFocus(None); } function LostKeyFocus(); function bool NotifyInputKey(int ControllerId, name Key, EInputEvent Event, float AmountDepressed, bool bGamepad) { return false; } function bool NotifyInputChar(int ControllerId, string Unicode) { return false; } // While on input focus mode, notify that mouse just moved over the threshold. function InputMouseMoved(); // Notify any focused menu element that mouse has been idle over it. function NotifyMousePaused(); final function GetActualPos(out float X, out float Y) { X = ((XPosition+X)*InputPos[2]) + InputPos[0]; Y = ((YPosition+Y)*InputPos[3]) + InputPos[1]; } final function GetRealtivePos(out float X, out float Y) { X = X / CompPos[2]; Y = Y / CompPos[2]; } simulated final function PlayMenuSound(EMenuSound Slot) { /*local SoundCue S; switch (Slot) { case MN_Focus: S = SoundCue'a_interface.menu.UT3MenuMouseOverCue'; break; case MN_LostFocus: S = SoundCue'a_interface.menu.UT3MenuNavigateDownCue'; break; case MN_ClickButton: S = SoundCue'a_interface.menu.UT3MenuSliderBarMoveCue'; break; case MN_ClickCheckboxOn: S = SoundCue'a_interface.menu.UT3MenuCheckboxSelectCue'; break; case MN_ClickCheckboxOff: S = SoundCue'a_interface.menu.UT3MenuCheckboxDeselectCue'; break; case MN_Dropdown: S = SoundCue'a_interface.menu.UT3MenuScreenSlideCue'; break; case MN_DropdownChange: S = SoundCue'a_interface.menu.UT3MenuNavigateUpCue'; break; } if (S!=None) GetPlayer().PlaySound(S,true,,false);*/ } // Pre level change notification. function NotifyLevelChange(); final function SetPosition(float X, float Y, float XS, float YS) { XPosition = X; YPosition = Y; XSize = XS; YSize = YS; } static final function string MakeSortStr(int Value) { local string S; local int i; // Prefix with zeroes to properly sort this string. S = string(Value); i = Len(S); if (i<10) return Mid("0000000000",i)$S; return S; } defaultproperties { XSize=1 YSize=1 bCanFocus=true }