#pragma once #include #include #include #include class SpaceNavEventTranslate; class SpaceNavEventRotate; class SpaceNavEventButton; class SpaceNavEventHandler { public: virtual ~SpaceNavEventHandler( void) {}; virtual void SpaceNav_translate( SpaceNavEventTranslate* event) = 0; virtual void SpaceNav_rotate( SpaceNavEventRotate* event) = 0; virtual void SpaceNav_button( SpaceNavEventButton* event) = 0; }; class SpaceNavEvent : public QEvent { public: SpaceNavEvent( void) : QEvent( my_type) {}; virtual ~SpaceNavEvent( void) {}; virtual void deliver( SpaceNavEventHandler* receiver) = 0; static const QEvent::Type my_type; }; class SpaceNavEventTranslate : public SpaceNavEvent { public: const int16_t x; const int16_t y; const int16_t z; SpaceNavEventTranslate( int16_t u, int16_t v, int16_t w) : x( u), y( v), z( w) { } void deliver( SpaceNavEventHandler* receiver) { receiver->SpaceNav_translate( this); } }; class SpaceNavEventRotate : public SpaceNavEvent { public: const int16_t x; const int16_t y; const int16_t z; SpaceNavEventRotate( int16_t u, int16_t v, int16_t w) : x( u), y( v), z( w) { } void deliver( SpaceNavEventHandler* receiver) { receiver->SpaceNav_rotate( this); } }; class SpaceNavEventButton : public SpaceNavEvent { public: const uint16_t down; const uint16_t up; SpaceNavEventButton( uint16_t d, uint16_t u) : down( d), up( u) { } void deliver( SpaceNavEventHandler* receiver) { receiver->SpaceNav_button( this); } }; class SpaceNav { public: SpaceNav( void); ~SpaceNav( void); void operator()( void); private: class Impl; std::thread* pimpl_thread; }; extern SpaceNav spacenav;