pm_listctrl.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. /*
  2. * File : pm_listctrl.h
  3. * COPYRIGHT (C) 2012-2017, Shanghai Real-Thread Technology Co., Ltd
  4. *
  5. * Change Logs:
  6. * Date Author Notes
  7. * 2017-11-05 realthread the first version
  8. */
  9. #pragma once
  10. #include <vector>
  11. #include <pm_widget.h>
  12. #include <pm_animation.h>
  13. namespace Persimmon
  14. {
  15. class ListCtrlAnimator;
  16. class ListCtrl : public Widget
  17. {
  18. typedef Widget super;
  19. public:
  20. enum type
  21. {
  22. VERTICAL = 0,
  23. HORIZONTAL = 1 << 0,
  24. CYCLE = 1 << 1,
  25. SNAP_CENTER = 1 << 2,
  26. BUFFERED = 1 << 3,
  27. };
  28. DEFINE_CLASS_ENUM_FLAG_OPERATORS(type);
  29. ListCtrl(const Rect& rect,
  30. int itemSize = 25,
  31. enum type tp = VERTICAL);
  32. virtual ~ListCtrl();
  33. void empty();
  34. void addItem(Widget* widget);
  35. void addItem(int index, Widget* widget);
  36. void removeItem(Widget* widget);
  37. void setItemHeight(int height)
  38. {
  39. itemSize = height;
  40. }
  41. virtual rt_bool_t eventHandler(struct rtgui_event *event);
  42. virtual void render(struct rtgui_dc* dc, const Point &dcPoint = Point(),
  43. const Rect &srcRect = Rect(),
  44. RenderFlag flags = DrawNormal);
  45. virtual void drawBackGround(struct rtgui_dc* dc, const Point &point);
  46. virtual Widget* getMouseOwner(int x, int y);
  47. virtual bool handleGestureEvent(struct rtgui_event_gesture *gev,
  48. const struct rtgui_gesture *gest);
  49. Widget* getCenterWidget(void);
  50. void setCenterIndex(unsigned int i);
  51. void invalidateBuffer(Widget *w);
  52. protected:
  53. /* C++ children object under this window */
  54. std::vector<Widget*> children;
  55. std::vector<struct rtgui_dc*> buffer;
  56. virtual void animationMoveTo(int oldPos, int newPos);
  57. friend class ListCtrlAnimator;
  58. virtual void drawItems(struct rtgui_dc* dc, const Point &point, int offset);
  59. void drawScrollbar(void);
  60. int getItemIndexAt(int x, int y);
  61. int firstPosition;
  62. int beginItemIndex;
  63. int currentItemIndex;
  64. int itemSize;
  65. enum type mtype;
  66. void fixChildrenExtent(void);
  67. void hideChildren(void);
  68. struct rtgui_dc* getItemBuffer(void);
  69. private:
  70. int lastOffset;
  71. void _doDrawItems(struct rtgui_dc *dc, int idx, const Point &pos);
  72. };
  73. class ListCtrlAnimator: public AnimAbstractAnimator
  74. {
  75. typedef AnimAbstractAnimator super;
  76. public:
  77. ListCtrlAnimator(ListCtrl &pl, int oldPos, int newPos);
  78. virtual ~ListCtrlAnimator() {}
  79. virtual void act(struct rtgui_dc* dest_dc, int progress);
  80. private:
  81. const int oldPos, newPos;
  82. };
  83. }