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); } }
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 } }