1
0
KF2-Dev-Scripts/GameFramework/Classes/MobileMenuBar.uc
2020-12-13 18:01:13 +03:00

201 lines
4.6 KiB
Ucode

/**
* MobileMenuBar
* A container of items that can be selected on a bar - think letters on side of contact list.
*
* Copyright 1998-2013 Epic Games, Inc. All Rights Reserved.
*/
class MobileMenuBar extends MobileMenuObject;
/** Vertical or horizontal list supported */
var(DefaultInit) bool bIsVertical;
/** Current selected index */
var(DefaultInit) int SelectedIndex;
/** First item to draw */
var int FirstItem;
/** List of items */
var array<MobileMenuBarItem> Items;
/** Do we need to update before rendering */
var bool bDirty;
/**
* InitMenuObject - Virtual override from base to init object.
*
* @param PlayerInput - A pointer to the MobilePlayerInput object that owns the UI system
* @param Scene - The scene this object is in
* @param ScreenWidth - The Width of the Screen
* @param ScreenHeight - The Height of the Screen
*/
function InitMenuObject(MobilePlayerInput PlayerInput, MobileMenuScene Scene, int ScreenWidth, int ScreenHeight, bool bIsFirstInitialization)
{
Super.InitMenuObject(PlayerInput, Scene, ScreenWidth, ScreenHeight, bIsFirstInitialization);
UpdateItemViewports();
}
function AddItem(MobileMenuBarItem Item, Int Index=-1)
{
if (Index < 0)
{
Index = Items.length + (Index + 1);
}
Items.InsertItem(Index, Item);
bDirty = true;
}
function int Num()
{
return Items.length;
}
function MobileMenuBarItem GetSelected()
{
if ((SelectedIndex >= 0) && (SelectedIndex < Items.length))
{
return Items[SelectedIndex];
}
return none;
}
/**
* This event is called when a "touch" event is detected on the object.
* If false is returned (unhanded) event will be passed to scene.
*
* @param EventType - type of event
* @param TouchX - The X location of the touch event
* @param TouchY - The Y location of the touch event
* @param ObjectOver - The Object that mouse is over (NOTE: May be NULL or another object!)
*/
event bool OnTouch(ETouchType EventType, float TouchX, float TouchY, MobileMenuObject ObjectOver, float DeltaTime)
{
if (bIsVertical)
{
TouchY -= Top;
for (SelectedIndex = FirstItem; SelectedIndex < Items.Length-1; SelectedIndex++)
{
TouchY -= Items[SelectedIndex].Height;
if (TouchY <= 0)
break;
}
}
else
{
TouchX -= Left;
for (SelectedIndex = 0; SelectedIndex < Items.Length-1; SelectedIndex++)
{
TouchX -= Items[SelectedIndex].Width;
if (TouchX <= 0)
break;
}
}
return true;
}
/**
* Render the widget
*
* @param Canvas - the canvas object for drawing
*/
function RenderObject(canvas Canvas, float DeltaTime)
{
local float OrgX, OrgY;
local int CurIndex;
if (bDirty)
{
UpdateItemViewports();
}
OrgX = Canvas.OrgX;
OrgY = Canvas.OrgY;
Canvas.SetOrigin(Left, Top);
// Now render up to (not including) selected, then backwards to and including selected.
// This is so if we render larger that our VP, the selected on will be top.
for (CurIndex = 0; CurIndex < Items.Length; CurIndex++)
{
RenderItem(Canvas, DeltaTime, CurIndex);
}
// Restore to not mess up next scene.
Canvas.OrgX = OrgX;
Canvas.OrgY = OrgY;
}
/**
* Inheriting class can overload each item itself and not bother with the MobileMenuBarItem doing the rendering
*
* @param Canvas - the canvas object for drawing
* @param DeltaTime - How much time as passed.
* @param Index - Index of the item.
*/
function RenderItem(Canvas Canvas, float DeltaTime, int ItemIndex)
{
Items[ItemIndex].RenderItem(self, Canvas, DeltaTime);
}
function SetFirstItem(int First)
{
FirstItem = First;
bDirty = true;
}
/** Recalculate size and position of each sub item */
function UpdateItemViewports()
{
local MobileMenuBarItem Item;
local float Pos;
local int CurIndex;
Pos = 0;
Width = 0;
Height = 0;
if (bIsVertical)
{
for (CurIndex = FirstItem; CurIndex < Items.Length; CurIndex++)
{
Item = Items[CurIndex];
Width = FMax(Width, Item.Width);
Height += Item.Height;
}
for (CurIndex = FirstItem; CurIndex < Items.Length; CurIndex++)
{
Item = Items[CurIndex];
Item.VpPos.X = 0;
Item.VpPos.Y = Pos;
Pos += Item.Height;
}
}
else
{
for (CurIndex = FirstItem; CurIndex < Items.Length; CurIndex++)
{
Item = Items[CurIndex];
Width += Item.Width;
Height = FMax(Height, Item.Height);
}
for (CurIndex = FirstItem; CurIndex < Items.Length; CurIndex++)
{
Item = Items[CurIndex];
Item.VpPos.X = Pos;
Item.VpPos.Y = 0;
Pos += Item.Width;
}
}
bDirty = false;
}
defaultproperties
{
bIsActive=true
bIsVertical=true
SelectedIndex=0
}