MT Showcase SDK
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Pages
DragHandler.hpp
1 #ifndef DRAGHANDLER_HPP
2 #define DRAGHANDLER_HPP
3 
4 #include "Export.hpp"
5 
6 #include <MultiWidgets/Widget.hpp>
7 
8 namespace Showcase {
9 
10  struct DropEvent
11  {
12  enum Type
13  {
14  TYPE_NONE,
15  TYPE_HOVER_BEGIN,
16  TYPE_HOVER,
17  TYPE_HOVER_END,
18  TYPE_DROP
19  };
20 
21  MultiWidgets::WidgetPtr dragged;
22  Nimble::Vector2f location{0, 0};
23  Type type{TYPE_NONE};
24  };
25 
26  class SHOWCASE_API DropListener
27  {
28  public:
30  DropListener(bool multiHover) : m_multiHover(multiHover) {}
31 
33  virtual bool dropEvent(const DropEvent &) = 0;
34 
35  bool multiHover() const { return m_multiHover; }
36 
39  float maximumRelativeDropSize() const { return m_maxRelativeDropSize; }
40  void setMaximumRelativeDropSize(float maxRelativeDropSize) { m_maxRelativeDropSize = maxRelativeDropSize; }
41 
42  private:
43  float m_maxRelativeDropSize{std::numeric_limits<float>::infinity()};
44  const bool m_multiHover;
45  };
46 
48  class SHOWCASE_API DragHandler : public MultiWidgets::Operator
49  {
50  public:
51  static void startDrag(MultiWidgets::WidgetPtr widget);
52 
53  virtual ~DragHandler();
54 
55  private:
56  DragHandler(DropEvent event, bool removeWidgetAtEnd);
57 
58  virtual void update(MultiWidgets::Widget & dragged, const MultiWidgets::FrameInfo & frameInfo) override;
59  virtual void interactionEnd(MultiWidgets::Widget & dragged, MultiWidgets::GrabManager & gm) override;
60  virtual void added(MultiWidgets::Widget & dragged) override;
61 
62  bool hoverBegin(MultiWidgets::Widget & dragged, MultiWidgets::WidgetPtr target,
63  const Nimble::Vector2f & location);
64  bool checkMaximumDropSize(MultiWidgets::Widget & dragged, const MultiWidgets::WidgetPtr & target,
65  float maximumRelativeDropSize) const;
66  void hoverEnd(MultiWidgets::WidgetPtr dragged);
67 
68  private:
69  MultiWidgets::WidgetPtr m_dragged;
70  MultiWidgets::WidgetPtr m_target;
71  DropEvent m_event;
72  bool m_removeWidgetAtEnd;
73 
74  Nimble::Vector2f m_originalLocation{0, 0};
75  float m_originalScale{1};
76  };
77 
79  class SHOWCASE_API DragStarterOperator : public MultiWidgets::Operator
80  {
81  public:
83 
84  virtual void added(MultiWidgets::Widget & widget) override;
85  virtual void removed(MultiWidgets::Widget & widget) override;
86 
87  private:
88  long m_dragEventListener;
89  };
90 }
91 
92 #endif // DRAGHANDLER_HPP