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

345 lines
9.3 KiB
Ucode

//====================================================================
// Written by Ron Prestenback
// (c) 2003, Epic Games, Inc. All Rights Reserved
// ====================================================================
class UT2K4Browser_ServerListBox extends ServerBrowserMCListBox;
var() config string OpenIPPage;
var bool bIconClick;
var float IconCounter;
var array<string> ContextItems; // hack for localization
var int JOINIDX, SPECIDX, REPINGIDX, REFRESHIDX, FILTERIDX, TEMPLATEIDX, CLEARFILTERIDX, ADDFAVIDX, OPENIPIDX, COPYIDX;
function InitComponent(GUIController MyController, GUIComponent MyOwner)
{
Super(GUIListBoxBase).InitComponent(MyController, MyOwner);
ContextItems = ContextMenu.ContextItems;
}
function SetToolTipText( string NewToolTipText )
{
}
function bool PreDrawHint( Canvas C )
{
local UT2K4Browser_ServersList L;
local int IconW, i;
local float XL, YL, MaxWidth, TotalHeight;
local GUIStyles S;
L = UT2K4Browser_ServersList(List);
if ( L == None || Controller == None || !MousingOverIcons() || ToolTip == None || ToolTip.Style == None )
return true;
if ( ToolTip.bResetPosition || ToolTip.bTrackMouse )
{
S = ToolTip.Style;
// Figure out the dimensions of the bounding box
for ( i = 0; i < L.Icons.Length; i++ )
{
// if _RO_
if (L.Icons[i] != none)
{
// end if _RO_
// Get the width of the icon
IconW = L.Icons[i].MaterialUSize();
S.TextSize(C, L.MenuState, L.IconDescriptions[i], XL, YL, L.FontScale);
// Add a little space between the icon and the description
XL += (IconW + 0.2 * float(IconW));
if ( XL > MaxWidth )
MaxWidth = XL;
// If the height of the icon is larger than the height of the text, use the height of the icon instead
YL = Max( YL, L.Icons[i].MaterialVSize() );
TotalHeight += YL;
// if _RO_
}
// end if _RO_
}
TotalHeight += S.BorderOffsets[1] + S.BorderOffsets[3];
ToolTip.WinWidth = MaxWidth + S.BorderOffsets[0] + S.BorderOffsets[2];
ToolTip.WinHeight = TotalHeight;
ToolTip.WinTop = ToolTip.GetTop(C);
ToolTip.WinLeft = ToolTip.GetLeft(C);
ToolTip.bResetPosition = false;
}
return true;
}
function bool DrawHint( Canvas C )
{
local GUIStyles S;
local UT2K4Browser_ServersList L;
local plane NormMod;
local int i, IconW, IconH;
local float X, Y, XL, YL;
L = UT2K4Browser_ServersList(List);
if ( L == None || Controller == None || !MousingOverIcons() || ToolTip == None || ToolTip.Style == None )
return true;
S = ToolTip.Style;
X = ToolTip.WinLeft;
Y = ToolTip.WinTop;
XL = ToolTip.WinWidth;
YL = ToolTip.WinHeight;
// Draw the drop-shadow...a little off-center
NormMod = C.ColorModulate;
C.ColorModulate.W = 0.3; C.ColorModulate.X = 0.2; C.ColorModulate.Y = 0.2; C.ColorModulate.Z = 0.2;
S.Draw(C, MSAT_Blurry, X + 2, Y + 2, XL, YL);
// Restore the canvas modulation to previous value
C.ColorModulate = NormMod;
// Draw the background image
S.Draw(C, MSAT_Blurry, X, Y, XL, YL);
X += S.BorderOffsets[0];
Y += S.BorderOffsets[1];
for ( i = 0; i < L.Icons.Length; i++ )
{
// if _RO_
if (L.Icons[i] == none)
continue;
// end if _RO_
// Figure out the width of the icon
IconW = L.Icons[i].MaterialUSize();
IconH = L.Icons[i].MaterialVSize();
S.TextSize( C, L.MenuState, L.IconDescriptions[i], XL, YL, L.FontScale);
YL = FMax( YL, IconH );
// Draw the icon
C.SetPos( X, Y );
C.DrawTile( L.Icons[i], IconW, YL, 0, 0, IconW, IconH );
// Draw the description
S.DrawText(C, L.MenuState, X + IconW + 0.2 * float(IconW), Y, XL, YL, TXTA_Left, L.IconDescriptions[i], L.FontScale);
Y += YL;
}
return true;
}
function bool MousingOverIcons()
{
local float IconRight, IconLeft, IconWidth;
if ( List == None || Controller == None )
return false;
List.GetCellLeftWidth( 0, IconLeft, IconWidth );
IconRight = IconLeft + IconWidth;
return Controller.MouseX >= IconLeft && Controller.MouseX <= IconRight;
}
function bool InternalOnOpen(GUIContextMenu Sender)
{
Sender.ContextItems.Remove(0, Sender.ContextItems.Length);
if ( List.IsValid() )
{
Sender.ContextItems = ContextItems;
if ( class'LevelInfo'.static.IsDemoBuild() )
RemoveFilterOptions(Sender);
}
else
{
Sender.ContextItems[0] = ContextItems[ADDFAVIDX];
Sender.ContextItems[1] = ContextItems[OPENIPIDX];
}
return True;
}
function RemoveFilterOptions( GUIContextMenu Menu )
{
local int i;
for ( i = 0; i < Menu.ContextItems.Length; i++ )
if ( Menu.ContextItems[i] == ContextItems[FILTERIDX] )
{
Menu.ContextItems.Remove(i,4);
break;
}
}
function InternalOnClick(GUIContextMenu Sender, int Index)
{
local int i, idx;
local bool bWasSuccess;
local UT2K4Browser_ServersList L;
L = UT2K4Browser_ServersList(List);
if (Sender != None)
{
if ( Sender.ContextItems[Index] == "-" )
Index++;
if ( NotifyContextSelect(Sender, Index) )
return;
switch ( Sender.ContextItems[Index] )
{
case ContextItems[JOINIDX]: // Join
L.Connect(False);
break;
case ContextItems[SPECIDX]: // Spectate
L.Connect(True);
break;
case ContextItems[REPINGIDX]: // Refresh Server Info
idx = List.CurrentListId();
tp_Anchor.PingServer(idx, PC_Clicked, L.Servers[idx]);
break;
case ContextItems[REFRESHIDX]: // Refresh list
tp_Anchor.RefreshClicked();
break;
case ContextItems[FILTERIDX]: // Configure Filters
tp_Anchor.FilterClicked();
break;
case ContextItems[TEMPLATEIDX]: // Create Template
idx = List.CurrentListId();
if (idx >= 0 && Controller.OpenMenu(Controller.FilterMenu))
FilterPageBase(Controller.ActivePage).CreateTemplateFilter(L.Servers[idx].ServerName, L.Servers[idx].ServerInfo);
break;
case ContextItems[CLEARFILTERIDX]: // Deactivate All Filters
for (i = 0; i < tp_Anchor.FilterMaster.AllFilters.Length; i++)
if (tp_Anchor.FilterMaster.ActivateFilter(i, false))
bWasSuccess = True;
if (bWasSuccess)
{
tp_Anchor.FilterMaster.SaveFilters();
tp_Anchor.Refresh();
}
break;
case ContextItems[ADDFAVIDX]: // Add To Favorite
if ( L.IsValid() )
L.AddFavorite(tp_Anchor.Browser);
else if ( Controller.OpenMenu(Controller.EditFavoriteMenu) )
Controller.ActivePage.OnClose = AddFavClosed;
break;
case ContextItems[COPYIDX]:
L.CopyServerToClipboard();
break;
case ContextItems[OPENIPIDX]: // Open IP
if ( L.IsValid() )
Controller.OpenMenu( OpenIPPage, L.Get() );
else
Controller.OpenMenu( OpenIPPage );
break;
}
}
}
function AddFavClosed( bool bCancelled )
{
tp_Anchor.Browser.OnAddFavorite(EditFavoritePage(Controller.ActivePage).Server);
}
function SetAnchor(UT2K4Browser_ServerListPageBase AnchorPage)
{
Super.SetAnchor(AnchorPage);
MyScrollBar.MyGripButton.OnMousePressed = tp_Anchor.MousePressed;
MyScrollBar.MyGripButton.OnMouseRelease = tp_Anchor.MouseReleased;
}
function InitBaseList(GUIListBase LocalList)
{
local GUIMultiColumnList L;
L = GUIMultiColumnList(LocalList);
if (L == None || List == LocalList)
return;
if (List != None)
{
List.SetTimer(0.0, False);
RemoveComponent(List,true);
AppendComponent(L,false);
List = L;
}
else
{
List = L;
AppendComponent(L,false);
}
Header.MyList = List;
Super(GUIListBoxBase).InitBaseList(LocalList);
}
DefaultProperties
{
Begin Object Class=GUIContextMenu Name=RCMenu
ContextItems(0)="Join Server"
ContextItems(1)="Join As Spectator"
ContextItems(2)="-"
ContextItems(3)="Refresh Server Info"
ContextItems(4)="Refresh List"
ContextItems(5)="-"
ContextItems(6)="Configure Filters"
ContextItems(7)="Create Template"
ContextItems(8)="Deactivate All Filters"
ContextItems(9)="-"
ContextItems(10)="Add To Favorites"
ContextItems(11)="Copy server address"
ContextItems(12)="Open IP"
OnSelect=InternalOnClick
OnOpen=InternalOnOpen
OnClose=InternalOnClose
StyleName="ServerListContextMenu"
End Object
ContextMenu=RCMenu
DefaultListClass="GUI2K4.UT2K4Browser_ServersList"
OpenIPPage="GUI2K4.UT2K4Browser_OpenIP"
Begin object Class=GUIToolTip Name=ServerListToolTip
ExpirationSeconds=8
OnPreDraw=PreDrawHint
OnDraw=DrawHint
End Object
ToolTip=ServerListToolTip
JOINIDX=0
SPECIDX=1
REPINGIDX=3
REFRESHIDX=4
FILTERIDX=6
TEMPLATEIDX=7
CLEARFILTERIDX=8
ADDFAVIDX=10
COPYIDX=11
OPENIPIDX=12
}