KF2-Server-Extension/ServerExt/Classes/KFGUI_List.uc
2017-10-19 21:00:49 -05:00

209 lines
4.6 KiB
Ucode

// List box with custom render code for the items.
Class KFGUI_List extends KFGUI_MultiComponent;
var() bool bDrawBackground;
var() protected int ListCount;
var() int ListItemsPerPage;
var() color BackgroundColor;
var KFGUI_ScrollBarV ScrollBar;
var transient float OldXSize,ItemHeight,MouseYHit;
var transient int FocusMouseItem,LastFocusItem;
var byte PressedDown[2];
var bool bPressedDown;
delegate OnDrawItem( Canvas C, int Index, float YOffset, float Height, float Width, bool bFocus );
// Requires bClickable=true to receive this event.
delegate OnClickedItem( int Index, bool bRight, int MouseX, int MouseY );
delegate OnDblClickedItem( int Index, bool bRight, int MouseX, int MouseY );
function InitMenu()
{
Super.InitMenu();
ScrollBar = KFGUI_ScrollBarV(FindComponentID('Scrollbar'));
UpdateListVis();
}
function DrawMenu()
{
local int i,n;
local float Y;
local bool bCheckMouse;
if( bDrawBackground )
{
Canvas.DrawColor = BackgroundColor;
Canvas.SetPos(0.f,0.f);
Owner.CurrentStyle.DrawWhiteBox(CompPos[2],CompPos[3]);
}
// Mouse focused item check.
bCheckMouse = bClickable && bFocused;
FocusMouseItem = -1;
if( bCheckMouse )
MouseYHit = Owner.MousePosition.Y - CompPos[1];
n = ScrollBar.CurrentScroll;
ItemHeight = CompPos[3] / ListItemsPerPage;
Y = 0;
for( i=0; i<ListItemsPerPage; ++i )
{
if( n>=ListCount )
break;
if( bCheckMouse && FocusMouseItem==-1 )
{
if( MouseYHit<ItemHeight )
FocusMouseItem = n;
else MouseYHit-=ItemHeight;
}
OnDrawItem(Canvas,n,Y,ItemHeight,CompPos[2],(FocusMouseItem==n));
Y+=ItemHeight;
++n;
}
if( LastFocusItem!=FocusMouseItem )
{
if( LastFocusItem!=-1 && !bDisabled && bClickable )
PlayMenuSound(MN_DropdownChange);
LastFocusItem = FocusMouseItem;
}
}
function PreDraw()
{
local int i;
local byte j;
ComputeCoords();
// 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();
CompPos[2] += ScrollBar.CompPos[2];
// Then draw rest of components.
for( i=0; i<Components.Length; ++i )
{
if( Components[i]!=ScrollBar )
{
Components[i].Canvas = Canvas;
for( j=0; j<4; ++j )
Components[i].InputPos[j] = CompPos[j];
Components[i].PreDraw();
}
}
}
function UpdateListVis()
{
if( ListCount<=ListItemsPerPage )
{
ScrollBar.UpdateScrollSize(0,1,1,1);
ScrollBar.SetDisabled(true);
}
else
{
ScrollBar.UpdateScrollSize(ScrollBar.CurrentScroll,(ListCount-ListItemsPerPage),1,ListItemsPerPage);
ScrollBar.SetDisabled(false);
}
}
function ChangeListSize( int NewSize )
{
if( ListCount==NewSize )
return;
ListCount = NewSize;
UpdateListVis();
}
final function int GetListSize()
{
return ListCount;
}
function DoubleMouseClick( bool bRight )
{
if( !bDisabled && bClickable )
{
PlayMenuSound(MN_ClickButton);
PressedDown[byte(bRight)] = 0;
bPressedDown = (PressedDown[0]!=0 || PressedDown[1]!=0);
OnDblClickedItem(FocusMouseItem,bRight,Owner.MousePosition.X-CompPos[0],MouseYHit);
}
}
function MouseClick( bool bRight )
{
if( !bDisabled && bClickable )
{
PressedDown[byte(bRight)] = 1;
bPressedDown = true;
}
}
function MouseRelease( bool bRight )
{
if( !bDisabled && bClickable && PressedDown[byte(bRight)]==1 )
{
PlayMenuSound(MN_ClickButton);
PressedDown[byte(bRight)] = 0;
bPressedDown = (PressedDown[0]!=0 || PressedDown[1]!=0);
OnClickedItem(FocusMouseItem,bRight,Owner.MousePosition.X-CompPos[0],MouseYHit);
}
}
function MouseLeave()
{
Super.MouseLeave();
if( !bDisabled && bClickable )
PlayMenuSound(MN_LostFocus);
PressedDown[0] = 0;
PressedDown[1] = 0;
bPressedDown = false;
}
function MouseEnter()
{
Super.MouseEnter();
LastFocusItem = -1;
if( !bDisabled && bClickable )
PlayMenuSound(MN_Focus);
}
function ScrollMouseWheel( bool bUp )
{
if( !ScrollBar.bDisabled )
ScrollBar.ScrollMouseWheel(bUp);
}
function NotifyMousePaused()
{
if( Owner.InputFocus==None && FocusMouseItem>=0 )
OnMouseRest(FocusMouseItem);
}
Delegate OnMouseRest( int Item );
defaultproperties
{
ListItemsPerPage=10
ListCount=1
BackgroundColor=(R=32,G=3,B=2,A=255)
bDrawBackground=true
Begin Object Class=KFGUI_ScrollBarV Name=ListScroller
XPosition=0.96
YPosition=0
XSize=0.04
YSize=1
ID="Scrollbar"
End Object
Components.Add(ListScroller)
}