431 lines
8.0 KiB
Ucode
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
|
|
}
|