void InputManager::addWidgetModal(WidgetPtr _widget) { if (null == _widget) return; MYGUI_ASSERT(null == _widget->getParent(), "Modal widget must be root"); resetMouseFocusWidget(); removeWidgetModal(_widget); mVectorModalRootWidget.push_back(_widget); setKeyFocusWidget(_widget); LayerManager::getInstance().upLayerItem(_widget); }
void InputManager::removeWidgetModal(WidgetPtr _widget) { resetKeyFocusWidget(_widget); resetMouseFocusWidget(); for (VectorWidgetPtr::iterator iter=mVectorModalRootWidget.begin(); iter!=mVectorModalRootWidget.end(); ++iter) { if ((*iter == _widget)) { mVectorModalRootWidget.erase(iter); break; } } // если еще есть модальные то их фокусируем и поднимаем if (false == mVectorModalRootWidget.empty()) { setKeyFocusWidget(mVectorModalRootWidget.back()); LayerManager::getInstance().upLayerItem(mVectorModalRootWidget.back()); } }
bool InputManager::injectMousePress(int _absx, int _absy, MouseButton _id) { // если мы щелкнули не на гуй if (false == isFocusMouse()) { resetKeyFocusWidget(); return false; } // если активный элемент заблокирован if (false == mWidgetMouseFocus->isEnabled()) return true; // захватываем только по левой клавише и только если виджету надо if (MB_Left == _id) { // захват окна mIsWidgetMouseCapture = true; // запоминаем место нажатия mLastLeftPressed.set(_absx, _absy); } // ищем вверх тот виджет который может принимать фокус WidgetPtr focus = mWidgetMouseFocus; while ((focus != null) && (false == focus->isNeedKeyFocus())) focus = focus->getParent(); // устанавливаем перед вызовом т.к. возможно внутри ктонить поменяет фокус под себя setKeyFocusWidget(focus); if (mWidgetMouseFocus != null) { mWidgetMouseFocus->_onMouseButtonPressed(_absx, _absy, _id); //mWidgetMouseFocus->_onMouseButtonPressed(_id); // поднимаем виджет LayerManager::getInstance().upLayerItem(mWidgetMouseFocus); } return true; }
void InputManager::resetKeyFocusWidget() { setKeyFocusWidget(nullptr); }
void InputManager::resetKeyFocusWidget(Widget* _widget) { if (mWidgetKeyFocus == _widget) setKeyFocusWidget(nullptr); }
bool InputManager::injectMousePress(int _absx, int _absy, MouseButton _id) { injectMouseMove(_absx, _absy, mOldAbsZ); // если мы щелкнули не на гуй if (!isFocusMouse()) { resetKeyFocusWidget(); return false; } // если активный элемент заблокирован //FIXME if (!mWidgetMouseFocus->getInheritedEnabled()) return true; if (MouseButton::None != _id && MouseButton::MAX != _id) { // start capture mMouseCapture[_id.getValue()] = true; // remember last pressed position if (mLayerMouseFocus != nullptr) { IntPoint point = mLayerMouseFocus->getPosition(_absx, _absy); mLastPressed[_id.getValue()] = point; } } // ищем вверх тот виджет который может принимать фокус Widget* item = mWidgetMouseFocus; while ((item != nullptr) && (!item->getNeedKeyFocus())) item = item->getParent(); // устанавливаем перед вызовом т.к. возможно внутри ктонить поменяет фокус под себя setKeyFocusWidget(item); if (isFocusMouse()) { IntPoint point (_absx, _absy); if (mLayerMouseFocus != nullptr) point = mLayerMouseFocus->getPosition(_absx, _absy); mWidgetMouseFocus->_riseMouseButtonPressed(point.left, point.top, _id); // после пресса может сброситься if (mWidgetMouseFocus) { // поднимаем виджет, надо подумать что делать если поменялся фокус клавы LayerManager::getInstance().upLayerItem(mWidgetMouseFocus); // поднимаем пикинг Overlapped окон Widget* pick = mWidgetMouseFocus; do { // если оверлаппед, то поднимаем пикинг if (pick->getWidgetStyle() == WidgetStyle::Overlapped) { if (pick->getParent()) pick->getParent()->_forcePick(pick); } pick = pick->getParent(); } while (pick); } } return true; }
bool InputManager::injectMousePress(int _absx, int _absy, MouseButton _id) { Widget* old_key_focus = mWidgetKeyFocus; // если мы щелкнули не на гуй if (!isFocusMouse()) { resetKeyFocusWidget(); if (old_key_focus != mWidgetKeyFocus) eventChangeKeyFocus(mWidgetKeyFocus); return false; } // если активный элемент заблокирован //FIXME if (!mWidgetMouseFocus->getEnabled()) return true; if (MouseButton::Left == _id) { // захват окна mLeftMouseCapture = true; // запоминаем место нажатия if (mLayerMouseFocus != nullptr) { IntPoint point = mLayerMouseFocus->getPosition(_absx, _absy); mLastLeftPressed = point; } } if (MouseButton::Right == _id) { // захват окна mRightMouseCapture = true; // запоминаем место нажатия if (mLayerMouseFocus != nullptr) { IntPoint point = mLayerMouseFocus->getPosition(_absx, _absy); mLastRightPressed = point; } } // ищем вверх тот виджет который может принимать фокус Widget* item = mWidgetMouseFocus; while ((item != nullptr) && (!item->getNeedKeyFocus())) item = item->getParent(); // устанавливаем перед вызовом т.к. возможно внутри ктонить поменяет фокус под себя setKeyFocusWidget(item); if (mWidgetMouseFocus != nullptr) { mWidgetMouseFocus->_riseMouseButtonPressed(_absx, _absy, _id); // после пресса может сброситься if (mWidgetMouseFocus) { // поднимаем виджет, надо подумать что делать если поменялся фокус клавы LayerManager::getInstance().upLayerItem(mWidgetMouseFocus); // поднимаем пикинг Overlapped окон Widget* pick = mWidgetMouseFocus; do { // если оверлаппед, то поднимаем пикинг if (pick->getWidgetStyle() == WidgetStyle::Overlapped) { if (pick->getParent()) pick->getParent()->_forcePeek(pick); } pick = pick->getParent(); } while (pick); } } if (old_key_focus != mWidgetKeyFocus) eventChangeKeyFocus(mWidgetKeyFocus); return true; }