dl
dl_locator.h
浏览该文件的文档.
1
12#pragma once
13
14#include "io/dl_log.h"
15#include "math/dl_math.h"
16#include "misc/dl_layout.h"
17
18namespace dl
19{
22{
23public:
25 enum class Mode
26 {
27 DIRECT, // 直接定位,按i计算偏移
28 ADAPT, // 自适应,一个元素可能占多个位置
29 };
30
31 struct SL
32 {
36 size_t _num;
38 SL() :
39 _start{},
40 _dt{ 0, 0 },
42 _num{ 0 },
43 _mode{ Mode::DIRECT }
44 {}
45
46 bool Check()
47 {
48 // 由于需要计算大小,必须dt合法
49 return (_layout == Layout::X && _dt[0])
50 || (_layout == Layout::Y && _dt[1])
51 || (_layout == Layout::XY && _dt[0] && _dt[1])
52 || (_layout == Layout::ORIGIN && _dt[0] == 0 && _dt[1] == 0);
53 }
54 };
55
58 Locator(const SL& sl = SL()) :
59 _sl{sl},
60 _x{0},
61 _y{0}
62 {
63 if (!_sl.Check())
64 {
65 log_err0("定位器无效!");
66 _sl = SL();
67 }
68 }
69
73 Position Get(const Size& size);
78 Position Get(std::size_t i);
79
80 bool ExGet(size_t i, const Size& size, Position& pos);
81
83 {
84 size_t x = _x;
85 size_t y = _y;
86 switch (_sl._layout)
87 {
88 case Layout::X:
89 ++y;
90 break;
91 case Layout::Y:
92 ++x;
93 break;
94 case Layout::XY:
95 break;
96 case Layout::ORIGIN:
97 ++x;
98 ++y;
99 break;
100 default:
101 assert(0);
102 }
103 return toPosition(x, y) * _sl._dt;
104 }
105
106 Mode GetMode() { return _sl._mode; }
107 Layout GetLayout() { return _sl._layout; }
108
109 Float GetDx() const
110 {
111 return _sl._dt[0];
112 }
113 Float GetDy() const
114 {
115 return _sl._dt[1];
116 }
117 void SetX(size_t x)
118 {
119 _x = x;
120 }
121 void SetY(size_t y)
122 {
123 _y = y;
124 }
125 void Reset()
126 {
127 _x = 0;
128 _y = 0;
129 }
130private:
131 SL _sl;
132 size_t _x; // 最后Get后,下一个的x
133 size_t _y; // 最最后Get后,下一个的y
134
135 Position _get_direct(std::size_t i);
136 Position _get_adapt(const Size& size);
137};
138
144{
145 Locator::SL sl;
146 sl._dt = {};
148 sl._num = 0;
150 return sl;
151}
152
159inline Locator createLocatorX(float dx, std::size_t num = 0, float dy = 32.0f,
161{
162 Locator::SL sl;
163 sl._dt = { dx, dy };
164 sl._layout = Layout::X;
165 sl._num = num;
166 sl._mode = mode;
167 return sl;
168}
169
175inline Locator createLocatorY(float dy, std::size_t num = 0, float dx = 32.0f,
177{
178 Locator::SL sl;
179 sl._dt = { dx, dy };
180 sl._layout = Layout::Y;
181 sl._num = num;
182 sl._mode = mode;
183 return sl;
184}
185
186}
2d定位器
void SetY(size_t y)
Float GetDx() const
void SetX(size_t x)
bool ExGet(size_t i, const Size &size, Position &pos)
Locator(const SL &sl=SL())
初始化
Position GetSize()
Position Get(const Size &size)
添加一个元素,并返回位置
Float GetDy() const
Position Get(std::size_t i)
添加一个元素,并返回位置
布局定义
日志系统
数学相关的通用算法
Position2 Position
constexpr Array< Position::value_type, N > toPosition(const Array< T, N > &a)
转换到Position,已知长度
float Float
void log_err0(std::string_view str, DL_SOURCE_LOCATION)
Locator createLocatorY(float dy, std::size_t num=0, float dx=32.0f, Locator::Mode mode=Locator::Mode::DIRECT)
创建定位器,竖向布局
@ X
x轴移动
@ Y
y轴移动
@ ORIGIN
不变位置(主要为了简化计算)
@ XY
xy同时移动
Locator createLocatorZero()
创建空定位器
PointU Size
Locator createLocatorX(float dx, std::size_t num=0, float dy=32.0f, Locator::Mode mode=Locator::Mode::DIRECT)
创建定位器,横向布局
Position _dt
每项偏移
Position _start
初始位置
size_t _num
换行,0为不换行
Layout _layout
布局方向