Crazy commit
[agianapa.git] / qt / sphere-orbit-camera-gui / controlDialog.cpp
blobe9aaf67d92c890b76fa747201dece37af105e84c
1 #include <iostream>
2 //#include <QString>
3 #include <QTextStream>
5 #include "controlDialog.h"
6 #include "myglwidget.h"
7 #include "workerthread.h"
9 ControlDialog::ControlDialog(QWidget *parent)
10 : QDialog(parent)
12 std::cout << "ControlDialog::ControlDialog()\n";
14 // Worker thread populates the data pool with coordinations and angles.
15 // It automatically blocks once the pool has reached a maximum number
16 // of data and wakes up when data resource are low.
17 m_thread.start();
19 // Setup GUI
20 setupUi(this);
22 // Connect signals
23 connect(this, SIGNAL(glSceneNeedsUpdate()), &m_GLScene, SLOT(updateGL()));
24 connect(fileNameEdit, SIGNAL(returnPressed()), this, SLOT(on_fileNameChangedManually()));
25 connect(this, SIGNAL(fileNameChanged(QString)), &m_thread, SLOT(setFileName(QString)));
27 // Timeline
28 connect(&m_timeLine, SIGNAL(valueChanged(qreal)), this, SLOT(pullData(qreal)));
30 // Initialize axis, camera, sphere.
31 // XXX: axis
32 m_axisX.setColor(QColor(255, 0, 0));
33 m_axisY.setColor(QColor(0, 255, 0));
34 m_axisZ.setColor(QColor(0, 0, 255));
35 m_localAxisSystem = false;
37 // Camera
38 m_camera.setEyeX(eyeXEdit->text().toFloat());
39 m_camera.setEyeY(eyeYEdit->text().toFloat());
40 m_camera.setEyeZ(eyeZEdit->text().toFloat());
42 m_camera.setCenterX(centerXEdit->text().toFloat());
43 m_camera.setCenterY(centerYEdit->text().toFloat());
44 m_camera.setCenterZ(centerZEdit->text().toFloat());
46 m_camera.setUpX(upXEdit->text().toFloat());
47 m_camera.setUpY(upYEdit->text().toFloat());
48 m_camera.setUpZ(upZEdit->text().toFloat());
50 // Sphere
51 m_sphere.setRadius(radiusSpin->value());
52 m_sphere.setSlices(slicesSpin->value());
53 m_sphere.setStacks(stacksSpin->value());
54 m_sphere.setCulling(cullingCheck->checkState() == Qt::Checked ?
55 true : false);
57 // Pass objects to GL scene.
58 m_GLScene.setAxis(AXIS_X, &m_axisX);
59 m_GLScene.setAxis(AXIS_Y, &m_axisY);
60 m_GLScene.setAxis(AXIS_Z, &m_axisZ);
62 m_GLScene.setCamera(&m_camera);
63 m_GLScene.setSphere(&m_sphere);
64 m_GLScene.setCoordsAndAngles(&m_coordsAndAngles);
66 // Show scene
67 m_GLScene.setWindowTitle("GL Scene");
68 // Window manager might ignore the following line.
69 m_GLScene.move(pos().x() + frameGeometry().width(), pos().y());
70 m_GLScene.show();
72 // At this point the animation isn't ready to begin.
73 // We still miss the WorkerThread::setFileName(),
74 // QTimeLine::setFrameRange(), ::setUpdateInterval() and ::setDuration().
77 ControlDialog::~ControlDialog()
79 std::cout << "ControlDialog::~ControlDialog()\n";
83 void ControlDialog::on_startButton_clicked()
85 std::cout << "ControlDialog::on_startButton_clicked()\n";
87 m_timeLine.start();
88 stopButton->setEnabled(true);
91 void ControlDialog::on_stopButton_clicked()
93 std::cout << "ControlDialog::on_stopButton_clicked()\n";
95 m_timeLine.stop();
96 stopButton->setEnabled(false);
99 void ControlDialog::on_exitButton_clicked()
101 // qApp is a global pointer referring to the unique application object.
102 qApp->closeAllWindows();
105 void ControlDialog::on_xAxisVisibleCheck_stateChanged(int state)
107 qDebug("ControlDialog::on_xAxisVisibleCheck_stateChanged()\n"
108 "New state = %d", state);
110 m_axisX.setVisible(state == Qt::Checked ? true : false);
111 emit glSceneNeedsUpdate();
114 void ControlDialog::on_yAxisVisibleCheck_stateChanged(int state)
116 qDebug("ControlDialog::on_yAxisVisibleCheck_stateChanged()\n"
117 "New state = %d", state);
119 m_axisY.setVisible(state == Qt::Checked ? true : false);
120 emit glSceneNeedsUpdate();
123 void ControlDialog::on_zAxisVisibleCheck_stateChanged(int state)
125 qDebug("ControlDialog::on_zAxisVisibleCheck_stateChanged()\n"
126 "New state = %d", state);
128 m_axisZ.setVisible(state == Qt::Checked ? true : false);
129 emit glSceneNeedsUpdate();
132 void ControlDialog::on_localAxisCheck_stateChanged(int state)
134 qDebug("ControlDialog::on_localAxisCheck_stateChanged()\n"
135 "New state = %d", state);
137 m_axisX.setLocal(state == Qt::Checked ? true : false);
138 m_axisY.setLocal(state == Qt::Checked ? true : false);
139 m_axisZ.setLocal(state == Qt::Checked ? true : false);
140 emit glSceneNeedsUpdate();
143 void ControlDialog::on_stacksSpin_valueChanged(int i)
145 qDebug("ControlDialog::on_stacksSpin_valueChanged()\n"
146 "New value = %d", i);
148 m_sphere.setStacks(i);
149 emit glSceneNeedsUpdate();
152 void ControlDialog::on_slicesSpin_valueChanged(int i)
154 qDebug("ControlDialog::on_slicesSpin_valueChanged()\n"
155 "New value = %d", i);
157 m_sphere.setSlices(i);
158 emit glSceneNeedsUpdate();
161 void ControlDialog::on_radiusSpin_valueChanged(double d)
163 qDebug("ControlDialog::on_radiusSpin_valueChanged()\n"
164 "New value = %f", d);
166 m_sphere.setRadius(d);
167 emit glSceneNeedsUpdate();
170 void ControlDialog::on_cullingCheck_stateChanged(int state)
172 qDebug("ControlDialog::on_cullingCheck_stateChanged()\n"
173 "New state = %d", state);
175 m_sphere.setCulling(state == Qt::Checked ? true : false);
176 emit glSceneNeedsUpdate();
179 // Camera tab related slots
180 void ControlDialog::on_eyeXEdit_textChanged(const QString& text)
182 qDebug("ControlDialog::on_eyeXEdit_textChanged()\n"
183 "New eyeX = %f", text.toFloat());
185 m_camera.setEyeX(text.toFloat());
186 emit glSceneNeedsUpdate();
189 void ControlDialog::on_eyeYEdit_textChanged(const QString& text)
191 qDebug("ControlDialog::on_eyeYEdit_textChanged()\n"
192 "New eyeY = %f", text.toFloat());
194 m_camera.setEyeY(text.toFloat());
195 emit glSceneNeedsUpdate();
198 void ControlDialog::on_eyeZEdit_textChanged(const QString& text)
200 qDebug("ControlDialog::on_eyeZEdit_textChanged()\n"
201 "New eyeZ = %f", text.toFloat());
203 m_camera.setEyeZ(text.toFloat());
204 emit glSceneNeedsUpdate();
207 void ControlDialog::on_centerXEdit_textChanged(const QString& text)
209 qDebug("ControlDialog::on_centerXEdit_textChanged()\n"
210 "New centerX = %f", text.toFloat());
212 m_camera.setCenterX(text.toFloat());
213 emit glSceneNeedsUpdate();
216 void ControlDialog::on_centerYEdit_textChanged(const QString& text)
218 qDebug("ControlDialog::on_centerYEdit_textChanged()\n"
219 "New centerY = %f", text.toFloat());
221 m_camera.setCenterY(text.toFloat());
222 emit glSceneNeedsUpdate();
225 void ControlDialog::on_centerZEdit_textChanged(const QString& text)
227 qDebug("ControlDialog::on_centerZEdit_textChanged()\n"
228 "New centerZ = %f", text.toFloat());
230 m_camera.setCenterZ(text.toFloat());
231 emit glSceneNeedsUpdate();
234 void ControlDialog::on_upXEdit_textChanged(const QString& text)
236 qDebug("ControlDialog::on_upXEdit_textChanged()\n"
237 "New upX = %f", text.toFloat());
239 m_camera.setUpX(text.toFloat());
240 emit glSceneNeedsUpdate();
243 void ControlDialog::on_upYEdit_textChanged(const QString& text)
245 qDebug("ControlDialog::on_upYEdit_textChanged()\n"
246 "New upY = %f", text.toFloat());
248 m_camera.setUpY(text.toFloat());
249 emit glSceneNeedsUpdate();
252 void ControlDialog::on_upZEdit_textChanged(const QString& text)
254 qDebug("ControlDialog::on_upZEdit_textChanged()\n"
255 "New upZ = %f", text.toFloat());
257 m_camera.setUpZ(text.toFloat());
258 emit glSceneNeedsUpdate();
261 void ControlDialog::on_browseFileButton_clicked(void)
263 QString fileName;
264 qDebug("ControlDialog::on_browseFileButton_clicked()");
266 fileName = QFileDialog::getOpenFileName(this, tr("Open data file"),
267 "/home", "Data files(*.dat);; All files(*)");
268 if (fileName == NULL)
269 return;
271 // CAUTION: this lines must precede or else the
272 // WorkerThread::extractHeader() won't be called.
273 fileNameEdit->setText(fileName);
274 emit fileNameChanged(fileName);
277 m_timeLine.setFrameRange(0, m_thread.getNumOfRecords());
278 qDebug("End frame: %d\n", m_timeLine.endFrame());
279 m_timeLine.setUpdateInterval(1000 / fpsSpin->value());
280 m_timeLine.setDuration(m_thread.getDuration() * 1000);
283 QString magicVersionStr = QString("0x%1")
284 .arg(m_thread.getMagicVersion(), 0, 16).toUpper();
285 QString protocolVersionStr = QString::number(m_thread.getProtocolVersion());
286 QString durationStr = QString::number(m_thread.getDuration());
287 QString numberOfRecordsStr = QString::number(m_thread.getNumOfRecords());
289 magicVersionOutputLabel->setText(magicVersionStr);
290 protocolVersionOutputLabel->setText(protocolVersionStr);
291 durationOutputLabel->setText(durationStr);
292 numberOfRecordsOutputLabel->setText(numberOfRecordsStr);
294 if (!startButton->isEnabled())
295 startButton->setEnabled(true);
298 void ControlDialog::on_fileNameChangedManually(void)
300 qDebug("ControlDialog::on_fileNameChangedManually()");
302 QString fileName = fileNameEdit->text();
303 emit fileNameChanged(fileName);
306 void ControlDialog::pullData(qreal time)
308 float t, xp, yp, zp, xa, ya, za;
309 qDebug("ControlDialog::pullData()");
311 m_thread.m_mutex.lock();
312 AGAIN:;
313 qDebug("Current time = %f\tSearching for time = %f", m_t, time * m_thread.getDuration());
314 if (m_thread.m_data.size() >= 7) {
315 qDebug("Queue size = %d", m_thread.m_data.size());
316 m_t = m_thread.m_data.dequeue();
317 xp = m_thread.m_data.dequeue();
318 yp = m_thread.m_data.dequeue();
319 zp = m_thread.m_data.dequeue();
320 xa = m_thread.m_data.dequeue();
321 ya = m_thread.m_data.dequeue();
322 za = m_thread.m_data.dequeue();
323 //qDebug("t = %f\txp = %f\typ = %f\tzp = %f\txa = %f\tya = %f\tza = %f",
324 // t, xp, yp, zp, xa, ya, za);
325 if (m_t < m_thread.getDuration() * time)
326 goto AGAIN;
327 else {
328 m_coordsAndAngles.setCoordsAndAngles(xp, yp, zp, xa, ya, za);
329 goto OUT;
332 else {
333 m_thread.m_mutex.unlock();
334 qDebug("WAKING THREAD");
335 m_thread.condition.wakeOne();
336 return;
338 OUT:;
339 m_thread.m_mutex.unlock();
341 emit glSceneNeedsUpdate();
344 void ControlDialog::on_fpsSpin_valueChanged(int i)
346 qDebug("ControlDialog::on_fpsSpin_valueChanged()\n"
347 "New value = %d", i);
349 m_timeLine.stop();
350 m_timeLine.setFrameRange(0, i * m_thread.getDuration());
351 qDebug("=======> %d\n", m_timeLine.endFrame());
352 m_timeLine.setUpdateInterval(1000 / i);
353 //m_timeLine.start();
355 // Don't resume animation, unless it was running before.
356 if (stopButton->isEnabled())
357 m_timeLine.resume();