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 }