VirtualTileBox添加子项索引到数据索引的相互转换方法

This commit is contained in:
evilbeast 2019-07-06 19:42:04 +08:00
parent 8adeea0606
commit ba1381df3e
5 changed files with 40 additions and 12 deletions

View File

@ -203,6 +203,11 @@ void VirtualTileBox::SetDataProvider(VirtualTileInterface *pProvider)
} }
VirtualTileInterface* VirtualTileBox::GetDataProvider()
{
return m_pDataProvider;
}
void VirtualTileBox::Refresh() void VirtualTileBox::Refresh()
{ {
m_nMaxItemCount = GetTileLayout()->AjustMaxItem(); m_nMaxItemCount = GetTileLayout()->AjustMaxItem();
@ -528,11 +533,8 @@ void VirtualTileBox::OnModelDataChanged(int nStartIndex, int nEndIndex)
{ {
for (auto i = nStartIndex; i <= nEndIndex; i++) for (auto i = nStartIndex; i <= nEndIndex; i++)
{ {
if (IsElementDisplay(i)) int nItemIndex = ElementIndexToItemIndex(nStartIndex);
{ if (nItemIndex >= 0) {
int nTopItemHeight = 0;
int nItemIndex = i - GetTopElementIndex(nTopItemHeight);
ASSERT(nItemIndex > 0);
FillElement(m_items[nItemIndex], i); FillElement(m_items[nItemIndex], i);
} }
} }
@ -543,3 +545,19 @@ void VirtualTileBox::OnModelCountChanged()
Refresh(); Refresh();
} }
int VirtualTileBox::ElementIndexToItemIndex(int nElementIndex)
{
if (IsElementDisplay(nElementIndex))
{
int nTopItemHeight = 0;
return nElementIndex - GetTopElementIndex(nTopItemHeight);
}
return -1;
}
int VirtualTileBox::ItemIndexToElementIndex(int nItemIndex)
{
int nTopItemHeight = 0;
return GetTopElementIndex(nTopItemHeight) + nItemIndex;
}

View File

@ -66,6 +66,8 @@ public:
*/ */
virtual void SetDataProvider(VirtualTileInterface *pProvider); virtual void SetDataProvider(VirtualTileInterface *pProvider);
virtual VirtualTileInterface* GetDataProvider();
/** /**
* @brief * @brief
* @return * @return
@ -194,6 +196,10 @@ private:
void OnModelCountChanged(); void OnModelCountChanged();
int ElementIndexToItemIndex(int nElementIndex);
int ItemIndexToElementIndex(int nItemIndex);
private: private:
VirtualTileInterface *m_pDataProvider; VirtualTileInterface *m_pDataProvider;
int m_nMaxItemCount; // 列表真实控件数量上限 int m_nMaxItemCount; // 列表真实控件数量上限

View File

@ -1,6 +1,7 @@
#include "stdafx.h" #include "stdafx.h"
#include "item.h" #include "item.h"
#include "VirtualTileBox.h"
#include "provider.h"
Item::Item() Item::Item()
:control_img_(nullptr) :control_img_(nullptr)
@ -9,10 +10,9 @@ Item::Item()
Item::~Item() Item::~Item()
{ = default;
}
void Item::InitSubControls(const std::wstring& img, const std::wstring& title) void Item::InitSubControls(const std::wstring& img, const std::wstring& title, int nDataIndex)
{ {
// 查找 Item 下的控件 // 查找 Item 下的控件
if (control_img_ == nullptr) if (control_img_ == nullptr)
@ -35,7 +35,7 @@ void Item::InitSubControls(const std::wstring& img, const std::wstring& title)
label_title_->SetText(nbase::StringPrintf(L"%s %d%%", title.c_str(), t_time % 100)); label_title_->SetText(nbase::StringPrintf(L"%s %d%%", title.c_str(), t_time % 100));
m_nDataIndex = nDataIndex;
} }
@ -43,5 +43,8 @@ void Item::InitSubControls(const std::wstring& img, const std::wstring& title)
bool Item::OnRemove(ui::EventArgs* args) bool Item::OnRemove(ui::EventArgs* args)
{ {
// 删除时,只需删除数据就可以了,不要删除界面上的元素 // 删除时,只需删除数据就可以了,不要删除界面上的元素
VirtualTileBox* pTileBox = dynamic_cast<VirtualTileBox*>(m_pOwner);
Provider* pProvider = dynamic_cast<Provider*>(pTileBox->GetDataProvider());
pProvider->RemoveTask(m_nDataIndex);
return true; return true;
} }

View File

@ -8,7 +8,7 @@ public:
~Item(); ~Item();
// 提供外部调用来初始化 item 数据 // 提供外部调用来初始化 item 数据
void InitSubControls(const std::wstring& img, const std::wstring& title); void InitSubControls(const std::wstring& img, const std::wstring& title, int nDataIndex);
private: private:
bool OnRemove(ui::EventArgs* args); bool OnRemove(ui::EventArgs* args);
@ -20,5 +20,6 @@ private:
ui::Progress* progress_; ui::Progress* progress_;
ui::Button* btn_del_; ui::Button* btn_del_;
int64_t t_time; int64_t t_time;
int m_nDataIndex;
}; };

View File

@ -29,7 +29,7 @@ void Provider::FillElement(ui::Control *control, int index)
std::wstring img = L"icon.png"; std::wstring img = L"icon.png";
std::wstring title = nbase::StringPrintf(L"%s [%02d]", m_vTasks[index].sName.c_str(), m_vTasks[index].nId); std::wstring title = nbase::StringPrintf(L"%s [%02d]", m_vTasks[index].sName.c_str(), m_vTasks[index].nId);
pItem->InitSubControls(img, title); pItem->InitSubControls(img, title, index);
} }