dl
dl_ui_scene.h
浏览该文件的文档.
1
12#pragma once
13#ifndef DL_DISABLE_RENDER
14#include <unordered_map>
15#include <string>
16
17#include "io/dl_log.h"
18#include "base/dl_range_any.h"
19#include "ui/dl_ui_panel.h"
20
21namespace dl::UI
22{
23
25class Scene
26{
27 friend class SceneManager;
28public:
30 virtual ~Scene();
31 virtual void Update() {};
32 virtual void Render() {};
33
35 UI::Panel* CreatePanel(std::string_view name);
37 std::string GetName() { return _root->GetName(); }
41 // void SetVisibleOnly(UI::Panel* panel)
42 // {
43 // auto iter = _allPanel.find(panel->GetName());
44 // if(iter == _allPanel.end())
45 // {
46 // log_err("not find panel: {}", panel->GetName());
47 // return;
48 // }
49 // for(auto& p : _allPanel)
50 // {
51 // panel->SetVisible(p.second == panel);
52 // }
53 // }
54
55 void _update();
56 void _render();
57protected:
59};
60
63{
64public:
71 void Add(std::string_view name, Scene* scene)
72 {
73 scene->_root->SetName(name);
74 _vecSceneAdd[std::string{ name }] = scene;
75 }
76
80 void Del(std::string_view name)
81 {
82 if (Any::Equal(_vecSceneDelete, name))
83 {
84 log_err("重复删除Scene:{}", name);
85 return;
86 }
87 _vecSceneDelete.push_back(std::string{ name });
88 }
89 void Del(Scene* scene)
90 {
91 Del(scene->GetName());
92 }
94 {
95 // 处理上一帧的删除
96 for (auto& name : _vecSceneDelete)
97 {
98 auto iter = _allScene.find(name);
99 if (iter == _allScene.end())
100 {
101 log_err("移除时未找到Scene:{}", name);
102 return;
103 }
104 delete iter->second;
105 _allScene.erase(iter);
106 }
107 _vecSceneDelete.clear();
108
109 // 处理上一帧的添加
110 for (auto& [name, scene] : _vecSceneAdd)
111 {
112 // 不存在,直接添加
113 auto iter = _allScene.find(name);
114 if (iter == _allScene.end())
115 {
116 _allScene.insert({ name, scene });
117 continue;
118 }
119 if (iter->second == scene)
120 {
121 log_warn("场景重复添加:{}", name);
122 continue;
123 }
124 iter->second = scene;
125 }
126 _vecSceneAdd.clear();
127 }
128
129 void _update()
130 {
131 for (auto& iter : _allScene)
132 iter.second->_update();
133 }
134 void _render()
135 {
136 for (auto& iter : _allScene)
137 iter.second->_render();
138 }
139
140 Scene* Get(const std::string& name)
141 {
142 if (_allScene.find(name) != _allScene.end())
143 return _allScene[name];
144 return nullptr;
145 }
146
148 {
149 for (auto& iter : _allScene)
150 {
151 delete iter.second;
152 }
153 }
154private:
155 std::unordered_map<std::string, Scene*> _allScene;
156 // 添加与移除均需在末尾处理
157 std::unordered_map<std::string, Scene*> _vecSceneAdd;
158 std::vector<std::string> _vecSceneDelete;
159
160};
161
162}
163
164namespace dl
165{
166 extern UI::SceneManager* g_scene;
167}
168
169#endif
void SetName(std::string_view name)
设置名字
friend class SceneManager
UI::Panel * CreatePanel(std::string_view name)
创建子 Panel
UI::Panel * GetPanelRoot()
返回根Panel
virtual void Render()
UI::Panel * _root
virtual ~Scene()
std::string GetName()
返回设定的名字(添加到场景管理器时设置)
void _update()
设置唯一可见 Panel
virtual void Update()
void Del(std::string_view name)
删除场景
void Del(Scene *scene)
Scene * Get(const std::string &name)
void Add(std::string_view name, Scene *scene)
添加场景
日志系统
#define log_warn(...)
#define log_err(...)
范围操作 任一满足条件
ui之panel
bool Equal(const C &container, const V &v)
判断容器任意元素等于某值
UI::SceneManager * g_scene