void PointerManager::notifyChangeMouseFocus(Widget* _widget) { std::string pointer = (_widget == nullptr || !_widget->getEnabled()) ? "" : _widget->getPointer(); if (pointer != mCurrentMousePointer) { mCurrentMousePointer = pointer; if (mCurrentMousePointer.empty()) { resetToDefaultPointer(); eventChangeMousePointer(mDefaultName); } else { setPointer(mCurrentMousePointer, _widget); eventChangeMousePointer(mCurrentMousePointer); } } }
bool InputManager::injectMouseMove(int _absx, int _absy, int _absz) { // запоминаем позицию mMousePosition.set(_absx, _absy); // вычисляем прирост по колеса int relz = _absz - mOldAbsZ; mOldAbsZ = _absz; // двигаем курсор PointerManager::getInstance().setPosition(mMousePosition); // проверка на скролл if (relz != 0) { bool isFocus = isFocusMouse(); if (mWidgetMouseFocus != null) mWidgetMouseFocus->_onMouseWheel(relz); return isFocus; } if (mIsWidgetMouseCapture) { if (mWidgetMouseFocus != null) mWidgetMouseFocus->_onMouseDrag(_absx, _absy); else mIsWidgetMouseCapture = false; return true; } // ищем активное окно LayerItem * rootItem = null; WidgetPtr item = static_cast<WidgetPtr>(LayerManager::getInstance()._findLayerItem(_absx, _absy, rootItem)); // спускаемся по владельцу if (null != rootItem) { while (null != static_cast<WidgetPtr>(rootItem)->_getOwner()) { rootItem = static_cast<WidgetPtr>(rootItem)->_getOwner(); } } // ничего не изменилось if (mWidgetMouseFocus == item) { bool isFocus = isFocusMouse(); if (mWidgetMouseFocus != null) mWidgetMouseFocus->_onMouseMove(_absx, _absy); return isFocus; } // проверяем на модальность if (0 != mVectorModalRootWidget.size()) { if (rootItem != mVectorModalRootWidget.back()) { rootItem = null; item = null; } } // смена фокуса, проверяем на доступность виджета if ((mWidgetMouseFocus != null) && (mWidgetMouseFocus->isEnabled())) { mWidgetMouseFocus->_onMouseLostFocus(item); } if ((item != null) && (item->isEnabled())) { if (item->getPointer() != mPointer) { mPointer = item->getPointer(); if (mPointer.empty()) { PointerManager::getInstance().setDefaultPointer(); eventChangeMousePointer(PointerManager::getInstance().getDefaultPointer()); } else { PointerManager::getInstance().setPointer(mPointer, item); eventChangeMousePointer(mPointer); } } item->_onMouseMove(_absx, _absy); item->_onMouseSetFocus(mWidgetMouseFocus); } // сбрасываем курсор else if (false == mPointer.empty()) { PointerManager::getInstance().setDefaultPointer(); mPointer.clear(); eventChangeMousePointer(PointerManager::getInstance().getDefaultPointer()); } // изменился рутовый элемент if (rootItem != mWidgetRootMouseFocus) { if (mWidgetRootMouseFocus != null) mWidgetRootMouseFocus->_onMouseChangeRootFocus(false); if (rootItem != null) static_cast<WidgetPtr>(rootItem)->_onMouseChangeRootFocus(true); mWidgetRootMouseFocus = static_cast<WidgetPtr>(rootItem); } // запоминаем текущее окно mWidgetMouseFocus = item; return isFocusMouse(); }