InputManager::InputManager() : mWidgetMouseFocus(nullptr), mWidgetKeyFocus(nullptr), mLayerMouseFocus(nullptr), mIsShiftPressed(false), mIsControlPressed(false), mHoldKey(KeyCode::None), mHoldChar(0), mFirstPressKey(false), mTimerKey(0.0f), mOldAbsZ(0), mIsInitialise(false) { resetMouseCaptureWidget(); }
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(); }