166 lines
3.2 KiB
Ucode
166 lines
3.2 KiB
Ucode
// 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
|
|
} |