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

433 lines
8.4 KiB
Ucode

// ====================================================================
// Class: MultiSelectList
//
// The MultiSelectList is a list component that allows selection of
// more than one Item.
//
// Written by Bruce Bickar
// (c) 2003, Epic Games, Inc. All Rights Reserved
// ====================================================================
class MultiSelectList extends GUIList
Native;
cpptext
{
virtual void Draw(UCanvas* Canvas);
protected:
virtual void DrawItem(UCanvas* Canvas, INT Item, FLOAT X, FLOAT Y, FLOAT W, FLOAT HT, UBOOL bSelected, UBOOL bPending);
public:
}
var array<MultiSelectListElem> MElements;
function Add(string NewItem, optional Object obj, optional string Str, optional bool bSection)
{
local int NewIndex;
if ( !bAllowEmptyItems && NewItem == "" && Obj == None && Str == "" )
return;
if (bSorted && MElements.Length > 0)
{
while (NewIndex < MElements.Length && MElements[NewIndex].Item < NewItem)
NewIndex++;
}
else NewIndex = MElements.Length;
MElements.Insert(NewIndex, 1);
MElements[NewIndex].Item=NewItem;
MElements[NewIndex].ExtraData=obj;
MElements[NewIndex].ExtraStrData=Str;
MElements[NewIndex].bSelected=False;
MElements[NewIndex].bSection=bSection;
ItemCount = MElements.Length;
//if (MElements.Length == 1)
// SetIndex(0);
//else
// OnChange(self);
if (MyScrollBar != None)
MyScrollBar.AlignThumb();
}
function Replace(int index, string NewItem, optional Object obj, optional string Str, optional bool bNoSort)
{
if ( !IsValidIndex(Index) )
Add(NewItem,Obj,Str);
else
{
if ( !bAllowEmptyItems && NewItem == "" && Obj == None && Str == "" )
return;
MElements[Index].Item = NewItem;
MElements[Index].ExtraData = obj;
MElements[Index].ExtraStrData = Str;
MElements[Index].bSelected = false;
if (bSorted)
Sort();
OnChange(Self);
}
}
function Insert(int Index, string NewItem, optional Object obj, optional string Str, optional bool bNoSort, optional bool bSection)
{
if ( !IsValidIndex(Index) )
Add(NewItem,Obj,Str);
else
{
if ( !bAllowEmptyItems && NewItem == "" && Obj == None && Str == "" )
return;
MElements.Insert(index,1);
MElements[Index].Item=NewItem;
MElements[Index].ExtraData=obj;
MElements[Index].ExtraStrData=Str;
MElements[Index].bSection=bSection;
MElements[Index].bSelected=false;
ItemCount=MElements.Length;
if (bSorted)
Sort();
OnChange(self);
if (MyScrollBar != None)
MyScrollBar.AlignThumb();
}
}
event Swap(int IndexA, int IndexB)
{
local MultiSelectListElem elem;
if ( IsValidIndex(IndexA) && IsValidIndex(IndexB) )
{
elem = MElements[IndexA];
MElements[IndexA] = MElements[IndexB];
MElements[IndexB] = elem;
if (bSorted)
Sort();
}
}
function LoadFrom(GUIList Source, optional bool bClearFirst)
{
local string t1,t2;
local object t;
local int i;
if(MultiSelectList(Source) == None)
return; // Source must be a MultiSelectList also
if (bClearfirst)
Clear();
for (i=0;i<MultiSelectList(Source).MElements.Length;i++)
{
MultiSelectList(Source).GetAtIndex(i,t1,t,t2);
Add(t1,t,t2);
}
}
function int Remove(int i, int Count, bool bNoSort)
{
if (Count==0)
Count=1;
if (!IsValidIndex(i))
return Index;
MElements.Remove(i, Count);
ItemCount = MElements.Length;
if (bSorted)
Sort();
SetIndex(-1);
if (MyScrollBar != None)
MyScrollBar.AlignThumb();
return Index;
}
function Clear()
{
if (MElements.Length == 0)
return;
MElements.Remove(0,MElements.Length);
ItemCount = 0;
Super.Clear();
}
function string Get(optional bool bGuarantee)
{
local string CSVString;
local int i;
for(i=0; i<MElements.Length; i++)
{
if(MElements[i].bSelected)
{
if(CSVString == "")
CSVString = MElements[i].Item;
else
CSVString = CSVString $ "," $ MElements[i].Item;
}
}
return CSVString;
}
function object GetObject()
{
if ( !IsValid() )
return none;
else
return MElements[Index].ExtraData;
}
function bool IsSection()
{
if ( !IsValid() )
return false;
else
return MElements[Index].bSection;
}
function string GetExtra()
{
local string CSVString;
local int i;
for(i=0; i<MElements.Length; i++)
{
if(MElements[i].bSelected)
{
if(CSVString == "")
CSVString = MElements[i].ExtraStrData;
else
CSVString = CSVString $ "," $ MElements[i].ExtraStrData;
}
}
return CSVString;
}
function string GetItemAtIndex(int i)
{
if (!IsValidIndex(i))
return "";
return MElements[i].Item;
}
function object GetObjectAtIndex(int i)
{
if (!IsValidIndex(i))
return None;
return MElements[i].ExtraData;
}
function string GetExtraAtIndex(int i)
{
if (!IsValidIndex(i))
return "";
return MElements[i].ExtraStrData;
}
function GetAtIndex(int i, out string ItemStr, out object ExtraObj, out string ExtraStr)
{
if (!IsValidIndex(i))
return;
ItemStr = MElements[i].Item;
ExtraObj = MElements[i].ExtraData;
ExtraStr = MElements[i].ExtraStrData;
}
function array<string> GetPendingItems(optional bool bGuarantee)
{
local array<string> Items;
/* local int i;
for ( i = 0; i < SourceIndex.Length; i++ )
if ( IsValidIndex(SourceIndex[i]) )
Items[Items.Length] = Elements[SourceIndex[i]].Item;
if ( Items.Length == 0 && IsValid() )
Items[0] = Get();
*/
return Items;
}
function array<GUIListElem> GetPendingElements(optional bool bGuarantee)
{
local array<GUIListElem> PendingItem;
/* local int i;
for (i = 0; i < SourceIndex.Length; i++)
if (IsValidIndex(SourceIndex[i]))
PendingItem[PendingItem.Length] = Elements[SourceIndex[i]];
*/
return PendingItem;
}
function SetItemAtIndex(int i, string NewItem)
{
if (!IsValidIndex(i))
return;
MElements[i].Item = NewItem;
}
function SetObjectAtIndex(int i, Object NewObject)
{
if (!IsValidIndex(i))
return;
MElements[i].ExtraData = NewObject;
}
function SetExtraAtIndex(int i, string NewExtra)
{
if (!IsValidIndex(i))
return;
MElements[i].ExtraStrData = NewExtra;
}
function RemoveItem(string Item)
{
local int i;
// Work through array. If we find it, remove it (will reduce Elements.Length).
// If we don't, move on to next one.
while( i < MElements.Length)
{
if(Item ~= MElements[i].Item)
MElements.Remove(i, 1);
else
i++;
}
ItemCount = MElements.Length;
SetIndex(-1);
if (MyScrollBar != None)
MyScrollBar.AlignThumb();
}
function RemoveObject(Object Obj)
{
local int i;
while (i < MElements.Length)
{
if (Obj == MElements[i].ExtraData)
MElements.Remove(i, 1);
else i++;
}
ItemCount = MElements.Length;
SetIndex(-1);
if (MyScrollBar != None)
MyScrollBar.AlignThumb();
}
function RemoveExtra(string Str)
{
local int i;
while (i < MElements.Length)
{
if (Str ~= MElements[i].ExtraStrData)
MElements.Remove(i, 1);
else i++;
}
ItemCount = MElements.Length;
SetIndex(-1);
if (MyScrollBar != None)
MyScrollBar.AlignThumb();
}
function string Find(string Text, optional bool bExact, optional bool bExtra)
{
local int i;
i = FindIndex(Text, bExact, bExtra);
if (i != -1)
{
SetIndex(i);
return MElements[i].Item;
}
return "";
}
function int FindIndex(string Test, optional bool bExact, optional bool bExtra, optional Object TestObject)
{
local int i;
if (TestObject != None)
{
for (i = 0; i < MElements.Length; i++)
if ( TestObject == MElements[i].ExtraData )
return i;
}
else if (Test != "")
{
if (bExtra)
{
for (i = 0; i < MElements.Length; i++)
if ( (bExact && MElements[i].ExtraStrData == Test) || (!bExact && MElements[i].ExtraStrData ~= Test) )
return i;
}
else
{
for ( i = 0; i < MElements.Length; i++)
if ( (bExact && MElements[i].Item == Test) || (!bExact && MElements[i].Item ~= Test) )
return i;
}
}
return -1;
}
function int SetIndex(int NewIndex)
{
if (NewIndex < 0 || NewIndex >= ItemCount)
Index = -1;
else
{
Index = NewIndex;
MElements[Index].bSelected = !MElements[Index].bSelected;
}
if ( (index>=0) && (ItemsPerPage>0) )
{
if (Index<top)
SetTopItem(Index);
if (ItemsPerPage != 0 && Index==Top+ItemsPerPage)
SetTopItem(Index - ItemsPerPage + 1);
}
OnChange(self);
return Index;
}