KF2-Server-Extension/ServerExt/Classes/KFGUI_ColumnTop.uc

195 lines
4.2 KiB
Ucode
Raw Normal View History

2017-10-20 02:00:49 +00:00
// Do not use this on your own, it is used by ColumnList
Class KFGUI_ColumnTop extends KFGUI_Base;
var() float ColumnMinSize; // Minimum pixels width allowed.
var KFGUI_ColumnList ListOwner;
var transient int PrevSortedColumn,MouseColumn,ScalingColumn;
var transient byte PressedDown[2];
var transient bool bPressedDown,bScaleColumn,bMouseScaler;
function InitMenu()
{
Super.InitMenu();
ListOwner = KFGUI_ColumnList(ParentComponent);
}
function DrawMenu()
{
local int i,j;
local float X,MouseX,GrabWidth,MinSize,Wd;
local bool bCheckMouse;
bClickable = ListOwner.bClickable;
MinSize = ColumnMinSize / CompPos[2];
// Scale column
2020-11-28 20:12:58 +00:00
if (bScaleColumn)
2017-10-20 02:00:49 +00:00
{
MouseX = Owner.MousePosition.X - CompPos[0];
2020-11-28 20:12:58 +00:00
for (i=0; i<ScalingColumn; ++i)
2017-10-20 02:00:49 +00:00
MouseX-=(ListOwner.Columns[i].Width * CompPos[2]);
ListOwner.Columns[ScalingColumn].Width = MouseX / CompPos[2];
// Make sure no column is scrolled off screen.
X = 0;
2020-11-28 20:12:58 +00:00
for (i=0; i<(ListOwner.Columns.Length-1); ++i)
2017-10-20 02:00:49 +00:00
{
2020-11-28 20:12:58 +00:00
if (ListOwner.Columns[i].Width<MinSize)
2017-10-20 02:00:49 +00:00
ListOwner.Columns[i].Width = MinSize;
X+=ListOwner.Columns[i].Width;
2020-11-28 20:12:58 +00:00
if (X>=(1.f-MinSize))
2017-10-20 02:00:49 +00:00
{
MouseX = X-(1.f-MinSize); // Grab overshoot.
// Then push back!
2020-11-28 20:12:58 +00:00
for (j=i; j>=0; --j)
2017-10-20 02:00:49 +00:00
{
2020-11-28 20:12:58 +00:00
if ((ListOwner.Columns[j].Width-MouseX)>MinSize) // This column has enough space to retract.
2017-10-20 02:00:49 +00:00
{
ListOwner.Columns[j].Width-=MouseX;
MouseX = 0;
break;
}
2020-11-28 20:12:58 +00:00
else if (ListOwner.Columns[j].Width>MinSize) // This column has limited space to retract.
2017-10-20 02:00:49 +00:00
{
MouseX-=(ListOwner.Columns[j].Width-MinSize);
ListOwner.Columns[j].Width = MinSize;
}
}
X = (1.f-MinSize); // Continue at maximum size.
}
}
}
// Init mouse check.
MouseColumn = -1;
bCheckMouse = (bClickable && bFocused);
2020-11-28 20:12:58 +00:00
if (bCheckMouse)
2017-10-20 02:00:49 +00:00
{
GrabWidth = CompPos[3]*0.175;
MouseX = Owner.MousePosition.X - CompPos[0] - GrabWidth;
GrabWidth *= -2.f;
}
// Draw the columns and compute the scalings.
X = 0;
j = (ListOwner.bShouldSortList ? ListOwner.LastSortedColumn : -1);
2020-11-28 20:12:58 +00:00
for (i=0; i<ListOwner.Columns.Length; ++i)
2017-10-20 02:00:49 +00:00
{
2020-11-28 20:12:58 +00:00
if (ListOwner.Columns[i].Width<MinSize)
2017-10-20 02:00:49 +00:00
ListOwner.Columns[i].Width = MinSize;
Wd = ListOwner.Columns[i].Width * CompPos[2];
2020-11-28 20:12:58 +00:00
if (i==(ListOwner.Columns.Length-1)) // Final column, give infinitive width.
2017-10-20 02:00:49 +00:00
{
Wd = (CompPos[2]-X);
}
2020-11-28 20:12:58 +00:00
if (Wd<=0) // Impossible.
2017-10-20 02:00:49 +00:00
{
ListOwner.Columns[i].bHidden = true;
continue;
}
ListOwner.Columns[i].X = X;
ListOwner.Columns[i].XSize = Wd;
2020-11-28 20:12:58 +00:00
if (bCheckMouse && (MouseX-=Wd)<=0.f)
2017-10-20 02:00:49 +00:00
{
MouseColumn = i;
bCheckMouse = false;
bMouseScaler = (MouseX>=GrabWidth) && ((i+1)<ListOwner.Columns.Length);
}
2020-11-28 20:12:58 +00:00
if (X>=CompPos[2])
2017-10-20 02:00:49 +00:00
ListOwner.Columns[i].bHidden = true;
else
{
ListOwner.Columns[i].bHidden = false;
Canvas.SetClip(X+Wd,CompPos[1]+CompPos[3]);
// Draw column.
Owner.CurrentStyle.RenderColumnHeader(Self,X,Min(Wd,CompPos[2]-X),i,MouseColumn==i && !bMouseScaler,i==j);
}
X+=Wd;
}
}
2020-11-28 20:04:55 +00:00
function MouseClick(bool bRight)
2017-10-20 02:00:49 +00:00
{
2020-11-28 20:12:58 +00:00
if (!ListOwner.bDisabled && bClickable)
2017-10-20 02:00:49 +00:00
{
PressedDown[byte(bRight)] = 1;
bPressedDown = true;
2020-11-28 20:12:58 +00:00
if (!bRight && bMouseScaler)
2017-10-20 02:00:49 +00:00
{
PlayMenuSound(MN_ClickButton);
bScaleColumn = true;
ScalingColumn = MouseColumn;
GetInputFocus();
}
}
}
2020-11-28 21:54:57 +00:00
2020-11-28 20:04:55 +00:00
function MouseRelease(bool bRight)
2017-10-20 02:00:49 +00:00
{
2020-11-28 20:12:58 +00:00
if (bScaleColumn && !bRight)
2017-10-20 02:00:49 +00:00
{
bScaleColumn = false;
DropInputFocus();
return;
}
2020-11-28 20:12:58 +00:00
if (!bDisabled && bClickable && PressedDown[byte(bRight)]==1)
2017-10-20 02:00:49 +00:00
{
PlayMenuSound(MN_ClickButton);
PressedDown[byte(bRight)] = 0;
bPressedDown = (PressedDown[0]!=0 || PressedDown[1]!=0);
2020-11-28 20:12:58 +00:00
if (MouseColumn>=0)
2017-10-20 02:00:49 +00:00
{
ListOwner.SortColumn(MouseColumn,(PrevSortedColumn==MouseColumn));
2020-11-28 20:12:58 +00:00
if (PrevSortedColumn==MouseColumn)
2017-10-20 02:00:49 +00:00
PrevSortedColumn = -1;
else PrevSortedColumn = MouseColumn;
}
}
}
2020-11-28 21:54:57 +00:00
2017-10-20 02:00:49 +00:00
function byte GetCursorStyle()
{
2020-11-28 20:12:58 +00:00
if (bClickable)
2017-10-20 02:00:49 +00:00
return (bMouseScaler ? 2 : 1);
return 0;
}
2020-11-28 21:54:57 +00:00
2017-10-20 02:00:49 +00:00
function MouseLeave()
{
Super.MouseLeave();
2020-11-28 20:12:58 +00:00
if (!bScaleColumn)
2017-10-20 02:00:49 +00:00
{
PressedDown[0] = 0;
PressedDown[1] = 0;
bPressedDown = false;
}
}
2020-11-28 21:54:57 +00:00
2017-10-20 02:00:49 +00:00
function MouseEnter()
{
Super.MouseEnter();
}
function LostInputFocus()
{
bScaleColumn = false;
PressedDown[0] = 0;
PressedDown[1] = 0;
bPressedDown = false;
}
defaultproperties
{
bClickable=true
ColumnMinSize=8
}