nim_duilib/examples/virtualbox/VirtualTileBox.h

210 lines
4.5 KiB
C
Raw Normal View History

2019-07-06 12:45:48 +08:00
#pragma once
typedef std::function<void(int nStartIndex, int nEndIndex)> DataChangedNotify;
typedef std::function<void()> CountChangedNotify;
2019-07-06 12:45:48 +08:00
class UILIB_API VirtualTileInterface: public nbase::SupportWeakCallback
2019-07-06 12:45:48 +08:00
{
public:
VirtualTileInterface();
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return <EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
*/
virtual ui::Control* CreateElement() = 0;
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param[in] control <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD>ָ<EFBFBD><EFBFBD>
* @param[in] index <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return <EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
*/
virtual void FillElement(ui::Control *control, int index) = 0;
/**
* @brief <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
virtual int GetElementtCount() = 0;
void RegNotifys(const DataChangedNotify& dcNotify, const CountChangedNotify& ccNotify);
protected:
void EmitDataChanged(int nStartIndex, int nEndIndex);
void EmitCountChanged();
private:
DataChangedNotify m_DataChangedNotify;
CountChangedNotify m_CountChangedNotify;
};
class UILIB_API VirtualTileLayout : public ui::TileLayout
{
public:
VirtualTileLayout();
virtual ui::CSize ArrangeChild(const std::vector<ui::Control*>& items, ui::UiRect rc) override;
virtual ui::CSize AjustSizeByChild(const std::vector<ui::Control*>& items, ui::CSize szAvailable) override;
virtual bool SetAttribute(const std::wstring& strName, const std::wstring& strValue) override;
virtual int GetElementsHeight(int nCount);
virtual void LazyArrangeChild();
virtual int AjustMaxItem();
private:
bool m_bAutoCalcColumn;
};
class UILIB_API VirtualTileBox : public ui::ListBox
{
friend class VirtualTileLayout;
public:
VirtualTileBox(ui::Layout* pLayout = new VirtualTileLayout);
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param[in] pProvider <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>д VirtualListInterface <EFBFBD>Ľӿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return <EFBFBD><EFBFBD>
*/
virtual void SetDataProvider(VirtualTileInterface *pProvider);
virtual VirtualTileInterface* GetDataProvider();
2019-07-06 12:45:48 +08:00
/**
* @brief ˢ<EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
* @return <EFBFBD><EFBFBD>
*/
virtual void Refresh();
/**
* @brief ɾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return <EFBFBD><EFBFBD>
*/
virtual void RemoveAll() override;
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ǿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>²<EFBFBD><EFBFBD><EFBFBD>
* @param[in] bForce <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ true Ϊǿ<EFBFBD>ƣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>ǿ<EFBFBD><EFBFBD>
* @return <EFBFBD><EFBFBD>
*/
void SetForceArrange(bool bForce);
/**
* @brief <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD>пɼ<EFBFBD><EFBFBD>ؼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param[out] collection <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
* @return <EFBFBD><EFBFBD>
*/
void GetDisplayCollection(std::vector<int>& collection);
/**
* @brief <EFBFBD>ÿؼ<EFBFBD><EFBFBD>ڿɼ<EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><EFBFBD>
* @param[in] iIndex <EFBFBD>ؼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param[in] bToTop <EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD>
* @return <EFBFBD><EFBFBD>
*/
void EnsureVisible(int iIndex, bool bToTop = false);
protected:
/// <20><>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD>ӿڣ<D3BF><DAA3><EFBFBD><E1B9A9><EFBFBD>Ի<EFBFBD><D4BB><EFBFBD><EFBFBD><EFBFBD>
virtual void SetScrollPos(ui::CSize szPos) override;
virtual void HandleMessage(ui::EventArgs& event) override;
virtual void SetPos(ui::UiRect rc) override;
/**
* @brief <EFBFBD><EFBFBD><EFBFBD>²<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param[in] bForce <EFBFBD>Ƿ<EFBFBD>ǿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>²<EFBFBD><EFBFBD><EFBFBD>
* @return <EFBFBD><EFBFBD>
*/
void ReArrangeChild(bool bForce);
/**
* @brief <EFBFBD><EFBFBD><EFBFBD>̰<EFBFBD><EFBFBD><EFBFBD>֪ͨ
* @param[in] ch <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return <EFBFBD><EFBFBD>
*/
virtual void OnKeyDown(TCHAR ch) {}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD><EFBFBD><EFBFBD>֪ͨ
* @param[in] ch <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return <EFBFBD><EFBFBD>
*/
virtual void OnKeyUp(TCHAR ch) {}
private:
enum ScrollDirection
{
kScrollUp = -1,
kScrollDown = 1
};
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return <EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
*/
Control* CreateElement();
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param[in] control <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD>ָ<EFBFBD><EFBFBD>
* @param[in] index <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return <EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
*/
void FillElement(Control *pControl, int iIndex);
/**
* @brief <EFBFBD><EFBFBD>ȡԪ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
*/
int GetElementCount();
/**
* @brief <EFBFBD>õ<EFBFBD>n<EFBFBD><EFBFBD>Ԫ<EFBFBD>ض<EFBFBD>Ӧ<EFBFBD>ĸ߶Ⱥͣ<EFBFBD>
* @param[in] nCount Ҫ<EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>صĸ߶ȣ<EFBFBD>-1<EFBFBD><EFBFBD>ʾȫ<EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD>
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>صĸ߶Ⱥ<EFBFBD>
*/
int CalcElementsHeight(int nCount);
/**
* @brief <EFBFBD>õ<EFBFBD><EFBFBD>ɼ<EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD>ڵ<EFBFBD>һ<EFBFBD><EFBFBD>Ԫ<EFBFBD>ص<EFBFBD>ǰһ<EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param[out] bottom <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>Ԫ<EFBFBD>ص<EFBFBD> bottom ֵ
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>Ԫ<EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
int GetTopElementIndex(int &bottom);
/**
* @brief <EFBFBD>ж<EFBFBD>ij<EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD>ڿɼ<EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><EFBFBD>
* @param[in] iIndex Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD> true <EFBFBD><EFBFBD>ʾ<EFBFBD>ɼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD>ɼ<EFBFBD>
*/
bool IsElementDisplay(int iIndex);
/**
* @brief <EFBFBD>ж<EFBFBD><EFBFBD>Ƿ<EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD>²<EFBFBD><EFBFBD><EFBFBD>
* @param[out] direction <EFBFBD><EFBFBD><EFBFBD>Ϲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¹<EFBFBD><EFBFBD><EFBFBD>
* @return true Ϊ<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD>²<EFBFBD><EFBFBD>֣<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ false
*/
bool NeedReArrange(ScrollDirection &direction);
VirtualTileLayout* GetTileLayout();
int GetRealElementHeight();
int GetColumns();
void LazyArrangeChild();
void OnModelDataChanged(int nStartIndex, int nEndIndex);
void OnModelCountChanged();
int ElementIndexToItemIndex(int nElementIndex);
int ItemIndexToElementIndex(int nItemIndex);
2019-07-06 12:45:48 +08:00
private:
VirtualTileInterface *m_pDataProvider;
int m_nMaxItemCount; // <20>б<EFBFBD><D0B1><EFBFBD>ʵ<EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int m_nOldYScrollPos;
bool m_bArrangedOnce;
bool m_bForceArrange; // ǿ<>Ʋ<EFBFBD><C6B2>ֱ<EFBFBD><D6B1><EFBFBD>
};