bool InputManager::injectMouseRelease(int _absx, int _absy, MouseButton _id) { if (isFocusMouse()) { // если активный элемент заблокирован if (!mWidgetMouseFocus->getEnabled()) return true; if (_id != MouseButton::None && _id != MouseButton::MAX) { if (mMouseCapture[_id.toValue()]) { // drop capture mMouseCapture[_id.toValue()] = false; } } mWidgetMouseFocus->_riseMouseButtonReleased(_absx, _absy, _id); // после вызова, виджет может быть сброшен if (nullptr != mWidgetMouseFocus) { if (MouseButton::Left == _id) { if (mTimer.getMilliseconds() < INPUT_TIME_DOUBLE_CLICK) { mWidgetMouseFocus->_riseMouseButtonClick(); // после вызова, виджет может быть сброшен if (nullptr != mWidgetMouseFocus) mWidgetMouseFocus->_riseMouseButtonDoubleClick(); } else { // проверяем над тем ли мы окном сейчас что и были при нажатии Widget* item = LayerManager::getInstance().getWidgetFromPoint(_absx, _absy); if ( item == mWidgetMouseFocus) { mWidgetMouseFocus->_riseMouseButtonClick(); } mTimer.reset(); } } } // для корректного отображения injectMouseMove(_absx, _absy, mOldAbsZ); return true; } return false; }
void BerkeliumWidget::onMouseButtonReleased(int _left, int _top, MouseButton _id) { if (mWindow != nullptr) mWindow->mouseButton(_id.toValue(), false); Base::onMouseButtonReleased(_left, _top, _id); }
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::None != _id && MouseButton::MAX != _id) { // start capture mMouseCapture[_id.toValue()] = true; // remember last pressed position if (mLayerMouseFocus != nullptr) { IntPoint point = mLayerMouseFocus->getPosition(_absx, _absy); mLastPressed[_id.toValue()] = point; } } // ищем вверх тот виджет который может принимать фокус Widget* item = mWidgetMouseFocus; while ((item != nullptr) && (!item->getNeedKeyFocus())) item = item->getParent(); // устанавливаем перед вызовом т.к. возможно внутри ктонить поменяет фокус под себя setKeyFocusWidget(item); if (isFocusMouse()) { 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()->_forcePick(pick); } pick = pick->getParent(); } while (pick); } } if (old_key_focus != mWidgetKeyFocus) eventChangeKeyFocus(mWidgetKeyFocus); return true; }