bool ResizableControl::SetBounds( int x, int y, int w, int h ) { gwen::Point minSize = GetMinimumSize(); // Clamp Minimum Size if ( w < minSize.x ) { w = minSize.x; } if ( h < minSize.y ) { h = minSize.y; } // Clamp to parent's window Base* pParent = GetParent(); if ( pParent && m_bClampMovement ) { if ( x + w > pParent->Width() ) { x = pParent->Width() - w; } if ( x < 0 ) { x = 0; } if ( y + h > pParent->Height() ) { y = pParent->Height() - h; } if ( y < 0 ) { y = 0; } } return BaseClass::SetBounds( x, y, w, h ); }
void Base::MoveTo(int x, int y) { if (m_bRestrictToParent && GetParent()) { Base* pParent = GetParent(); if (x-GetPadding().left < pParent->GetMargin().left) x = pParent->GetMargin().left+GetPadding().left; if (y-GetPadding().top < pParent->GetMargin().top) y = pParent->GetMargin().top+GetPadding().top; if (x+Width()+GetPadding().right > pParent->Width()-pParent->GetMargin().right) x = pParent->Width()-pParent->GetMargin().right-Width()-GetPadding().right; if (y+Height()+GetPadding().bottom > pParent->Height()-pParent->GetMargin().bottom) y = pParent->Height()-pParent->GetMargin().bottom-Height()-GetPadding().bottom; } SetBounds(x, y, Width(), Height()); }
void Menu::Layout( Skin::Base* skin ) { int childrenHeight = 0; for ( Base::List::iterator it = m_InnerPanel->Children.begin(); it != m_InnerPanel->Children.end(); ++it ) { Base* pChild = (*it); if ( !pChild ) continue; childrenHeight += pChild->Height(); } if ( Y() + childrenHeight > GetCanvas()->Height() ) childrenHeight = GetCanvas()->Height() - Y(); SetSize( Width(), childrenHeight ); BaseClass::Layout( skin ); }
void Menu::Layout(Skin::Base* skin) { // Call the base class. ScrollControl::Layout(skin); int children_height = 0; for (auto i = _inner_panel->GetChildren().begin(); i != _inner_panel->GetChildren().end(); ++i) { Base* child = (*i); assert(child != nullptr); if (child != nullptr) { children_height += child->Height(); } } if (Y() + children_height > GetCanvas()->Height()) { children_height = GetCanvas()->Height() - Y(); } SetSize(Width(), children_height); }
void Base::RecurseLayout( Skin::Base* skin ) { if ( m_Skin ) { skin = m_Skin; } if ( Hidden() ) { return; } if ( NeedsLayout() ) { m_bNeedsLayout = false; Layout( skin ); } Gwen::Rect rBounds = GetRenderBounds(); // Adjust bounds for padding rBounds.x += m_Padding.left; rBounds.w -= m_Padding.left + m_Padding.right; rBounds.y += m_Padding.top; rBounds.h -= m_Padding.top + m_Padding.bottom; for ( Base::List::iterator iter = Children.begin(); iter != Children.end(); ++iter ) { Base* pChild = *iter; if ( pChild->Hidden() ) { continue; } int iDock = pChild->GetDock(); if ( iDock & Pos::Fill ) { continue; } if ( iDock & Pos::Top ) { const Margin & margin = pChild->GetMargin(); pChild->SetBounds( rBounds.x + margin.left, rBounds.y + margin.top, rBounds.w - margin.left - margin.right, pChild->Height() ); int iHeight = margin.top + margin.bottom + pChild->Height(); rBounds.y += iHeight; rBounds.h -= iHeight; } if ( iDock & Pos::Left ) { const Margin & margin = pChild->GetMargin(); pChild->SetBounds( rBounds.x + margin.left, rBounds.y + margin.top, pChild->Width(), rBounds.h - margin.top - margin.bottom ); int iWidth = margin.left + margin.right + pChild->Width(); rBounds.x += iWidth; rBounds.w -= iWidth; } if ( iDock & Pos::Right ) { // TODO: THIS MARGIN CODE MIGHT NOT BE FULLY FUNCTIONAL const Margin & margin = pChild->GetMargin(); pChild->SetBounds( ( rBounds.x + rBounds.w ) - pChild->Width() - margin.right, rBounds.y + margin.top, pChild->Width(), rBounds.h - margin.top - margin.bottom ); int iWidth = margin.left + margin.right + pChild->Width(); rBounds.w -= iWidth; } if ( iDock & Pos::Bottom ) { // TODO: THIS MARGIN CODE MIGHT NOT BE FULLY FUNCTIONAL const Margin & margin = pChild->GetMargin(); pChild->SetBounds( rBounds.x + margin.left, ( rBounds.y + rBounds.h ) - pChild->Height() - margin.bottom, rBounds.w - margin.left - margin.right, pChild->Height() ); rBounds.h -= pChild->Height() + margin.bottom + margin.top; } pChild->RecurseLayout( skin ); } m_InnerBounds = rBounds; // // Fill uses the left over space, so do that now. // for ( Base::List::iterator iter = Children.begin(); iter != Children.end(); ++iter ) { Base* pChild = *iter; int iDock = pChild->GetDock(); if ( !( iDock & Pos::Fill ) ) { continue; } const Margin & margin = pChild->GetMargin(); pChild->SetBounds( rBounds.x + margin.left, rBounds.y + margin.top, rBounds.w - margin.left - margin.right, rBounds.h - margin.top - margin.bottom ); pChild->RecurseLayout( skin ); } PostLayout( skin ); if ( IsTabable() && !IsDisabled() ) { if ( !GetCanvas()->FirstTab ) { GetCanvas()->FirstTab = this; } if ( !GetCanvas()->NextTab ) { GetCanvas()->NextTab = this; } } if ( Gwen::KeyboardFocus == this ) { GetCanvas()->NextTab = NULL; } }