KF2-YetAnotherScoreboard/ScoreboardExt/Classes/KFGUI_ScrollBarBase.uc
2021-06-13 05:54:35 +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
}