3#include "pixelbullet/application/event.h"
4#include "pixelbullet/application/layer.h"
11namespace pixelbullet::application_internal
15 bool block_events =
true;
16 bool want_capture_mouse =
false;
17 bool want_capture_keyboard =
false;
20constexpr EventResult MergeEventResults(
const EventResult current,
const EventResult next)
noexcept
22 if (current == EventResult::Consumed || next == EventResult::Consumed)
24 return EventResult::Consumed;
27 if (current == EventResult::Handled || next == EventResult::Handled)
29 return EventResult::Handled;
32 return EventResult::Ignored;
35constexpr bool IsConsumed(
const EventResult result)
noexcept
37 return result == EventResult::Consumed;
40inline EventResult GetImGuiCaptureResult(
const Event& event,
const ImGuiCaptureState& capture_state)
noexcept
42 if (!capture_state.block_events)
44 return EventResult::Ignored;
47 if (event.IsInCategory(EventCategoryMouse) && capture_state.want_capture_mouse)
49 return EventResult::Consumed;
52 if (event.IsInCategory(EventCategoryKeyboard) && capture_state.want_capture_keyboard)
54 return EventResult::Consumed;
57 return EventResult::Ignored;
60template <
typename BuiltInHandler>
61EventResult RouteEvent(Event& event,
const std::vector<std::unique_ptr<Layer>>& layers, BuiltInHandler&& built_in_handler)
63 EventResult result = std::forward<BuiltInHandler>(built_in_handler)(event);
64 if (IsConsumed(result))
69 constexpr std::array<EventPhase, 2> k_event_phases = { EventPhase::Early, EventPhase::Normal };
70 for (
const EventPhase phase : k_event_phases)
72 for (
auto it = layers.rbegin(); it != layers.rend(); ++it)
74 if ((*it)->GetEventPhase() != phase)
79 result = MergeEventResults(result, (*it)->OnEvent(event));
80 if (IsConsumed(result))
Definition event_routing.h:14