286 lines
8.2 KiB
C++
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;
|
|
}; |