glVertex  5.5.2
glvertex_qt_glwidgetui.h
Go to the documentation of this file.
1 // (c) by Stefan Roettger, licensed under MIT license
2 
5 #ifndef QT_GLWIDGETUI_H
6 #define QT_GLWIDGETUI_H
7 
8 #include <locale.h>
9 
10 #include <QApplication>
11 
12 #include "glvertex_qt_glwidget.h"
13 
16 {
17 public:
18 
19  lgl_Qt_GLWidgetUI(QWidget *parent = NULL, bool core = true)
20  : lgl_Qt_GLWidget(parent, core),
21  buttonDown_(false),
22  spin_(0)
23  {
24  setlocale(LC_NUMERIC, "C");
25 
26  setFocusPolicy(Qt::WheelFocus);
27  }
28 
29  virtual ~lgl_Qt_GLWidgetUI()
30  {}
31 
32 protected:
33 
34  bool buttonDown_;
35  QPoint lastPos_;
36  vec2 lastDelta_;
37  vec2 spin_;
38 
39  void keyPressEvent(QKeyEvent *event)
40  {
41 #ifndef __APPLE__
42  Qt::KeyboardModifier ctrl = Qt::ControlModifier;
43 #else
44  Qt::KeyboardModifier ctrl = Qt::MetaModifier;
45 #endif
46 
47  if (event->key() == Qt::Key_Escape)
48  qApp->quit();
49  else if (event->key()==Qt::Key_Space)
51  else if (event->modifiers() & ctrl)
52  if (event->key()==Qt::Key_R)
53  {
54  lglResetManip();
55  stopSpin();
56  update();
57  }
58  else if (event->key()==Qt::Key_Q)
59  qApp->quit();
60  else
61  lgl_Qt_GLWidget::keyPressEvent(event);
62  else
63  lgl_Qt_GLWidget::keyPressEvent(event);
64 
65  interaction();
66  }
67 
68  void keyReleaseEvent(QKeyEvent *event)
69  {
70  if (event->key() == Qt::Key_Back)
71  qApp->quit();
72  else
73  lgl_Qt_GLWidget::keyReleaseEvent(event);
74 
75  interaction();
76  }
77 
78  void mousePressEvent(QMouseEvent *event)
79  {
80  if (event->buttons() & Qt::LeftButton)
81  buttonDown_ = true;
82  else
83  event->ignore();
84 
85  if (buttonDown_)
86  {
87  double x = (event->x()+0.5)/width();
88  double y = (event->y()+0.5)/height();
89 
90  mouseClick(x, y);
91  }
92 
93  stopSpin();
94 
95  lastPos_ = event->pos();
96  lastDelta_ = vec2(0);
97 
98  interaction();
99  }
100 
101  void mouseReleaseEvent(QMouseEvent *event)
102  {
103  if (!(event->buttons() & Qt::LeftButton))
104  {
105  buttonDown_ = false;
106  spin_ = lastDelta_;
107 
108  if (spin_.length() < 3.0/width()) stopSpin();
109 
110  if (isSpinning()) update();
111  }
112  else
113  event->ignore();
114 
115  interaction();
116  }
117 
118  void mouseMoveEvent(QMouseEvent *event)
119  {
120  if (buttonDown_)
121  {
122  double dx = (double)(event->x()-lastPos_.x())/width();
123  double dy = (double)(event->y()-lastPos_.y())/height();
124 
125  mouseMoved(dx, dy);
126 
127  lglManip(-dx, -dy);
128  update();
129 
130  lastPos_ = event->pos();
131  lastDelta_ = vec2(dx, dy);
132  }
133 
134  interaction();
135  }
136 
137  void mouseDoubleClickEvent(QMouseEvent *event)
138  {
139  if (event->buttons() & Qt::LeftButton)
140  {
141  double x = (event->x()+0.5)/width();
142  double y = (event->y()+0.5)/height();
143 
144  doubleClick(x, y);
145  update();
146  }
147 
148  interaction();
149  }
150 
151  void wheelEvent(QWheelEvent *event)
152  {
153 #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
154  double numDegrees = event->delta()/16.0;
155 
156  if (event->orientation() == Qt::Vertical)
157 #else
158  double numDegrees = event->angleDelta().y()/16.0;
159 
160  if (numDegrees != 0)
161 #endif
162  {
163  lglManip(0, 0, 1+numDegrees/360.0);
164  update();
165  }
166 
167  event->accept();
168 
169  interaction();
170  }
171 
172  // apply manipulator spin
173  virtual void updateOpenGL(double dt)
174  {
175  if (isSpinning())
176  {
177  lglManip(-spin_);
178  update();
179  }
180  }
181 
183  bool isSpinning()
184  {
185  return(spin_.norm() > 0);
186  }
187 
189  void stopSpin()
190  {
191  spin_ = vec2(0);
192  }
193 
195  virtual void mouseMoved(double dx, double dy)
196  {}
197 
199  virtual void mouseClick(double x, double y)
200  {}
201 
203  virtual void doubleClick(double x, double y)
204  {
206  }
207 
209  virtual void interaction()
210  {}
211 
212 };
213 
214 #endif
vec2::norm
double norm() const
get squared vector length
Definition: glslmath.h:136
lglResetManip
void lglResetManip()
reset the manipulator matrix
Definition: glvertex_api.h:320
lgl_Qt_GLWidgetUI::isSpinning
bool isSpinning()
check for manipulator spin
Definition: glvertex_qt_glwidgetui.h:183
lgl_Qt_GLWidgetUI::updateOpenGL
virtual void updateOpenGL(double dt)
implement this method to update state after rendering
Definition: glvertex_qt_glwidgetui.h:173
lglManip
void lglManip(bool on=true)
enable or disable the manipulator matrix
Definition: glvertex_api.h:300
vec2
2D double vector
Definition: glslmath.h:108
lgl_Qt_GLWidgetUI::doubleClick
virtual void doubleClick(double x, double y)
reimplement to be called in case of a double click
Definition: glvertex_qt_glwidgetui.h:203
lgl_Qt_GLWidgetUI::mouseClick
virtual void mouseClick(double x, double y)
reimplement to be called in case of a mouse click
Definition: glvertex_qt_glwidgetui.h:199
lgl_Qt_GLWidgetUI::stopSpin
void stopSpin()
stop manipulator spin
Definition: glvertex_qt_glwidgetui.h:189
vec2::length
double length() const
get vector length
Definition: glslmath.h:133
lgl_Qt_GLWidget::lgl_Qt_GLWidget
lgl_Qt_GLWidget(QWidget *parent=NULL, bool core=true)
default ctor
Definition: glvertex_qt_glwidget.h:32
lgl_Qt_GLWidget::toggle_animation
void toggle_animation()
toggle animation
Definition: glvertex_qt_glwidget.h:184
lgl_Qt_GLWidget::toggle_wireframe
void toggle_wireframe()
toggle wireframe mode
Definition: glvertex_qt_glwidget.h:269
glvertex_qt_glwidget.h
lgl_Qt_GLWidgetUI::interaction
virtual void interaction()
reimplement to be called in case of a user interaction
Definition: glvertex_qt_glwidgetui.h:209
lgl_Qt_GLWidgetUI
Qt OpenGL widget class /w event handling.
Definition: glvertex_qt_glwidgetui.h:15
lgl_Qt_GLWidgetUI::mouseMoved
virtual void mouseMoved(double dx, double dy)
reimplement to be called in case of a mouse move
Definition: glvertex_qt_glwidgetui.h:195
lgl_Qt_GLWidget
Qt OpenGL widget base class.
Definition: glvertex_qt_glwidget.h:27