CUGL 1.3
Cornell University Game Library
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 MIT 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 <cugl/input/CUInput.h>
38 #include <cugl/math/CURect.h>
39 #include <cugl/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 Mouse
392 
417 class Mouse : public InputDevice {
418 public:
427  enum class PointerAwareness {
429  BUTTON,
431  DRAG,
433  ALWAYS
434  };
435 
436 #pragma mark Listeners
437 
470  typedef std::function<void(const MouseEvent& event, Uint8 clicks, bool focus)> ButtonListener;
471 
502  typedef std::function<void(const MouseEvent& event, const Vec2& previous, bool focus)> MotionListener;
503 
529  typedef std::function<void(const MouseWheelEvent& event, bool focus)> WheelListener;
530 
531 protected:
534 
539 
544 
547 
549  std::unordered_map<Uint32, ButtonListener> _pressListeners;
551  std::unordered_map<Uint32, ButtonListener> _releaseListeners;
553  std::unordered_map<Uint32, MotionListener> _moveListeners;
555  std::unordered_map<Uint32, MotionListener> _dragListeners;
557  std::unordered_map<Uint32, WheelListener> _wheelListeners;
558 
559 #pragma mark Constructor
560 
570 
574  virtual ~Mouse() { }
575 
581  virtual void dispose() override;
582 
583 public:
595 
610  void setPointerAwareness(PointerAwareness awareness) { _awareness = awareness; }
611 
612 
613 #pragma mark Data Polling
614 
619  ButtonState buttonDown() const { return _currState; }
620 
626  ButtonState buttonUp() const { return ~_currState; }
627 
634 
641 
647  Vec2 pointerPosition() const { return _currPoint; }
648 
657 
665  Vec2 wheelDirection() const { return _wheelOffset; }
666 
667 #pragma mark Listeners
668 
678  virtual bool requestFocus(Uint32 key) override;
679 
690  bool isListener(Uint32 key) const;
691 
703  const ButtonListener getPressListener(Uint32 key) const;
704 
716  const ButtonListener getReleaseListener(Uint32 key) const;
717 
732  const MotionListener getDragListener(Uint32 key) const;
733 
748  const MotionListener getMotionListener(Uint32 key) const;
749 
759  const WheelListener getWheelListener(Uint32 key) const;
760 
775  bool addPressListener(Uint32 key, ButtonListener listener);
776 
791  bool addReleaseListener(Uint32 key, ButtonListener listener);
792 
809  bool addDragListener(Uint32 key, MotionListener listener);
810 
827  bool addMotionListener(Uint32 key, MotionListener listener);
828 
843  bool addWheelListener(Uint32 key, WheelListener listener);
844 
857  bool removePressListener(Uint32 key);
858 
871  bool removeReleaseListener(Uint32 key);
872 
887  bool removeDragListener(Uint32 key);
888 
903  bool removeMotionListener(Uint32 key);
904 
917  bool removeWheelListener(Uint32 key);
918 
919 protected:
920 #pragma mark Input Device
921 
927  virtual void clearState() override;
928 
940  virtual bool updateState(const SDL_Event& event, const Timestamp& stamp) override;
941 
952  virtual void queryEvents(std::vector<Uint32>& eventset) override;
953 
954  // Apparently friends are not inherited
955  friend class Input;
956 };
957 
958 }
959 
960 #endif /* __CU_MOUSE_H__ */
cugl::Mouse::PointerAwareness::ALWAYS
cugl::MouseWheelEvent::flipped
bool flipped
Definition: CUMouse.h:370
cugl::Mouse::addDragListener
bool addDragListener(Uint32 key, MotionListener listener)
cugl::Mouse::_wheelListeners
std::unordered_map< Uint32, WheelListener > _wheelListeners
Definition: CUMouse.h:557
cugl::MouseWheelEvent::MouseWheelEvent
MouseWheelEvent(const Vec2 &offset, const Timestamp &stamp, bool flip=false)
Definition: CUMouse.h:384
cugl::Mouse::clearState
virtual void clearState() override
cugl::Mouse::updateState
virtual bool updateState(const SDL_Event &event, const Timestamp &stamp) override
cugl::Mouse::_lastState
ButtonState _lastState
Definition: CUMouse.h:536
cugl::ButtonState::setX1
void setX1(bool value)
Definition: CUMouse.h:154
cugl::ButtonState::operator-
const ButtonState operator-(ButtonState mouse) const
Definition: CUMouse.h:290
cugl::Mouse::addPressListener
bool addPressListener(Uint32 key, ButtonListener listener)
cugl::Mouse::requestFocus
virtual bool requestFocus(Uint32 key) override
cugl::MouseEvent
Definition: CUMouse.h:328
cugl::ButtonState::operator-=
ButtonState & operator-=(ButtonState mouse)
Definition: CUMouse.h:228
cugl::ButtonState::operator|=
ButtonState & operator|=(ButtonState mouse)
Definition: CUMouse.h:195
cugl::Mouse::pointerPosition
Vec2 pointerPosition() const
Definition: CUMouse.h:647
cugl::Mouse::_currState
ButtonState _currState
Definition: CUMouse.h:538
cugl::Mouse::~Mouse
virtual ~Mouse()
Definition: CUMouse.h:574
cugl::Timestamp
Definition: CUTimestamp.h:61
cugl::Mouse::buttonUp
ButtonState buttonUp() const
Definition: CUMouse.h:626
cugl::Mouse::ButtonListener
std::function< void(const MouseEvent &event, Uint8 clicks, bool focus)> ButtonListener
Definition: CUMouse.h:470
cugl::Mouse::MotionListener
std::function< void(const MouseEvent &event, const Vec2 &previous, bool focus)> MotionListener
Definition: CUMouse.h:502
cugl::MouseEvent::timestamp
Timestamp timestamp
Definition: CUMouse.h:331
cugl::ButtonState::hasRight
bool hasRight() const
Definition: CUMouse.h:103
cugl::Mouse::addWheelListener
bool addWheelListener(Uint32 key, WheelListener listener)
cugl::ButtonState::operator&=
ButtonState & operator&=(ButtonState mouse)
Definition: CUMouse.h:179
cugl::Mouse::queryEvents
virtual void queryEvents(std::vector< Uint32 > &eventset) override
cugl::Mouse::getPointerAwareness
PointerAwareness getPointerAwareness() const
Definition: CUMouse.h:594
cugl::MouseWheelEvent::timestamp
Timestamp timestamp
Definition: CUMouse.h:366
cugl::ButtonState::setLeft
void setLeft(bool value)
Definition: CUMouse.h:130
cugl::Mouse::pointerOffset
Vec2 pointerOffset() const
Definition: CUMouse.h:656
cugl::MouseWheelEvent::direction
Vec2 direction
Definition: CUMouse.h:368
cugl::Mouse::getPressListener
const ButtonListener getPressListener(Uint32 key) const
cugl::Mouse::_wheelOffset
Vec2 _wheelOffset
Definition: CUMouse.h:546
cugl::ButtonState::hasLeft
bool hasLeft() const
Definition: CUMouse.h:89
cugl::Mouse::buttonReleased
ButtonState buttonReleased() const
Definition: CUMouse.h:640
cugl::Mouse::_pressListeners
std::unordered_map< Uint32, ButtonListener > _pressListeners
Definition: CUMouse.h:549
cugl::ButtonState
Definition: CUMouse.h:58
cugl::ButtonState::setRight
void setRight(bool value)
Definition: CUMouse.h:144
cugl::Mouse::buttonPressed
ButtonState buttonPressed() const
Definition: CUMouse.h:633
cugl::ButtonState::ButtonState
ButtonState(Uint32 state)
Definition: CUMouse.h:81
cugl::Mouse::_releaseListeners
std::unordered_map< Uint32, ButtonListener > _releaseListeners
Definition: CUMouse.h:551
cugl::Mouse::_lastPoint
Vec2 _lastPoint
Definition: CUMouse.h:541
cugl::MouseWheelEvent::MouseWheelEvent
MouseWheelEvent()
Definition: CUMouse.h:375
cugl::ButtonState::hasX1
bool hasX1() const
Definition: CUMouse.h:113
cugl::Mouse::dispose
virtual void dispose() override
cugl::ButtonState::operator&
const ButtonState operator&(ButtonState mouse) const
Definition: CUMouse.h:244
cugl::MouseWheelEvent
Definition: CUMouse.h:363
cugl::Mouse::removeWheelListener
bool removeWheelListener(Uint32 key)
cugl::MouseEvent::buttons
ButtonState buttons
Definition: CUMouse.h:333
cugl::Mouse::addReleaseListener
bool addReleaseListener(Uint32 key, ButtonListener listener)
cugl::MouseEvent::position
Vec2 position
Definition: CUMouse.h:335
cugl::Vec2
Definition: CUVec2.h:61
cugl::Mouse::buttonDown
ButtonState buttonDown() const
Definition: CUMouse.h:619
cugl::Mouse
Definition: CUMouse.h:417
cugl::Mouse::setPointerAwareness
void setPointerAwareness(PointerAwareness awareness)
Definition: CUMouse.h:610
cugl::Mouse::PointerAwareness::DRAG
cugl::ButtonState::setX2
void setX2(bool value)
Definition: CUMouse.h:164
cugl::Mouse::getWheelListener
const WheelListener getWheelListener(Uint32 key) const
cugl::MouseEvent::MouseEvent
MouseEvent()
Definition: CUMouse.h:340
cugl::Mouse::isListener
bool isListener(Uint32 key) const
cugl::MouseEvent::MouseEvent
MouseEvent(Uint32 state, const Vec2 &point, const Timestamp &stamp)
Definition: CUMouse.h:349
cugl::Mouse::_awareness
PointerAwareness _awareness
Definition: CUMouse.h:533
cugl::Input
Definition: CUInput.h:77
cugl::Mouse::removeDragListener
bool removeDragListener(Uint32 key)
cugl::Mouse::wheelDirection
Vec2 wheelDirection() const
Definition: CUMouse.h:665
cugl::Mouse::removeReleaseListener
bool removeReleaseListener(Uint32 key)
cugl::Mouse::removeMotionListener
bool removeMotionListener(Uint32 key)
cugl::ButtonState::operator^
const ButtonState operator^(ButtonState mouse) const
Definition: CUMouse.h:275
cugl::ButtonState::operator^=
ButtonState & operator^=(ButtonState mouse)
Definition: CUMouse.h:212
cugl::Mouse::getDragListener
const MotionListener getDragListener(Uint32 key) const
cugl::Mouse::_currPoint
Vec2 _currPoint
Definition: CUMouse.h:543
cugl::Mouse::_dragListeners
std::unordered_map< Uint32, MotionListener > _dragListeners
Definition: CUMouse.h:555
cugl::Mouse::removePressListener
bool removePressListener(Uint32 key)
cugl::InputDevice
Definition: CUInput.h:298
cugl::Mouse::_moveListeners
std::unordered_map< Uint32, MotionListener > _moveListeners
Definition: CUMouse.h:553
cugl::Mouse::WheelListener
std::function< void(const MouseWheelEvent &event, bool focus)> WheelListener
Definition: CUMouse.h:529
cugl::Mouse::Mouse
Mouse()
Definition: CUMouse.h:569
cugl::ButtonState::operator|
const ButtonState operator|(ButtonState mouse) const
Definition: CUMouse.h:259
cugl::ButtonState::setMiddle
void setMiddle(bool value)
Definition: CUMouse.h:137
cugl::ButtonState::hasMiddle
bool hasMiddle() const
Definition: CUMouse.h:96
cugl::Mouse::PointerAwareness::BUTTON
cugl::Mouse::PointerAwareness
PointerAwareness
Definition: CUMouse.h:427
cugl::ButtonState::ButtonState
ButtonState()
Definition: CUMouse.h:74
cugl::Mouse::addMotionListener
bool addMotionListener(Uint32 key, MotionListener listener)
cugl::Mouse::getReleaseListener
const ButtonListener getReleaseListener(Uint32 key) const
cugl::Mouse::getMotionListener
const MotionListener getMotionListener(Uint32 key) const
cugl::ButtonState::operator~
const ButtonState operator~() const
Definition: CUMouse.h:302
cugl::ButtonState::hasX2
bool hasX2() const
Definition: CUMouse.h:123