コード例 #1
0
ファイル: MyGUI_InputManager.cpp プロジェクト: MyGUI/mygui
	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);
	}
コード例 #2
0
	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;
	}