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

188 lines
3.7 KiB
Ucode

Class KFGUI_TextScroll extends KFGUI_TextField;
`include(Build.uci)
`include(Logger.uci)
var float ScrollSpeed;
var transient float CharStartTime;
var transient bool bScrollCompleted, bTextDirty;
var transient array < bool> RowsCompleted;
var transient int MaxIndex, RowsDropped;
function SetText( string S)
{
Super.SetText(S);
MaxIndex = 0;
RowsCompleted.Length = 0;
RowsDropped = 0;
bScrollCompleted = false;
bTextDirty = true;
CharStartTime = GetPlayer().WorldInfo.TimeSeconds;
}
function DrawMenu()
{
local int i,j,k,SLen,CurrentIndex;
local float Y, DTime, XL, YL, MainY, MainX, CharTime;
local string MainString;
local Color MainTextColor;
local Texture CurrentCursor;
local ETextFieldStyles TextStyle;
if (bScrollCompleted)
{
Super.DrawMenu();
return;
}
if (Text == "")
return;
// Need to figure out best fitting font.
if (OldSize[0] != CompPos[2] || OldSize[1] != CompPos[3])
InitSize();
Canvas.Font = InitFont;
if (bShowScrollbar)
{
Canvas.SetClip(CompPos[0]+(CompPos[2]-ScrollWidth),CompPos[1]+CompPos[3]);
i = ScrollBar.GetValue();
}
else i = 0;
if (ScrollBar != None)
{
if (bTextDirty)
{
ScrollBar.bDisabled = true;
RowsCompleted.Length = Lines.Length;
bTextDirty = false;
}
if (RowsCompleted[Lines.Length-1])
{
ScrollBar.AddValue(1);
ScrollBar.bDisabled = false;
bScrollCompleted = true;
//Temp fix! The last line in the string seems to be skipped
AddText(LineSplitter);
return;
}
else if (MaxIndex != 0 && RowsCompleted[MaxIndex])
{
MaxIndex = 0;
ScrollBar.AddValue(1);
RowsDropped++;
i = ScrollBar.GetValue();
}
}
if (RowsDropped > 0)
{
for (i=0; i <= RowsDropped; ++i)
{
for (j=0; j < Lines[i].Text.Length; ++j)
{
for (k=0; k <= Len(Lines[i].Text[j].S); ++k)
{
CharTime += ScrollSpeed;
}
}
}
}
DTime = `TimeSinceEx(GetPlayer(), CharStartTime);
if (i < Lines.Length)
{
CurrentCursor = Owner.DefaultPens[GetCursorStyle()];
Y = Lines[i].Y;
for (i=i; i < Lines.Length; ++i)
{
if ((Lines[i].Y-Y+TextHeight) >= CompPos[3])
{
MaxIndex = i-1;
break;
}
if (Lines[i].Text.Length != 0)
{
for (j=0; j < Lines[i].Text.Length; ++j)
{
MainTextColor = Lines[i].Text[j].C;
if (MainTextColor.A == 0)
MainTextColor = TextColor;
TextStyle = Lines[i].Text[j].TextType;
MainX = Lines[i].Text[j].X;
MainY = Lines[i].Y-Y;
MainString = Lines[i].Text[j].S;
SLen = Len(MainString);
CurrentIndex = 0;
for (k=0; k <= SLen; ++k)
{
CharTime += ScrollSpeed;
Canvas.TextSize(Mid(MainString, 0, k), XL, YL, InitFontScale, InitFontScale);
if (CharTime > DTime)
{
if (CurrentIndex == k)
{
Canvas.SetDrawColor(255,255,255,255);
Canvas.SetPos(MainX+XL,MainY);
Canvas.DrawTile(CurrentCursor, YL/2, YL, 0, 0, CurrentCursor.GetSurfaceWidth(), CurrentCursor.GetSurfaceHeight());
}
continue;
}
Canvas.DrawColor = GetColorFromStyle(MainTextColor, TextStyle);
Canvas.SetPos(MainX+XL,MainY);
Canvas.DrawText(Mid(MainString, k, 1),,InitFontScale,InitFontScale,TextFontInfo);
CurrentIndex = k+1;
if (k >= SLen)
{
RowsCompleted[i] = true;
}
}
}
}
}
}
}
function bool CaptureMouse()
{
return (!bScrollCompleted && Super(KFGUI_MultiComponent).CaptureMouse()) || Super.CaptureMouse();
}
function MouseClick( bool bRight)
{
if (bScrollCompleted)
return;
if (ScrollBar != None)
ScrollBar.bDisabled = false;
bScrollCompleted = true;
//Temp fix! The last line in the string seems to be skipped
AddText(LineSplitter);
}
defaultproperties
{
ScrollSpeed=0.01
}