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

164 lines
4.0 KiB
Ucode

//==============================================================================
// A timed label used to display subtitles
//
// Written by Michiel Hendriks
// (c) 2003, Epic Games, Inc. All Rights Reserved
//==============================================================================
class GUISubtitleText extends GUILabel;
/** each subtitle on a diffirent line */
var() array<string> SubTitles;
/**
Visible is the time this subtitle is vissible
Delay is the time to wait to display the next sub title
*/
struct VisibleDelay
{
var float Visible;
var float Delay;
};
/** time to show a single subtitle */
var() array<VisibleDelay> SubTitleTiming;
/** default subtitle visibility, if <= 0 remain visible */
var() float VisibleTime;
/** default delay time */
var() float DelayTime;
/** initial delay */
var() float InitialDelay;
/** use by SetSubTitles to guess the delay, delay = guess time * no. chars */
var() float GuessCharTime;
/** default seperator */
var string Separator;
var protected int CurLine;
var protected enum eDisplayState {
DS_Delay,
DS_Visibility,
DS_Stopped,
} DisplayState;
delegate OnStopped();
function Restart()
{
CurLine = 0;
Caption = "";
DisplayState = DS_Delay;
if (InitialDelay <= 0.0) SetTimer(0.001, true);
else SetTimer(InitialDelay, true);
}
function Stop()
{
Caption="";
TimerInterval = 0;
DisplayState = DS_Stopped;
OnStopped();
}
/**
Set the subtitles, using default timing
if bDontGuess == true lengthdata will be used (uses the same seperator)
Return the number of items added
*/
function int SetSubtitles(string alldata, optional string sep, optional bool bDontGuess, optional string lengthdata)
{
local array<string> newdata, datalength;
local int i;
if (sep == "") sep = Separator;
split(alldata, sep, newdata);
if (bDontGuess)
{
split(lengthdata, sep, datalength);
datalength.length = newdata.length;
}
ClearSubtitles();
for (i = 0; i < newdata.length; i++)
{
if (bDontGuess) AddSubtitle(newdata[i], float(datalength[i]));
else AddSubtitle(newdata[i], GuessCharTime*Len(newdata[i]));
}
Restart();
return i;
}
/**
Add a subtitle
if delay/visible is omitted or 0 the default value is used
to have an actual 0 as visible/delay use a negative value
*/
function int AddSubtitle(string NewTitle, optional float delay, optional float Visible)
{
return InsertSubtitle(SubTitles.length, NewTitle, delay, Visible);
}
/**
Insert a subtitle
If the position is invalid -1 is returned
*/
function int InsertSubtitle(int position, string NewTitle, optional float delay, optional float Visible)
{
if (position > SubTitles.Length) return -1;
if (position < 0) return -1;
SubTitles.Insert(position, 1);
SubTitleTiming.Insert(position, 1);
SubTitles[position] = NewTitle;
if (delay == 0) delay = DelayTime;
SubTitleTiming[position].Delay = Max(delay, 0);
if (visible == 0) visible = VisibleTime;
if (visible >= delay) visible = 0;
SubTitleTiming[position].Visible = Max(visible, 0);
//Log(":::: Added new subtitle: '"$NewTitle$"'"@delay@Visible@position);
return position;
}
function ClearSubtitles()
{
SubTitles.length = 0;
SubTitleTiming.length = 0;
}
event Timer()
{
if (CurLine >= SubTitles.length)
{
Caption="";
TimerInterval = 0;
DisplayState = DS_Stopped;
OnStopped();
return;
}
if (DisplayState == DS_Delay)
{
Caption = SubTitles[CurLine];
if (SubTitleTiming[CurLine].Visible > 0)
{
DisplayState = DS_Visibility;
TimerInterval = SubTitleTiming[CurLine].Visible;
}
else {
TimerInterval = SubTitleTiming[CurLine].delay;
CurLine++;
}
}
else if (DisplayState == DS_Visibility) {
Caption = "";
DisplayState = DS_Delay;
TimerInterval = SubTitleTiming[CurLine].delay-SubTitleTiming[CurLine].Visible;
CurLine++;
}
}
defaultproperties
{
TextAlign=TXTA_Center
InitialDelay=0
GuessCharTime=0.06
DelayTime=2
VisibleTime=0
bTransparent=true
bMultiLine=true
Separator="|"
StyleName="TextLabel"
}