Ejemplo n.º 1
0
void HKUserInterface::OnInputEvent(HKInputManager &manager, const HKInputManager::EventInfo &ev)
{
	HKWidget *pFocusWidget = pFocusList[ev.pSource->sourceID];

	if(ev.pSource->device == IDD_Mouse || ev.pSource->device == IDD_TouchPanel)
	{
		// positional events will be sent to the hierarchy
		MFVector pos = { ev.hover.x, ev.hover.y, 0.f, 1.f };
		MFVector dir = { 0.f, 0.f, 1.f, 1.f };

		MFVector localPos;

		HKWidget *pWidget = NULL;
		if(pFocusWidget)
		{
			pWidget = pFocusWidget->IntersectWidget(pos, dir, &localPos);
			if(!pWidget)
				pWidget = pFocusWidget;
		}
		else
		{
			pWidget = pRoot->IntersectWidget(pos, dir, &localPos);
		}

		// update the down widget
		if(ev.ev == HKInputManager::IE_Down)
			pDownOver[ev.pSource->sourceID] = pWidget;
		else if(ev.ev == HKInputManager::IE_Tap)
		{
			// if we receive a tap event, check that it was on the same widget we recorded the down event for
			if(pDownOver[ev.pSource->sourceID] != pWidget)
				return;
		}

		// check if the hover has changed
		HKWidget *pHover = pHoverList[ev.pSource->sourceID];
		if(pHover != pWidget)
		{
			pHoverList[ev.pSource->sourceID] = pWidget;

			if(pHover)
			{
				HKWidgetInputEvent ie(pHover, ev.pSource);
				pHover->OnHoverOut(*pHover, ie);
			}

			if(pWidget)
			{
				HKWidgetInputEvent ie(pWidget, ev.pSource);
				pWidget->OnHoverOver(*pWidget, ie);
			}
		}

		if(pWidget)
		{
			HKInputManager::EventInfo transformedEv = ev;
			LocaliseInput(transformedEv, pWidget, localPos);

			// send the input event
			if(pWidget->InputEvent(manager, transformedEv))
				return;
		}
	}
	else if(pFocusWidget)
	{
		// non-positional events
		pFocusWidget->InputEvent(manager, ev);
	}
}