-
Notifications
You must be signed in to change notification settings - Fork 71
Expand file tree
/
Copy pathVirtualHTileLayout.h
More file actions
102 lines (86 loc) · 4.33 KB
/
VirtualHTileLayout.h
File metadata and controls
102 lines (86 loc) · 4.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#ifndef UI_LAYOUT_VIRTUAL_HTILELAYOUT_H_
#define UI_LAYOUT_VIRTUAL_HTILELAYOUT_H_
#include "duilib/Layout/HTileLayout.h"
#include "duilib/Layout/VirtualLayout.h"
namespace ui
{
/** 虚表实现的瓦片布局(横向布局)
* 水平方向对齐方式:靠左对齐,按控件依次排列
* 垂直方向对齐方式:默认居中对齐
* 在瓦片布局中,子控件本身指定的对齐方式不生效
*/
class VirtualListBox;
class UILIB_API VirtualHTileLayout : public HTileLayout, public VirtualLayout
{
typedef HTileLayout BaseClass;
public:
VirtualHTileLayout();
/** 布局类型
*/
virtual LayoutType GetLayoutType() const override { return LayoutType::VirtualHTileLayout; }
/** 按布局策略调整内部所有子控件的位置和大小
* @param [in] items 子控件列表
* @param [in] rc 当前容器位置与大小信息, 包含内边距,但不包含外边距
* @param [in] bEstimateOnly true表示仅评估不调整控件的位置,false表示调整控件的位置
* @return 返回排列后最终布局的宽度和高度信息,包含Box容器的内边距,但不包含Box容器本身的外边距(当容器支持滚动条时使用该返回值)
*/
virtual UiSize64 ArrangeChildren(const std::vector<Control*>& items, UiRect rc, bool bEstimateOnly = false) override;
/** 根据内部子控件大小估算容器布局大小(用于评估宽度或者高度为"auto"类型的控件大小,拉伸类型的子控件不计入大小估算)
* @param [in] items 子控件列表
* @param [in] szAvailable 容器的可用宽度和高度,包含分配给该容器的内边距,但不包含分配给容器的外边距
* @return 返回排列后最终布局的大小信息(宽度和高度),包含Box容器本身的内边距,但不包含Box容器本身的外边距;
*/
virtual UiSize64 EstimateLayoutSize(const std::vector<Control*>& items, UiSize szAvailable) override;
public:
/** 延迟加载展示数据
* @param [in] rc 当前容器大小信息, 外部调用时,需要先剪去内边距
*/
virtual void LazyArrangeChild(UiRect rc) const override;
/** 获取需要展示的真实数据项最大个数(即有Control对象对应的真实数据项)
* @param [in] rc 当前容器大小信息, 外部调用时,需要先剪去内边距
*/
virtual size_t AjustMaxItem(UiRect rc) const override;
/** 得到可见范围内第一个元素的前一个元素索引
* @param [in] rc 当前显示区域的矩形,不包含内边距
* @return 返回元素的索引
*/
virtual size_t GetTopElementIndex(UiRect rc) const override;
/** 判断某个元素是否在可见范围内
* @param[in] iIndex 元素索引
* @param [in] rc 当前显示区域的矩形,不包含内边距
* @return 返回 true 表示可见,否则为不可见
*/
virtual bool IsElementDisplay(UiRect rc, size_t iIndex) const override;
/** 判断是否要重新布局
*/
virtual bool NeedReArrange() const override;
/** 获取当前所有可见控件的数据元素索引
* @param [in] rc 当前显示区域的矩形,不包含内边距
* @param[out] collection 索引列表,范围是:[0, GetElementCount())
*/
virtual void GetDisplayElements(UiRect rc, std::vector<size_t>& collection) const override;
/** 让控件在可见范围内
* @param [in] rc 当前显示区域的矩形,不包含内边距
* @param[in] iIndex 元素索引号,范围是:[0, GetElementCount())
* @param[in] bToTop 是否在最上方
*/
virtual void EnsureVisible(UiRect rc, size_t iIndex, bool bToTop) const override;
private:
/** 获取数据项的宽度
* @param [in] nCount 数据项个数,如果为Box::InvalidIndex,则获取所有数据项的高度总和
* @param [in] rc 当前容器大小信息, 外部调用时,需要先剪去内边距
* @return 返回 nCount 个数据项的宽度总和
*/
int64_t GetElementsWidth(const UiRect& rc, size_t nCount) const;
/** 计算行数
*@param [in] rcHeight 可用区域高度
*@return 计算得到的行数, 大于或等于1
*/
int32_t CalcTileRows(int32_t rcHeight) const;
private:
/** 获取关联的Box接口
*/
VirtualListBox* GetOwnerBox() const;
};
} // namespace ui
#endif // UI_LAYOUT_VIRTUAL_HTILELAYOUT_H_