dl
dl_ui_list_box.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#include "misc/dl_value.h"
19
20namespace dl::UI
21{
22
24 class ListBox
25 {
26 public:
33 static ListBox* Create(Panel* item, size_t num);
34
35 ListBox* Clone();
36
37 void Update();
38
39 void Render()
40 {
41 }
42
43 void SetItemCallback(std::function<void(Panel* item, Value v)> func)
44 {
45 _cbItem = func;
46 }
47
48 template<typename T>
49 void SetItemData(std::vector<T>& vec)
50 {
51 if(!_vecItemData.empty())
52 _reset_state();
53 _vecItemData.clear();
54 for (auto& iter : vec)
55 {
56 _vecItemData.push_back(iter);
57 }
58 _refresh_item();
59 }
60
61 bool IsPickup();
67 {
68 return _bSelectChange;
69 }
70
74 {
75 return _vecSelect.empty() ? -1 : _vecSelect.front();
76 }
77
81 {
82 size_t i = GetSelectIndex();
83 if (i >= _vecItemData.size())
84 return {};
85 return _vecItemData[i];
86 }
87
91 {
92 if (!g_input->KeyUp(MouseCode::LEFT) || !IsPickup())
93 return {};
94 size_t i = GetSelectIndex();
95 if (i >= _vecItemData.size())
96 return {};
97 return _vecItemData[i];
98 }
99
103 {
104 if (!g_input->ClickDouble() || !IsPickup())
105 return {};
106 size_t i = GetSelectIndex();
107 if (i >= _vecItemData.size())
108 return {};
109 return _vecItemData[i];
110 }
111
115 {
116 if (!g_input->ClickDouble() || !IsPickup())
117 return -1;
118 size_t i = GetSelectIndex();
119 if (i >= _vecItemData.size())
120 return -1;
121 return i;
122 }
123
125 void SetOrder(float order)
126 {
127 _panel->SetOrder(order);
128 _item->SetOrder(Math::OffsetOrder(order, 0, 0, -1));
129 for (Panel* panel : _allItem)
130 {
131 panel->SetOrder(Math::OffsetOrder(order, 0, 0, -1));
132 }
133 }
134
136 void SetItemLocator(const Locator& loc)
137 {
138 _locItem = loc;
139 _refresh_item_pos();
140 }
141
143 /*void SetSize(const Size& size)
144 {
145 _panel->SetSize(size);
146 _cptElemData._size = toPosition(size);
147 }*/
148
149 Coor* GetCoor() { return _panel->GetCoor(); }
150
151 Components* GetCpt() { return &_cpt; }
152
158 {
159 _scrollK = k;
160 }
161
166 void SetBlankShow(bool show)
167 {
168 _bBlankShow = show;
169 }
170
171 void SetElementDataAnchor(const Position& anchor);
172 void SetElementDataPos(const Position& offset);
173 void SetElementDataRunAble(bool able) { _cptElemData._bRunAble = able; }
174
175 [[deprecated]]
176 Panel* GetPanel() { return _panel; }
177
179 private:
180 ListBox() :
181 _cpt{ this },
182 _selectLimit{ 1 },
183 _scroll{ 0 },
184 _scrollK{ 1.0f },
185 _num{ 10 },
186 _bBlankShow{ true }
187 {
188 _init_cpt();
189 _coorItem = Coor::Create();
190 _cbItem = std::bind(&ListBox::_cb_default,
191 std::placeholders::_1, std::placeholders::_2);
192 }
193
194 Panel* _panel;
195 Coor* _coorItem;
196 Panel* _item; // 模板
197 Locator _locItem; // item布局
198 size_t _selectLimit;// 选中数量限制 0为不可选择
199 Float _scroll; // 滚轮位置(正值)
200 Float _scrollK; // 滚轮操作倍数
201 size_t _num; // 显示数量
202 bool _bBlankShow; // 空位置是否显示
203 bool _bSelectChange;// 选中此帧被修改
204 std::vector<Panel*> _allItem;
205 std::list<size_t> _vecSelect;// 选中
206 std::function<void(Panel* item, Value v)> _cbItem;
207 std::vector<Value> _vecItemData;
208
209 Components _cpt;
210 Cpt::DeleteThis _cptDeleteThis;
211 Cpt::SetOrder _cptSetOrder;
212 Cpt::Update _cptUpdate;
213 Cpt::Render _cptRender;
214 Cpt::GetCoor _cptGetCoor;
215 Cpt::ElementData _cptElemData;
216
217 void _delete_this() { delete this; }
218
219 void _init_cpt()
220 {
221 _cptDeleteThis = std::bind(&ListBox::_delete_this, this);
222 _cptSetOrder = std::bind(&ListBox::SetOrder, this, std::placeholders::_1);
223 _cptUpdate = std::bind(&ListBox::Update, this);
224 _cptRender = std::bind(&ListBox::Render, this);
225 _cptGetCoor = std::bind(&ListBox::GetCoor, this);
226
227 _cpt.PushBack(&_cptDeleteThis);
228 _cpt.PushBack(&_cptSetOrder);
229 _cpt.PushBack(&_cptUpdate);
230 _cpt.PushBack(&_cptRender);
231 _cpt.PushBack(&_cptGetCoor);
232
233 _cpt.PushBack(&_cptElemData);
234 }
235
236 void _init();
237
238
239 void _limit_select(std::size_t i_select);
240
241 // 计算滚轮位置
242 size_t _calc_scroll()
243 {
244 if (_vecItemData.size() <= _num)
245 {// 能完全绘制
246 return 0;
247 }
248 Float dy = _locItem.GetDy();
249 if (dy == 0)
250 return 0;
251 return (size_t)((_scroll + 1.0_f) / dy);
252 }
253 void _limit_scroll();
254 void _refresh_scroll()
255 {
256 //_coorItem->SetPosition({ 0, -_scroll });
257 }
258
259 void _refresh_size()
260 {
261 // 计算size
262 _panel->SetSize(toPosition(_item->GetSize()[0], std::abs(_locItem.GetDy() * _num)));
263 }
264
265 void _refresh_item_pos()
266 {
267 for (size_t i = 0; i < _num; ++i)
268 {
269 _allItem[i]->GetCoor()->SetPosition(_locItem.Get(i));
270 }
271 }
272 void _refresh_item();
273 void _refresh_select();
274
275 void _reset_state();
276
277 static void _cb_default(Panel* item, Value v);
278 };
279}
280
281#endif
void PushBack(AnyType any)
添加一个任意对象
2d坐标系
static Coor * Create(Coor *parent=nullptr)
元素通用属性(默认左上对齐,便于理解)
2d定位器
void SetElementDataAnchor(const Position &anchor)
Value GetSelectClickDouble()
返回双击选中的数据
ListBox * Clone()
bool IsSelectChange()
选中状态变更
void SetScrollK(Float k)
设置滚轮操作倍数
void SetElementDataPos(const Position &offset)
void SetElementDataRunAble(bool able)
void SetOrder(float order)
设置绘制顺序
size_t GetSelectIndex()
返回选中下标
size_t GetSelectIndexClickDouble()
返回双击选中下标
Value GetSelect()
返回选中的数据
void SetItemCallback(std::function< void(Panel *item, Value v)> func)
Coor * GetCoor()
设置大小
static ListBox * Create(Panel *item, size_t num)
创建列表框
void SetBlankShow(bool show)
设置没有的元素显示逻辑
void SetItemData(std::vector< T > &vec)
Value GetSelectClick()
返回单击选中的数据
void SetItemLocator(const Locator &loc)
设置子元素的定位器
任意类型
组件实例
作为绘图背景
ui之panel
任意类型
Function< std::function< void(float)>, str_uid("SetOrder")> SetOrder
设置order
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
逻辑
constexpr float OffsetOrder(float order, int u=1, int v=0, int w=0)
偏移order
Position2 Position
constexpr Array< Position::value_type, N > toPosition(const Array< T, N > &a)
转换到Position,已知长度
Input * g_input
float Float