256 lines
5.4 KiB
Ucode
256 lines
5.4 KiB
Ucode
class GUIScrollText extends GUIList
|
|
native;
|
|
|
|
cpptext
|
|
{
|
|
UBOOL WrapURL( FString& Text ) const;
|
|
void PreDraw(UCanvas *Canvas);
|
|
void Draw(UCanvas* Canvas);
|
|
protected:
|
|
void DrawItem(UCanvas* Canvas, INT Item, FLOAT X, FLOAT Y, FLOAT W, FLOAT HT, UBOOL bSelected, UBOOL bPending);
|
|
public:
|
|
}
|
|
|
|
enum eScrollState
|
|
{
|
|
STS_None,
|
|
STS_Initial,
|
|
STS_Char,
|
|
STS_EOL,
|
|
STS_Repeat,
|
|
};
|
|
|
|
var() editconst int MaxHistory; // Maximum number of rows. Only used in conjunction with NewText. 0 indicates no limit.
|
|
var() editconst string NewText; // New text to add the end of
|
|
var() editconst string ClickedString; // Filled in (if bClickText is true) when user clicks on a word
|
|
|
|
// private set of vars
|
|
var() editconst protected string Content; // This is the content to display in 1 single string
|
|
var() editconst string Separator; // Separator to use
|
|
var() editconst protected int VisibleLines; // This is the number of visible lines
|
|
var() editconst protected int VisibleChars; // How Many chars in the last displayed line are visible
|
|
var() editconst protected float oldWidth; // Last width of the diplay area
|
|
var() editconst protected eScrollState ScrollState; // What was the last action we did
|
|
var() editconst protected bool bNewContent; // This is set when new text content has been set for the control
|
|
var() editconst protected bool bStopped; // Tells when the sequence has stopped animating (can be rushed by clicking ?)
|
|
|
|
var const editconst private bool bReceivedNewContent;
|
|
|
|
// Public set of vars
|
|
var() bool bRepeat; // Should the sequence be repeated ?
|
|
var() bool bNoTeletype; // Dont do the teletyping effect at all
|
|
var() bool bClickText; // Upon clicking on this text box, fill in ClickedString field
|
|
var() float InitialDelay; // Initial delay after new content was set
|
|
var() float CharDelay; // This is the delay between each char
|
|
var() float EOLDelay; // This is the delay to use when reaching end of line
|
|
var() float RepeatDelay; // This is used after all the text has been displayed and bRepeat is true
|
|
|
|
var() editconst editconstarray array<string> StringElements;
|
|
|
|
native final function string GetWordUnderCursor();
|
|
|
|
delegate OnEndOfLine();
|
|
|
|
function Dump()
|
|
{
|
|
local int i;
|
|
|
|
for (i = 0; i < StringElements.Length; i++)
|
|
log(Name@"ScrollText Elements["$i$"]:"$StringElements[i]);
|
|
}
|
|
|
|
function InitComponent(GUIController MyController, GUIComponent MyOwner)
|
|
{
|
|
Super.InitComponent(MyController, MyOwner);
|
|
if(bNoTeletype)
|
|
EndScrolling();
|
|
}
|
|
|
|
function SetContent(string NewContent, optional string sep)
|
|
{
|
|
if (sep == "")
|
|
Separator = default.Separator;
|
|
else
|
|
Separator = sep;
|
|
|
|
Content = NewContent;
|
|
|
|
bNewContent = true;
|
|
|
|
if(bNoTeletype)
|
|
EndScrolling();
|
|
else
|
|
Restart();
|
|
}
|
|
|
|
function Stop()
|
|
{
|
|
bStopped = true;
|
|
ScrollState = STS_None;
|
|
TimerInterval = 0;
|
|
}
|
|
|
|
function Restart()
|
|
{
|
|
VisibleLines = 0;
|
|
VisibleChars = 0;
|
|
if (InitialDelay <= 0.0)
|
|
{
|
|
ScrollState = STS_None;
|
|
SetTimer(0.001, true);
|
|
}
|
|
else
|
|
{
|
|
ScrollState = STS_Initial;
|
|
SetTimer(InitialDelay, true);
|
|
}
|
|
bStopped = false;
|
|
}
|
|
|
|
function bool SkipChar()
|
|
{
|
|
if (ItemCount > 0 && !bStopped && VisibleLines >= 0 && VisibleLines < ItemCount)
|
|
{
|
|
if (VisibleChars == Len(StringElements[VisibleLines]))
|
|
{
|
|
if (VisibleLines+1 < ItemCount)
|
|
{
|
|
VisibleLines++;
|
|
VisibleChars = 0;
|
|
TimerInterval = EOLDelay;
|
|
ScrollState = STS_EOL;
|
|
OnEndOfLine();
|
|
return true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
VisibleChars++;
|
|
TimerInterval = CharDelay;
|
|
ScrollState = STS_Char;
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
event Timer()
|
|
{
|
|
if (ItemCount == 0)
|
|
{
|
|
if (!bNewContent)
|
|
TimerInterval=0;
|
|
return;
|
|
}
|
|
|
|
if (ScrollState == STS_Repeat)
|
|
{
|
|
Restart();
|
|
}
|
|
else if (ScrollState == STS_EOL)
|
|
{
|
|
if (!SkipChar())
|
|
{
|
|
if (bRepeat)
|
|
{
|
|
if (RepeatDelay > 0)
|
|
{
|
|
TimerInterval = RepeatDelay;
|
|
ScrollState = STS_Repeat;
|
|
}
|
|
else
|
|
Restart();
|
|
}
|
|
else
|
|
{
|
|
bStopped = true;
|
|
ScrollState = STS_None;
|
|
TimerInterval = 0;
|
|
}
|
|
}
|
|
}
|
|
else if (ScrollState == STS_None)
|
|
{
|
|
ScrollState = STS_Initial;
|
|
SetTimer(CharDelay, true);
|
|
}
|
|
else
|
|
{
|
|
if (!SkipChar())
|
|
{
|
|
ScrollState=STS_EOL;
|
|
TimerInterval=EOLDelay;
|
|
OnEndOfLine();
|
|
}
|
|
}
|
|
}
|
|
|
|
function bool InternalOnClick(GUIComponent Sender)
|
|
{
|
|
local bool retval;
|
|
|
|
if(bClickText)
|
|
{
|
|
ClickedString = GetWordUnderCursor();
|
|
return true;
|
|
}
|
|
|
|
retval = Super.InternalOnClick(Sender);
|
|
if (retval)
|
|
EndScrolling();
|
|
|
|
return retval;
|
|
}
|
|
|
|
function bool InternalOnKeyType(out byte Key, optional string Unicode)
|
|
{
|
|
//local bool retval;
|
|
|
|
// retval = Super.InternalOnKeyType(Key, Unicode);
|
|
// if (retval)
|
|
EndScrolling();
|
|
|
|
// return retval;
|
|
return false;
|
|
}
|
|
|
|
function bool InternalOnKeyEvent(out byte Key, out byte State, float delta)
|
|
{
|
|
local bool retval;
|
|
|
|
retval = Super.InternalOnKeyEvent(Key, State, delta);
|
|
if (retval)
|
|
EndScrolling();
|
|
|
|
return retval;
|
|
}
|
|
|
|
function EndScrolling()
|
|
{
|
|
bStopped = true;
|
|
if(MyScrollBar != None)
|
|
MyScrollBar.AlignThumb();
|
|
KillTimer();
|
|
}
|
|
|
|
function bool IsValid()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
defaultproperties
|
|
{
|
|
OnKeyType=InternalOnKeyType
|
|
OnKeyEvent=InternalOnKeyEvent
|
|
OnClick=InternalOnClick
|
|
|
|
ScrollState=STS_None
|
|
Separator="|"
|
|
TextAlign=TXTA_Left
|
|
InitialDelay=0.0
|
|
CharDelay=0.25
|
|
EOLDelay=0.75
|
|
RepeatDelay=3.0
|
|
VisibleLines=-1
|
|
}
|