KF2-YetAnotherScoreboard/ScoreboardExt/Classes/KFGUI_EditBox.uc
2021-06-13 05:53:33 +03:00

431 lines
8.0 KiB
Ucode

Class KFGUI_EditBox extends KFGUI_Clickable;
`include(Build.uci)
`include(Logger.uci)
var enum eTextCase
{
TXTC_None,
TXTC_Upper,
TXTC_Lower,
} TextCase;
var Color FontColor;
var string TextStr,AllowedCharSet;
var bool bDrawBackground,bNoClearOnEnter,bMaskText,bIntOnly,bFloatOnly,bIncludeSign,bConvertSpaces,bCtrl,bAllSelected,bForceShowCaret;
var int MaxWidth;
var bool bReadOnly,bAlwaysNotify;
var int CaretPos,FirstVis,LastSizeX,LastCaret,LastLength;
var float TextScale;
function InitMenu()
{
Super.InitMenu();
if (bIntOnly || bFloatOnly)
{
AllowedCharSet = "0123456789";
if (bFloatOnly)
AllowedCharSet $= ".";
}
bAllSelected = true;
}
function SetText(string NewText, optional bool bIgnoreDelegate)
{
local bool bChanged;
bChanged = bAlwaysNotify || TextStr != NewText;
TextStr = NewText;
CaretPos = Len(TextStr);
if (bChanged && !bIgnoreDelegate)
TextChanged();
bAllSelected=true;
}
function bool NotifyInputChar(int Key, string Unicode)
{
local string Temp,S;
if (bReadOnly)
return false;
if (UniCode != "")
S = Unicode;
else S = Chr(Key);
if (Asc(S) == 13 || Asc(S) == 8 || Asc(S) == 27)
return false;
if (bCtrl)
return false;
if (bAllSelected)
{
TextStr="";
CaretPos=0;
bAllSelected=false;
}
if ((AllowedCharSet == "") || ( (bIncludeSign) && ( (S == "-") || (S == "+") ) && (TextStr == "") ) || (InStr(AllowedCharSet,S) >= 0))
{
if ((MaxWidth == 0) || (Len(TextStr) < MaxWidth))
{
if ((bConvertSpaces) && ((S == " ") || (S == "?") || (S == "\\")))
S = "_";
if ((TextStr == "") || ( CaretPos == Len(TextStr) ))
{
TextStr = TextStr$S;
CaretPos=Len(TextStr);
}
else
{
Temp = Left(TextStr,CaretPos)$S$Mid(TextStr,CaretPos);
TextStr = Temp;
CaretPos++;
}
TextChanged();
return true;
}
}
return false;
}
function SetInputText(string S)
{
switch(TextCase)
{
case TXTC_Upper:
S = Caps(S);
break;
case TXTC_Lower:
S = Locs(S);
break;
}
TextStr = S;
TextChanged();
}
function AppendInputText(string Text)
{
local int Character;
while (Len(Text) > 0)
{
Character = Asc(Left(Text, 1));
Text = Mid(Text, 1);
if (Character >= 0x20 && Character < 0x100)
{
SetInputText(Left(TextStr, CaretPos) $ Chr(Character) $ Right(TextStr, Len(TextStr) - CaretPos));
CaretPos += 1;
}
}
}
function bool ProcessControlKey(name Key, EInputEvent Event)
{
if (Key == 'LeftControl' || Key == 'RightControl')
{
if (Event == IE_Released)
{
bCtrl = false;
}
else if (Event == IE_Pressed)
{
bCtrl = true;
}
return true;
}
else if (bCtrl && Event == IE_Pressed && GetPlayer() != None)
{
if (Key == 'V')
{
// paste
AppendInputText(GetPlayer().PasteFromClipboard());
return true;
}
else if (Key == 'C')
{
// copy
GetPlayer().CopyToClipboard(TextStr);
return true;
}
else if (Key == 'X')
{
// cut
if (TextStr != "")
{
GetPlayer().CopyToClipboard(TextStr);
SetInputText("");
CaretPos = 0;
}
return true;
}
}
return false;
}
function bool NotifyInputKey(int ControllerId, name Key, EInputEvent Event, float AmountDepressed, bool bGamepad)
{
local string Temp;
if (bReadOnly)
{
return false;
}
if (ProcessControlKey(Key, Event))
{
return false;
}
else if (Key == 'Escape' && Event == IE_Pressed)
{
if (TextStr != "")
{
SetInputText("");
CaretPos = 0;
return true;
}
else
{
if (ParentComponent != None)
{
ParentComponent.UserPressedEsc();
return true;
}
}
}
else if (Key == 'Enter' && Event == IE_Released)
{
if (TextStr != "")
{
Temp = TextStr;
OnTextFinished(self, Temp);
if (!bNoClearOnEnter)
{
SetInputText("");
CaretPos = 0;
}
}
return true;
}
else if (Key == 'Home')
{
CaretPos = 0;
return true;
}
else if (Key == 'End')
{
CaretPos = Len(TextStr);
return true;
}
else if (Event == IE_Pressed || Event == IE_Repeat)
{
if (Key == 'Backspace' || Key == 'Delete')
{
if (bAllSelected)
{
SetInputText("");
CaretPos = 0;
}
else if (CaretPos > 0)
{
SetInputText(Left(TextStr,CaretPos-1) $ Right(TextStr, Len(TextStr) - CaretPos));
CaretPos -= 1;
}
return true;
}
else if (Key == 'Left')
{
CaretPos = Max(0, CaretPos - 1);
return true;
}
else if (Key == 'Right')
{
CaretPos = Min(Len(TextStr), CaretPos + 1);
return true;
}
}
return true;
}
function string ConvertIllegal(string InputStr)
{
local int i, Max;
local string Retval;
local string C;
i = 0;
Max = Len(InputStr);
while ( i < Max)
{
C = Mid(InputStr,i,1);
if (AllowedCharSet != "" && InStr(AllowedCharSet,C) < 0)
{
C = "";
}
if (bConvertSpaces &&
((C == " ") || (C =="?") || (C == "\\") ))
{
C = "_";
}
Retval = Retval $ C;
i++;
}
if (MaxWidth > 0)
return Left(Retval,MaxWidth);
return Retval;
}
function string GetText()
{
return TextStr;
}
function TextChanged()
{
OnChange(Self);
}
function DrawMenu()
{
local string Storage,FinalDraw,TmpString;
local int MaskIndex,StorageLength;
local float XL,YL,BoxWidth,FontScale,CursorY,BorderSize;
local FontRenderInfo FRI;
Super.DrawMenu();
if (bDrawBackground)
{
Canvas.SetDrawColor(250,250,250,255);
Canvas.SetPos(0.f,0.f);
Canvas.DrawTileStretched(Owner.CurrentStyle.BorderTextures[`BOX_SMALL],CompPos[2],CompPos[3],0,0,Owner.CurrentStyle.BorderTextures[`BOX_SMALL].GetSurfaceWidth(),Owner.CurrentStyle.BorderTextures[`BOX_SMALL].GetSurfaceHeight());
}
BorderSize = Owner.CurrentStyle.ScreenScale(4.f);
FRI.bClipText = true;
FRI.bEnableShadow = true;
Storage = TextStr;
if (bMaskText && Len(Storage) > 0)
{
StorageLength = Len(Storage);
Storage = "";
for (MaskIndex=1; MaskIndex <= StorageLength; MaskIndex++)
{
Storage $= "*";
}
}
Canvas.Font = Owner.CurrentStyle.PickFont(FontScale);
FontScale *= TextScale;
BoxWidth=CompPos[2]*0.9875;
if ((Len(Storage) != LastLength) || (CaretPos != LastCaret))
{
if (CaretPos <= FirstVis)
FirstVis = Max(0,CaretPos-1);
else
{
FinalDraw = Mid(Storage, FirstVis, CaretPos-FirstVis);
Canvas.TextSize(FinalDraw, XL, YL, FontScale, FontScale);
while ( (XL >= BoxWidth) && (FirstVis < Len(Storage)))
{
FirstVis++;
FinalDraw = Mid(Storage, FirstVis, CaretPos-FirstVis);
Canvas.TextSize(FinalDraw, XL, YL, FontScale, FontScale);
}
}
}
LastLength = Len(Storage);
if (bReadOnly)
{
FirstVis = 0;
}
FinalDraw = Mid(Storage, FirstVis, Len(Storage)-FirstVis);
if (!bReadOnly && (Owner.KeyboardFocus == self || bForceShowCaret))
{
if ((FirstVis == CaretPos) || (Len(FinalDraw) == 0))
{
Canvas.TextSize("W", XL, YL, FontScale, FontScale);
XL = BorderSize;
bAllSelected=false;
}
else
{
TmpString = Mid(FinalDraw, 0, CaretPos-FirstVis);
Canvas.TextSize(TmpString, XL, YL, FontScale, FontScale);
}
CursorY = (CompPos[3]/2) - ((YL-Owner.HUDOwner.ScaledBorderSize)/2);
if (bAllSelected)
{
Canvas.SetDrawColor(255,255,255,195);
Canvas.SetPos(BorderSize, CursorY);
Canvas.DrawTile( Owner.DefaultPens[`PEN_WHITE], XL, YL-Owner.HUDOwner.ScaledBorderSize, 0, 0, Owner.DefaultPens[`PEN_WHITE].GetSurfaceWidth(), Owner.DefaultPens[`PEN_WHITE].GetSurfaceHeight() );
}
else
{
Canvas.SetDrawColor(255,255,255,Owner.CursorFlash);
Canvas.SetPos(XL + (Len(FinalDraw) == 0 ? 0 : 3), CursorY);
Canvas.DrawTile( Owner.DefaultPens[`PEN_WHITE], 3, YL-Owner.HUDOwner.ScaledBorderSize, 0, 0, Owner.DefaultPens[`PEN_WHITE].GetSurfaceWidth(), Owner.DefaultPens[`PEN_WHITE].GetSurfaceHeight() );
}
}
Canvas.DrawColor = FontColor;
Canvas.SetPos(BorderSize, (CompPos[3]/2) - (YL/2));
Canvas.DrawText(FinalDraw,,FontScale,FontScale,FRI);
}
function HandleMouseClick( bool bRight)
{
if (Owner.KeyboardFocus != self)
{
GrabKeyFocus();
}
CaretPos = Len(TextStr);
bAllSelected = !bAllSelected;
}
Delegate OnChange(KFGUI_EditBox Sender);
Delegate OnTextFinished(KFGUI_EditBox Sender, string S);
defaultproperties
{
FontColor=(R=255,G=255,B=255,A=255)
MaxWidth=768
TextScale=1
TextCase=TXTC_None
LastCaret=-1
LastLength=-1
YSize=0.06
}