LvSTileViewAdapterHandle.hpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. /*
  2. SListView 的数据适配器
  3. 扩展了 SAdapterBase
  4. 自己处理 ItemClick 等 5个 事件 且 设置了 bubbleup 不让 其他调用
  5. 这样就可以 点击 item里的按钮 而不会导致整个item 选中
  6. */
  7. #pragma once
  8. #include <helper/SAdapterBase.h>
  9. // SListView 数据适配器 封装
  10. class LvAdapterHandle : public SAdapterBase
  11. {
  12. public:
  13. LvAdapterHandle(STileView* pOwner)
  14. : m_pOwner(pOwner)
  15. , m_evtSlot_ItemClick(&LvAdapterHandle::OnEventItemClick, this)
  16. , m_evtSlot_ItemDbClick(&LvAdapterHandle::OnEventItemDbClick, this)
  17. , m_evtSlot_ItemRClick(&LvAdapterHandle::OnEventItemRClick, this)
  18. , m_evtSlot_ItemHover(&LvAdapterHandle::OnEventItemHover, this)
  19. , m_evtSlot_ItemLeave(&LvAdapterHandle::OnEventItemLeave, this)
  20. {
  21. if(NULL != m_pOwner)
  22. {
  23. m_pOwner->GetEventSet()->subscribeEvent(&LvAdapterHandle::OnEventLvSelChangeing, this);
  24. }
  25. }
  26. virtual ~LvAdapterHandle()
  27. {
  28. }
  29. void SelectItem(int nItem, bool bNotify=false)
  30. {
  31. m_pOwner->SetSel(nItem, bNotify ? TRUE : FALSE);
  32. }
  33. int GetSelectItem()
  34. {
  35. return m_pOwner->GetSel();
  36. }
  37. protected:
  38. // 这个用来 显示 数据 在 getView 里 调用 这里去掉了 模版加载
  39. virtual void ShowView(int nItem, SWindow* pItem)
  40. {
  41. }
  42. // item click 回调 可以
  43. virtual void ItemClick(int nItem, SItemPanel* pItem, const CPoint& pt)
  44. {
  45. }
  46. //
  47. virtual void ItemDbClick(int nItem, SItemPanel* pItem, const CPoint& pt)
  48. {
  49. }
  50. virtual void ItemRClick(int nItem, SItemPanel* pItem, const CPoint& pt)
  51. {
  52. }
  53. virtual void ItemHover(int nItem, SItemPanel* pItem, const CPoint& pt)
  54. {
  55. }
  56. virtual void ItemLeave(int nItem, SItemPanel* pItem)
  57. {
  58. }
  59. // 判断 是否 点击item 用来 item 里 有按钮等 控件 判断
  60. virtual bool IsItemClick(int nItem, const SStringT& szSndName)
  61. {
  62. return true;
  63. }
  64. protected:
  65. virtual void InitByTemplate(pugi::xml_node xmlTemplate)
  66. {
  67. //auto ite = xmlTemplate.attribute(L"colorSelected");
  68. //m_szSelectColor = ite.as_string();
  69. //ite = L"#FFFFFF00"; // 设置成 透明 的
  70. }
  71. //virtual SIZE getViewDesiredSize(int position, SOUI::SWindow *pItem, LPCRECT prcContainer)
  72. //{
  73. //}
  74. /*virtual int getItemViewType(int position)
  75. {
  76. }*/
  77. //virtual SStringT GetColumnName(int iCol) const
  78. //{
  79. // return L"col_nick";
  80. //}
  81. virtual void getView(int nPosition, SWindow* pItem, pugi::xml_node xmlTemplate)
  82. {
  83. if(0 == pItem->GetChildrenCount())
  84. {
  85. pItem->InitFromXml(xmlTemplate);
  86. auto eventItem = pItem->GetEventSet();
  87. eventItem->subscribeEvent(EventItemPanelClick::EventID, m_evtSlot_ItemClick);
  88. eventItem->subscribeEvent(EventItemPanelDbclick::EventID, m_evtSlot_ItemDbClick);
  89. eventItem->subscribeEvent(EventItemPanelRclick::EventID, m_evtSlot_ItemRClick);
  90. eventItem->subscribeEvent(EventItemPanelHover::EventID, m_evtSlot_ItemHover);
  91. eventItem->subscribeEvent(EventItemPanelLeave::EventID, m_evtSlot_ItemLeave);
  92. }
  93. ShowView(nPosition, pItem);
  94. }
  95. bool OnEventLvSelChangeing(EventLVSelChanging* pEvt)
  96. {
  97. if(NULL == pEvt)
  98. return true;
  99. pEvt->bubbleUp = false;
  100. if(-1 == pEvt->iNewSel) // 不能设置 -1
  101. pEvt->bCancel = TRUE;
  102. return true;
  103. }
  104. bool OnEventItemClick(EventArgs* e)
  105. {
  106. EventItemPanelClick* pEvt = sobj_cast<EventItemPanelClick>(e);
  107. if(NULL == pEvt) return true;
  108. SItemPanel* pItem = sobj_cast<SItemPanel>(pEvt->sender);
  109. if(NULL == pItem) return true;
  110. int nItem = static_cast<int>(pItem->GetItemIndex());
  111. CPoint pt;
  112. pt.x = GET_X_LPARAM(pEvt->lParam);
  113. pt.y = GET_Y_LPARAM(pEvt->lParam);
  114. // 判断 点击 的 是否是 删除按钮
  115. SWND hHover = pItem->SwndFromPoint(pt, FALSE);
  116. SWindow* pChild = SWindowMgr::GetWindow(hHover);
  117. if(NULL != pChild) // 如果 有 消息 就 不选中
  118. {
  119. if(!IsItemClick(nItem, pChild->GetName()) )
  120. {
  121. e->bubbleUp = false; // 设置了 点击事件 只在 这里处理 SListView 不处理
  122. return true;
  123. }
  124. }
  125. ItemClick(nItem, pItem, pt);
  126. return true;
  127. }
  128. bool OnEventItemDbClick(EventArgs* e)
  129. {
  130. EventItemPanelDbclick* pEvt = sobj_cast<EventItemPanelDbclick>(e);
  131. if(NULL == pEvt) return true;
  132. SItemPanel* pItem = sobj_cast<SItemPanel>(pEvt->sender);
  133. if(NULL == pItem) return true;
  134. int nItem = static_cast<int>(pItem->GetItemIndex());
  135. CPoint pt;
  136. pt.x = GET_X_LPARAM(pEvt->lParam);
  137. pt.y = GET_Y_LPARAM(pEvt->lParam);
  138. ItemDbClick(nItem, pItem, pt);
  139. return true;
  140. }
  141. bool OnEventItemRClick(EventArgs* e)
  142. {
  143. EventItemPanelRclick* pEvt = sobj_cast<EventItemPanelRclick>(e);
  144. if(NULL == pEvt) return true;
  145. SItemPanel* pItem = sobj_cast<SItemPanel>(pEvt->sender);
  146. if(NULL == pItem) return true;
  147. int nItem = static_cast<int>(pItem->GetItemIndex());
  148. CPoint pt;
  149. pt.x = GET_X_LPARAM(pEvt->lParam);
  150. pt.y = GET_Y_LPARAM(pEvt->lParam);
  151. ItemRClick(nItem, pItem, pt);
  152. return true;
  153. }
  154. bool OnEventItemHover(EventArgs* e)
  155. {
  156. EventItemPanelHover* pEvt = sobj_cast<EventItemPanelHover>(e);
  157. if(NULL == pEvt)
  158. return true;
  159. SItemPanel* pItem = sobj_cast<SItemPanel>(pEvt->sender);
  160. if(NULL == pItem) return true;
  161. int nItem = static_cast<int>(pItem->GetItemIndex());
  162. CPoint pt;
  163. pt.x = GET_X_LPARAM(pEvt->lParam);
  164. pt.y = GET_Y_LPARAM(pEvt->lParam);
  165. ItemHover(nItem, pItem, pt);
  166. return true;
  167. }
  168. bool OnEventItemLeave(EventArgs* e)
  169. {
  170. EventItemPanelLeave* pEvt = sobj_cast<EventItemPanelLeave>(e);
  171. if(NULL == pEvt)
  172. return true;
  173. SItemPanel* pItem = sobj_cast<SItemPanel>(pEvt->sender);
  174. if(NULL == pItem) return true;
  175. int nItem = static_cast<int>(pItem->GetItemIndex());
  176. ItemLeave(nItem, pItem);
  177. return true;
  178. }
  179. protected:
  180. STileView* m_pOwner;
  181. private:
  182. MemberFunctionSlot<LvAdapterHandle, EventArgs> m_evtSlot_ItemClick;
  183. MemberFunctionSlot<LvAdapterHandle, EventArgs> m_evtSlot_ItemDbClick;
  184. MemberFunctionSlot<LvAdapterHandle, EventArgs> m_evtSlot_ItemRClick;
  185. MemberFunctionSlot<LvAdapterHandle, EventArgs> m_evtSlot_ItemHover;
  186. MemberFunctionSlot<LvAdapterHandle, EventArgs> m_evtSlot_ItemLeave;
  187. };