CUGL
Cornell University Game Library
All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends
CUMouse.h
1 //
2 // CUMouse.h
3 // Cornell University Game Library (CUGL)
4 //
5 // This class provides basic mouse support. While SDL combines mouse and touch
6 // support into the same interface, we do not. All touches are handled by
7 // the Touchscreen class.
8 //
9 // This class is a singleton and should never be allocated directly. It
10 // should only be accessed via the Input dispatcher.
11 //
12 // CUGL zlib License:
13 // This software is provided 'as-is', without any express or implied
14 // warranty. In no event will the authors be held liable for any damages
15 // arising from the use of this software.
16 //
17 // Permission is granted to anyone to use this software for any purpose,
18 // including commercial applications, and to alter it and redistribute it
19 // freely, subject to the following restrictions:
20 //
21 // 1. The origin of this software must not be misrepresented; you must not
22 // claim that you wrote the original software. If you use this software
23 // in a product, an acknowledgment in the product documentation would be
24 // appreciated but is not required.
25 //
26 // 2. Altered source versions must be plainly marked as such, and must not
27 // be misrepresented as being the original software.
28 //
29 // 3. This notice may not be removed or altered from any source distribution.
30 //
31 // Author: Walker White
32 // Version: 7/9/16
33 
34 #ifndef __CU_MOUSE_H__
35 #define __CU_MOUSE_H__
36 
37 #include "CUInput.h"
38 #include "../math/CURect.h"
39 #include "../math/CUVec2.h"
40 
42 #define SDL_BUTTON_ALLMASK ((1 << 6) - 1)
43 
44 namespace cugl {
45 
46 #pragma mark -
47 
58 class ButtonState {
59 private:
67  Uint32 _state;
68 
69 public:
70 #pragma mark Constructors
71 
74  ButtonState() : _state(0) { }
75 
81  ButtonState(Uint32 state) { _state = state; }
82 
83 #pragma mark Buttons
84 
89  bool hasLeft() const { return (_state & SDL_BUTTON_LMASK) != 0; }
90 
96  bool hasMiddle() const { return (_state & SDL_BUTTON_MMASK) != 0; }
97 
103  bool hasRight() const { return (_state & SDL_BUTTON_RMASK) != 0; }
104 
113  bool hasX1() const { return (_state & SDL_BUTTON_X1MASK) != 0; }
114 
123  bool hasX2() const { return (_state & SDL_BUTTON_X2MASK) != 0; }
124 
130  void setLeft(bool value) { toggle(SDL_BUTTON_LMASK,value); }
131 
137  void setMiddle(bool value) { toggle(SDL_BUTTON_MMASK,value); }
138 
144  void setRight(bool value) { toggle(SDL_BUTTON_RMASK,value); }
145 
154  void setX1(bool value) { toggle(SDL_BUTTON_X1MASK,value); }
155 
164  void setX2(bool value) { toggle(SDL_BUTTON_X2MASK,value); }
165 
166 
167 #pragma mark Bitwise Operations
168 
180  _state &= mouse._state;
181  return *this;
182  }
183 
196  _state |= mouse._state;
197  return *this;
198  }
199 
213  _state ^= mouse._state;
214  return *this;
215  }
216 
229  _state &= ~mouse._state;
230  return *this;
231  }
232 
244  const ButtonState operator&(ButtonState mouse) const {
245  return ButtonState(_state & mouse._state);
246  }
247 
259  const ButtonState operator|(ButtonState mouse) const {
260  return ButtonState(_state | mouse._state);
261  }
262 
275  const ButtonState operator^(ButtonState mouse) const {
276  return ButtonState(_state ^ mouse._state);
277  }
278 
290  const ButtonState operator-(ButtonState mouse) const {
291  return ButtonState(_state & ~mouse._state);
292  }
293 
302  const ButtonState operator~() const {
303  return ButtonState(~_state & SDL_BUTTON_ALLMASK);
304  }
305 
306 private:
315  void toggle(Uint32 bmask, bool value) {
316  _state = (value ? _state | bmask : _state & ~bmask);
317  }
318 
319  // Allow MouseEvent direct access
320  friend class MouseEvent;
321 };
322 
323 #pragma mark -
324 
328 class MouseEvent {
329 public:
336 
341 
349  MouseEvent(Uint32 state, const Vec2& point, const Timestamp& stamp) {
350  buttons._state = state; timestamp = stamp; position = point;
351  }
352 };
353 
354 #pragma mark -
355 
364 public:
370  bool flipped;
371 
375  MouseWheelEvent() : flipped(false) {}
376 
384  MouseWheelEvent(const Vec2& offset, const Timestamp& stamp, bool flip=false) {
385  direction = offset; timestamp = stamp; flipped = flip;
386  }
387 
388 };
389 
390 #pragma mark -
391 #pragma mark MouseButtonListener
392 
426 typedef std::function<void(const MouseEvent& event, Uint8 clicks, bool focus)>
428 
429 #pragma mark -
430 #pragma mark MouseMotionListener
431 
462 typedef std::function<void(const MouseEvent& event, const Vec2& previous, bool focus)>
464 
465 #pragma mark -
466 #pragma mark MouseWheelListener
467 
493 typedef std::function<void(const MouseWheelEvent& event, bool focus)>
495 
496 #pragma mark -
497 
522 class Mouse : public InputDevice {
523 public:
532  enum class PointerAwareness {
534  BUTTON,
536  DRAG,
538  ALWAYS
539  };
540 
541 protected:
544 
549 
554 
557 
559  std::unordered_map<Uint32, MouseButtonListener> _pressListeners;
561  std::unordered_map<Uint32, MouseButtonListener> _releaseListeners;
563  std::unordered_map<Uint32, MouseMotionListener> _moveListeners;
565  std::unordered_map<Uint32, MouseMotionListener> _dragListeners;
567  std::unordered_map<Uint32, MouseWheelListener> _wheelListeners;
568 
569 #pragma mark Constructor
570 
579  Mouse() : InputDevice(), _awareness(PointerAwareness::BUTTON) {}
580 
584  virtual ~Mouse() { }
585 
591  virtual void dispose() override;
592 
593 public:
605 
620  void setPointerAwareness(PointerAwareness awareness) { _awareness = awareness; }
621 
622 
623 #pragma mark Data Polling
624 
629  ButtonState buttonDown() const { return _currState; }
630 
636  ButtonState buttonUp() const { return ~_currState; }
637 
643  ButtonState buttonPressed() const { return _currState-_lastState; }
644 
650  ButtonState buttonReleased() const { return _lastState-_currState; }
651 
657  Vec2 pointerPosition() const { return _currPoint; }
658 
666  Vec2 pointerOffset() const { return _currPoint-_lastPoint; }
667 
675  Vec2 wheelDirection() const { return _wheelOffset; }
676 
677 #pragma mark Listeners
678 
688  virtual bool requestFocus(Uint32 key) override;
689 
700  bool isListener(Uint32 key) const;
701 
713  const MouseButtonListener getPressListener(Uint32 key) const;
714 
726  const MouseButtonListener getReleaseListener(Uint32 key) const;
727 
742  const MouseMotionListener getDragListener(Uint32 key) const;
743 
758  const MouseMotionListener getMotionListener(Uint32 key) const;
759 
769  const MouseWheelListener getWheelListener(Uint32 key) const;
770 
785  bool addPressListener(Uint32 key, MouseButtonListener listener);
786 
801  bool addReleaseListener(Uint32 key, MouseButtonListener listener);
802 
819  bool addDragListener(Uint32 key, MouseMotionListener listener);
820 
837  bool addMotionListener(Uint32 key, MouseMotionListener listener);
838 
853  bool addWheelListener(Uint32 key, MouseWheelListener listener);
854 
867  bool removePressListener(Uint32 key);
868 
881  bool removeReleaseListener(Uint32 key);
882 
897  bool removeDragListener(Uint32 key);
898 
913  bool removeMotionListener(Uint32 key);
914 
927  bool removeWheelListener(Uint32 key);
928 
929 protected:
930 #pragma mark Input Device
931 
937  virtual void clearState() override;
938 
950  virtual bool updateState(const SDL_Event& event, const Timestamp& stamp) override;
951 
962  virtual void queryEvents(std::vector<Uint32>& eventset) override;
963 
964  // Apparently friends are not inherited
965  friend class Input;
966 };
967 
968 }
969 
970 #endif /* __CU_MOUSE_H__ */
bool addWheelListener(Uint32 key, MouseWheelListener listener)
bool hasX2() const
Definition: CUMouse.h:123
bool removePressListener(Uint32 key)
bool flipped
Definition: CUMouse.h:370
const ButtonState operator-(ButtonState mouse) const
Definition: CUMouse.h:290
bool hasX1() const
Definition: CUMouse.h:113
const MouseMotionListener getMotionListener(Uint32 key) const
virtual ~Mouse()
Definition: CUMouse.h:584
Vec2 _lastPoint
Definition: CUMouse.h:551
const ButtonState operator&(ButtonState mouse) const
Definition: CUMouse.h:244
bool addDragListener(Uint32 key, MouseMotionListener listener)
ButtonState buttonReleased() const
Definition: CUMouse.h:650
bool addReleaseListener(Uint32 key, MouseButtonListener listener)
Definition: CUVec2.h:61
bool removeWheelListener(Uint32 key)
Definition: CUInput.h:77
const ButtonState operator^(ButtonState mouse) const
Definition: CUMouse.h:275
Definition: CUTimestamp.h:61
const ButtonState operator~() const
Definition: CUMouse.h:302
Definition: CUMouse.h:328
ButtonState buttonUp() const
Definition: CUMouse.h:636
Definition: CUMouse.h:522
bool hasLeft() const
Definition: CUMouse.h:89
std::unordered_map< Uint32, MouseButtonListener > _pressListeners
Definition: CUMouse.h:559
Timestamp timestamp
Definition: CUMouse.h:331
void setLeft(bool value)
Definition: CUMouse.h:130
bool isListener(Uint32 key) const
Vec2 pointerOffset() const
Definition: CUMouse.h:666
std::unordered_map< Uint32, MouseWheelListener > _wheelListeners
Definition: CUMouse.h:567
Definition: CUMouse.h:58
virtual void clearState() override
MouseWheelEvent()
Definition: CUMouse.h:375
const MouseButtonListener getPressListener(Uint32 key) const
Vec2 _wheelOffset
Definition: CUMouse.h:556
bool removeDragListener(Uint32 key)
void setX2(bool value)
Definition: CUMouse.h:164
bool addMotionListener(Uint32 key, MouseMotionListener listener)
ButtonState()
Definition: CUMouse.h:74
ButtonState(Uint32 state)
Definition: CUMouse.h:81
bool removeReleaseListener(Uint32 key)
Mouse()
Definition: CUMouse.h:579
std::function< void(const MouseEvent &event, Uint8 clicks, bool focus)> MouseButtonListener
Definition: CUMouse.h:427
const MouseWheelListener getWheelListener(Uint32 key) const
void setX1(bool value)
Definition: CUMouse.h:154
virtual bool updateState(const SDL_Event &event, const Timestamp &stamp) override
std::unordered_map< Uint32, MouseButtonListener > _releaseListeners
Definition: CUMouse.h:561
ButtonState _currState
Definition: CUMouse.h:548
const MouseMotionListener getDragListener(Uint32 key) const
PointerAwareness getPointerAwareness() const
Definition: CUMouse.h:604
const MouseButtonListener getReleaseListener(Uint32 key) const
ButtonState & operator|=(ButtonState mouse)
Definition: CUMouse.h:195
ButtonState & operator^=(ButtonState mouse)
Definition: CUMouse.h:212
const ButtonState operator|(ButtonState mouse) const
Definition: CUMouse.h:259
bool addPressListener(Uint32 key, MouseButtonListener listener)
virtual void dispose() override
ButtonState buttons
Definition: CUMouse.h:333
void setRight(bool value)
Definition: CUMouse.h:144
Vec2 _currPoint
Definition: CUMouse.h:553
MouseEvent()
Definition: CUMouse.h:340
PointerAwareness
Definition: CUMouse.h:532
std::unordered_map< Uint32, MouseMotionListener > _moveListeners
Definition: CUMouse.h:563
ButtonState & operator&=(ButtonState mouse)
Definition: CUMouse.h:179
ButtonState buttonPressed() const
Definition: CUMouse.h:643
Vec2 pointerPosition() const
Definition: CUMouse.h:657
Vec2 direction
Definition: CUMouse.h:368
Vec2 wheelDirection() const
Definition: CUMouse.h:675
Vec2 position
Definition: CUMouse.h:335
std::unordered_map< Uint32, MouseMotionListener > _dragListeners
Definition: CUMouse.h:565
ButtonState & operator-=(ButtonState mouse)
Definition: CUMouse.h:228
std::function< void(const MouseWheelEvent &event, bool focus)> MouseWheelListener
Definition: CUMouse.h:494
void setPointerAwareness(PointerAwareness awareness)
Definition: CUMouse.h:620
bool hasRight() const
Definition: CUMouse.h:103
PointerAwareness _awareness
Definition: CUMouse.h:543
virtual bool requestFocus(Uint32 key) override
ButtonState buttonDown() const
Definition: CUMouse.h:629
MouseWheelEvent(const Vec2 &offset, const Timestamp &stamp, bool flip=false)
Definition: CUMouse.h:384
Definition: CUMouse.h:363
virtual void queryEvents(std::vector< Uint32 > &eventset) override
bool hasMiddle() const
Definition: CUMouse.h:96
Definition: CUAnimationNode.h:52
MouseEvent(Uint32 state, const Vec2 &point, const Timestamp &stamp)
Definition: CUMouse.h:349
std::function< void(const MouseEvent &event, const Vec2 &previous, bool focus)> MouseMotionListener
Definition: CUMouse.h:463
Timestamp timestamp
Definition: CUMouse.h:366
ButtonState _lastState
Definition: CUMouse.h:546
void setMiddle(bool value)
Definition: CUMouse.h:137
Definition: CUInput.h:298
bool removeMotionListener(Uint32 key)