void Widget::_updateView() { bool margin = mParent ? _checkMargin() : false; // вьюпорт стал битым if (margin) { // проверка на полный выход за границу if (_checkOutside()) { // запоминаем текущее состояние mIsMargin = margin; // скрываем _setVisible(false); // для тех кому нужно подправить себя при движении //for (VectorCroppedRectanglePtr::iterator skin = mSubSkinChild.begin(); skin != mSubSkinChild.end(); ++skin) (*skin)->_updateView(); // вся иерархия должна быть проверенна for (VectorWidgetPtr::iterator widget = mWidgetChild.begin(); widget != mWidgetChild.end(); ++widget) (*widget)->_updateView(); return; } } else if (false == mIsMargin) { // мы не обрезаны и были нормальные // запоминаем текущее состояние //mIsMargin = margin; //_setVisible(true); // для тех кому нужно подправить себя при движении for (VectorCroppedRectanglePtr::iterator skin = mSubSkinChild.begin(); skin != mSubSkinChild.end(); ++skin) (*skin)->_updateView(); return; } // запоминаем текущее состояние mIsMargin = margin; // если скин был скрыт, то покажем _setVisible(true); // обновляем наших детей, а они уже решат обновлять ли своих детей for (VectorWidgetPtr::iterator widget = mWidgetChild.begin(); widget != mWidgetChild.end(); ++widget) (*widget)->_updateView(); for (VectorCroppedRectanglePtr::iterator skin = mSubSkinChild.begin(); skin != mSubSkinChild.end(); ++skin) (*skin)->_updateView(); }
void Widget::setSize(const IntSize& _size) { // устанавливаем новую координату а старую пускаем в расчеты IntSize old = mCoord.size(); mCoord = _size; bool show = true; // обновляем выравнивание bool margin = mParent ? _checkMargin() : false; if (margin) { // проверка на полный выход за границу if (_checkOutside()) { // скрываем show = false; } } _setVisible(show); // передаем старую координату , до вызова, текущая координата отца должна быть новой for (VectorWidgetPtr::iterator widget = mWidgetChild.begin(); widget != mWidgetChild.end(); widget++) (*widget)->_setAlign(old, mIsMargin || margin); for (VectorCroppedRectanglePtr::iterator skin = mSubSkinChild.begin(); skin != mSubSkinChild.end(); skin++) (*skin)->_setAlign(old, mIsMargin || margin); // запоминаем текущее состояние mIsMargin = margin; }
void Widget::setPosition(const IntCoord& _coord) { // обновляем абсолютные координаты mAbsolutePosition += _coord.point() - mCoord.point(); for (VectorWidgetPtr::iterator widget = mWidgetChild.begin(); widget != mWidgetChild.end(); ++widget) (*widget)->_updateAbsolutePoint(); // устанавливаем новую координату а старую пускаем в расчеты IntCoord old = mCoord; mCoord = _coord; bool show = true; // обновляем выравнивание bool margin = mParent ? _checkMargin() : false; if (margin) { // проверка на полный выход за границу if (_checkOutside()) { // скрываем show = false; } } _setVisible(show); // передаем старую координату , до вызова, текущая координата отца должна быть новой for (VectorWidgetPtr::iterator widget = mWidgetChild.begin(); widget != mWidgetChild.end(); ++widget) (*widget)->_setAlign(old, mIsMargin || margin); for (VectorCroppedRectanglePtr::iterator skin = mSubSkinChild.begin(); skin != mSubSkinChild.end(); ++skin) (*skin)->_setAlign(old, mIsMargin || margin); // запоминаем текущее состояние mIsMargin = margin; }
void GUIElementBase::setActive(bool active) { static const UINT8 ACTIVE_FLAGS = GUIElem_InactiveSelf | GUIElem_HiddenSelf; bool activeSelf = (mFlags & GUIElem_InactiveSelf) == 0; if (activeSelf != active) { if (!active) { mFlags |= ACTIVE_FLAGS; _setActive(false); _setVisible(false); } else { mFlags &= ~ACTIVE_FLAGS; if (mParentElement != nullptr) { if (mParentElement->_isActive()) { _setActive(true); if (mParentElement->_isVisible()) _setVisible(true); } } else { _setActive(true); _setVisible(true); } } } }
void GUIElementBase::setVisible(bool visible) { // No visibility states matter if object is not active if (!_isActive()) return; bool visibleSelf = (mFlags & GUIElem_HiddenSelf) == 0; if (visibleSelf != visible) { // If making an element visible make sure to mark layout as dirty, as we didn't track any dirty flags while the element was inactive if (!visible) { mFlags |= GUIElem_HiddenSelf; _setVisible(false); } else { mFlags &= ~GUIElem_HiddenSelf; if (mParentElement == nullptr || mParentElement->_isVisible()) _setVisible(true); } } }