mirror of
https://github.com/Mauler125/r5sdk.git
synced 2025-02-09 19:15:03 +01:00
144 lines
2.7 KiB
C++
144 lines
2.7 KiB
C++
#include "stdafx.h"
|
|
#include "ControlCollection.h"
|
|
#include "Control.h"
|
|
|
|
namespace Forms
|
|
{
|
|
ControlCollection::~ControlCollection()
|
|
{
|
|
// We own the control as soon as the collection takes ahold of it...
|
|
for (auto& Ctrl : this->_Controls)
|
|
delete Ctrl;
|
|
}
|
|
|
|
void ControlCollection::Add(Control* Ctrl)
|
|
{
|
|
this->_Controls.Add(Ctrl);
|
|
}
|
|
|
|
void ControlCollection::Remove(Control* Ctrl)
|
|
{
|
|
if (Ctrl == nullptr)
|
|
return;
|
|
|
|
this->_Controls.Remove(Ctrl);
|
|
delete Ctrl;
|
|
}
|
|
|
|
void ControlCollection::RemoveAt(uint32_t Index)
|
|
{
|
|
if (Index < this->_Controls.Count())
|
|
{
|
|
auto Ptr = this->_Controls[Index];
|
|
this->_Controls.RemoveAt(Index);
|
|
delete Ptr;
|
|
}
|
|
}
|
|
|
|
int32_t ControlCollection::IndexOf(Control* Ctrl)
|
|
{
|
|
auto Result = this->_Controls.IndexOf(Ctrl);
|
|
|
|
return (Result == List<Control*>::InvalidPosition) ? -1 : (int32_t)Result;
|
|
}
|
|
|
|
bool ControlCollection::Contains(Control* Ctrl)
|
|
{
|
|
return IndexOf(Ctrl) > -1;
|
|
}
|
|
|
|
void ControlCollection::SetChildIndex(Control* Ctrl, int32_t Index)
|
|
{
|
|
auto CurrentIndex = IndexOf(Ctrl);
|
|
|
|
if (CurrentIndex == Index || CurrentIndex == -1)
|
|
return;
|
|
|
|
if (Index >= (int32_t)Count() || Index == -1)
|
|
{
|
|
Index = Count() - 1;
|
|
}
|
|
|
|
MoveElement(Ctrl, CurrentIndex, Index);
|
|
Ctrl->UpdateZOrder();
|
|
}
|
|
|
|
uint32_t ControlCollection::Count()
|
|
{
|
|
return this->_Controls.Count();
|
|
}
|
|
|
|
Control* ControlCollection::operator[](size_t Index)
|
|
{
|
|
return (Control*)this->_Controls[Index];
|
|
}
|
|
|
|
Control* ControlCollection::begin() const noexcept
|
|
{
|
|
return (Control*)this->_Controls.begin();
|
|
}
|
|
|
|
Control* ControlCollection::end() const noexcept
|
|
{
|
|
return (Control*)this->_Controls.end();
|
|
}
|
|
|
|
void ControlCollection::MoveElement(Control* Ctrl, int32_t CurrentIndex, int32_t NewIndex)
|
|
{
|
|
int32_t Delta = NewIndex - CurrentIndex;
|
|
|
|
switch (Delta)
|
|
{
|
|
case -1:
|
|
case 1:
|
|
this->_Controls[CurrentIndex] = this->_Controls[NewIndex];
|
|
break;
|
|
|
|
default:
|
|
{
|
|
int32_t Start = 0;
|
|
int32_t Dest = 0;
|
|
|
|
if (Delta > 0)
|
|
{
|
|
Start = CurrentIndex + 1;
|
|
Dest = NewIndex;
|
|
}
|
|
else
|
|
{
|
|
Start = NewIndex;
|
|
Dest = NewIndex + 1;
|
|
|
|
Delta = -Delta;
|
|
}
|
|
|
|
CopyElement(Start, Dest, Delta);
|
|
}
|
|
break;
|
|
}
|
|
|
|
this->_Controls[NewIndex] = Ctrl;
|
|
}
|
|
|
|
void ControlCollection::CopyElement(int32_t SourceIndex, int32_t DestinationIndex, uint32_t Length)
|
|
{
|
|
if (SourceIndex < DestinationIndex)
|
|
{
|
|
SourceIndex = SourceIndex + Length;
|
|
DestinationIndex = DestinationIndex + Length;
|
|
|
|
for (; Length > 0; Length--)
|
|
{
|
|
this->_Controls[--DestinationIndex] = this->_Controls[--SourceIndex];
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (; Length > 0; Length--)
|
|
{
|
|
this->_Controls[DestinationIndex++] = this->_Controls[SourceIndex++];
|
|
}
|
|
}
|
|
}
|
|
}
|