#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 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 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 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 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 _bars; float _progressAnim; };