void InputManager::_resetMouseFocusWidget() { Widget* mouseFocus = mWidgetMouseFocus; mWidgetMouseFocus = nullptr; // recursively reset old widget focus Widget* root_focus = mouseFocus; while (root_focus != nullptr) { root_focus->_setRootMouseFocus(false); root_focus->_riseMouseChangeRootFocus(false); root_focus = root_focus->getParent(); } for (int i = MouseButton::Button0; i < MouseButton::MAX; ++i) { if (mMouseCapture[i]) { mMouseCapture[i] = false; mouseFocus->_riseMouseButtonReleased(mLastPressed[i].left, mLastPressed[i].top, MouseButton::Enum(i)); } } if (nullptr != mouseFocus) { mouseFocus->_riseMouseLostFocus(nullptr); } if (mouseFocus != mWidgetMouseFocus) eventChangeMouseFocus(mWidgetMouseFocus); }
bool InputManager::injectMouseMove(int _absx, int _absy, int _absz) { // запоминаем позицию mMousePosition.set(_absx, _absy); // вычисляем прирост по колеса int relz = _absz - mOldAbsZ; mOldAbsZ = _absz; // проверка на скролл if (relz != 0) { bool isFocus = isFocusMouse(); if (isFocusMouse()) mWidgetMouseFocus->_riseMouseWheel(relz); return isFocus; } if (isCaptureMouse()) { if (isFocusMouse()) { if (mLayerMouseFocus != nullptr) { IntPoint point = mLayerMouseFocus->getPosition(_absx, _absy); for (int i = MouseButton::Button0; i < MouseButton::MAX; ++i) { if (mMouseCapture[i]) mWidgetMouseFocus->_riseMouseDrag(point.left, point.top, MouseButton::Enum(i)); } } } else { resetMouseCaptureWidget(); } return true; } Widget* old_mouse_focus = mWidgetMouseFocus; // ищем активное окно Widget* item = LayerManager::getInstance().getWidgetFromPoint(_absx, _absy); // ничего не изменилось if (mWidgetMouseFocus == item) { bool isFocus = isFocusMouse(); if (isFocusMouse()) { if (mLayerMouseFocus != nullptr) { IntPoint point = mLayerMouseFocus->getPosition(_absx, _absy); mWidgetMouseFocus->_riseMouseMove(point.left, point.top); } } return isFocus; } if (item) { // поднимаемся до рута Widget* root = item; while (root->getParent()) root = root->getParent(); // проверяем на модальность if (!mVectorModalRootWidget.empty()) { if (root != mVectorModalRootWidget.back()) { item = nullptr; } } if (item != nullptr) { mLayerMouseFocus = root->getLayer(); } } //-------------------------------------------------------------------------------------// // новый вид рутового фокуса мыши Widget* save_widget = nullptr; // спускаемся по новому виджету и устанавливаем рутовый фокус Widget* root_focus = item; while (root_focus != nullptr) { if (root_focus->getRootMouseFocus()) { save_widget = root_focus; break; } root_focus->_setRootMouseFocus(true); root_focus->_riseMouseChangeRootFocus(true); root_focus = root_focus->getParent(); } // спускаемся по старому виджету и сбрасываем фокус root_focus = mWidgetMouseFocus; while (root_focus != nullptr) { if (root_focus == save_widget) break; root_focus->_setRootMouseFocus(false); root_focus->_riseMouseChangeRootFocus(false); root_focus = root_focus->getParent(); } //-------------------------------------------------------------------------------------// // смена фокуса, проверяем на доступность виджета if (isFocusMouse() && mWidgetMouseFocus->getInheritedEnabled()) { mWidgetMouseFocus->_riseMouseLostFocus(item); } if ((item != nullptr) && (item->getInheritedEnabled())) { MyGUI::IntPoint point (_absx, _absy); if (mLayerMouseFocus != nullptr) point = mLayerMouseFocus->getPosition(_absx, _absy); item->_riseMouseMove(point.left, point.top); item->_riseMouseSetFocus(mWidgetMouseFocus); } // запоминаем текущее окно mWidgetMouseFocus = item; if (old_mouse_focus != mWidgetMouseFocus) { // Reset double click timer, double clicks should only work when clicking on the *same* item twice mTimerDoubleClick = INPUT_TIME_DOUBLE_CLICK; eventChangeMouseFocus(mWidgetMouseFocus); } return isFocusMouse(); }
bool InputManager::injectMouseMove(int _absx, int _absy, int _absz) { // запоминаем позицию mMousePosition.set(_absx, _absy); // вычисляем прирост по колеса int relz = _absz - mOldAbsZ; mOldAbsZ = _absz; // проверка на скролл if (relz != 0) { bool isFocus = isFocusMouse(); if (mWidgetMouseFocus != nullptr) mWidgetMouseFocus->_riseMouseWheel(relz); return isFocus; } if (mLeftMouseCapture || mRightMouseCapture) { if (mWidgetMouseFocus != nullptr) { if (mLayerMouseFocus != nullptr) { IntPoint point = mLayerMouseFocus->getPosition(_absx, _absy); if (mLeftMouseCapture) mWidgetMouseFocus->_riseMouseDrag(point.left, point.top, MouseButton::Left); if (mRightMouseCapture) mWidgetMouseFocus->_riseMouseDrag(point.left, point.top, MouseButton::Right); } } else { mLeftMouseCapture = false; mRightMouseCapture = false; } return true; } Widget* old_mouse_focus = mWidgetMouseFocus; // ищем активное окно Widget* item = LayerManager::getInstance().getWidgetFromPoint(_absx, _absy); // ничего не изменилось if (mWidgetMouseFocus == item) { bool isFocus = isFocusMouse(); if (mWidgetMouseFocus != nullptr) { if (mLayerMouseFocus != nullptr) { IntPoint point = mLayerMouseFocus->getPosition(_absx, _absy); mWidgetMouseFocus->_riseMouseMove(point.left, point.top); } } return isFocus; } if (item) { // поднимаемся до рута Widget* root = item; while (root->getParent()) root = root->getParent(); // проверяем на модальность if (!mVectorModalRootWidget.empty()) { if (root != mVectorModalRootWidget.back()) { item = nullptr; } } if (item != nullptr) { mLayerMouseFocus = root->getLayer(); } } //-------------------------------------------------------------------------------------// // новый вид рутового фокуса мыши Widget* save_widget = nullptr; // спускаемся по новому виджету и устанавливаем рутовый фокус Widget* root_focus = item; while (root_focus != nullptr) { if (root_focus->getRootMouseFocus()) { save_widget = root_focus; break; } root_focus->_setRootMouseFocus(true); root_focus->_riseMouseChangeRootFocus(true); root_focus = root_focus->getParent(); } // спускаемся по старому виджету и сбрасываем фокус root_focus = mWidgetMouseFocus; while (root_focus != nullptr) { if (root_focus == save_widget) break; root_focus->_setRootMouseFocus(false); root_focus->_riseMouseChangeRootFocus(false); root_focus = root_focus->getParent(); } //-------------------------------------------------------------------------------------// // смена фокуса, проверяем на доступность виджета if ((mWidgetMouseFocus != nullptr) && (mWidgetMouseFocus->getEnabled())) { mWidgetMouseFocus->_riseMouseLostFocus(item); } if ((item != nullptr) && (item->getEnabled())) { item->_riseMouseMove(_absx, _absy); item->_riseMouseSetFocus(mWidgetMouseFocus); } // запоминаем текущее окно mWidgetMouseFocus = item; if (old_mouse_focus != mWidgetMouseFocus) eventChangeMouseFocus(mWidgetMouseFocus); return isFocusMouse(); }