Esempio n. 1
0
void Menu::HandleKeyDown(StringHash eventType, VariantMap& eventData)
{
    if (!enabled_)
        return;

    using namespace KeyDown;

    // Activate if accelerator key pressed
    if (eventData[P_KEY].GetInt() == acceleratorKey_ &&
        (acceleratorQualifiers_ == QUAL_ANY || eventData[P_QUALIFIERS].GetInt() == acceleratorQualifiers_) &&
        eventData[P_REPEAT].GetBool() == false)
    {
        // Ignore if UI has modal element or focused LineEdit
        UI* ui = GetSubsystem<UI>();
        UIElement* focusElement = ui->GetFocusElement();
        if (ui->HasModalElement() || (focusElement && focusElement->GetType() == LineEdit::GetTypeStatic()))
            return;

        HandlePressedReleased(eventType, eventData);
    }
}
Esempio n. 2
0
void UIElement::RaiseEvent(RoutedEventArgs* args)
{
	args->m_originalSource = this;

	RoutedEvent* routedEvent = args->get_RoutedEvent();
	if (routedEvent == NULL)
	{
		raise(SystemException("routedEvent = NULL"));
	}

	// preview phase
	if (routedEvent->get_RoutingStrategy() == RoutingStrategy_Tunnel)
	{
#if 0
		EventRoute route;

		UIElement* p = this;//dynamic_cast<UIElement*>(GetRParent());
		while (p)
		{
			route.ancestors.push_front(p);
			p = dynamic_cast<UIElement*>(p->GetRParent());
		}

		list<UIElement*>::iterator it = route.ancestors.begin();
		while (it != route.ancestors.end())
		{
			UIElement* el = *it;

			// Class handlers
			if (!args->get_Handled())	// TODO
			{
				EventManager::InvokeClassHandlers(el/*args->get_Source()*/->GetType(), el, args);
			}

			// Instance handlers
			signal_base* sig = el->m_handlers[routedEvent->m_index];

			if (sig)
			{
				int nslots = sig->GetSlotCount();

			//	signal2<Object*,RoutedEventArgs*>::connection_type it2 = el->m_handlers[routedEvent->m_index]->m_slots.begin();
			//	while (it2 != el->m_handlers[routedEvent->m_index]->m_slots.end())
				for (int i = 0; i < nslots; i++)
				{
					stub_interface_base* slot = sig->GetSlot(i);

					if (!args->get_Handled())	// TODO
					{
						args->InvokeEventHandler(this, slot);
					}
				//	++it2;
				}
			}

			++it;
		}
#endif
	}
	else if (routedEvent->get_RoutingStrategy() == RoutingStrategy_Bubble)
	{
		EventRoute route;

		UIElement* p = this;
		do
		{
			route.ancestors.push_back(p);
			p = p->get_Parent();
		}
		while (p);

		if (args->get_Source() == nullptr)
		{
			args->set_Source(this);
		}

		for (auto it = route.ancestors.begin(); it != route.ancestors.end(); ++it)
		{
			UIElement* el = *it;

			// Class handlers
			if (!args->get_Handled())	// TODO
			{
				EventManager::InvokeClassHandlers(el->GetType(), el, args);
			}

			// Instance handlers

			Event* pEvent = el->m_events[routedEvent->GetIndex()];

			if (pEvent)
			{
				try
				{
					switch (pEvent->get_NumArgs())
					{
					case 2:
						{
							pEvent->Handle(el, args);
						}
						break;

					default:
						ASSERT(0);
					}
				}
				catch (Exception* e)
				{
					MessageBox(nullptr, e->get_Reason().c_strw(), L"GUI", MB_OK | MB_ICONERROR);
				}
			}

			args->set_Source(el);

#if 0
				list<IDispatch*>::iterator it = pEvent->m_handlers.begin();

				while (it != pEvent->m_handlers.end())
				{
					IDispatch* handler = *it;
					++it;

					if (!args->get_Handled())	// TODO
					{
						args->InvokeEventHandler(this, handler);
					}
				}

				/*
				int nslots = el->m_handlers[routedEvent->m_index]->GetSlotCount();

				signal2<Object*,RoutedEventArgs*>::connection_type it2 = el->m_handlers[routedEvent->m_index].m_slots.begin();
				while (it2 != el->m_handlers[routedEvent->m_index].m_slots.end())
				{
					args->InvokeEventHandler(this, *it2);
					++it2;
				}
				*/
			}
#endif
		}
	}