Loading...
Searching...
No Matches
Fireable.h
Go to the documentation of this file.
1// Copyright (c) 2025 Dave R. Smith. All rights reserved.
2// Malena Framework — Proprietary Software. See LICENSE for terms.
3
4//
5// Created by Dave Smith on 3/20/26.
6//
7
8#ifndef MALENA_FIREABLE_H
9#define MALENA_FIREABLE_H
10
12#include <Malena/Core/Export.h>
13#include <functional>
14#include <optional>
15#include <unordered_map>
16#include "SFML/Window/Event.hpp"
17
21
22namespace ml
23{
24 namespace exports
25 {
26 struct FireableRegistrar;
27 }
28
30
36 struct PluginTag {};
38
55 class Core;
56 class EventReceiver;
58 {
59 public:
61 enum class DispatchType { FRAME, EVENT };
62 Fireable(DispatchType type = DispatchType::EVENT);
64
65 virtual ~Fireable() = default;
66
68 virtual bool occurred(const std::optional<sf::Event>& event) { return false; }
69 virtual bool occurred() { return false; }
70 virtual bool filter(const std::optional<sf::Event>& event, Core* component) { return true; }
71
72 template<typename EnumType>
73 static void addCallback(EnumType eventEnum,
74 EventReceiver* component,
75 EventCallback callback);
76
77 struct MALENA_API Cleanup { ~Cleanup(); };
78
79 static void _register(Fireable* f);
80 static void _unregister(Fireable* f);
81
82 inline static std::vector<Fireable*> _fireables;
83 inline static std::vector<Fireable*> _fireables_frame;
84 inline static Cleanup _cleanup;
85
86 virtual void fire(const std::optional<sf::Event>& event) = 0;
87 virtual void fire() = 0;
89
90 friend class AppManager;
91 friend class PluginManager;
92 friend struct ml::exports::FireableRegistrar;
93 template<typename T> friend struct MLExport;
94
95 private:
97 DispatchType _type;
99 };
100
101} // namespace ml
102
103// ── FireableRegistrar ─────────────────────────────────────────────────────────
104
106
107namespace ml::exports
108{
109 struct FireableRegistrar
110 {
111 static void registerFireable(ml::Fireable* f)
112 {
113 ml::Fireable::_register(f);
114 }
115 };
116}
117
118namespace ml::exports
119{
120 template<typename T, typename = void>
121 struct FireableHelper
122 {
123 static void doRegister() {}
124 };
125
126 template<typename T>
127 struct FireableHelper<T, std::enable_if_t<
128 std::is_base_of_v<ml::Fireable, T> &&
129 !std::is_base_of_v<ml::PluginTag, T>
130 >>
131 {
132 static void doRegister()
133 {
134 static bool registered = false;
135 if (registered) return;
136 registered = true;
137 static T dispatcher;
138 ml::exports::FireableRegistrar::registerFireable(&dispatcher);
139 }
140 };
141}
142
144
145#include "../../../../src/Engine/Events/Fireable.tpp"
146#endif // MALENA_FIREABLE_H
Provides ML_EXPORT for registering Malena types at startup.
friend class AppManager
Definition Fireable.h:90
friend struct MLExport
Definition Fireable.h:93
friend class PluginManager
Definition Fireable.h:91
virtual ~Fireable()=default
#define MALENA_API
Definition Component.h:22