void InputManager::setKeyFocusWidget(WidgetPtr _widget) { // ищем рутовый фокус WidgetPtr root = _widget; if (root != null) { while (root->_getOwner() != null) root = root->_getOwner(); } // если рутовый фокус поменялся, то оповещаем if (mWidgetRootKeyFocus != root) { if (mWidgetRootKeyFocus != null) mWidgetRootKeyFocus->_onKeyChangeRootFocus(false); if (root != null) root->_onKeyChangeRootFocus(true); mWidgetRootKeyFocus = root; } // а вот тут уже проверяем обыкновенный фокус if (_widget == mWidgetKeyFocus) return; if (isFocusKey()) mWidgetKeyFocus->_onKeyLostFocus(_widget); if (_widget != null) { if (_widget->isNeedKeyFocus()) { _widget->_onKeySetFocus(mWidgetKeyFocus); mWidgetKeyFocus = _widget; return; } } mWidgetKeyFocus = null; }
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; }