sf::Vector2f Widget::GetAbsolutePosition() const { // If no parent, allocation's position is absolute position. PtrConst parent( m_parent.lock() ); if( !parent ) { return sf::Vector2f( GetAllocation().Left, GetAllocation().Top ); } // Get parent's absolute position and add own rel. position to it. sf::Vector2f parent_position( parent->GetAbsolutePosition() ); return sf::Vector2f( parent_position.x + GetAllocation().Left, parent_position.y + GetAllocation().Top ); }
void GLCanvas::HandleAbsolutePositionChange() { sf::Vector2f position = Widget::GetAbsolutePosition(); Container::PtrConst parent = GetParent(); sf::Vector2f parent_position( 0.f, 0.f ); while( parent ) { if( parent->GetName() == "Viewport" ) { // Try to get the first ancestor of the viewport that is not a viewport itself. // Add up all allocations while searching. Container::PtrConst viewport_parent = parent->GetParent(); while( viewport_parent && viewport_parent->GetName() == "Viewport" ) { parent_position += sf::Vector2f( viewport_parent->GetAllocation().left, viewport_parent->GetAllocation().top ); viewport_parent = viewport_parent->GetParent(); } if( !viewport_parent || ( viewport_parent->GetName() == "Viewport" ) ) { parent_position = sf::Vector2f( 0.f, 0.f ); break; } parent_position += viewport_parent->GetAbsolutePosition(); parent_position += sf::Vector2f( parent->GetAllocation().left, parent->GetAllocation().top ); break; } parent = parent->GetParent(); } m_custom_viewport->SetDestinationOrigin( sf::Vector2f( std::floor( parent_position.x + position.x + .5f ), std::floor( parent_position.y + position.y + .5f ) ) ); Invalidate(); }