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

195 lines
4.6 KiB
Ucode

class GUIMultiColumnList extends GUIVertList
native;
cpptext
{
INT FindSortIndex( INT YourArrayIndex ) const;
}
struct native init MultiColumnSortData
{
var() editconst const string SortString; // Set by GetSortString()
var() editconst const int SortItem; // Should be the index into your array for the corresponding SortString
cppstruct
{
FMultiColumnSortData( INT InSortItem = INDEX_NONE, const TCHAR* InString = TEXT("") );
}
};
// There should always be the same number of ColumnHeadings as InitColumnPerc
var() localized array<string> ColumnHeadings;
var() array<float> InitColumnPerc;
var() localized array<string> ColumnHeadingHints;
// Set natively, for speed
var const array<MultiColumnSortData> SortData; // Filled with results of GetSortString()
var const array<int> InvSortData; // Used for keeping same item selected after sorting
var() const editconst array<float> ColumnWidths;
// sorting stuff
var() float CellSpacing;
var() int SortColumn; // Column that is currently used for sorting ( -1 for no sorting )
var() bool NeedsSorting; // Will automatically sort when this is true
var() bool SortDescending; // Used by native sorting to determine which direction to sort
var() bool ExpandLastColumn; // If true & columns widths do not add up to 100%, last column will be stretched
// notification
delegate OnColumnSized(int column);
native final function int GetListIndex( int YourArrayIndex );
native final function ChangeSortOrder();
native final function SortList();
native final function UpdatedItem( int YourArrayIndex ); // should be called when we update an item's data
native final function RemovedItem( int YourArrayIndex );
// must be called when we add an item to the list.
// If your data is contained in a single array, but is represented as multiple multicolumn lists,
// pass in your array index (see UT2K4Tab_PlayerLoginControls for an example of this)
native final function AddedItem(optional int YourArrayIndex);
delegate string GetSortString( int YourArrayIndex );
function int CurrentListId()
{
if (Index < 0)
return -1;
return SortData[Index].SortItem;
}
event OnSortChanged()
{
if (SortData.Length <= 0)
return;
ChangeSortOrder();
// resort list
SortList();
// remap the selection item back again to keep the same item selected
if ( IsValid() )
Index = InvSortData[Index];
}
function Clear()
{
SortData.Remove(0,SortData.Length);
InvSortData.Remove(0,InvSortData.Length);
Super.Clear();
}
function RemovedCurrent()
{
if ( IsValid() )
{
RemovedItem(CurrentListId());
SetIndex(Index);
}
}
function ResolutionChanged( int ResX, int ResY )
{
if ( !bInit )
bInit = True;
Super.ResolutionChanged(ResX,ResY);
}
event InitializeColumns(Canvas C)
{
local int i;
local float AW;
if ( bDebugging )
log(Name@"#### InitializeColumns ActualWidth() = "@ActualWidth()@"WinWidth:"$WinWidth);
AW = ActualWidth();
for(i=0; i<InitColumnPerc.Length; i++)
{
if ( bDebugging )
log(Name@"#### InitColumnPerc["$i$"]:"$InitColumnPerc[i]);
ColumnWidths[i] = AW * InitColumnPerc[i];
}
bInit = false;
}
function bool InternalOnPreDraw(Canvas C)
{
local float x;
local int i;
if (bInit)
return false;
if( NeedsSorting )
{
SortList();
if ( IsValid() )
Index = InvSortData[Index];
}
if( ExpandLastColumn )
{
for( i=0;i<ColumnWidths.Length-1;i++ )
x += ColumnWidths[i];
ColumnWidths[i] = ActualWidth() - x;
}
return false;
}
function GetCellLeftWidth( int Column, out float Left, out float Width )
{
local int i;
Left = ClientBounds[0];
for( i=0;i<Column && i<ColumnWidths.Length;i++ )
Left += ColumnWidths[i];
if( i<ColumnWidths.Length )
Width = ColumnWidths[i];
else
Width = 0;
Left += CellSpacing;
Width -= 2*CellSpacing;
if ( Left >= Bounds[2] )
Width = 0;
if (Left + Width >= Bounds[2])
Width = Bounds[2] - Left;
if ( Width < 0 )
Width = 0;
}
function Sort()
{
SortList();
}
function Dump()
{
local int i;
log("Dumping multicolumn list contents '"$Name$"'");
for ( i = 0; i < SortData.Length; i++ )
{
if ( i < InvSortData.Length )
log(" " $ i $ ")" @ "'" $ SortData[i].SortString $ "'" @ SortData[i].SortItem @ "InvSortData:"$InvSortData[i]);
else log(" " $ i $ ")" @ "'" $ SortData[i].SortString $ "'" @ SortData[i].SortItem @ "InvSortData: Invalid");
}
}
defaultproperties
{
OnPreDraw=InternalOnPreDraw
CellSpacing=1.0
}