Loading...
Searching...
No Matches
Fireable.h
Go to the documentation of this file.
1//
2// Created by Dave Smith on 3/20/26.
3//
4
5#ifndef FIREABLE_H
6#define FIREABLE_H
7
9#include <functional>
10#include <optional>
11#include <unordered_map>
12#include "SFML/Window/Event.hpp"
13
17
18namespace ml
19{
20 namespace exports
21 {
22 struct FireableRegistrar;
23 }
24
26
32 struct PluginTag {};
34
51 class Core;
52 class EventReceiver;
54 {
55 public:
57 enum class DispatchType { FRAME, EVENT };
58 Fireable(DispatchType type = DispatchType::EVENT);
60
61 virtual ~Fireable() = default;
62
64 virtual bool occurred(const std::optional<sf::Event>& event) { return false; }
65 virtual bool occurred() { return false; }
66 virtual bool filter(const std::optional<sf::Event>& event, Core* component) { return true; }
67
68 template<typename EnumType>
69 static void addCallback(EnumType eventEnum,
70 EventReceiver* component,
71 EventCallback callback);
72
73 struct Cleanup { ~Cleanup(); };
74
75 static void _register(Fireable* f);
76 static void _unregister(Fireable* f);
77
78 inline static std::vector<Fireable*> _fireables;
79 inline static std::vector<Fireable*> _fireables_frame;
80 inline static Cleanup _cleanup;
81
82 virtual void fire(const std::optional<sf::Event>& event) = 0;
83 virtual void fire() = 0;
85
86 friend class AppManager;
87 friend class PluginManager;
89 template<typename T> friend struct MLExport;
90
91 private:
93 DispatchType _type;
95 };
96
97} // namespace ml
98
99// ── FireableRegistrar ─────────────────────────────────────────────────────────
100
102
103namespace ml::exports
104{
105 struct FireableRegistrar
106 {
107 static void registerFireable(ml::Fireable* f)
108 {
109 ml::Fireable::_register(f);
110 }
111 };
112}
113
114namespace ml::exports
115{
116 template<typename T, typename = void>
117 struct FireableHelper
118 {
119 static void doRegister() {}
120 };
121
122 template<typename T>
123 struct FireableHelper<T, std::enable_if_t<
124 std::is_base_of_v<ml::Fireable, T> &&
125 !std::is_base_of_v<ml::PluginTag, T>
126 >>
127 {
128 static void doRegister()
129 {
130 static bool registered = false;
131 if (registered) return;
132 registered = true;
133 static T dispatcher;
134 ml::exports::FireableRegistrar::registerFireable(&dispatcher);
135 }
136 };
137}
138
140
141#include "../../../../src/Engine/Events/Fireable.tpp"
142#endif // FIREABLE_H
Provides ML_EXPORT for registering Malena types at startup.
friend struct ml::exports::FireableRegistrar
Definition Fireable.h:88
friend class AppManager
Definition Fireable.h:86
friend struct MLExport
Definition Fireable.h:89
friend class PluginManager
Definition Fireable.h:87
virtual ~Fireable()=default
std::function< void(const std::optional< sf::Event > &)> EventCallback
Callback type for event handlers that receive the raw SFML event.
Definition Callback.h:31
Definition Component.h:18