初版-带一个进度条
This commit is contained in:
100
sources/TileListView.cpp
Normal file
100
sources/TileListView.cpp
Normal file
@@ -0,0 +1,100 @@
|
||||
#include "TileListView.h"
|
||||
|
||||
namespace ezui {
|
||||
|
||||
void TileListView::Init()
|
||||
{
|
||||
this->GetScrollBar()->SetHeight(Height());
|
||||
this->GetScrollBar()->Parent = this;
|
||||
this->GetScrollBar()->OffsetCallback = [this](int offsetValue)->void {
|
||||
if (this->GetScrollBar()->ScrollPos() >= 1) {
|
||||
NextPage();
|
||||
}
|
||||
this->Offset(offsetValue);
|
||||
};
|
||||
}
|
||||
|
||||
TileListView::TileListView(Object* parentObject) :PagedListView(parentObject)
|
||||
{
|
||||
Init();
|
||||
}
|
||||
TileListView::~TileListView()
|
||||
{
|
||||
}
|
||||
ScrollBar* TileListView::GetScrollBar()
|
||||
{
|
||||
return &m_vScrollBar;
|
||||
}
|
||||
void TileListView::OnChildPaint(PaintEventArgs& args)
|
||||
{
|
||||
ViewControls.clear();
|
||||
//绘制子控件
|
||||
auto rect = Rect(0, 0, Width(), Height());
|
||||
for (auto& it : GetControls()) {
|
||||
if (rect.IntersectsWith(it->GetRect())) {
|
||||
ViewControls.push_back(it);
|
||||
}
|
||||
if (it->Y() >= Height()) {
|
||||
break;
|
||||
////当控件超出容器底部将不再派发绘制事件 但是仍然要进行布局
|
||||
//if ((it->IsAutoWidth() || it->IsAutoHeight()) && it->GetLayoutState() == LayoutState::Pend) {
|
||||
// it->RefreshLayout();
|
||||
//}
|
||||
}
|
||||
else {
|
||||
it->SendEvent(args);
|
||||
}
|
||||
}
|
||||
}
|
||||
void TileListView::OnLayout()
|
||||
{
|
||||
this->Offset(0);
|
||||
if (m_autoHeight) {
|
||||
this->SetFixedHeight(this->GetContentSize().Height);
|
||||
this->GetScrollBar()->SetVisible(false);
|
||||
}
|
||||
else if (this->GetScrollBar()->IsVisible() == true) {
|
||||
this->GetScrollBar()->SetVisible(true);
|
||||
}
|
||||
this->GetScrollBar()->RefreshScroll();
|
||||
}
|
||||
void TileListView::Offset(int offset) {
|
||||
int _contentWidth = 0;
|
||||
int _contentHeight = 0;
|
||||
int maxWidth = this->Width();
|
||||
int maxHeight = 0;//每行最高的那个
|
||||
int x = 0;
|
||||
int y = offset;
|
||||
for (auto& _it : GetControls()) {
|
||||
if (_it->IsVisible() == false) {
|
||||
_it->SetLocation(Point{ 0,0 });
|
||||
continue;
|
||||
}
|
||||
Control& it = *_it;
|
||||
int itemWidth = it.Width() + it.Margin.GetHSpace();
|
||||
if (x + itemWidth > maxWidth) {
|
||||
//换行
|
||||
x = 0;
|
||||
y += maxHeight;
|
||||
maxHeight = 0;
|
||||
}
|
||||
|
||||
x += it.Margin.Left;//左边距
|
||||
int newX = x;//设置X坐标
|
||||
int newY = y + it.Margin.Top;//设置Y坐标+上边距
|
||||
it.SetRect(Rect(newX, newY, it.Width(), it.Height()));
|
||||
int itemHeight = it.Height() + it.Margin.GetVSpace();//当前控件垂直占用的空间
|
||||
if (maxHeight < itemHeight) {
|
||||
maxHeight = itemHeight;
|
||||
}
|
||||
x += (it.Width() + it.Margin.Right);//右边距
|
||||
_contentHeight = y + maxHeight;
|
||||
//计算最大宽度
|
||||
int _width = it.X() + it.Width();
|
||||
if (_width > _contentWidth) {
|
||||
_contentWidth = _width;
|
||||
}
|
||||
}
|
||||
this->SetContentSize({ _contentWidth,_contentHeight - offset });
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user