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

297 lines
7.3 KiB
Ucode

Class UI_Window extends FloatingWindow;
struct FComponentData
{
var GUIComponent Component;
var string OldData;
var byte Type;
var bool bInstantUpdate,bLocked;
};
var name WindowID;
var array<FComponentData> MyComponents;
var UI_Replication RepNotify;
var bool bSecureChanges;
function InitComponent(GUIController MyController, GUIComponent MyOwner)
{
Super.InitComponent(MyController,MyOwner);
if( Default.RepNotify!=None )
{
Default.RepNotify.TempNewMenu = Self;
Default.RepNotify = None;
}
}
function HandleParameters(string Param1, string Param2)
{
t_WindowTitle.SetCaption(Param1);
WindowName = Param1;
}
function Closed( GUIComponent Sender, bool bCancelled )
{
if( RepNotify!=None )
RepNotify.WindowClosed(Self);
RepNotify = None;
Super.Closed(Sender, bCancelled);
}
final function InitFloatValue( moFloatEdit C, string V )
{
local string S;
local float FA,FB,FC;
Divide(V,":",S,V);
FA = float(S);
Divide(V,":",S,V);
FB = float(S);
Divide(V,":",S,V);
FC = float(S);
C.Setup(FA,FB,FC);
C.SetComponentValue(V,true);
}
final function InitIntValue( moNumericEdit C, string V )
{
local string S;
local int FA,FB,FC;
Divide(V,":",S,V);
FA = int(S);
Divide(V,":",S,V);
FB = int(S);
Divide(V,":",S,V);
FC = int(S);
C.Setup(FA,FB,FC);
C.SetComponentValue(V,true);
}
final function InitComboBox( moComboBox C, string V )
{
local string S;
local array<string> AR;
local int i;
Divide(V,";",S,V);
Split(V,":",AR);
if( C.ItemCount()>0 )
C.ResetComponent();
for( i=0; i<AR.Length; ++i )
C.AddItem(AR[i]);
C.SilentSetIndex(int(S));
}
final function bool AddCompID( int ID, byte Type, bool bInstant, bool bLock, float X, float Y, float XS, float YS, string Value, string ToolTipS )
{
local GUIComponent NC;
bSecureChanges = true;
if( MyComponents.Length<=ID )
MyComponents.Length = (ID+1);
NC = MyComponents[ID].Component;
MyComponents[ID].OldData = "";
if( NC!=None && MyComponents[ID].Type!=Type )
{
RemoveComponent(NC);
NC = None;
}
switch( Type )
{
case 0: // Button.
case 1: // Submit.
case 2: // Close.
if( NC==None )
NC = AddComponent(string(Class'GUIButton'));
GUIButton(NC).Caption = Value;
GUIButton(NC).OnClick = InternalOnClick;
break;
case 3: // Editbox
if( NC==None )
NC = AddComponent(string(Class'moEditBox'));
moEditBox(NC).SetComponentValue(Value,true);
moEditBox(NC).OnChange = ValueChange;
MyComponents[ID].OldData = Value;
break;
case 4: // Floating point editbox
if( NC==None )
NC = AddComponent(string(Class'moFloatEdit'));
InitFloatValue(moFloatEdit(NC),Value);
moFloatEdit(NC).OnChange = ValueChange;
break;
case 5: // Numeric editbox
if( NC==None )
NC = AddComponent(string(Class'moNumericEdit'));
InitIntValue(moNumericEdit(NC),Value);
moNumericEdit(NC).OnChange = ValueChange;
break;
case 6: // Combo box.
if( NC==None )
NC = AddComponent(string(Class'moComboBox'));
InitComboBox(moComboBox(NC),Value);
moComboBox(NC).OnChange = ValueChange;
break;
case 7: // Checkbox
if( NC==None )
NC = AddComponent(string(Class'moCheckBox'));
moCheckBox(NC).SetComponentValue(Value,true);
moCheckBox(NC).OnChange = ValueChange;
break;
case 8: // Textbox.
if( NC==None )
NC = AddComponent(string(Class'GUIScrollTextBox'));
GUIScrollTextBox(NC).SetContent(Value);
break;
default:
Warn("Unknown component ID.");
bSecureChanges = false;
return false;
}
MyComponents[ID].bLocked = bLock;
MyComponents[ID].bInstantUpdate = bInstant;
MyComponents[ID].Component = NC;
MyComponents[ID].Type = Type;
NC.WinTop = Y;
NC.WinLeft = X;
NC.WinWidth = XS;
NC.WinHeight = YS;
if( bLock )
NC.DisableMe();
else NC.EnableMe();
if( ToolTipS!="" )
{
if( NC.ToolTip!=None )
NC.SetToolTipText(ToolTipS);
if( GUIMenuOption(NC)!=None )
GUIMenuOption(NC).SetCaption(ToolTipS);
}
bSecureChanges = false;
return true;
}
final function string GetComponentData( int Index )
{
if( MyComponents.Length<=Index || MyComponents[Index].Component==None )
return "";
switch( MyComponents[Index].Type )
{
case 0: // Button.
case 1: // Submit.
case 2: // Close.
case 8: // Textbox
return "";
case 6:
return string(moComboBox(MyComponents[Index].Component).GetIndex());
case 7:
return Eval(moCheckBox(MyComponents[Index].Component).IsChecked(),"1","0");
default:
return GUIMenuOption(MyComponents[Index].Component).GetComponentValue();
}
}
final function bool SetComponentData( int Index, string Data )
{
if( MyComponents.Length<=Index || MyComponents[Index].Component==None )
return false;
bSecureChanges = true;
switch( MyComponents[Index].Type )
{
case 0: // Button.
case 1:
case 2:
GUIButton(MyComponents[Index].Component).Caption = Data;
break;
case 6:
moComboBox(MyComponents[Index].Component).SilentSetIndex(int(Data));
break;
case 8:
GUIScrollTextBox(MyComponents[Index].Component).SetContent(Data);
break;
default:
MyComponents[Index].OldData = Data;
GUIMenuOption(MyComponents[Index].Component).SetComponentValue(Data,true);
}
bSecureChanges = false;
return true;
}
final function bool SetComponentLock( int Index, bool bLocked )
{
if( MyComponents.Length<=Index || MyComponents[Index].Component==None || MyComponents[Index].bLocked==bLocked )
return false;
bSecureChanges = true;
MyComponents[Index].bLocked = bLocked;
if( bLocked )
MyComponents[Index].Component.DisableMe();
else MyComponents[Index].Component.EnableMe();
bSecureChanges = false;
return true;
}
final function SendChanges()
{
local string S;
local int i;
for( i=0; i<MyComponents.Length; ++i )
if( MyComponents[i].Component!=None && MyComponents[i].Type>=3 )
{
S = GetComponentData(i);
if( S!=MyComponents[i].OldData )
{
RepNotify.ServerSubmitValue(WindowID,i,S);
MyComponents[i].OldData = S;
}
}
}
function bool InternalOnClick(GUIComponent Sender)
{
local int i;
local string S;
if( !bSecureChanges )
{
for( i=0; i<MyComponents.Length; ++i )
if( MyComponents[i].Component==Sender )
{
if( MyComponents[i].Type==1 && !MyComponents[i].bLocked )
{
SendChanges();
RepNotify.ServerSubmitValue(WindowID,i,"");
}
else if( MyComponents[i].Type==2 && !MyComponents[i].bLocked )
{
Controller.RemoveMenu(Self);
}
else if( MyComponents[i].bInstantUpdate && !MyComponents[i].bLocked )
{
S = GetComponentData(i);
if( MyComponents[i].Type==0 || S!=MyComponents[i].OldData )
{
RepNotify.ServerSubmitValue(WindowID,i,S);
MyComponents[i].OldData = S;
}
}
Return True;
}
}
Return False;
}
function ValueChange(GUIComponent Sender)
{
InternalOnClick(Sender);
}
defaultproperties
{
Begin Object Class=FloatingImage Name=FloatingFrameBg
Image=Texture'KF_InterfaceArt_tex.Menu.Thin_border'
DropShadow=None
ImageStyle=ISTY_Stretched
ImageRenderStyle=MSTY_Normal
WinTop=0.040000
WinLeft=0.000000
WinWidth=1.000000
WinHeight=0.960000
RenderWeight=0.000003
End Object
i_FrameBG=FloatingImage'ServerPerks.UI_Window.FloatingFrameBg'
bAllowedAsLast=True
}