// List box with components as items. Class KFGUI_ComponentList extends KFGUI_List; var int VisRange[2]; var() int NumColumns; var array<KFGUI_Base> ItemComponents; // REMEMBER to call InitMenu() on the newly created component after values are init!!! final function KFGUI_Base AddListComponent(class<KFGUI_Base> CompClass, optional float XS=1.f, optional float YS=1.f) { local KFGUI_Base G; G = new(Self)CompClass; if (G==None) return None; G.XPosition = (1.f - XS) * 0.5f; G.YPosition = (1.f - YS) * 0.5f; G.XSize = XS; G.YSize = YS; G.Owner = Owner; G.ParentComponent = Self; ItemComponents[ItemComponents.Length] = G; return G; } function EmptyList() { ItemComponents.Length = 0; } function InitMenu() { Super.InitMenu(); ListCount = 0; NumColumns = Max(NumColumns,1); } function DrawMenu() { Canvas.DrawColor = BackgroundColor; Canvas.SetPos(0.f,0.f); Owner.CurrentStyle.DrawWhiteBox(CompPos[2],CompPos[3]); } function PreDraw() { local int i,XNum,r; local byte j; local float XS,YS; ComputeCoords(); // Update list size i = ItemComponents.Length / NumColumns; if (i!=NumColumns) { ListCount = i; UpdateListVis(); } // First draw scrollbar to allow it to resize itself. for (j=0; j<4; ++j) ScrollBar.InputPos[j] = CompPos[j]; if (OldXSize!=InputPos[2]) { OldXSize = InputPos[2]; ScrollBar.XPosition = 1.f - ScrollBar.GetWidth(); } ScrollBar.Canvas = Canvas; ScrollBar.PreDraw(); // Then downscale our selves to give room for scrollbar. CompPos[2] -= ScrollBar.CompPos[2]; Canvas.SetOrigin(CompPos[0],CompPos[1]); Canvas.SetClip(CompPos[0]+CompPos[2],CompPos[1]+CompPos[3]); DrawMenu(); // Then draw rest of components. XNum = 0; r = 0; XS = CompPos[2] / NumColumns; YS = CompPos[3] / ListItemsPerPage; VisRange[0] = (ScrollBar.CurrentScroll*NumColumns); VisRange[1] = ItemComponents.Length; for (i=VisRange[0]; i<VisRange[1]; ++i) { ItemComponents[i].Canvas = Canvas; ItemComponents[i].InputPos[0] = CompPos[0]+XS*XNum; ItemComponents[i].InputPos[1] = CompPos[1]+YS*r; ItemComponents[i].InputPos[2] = XS; ItemComponents[i].InputPos[3] = YS; ItemComponents[i].PreDraw(); if (++XNum==NumColumns) { XNum = 0; if (++r==ListItemsPerPage) { VisRange[1] = i+1; break; } } } CompPos[2] += ScrollBar.CompPos[2]; } function ChangeListSize(int NewSize); function MouseClick(bool bRight); function MouseRelease(bool bRight); function MouseLeave() { Super(KFGUI_Base).MouseLeave(); } function MouseEnter() { Super(KFGUI_Base).MouseEnter(); } function bool CaptureMouse() { local int i; for (i=VisRange[0]; i<VisRange[1] && i<ItemComponents.Length; ++i) if (ItemComponents[i].CaptureMouse()) { MouseArea = ItemComponents[i]; return true; } return Super.CaptureMouse(); } function CloseMenu() { local int i; for (i=0; i<ItemComponents.Length; ++i) ItemComponents[i].CloseMenu(); Super.CloseMenu(); } function NotifyLevelChange() { local int i; for (i=0; i<ItemComponents.Length; ++i) ItemComponents[i].NotifyLevelChange(); Super.NotifyLevelChange(); } function MenuTick(float DeltaTime) { local int i; Super.MenuTick(DeltaTime); for (i=0; i<ItemComponents.Length; ++i) ItemComponents[i].MenuTick(DeltaTime); } defaultproperties { ListCount=0 NumColumns=1 bClickable=true }