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 Window::setCoord(const IntCoord& _coord) { IntPoint pos = _coord.point(); IntSize size = _coord.size(); if (size.width < mMinmax.left) { int offset = mMinmax.left - size.width; size.width = mMinmax.left; if ((pos.left - mCoord.left) > offset) pos.left -= offset; else pos.left = mCoord.left; } else if (size.width > mMinmax.right) { int offset = mMinmax.right - size.width; size.width = mMinmax.right; if ((pos.left - mCoord.left) < offset) pos.left -= offset; else pos.left = mCoord.left; } if (size.height < mMinmax.top) { int offset = mMinmax.top - size.height; size.height = mMinmax.top; if ((pos.top - mCoord.top) > offset) pos.top -= offset; else pos.top = mCoord.top; } else if (size.height > mMinmax.bottom) { int offset = mMinmax.bottom - size.height; size.height = mMinmax.bottom; if ((pos.top - mCoord.top) < offset) pos.top -= offset; else pos.top = mCoord.top; } // прилепляем к краям if (mSnap) { IntCoord coord(pos, size); getSnappedCoord(coord); size = coord.size(); } IntCoord coord(pos, size); if (coord == mCoord) return; Base::setCoord(coord); }
bool ControllerPosition::addTime(Widget* _widget, float _time) { mElapsedTime += _time; if (mElapsedTime < mTime) { IntCoord coord; eventFrameAction(mStartCoord, mDestCoord, coord, mElapsedTime / mTime); if (mCalcPosition) { if (mCalcSize) _widget->setCoord(coord); else _widget->setPosition(coord.point()); } else if (mCalcSize) _widget->setSize(coord.size()); // вызываем пользовательский делегат обновления eventUpdateAction(_widget, this); return true; } // поставить точно в конец IntCoord coord; eventFrameAction(mStartCoord, mDestCoord, coord, 1.0f); if (mCalcPosition) { if (mCalcSize) _widget->setCoord(coord); else _widget->setPosition(coord.point()); } else if (mCalcSize) _widget->setSize(coord.size()); // вызываем пользовательский делегат обновления eventUpdateAction(_widget, this); // вызываем пользовательский делегат пост обработки eventPostAction(_widget, this); return false; }
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(); // только если не вызвано передвижение и сайз }
void ItemBox::updateDropItems() { if (nullptr == mItemDrag) { // спрашиваем размер иконок IntCoord coord; requestCoordItem(this, coord, true); mPointDragOffset = coord.point(); // создаем и запрашиваем детей mItemDrag = Gui::getInstance().createWidget<Widget>("Default", IntCoord(0, 0, coord.width, coord.height), Align::Default, mDragLayer); requestCreateWidgetItem(this, mItemDrag); } const IntPoint& point = InputManager::getInstance().getMousePosition(); mItemDrag->setPosition(point.left - mClickInWidget.left + mPointDragOffset.left, point.top - mClickInWidget.top + mPointDragOffset.top); mItemDrag->setVisible(true); }
Widget::Widget(const IntCoord& _coord, Align _align, const WidgetSkinInfoPtr _info, CroppedRectanglePtr _parent, const Ogre::String & _name) : CroppedRectangleInterface(IntCoord(_coord.point(), _info->getSize()), _align, _parent), // размер по скину mOwner(static_cast<Widget*>(_parent)), UserData(), mStateInfo(_info->getStateInfo()), mMaskPeekInfo(_info->getMask()), mText(null), mEnabled(true), mVisible(true), mAlpha(ALPHA_MIN), mColour(Ogre::ColourValue::White), mName(_name), mCountSharedOverlay(0) { // имя отсылателя сообщений mWidgetEventSender = this; // подсчитаываем колличество оверлеев для объединения for (VectorSubWidgetInfo::const_iterator iter =_info->getBasisInfo().begin(); iter!=_info->getBasisInfo().end(); iter ++) { if (SubWidgetManager::getInstance().isSharedOverlay(*iter)) mCountSharedOverlay++; } // загружаем кирпичики виджета size_t id = 0; for (VectorSubWidgetInfo::const_iterator iter =_info->getBasisInfo().begin(); iter!=_info->getBasisInfo().end(); iter ++) { addSubSkin(*iter, _info->getMaterial(), id); } // парсим свойства const MapString & param = _info->getParams(); if (false == param.empty()) { MapString::const_iterator iter = param.find("FontName"); if (iter != param.end()) setFontName(iter->second); iter = param.find("FontHeight"); if (iter != param.end()) setFontHeight(utility::parseInt(iter->second)); iter = param.find("NeedKey"); if (iter != param.end()) setNeedKeyFocus(iter->second == "true"); iter = param.find("AlignText"); if (iter != param.end()) setTextAlign(SkinManager::getInstance().parseAlign(iter->second)); iter = param.find("Colour"); if (iter != param.end()) setColour(utility::parseColour(iter->second)); iter = param.find("Pointer"); if (iter != param.end()) mPointer = iter->second; iter = param.find("Show"); if (iter != param.end()) { if (utility::parseBool(iter->second)) show(); else hide(); } } // этот стиль есть всегда, даже если создатель не хотел его setState("normal"); setAlpha(ALPHA_MAX); // альфа отца //if ( (mParent != null) && (static_cast<WidgetPtr>(mParent)->getAlpha() != ALPHA_MAX) ) setAlpha(static_cast<WidgetPtr>(mParent)->getAlpha()); // создаем детей const VectorChildSkinInfo& child = _info->getChild(); for (VectorChildSkinInfo::const_iterator iter=child.begin(); iter!=child.end(); ++iter) { WidgetPtr widget = createWidgetT(iter->type, iter->skin, iter->coord, iter->align); widget->_setInternalString(iter->name); // заполняем UserString пропертями for (MapString::const_iterator prop=iter->params.begin(); prop!=iter->params.end(); ++prop) { widget->setUserString(prop->first, prop->second); } } // а вот теперь нормальный размер setSize(_coord.size()); }
Widget::Widget(const IntCoord& _coord, Align _align, const WidgetSkinInfoPtr _info, CroppedRectanglePtr _parent, WidgetCreator * _creator, const Ogre::String & _name) : CroppedRectangleInterface(IntCoord(_coord.point(), _info->getSize()), _align, _parent), // размер по скину mOwner(static_cast<Widget*>(_parent)), UserData(), LayerItem(), mStateInfo(_info->getStateInfo()), mMaskPeekInfo(_info->getMask()), mText(null), mEnabled(true), mVisible(true), mInheritedShow(true), mAlpha(ALPHA_MIN), mName(_name), mTexture(_info->getTextureName()), mMainSkin(null), mWidgetCreator(_creator), mInheritsAlpha(true), mNeedKeyFocus(false), mNeedMouseFocus(true), mNeedDragDrop(false), mWidgetClient(null) { // корректируем абсолютные координаты mAbsolutePosition = _coord.point(); if (null != mParent) mAbsolutePosition += mParent->getAbsolutePosition(); // имя отсылателя сообщений mWidgetEventSender = this; // загружаем кирпичики виджета SubWidgetManager & manager = SubWidgetManager::getInstance(); for (VectorSubWidgetInfo::const_iterator iter =_info->getBasisInfo().begin(); iter!=_info->getBasisInfo().end(); ++iter) { CroppedRectangleInterface * sub = manager.createSubWidget(*iter, this); mSubSkinChild.push_back(sub); if (sub->_isText()) mText = static_cast<SubWidgetTextInterfacePtr>(sub); else if (null == mMainSkin) mMainSkin = sub; } if (false == isRootWidget()) { // если отец уже приаттачен, то и мы аттачимся ??? проверить что уже аттачиться при сет текстуре if ((null != getParent()->getLayerItemKeeper())) _attachToLayerItemKeeper(getParent()->getLayerItemKeeper()); // проверяем наследуемую скрытость if ((!mParent->isShow()) || (!getParent()->_isInheritedShow())) { mInheritedShow = false; // скрываем только саб скины, детей у нас еще нет for (VectorCroppedRectanglePtr::iterator skin = mSubSkinChild.begin(); skin != mSubSkinChild.end(); ++skin) (*skin)->hide(); } } // этот стиль есть всегда, даже если создатель не хотел его setState("normal"); // парсим свойства const MapString & param = _info->getParams(); if (false == param.empty()) { MapString::const_iterator iter = param.find("FontName"); if (iter != param.end()) setFontName(iter->second); iter = param.find("FontHeight"); if (iter != param.end()) setFontHeight(utility::parseInt(iter->second)); iter = param.find("NeedKey"); if (iter != param.end()) setNeedKeyFocus(iter->second == "true"); iter = param.find("NeedMouse"); if (iter != param.end()) setNeedMouseFocus(iter->second == "true"); iter = param.find("AlignText"); if (iter != param.end()) setTextAlign(SkinManager::parseAlign(iter->second)); iter = param.find("Colour"); if (iter != param.end()) setColour(utility::parseColour(iter->second)); iter = param.find("Pointer"); if (iter != param.end()) mPointer = iter->second; iter = param.find("Show"); if (iter != param.end()) { if (utility::parseBool(iter->second)) show(); else hide(); } } // выставляем альфу, корректировка по отцу автоматически setAlpha(ALPHA_MAX); // создаем детей const VectorChildSkinInfo& child = _info->getChild(); for (VectorChildSkinInfo::const_iterator iter=child.begin(); iter!=child.end(); ++iter) { WidgetPtr widget = createWidgetT(iter->type, iter->skin, iter->coord, iter->align); widget->_setInternalString(iter->name); // заполняем UserString пропертями for (MapString::const_iterator prop=iter->params.begin(); prop!=iter->params.end(); ++prop) { widget->setUserString(prop->first, prop->second); } } // а вот теперь нормальный размер setSize(_coord.size()); }