00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef QGLVIEWER_MANIPULATED_FRAME_H
00026 #define QGLVIEWER_MANIPULATED_FRAME_H
00027
00028 #include <qstring.h>
00029 #include <qtimer.h>
00030 #include <qdatetime.h>
00031
00032 #include "spinningFrame.h"
00033 #include "mouseGrabber.h"
00034
00035 class QGLViewer;
00036
00037 namespace qglviewer {
00038
00095 class QGLVIEWER_EXPORT ManipulatedFrame : public SpinningFrame, public MouseGrabber
00096 {
00097 #ifndef DOXYGEN
00098 friend class Camera;
00099 friend class ::QGLViewer;
00100 #endif
00101
00102 Q_OBJECT
00103
00104 public:
00105 ManipulatedFrame();
00107 virtual ~ManipulatedFrame() {};
00108
00109 signals:
00125 void manipulated();
00126
00129 public slots:
00131 void setRotationSensitivity(const float s) { rotSensitivity_ = s; };
00145 void setTranslationSensitivity(const float s) { transSensitivity_ = s; };
00146
00148 void setSpinningSensitivity(const float s) { spinningSensitivity_ = s; };
00149 public:
00151 float rotationSensitivity() const { return rotSensitivity_; };
00153 float translationSensitivity() const { return transSensitivity_; };
00158 float spinningSensitivity() const { return spinningSensitivity_; };
00160
00161 public:
00166 bool isManipulated() const { return action_ != NO_ACTION; };
00168
00169 public:
00172 virtual QDomElement domElement(const QString& name, QDomDocument& doc) const;
00173 virtual void initFromDOMElement(const QDomElement& de);
00175
00178 protected:
00179 virtual void mousePressEvent(QMouseEvent* const, Camera* const);
00180 virtual void mouseReleaseEvent(QMouseEvent* const, Camera* const);
00181 virtual void mouseMoveEvent(QMouseEvent* const, const Camera* const);
00182 virtual void wheelEvent(QWheelEvent* const, const Camera* const camera);
00184
00187 void checkIfGrabsMouse(int x, int y, const Camera* const camera);
00189
00190 protected:
00191 Quaternion quaternionFromDeformedBall(const int x, const int y, const float cx, const float cy, const Camera* const camera);
00192
00193 public:
00194
00195 enum MouseMotion { NO_ACTION,
00196 ROTATE, ZOOM, TRANSLATE,
00197 MOVE_FORWARD, LOOK_AROUND, MOVE_BACKWARD,
00198 SCREEN_ROTATE, SCREEN_ROTATE_BOTTOM,
00199 SCREEN_TRANSLATE, ZOOM_ON_REGION };
00200
00201
00202 protected:
00203 MouseMotion action_;
00204 bool withConstraint_;
00205
00206 virtual void startAction(MouseMotion ma, bool withConstraint=true);
00207 void computeMouseSpeed(const QMouseEvent* const e);
00208 int mouseOriginalDirection(const QMouseEvent* const e);
00209
00210
00211 int prevX_, prevY_;
00212
00213 int pressX_, pressY_;
00214
00215 private:
00216
00217
00218 ManipulatedFrame(const ManipulatedFrame& mf);
00219 ManipulatedFrame& operator=(const ManipulatedFrame& mf);
00220
00221
00222 float rotSensitivity_;
00223 float transSensitivity_;
00224 float spinningSensitivity_;
00225
00226
00227 QTime last_move_time;
00228 float mouseSpeed_;
00229 int delay_;
00230
00231
00232 bool dirIsFixed_;
00233
00234
00235 bool keepsGrabbingMouse_;
00236 };
00237
00238 }
00239
00240 #endif // QGLVIEWER_MANIPULATED_FRAME_H