dl
dl_ui_menu.h
浏览该文件的文档.
1
12#pragma once
13
14#ifndef DL_DISABLE_RENDER
16#include "ui/dl_ui_background.h"
17#include "ui/dl_ui_panel.h"
18
19namespace dl::UI
20{
28
30{
31 friend class Menu;
32 friend class MenuTop;
33public:
34 void SetString(std::string_view str)
35 {
36 _str = str;
37 }
38 MenuNode& Add(std::string_view str = {})
39 {
40 MenuNode ret;
41 ret._str = str;
42 _allNode.push_back(ret);
43 return _allNode.back();
44 }
46 _type{ MenuNodeType::NORMAL }
47 {
48 }
49private:
50 MenuNodeType _type;
51 std::vector<MenuNode> _allNode;
52 std::string _spr0; // 图片(普通)
53 std::string _spr1; // 图片(选择)
54 std::string _str; // 文本描述
55 KeyCode _alt; // alt控制键
56 KeyCode _hotkey0; // 快捷键0
57 KeyCode _hotkey1; // 快捷键1(组合)
58};
59
62{
63 friend class Menu;
64 friend class MenuData;
65public:
66 void SetString(std::string_view str)
67 {
68 _str = std::string{ str };
69 }
70 std::string GetString() const { return _str; }
71 MenuNode& Add(std::string_view str = {})
72 {
73 MenuNode ret;
74 ret._str = str;
75 _allNode.push_back(ret);
76 return _allNode.back();
77 }
78 MenuNode& AddGroup(std::string_view str = {})
79 {
80 MenuNode ret;
81 ret._type = MenuNodeType::GROUP;
82 ret._str = str;
83 _allNode.push_back(ret);
84 return _allNode.back();
85 }
86private:
87 std::string _str;
88 std::vector<MenuNode> _allNode;
89};
90
93{
94 friend class Menu;
95public:
96 MenuTop& AddTop(std::string_view str = {})
97 {
98 MenuTop ret;
99 ret._str = str;
100 _allTop.push_back(ret);
101 return _allTop.back();
102 }
103private:
104 std::vector<MenuTop> _allTop;
105};
106
108{
109 // 图标(开关) 文本(Alt控制键) 快捷键
113};
114
115class Menu
116{
117public:
118
123 static Menu* Create(
124 Background* bg_menu, Panel* panel_menu, const Locator& loc_menu,
125 Background* bg_combox, Panel* panel_btn, const Locator& loc_btn)
126 {
127 Menu* ret = new Menu;
128 ret->_bgMenu = bg_menu;
129 ret->_panelMenu = panel_menu;
130 ret->_locMenu = loc_menu;
131 ret->_bgCombox = bg_combox;
132 ret->_panelBtn = panel_btn;
133 ret->_locButton = loc_btn;
134 ret->_init();
135 return ret;
136 }
137
138
139 void Update();
140
141 void Render();
146 void Refresh(const MenuData& data);
147
148 void Clear();
149
150 bool IsPickup()
151 {
152 return _panel->IsPickup();
153 }
154
158 std::size_t IsSelectChange()
159 {
160 /*if (_bSelectChange)
161 return _curSelect;*/
162 return -1;
163 }
164
168 std::size_t GetSelectIndex()
169 {
170 return 0;
171 }
172
176 {
177 return nullptr;
178 }
179
180 std::string GetClick();
182 void SetOrder(float order);
183
184
186 void SetSize(const Position& size)
187 {
188 _panel->SetSize(size);
189 _cptElemData._size = size;
190 }
191
197 void SetMenuButtonOffset(const Position& offset);
199 void SetListOffset(const Position& offset);
201 void SetListBgOffset(const Position& offset, const Position& extra_size);
202
203 Coor* GetCoor() { return _panel->GetCoor(); }
204
206
207 Components* GetCpt() { return &_cpt; }
208
209
211private:
212 Menu() :
213 _cpt{ this },
214 _offsetBg{},
215 _sizeBg{},
216 _offsetMenu{},
217 _offsetList{},
218 _offsetListBg{},
219 _sizeListBg{}
220 {
221 _init_cpt();
222 }
223
224 Panel* _panel;
225 Background* _bgMenu; // 菜单背景
226 Background* _bgCombox;// 下拉框背景
227 Panel* _panelMenu;// 菜单按钮模板
228 Panel* _panelBtn;// 子项按钮模板
229 Locator _locMenu;
230 Locator _locButton;
231
232 Position _offsetBg;
233 Position _sizeBg;
234 Position _offsetMenu;
235 Position _offsetList;
236 Position _offsetListBg;
237 Position _sizeListBg;
238
239 struct Temp
240 {
241 bool _bRenderCombox;
242 std::vector<Panel*> _allButton;
243 std::string _click;
244 }_tp;
245
246 Components _cpt;
247 Cpt::DeleteThis _cptDeleteThis;
248 Cpt::SetOrder _cptSetOrder;
249 Cpt::Update _cptUpdate;
250 Cpt::Render _cptRender;
251 Cpt::GetCoor _cptGetCoor;
252 Cpt::RenderDebug _cptRenderDebug;
253 Cpt::ElementData _cptElemData;
254
255 void _delete_this() { delete this; }
256
257 void _init_cpt()
258 {
259 _cptDeleteThis = std::bind(&Menu::_delete_this, this);
260 _cptSetOrder = std::bind(&Menu::SetOrder, this, std::placeholders::_1);
261 _cptUpdate = std::bind(&Menu::Update, this);
262 _cptRender = std::bind(&Menu::Render, this);
263 _cptGetCoor = std::bind(&Menu::GetCoor, this);
264 _cptRenderDebug = std::bind(&Menu::RenderDebug, this);
265
266 _cpt.PushBack(&_cptDeleteThis);
267 _cpt.PushBack(&_cptSetOrder);
268 _cpt.PushBack(&_cptUpdate);
269 _cpt.PushBack(&_cptRender);
270 _cpt.PushBack(&_cptGetCoor);
271 _cpt.PushBack(&_cptRenderDebug);
272
273 _cpt.PushBack(&_cptElemData);
274 }
275
276 void _init();
277 void _refresh_pos();
278
279 void _make_child_list(const std::vector<MenuNode>& vec,
280 UI::Panel* parent, const std::string& name_perfix);
281};
282}
283
284#endif
void PushBack(AnyType any)
添加一个任意对象
2d坐标系
元素通用属性(默认左上对齐,便于理解)
2d定位器
MenuTop & AddTop(std::string_view str={})
void SetMenuBackgroundOffset(const Position &offset)
设置menu背景偏移
Panel * GetSelect()
返回选中元素
std::size_t IsSelectChange()
选中状态变更
void SetSize(const Position &size)
设置大小
void SetMenuButtonOffset(const Position &offset)
设置menu按钮偏移
void Refresh(const MenuData &data)
构建ui
void SetMenuBackgroundSize(const Position &size)
设置menu背景大小
std::string GetClick()
Components * GetCpt()
std::size_t GetSelectIndex()
返回选中下标
void SetListBgOffset(const Position &offset, const Position &extra_size)
设置list背景偏移
void SetListOffset(const Position &offset)
设置list下拉框偏移
void SetOrder(float order)
设置绘制顺序
void RenderDebug()
static Menu * Create(Background *bg_menu, Panel *panel_menu, const Locator &loc_menu, Background *bg_combox, Panel *panel_btn, const Locator &loc_btn)
创建菜单
菜单单个节点
void SetString(std::string_view str)
MenuNode & Add(std::string_view str={})
friend class MenuTop
MenuNode & AddGroup(std::string_view str={})
friend class MenuData
void SetString(std::string_view str)
MenuNode & Add(std::string_view str={})
friend class Menu
std::string GetString() const
组件实例
作为绘图背景
ui之panel
Function< std::function< void(float)>, str_uid("SetOrder")> SetOrder
设置order
Function< std::function< void()>, str_uid("RenderD")> RenderDebug
调试绘图
Function< std::function< dl::Coor *()>, str_uid("GetCoor")> GetCoor
返回坐标系
Function< std::function< void()>, str_uid("Render")> Render
绘制
Function< std::function< void()>, str_uid("DeleteThis")> DeleteThis
删除自身
Function< std::function< void()>, str_uid("Update")> Update
逻辑
Position2 Position
GC< Sprite > gcSprite
GC< Text > gcText
菜单单个节点UI