SDEngine
Game Engine
Loading...
Searching...
No Matches
ViewManager.hpp
Go to the documentation of this file.
1// TODO(docs): Add file-level Doxygen header
2// - @file ViewManager.hpp
3// - @brief Manages View instances (create, destroy, query)
4// - Relationship to Application and View classes
5#pragma once
6
7#include <expected>
8#include <functional>
9#include <string>
10#include <unordered_map>
11#include <vector>
12
13#include "SD/arena.hpp"
14#include "SD/core/Scene.hpp"
15#include "SD/core/View.hpp"
16#include "SD/core/base.hpp"
17#include "SD/export.hpp"
18
19namespace sd {
20
23
24 template<typename T, typename... Args>
25 requires std::is_base_of_v<View, T>
26 T& create(Arena* arena, std::string name, Args&&... args) {
27 if (m_view_name_to_id.contains(name))
29
30 ViewId id = m_next_view_id++;
31 T* view = arena_push<T>(arena);
32 new (view) T(std::move(name), std::forward<Args>(args)...);
33 view->m_view_id = id;
34
35 auto& ref = *view;
36 m_views_by_id.emplace(id, view);
37 m_view_name_to_id.emplace(ref.get_name(), id);
38 return ref;
39 }
40
41 using ViewResult = std::expected<std::reference_wrapper<View>, ViewError>;
42
43 ViewResult get(ViewId id);
44 ViewResult get(const std::string& name);
45 std::expected<ViewId, ViewError> get_id(const std::string& name) const;
46
47 ViewError remove(ViewId id);
48 ViewError remove(const std::string& name);
49
50 template<typename T, typename... Args>
51 requires std::is_base_of_v<Layer, T>
52 std::expected<std::reference_wrapper<T>, ViewError> push_layer(ViewId id, Args&&... args) {
53 auto it = m_views_by_id.find(id);
54 if (it == m_views_by_id.end())
55 return std::unexpected(VIEW_DOES_NOT_EXIST);
56 return it->second->push_layer<T>(std::forward<Args>(args)...);
57 }
58
59 const std::unordered_map<ViewId, View*>& get_views() const { return m_views_by_id; }
60 auto& get_views() { return m_views_by_id; }
61
62 template<typename F>
63 void for_each(F&& fn) {
64 for (auto& [id, view] : m_views_by_id) {
65 fn(*view);
66 }
67 }
68
69 template<typename F>
70 void for_each(F&& fn) const {
71 for (const auto& [id, view] : m_views_by_id) {
72 fn(*view);
73 }
74 }
75
76 std::vector<Scene*> get_scenes();
77
78 void update_views(float dt);
79 void render_views(vk::CommandBuffer cmd);
80 void cleanup_closed_views();
81 void clear();
82
83
84 std::unordered_map<ViewId, View*> m_views_by_id;
85 std::unordered_map<std::string, ViewId> m_view_name_to_id;
87};
88
89} // namespace sd
#define NOT_IMPLEMENTED
Definition base.hpp:27
Definition Application.hpp:22
ViewError
Definition View.hpp:27
@ VIEW_DOES_NOT_EXIST
Definition View.hpp:30
Definition arena.hpp:85
Definition id_types.hpp:7
Definition ViewManager.hpp:21
std::unordered_map< ViewId, View * > m_views_by_id
Definition ViewManager.hpp:84
ViewId m_next_view_id
Definition ViewManager.hpp:86
std::unordered_map< std::string, ViewId > m_view_name_to_id
Definition ViewManager.hpp:85
void for_each(F &&fn)
Definition ViewManager.hpp:63
std::expected< std::reference_wrapper< View >, ViewError > ViewResult
Definition ViewManager.hpp:41
T & create(Arena *arena, std::string name, Args &&... args)
Definition ViewManager.hpp:26
const std::unordered_map< ViewId, View * > & get_views() const
Definition ViewManager.hpp:59
void for_each(F &&fn) const
Definition ViewManager.hpp:70
auto & get_views()
Definition ViewManager.hpp:60
std::expected< std::reference_wrapper< T >, ViewError > push_layer(ViewId id, Args &&... args)
Definition ViewManager.hpp:52
consteval U64 type_id_of()
Definition type_id.hpp:6