#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(); }