void Widget::_setAlign(const IntSize& _size, bool _update) { if (mParent == null) return; bool need_move = false; bool need_size = false; IntCoord coord = mCoord; // первоначальное выравнивание if (IS_ALIGN_RIGHT(mAlign)) { if (IS_ALIGN_LEFT(mAlign)) { // растягиваем coord.width = mCoord.width + (mParent->getWidth() - _size.width); need_size = true; } else { // двигаем по правому краю coord.left = mCoord.left + (mParent->getWidth() - _size.width); need_move = true; } } else if (false == IS_ALIGN_LEFT(mAlign)) { // выравнивание по горизонтали без растяжения coord.left = (mParent->getWidth() - mCoord.width) / 2; need_move = true; } if (IS_ALIGN_BOTTOM(mAlign)) { if (IS_ALIGN_TOP(mAlign)) { // растягиваем coord.height = mCoord.height + (mParent->getHeight() - _size.height); need_size = true; } else { coord.top = mCoord.top + (mParent->getHeight() - _size.height); need_move = true; } } else if (false == IS_ALIGN_TOP(mAlign)) { // выравнивание по вертикали без растяжения coord.top = (mParent->getHeight() - mCoord.height) / 2; need_move = true; } if (need_move) { if (need_size) setPosition(coord); else setPosition(coord.point()); } else if (need_size) { setSize(coord.size()); } else _updateView(); // только если не вызвано передвижение и сайз }
FloatRect WidgetManager::convertOffset(const FloatRect & _offset, Align _align, const IntSize & _parentSkinSize, int _parentWidth, int _parentHeight) { FloatRect offset = _offset; if (IS_ALIGN_RIGHT(_align)) { if (IS_ALIGN_LEFT(_align)) offset.right += _parentWidth - _parentSkinSize.width; else offset.left += _parentWidth - _parentSkinSize.width; } else if (false == IS_ALIGN_LEFT(_align)) offset.left += (_parentWidth - _parentSkinSize.width) / 2; if (IS_ALIGN_BOTTOM(_align)) { if (IS_ALIGN_TOP(_align)) offset.bottom += _parentHeight - _parentSkinSize.height; else offset.top += _parentHeight - _parentSkinSize.height; } else if (false == IS_ALIGN_TOP(_align)) offset.top += (_parentHeight - _parentSkinSize.height) / 2; return offset; }
void Gui::_alignWidget(WidgetPtr _widget, const FloatSize& _old, const FloatSize& _new) { if (null == _widget) return; Align align = _widget->getAlign(); if (ALIGN_DEFAULT == align) return; IntCoord coord = _widget->getCoord(); // первоначальное выравнивание if (IS_ALIGN_RIGHT(align)) { if (IS_ALIGN_LEFT(align)) { // раст¤гиваем coord.width += _new.width - _old.width; } else { // двигаем по правому краю coord.left += _new.width - _old.width; } } else if (false == IS_ALIGN_LEFT(align)) { // выравнивание по горизонтали без раст¤жени¤ coord.left = (_new.width - coord.width) / 2; } if (IS_ALIGN_BOTTOM(align)) { if (IS_ALIGN_TOP(align)) { // раст¤гиваем coord.height += _new.height - _old.height; } else { coord.top += _new.height - _old.height; } } else if (false == IS_ALIGN_TOP(align)) { // выравнивание по вертикали без раст¤жени¤ coord.top = (_new.height - coord.height) / 2; } _widget->setPosition(coord); }