KF2-YetAnotherScoreboard/ScoreboardExt/Classes/KFGUI_ScrollBarBase.uc
2021-06-12 23:11:37 +03:00

126 lines
2.8 KiB
Ucode

Class KFGUI_ScrollBarBase extends KFGUI_Clickable
abstract;
`include(Build.uci)
`include(Logger.uci)
var() int MinRange,MaxRange,ScrollStride,PageStep;
var() float ButtonScale; // Button width (scaled by default font height).
var int CurrentScroll;
// In-runtime values.
var transient float CalcButtonScale;
var transient int SliderScale,ButtonOffset,GrabbedOffset;
var transient bool bGrabbedScroller;
var bool bVertical, bHideScrollbar;
final function UpdateScrollSize( int Current, int MxRange, int Stride, int StepStride, optional int MnRange )
{
MaxRange = MxRange;
MinRange = MnRange;
ScrollStride = Stride;
PageStep = StepStride;
SetValue(Current);
}
final function AddValue( int V )
{
SetValue(CurrentScroll+V);
}
final function SetValue( int V )
{
CurrentScroll = Clamp((V / ScrollStride) * ScrollStride,MinRange,MaxRange);
OnScrollChange(Self,CurrentScroll);
}
final function int GetValue()
{
return CurrentScroll;
}
Delegate OnScrollChange( KFGUI_ScrollBarBase Sender, int Value );
// Get UI width.
function float GetWidth()
{
CalcButtonScale = ButtonScale*Owner.CurrentStyle.DefaultHeight;
return CalcButtonScale / (bVertical ? InputPos[2] : InputPos[3]);
}
function PreDraw()
{
// Auto scale to match width to screen size.
if( bVertical )
XSize = GetWidth();
else YSize = GetWidth();
Super.PreDraw();
}
function DrawMenu()
{
if( !bHideScrollbar )
{
Owner.CurrentStyle.RenderScrollBar(Self);
}
}
function MouseClick( bool bRight )
{
if( bRight || bDisabled )
return;
bPressedDown = true;
PlayMenuSound(MN_ClickButton);
if( bVertical )
{
if( Owner.MousePosition.Y>=(CompPos[1]+ButtonOffset) && Owner.MousePosition.Y<=(CompPos[1]+ButtonOffset+SliderScale) ) // Grabbed scrollbar!
{
GrabbedOffset = Owner.MousePosition.Y - (CompPos[1]+ButtonOffset);
bGrabbedScroller = true;
GetInputFocus();
}
else if( Owner.MousePosition.Y<(CompPos[1]+ButtonOffset) ) // Page up.
AddValue(-PageStep);
else AddValue(PageStep);
}
else
{
if( Owner.MousePosition.X>=(CompPos[0]+ButtonOffset) && Owner.MousePosition.X<=(CompPos[0]+ButtonOffset+SliderScale) ) // Grabbed scrollbar!
{
GrabbedOffset = Owner.MousePosition.X - (CompPos[0]+ButtonOffset);
bGrabbedScroller = true;
GetInputFocus();
}
else if( Owner.MousePosition.X<(CompPos[0]+ButtonOffset) ) // Page left.
AddValue(-PageStep);
else AddValue(PageStep);
}
}
function MouseRelease( bool bRight )
{
if( !bRight )
DropInputFocus();
}
function LostInputFocus()
{
bGrabbedScroller = false;
bPressedDown = false;
}
function ScrollMouseWheel( bool bUp )
{
if( bDisabled )
return;
if( bUp )
AddValue(-ScrollStride);
else AddValue(ScrollStride);
}
function SetVisibility(bool Visible)
{
bHideScrollbar = Visible;
}
defaultproperties
{
MaxRange=100
ScrollStride=1
PageStep=10
ButtonScale=1
}