// Same as SwitchComponent, but with buttons. class KFGUI_SwitchMenuBar extends KFGUI_MultiComponent; var array SubPages; var() byte ButtonPosition; // 0 = top, 1 = bottom, 2 = left, 3 = right var() float BorderWidth, ButtonAxisSize; // Width for buttons. var() float PagePadding; // Padding for pages var int NumButtons, CurrentPageNum, PageComponentIndex; var array PageButtons; function ShowMenu() { GrabKeyFocus(); Super.ShowMenu(); } function CloseMenu() { ReleaseKeyFocus(); Super.CloseMenu(); } // Remember to call InitMenu() on the newly created page after. final function KFGUI_Base AddPage(class PageClass, string Caption, string Hint, optional out KFGUI_Button Button) { local KFGUI_Base P; local KFGUI_Button B; // Add page. P = new (Self) PageClass; P.Owner = Owner; P.ParentComponent = Self; SubPages.AddItem(P); // Add page switch button. B = new (Self) class'KFGUI_Button'; B.ButtonText = Caption; B.ToolTip = Hint; B.OnClickLeft = PageSwitched; B.OnClickRight = PageSwitched; B.IDValue = NumButtons; if (ButtonPosition < 2) { B.XPosition = NumButtons*ButtonAxisSize; B.XSize = ButtonAxisSize*0.99; if (ButtonPosition == 0) B.YPosition = 0.f; else B.YPosition = YSize-BorderWidth*0.99; B.YSize = BorderWidth*0.99; if (NumButtons > 0) PageButtons[PageButtons.Length-1].ExtravDir = 1; } else { if (ButtonPosition == 2) B.XPosition = 0.f; else B.XPosition = XSize-BorderWidth*0.99; B.XSize = BorderWidth*0.99; B.YPosition = NumButtons*ButtonAxisSize; B.YSize = ButtonAxisSize*0.99; if (NumButtons > 0) PageButtons[PageButtons.Length-1].ExtravDir = 2; } ++NumButtons; PageButtons.AddItem(B); AddComponent(B); Button = B; return P; } function PageSwitched(KFGUI_Button Sender) { SelectPage(Sender.IDValue); } final function SelectPage(int Index) { PlayMenuSound(MN_LostFocus); if (CurrentPageNum >= 0) { PageButtons[CurrentPageNum].bIsHighlighted = false; SubPages[CurrentPageNum].CloseMenu(); Components.Remove(PageComponentIndex, 1); PageComponentIndex = -1; } CurrentPageNum = (Index >= 0 && Index < SubPages.Length) ? Index : -1; if (CurrentPageNum >= 0) { PageButtons[CurrentPageNum].bIsHighlighted = true; SubPages[CurrentPageNum].ShowMenu(); PageComponentIndex = Components.Length; Components.AddItem(SubPages[CurrentPageNum]); } } function PreDraw() { local int i; local byte j; if (!bVisible) return; if (CurrentPageNum == -1 && NumButtons > 0) SelectPage(0); ComputeCoords(); Canvas.SetOrigin(CompPos[0], CompPos[1]); Canvas.SetClip(CompPos[0]+CompPos[2], CompPos[1]+CompPos[3]); DrawMenu(); for (i=0; i < Components.Length; ++i) { Components[i].Canvas = Canvas; for (j=0; j < 4; ++j) Components[i].InputPos[j] = CompPos[j]; if (i == PageComponentIndex) { switch(ButtonPosition) { case 0: Components[i].InputPos[1] += (InputPos[3]*BorderWidth*PagePadding); case 1: Components[i].InputPos[3] -= (InputPos[3]*BorderWidth*PagePadding); break; case 2: Components[i].InputPos[0] += (InputPos[2]*BorderWidth*PagePadding); default: Components[i].InputPos[2] -= (InputPos[2]*BorderWidth*PagePadding); } } Components[i].PreDraw(); } } function bool ReceievedControllerInput(int ControllerId, name Key, EInputEvent Event) { switch(Key) { case 'XboxTypeS_LeftShoulder': if (Event == IE_Pressed) SelectPage(Clamp(CurrentPageNum - 1, 0, NumButtons)); return true; case 'XboxTypeS_RightShoulder': if (Event == IE_Pressed) SelectPage(Clamp(CurrentPageNum + 1, 0, NumButtons)); return true; } return false; } defaultproperties { PagePadding=1.0 BorderWidth=0.05 ButtonAxisSize=0.08 CurrentPageNum=-1 PageComponentIndex=-1 }