2019-07-06 12:45:48 +08:00
|
|
|
|
#pragma once
|
|
|
|
|
|
2019-09-20 16:27:58 +08:00
|
|
|
|
typedef std::function<void(int nStartIndex, int nEndIndex)> DataChangedNotify;
|
|
|
|
|
typedef std::function<void()> CountChangedNotify;
|
2019-07-06 12:45:48 +08:00
|
|
|
|
|
2019-07-07 06:38:03 +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);
|
|
|
|
|
|
2019-07-06 19:42:04 +08:00
|
|
|
|
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();
|
|
|
|
|
|
2019-07-06 19:42:04 +08:00
|
|
|
|
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>
|
|
|
|
|
};
|