soui 5.0.0.1
Soui5 Doc
 
Loading...
Searching...
No Matches
STileViewItemLocator.cpp
1#include "souistd.h"
2#include "helper/STileViewItemLocator.h"
3
4SNSBEGIN
5//////////////////////////////////////////////////////////////////////////
6// STileViewItemLocatorFix
7STileViewItemLocator::STileViewItemLocator(SWindow *owner, int nItemHei, int nItemWid, int nMarginSize /*= 0*/)
8 : m_nItemHeight((float)nItemHei, SLayoutSize::px)
9 , m_nItemWidth((float)nItemWid, SLayoutSize::px)
10 , m_nItemMargin((float)nMarginSize, SLayoutSize::px)
11 , m_nTileViewWidth(0.f, SLayoutSize::px)
12 , m_nCountInRow(1)
13 , m_pOwner(owner)
14{
15}
16
17STileViewItemLocator::STileViewItemLocator(SWindow *owner, LPCWSTR szItemHei, LPCWSTR szItemWid, SLayoutSize marginSize)
18 : m_nItemHeight(GETLAYOUTSIZE(szItemHei))
19 , m_nItemWidth(GETLAYOUTSIZE(szItemWid))
20 , m_nItemMargin(marginSize)
21 , m_nTileViewWidth(0, SLayoutSize::px)
22 , m_nCountInRow(1)
23 , m_scale(100)
24 , m_pOwner(owner)
25{
26}
27
32
34{
35 return m_nItemMargin.toPixelSize(m_scale);
36}
37
39{
40 return m_nCountInRow;
41}
42
44{
45 return m_nItemHeight.toPixelSize(m_scale) + m_nItemMargin.toPixelSize(m_scale);
46}
47
49{
50 return m_nItemWidth.toPixelSize(m_scale) + m_nItemMargin.toPixelSize(m_scale);
51}
52
54{
55 m_scale = scale;
56 return 0;
57}
58
60{
61 if (!m_adapter)
62 {
63 return -1;
64 }
65 int nRet = position / GetItemLineHeight() * m_nCountInRow;
66
67 if (nRet < 0)
68 {
69 nRet = 0;
70 }
71 if (nRet > m_adapter->getCount())
72 {
73 nRet = m_adapter->getCount();
74 }
75 return nRet;
76}
77
79{
80 return (iItem / m_nCountInRow) * GetItemLineHeight();
81}
82
84{
85 if (!m_adapter || m_adapter->getCount() == 0)
86 {
87 return 0;
88 }
89 int row_count = (m_adapter->getCount() - 1) / m_nCountInRow + 1;
90 return GetItemLineHeight() * row_count + m_nItemMargin.toPixelSize(m_scale);
91}
92
93void STileViewItemLocator::SetItemHeight(int iItem, int nHeight)
94{
95}
96
98{
99 return m_nItemHeight.toPixelSize(m_scale);
100}
101
102void STileViewItemLocator::SetAdapter(ILvAdapter *pAdapter)
103{
104 m_adapter = pAdapter;
105}
106
108{
109 //返回相对于TileView内部的Rect
110 int nRowIdx, nColIdx;
111 GetItemRowAndColIndex(iItem, &nRowIdx, &nColIdx);
112
113 int margin = m_nItemMargin.toPixelSize(m_scale);
114 CRect rect;
115 rect.left = margin + nColIdx * (m_nItemWidth.toPixelSize(m_scale) + margin);
116 rect.top = margin + nRowIdx * (m_nItemHeight.toPixelSize(m_scale) + margin);
117 rect.right = rect.left + m_nItemWidth.toPixelSize(m_scale);
118 rect.bottom = rect.top + m_nItemHeight.toPixelSize(m_scale);
119
120 if ((m_pOwner->GetStyle().GetAlign() & SwndStyle::Align_MaskX) != SwndStyle::Align_Left)
121 {
122 CRect rcClient = m_pOwner->GetClientRect();
123 int totalWid = m_nItemWidth.toPixelSize(m_scale) * m_nCountInRow + (margin + 1) * m_nCountInRow;
124 switch (m_pOwner->GetStyle().GetAlign() & SwndStyle::Align_MaskX)
125 {
126 case SwndStyle::Align_Center:
127 rect.OffsetRect((rcClient.Width() - totalWid) / 2, 0);
128 break;
129 case SwndStyle::Align_Right:
130 rect.OffsetRect((rcClient.Width() - totalWid), 0);
131 break;
132 }
133 }
134
135 return rect;
136}
137
138void STileViewItemLocator::SetTileViewWidth(int width, BOOL bDpiAware)
139{
140 m_nTileViewWidth.setSize((float)width, bDpiAware ? SLayoutSize::dp : SLayoutSize::px);
141 m_nCountInRow = m_nTileViewWidth.toPixelSize(m_scale) / (m_nItemWidth.toPixelSize(m_scale) + m_nItemMargin.toPixelSize(m_scale));
142 if (m_nCountInRow == 0)
143 m_nCountInRow = 1;
144}
145
146void STileViewItemLocator::GetItemRowAndColIndex(int iItem, int *pRow, int *pCol)
147{
148 SASSERT(pRow && pCol);
149 int &row = *pRow;
150 int &col = *pCol;
151 row = (iItem + 1) / m_nCountInRow;
152 if (row * m_nCountInRow - 1 >= iItem)
153 {
154 row--;
155 }
156 col = m_nCountInRow - ((row + 1) * m_nCountInRow - iItem);
157}
158
160{
161 return iItem % m_nCountInRow == m_nCountInRow - 1;
162}
163
165{
166 int up_idx = iItem - m_nCountInRow;
167 //没有上一行了,返回原值
168 return up_idx < 0 ? iItem : up_idx;
169}
170
172{
173 int up_idx = iItem + m_nCountInRow;
174 if (up_idx < m_adapter->getCount())
175 {
176 return up_idx;
177 }
178 else if ((m_adapter->getCount() - 1) / m_nCountInRow == iItem / m_nCountInRow)
179 {
180 //没有下一行了,返回原值
181 return iItem;
182 }
183 //有下一行,但同一列没有元素,返回下一行最后一个元素
184 return m_adapter->getCount() - 1;
185}
186
187SNSEND
布局大小类
Definition SLayoutSize.h:10
BOOL IsLastInRow(int iItem) OVERRIDE
判断指定项是否为每行的最后一个元素
void SetAdapter(ILvAdapter *pAdapter) OVERRIDE
设置适配器
int GetItemHeight(int iItem) SCONST OVERRIDE
获取指定项的高度
int GetTotalHeight() OVERRIDE
获取总高度
int SetScale(int scale) OVERRIDE
设置缩放比例
int GetCountInRow() SCONST OVERRIDE
获取每行的项数量
int Item2Position(int iItem) OVERRIDE
将项索引转换为位置
int GetMarginSize() SCONST OVERRIDE
获取间距大小
RECT GetItemRect(int iItem) OVERRIDE
获取指定项的矩形区域(相对于TileView)
void GetItemRowAndColIndex(int iItem, int *row, int *col) OVERRIDE
获取指定项的行和列索引
int GetScrollLineSize() SCONST OVERRIDE
获取滚动行大小
int GetUpItem(int iItem) OVERRIDE
获取上一行同一列的元素索引
int GetDownItem(int iItem) OVERRIDE
获取下一行同一列的元素索引
void SetItemHeight(int iItem, int nHeight) OVERRIDE
设置指定项的高度
int GetItemLineHeight() SCONST OVERRIDE
获取项的行高
int GetItemWidth() SCONST OVERRIDE
获取项的宽度
STileViewItemLocator(SWindow *owner, int nItemHei, int nItemWid, int nMarginSize=0)
构造函数
int Position2Item(int position) OVERRIDE
将位置转换为项索引
void SetTileViewWidth(int width, BOOL bDpiAware) OVERRIDE
设置TileView的宽度(在TileView的OnSize中调用)
Base class for SOUI DUI windows.
Definition SWnd.h:286