PixelBullet  0.0.1
A C++ game engine
Loading...
Searching...
No Matches
event_routing.h
1#pragma once
2
3#include "pixelbullet/application/layer.h"
4#include "pixelbullet/core/event.h"
5
6#include <array>
7#include <memory>
8#include <utility>
9#include <vector>
10
11namespace pixelbullet::application_internal
12{
14{
15 bool block_events = true;
16 bool want_capture_mouse = false;
17 bool want_capture_keyboard = false;
18};
19
20inline pixelbullet::core::EventResult GetImGuiCaptureResult(const pixelbullet::core::Event& event,
21 const ImGuiCaptureState& capture_state) noexcept
22{
23 if (!capture_state.block_events)
24 {
25 return pixelbullet::core::EventResult::Ignored;
26 }
27
28 if (event.is_in_category(pixelbullet::core::EventCategory::Mouse) && capture_state.want_capture_mouse)
29 {
30 return pixelbullet::core::EventResult::Consumed;
31 }
32
33 if (event.is_in_category(pixelbullet::core::EventCategory::Keyboard) && capture_state.want_capture_keyboard)
34 {
35 return pixelbullet::core::EventResult::Consumed;
36 }
37
38 return pixelbullet::core::EventResult::Ignored;
39}
40
41template <typename BuiltInHandler>
42pixelbullet::core::EventResult RouteEvent(pixelbullet::core::Event& event, const std::vector<std::unique_ptr<Layer>>& layers,
43 BuiltInHandler&& built_in_handler)
44{
45 event.reset_result();
46
47 const auto merge_result = [&](const pixelbullet::core::EventResult result) -> pixelbullet::core::EventResult
48 {
49 event.merge_result(result);
50 return event.result();
51 };
52
53 const auto route_layers = [&]() -> pixelbullet::core::EventResult
54 {
55 constexpr std::array<EventPhase, 2> k_event_phases = { EventPhase::Early, EventPhase::Normal };
56 for (const EventPhase phase : k_event_phases)
57 {
58 for (auto it = layers.rbegin(); it != layers.rend(); ++it)
59 {
60 if ((*it)->GetEventPhase() != phase)
61 {
62 continue;
63 }
64
65 merge_result((*it)->OnEvent(event));
66 if (event.consumed())
67 {
68 return event.result();
69 }
70 }
71 }
72
73 return event.result();
74 };
75 const auto invoke_built_in = [&]() -> pixelbullet::core::EventResult
76 { return merge_result(std::forward<BuiltInHandler>(built_in_handler)(event)); };
77
78 if (event.type() == pixelbullet::core::EventType::WindowClose)
79 {
80 route_layers();
81 if (event.consumed())
82 {
83 return event.result();
84 }
85
86 invoke_built_in();
87 return event.result();
88 }
89
90 invoke_built_in();
91 if (event.consumed())
92 {
93 return event.result();
94 }
95
96 route_layers();
97 return event.result();
98}
99} // namespace pixelbullet::application_internal
Definition event.h:108