bool RectClipper::clipRect(const RectI& in_rRect, RectI& out_rRect) const { AssertFatal(in_rRect.isValidRect(), "Inappropriate min/max coords for rectangle"); if (in_rRect.point.x + in_rRect.extent.x - 1 < m_clipRect.point.x || in_rRect.point.x > m_clipRect.point.x + m_clipRect.extent.x - 1) return false; if (in_rRect.point.y + in_rRect.extent.y - 1 < m_clipRect.point.y || in_rRect.point.y > m_clipRect.point.y + m_clipRect.extent.y - 1) return false; if (in_rRect.point.x < m_clipRect.point.x) out_rRect.point.x = m_clipRect.point.x; else out_rRect.point.x = in_rRect.point.x; if (in_rRect.point.y < m_clipRect.point.y) out_rRect.point.y = m_clipRect.point.y; else out_rRect.point.y = in_rRect.point.y; Point2I bottomR; bottomR.x = getMin(in_rRect.point.x + in_rRect.extent.x - 1, m_clipRect.point.x + m_clipRect.extent.x - 1); bottomR.y = getMin(in_rRect.point.y + in_rRect.extent.y - 1, m_clipRect.point.y + m_clipRect.extent.y - 1); out_rRect.extent.x = bottomR.x - out_rRect.point.x + 1; out_rRect.extent.x = bottomR.y - out_rRect.point.y + 1; return true; }
bool GuiContainer::dockControl( GuiContainer *control, S32 dockingMode, RectI &clientRect ) { if( !control ) return false; // Make sure this class support docking of this type if( !(dockingMode & getValidDockingMask())) return false; // If our client rect has run out of room, we can't dock any more if( !clientRect.isValidRect() ) return false; // Dock Appropriately RectI dockRect; RectSpacingI rectShrinker; ControlSizing sizingOptions = control->getSizingOptions(); switch( dockingMode ) { case Docking::dockClient: // Inset by padding sizingOptions.mPadding.insetRect(clientRect); // Dock to entirety of client rectangle control->resize( clientRect.point, clientRect.extent ); // Remove Client Rect, can only have one client dock clientRect.set(0,0,0,0); break; case Docking::dockTop: dockRect = clientRect; dockRect.extent.y = getMin( control->getHeight() + sizingOptions.mPadding.top + sizingOptions.mPadding.bottom , clientRect.extent.y ); // Subtract our rect clientRect.point.y += dockRect.extent.y; clientRect.extent.y -= dockRect.extent.y; // Inset by padding sizingOptions.mPadding.insetRect(dockRect); // Resize control->resize( dockRect.point, dockRect.extent ); break; case Docking::dockBottom: dockRect = clientRect; dockRect.extent.y = getMin( control->getHeight() + sizingOptions.mPadding.top + sizingOptions.mPadding.bottom, clientRect.extent.y ); dockRect.point.y += clientRect.extent.y - dockRect.extent.y; // Subtract our rect clientRect.extent.y -= dockRect.extent.y; // Inset by padding sizingOptions.mPadding.insetRect(dockRect); // Resize control->resize( dockRect.point, dockRect.extent ); break; case Docking::dockLeft: dockRect = clientRect; dockRect.extent.x = getMin( control->getWidth() + sizingOptions.mPadding.left + sizingOptions.mPadding.right, clientRect.extent.x ); // Subtract our rect clientRect.point.x += dockRect.extent.x; clientRect.extent.x -= dockRect.extent.x; // Inset by padding sizingOptions.mPadding.insetRect(dockRect); // Resize control->resize( dockRect.point, dockRect.extent ); break; case Docking::dockRight: dockRect = clientRect; dockRect.extent.x = getMin( control->getWidth() + sizingOptions.mPadding.left + sizingOptions.mPadding.right, clientRect.extent.x ); dockRect.point.x += clientRect.extent.x - dockRect.extent.x; // Subtract our rect clientRect.extent.x -= dockRect.extent.x; // Inset by padding sizingOptions.mPadding.insetRect(dockRect); // Resize control->resize( dockRect.point, dockRect.extent ); break; case Docking::dockNone: control->setUpdateLayout(); break; } return true; }