void Window::notifyMouseDrag(MyGUI::Widget* _sender, int _left, int _top, MouseButton _id) { if (_id != MouseButton::Left) return; const IntPoint& point = InputManager::getInstance().getLastPressedPosition(MouseButton::Left); IntCoord coord = mCurrentActionScale; coord.left *= (_left - point.left); coord.top *= (_top - point.top); coord.width *= (_left - point.left); coord.height *= (_top - point.top); if (coord.empty()) return; if (coord.left == 0 && coord.top == 0) setSize((mPreActionCoord + coord).size()); else if (coord.width == 0 && coord.height == 0) setPosition((mPreActionCoord + coord).point()); else setCoord(mPreActionCoord + coord); // посылаем событие о изменении позиции и размере eventWindowChangeCoord(this); }
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); }
IntCoord ComboBox::calculateListPosition() { int length = 0; if (mFlowDirection.isVertical()) length = mList->getOptimalHeight(); else length = mMaxListLength; if (mMaxListLength > 0 && length > mMaxListLength) length = mMaxListLength; // берем глобальные координаты выджета IntCoord coord = getAbsoluteCoord(); // размер леера IntSize sizeView = mList->getParentSize(); if (mFlowDirection == FlowDirection::TopToBottom) { if ((coord.bottom() + length) <= sizeView.height) coord.top += coord.height; else coord.top -= length; coord.height = length; } else if (mFlowDirection == FlowDirection::BottomToTop) { if ((coord.top - length) >= 0) coord.top -= length; else coord.top += coord.height; coord.height = length; } else if (mFlowDirection == FlowDirection::LeftToRight) { if ((coord.right() + length) <= sizeView.width) coord.left += coord.width; else coord.left -= length; coord.width = length; } else if (mFlowDirection == FlowDirection::RightToLeft) { if ((coord.left - length) >= 0) coord.left -= length; else coord.left += coord.width; coord.width = length; } return coord; }
IntCoord Window::_getActionScale(Widget* _widget) { if (_widget->isUserString("Scale")) { IntCoord result = IntCoord::parse(_widget->getUserString("Scale")); if (result == IntCoord(1, 1, 0, 0) && !mMovable) result.clear(); return result; } else if (_widget->isUserString("Action")) { const std::string& action = _widget->getUserString("Action"); if (action == "Move") { if (mMovable) return IntCoord(1, 1, 0, 0); else return IntCoord(); } IntCoord coord; Align align = Align::parse(action); if (align.isLeft()) { coord.left = 1; coord.width = -1; } else if (align.isRight()) { coord.width = 1; } if (align.isTop()) { coord.top = 1; coord.height = -1; } else if (align.isBottom()) { coord.height = 1; } return coord; } return IntCoord(); }
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 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; }
VectorFloatPoint cropPolygon(FloatPoint* _baseVerticiesPos, size_t _size, const IntCoord& _cropRectangle) { VectorFloatPoint resultVerticiesPos; resultVerticiesPos.resize(_size); for (size_t i = 0; i < _size; ++i) { resultVerticiesPos[i] = _baseVerticiesPos[i]; } cropPolygonSide(resultVerticiesPos, _cropRectangle.left, Left); cropPolygonSide(resultVerticiesPos, _cropRectangle.right(), Right); cropPolygonSide(resultVerticiesPos, _cropRectangle.top, Top); cropPolygonSide(resultVerticiesPos, _cropRectangle.bottom(), Bottom); return resultVerticiesPos; }
void linearMoveFunction(const IntCoord & _startRect, const IntCoord & _destRect, IntCoord & _result, float _k) { _result.set(_startRect.left - int( float(_startRect.left - _destRect.left) * _k ), _startRect.top - int( float(_startRect.top - _destRect.top) * _k ), _startRect.width - int( float(_startRect.width - _destRect.width) * _k ), _startRect.height - int( float(_startRect.height - _destRect.height) * _k ) ); }
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); }
void ImageBox::setImageCoord(const IntCoord& _coord) { mRectImage.left = _coord.left; mRectImage.top = _coord.top; mRectImage.right = _coord.left + _coord.width; mRectImage.bottom = _coord.top + _coord.height; // если тайл еще не установлен, то ставим тот что у координат if (mSizeTile.empty()) mSizeTile = _coord.size(); //если индекса еще нет, то ставим 0 if (mIndexSelect == ITEM_NONE) mIndexSelect = 0; recalcIndexes(); updateSelectIndex(mIndexSelect); }
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 ItemBox::setSize(const IntSize& _size) { IntCoord old = mCoord; Widget::setSize(_size); updateFromResize(old.size()); }
void Widget::_setAlign(const IntCoord& _coord, bool _update) { // для виджета изменение х у не меняються _setAlign(_coord.size(), _update); }
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()); }
void SubSkin::_setAlign(const IntCoord& _coord, bool _update) { _setAlign(_coord.size(), _update); }
void TileRect::_setAlign(const IntCoord& _coord, bool _update) { _setAlign(_coord.size(), _update); }
void ItemBox::setPosition(const IntCoord& _coord) { IntCoord old = mCoord; Widget::setPosition(_coord); updateFromResize(old.size()); }
void Canvas::setCoord( const IntCoord& _coord ) { resize( _coord.size() ); Base::setCoord( _coord ); }
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()); }