LkEngine 0.1.2
 
Loading...
Searching...
No Matches
PanelManager.h
1#pragma once
2
5#include "LkEngine/Core/LObject/ObjectPtr.h"
6
7#include "LkEngine/Renderer/UI/Panel.h"
8
9
10namespace LkEngine {
11
12 class LProject;
13
14 enum class EPanelInitState : uint8_t
15 {
16 Closed = 0,
17 Open,
18 };
19
21 {
22 const char* ID = "";
23 const char* Name = ""; /* Display name. */
24 TObjectPtr<IPanel> Panel{};
25 bool bIsOpen = false;
26 };
27
28 enum class EPanelCategory
29 {
30 Edit,
31 View,
32 COUNT
33 };
34
35 class LPanelManager : public LObject
36 {
37 public:
40
41 void Initialize();
42 void RenderUI();
43
44 void RemovePanel(const char* PanelID);
45
46 FORCEINLINE FPanelData* GetPanelData(const uint32_t PanelID)
47 {
48 for (auto& PanelMap : Panels)
49 {
50 if (PanelMap.find(PanelID) != PanelMap.end())
51 {
52 return &PanelMap.at(PanelID);
53 }
54 }
55
56 return nullptr;
57 }
58
59 FORCEINLINE const FPanelData* GetPanelData(const uint32_t PanelID) const
60 {
61 return GetPanelData(PanelID);
62 }
63
64 FORCEINLINE FPanelData* GetPanelData(const char* PanelName)
65 {
66 const uint32_t PanelID = LHash::Generate<EHash::FNV>(PanelName);
67 for (auto& PanelMap : Panels)
68 {
69 if (PanelMap.find(PanelID) != PanelMap.end())
70 {
71 return &PanelMap.at(PanelID);
72 }
73 }
74
75 return nullptr;
76 }
77
78 std::unordered_map<uint32_t, FPanelData>& GetPanels(const EPanelCategory Category)
79 {
80 return Panels[static_cast<std::size_t>(Category)];
81 }
82
83 const std::unordered_map<uint32_t, FPanelData>& GetPanels(const EPanelCategory Category) const
84 {
85 return Panels[static_cast<std::size_t>(Category)];
86 }
87
88 template<typename TPanel>
89 TObjectPtr<TPanel> AddPanel(const EPanelCategory Category, const FPanelData& PanelData)
90 {
91 static_assert(std::is_base_of_v<IPanel, TPanel>, "Panel needs to implement the IPanel interface");
92
93 const uint32_t ID = LHash::Generate<EHash::FNV>(PanelData.ID);
94 auto& PanelMap = Panels[(std::size_t)Category];
95 if (PanelMap.find(ID) != PanelMap.end())
96 {
97 LK_CORE_ERROR_TAG("PanelManager", "A panel with ID '{}' already exists", PanelData.ID);
98 LK_CORE_ASSERT(false, "A panel with ID '{}' already exists", PanelData.ID);
99 return nullptr;
100 }
101
102 PanelMap[ID] = PanelData;
103 LK_CORE_DEBUG_TAG("PanelManager", "Adding panel {} ({})", PanelData.Name, PanelData.ID);
104
105 return PanelData.Panel.As<TPanel>();
106 }
107
108 template<typename TPanel, typename... TArgs>
109 TObjectPtr<TPanel> AddPanel(const EPanelCategory Category, const char* StringID, EPanelInitState InitState, TArgs&&... Args)
110 {
111 const bool bIsOpenByDefault = (InitState == EPanelInitState::Open);
112 return AddPanel<TPanel>(Category, FPanelData{ StringID, StringID, TObjectPtr<TPanel>::Create(std::forward<TArgs>(Args)...), bIsOpenByDefault });
113 }
114
115 template<typename TPanel, typename... TArgs>
116 TObjectPtr<TPanel> AddPanel(const EPanelCategory Category, const char* StringID, const char* DisplayName, EPanelInitState InitState, TArgs&&... Args)
117 {
118 const bool bIsOpenByDefault = (InitState == EPanelInitState::Open);
119 return AddPanel<TPanel>(Category, FPanelData{ StringID, DisplayName, TObjectPtr<TPanel>::Create(std::forward<TArgs>(Args)...), bIsOpenByDefault });
120 }
121
122 template<typename TPanel>
123 TObjectPtr<TPanel> GetPanel(const char* StringID)
124 {
125 static_assert(std::is_base_of_v<IPanel, TPanel>, "Panel needs to implement the IPanel interface");
126 const uint32_t ID = LHash::Generate<EHash::FNV>(StringID);
127 for (const auto& PanelMap : Panels)
128 {
129 if (PanelMap.find(ID) != PanelMap.end())
130 {
131 return PanelMap.at(ID).Panel.As<TPanel>();
132 }
133 }
134
135 LK_CORE_ERROR_TAG("PanelManager", "Cannot find panel with id '{}'", StringID);
136 return nullptr;
137 }
138
139 void Serialize();
140 void Deserialize();
141
142 void OnProjectChanged(const TObjectPtr<LProject> InProject);
143
147 void OnSetPanelOpenHandler(const char* PanelID, const bool Open)
148 {
149 LK_CORE_ASSERT(PanelID);
150 LK_CORE_TRACE_TAG("PanelManager", "Invoked OnSetPanelOpenHandler: ({}, {})", PanelID, (Open ? "Opened" : "Closed"));
151 if (FPanelData* PanelData = GetPanelData(PanelID); PanelData != nullptr)
152 {
153 PanelData->bIsOpen = Open;
154 }
155 }
156
157 bool IsPanelOpenHandler(const char* PanelID)
158 {
159 LK_CORE_ASSERT(PanelID);
160 LK_CORE_TRACE_TAG("PanelManager", "Invoked IsPanelOpenHandler: {}", PanelID);
161 if (FPanelData* PanelData = GetPanelData(PanelID); PanelData != nullptr)
162 {
163 return PanelData->bIsOpen;
164 }
165
166 return false;
167 }
168
169 private:
170 std::array<std::unordered_map<uint32_t, FPanelData>, (std::size_t)EPanelCategory::COUNT> Panels;
171
172 LCLASS(LPanelManager);
173 };
174
175}
Core header.
LObject implementation.
Definition Object.h:46
Definition PanelManager.h:36
void OnSetPanelOpenHandler(const char *PanelID, const bool Open)
Definition PanelManager.h:147
void Initialize()
Initialize object.
Definition PanelManager.cpp:28
Definition ObjectPtr.h:102
static TObjectPtr< T > Create(TArgs &&... Args)
Create new pointer instance of type T.
#define LCLASS(Class)
Definition CoreMacros.h:226
Definition Asset.h:11
Definition PanelManager.h:21