bullet3/btgui/Gwen/Controls/PanelListPanel.cpp
2013-03-12 23:52:31 -07:00

124 lines
2.7 KiB
C++

#include "Gwen/Controls/PanelListPanel.h"
using namespace Gwen;
using namespace Controls;
GWEN_CONTROL_CONSTRUCTOR( PanelListPanel )
{
m_bVertical = false;
m_bSizeToChildren = true;
m_iControlSpacing = 5;
m_iLineSpacing = 5;
m_bWrapping = true;
}
void PanelListPanel::Render( Gwen::Skin::Base* /*skin*/ )
{
}
Gwen::Point PanelListPanel::GetBiggestChildSize()
{
int width = 0;
int height = 0;
for ( Base::List::iterator it = Children.begin(); it != Children.end(); ++it )
{
Controls::Base* pChild = *it;
if ( pChild->Width() > width )
width = pChild->Width();
if ( pChild->Height() > height )
height = pChild->Height();
}
return Gwen::Point( width, height );
}
void PanelListPanel::DoVerticalLayout()
{
int panelWidth = 0;
int panelX = GetPadding().left;
int panelY = GetPadding().top;
int lastPanelY = panelY;
int testWrap = 0;
Gwen::Point childSize = GetBiggestChildSize();
//Lay my children out accordingly
for ( Base::List::iterator it = Children.begin(); it != Children.end(); ++it )
{
Controls::Base* pChild = *it;
testWrap = lastPanelY + m_iControlSpacing + childSize.y;
if ( m_bWrapping && testWrap > Height() - GetPadding().bottom )
{
panelY = GetPadding().top;
panelX = GetPadding().left + panelWidth + m_iLineSpacing;
lastPanelY = panelY + m_iControlSpacing + childSize.y;
}
else
{
panelY = lastPanelY;
lastPanelY = testWrap;
}
pChild->SetPos( panelX, panelY );
if (pChild->X() + childSize.x > panelWidth )
panelWidth = pChild->X() + childSize.x;
}
if ( m_bSizeToChildren )
{
Gwen::Point childrenSizeTotal = ChildrenSize();
SetSize( childrenSizeTotal.x, Height());
}
}
void PanelListPanel::DoHorizontalLayout()
{
int panelHeight = 0;
int panelX = GetPadding().left;
int panelY = GetPadding().top;
int lastPanelX = panelX;
int testWrap = 0;
Gwen::Point childSize = GetBiggestChildSize();
for ( Base::List::iterator it = Children.begin(); it != Children.end(); ++it )
{
Controls::Base* pChild = *it;
testWrap = lastPanelX + m_iControlSpacing + childSize.x;
if ( m_bWrapping && testWrap > Width() - GetPadding().right )
{
panelX = GetPadding().left;
panelY = GetPadding().top + panelHeight + m_iLineSpacing;
lastPanelX = panelX + m_iControlSpacing + childSize.x;
}
else
{
panelX = lastPanelX;
lastPanelX = testWrap;
}
pChild->SetPos( panelX, panelY );
if (pChild->Y() + childSize.y > panelHeight )
panelHeight = pChild->Y() + childSize.y;
}
if ( m_bSizeToChildren )
{
Gwen::Point childrenSizeTotal = ChildrenSize();
SetSize( Width(), childrenSizeTotal.y);
}
}
void PanelListPanel::Layout( Skin::Base* skin )
{
BaseClass::Layout( skin );
if ( IsHorizontalLayout() )
DoHorizontalLayout();
else
DoVerticalLayout();
}