nim_duilib/duilib/Control/VirtualListBox.h

221 lines
4.8 KiB
C
Raw Normal View History

2019-04-19 17:19:57 +08:00
// Copyright 2017, NetEase (Hangzhou) Network Co., Ltd. All rights reserved.
//
// zqw
// 2015/7/22
//
// virtual ListBox class
#pragma once
namespace ui
{
/**
* @brief
*
*/
class VirtualListInterface
{
public:
/**
* @brief
* @return
*/
virtual Control* CreateElement() = 0;
/**
* @brief
* @param[in] control
* @param[in] index
* @return
*/
virtual void FillElement(Control *control, int index) = 0;
/**
* @brief
* @return
*/
virtual int GetElementtCount() = 0;
};
/**
* @brief
*/
class UILIB_API VirtualLayout : public VLayout
{
protected:
virtual ui::CSize ArrangeChild(const std::vector<ui::Control*>& items, ui::UiRect rc);
};
class UILIB_API VirtualListBox : public ListBox
{
friend class VirtualLayout;
public:
VirtualListBox(ui::Layout* pLayout = new VirtualLayout);
/**
* @brief
* @param[in] pProvider VirtualListInterface
* @return
*/
virtual void SetDataProvider(VirtualListInterface *pProvider);
/**
* @brief
* @param[in] nHeight
* @return
*/
virtual void SetElementHeight(int nHeight);
/**
* @brief
* @param[in] nMaxItemCount 50
* @return
*/
virtual void InitElement(int nMaxItemCount = 50);
/**
* @brief
* @return
*/
virtual void Refresh();
/**
* @brief
* @return
*/
virtual void RemoveAll() override;
/**
* @brief
* @param[in] bForce true
* @return
*/
void SetForceArrange(bool bForce);
/**
* @brief
* @param[out] collection
* @return
*/
void GetDisplayCollection(std::vector<int>& collection);
/**
* @brief
* @param[in] iIndex
* @param[in] bToTop
* @return
*/
void EnsureVisible(int iIndex, bool bToTop = false);
protected:
/// 重写父类接口,提供个性化功能
virtual void SetScrollPos(ui::CSize szPos) override;
virtual void HandleMessage(ui::EventArgs& event) override;
virtual void SetPos(UiRect rc) override;
/**
* @brief
* @param[in] bForce
* @return
*/
void ReArrangeChild(bool bForce);
/**
* @brief
* @param[in] iIndex
* @return
*/
void AddElement(int iIndex);
/**
* @brief
* @param[in] iIndex
* @return
*/
void RemoveElement(int iIndex);
/**
* @brief
* @param[in] ch
* @return
*/
virtual void OnKeyDown(TCHAR ch) {}
/**
* @brief
* @param[in] ch
* @return
*/
virtual void OnKeyUp(TCHAR ch) {}
private:
enum ScrollDirection
{
kScrollUp = -1,
kScrollDown = 1
};
/**
* @brief
* @return
*/
Control* CreateElement();
/**
* @brief
* @param[in] control
* @param[in] index
* @return
*/
void FillElement(Control *pControl, int iIndex);
/**
* @brief
* @return
*/
int GetElementCount();
/**
* @brief 使
* @return true false
*/
bool UseDefaultLayout();
/**
* @brief n个元素对应的高度和
* @param[in] nCount -1
* @return
*/
int CalcElementsHeight(int nCount);
/**
* @brief
* @param[out] bottom bottom
* @return
*/
int GetTopElementIndex(int &bottom);
/**
* @brief
* @param[in] iIndex
* @return true
*/
bool IsElementDisplay(int iIndex);
/**
* @brief
* @param[out] direction
* @return true false
*/
bool NeedReArrange(ScrollDirection &direction);
private:
VirtualListInterface *m_pDataProvider;
int m_nElementHeight; // 每个项的高度
int m_nMaxItemCount; // 列表真实控件数量上限
int m_nOldYScrollPos;
bool m_bArrangedOnce;
bool m_bForceArrange; // 强制布局标记
};
}