dl
dl_ui_progress_bar.h
浏览该文件的文档.
1
17#pragma once
18
19#ifndef DL_DISABLE_RENDER
20
21#include "base/dl_string.h"
23#include "base/dl_type_def.h"
24#include "math/dl_coor.h"
25#include "math/dl_math.h"
26#include "math/dl_algorithm.h"
27#include "ui/dl_ui_background.h"
28#include "ui/dl_ui_text.h"
29#include "ui/dl_ui_panel.h"
30
31namespace dl::UI
32{
34class ProgressBar
35{
36public:
44 static ProgressBar* Create(
46 UI::Background* mid,
47 UI::Text* txt = nullptr);
51 ProgressBar* Clone();
52
53 void Update()
54 {
55 _panel->Update();
56 }
57 void Render()
58 {
59 }
60
61 bool IsPickup()
62 {
63 return _bg->IsPickup();
64 }
65
66 void SetSize(const Position& size)
67 {
68 _bg->SetSize(size);
69 _refresh_mid();
70 _refresh_text_pos();
71 }
72
73 void SetOrder(float order)
74 {
75 _order = order;
76 // 同一组内,越靠近屏幕(负数)越上层:bg < mid < txt
77 if (_bg) _bg->SetOrder(Math::OffsetOrder(order, 0, 0, 0));
78 if (_mid) _mid->SetOrder(Math::OffsetOrder(order, 0, 0, -1));
79 if (_txt) _txt->SetOrder(Math::OffsetOrder(order, 0, 0, -2));
80 }
81
82 Coor* GetCoor() { return _panel->GetCoor(); }
84 Panel* GetPanel() { return _panel; }
85
86 void SetElementData(const Align::Direction2& hv, const Position& pos = {})
87 {
88 _cptElemData._size = _bg->GetSize();
89 _cptElemData._anchor = {};
90 _cptElemData._hv = hv;
91 _cptElemData._pos = pos;
92
93 // 在组内则更新位置
94 if (_parent)
95 _parent->OnChangeElementData(&_cpt);
96 }
97
99 void SetProgress(float progress)
100 {
101 _progress = dl::clamp(progress, 0.0f, 1.0f);
102 _refresh_mid();
103 _refresh_text();
104 }
105
107 void SetProgressK(float progress_k)
108 {
109 _progressK = progress_k;
110 _refresh_text();
111 }
112
114 float GetProgress() const { return _progress; }
115
117 void SetStringFormat(std::string_view fmt)
118 {
119 _fmt = fmt;
120 _refresh_text();
121 }
122
126 Align::Dir4 GetDir() const { return _dir; }
127
129 void SetMidRect(RectF mid_rect)
130 {
131 _rectMid = mid_rect;
132 _refresh_mid();
133 }
134
135 RectF GetMidRect() const { return _rectMid; }
136
138 UI::Background* GetBackground() { return _bg; }
140 UI::Background* GetMid() { return _mid; }
142 UI::Text* GetText() { return _txt; }
143
144 Components* GetCpt() { return &_cpt; }
145
147private:
148 ProgressBar() :
149 _parent{ nullptr },
150 _panel{ nullptr },
151 _bg{ nullptr },
152 _mid{ nullptr },
153 _txt{ nullptr },
154 _progress{ 0.0f },
155 _progressK{ 100.0f },
156 _order{ Z_DEFAULT_UI },
157 _dir{ Align::Dir4::RIGHT },
158 _rectMid{},
159 _sizeMidOrigin{},
160 _fmt{ "{:.0f}%" },
161 _cpt{ this }
162 {
163 }
164
165 Panel* _parent; // 父panel(由Panel反填,用于OnChangeElementData刷新位置)
166 Panel* _panel; // 自身panel(子元素挂载于此)
167 UI::Background* _bg;
168 UI::Background* _mid;
169 UI::Text* _txt;
170 float _progress; // 当前进度 [0,1]
171 float _progressK; // 显示系数
172 float _order;
173 Align::Dir4 _dir; // 显示方向
174 RectF _rectMid; // mid所在区域(空则以mid原图大小)
175 Position _sizeMidOrigin; // mid原图大小
176 std::string _fmt; // 进度文本格式
177
178 Components _cpt;
179 Cpt::DeleteThis _cptDeleteThis;
180 Cpt::SetOrder _cptSetOrder;
181 Cpt::IsPickup _cptIsPickup;
182 Cpt::Render _cptRender;
183 Cpt::GetCoor _cptGetCoor;
184 Cpt::ElementData _cptElemData;
185 Cpt::Clone _cptClone;
186
187 void _delete_this() { delete this; }
188
189 Components* _clone()
190 {
191 return Clone()->GetCpt();
192 }
193
195 void _init_panel();
196
197 void _refresh_mid();
198 void _refresh_text();
199 void _refresh_text_pos();
200
201 void _init_cpt()
202 {
203 _cptDeleteThis = std::bind(&ProgressBar::_delete_this, this);
204 _cptSetOrder = std::bind(&ProgressBar::SetOrder, this, std::placeholders::_1);
205 _cptIsPickup = std::bind(&ProgressBar::IsPickup, this);
206 _cptRender = std::bind(&ProgressBar::Render, this);
207 _cptGetCoor = std::bind(&ProgressBar::GetCoor, this);
208 _cptClone = std::bind(&ProgressBar::_clone, this);
209
210 _cpt.PushBack(&_cptDeleteThis);
211 _cpt.PushBack(&_cptSetOrder);
212 _cpt.PushBack(&_cptIsPickup);
213 _cpt.PushBack(&_cptRender);
214 _cpt.PushBack(&_cptGetCoor);
215 _cpt.PushBack(&_cptClone);
216 _cpt.PushBack(&_parent);
217 _cpt.PushBack(&_cptElemData);
218 }
219};
220}
221
222#endif
void PushBack(AnyType any)
添加一个任意对象
2d坐标系
元素通用属性(默认左上对齐,便于理解)
Position GetSize()
返回设置的大小(不包含额外大小)
void OnChangeElementData(Components *cpt)
void SetStringFormat(std::string_view fmt)
设置进度文本格式({} 表示百分比整数),传空串则不自动更新文本
UI::Text * GetText()
返回进度文本(可为空)
static ProgressBar * Create(UI::Background *bg, UI::Background *mid, UI::Text *txt=nullptr)
创建一个进度条
void SetProgressK(float progress_k)
设置显示倍数
void SetSize(const Position &size)
设置背景大小
void SetProgress(float progress)
设置进度 [0, 1]
void SetElementData(const Align::Direction2 &hv, const Position &pos={})
Align::Dir4 GetDir() const
返回显示方向
void SetMidRect(RectF mid_rect)
设置进度绘制范围
UI::Background * GetMid()
返回进度填充图(可为空)
ProgressBar * Clone()
复制一个,注意有些组件属性需要复制
float GetProgress() const
返回当前进度 [0, 1]
RectF GetMidRect() const
返回进度绘制范围
Panel * GetPanel()
返回自身panel,可继续挂载其它ui
void SetDir(Align::Dir4 dir)
设置显示方向(进度从哪个方向开始填充)
UI::Background * GetBackground()
返回背景(可为空)
void SetOrder(float order)
设置绘制顺序
组件实例
2d坐标系
数学相关的通用算法
字符串相关
通用类型定义
作为绘图背景
ui之panel
UI之文本
方向、对齐定义
Array< Direction, 2 > Direction2
Function< std::function< void(float)>, str_uid("SetOrder")> SetOrder
设置order
Function< std::function< dl::Coor *()>, str_uid("GetCoor")> GetCoor
返回坐标系
Function< std::function< bool()>, str_uid("IsPickup")> IsPickup
---------------------------—具体组件----------------------------------—
Function< std::function< void()>, str_uid("Render")> Render
绘制
Function< std::function< void()>, str_uid("DeleteThis")> DeleteThis
删除自身
Function< std::function< Components *()>, str_uid("Clone")> Clone
克隆
constexpr float OffsetOrder(float order, int u=1, int v=0, int w=0)
偏移order
Position2 Position
constexpr float Z_DEFAULT_UI
Position4 RectF
constexpr T clamp(const T &x, const T &a, const T &b)
限制数值到 [a, b]