Loading...
Searching...
No Matches
Fireable.h
Go to the documentation of this file.
1// Copyright (c) 2025 Dave R. Smith.
2// Malena Framework — Licensed under PolyForm Noncommercial 1.0.0; commercial use requires a paid license. See LICENSE.
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);
71
72 template<typename EnumType>
73 static void addCallback(EnumType eventEnum,
74 EventReceiver* component,
75 EventCallback callback,
76 bool overwrite = true);
77
78 struct MALENA_API Cleanup { ~Cleanup(); };
79
80 static void _register(Fireable* f);
81 static void _unregister(Fireable* f);
82
83 inline static std::vector<Fireable*> _fireables;
84 inline static std::vector<Fireable*> _fireables_frame;
85 inline static Cleanup _cleanup;
86
87 virtual void fire(const std::optional<sf::Event>& event) = 0;
88 virtual void fire() = 0;
90
91 friend class AppManager;
92 friend class PluginManager;
93 friend struct ml::exports::FireableRegistrar;
94 template<typename T> friend struct MLExport;
95
96 private:
98 DispatchType _type;
100 };
101
102} // namespace ml
103
104// ── FireableRegistrar ─────────────────────────────────────────────────────────
105
107
108namespace ml::exports
109{
110 struct FireableRegistrar
111 {
112 static void registerFireable(ml::Fireable* f)
113 {
114 ml::Fireable::_register(f);
115 }
116 };
117}
118
119namespace ml::exports
120{
121 template<typename T, typename = void>
122 struct FireableHelper
123 {
124 static void doRegister() {}
125 };
126
127 template<typename T>
128 struct FireableHelper<T, std::enable_if_t<
129 std::is_base_of_v<ml::Fireable, T> &&
130 !std::is_base_of_v<ml::PluginTag, T>
131 >>
132 {
133 static void doRegister()
134 {
135 static bool registered = false;
136 if (registered) return;
137 registered = true;
138 static T dispatcher;
139 ml::exports::FireableRegistrar::registerFireable(&dispatcher);
140 }
141 };
142}
143
145
146#include "../../../../src/Engine/Events/Fireable.tpp"
147#endif // MALENA_FIREABLE_H
Provides ML_EXPORT for registering Malena types at startup.
friend class AppManager
Definition Fireable.h:91
friend struct MLExport
Definition Fireable.h:94
friend class PluginManager
Definition Fireable.h:92
virtual ~Fireable()=default
#define MALENA_API
Definition Component.h:22