Files
dl_old/dl/ui/dl_ui_sprite.cpp
2026-09-07 14:55:46 +08:00

109 lines
2.4 KiB
C++

#include "dl_ui_sprite.h"
#ifndef DL_DISABLE_RENDER
#include "system/dl_system.h"
#include "render/dl_factory.h"
#include "ui/dl_ui_panel.h"
#include "ui/dl_ui_manager.h"
namespace dl::UI
{
void Sprite::SetMode(AutoSize auto_size, FillMode mode)
{
_autoSize = auto_size;
_fillMode = mode;
Position size;
switch (auto_size)
{
case AutoSize::NONE:
size = toPosition(Every::Zero(_sizeSet) ? g_factory->GetSpriteTexSize(_spr) : _sizeSet);
break;
case AutoSize::PANEL:
size = _panel ?
toPosition(_panel->GetSize()) :
toPosition(g_system->GetWindowSize()) / g_ui->GetScale();
break;
case AutoSize::WINDOW:
size = toPosition(g_system->GetWindowSize()) / g_ui->GetScale();
break;
default:
assert(0);
break;
}
switch (_fillMode)
{
case FillMode::STATIC:
_spr->SetQuad(createQuad(toPosition(g_factory->GetSpriteTexSize(_spr)), false));
break;
case FillMode::STRETCH:
_spr->SetQuad(createQuad(size, false));
break;
case FillMode::RATIO_MOVIE:
{
Position tex_size = toPosition(g_factory->GetSpriteTexSize(_spr));
Position k = size / tex_size;
// 以较小者放大
float s = Select::Min(k);
_spr->SetQuad(createQuad(tex_size * s, false));
}
break;
case FillMode::RATIO_OUT:
{
Position tex_size = toPosition(g_factory->GetSpriteTexSize(_spr));
Position k = size / tex_size;
// 以较大者放大
float s = Select::Max(k);
_spr->SetQuad(createQuad(tex_size * s, false));
}
break;
default:
assert(0);
break;
}
_cptElemData._hv = Align::LT;
_cptElemData._size = _spr->GetSize();
}
void Sprite::SetElementData(const Align::Direction2& hv, const Position& pos)
{
_cptElemData._size = GetSize();
_cptElemData._anchor = {};
_cptElemData._hv = hv;
_cptElemData._pos = pos;
// 在组内则更新位置
if (_panel)
_panel->OnChangeElementData(&_cpt);
}
void Sprite::SetEDOrderOffset(int order_offset)
{
_cptElemData._orderOffset = order_offset;
}
void Sprite::SetSprite(gcSprite spr)
{
// 复用创建时的逻辑:为新精灵创建独立Coor并设置UI标记
if (!spr->IsOwnCoor())
{
Coor* coor = Coor::Create(spr->GetCoor());
spr->SetCoor(coor, true);
}
// 沿用原有绘制层级
spr->SetOrder(_spr->GetOrder());
_spr = spr;
_spr->SetUI(true);
SetMode(_autoSize, _fillMode);
// 已加入面板时,重新定位新精灵的Coor(原Coor随旧精灵被替换,AddCpt不会再次处理)
if (_panel)
_panel->OnChangeElementData(&_cpt);
}
}
#endif