rott/kf_sources/XInterface/Classes/GUISlider.uc
2026-07-14 20:27:09 +07:00

260 lines
6.1 KiB
Ucode

// ====================================================================
// Class: UT2K4UI.GUISlider
//
// Written by Joe Wilcox
// (c) 2002, Epic Games, Inc. All Rights Reserved
// Sliders will not be drawn if both MinValue & MaxValue are both 0
// ====================================================================
class GUISlider extends GUIComponent
Native;
cpptext
{
void Draw(UCanvas* Canvas);
}
var() float MinValue, MaxValue;
var() float Value;
var() float MarkerWidth;
var() bool bIntSlider;
var() bool bShowMarker;
var() bool bShowCaption;
var() bool bDrawPercentSign;
var() bool bReadOnly;
var() bool bShowValueTooltip; // Show the current value as a tooltip while dragging
var() material FillImage;
var() string CaptionStyleName, BarStyleName;
var GUIStyles CaptionStyle;
var GUIStyles BarStyle;
// Return true to prevent caption from being drawn
delegate bool OnPreDrawCaption( out float X, out float Y, out float XL, out float YL, out ETextAlign Justification );
delegate string OnDrawCaption()
{
if (bIntSlider)
return "("$int(Value)$ Eval(bDrawPercentSign, " %", "") $ ")";
return "("$Value$Eval(bDrawPercentSign, " %", "") $ ")";
}
function InitComponent(GUIController MyController, GUIComponent MyOwner)
{
Super.Initcomponent(MyController, MyOwner);
CaptionStyle = Controller.GetStyle(CaptionStyleName,FontScale);
BarStyle = Controller.GetStyle(BarStyleName,FontScale);
}
function bool InternalCapturedMouseMove(float deltaX, float deltaY)
{
local float Perc;
if ( bReadOnly )
return true;
if ( (Controller.MouseX >= Bounds[0]) && (Controller.MouseX<=Bounds[2]) )
{
Perc = FClamp( ((Controller.MouseX - (ActualLeft() + (MarkerWidth/2))) / (ActualWidth()-MarkerWidth)), 0.0, 1.0 );
Value = ((MaxValue - MinValue) * Perc) + MinValue;
if (bIntSlider)
Value = round(Value);
}
else if (Controller.MouseX < Bounds[0])
Value = MinValue;
else if (Controller.MouseX > Bounds[2])
Value = MaxValue;
Value = FClamp(Value,MinValue,MaxValue);
if ( bShowValueTooltip )
ToolTip.SetTip( GetValueString() );
return true;
}
function bool InternalOnKeyEvent(out byte Key, out byte State, float delta)
{
if ( bReadOnly )
return false;
if ( (Key==0x25) && (State==1) ) // Left
{
if (bIntSlider)
Adjust(-1);
else
Adjust(-0.01);
return true;
}
if ( (Key==0x27) && (State==1) ) // Right
{
if (bIntSlider)
Adjust(1);
else
Adjust(0.01);
return true;
}
return false;
}
function float SetValue(float NewValue)
{
Value = FClamp(NewValue, MinValue, MaxValue);
if (bIntSlider)
Value = Round(Value);
return Value;
}
function Adjust(float amount)
{
local float Perc;
Perc = (Value-MinValue) / (MaxValue-MinValue);
Perc += amount;
Perc = FClamp(Perc,0.0,1.0);
Value = FClamp( ((MaxValue - MinValue) * Perc) + MinValue, MinValue, MaxValue );
OnChange(self);
}
function bool InternalOnClick(GUIComponent Sender)
{
if ( bShowValueToolTip )
RevertTooltipToNormal();
OnChange(self);
return true;
}
function InternalOnMousePressed(GUIComponent Sender,bool RepeatClick)
{
if ( bShowValueTooltip )
ModifyTooltipForDragging();
InternalCapturedMouseMove(0,0);
}
function InternalOnMouseRelease(GUIComponent Sender)
{
InternalCapturedMouseMove(0,0);
}
function SetReadOnly(bool b)
{
bReadOnly = b;
}
event float GetMarkerPosition()
{
local float Perc;
Perc = (Value - MinValue) / (MaxValue - MinValue);
return ActualLeft() + ((ActualWidth() - MarkerWidth) * Perc);
}
function CenterMouse()
{
if ( PlayerOwner() != None )
PlayerOwner().ConsoleCommand( "SETMOUSE" @ GetMarkerPosition() @ (ActualTop() + ActualHeight() / 2) );
}
function string GetValueString()
{
local string ValueStr;
if ( bIntSlider )
ValueStr = string( int(Value) );
else ValueStr = string(Value);
if ( bDrawPercentSign )
ValueStr @= "%";
return ValueStr;
}
function ModifyTooltipForDragging()
{
ToolTip.bTrackMouse = True;
ToolTip.bTrackInput = False;
ToolTip.bMultiLine = False;
ToolTip.HideToolTip = HideToolTip;
ToolTip.LeaveArea = ToolTipLeaveArea;
SetTooltipText( GetValueString() );
ShowToolTip();
}
function RevertTooltipToNormal()
{
ToolTip.bTrackMouse = ToolTip.default.bTrackMouse;
ToolTip.bTrackInput = ToolTip.default.bTrackInput;
ToolTip.bMultiLine = ToolTip.default.bMultiLine;
ToolTip.HideToolTip = None;
ToolTip.LeaveArea = None;
ToolTip.LeaveArea();
SetTooltipText( Hint );
}
function ShowToolTip()
{
Controller.MouseOver = ToolTip.InternalEnterArea();
ToolTip.SetVisibility(True);
}
function HideToolTip()
{
if ( MenuState != MSAT_Pressed )
{
log("HideToolTip MenuState:"$GetEnum(enum'EMenuState', MenuState));
ToolTip.SetVisibility(False);
}
}
function bool ToolTipLeaveArea()
{
return False;
}
defaultproperties
{
OnCapturedMouseMove=InternalCapturedMouseMove
OnKeyEvent=InternalOnKeyEvent
OnClick=InternalOnClick
OnMousePressed=InternalOnMousePressed
OnMouseRelease=InternalOnMouseRelease
Begin object Class=GUIToolTip Name=GUISliderToolTip
End Object
ToolTip=GUISliderToolTip
StyleName="SliderKnob"
bAcceptsInput=true
bCaptureMouse=True
bNeverFocus=false
bTabStop=true
WinHeight=0.03
bRequireReleaseClick=true
CaptionStyleName="SliderCaption"
bIntSlider=false;
OnClickSound=CS_Click
BarStyleName="SliderBar"
MinValue=0
MaxValue=100
bShowMarker=true
bShowCaption=false
MarkerWidth=0
// if _RO_
FillImage=Texture'InterfaceArt_tex.Menu.SliderFillBlurry'
// else
// FillImage=material'2K4Menus.NewControls.SliderFillBlurry'
// end if _RO_
bRequiresStyle=True
bDrawPercentSign=false
bShowValueTooltip=true
}