Connecting client-server communication to new GUI.
[speedfreak] / Client / resultdialog.cpp
1 /*
2  * CarMainWindow main class
3  *
4  * @author     Janne Änäkkälä <janne.anakkala@fudeco.com>
5  * @copyright  (c) 2010 Speed Freak team
6  * @license    http://opensource.org/licenses/gpl-license.php GNU Public License
7  */
8
9 #include "resultdialog.h"
10 #include "ui_resultdialog.h"
11 #include "usersettings.h"
12 #include "math.h"
13 #include <QPainter>
14 #include <QPicture>
15
16 const int DIAGRAM_WIDTH = 400;
17 const int DIAGRAM_HEIGHT = 300;
18
19 const int DIAGRAMGAP10KMH = 300;
20 const int DIAGRAMGAP20KMH = 150;
21 const int DIAGRAMGAP30KMH = 100;
22 const int DIAGRAMGAP40KMH = 75;
23 const int DIAGRAMGAP50KMH = 60;
24 const int DIAGRAMGAP60KMH = 50;
25 const double DIAGRAMGAP70KMH = 42.86;
26 const double DIAGRAMGAP80KMH = 37.5;
27 const double DIAGRAMGAP90KMH = 33.33;
28 const int DIAGRAMGAP100KMH = 30;
29
30 const int DIAGRAMGAP5S = 80;
31 const int DIAGRAMGAP10S = 40;
32 const int DIAGRAMGAP20S = 20;
33
34 const QPoint diagramStemStart(70, 330);
35 const QPoint diagramStemEnd(70, 30);
36
37 const QPoint diagramHorizontalStart(70, 330);
38 const QPoint diagramHorizontalEnd(470, 330);
39
40 const int diagramGap = 30;
41
42 // Test arrays for changing speeds and times to the points in diagram
43 static const int speedArray[11] = {0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
44 //static const int timeArray[10] = {1, 2, 3, 4, 5, 6, 7, 8, 10, 12};
45
46 // Test point array for the diagram.
47 QPoint points[11];
48
49 /**
50   * Constructor of this class.
51   * @param QWidget pointer to parent object. By default the value is NULL.
52   */
53 ResultDialog::ResultDialog(QWidget *parent) :
54     QDialog(parent),
55     ui(new Ui::ResultDialog)
56 {
57     ui->setupUi(this);
58     timeAxelLength = 10;
59     resultString = "";
60     speedList << "0" << "10" << "20" << "30" << "40" << "50" << "60" << "70" << "80" << "90" << "100" ;
61     timeList << "0" << "1" << "2" << "3" << "4" << "5" << "6" << "7" << "8" << "9" << "10" << "11"
62             << "12" << "13" << "14" << "15" << "16" << "17" << "18" << "19" << "20";
63     this->diagramGapStem = DIAGRAMGAP100KMH;
64     this->diagramGapHorizontal = DIAGRAMGAP20S;
65     for (int i = 0; i < 11; i++)
66     {
67         timeArray[i] = 0;
68     }
69
70     if (loginSaved())
71     {
72         ui->pushButtonSend->setEnabled(true);
73     }
74     else
75     {
76         ui->pushButtonSend->setEnabled(false);
77     }
78 }
79
80 /**
81   * Destructor of this class.  Should be used to release all allocated resources.
82   */
83 ResultDialog::~ResultDialog()
84 {
85     delete ui;
86 }
87
88 void ResultDialog::changeEvent(QEvent *e)
89 {
90     QDialog::changeEvent(e);
91     switch (e->type()) {
92     case QEvent::LanguageChange:
93         ui->retranslateUi(this);
94         break;
95     default:
96         break;
97     }
98 }
99
100 /**
101   * Draws speed diagram to the UI
102   * @param QPaintEvent
103  */
104 void ResultDialog::paintEvent(QPaintEvent *)
105 {
106     setHeaders();
107     QPainter painter(this);
108
109     painter.setRenderHint(QPainter::Antialiasing, true);
110     painter.setPen(QPen((Qt::gray),2));
111     QFont font;
112     QFont fontForResult;
113     font.setPixelSize(12);
114     painter.setFont(font);
115     painter.setBrush(QBrush((Qt::yellow), Qt::SolidPattern));
116
117     fontForResult.setPixelSize(50);
118     painter.setFont(fontForResult);
119     painter.drawText(diagramStemStart.x() + 50, diagramStemStart.y() - 150, resultString);
120     painter.setFont(font);
121
122     painter.setPen(QPen((Qt::darkCyan),2));
123     painter.drawLine(diagramStemStart, diagramStemEnd);
124     painter.drawLine(diagramHorizontalStart, diagramHorizontalEnd);
125
126     int currentX = 0;
127     int currentY = diagramStemStart.y();
128
129     painter.setPen(QPen((Qt::darkCyan),1));
130
131     int i = 0;
132     // Draws diagram's X-axel
133     while (currentX <= DIAGRAM_WIDTH)
134     {
135         painter.drawLine(currentX + diagramStemStart.x(), currentY, currentX + diagramStemStart.x(), currentY - 300);
136         painter.drawText(currentX + diagramStemStart.x() - 3, currentY + 20, timeList[i]);
137         currentX += this->diagramGapHorizontal;
138         i++;
139     }
140
141     currentX = diagramStemStart.x();
142     currentY = 0;
143
144     i = 0;
145     // Draws diagram's Y-axel
146     while (currentY >= -(DIAGRAM_HEIGHT))
147     {
148         painter.drawLine(currentX, diagramStemStart.y() + currentY, currentX+400, diagramStemStart.y() + currentY);
149         painter.drawText(currentX - 25, diagramStemStart.y() + currentY + 3, speedList[i]);
150         currentY -= this->diagramGapStem;
151         i++;
152     }
153
154     painter.setPen(QPen((Qt::red),2));
155
156     int pointsToShow = 0;
157     bool pointsUnderDiagramWidth = true;
158
159     for (i = 0; i < 11 ; i++)
160     {
161         if (points[i].x() > diagramHorizontalEnd.x())
162         {
163             pointsToShow = i;
164             pointsUnderDiagramWidth = false;
165             i = 10;
166         }
167     }
168
169     // Draws result line to the diagram
170     if (pointsUnderDiagramWidth)
171     {
172         painter.drawPolyline(points, this->getTargetChoice() + 1);
173     }
174
175     else
176     {
177         painter.drawPolyline(points, pointsToShow);
178     }
179 }
180
181 /**
182   * Change the given speed and time to the point for the diagram.
183   * @param aSpeed is speed which need to change, aTime is time in seconds which need to change.
184   * @return point is calculated from aSpeed and aTime.
185   */
186 QPoint ResultDialog::changeMeasuresToDiagramPoint(int aSpeed, qreal aTime)
187 {
188     QPoint point;
189
190     int speedAsPixels;
191     int timeAsPixels;
192
193     // Calculate speed and time to the point which can be drawn to the diagram
194     speedAsPixels = (DIAGRAM_HEIGHT*aSpeed) / (this->getTargetChoice() * 10);
195     timeAsPixels = DIAGRAM_WIDTH*aTime/timeAxelLength;
196
197     point.setY(diagramStemStart.y()-speedAsPixels);
198     point.setX(diagramStemStart.x()+timeAsPixels);
199
200     return point;
201 }
202
203 /**
204   * Sets result times in to the labels.
205   */
206 void ResultDialog::setTimesIntoLabels()
207 {
208     QString time, timeInteger;
209     timeInteger.setNum(timeArray[4]);
210     time = "0 - 40 km/h: ";
211     time.append(timeInteger);
212     ui->labelResult40kmh->setText(time);
213
214     timeInteger.setNum(timeArray[3]);
215     time = "0 - 30 km/h: ";
216     time.append(timeInteger);
217     ui->labelResult30kmh->setText(time);
218
219     timeInteger.setNum(timeArray[2]);
220     time = "0 - 20 km/h: ";
221     time.append(timeInteger);
222     ui->labelResult20kmh->setText(time);
223
224     timeInteger.setNum(timeArray[1]);
225     time = "0 - 10 km/h: ";
226     time.append(timeInteger);
227     ui->labelResult10kmh->setText(time);
228
229     timeInteger.setNum(timeArray[6]);
230     time = "0 - 60 km/h: ";
231     time.append(timeInteger);
232     ui->labelResult60kmh->setText(time);
233
234     timeInteger.setNum(timeArray[5]);
235     time = "0 - 50 km/h: ";
236     time.append(timeInteger);
237     ui->labelResult50kmh->setText(time);
238
239     timeInteger.setNum(timeArray[7]);
240     time = "0 - 70 km/h: ";
241     time.append(timeInteger);
242     ui->labelResult70kmh->setText(time);
243
244     timeInteger.setNum(timeArray[8]);
245     time = "0 - 80 km/h: ";
246     time.append(timeInteger);
247     ui->labelResult80kmh->setText(time);
248
249     timeInteger.setNum(timeArray[9]);
250     time = "0 - 90 km/h: ";
251     time.append(timeInteger);
252     ui->labelResult90kmh->setText(time);
253
254     timeInteger.setNum(timeArray[10]);
255     time = "0 - 100 km/h: ";
256     time.append(timeInteger);
257     ui->labelResult100kmh->setText(time);
258
259     showOrHideLabels();
260 }
261
262 /**
263   * Sets right timeAxelLength value depending the time which
264   * has spent to reach target speed.
265   */
266 void ResultDialog::setTimeAxelLength(int pChoice)
267 {
268     if (timeArray[pChoice] <= 5)
269     {
270         timeAxelLength = 5;
271     }
272
273     else if (timeArray[pChoice] <= 10)
274     {
275         timeAxelLength = 10;
276     }
277
278     else if (timeArray[pChoice] <= 15)
279     {
280         timeAxelLength = 15;
281     }
282
283     else
284     {
285         timeAxelLength = 20;
286     }
287 }
288
289 /**
290   * This slot function close result dialog when new run -button has been clicked.
291   */
292 void ResultDialog::on_pushButtonNew_clicked()
293 {
294     for (int i = 0; i < 11; i++)
295     {
296         timeArray[i] = 0;
297     }
298     resultString = "";
299     this->close();
300 }
301
302 /**
303   * This slot function emits sendresult signal for sending results to server when
304   * send results -button has been clicked.
305   */
306 void ResultDialog::on_pushButtonSend_clicked()
307 {
308     emit sendresult(timeArray[this->getTargetChoice()]);
309 }
310
311 /**
312   * This public function sets diagram's stem gap
313   * @param pValue is the speed value which determines diagram gap's value
314   */
315 void ResultDialog::setEnd(int pValue)
316 {
317     switch (pValue)
318     {
319     case 10:
320         this->diagramGapStem = DIAGRAMGAP10KMH;
321         break;
322
323     case 20:
324         this->diagramGapStem = DIAGRAMGAP20KMH;
325         break;
326
327     case 30:
328         this->diagramGapStem = DIAGRAMGAP30KMH;
329         break;
330
331     case 40:
332         this->diagramGapStem = DIAGRAMGAP40KMH;
333         break;
334
335     case 50:
336         this->diagramGapStem = DIAGRAMGAP50KMH;
337         break;
338
339     case 60:
340         this->diagramGapStem = DIAGRAMGAP60KMH;
341         break;
342
343     case 70:
344         this->diagramGapStem = DIAGRAMGAP70KMH;
345         break;
346
347     case 80:
348         this->diagramGapStem = DIAGRAMGAP80KMH;
349         break;
350
351     case 90:
352         this->diagramGapStem = DIAGRAMGAP90KMH;
353         break;
354
355     case 100:
356         this->diagramGapStem = DIAGRAMGAP100KMH;
357         break;
358
359     default:
360         this->diagramGapStem = DIAGRAMGAP100KMH;
361         break;
362     }
363 }
364
365 /**
366   * This public function stores time in timeArray
367   * @param pSpeed is the speed value at the time so we know where store time
368   * @param pTime is the result which needs to be store in timeArray
369   */
370 void ResultDialog::setValue(int pSpeed, double pTime)
371 {
372     //timeArray[0] = 0;
373     if (floor(pTime) <= 5)
374     {
375         this->diagramGapHorizontal = DIAGRAMGAP5S;
376     }
377
378     else if (floor(pTime) <= 10)
379     {
380        this->diagramGapHorizontal = DIAGRAMGAP10S;
381     }
382
383     else
384     {
385         this->diagramGapHorizontal = DIAGRAMGAP20S;
386     }
387
388     switch (pSpeed)
389     {
390     case 10:
391         timeArray[1] = pTime;
392         break;
393     case 20:
394         timeArray[2] = pTime;
395         break;
396     case 30:
397         timeArray[3] = pTime;
398         break;
399     case 40:
400         timeArray[4] = pTime;
401         break;
402     case 50:
403         timeArray[5] = pTime;
404         break;
405     case 60:
406         timeArray[6] = pTime;
407         break;
408     case 70:
409         timeArray[7] = pTime;
410         break;
411     case 80:
412         timeArray[8] = pTime;
413         break;
414     case 90:
415         timeArray[9] = pTime;
416         break;
417     case 100:
418         timeArray[10] = pTime;
419         break;
420     }
421
422     setTimeAxelLength(getTargetChoice());
423
424     for (int i = 0; i < 11; i++)
425     {
426         points[i] = changeMeasuresToDiagramPoint(speedArray[i], timeArray[i]);
427     }
428
429     setTimesIntoLabels();
430     this->repaint();
431 }
432
433 /**
434   * Sets dialog's heading and result text
435   */
436 void ResultDialog::setHeaders()
437 {
438     //QString resultString;
439     resultString.append("Time was ");
440
441     if (this->diagramGapStem == DIAGRAMGAP100KMH)
442     {
443         resultString.append(QString::number(timeArray[10]));
444         this->setWindowTitle("Result for accelerating 100 km/h");
445     }
446
447     else if (this->diagramGapStem == DIAGRAMGAP90KMH)
448     {
449         resultString.append(QString::number(timeArray[9]));
450         this->setWindowTitle("Result for accelerating 90 km/h");
451     }
452
453     else if (this->diagramGapStem == DIAGRAMGAP80KMH)
454     {
455         resultString.append(QString::number(timeArray[8]));
456         this->setWindowTitle("Result for accelerating 80 km/h");
457     }
458
459     else if (this->diagramGapStem == DIAGRAMGAP70KMH)
460     {
461         resultString.append(QString::number(timeArray[7]));
462         this->setWindowTitle("Result for accelerating 70 km/h");
463     }
464
465     else if (this->diagramGapStem == DIAGRAMGAP60KMH)
466     {
467         resultString.append(QString::number(timeArray[6]));
468         this->setWindowTitle("Result for accelerating 60 km/h");
469     }
470
471     else if (this->diagramGapStem == DIAGRAMGAP50KMH)
472     {
473         resultString.append(QString::number(timeArray[5]));
474         this->setWindowTitle("Result for accelerating 50 km/h");
475     }
476
477     else if (this->diagramGapStem == DIAGRAMGAP40KMH)
478     {
479         resultString.append(QString::number(timeArray[4]));
480         this->setWindowTitle("Result for accelerating 40 km/h");
481     }
482
483     else if (this->diagramGapStem == DIAGRAMGAP30KMH)
484     {
485         resultString.append(QString::number(timeArray[3]));
486         this->setWindowTitle("Result for accelerating 30 km/h");
487     }
488
489     else if (this->diagramGapStem == DIAGRAMGAP20KMH)
490     {
491         resultString.append(QString::number(timeArray[2]));
492         this->setWindowTitle("Result for accelerating 20 km/h");
493     }
494
495     else
496     {
497         resultString.append(QString::number(timeArray[1]));
498         this->setWindowTitle("Result for accelerating 10 km/h");
499     }
500 }
501
502 /**
503   * Shows only wanted results and hides
504   * unwanted
505   */
506 void ResultDialog::showOrHideLabels()
507 {
508     if (this->diagramGapStem == DIAGRAMGAP10KMH)
509     {
510         ui->labelResult20kmh->hide();
511         ui->labelResult30kmh->hide();
512         ui->labelResult40kmh->hide();
513         ui->labelResult50kmh->hide();
514         ui->labelResult60kmh->hide();
515         ui->labelResult70kmh->hide();
516         ui->labelResult80kmh->hide();
517         ui->labelResult90kmh->hide();
518         ui->labelResult100kmh->hide();
519     }
520
521     else if (this->diagramGapStem == DIAGRAMGAP20KMH)
522     {
523         ui->labelResult10kmh->show();
524         ui->labelResult20kmh->show();
525         ui->labelResult30kmh->hide();
526         ui->labelResult40kmh->hide();
527         ui->labelResult50kmh->hide();
528         ui->labelResult60kmh->hide();
529         ui->labelResult70kmh->hide();
530         ui->labelResult80kmh->hide();
531         ui->labelResult90kmh->hide();
532         ui->labelResult100kmh->hide();
533     }
534
535     else if (this->diagramGapStem == DIAGRAMGAP30KMH)
536     {
537         ui->labelResult10kmh->show();
538         ui->labelResult20kmh->show();
539         ui->labelResult30kmh->show();
540         ui->labelResult40kmh->hide();
541         ui->labelResult50kmh->hide();
542         ui->labelResult60kmh->hide();
543         ui->labelResult70kmh->hide();
544         ui->labelResult80kmh->hide();
545         ui->labelResult90kmh->hide();
546         ui->labelResult100kmh->hide();
547     }
548
549     else if (this->diagramGapStem == DIAGRAMGAP40KMH)
550     {
551         ui->labelResult10kmh->show();
552         ui->labelResult20kmh->show();
553         ui->labelResult30kmh->show();
554         ui->labelResult40kmh->show();
555         ui->labelResult50kmh->hide();
556         ui->labelResult60kmh->hide();
557         ui->labelResult70kmh->hide();
558         ui->labelResult80kmh->hide();
559         ui->labelResult90kmh->hide();
560         ui->labelResult100kmh->hide();
561     }
562
563     else if (this->diagramGapStem == DIAGRAMGAP50KMH)
564     {
565         ui->labelResult10kmh->show();
566         ui->labelResult20kmh->show();
567         ui->labelResult30kmh->show();
568         ui->labelResult40kmh->show();
569         ui->labelResult50kmh->show();
570         ui->labelResult60kmh->hide();
571         ui->labelResult70kmh->hide();
572         ui->labelResult80kmh->hide();
573         ui->labelResult90kmh->hide();
574         ui->labelResult100kmh->hide();
575     }
576
577     else if (this->diagramGapStem == DIAGRAMGAP60KMH)
578     {
579         ui->labelResult10kmh->show();
580         ui->labelResult20kmh->show();
581         ui->labelResult30kmh->show();
582         ui->labelResult40kmh->show();
583         ui->labelResult50kmh->show();
584         ui->labelResult60kmh->show();
585         ui->labelResult70kmh->hide();
586         ui->labelResult80kmh->hide();
587         ui->labelResult90kmh->hide();
588         ui->labelResult100kmh->hide();
589     }
590
591     else if (this->diagramGapStem == DIAGRAMGAP70KMH)
592     {
593         ui->labelResult10kmh->show();
594         ui->labelResult20kmh->show();
595         ui->labelResult30kmh->show();
596         ui->labelResult40kmh->show();
597         ui->labelResult50kmh->show();
598         ui->labelResult60kmh->show();
599         ui->labelResult70kmh->show();
600         ui->labelResult80kmh->hide();
601         ui->labelResult90kmh->hide();
602         ui->labelResult100kmh->hide();
603     }
604
605     else if (this->diagramGapStem == DIAGRAMGAP80KMH)
606     {
607         ui->labelResult10kmh->show();
608         ui->labelResult20kmh->show();
609         ui->labelResult30kmh->show();
610         ui->labelResult40kmh->show();
611         ui->labelResult50kmh->show();
612         ui->labelResult60kmh->show();
613         ui->labelResult70kmh->show();
614         ui->labelResult80kmh->show();
615         ui->labelResult90kmh->hide();
616         ui->labelResult100kmh->hide();
617     }
618
619     else if (this->diagramGapStem == DIAGRAMGAP90KMH)
620     {
621         ui->labelResult10kmh->show();
622         ui->labelResult20kmh->show();
623         ui->labelResult30kmh->show();
624         ui->labelResult40kmh->show();
625         ui->labelResult50kmh->show();
626         ui->labelResult60kmh->show();
627         ui->labelResult70kmh->show();
628         ui->labelResult80kmh->show();
629         ui->labelResult90kmh->show();
630         ui->labelResult100kmh->hide();
631     }
632
633     else
634     {
635         ui->labelResult10kmh->show();
636         ui->labelResult20kmh->show();
637         ui->labelResult30kmh->show();
638         ui->labelResult40kmh->show();
639         ui->labelResult50kmh->show();
640         ui->labelResult60kmh->show();
641         ui->labelResult70kmh->show();
642         ui->labelResult80kmh->show();
643         ui->labelResult90kmh->show();
644         ui->labelResult100kmh->show();
645     }
646 }
647
648 /**
649   * Checks which target speed has been choosed
650   * @return targetChoice which tells to caller integer value about the target speed
651   * e.g. 20 km/h is value 2 and 60 km/h is value 6
652   */
653 int ResultDialog::getTargetChoice()
654 {
655
656     int targetChoice = 0;
657
658     if (this->diagramGapStem == DIAGRAMGAP10KMH)
659     {
660        targetChoice = 1;
661     }
662
663     else if (this->diagramGapStem == DIAGRAMGAP20KMH)
664     {
665         targetChoice = 2;
666     }
667
668     else if (this->diagramGapStem == DIAGRAMGAP30KMH)
669     {
670         targetChoice = 3;
671     }
672
673     else if (this->diagramGapStem == DIAGRAMGAP40KMH)
674     {
675         targetChoice = 4;
676     }
677
678     else if (this->diagramGapStem == DIAGRAMGAP50KMH)
679     {
680         targetChoice = 5;
681     }
682
683     else if (this->diagramGapStem == DIAGRAMGAP60KMH)
684     {
685         targetChoice = 6;
686     }
687
688     else if (this->diagramGapStem == DIAGRAMGAP70KMH)
689     {
690         targetChoice = 7;
691     }
692
693     else if (this->diagramGapStem == DIAGRAMGAP80KMH)
694     {
695         targetChoice = 8;
696     }
697
698     else if (this->diagramGapStem == DIAGRAMGAP90KMH)
699     {
700         targetChoice = 9;
701     }
702
703     else
704     {
705         targetChoice = 10;
706     }
707     return targetChoice;
708 }