void InputManager::setKeyFocusWidget(Widget* _widget) { if (_widget == mWidgetKeyFocus) return; Widget* oldKeyFocus = mWidgetKeyFocus; mWidgetKeyFocus = nullptr; Widget* sharedRootFocus = nullptr; // possible shared parent for both old and new widget // recursively set root key focus Widget* rootFocus = _widget; while (rootFocus != nullptr) { if (rootFocus->getRootKeyFocus()) { sharedRootFocus = rootFocus; break; } rootFocus->_setRootKeyFocus(true); rootFocus->_riseKeyChangeRootFocus(true); rootFocus = rootFocus->getParent(); } // recursively reset root key focus rootFocus = oldKeyFocus; while (rootFocus != nullptr) { if (rootFocus == sharedRootFocus) break; rootFocus->_setRootKeyFocus(false); rootFocus->_riseKeyChangeRootFocus(false); rootFocus = rootFocus->getParent(); } //-------------------------------------------------------------------------------------// mWidgetKeyFocus = _widget; if (oldKeyFocus) { oldKeyFocus->_riseKeyLostFocus(_widget); } if (_widget) { _widget->_riseKeySetFocus(mWidgetKeyFocus); } eventChangeKeyFocus(mWidgetKeyFocus); }
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; }