Files
dl/project/dl_test/ui_gui.h
T
2026-09-16 14:07:40 +08:00

286 lines
8.2 KiB
C++

#pragma once
#include "head.h"
class UIGui : public UI::Scene
{
public:
UIGui() :
_bars{},
_progressAnim{ 0.0f }
{
_coor = Coor::Create();
// 单独使用
{
_lbxMain = g_ui->CreateListBoxDefault();
_lbxMain->SetItemCallback([](UI::Panel* item, Value v) {
UI::ButtonSprite* btn_spr = item->ExGetButtonSprite();
if (!v)
btn_spr->SetElementDataRunAble(false);
else
{
btn_spr->SetElementDataRunAble(true);
btn_spr->SetString(v.ToString());
}
});
_lbxMain->SetScrollK(1);
std::vector<std::string> vec_str;
vec_str.push_back("精灵按钮");
vec_str.push_back("文本按钮");
vec_str.push_back("缩放按钮");
vec_str.push_back("列表框");
vec_str.push_back("输入框");
vec_str.push_back("树");
vec_str.push_back("菜单");
vec_str.push_back("进度条");
_lbxMain->SetItemData(vec_str);
}
{
unsigned l = 60;
gcSprite spr0 = g_factory->CreateSprite("gamepad_a", 0);
spr0->SetQuad(createQuad(Size{ l, l }, true));
gcSprite spr1 = g_factory->CreateSprite("gamepad_a", 1);
spr1->SetQuad(createQuad(Size{ l, l }, true));
gcSprite spr2 = g_factory->CreateSprite("gamepad_a", 2);
spr2->SetQuad(createQuad(Size{ l, l }, true));
_btnSprite = UI::ButtonSprite::Create({
spr0, spr1, spr2 });
//_btnSprite->SetString("panda");
}
{
_btnText = UI::ButtonTextColor::Create(
g_factory->CreateText(0, 32), {}, {});
_btnText->SetString("button");
}
{
UI::Panel* panel = g_ui->CreatePanel();
panel->SetPickupMode(UI::Panel::PickupMode::E_ELEMENT);
panel->SetLocator(createLocatorZero());
gcSprite spr = g_factory->CreateSprite("panda");
UI::Sprite* ui_spr = UI::Sprite::Create(spr);
ui_spr->SetMode(UI::Sprite::AutoSize::NONE, UI::Sprite::FillMode::RATIO_MOVIE);
ui_spr->SetSize({ 200,200 });
ui_spr->SetElementData(Align::CC);
panel->Add(ui_spr);
UI::Text* ui_txt = g_ui->CreateTextDefault();
ui_txt->SetString("panda");
ui_txt->SetElementData(Align::CC);
panel->Add(ui_txt);
_btnScale = UI::ButtonScale::Create(panel);
}
{
_lbx = g_ui->CreateListBoxDefault();
_lbx->SetItemCallback([](UI::Panel* item, Value v) {
UI::ButtonSprite* btn_spr = item->ExGetButtonSprite();
if (!v)
btn_spr->SetElementDataRunAble(false);
else
{
btn_spr->SetElementDataRunAble(true);
btn_spr->SetString(v.ToString());
}
});
_lbx->SetScrollK(1);
static std::vector<std::string> vec_str;
for (std::size_t i = 0; i < 20; ++i)
{
vec_str.push_back(fmt::format("lbx________{}", i));
}
_lbx->SetItemData(vec_str);
}
{
_edt = g_ui->CreateEditBoxDefault(false);
_edt->GetText()->SetFontSize(8);
_edt->SetString("ASCII 由电报码发展而来。第一版标准发布于1963年 ,1967年经历了一次主要修订[5][6],最后一次更新则是在1986年,至今为止共定义了128个字符;其中33个字符无法显示(一些终端提供了扩展,使得这些字符可显示为诸如笑脸、扑克牌花式等8-bit符号),且这33个字符多数都已是陈废的控制字符。控制字符的用途主要是用来操控已经处理过的文字。在33个字符之外的是95个可显示的字符。用键盘敲下空白键所产生的空白字符也算1个可显示字符(显示为空白)。");
}
{
_tree = g_ui->CreateTreeDefault();
NTree<std::string> tree;
tree.Add("真兽亚纲", {});
tree.Add("灵长目", "真兽亚纲");
tree.Add("猴科", "灵长目");
tree.Add("人科", "灵长目");
tree.Add("大猩猩", "人科");
tree.Add("食肉目", "真兽亚纲");
tree.Add("犬科", "食肉目");
tree.Add("拉布拉多", "犬科");
tree.Add("猫科", "食肉目");
tree.Add("熊科", "食肉目");
tree.Add("偶蹄目", "真兽亚纲");
tree.Add("猪科", "偶蹄目");
tree.Add("鹿科", "偶蹄目");
tree.Add("牛科", "偶蹄目");
UI::Tree::CbSetContent<std::string> cb = [](UI::Panel* p, const std::string& str) {
p->ExGetButtonSprite()->SetString(str);
};
_tree->Refresh(tree, cb);
}
{
_menu = g_ui->CreateMenuDefault();
UI::MenuData data;
{
UI::MenuTop& top = data.AddTop();
top.SetString("文件");
}
{
UI::MenuTop& top = data.AddTop();
top.SetString("编辑");
}
{
UI::MenuTop& top = data.AddTop();
top.SetString("视图");
}
{
UI::MenuTop& top = data.AddTop();
top.SetString("关于");
}
_menu->Refresh(data);
}
{
// 4 个方向的进度条,文本通过 _fmt 显示方向(f 格式避免科学计数法)
auto make_bar = [](Align::Dir4 dir, const Position& size, std::string_view fmt)
{
UI::ProgressBar* bar = g_ui->CreateProgressBarDefault();
bar->SetSize(size);
bar->SetMidRect(createRectF(Position{1, 1}, size - Position{3, 3}));
bar->SetDir(dir);
bar->SetStringFormat(fmt);
return bar;
};
// 默认进度条(默认工厂创建,方向为 RIGHT)
_bars[0] = make_bar(Align::Dir4::RIGHT, { 200, 24 }, "右 {:.1f}%");
_bars[1] = make_bar(Align::Dir4::LEFT, { 150, 12 }, "左 {:.1f}%");
_bars[2] = make_bar(Align::Dir4::BOTTOM, { 24, 160 }, "下 {:.2f}%");
_bars[3] = make_bar(Align::Dir4::TOP, { 12, 120 }, "上 {:.0f}%");
}
_lbxMain->GetCoor()->SetParent(_coor);
_lbxMain->GetCoor()->SetPosition({ 0, 0 });
Position offset{ 200,0 };
_btnSprite->GetCoor()->SetParent(_coor);
_btnSprite->GetCoor()->SetPosition(offset);
_btnText->GetCoor()->SetParent(_coor);
_btnText->GetCoor()->SetPosition(offset);
_btnScale->GetCoor()->SetParent(_coor);
_btnScale->GetCoor()->SetPosition(offset);
_lbx->GetCoor()->SetParent(_coor);
_lbx->GetCoor()->SetPosition(offset);
_edt->GetCoor()->SetParent(_coor);
_edt->GetCoor()->SetPosition(offset);
_tree->GetCoor()->SetParent(_coor);
_tree->GetCoor()->SetPosition(offset);
_menu->GetCoor()->SetParent(_coor);
_menu->GetCoor()->SetPosition(offset);
_bars[0]->GetCoor()->SetParent(_coor);
_bars[0]->GetCoor()->SetPosition({ 200, 0 });
_bars[1]->GetCoor()->SetParent(_coor);
_bars[1]->GetCoor()->SetPosition({ 200, 40 });
_bars[2]->GetCoor()->SetParent(_coor);
_bars[2]->GetCoor()->SetPosition({ 200, 80 });
_bars[3]->GetCoor()->SetParent(_coor);
_bars[3]->GetCoor()->SetPosition({ 250, 80 });
}
virtual void Update() override
{
_coor->SetPosition(POS_CONTENT * g_ui->GetScale());
_coor->SetScale(g_ui->GetScale());
// 进度循环播放(始终推进,4 个方向错开相位)
_progressAnim += (float)g_time->GetDelta() * 0.1f;
if (_progressAnim >= 1.0f)
_progressAnim -= 1.0f;
for (std::size_t i = 0; i < _bars.size(); ++i)
{
float p = _progressAnim + (float)i * 0.05f;
if (p >= 1.0f)
p -= 1.0f;
_bars[i]->SetProgress(p);
}
_lbxMain->Update();
std::string str = _lbxMain->GetSelect().GetString(false);
if (str == "精灵按钮")
_btnSprite->Update();
else if (str == "文本按钮")
_btnText->Update();
else if (str == "缩放按钮")
_btnScale->Update();
else if (str == "列表框")
_lbx->Update();
else if (str == "输入框")
_edt->Update();
else if (str == "树")
_tree->Update();
else if (str == "菜单")
_menu->Update();
else if (str == "进度条")
for (auto* bar : _bars)
bar->Update();
}
virtual void Render() override
{
_lbxMain->Render();
std::string str = _lbxMain->GetSelect().GetString(false);
if (str == "精灵按钮")
_btnSprite->Render();
else if (str == "文本按钮")
_btnText->Render();
else if (str == "缩放按钮")
_btnScale->Render();
else if (str == "列表框")
_lbx->Render();
else if (str == "输入框")
_edt->Render();
else if (str == "树")
_tree->Render();
else if (str == "菜单")
_menu->Render();
else if (str == "进度条")
for (auto* bar : _bars)
bar->Render();
}
~UIGui()
{
for (auto* bar : _bars)
delete bar;
delete _menu;
delete _btnSprite;
delete _btnText;
delete _btnScale;
delete _tree;
delete _edt;
delete _lbx;
delete _lbxMain;
delete _coor;
}
private:
//! 不使用panel,单独使用
Coor* _coor;
UI::ListBox* _lbxMain;
UI::ButtonSprite* _btnSprite;
UI::ButtonTextColor* _btnText;
UI::ButtonScale* _btnScale;
UI::ListBox* _lbx;
UI::EditBox* _edt;
UI::Tree* _tree;
UI::Menu* _menu;
std::array<UI::ProgressBar*, 4> _bars;
float _progressAnim;
};