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

477 lines
9.4 KiB
Ucode

// ====================================================================
// Class: UT2K4UI.GUIComboBox
//
// A Combination of an EditBox, a Down Arrow Button and a ListBox
//
// Written by Michel Comeau
// Updated by Ron Prestenback
// (c) 2002, 2003 Epic Games, Inc. All Rights Reserved
// ====================================================================
class GUIComboBox extends GUIMultiComponent
Native;
cpptext
{
void PreDraw(UCanvas* Canvas);
}
var() bool bReadOnly;
var() bool bValueReadOnly;
var() bool bIgnoreChangeWhenTyping; // If not read-only, only accept OnChange when Enter is pressed
var() bool bShowListOnFocus;
var() int MaxVisibleItems;
var() editconst int Index;
var() editconst string TextStr;
var() editconst GUIList List;
var Automated GUIEditBox Edit;
var Automated GUIScrollButtonBase MyShowListBtn;
var Automated GUIListBox MyListBox;
delegate OnShowList(); // Called when the list is shown
delegate OnHideList(); // Called when the list is hidden
function InitComponent(GUIController MyController, GUIComponent MyOwner)
{
Super.Initcomponent(MyController, MyOwner);
List = MyListBox.List;
List.OnChange = ItemChanged;
List.bHotTrack = true;
List.bHotTrackSound = false;
List.OnClickSound = CS_Click;
List.OnClick = InternalListClick;
List.OnInvalidate = InternalOnInvalidate;
List.TextAlign = TXTA_Left;
MyListBox.Hide();
Edit.OnChange = TextChanged;
Edit.OnMousePressed = InternalEditPressed;
Edit.INIOption = INIOption;
Edit.INIDefault = INIDefault;
Edit.bReadOnly = bReadOnly;
List.OnDeActivate = InternalListDeActivate;
MyShowListBtn.OnClick = ShowListBox;
MyShowListBtn.FocusInstead = List;
SetHint(Hint);
}
function SetHint(string NewHint)
{
Super.SetHint(NewHint);
MyShowListBtn.SetHint(NewHint);
Edit.SetHint(NewHint);
}
function bool InternalOnKeyEvent(out byte Key, out byte State, float Delta)
{
local Interactions.EInputKey iKey;
if ( State == 3 )
{
iKey = EInputKey(Key);
if (iKey == IK_Down && Controller.ShiftPressed)
{
ShowListBox(Self);
return true;
}
if ( iKey == IK_Enter && !bReadOnly && !bValueReadOnly && bIgnoreChangeWhenTyping && TextStr != Edit.GetText() )
{
TextStr = Edit.TextStr;
OnChange(self);
}
}
return false;
}
function InternalListDeActivate()
{
if ( bDebugging )
log(Name@"ListDeactivate Edit.bPendingFocus: "$Edit.bPendingFocus);
if (!Edit.bPendingFocus)
HideListBox();
}
function InternalOnInvalidate(GUIComponent Who)
{
if ( bDebugging )
log(Name@"Invalidate Who:"$Who);
if ( Who != Controller.ActivePage )
return;
Edit.SetFocus(None);
HideListBox();
}
function InternalEditPressed(GUIComponent Sender, bool bRepeat)
{
if ( bDebugging )
log(Name@"EditPressed MyListBox.bVisible:"@MyListBox.bVisible);
if ( Edit.bReadOnly && !bRepeat )
{
if ( !MyListBox.bVisible )
{
Controller.bIgnoreNextRelease = true;
ShowListBox(Self);
}
else
HideListBox();
}
return;
}
function bool InternalListClick(GUIComponent Sender)
{
if ( bDebugging )
log(Name@"ListClick");
if ( !bValueReadOnly )
List.InternalOnClick(Sender);
Edit.SetFocus(none);
HideListBox();
return true;
}
function string InternalOnSaveIni(GUIComponent Sender)
{
return OnSaveIni(Sender);
}
function InternalOnLoadIni(GUIComponent Sender, string S)
{
OnLoadIni(Sender, S);
}
function HideListBox()
{
if ( bDebugging )
log(Name@"HideListBox");
OnHideList();
if ( Controller != None )
MyShowListBtn.Graphic = Controller.ImageList[7];
MyListBox.Hide();
List.SilentSetIndex( List.FindIndex(TextStr) );
}
event SetVisibility(bool bIsVisible)
{
local bool bTemp;
Super(GUIComponent).SetVisibility(bIsVisible);
bTemp = bDebugging;
bDebugging = False;
HideListBox();
MyShowListBtn.SetVisibility(bIsVisible);
Edit.SetVisibility(bIsVisible);
bDebugging = bTemp;
}
function bool ShowListBox(GUIComponent Sender)
{
if ( bDebugging )
log(Name@"ShowListBox MyListBox.bVisible:"$MyListBox.bVisible);
OnShowList();
MyListBox.SetVisibility(!MyListBox.bVisible);
if (MyListBox.bVisible)
MyShowListBtn.Graphic = Controller.ImageList[2];
else
MyShowListBtn.Graphic = Controller.ImageList[7];
if (MyListBox.bVisible)
{
List.SetFocus(none);
List.SetTopItem(List.Index);
}
return true;
}
function ItemChanged(GUIComponent Sender)
{
Index = List.Index;
SetText(List.Get());
if ( !bReadOnly && !bValueReadOnly && bIgnoreChangeWhenTyping )
{
TextStr = Edit.TextStr;
OnChange(Self);
}
}
function TextChanged(GUIComponent Sender)
{
if ( bValueReadOnly )
Edit.TextStr = TextStr;
else if ( bReadOnly || !bIgnoreChangeWhenTyping )
{
TextStr = Edit.TextStr;
OnChange(self);
}
}
function SetText(string NewText, optional bool bListItemsOnly)
{
local int i;
i = List.FindIndex(NewText);
if ( (bReadOnly || bListItemsOnly) && i < 0 )
return;
Edit.SetText(NewText);
TextStr = Edit.TextStr;
}
function SetExtra(string NewExtra, optional bool bListItemsOnly)
{
local int i;
i = FindExtra(NewExtra);
if (( bReadOnly || bListItemsOnly ) && i < 0 )
return;
Edit.SetText( List.GetItemAtIndex(i) );
}
function string Get()
{
return Edit.GetText();
}
function string GetText()
{
return Get();
}
function object GetObject()
{
local string temp;
temp = List.Get();
if ( temp~=Edit.GetText() )
return List.GetObject();
return none;
}
function string GetExtra()
{
local string temp;
temp = List.Get();
if ( temp~=Edit.GetText() )
return List.GetExtra();
return "";
}
function SetIndex(int I)
{
List.SetIndex(i);
}
function int GetIndex()
{
return List.Index;
}
function AddItem(string Item, Optional object Extra, Optional string Str)
{
List.Add(Item,Extra,Str);
}
function RemoveItem(int Item, optional int Count)
{
List.Remove(Item, Count);
}
function string GetItem(int index)
{
return List.GetItemAtIndex(index);
}
function object GetItemObject(int index)
{
return List.GetObjectAtIndex(index);
}
function string find(string Text, optional bool bExact, optional bool bExtra)
{
return List.Find(Text,bExact, bExtra);
}
function int FindExtra(string Text, optional bool bExact)
{
return List.FindExtra(Text, bExact);
}
function int FindIndex(string Test, optional bool bExact, optional bool bExtra, optional Object Obj)
{
return List.FindIndex(Test, bExact, bExtra, Obj);
}
function int ItemCount()
{
return List.ItemCount;
}
function ReadOnly(bool b)
{
Edit.bReadOnly = b;
}
function InternalOnMousePressed(GUIComponent Sender, bool bRepeat)
{
if (!bRepeat)
{
if ( bDebugging )
log(Name@"MousePressed");
ShowListBox(Sender);
}
}
function Clear()
{
List.Clear();
if ( bReadOnly )
Edit.SetText("");
// Set my values directly, in case component's state prevented OnChange() events from being passed upwards
TextStr = "";
Index = -1;
}
function CenterMouse()
{
if ( MyShowListBtn != None )
MyShowListBtn.CenterMouse();
else Super.CenterMouse();
}
function SetFriendlyLabel( GUILabel NewLabel )
{
Super.SetFriendlyLabel(NewLabel);
if ( Edit != None )
Edit.SetFriendlyLabel(NewLabel);
if ( MyShowListBtn != None )
MyShowListBtn.SetFriendlyLabel(NewLabel);
if ( MyListBox != None )
MyListBox.SetFriendlyLabel(NewLabel);
}
function LoseFocus(GUIComponent Sender)
{
if ( bDebugging )
log(Name@"LoseFocus Sender:"$Sender);
Super.LoseFocus(Sender);
}
function bool FocusFirst( GUIComponent Sender )
{
if ( Edit != None )
{
HideListBox();
Edit.SetFocus(None);
return true;
}
if ( bAcceptsInput )
{
Super(GUIComponent).SetFocus(None);
return true;
}
return false;
}
function bool FocusLast( GUIComponent Sender )
{
if ( Edit != None )
{
HideListBox();
Edit.SetFocus(None);
return true;
}
if ( bAcceptsInput )
{
Super(GUIComponent).SetFocus(None);
return true;
}
return false;
}
defaultproperties
{
OnKeyEvent=InternalOnKeyEvent
Begin Object Class=GUIToolTip Name=GUIComboBoxToolTip
End Object
ToolTip=GUIComboBoxToolTip
Begin Object Class=GUIEditBox Name=EditBox1
bNeverScale=True
TextStr=""
RenderWeight=0.5
End Object
Begin Object Class=GUIComboButton Name=ShowList
bNeverScale=True
bRepeatClick=false
bTabStop=False
RenderWeight=0.6
End Object
Begin Object Class=GUIListBox Name=ListBox1
bNeverScale=True
StyleName="ComboListBox"
bVisible=false
FontScale=FNT_Medium
bTabStop=False
RenderWeight=0.7
End Object
Edit=EditBox1
MyShowListBtn=ShowList
MyListBox=ListBox1
MaxVisibleItems=8
WinHeight=0.06
bAcceptsInput=True
PropagateVisibility=true
Index = -1
}