CeresEngine 0.2.0
A game development framework
Loading...
Searching...
No Matches
SystemUI.hpp
Go to the documentation of this file.
1//
2// CeresEngine - A game development framework
3//
4// Created by Rogiel Sulzbach.
5// Copyright (c) 2018-2022 Rogiel Sulzbach. All rights reserved.
6//
7
8#pragma once
9
11
14
15#include <type_traits>
16
18
19 class SystemUI {
20 friend class SystemUIRegistry;
21
22 private:
24 SystemUI* next = nullptr;
25
27 SystemUI* previous = nullptr;
28
29 public:
32
34 virtual ~SystemUI();
35
36 public:
38 [[nodiscard]] virtual String getName() const = 0;
39
40 [[nodiscard]] virtual bool supports(SystemManager& systemManager) const = 0;
41 virtual void render(SystemManager& systemManager) = 0;
42 virtual void addSystem(SystemManager& systemManager) = 0;
43 virtual void removeSystem(SystemManager& systemManager) = 0;
44 };
45
46 template<typename S, bool = std::is_default_constructible_v<S>> class BasicSystemUI : public SystemUI {
47 public:
49 [[nodiscard]] bool supports(SystemManager& systemManager) const override { return systemManager.has<S>(); }
50
52 void render(SystemManager& systemManager) final { render(systemManager.get<S>()); }
53
56 virtual void render(S& system) = 0;
57
59 void addSystem(SystemManager& systemManager) override {}
60
62 void removeSystem(SystemManager& systemManager) override { systemManager.remove<S>(); }
63 };
64
65 template<typename S> class BasicSystemUI<S, true> : public BasicSystemUI<S, false> {
66 public:
68 void addSystem(SystemManager& systemManager) override { systemManager.add<S>(); }
69 };
70
71 template<typename S> class TSystemUI final : public SystemUI {
72 public:
74 std::function<bool(SystemManager&)> supports_;
75 std::function<void(SystemManager&)> addSystem_;
77 std::function<void(S&)> render_;
78
79 public:
83 template<typename Constructor> CE_EXPLICIT(false) TSystemUI(Constructor&& constructor) { // NOLINT
84 name = typeid(S).name();
85 supports_ = [](SystemManager& systemManager) {
86 return systemManager.has<S>();
87 };
88 addSystem_ = [](SystemManager& systemManager) {
89 if constexpr(std::is_default_constructible_v<S>) { // NOLINT
90 systemManager.add<S>();
91 }
92 };
93 removeSystem_ = [](SystemManager& systemManager) {
94 systemManager.remove<S>();
95 };
96 constructor(*this, name, supports_, addSystem_, removeSystem_, render_);
97 }
98
99 public:
101 [[nodiscard]] bool supports(SystemManager& systemManager) const final {
102 if(supports_) {
103 return supports_(systemManager);
104 }
105 return false;
106 }
107
109 void render(SystemManager& systemManager) final {
110 if(render_) {
111 render_(systemManager.get<S>());
112 }
113 }
114
116 void addSystem(SystemManager& systemManager) final {
117 if(addSystem_) {
118 addSystem_(systemManager);
119 }
120 }
121
123 void removeSystem(SystemManager& systemManager) final {
124 if(removeSystem_) {
125 removeSystem_(systemManager);
126 }
127 }
128
131 };
132
134 friend class SystemUI;
135
136 private:
138 static inline SystemUI* first = nullptr;
139
141 static inline SystemUI* last = nullptr;
142
143 public:
144 static void renderUI(SystemManager& systemManager);
145 };
146
147#define CE_EDITOR_SYSTEM_TOKENPASTE(x, y) x##y
148#define CE_EDITOR_SYSTEM_TOKENPASTE2(x, y) CE_EDITOR_SYSTEM_TOKENPASTE(x, y)
149#define CE_EDITOR_SYSTEM(...) \
150 static const ::CeresEngine::Editor::UI::TSystemUI<__VA_ARGS__> CE_EDITOR_SYSTEM_TOKENPASTE2(systemUI, __COUNTER__) [[maybe_unused]] = [ \
151 ](::CeresEngine::Editor::UI::TSystemUI<__VA_ARGS__> & ui, ::CeresEngine::String & name, auto& supports, auto& add, auto& remove, auto& render) noexcept
152#define CE_EDITOR_SYSTEM_ADVANCED(EditorClass) static const EditorClass CE_EDITOR_SYSTEM_TOKENPASTE2(systemUI, EditorClass) [[maybe_unused]]{};
153#define CE_EDITOR_SYSTEM_ADVANCED2(Name, ClassName, ...) \
154 struct Name##SystemUI final : public ::CeresEngine::Editor::UI::BasicSystemUI<ClassName> { \
155 __VA_ARGS__ [[nodiscard]] ::CeresEngine::String getName() const override { return #Name; } \
156 }; \
157 CE_EDITOR_SYSTEM_ADVANCED(Name##SystemUI)
158
159} // namespace CeresEngine::Editor::UI
#define CE_EXPLICIT(EXPR)
Definition Macros.hpp:413
void addSystem(SystemManager &systemManager) override
Definition SystemUI.hpp:68
Definition SystemUI.hpp:46
void addSystem(SystemManager &systemManager) override
Definition SystemUI.hpp:59
bool supports(SystemManager &systemManager) const override
Definition SystemUI.hpp:49
void removeSystem(SystemManager &systemManager) override
Definition SystemUI.hpp:62
void render(SystemManager &systemManager) final
Definition SystemUI.hpp:52
virtual void render(S &system)=0
Renders a UI for the system of the given entity.
Definition SystemUI.hpp:19
SystemUI * previous
The previous system UI in the chain.
Definition SystemUI.hpp:27
virtual String getName() const =0
virtual void render(SystemManager &systemManager)=0
virtual ~SystemUI()
Destroys the SystemUI object.
virtual void addSystem(SystemManager &systemManager)=0
SystemUI * next
The next system UI in the chain.
Definition SystemUI.hpp:24
SystemUI()
Creates a new SystemUI object.
virtual void removeSystem(SystemManager &systemManager)=0
virtual bool supports(SystemManager &systemManager) const =0
static void renderUI(SystemManager &systemManager)
static SystemUI * last
The last component UI in the linked list.
Definition SystemUI.hpp:141
static SystemUI * first
The first component UI in the linked list.
Definition SystemUI.hpp:138
Definition SystemUI.hpp:71
void removeSystem(SystemManager &systemManager) final
Definition SystemUI.hpp:123
std::function< bool(SystemManager &)> supports_
Definition SystemUI.hpp:74
void render(SystemManager &systemManager) final
Definition SystemUI.hpp:109
String getName() const final
Definition SystemUI.hpp:130
std::function< void(S &)> render_
Definition SystemUI.hpp:77
void addSystem(SystemManager &systemManager) final
Definition SystemUI.hpp:116
std::function< void(SystemManager &)> removeSystem_
Definition SystemUI.hpp:76
String name
Definition SystemUI.hpp:73
bool supports(SystemManager &systemManager) const final
Definition SystemUI.hpp:101
std::function< void(SystemManager &)> addSystem_
Definition SystemUI.hpp:75
The system manager is responsible for keeping track and dispatching updates to all attached systems.
Definition SystemManager.hpp:22
void remove()
Removes a system of type S.
bool has() noexcept
Checks if the manager contains a system of type S.
S & add(Args &&... args)
Adds a new system of type S.
Definition ComponentUI.hpp:14
@ Constructor
Indicates that the item is a constructor.
constexpr size_t hash(const T &v)
Generates a hash for the provided type.
Definition Hash.hpp:25