Some bug fixing in result dialog.
[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     painter.drawText(diagramStemStart.x() - 50, diagramStemEnd.y() + 100, "S");
126     painter.drawText(diagramStemStart.x() - 50, diagramStemEnd.y() + 115, "P");
127     painter.drawText(diagramStemStart.x() - 50, diagramStemEnd.y() + 130, "E");
128     painter.drawText(diagramStemStart.x() - 50, diagramStemEnd.y() + 145, "E");
129     painter.drawText(diagramStemStart.x() - 50, diagramStemEnd.y() + 160, "D");
130     painter.drawText(diagramStemStart.x() - 65, diagramStemEnd.y() + 180, "(km/h)");
131
132     painter.drawText(diagramStemStart.x() + 140, diagramStemStart.y() + 40, "T");
133     painter.drawText(diagramStemStart.x() + 150, diagramStemStart.y() + 40, "I");
134     painter.drawText(diagramStemStart.x() + 155, diagramStemStart.y() + 40, "M");
135     painter.drawText(diagramStemStart.x() + 165, diagramStemStart.y() + 40, "E");
136     painter.drawText(diagramStemStart.x() + 180, diagramStemStart.y() + 40, "(s)");
137
138     int currentX = 0;
139     int currentY = diagramStemStart.y();
140
141     painter.setPen(QPen((Qt::darkCyan),1));
142
143     int i = 0;
144     // Draws diagram's X-axel
145     while (currentX <= DIAGRAM_WIDTH)
146     {
147         painter.drawLine(currentX + diagramStemStart.x(), currentY, currentX + diagramStemStart.x(), currentY - 300);
148         painter.drawText(currentX + diagramStemStart.x() - 3, currentY + 20, timeList[i]);
149         currentX += this->diagramGapHorizontal;
150         i++;
151     }
152
153     currentX = diagramStemStart.x();
154     currentY = 0;
155
156     i = 0;
157     // Draws diagram's Y-axel
158     while (currentY >= -(DIAGRAM_HEIGHT))
159     {
160         painter.drawLine(currentX, diagramStemStart.y() + currentY, currentX+400, diagramStemStart.y() + currentY);
161         painter.drawText(currentX - 25, diagramStemStart.y() + currentY + 3, speedList[i]);
162         currentY -= this->diagramGapStem;
163         i++;
164     }
165
166     painter.setPen(QPen((Qt::red),2));
167
168     int pointsToShow = 0;
169     bool pointsUnderDiagramWidth = true;
170
171     for (i = 0; i < 11 ; i++)
172     {
173         if (points[i].x() > diagramHorizontalEnd.x())
174         {
175             pointsToShow = i;
176             pointsUnderDiagramWidth = false;
177             i = 10;
178         }
179     }
180
181     // Draws result line to the diagram
182     if (pointsUnderDiagramWidth)
183     {
184         painter.drawPolyline(points, this->getTargetChoice() + 1);
185     }
186
187     else
188     {
189         painter.drawPolyline(points, pointsToShow);
190     }
191 }
192
193 /**
194   * Change the given speed and time to the point for the diagram.
195   * @param aSpeed is speed which need to change, aTime is time in seconds which need to change.
196   * @return point is calculated from aSpeed and aTime.
197   */
198 QPoint ResultDialog::changeMeasuresToDiagramPoint(int aSpeed, qreal aTime)
199 {
200     QPoint point;
201
202     int speedAsPixels;
203     int timeAsPixels;
204
205     // Calculate speed and time to the point which can be drawn to the diagram
206     speedAsPixels = (DIAGRAM_HEIGHT*aSpeed) / (this->getTargetChoice() * 10);
207     timeAsPixels = DIAGRAM_WIDTH*aTime/timeAxelLength;
208
209     point.setY(diagramStemStart.y()-speedAsPixels);
210     point.setX(diagramStemStart.x()+timeAsPixels);
211
212     return point;
213 }
214
215 /**
216   * Sets result times in to the labels.
217   */
218 void ResultDialog::setTimesIntoLabels()
219 {
220     QString time, timeInteger;
221     timeInteger.setNum(timeArray[4]);
222     time = "0 - 40 km/h: ";
223     time.append(timeInteger);
224     ui->labelResult40kmh->setText(time);
225
226     timeInteger.setNum(timeArray[3]);
227     time = "0 - 30 km/h: ";
228     time.append(timeInteger);
229     ui->labelResult30kmh->setText(time);
230
231     timeInteger.setNum(timeArray[2]);
232     time = "0 - 20 km/h: ";
233     time.append(timeInteger);
234     ui->labelResult20kmh->setText(time);
235
236     timeInteger.setNum(timeArray[1]);
237     time = "0 - 10 km/h: ";
238     time.append(timeInteger);
239     ui->labelResult10kmh->setText(time);
240
241     timeInteger.setNum(timeArray[6]);
242     time = "0 - 60 km/h: ";
243     time.append(timeInteger);
244     ui->labelResult60kmh->setText(time);
245
246     timeInteger.setNum(timeArray[5]);
247     time = "0 - 50 km/h: ";
248     time.append(timeInteger);
249     ui->labelResult50kmh->setText(time);
250
251     timeInteger.setNum(timeArray[7]);
252     time = "0 - 70 km/h: ";
253     time.append(timeInteger);
254     ui->labelResult70kmh->setText(time);
255
256     timeInteger.setNum(timeArray[8]);
257     time = "0 - 80 km/h: ";
258     time.append(timeInteger);
259     ui->labelResult80kmh->setText(time);
260
261     timeInteger.setNum(timeArray[9]);
262     time = "0 - 90 km/h: ";
263     time.append(timeInteger);
264     ui->labelResult90kmh->setText(time);
265
266     timeInteger.setNum(timeArray[10]);
267     time = "0 - 100 km/h: ";
268     time.append(timeInteger);
269     ui->labelResult100kmh->setText(time);
270
271     showOrHideLabels();
272 }
273
274 /**
275   * Sets right timeAxelLength value depending the time which
276   * has spent to reach target speed.
277   */
278 void ResultDialog::setTimeAxelLength(int pChoice)
279 {
280     if (timeArray[pChoice] <= 5)
281     {
282         timeAxelLength = 5;
283     }
284
285     else if (timeArray[pChoice] <= 10)
286     {
287         timeAxelLength = 10;
288     }
289
290     else if (timeArray[pChoice] <= 15)
291     {
292         timeAxelLength = 15;
293     }
294
295     else
296     {
297         timeAxelLength = 20;
298     }
299 }
300
301 /**
302   * This slot function close result dialog when new run -button has been clicked.
303   */
304 void ResultDialog::on_pushButtonNew_clicked()
305 {
306     for (int i = 0; i < 11; i++)
307     {
308         timeArray[i] = 0;
309     }
310     resultString = "";
311     this->close();
312 }
313
314 /**
315   * This slot function emits sendresult signal for sending results to server when
316   * send results -button has been clicked.
317   */
318 void ResultDialog::on_pushButtonSend_clicked()
319 {
320     emit sendresult(timeArray[this->getTargetChoice()]);
321 }
322
323 /**
324   * This public function sets diagram's stem gap
325   * @param pValue is the speed value which determines diagram gap's value
326   */
327 void ResultDialog::setEnd(int pValue)
328 {
329     for (int i = 0; i < 11; i++)
330     {
331         timeArray[i] = 0;
332     }
333     resultString = "";
334
335     switch (pValue)
336     {
337     case 10:
338         this->diagramGapStem = DIAGRAMGAP10KMH;
339         break;
340
341     case 20:
342         this->diagramGapStem = DIAGRAMGAP20KMH;
343         break;
344
345     case 30:
346         this->diagramGapStem = DIAGRAMGAP30KMH;
347         break;
348
349     case 40:
350         this->diagramGapStem = DIAGRAMGAP40KMH;
351         break;
352
353     case 50:
354         this->diagramGapStem = DIAGRAMGAP50KMH;
355         break;
356
357     case 60:
358         this->diagramGapStem = DIAGRAMGAP60KMH;
359         break;
360
361     case 70:
362         this->diagramGapStem = DIAGRAMGAP70KMH;
363         break;
364
365     case 80:
366         this->diagramGapStem = DIAGRAMGAP80KMH;
367         break;
368
369     case 90:
370         this->diagramGapStem = DIAGRAMGAP90KMH;
371         break;
372
373     case 100:
374         this->diagramGapStem = DIAGRAMGAP100KMH;
375         break;
376
377     default:
378         this->diagramGapStem = DIAGRAMGAP100KMH;
379         break;
380     }
381 }
382
383 /**
384   * This public function stores time in timeArray
385   * @param pSpeed is the speed value at the time so we know where store time
386   * @param pTime is the result which needs to be store in timeArray
387   */
388 void ResultDialog::setValue(int pSpeed, double pTime)
389 {
390     //timeArray[0] = 0;
391     if (floor(pTime) <= 5)
392     {
393         this->diagramGapHorizontal = DIAGRAMGAP5S;
394     }
395
396     else if (floor(pTime) <= 10)
397     {
398        this->diagramGapHorizontal = DIAGRAMGAP10S;
399     }
400
401     else
402     {
403         this->diagramGapHorizontal = DIAGRAMGAP20S;
404     }
405
406     switch (pSpeed)
407     {
408     case 10:
409         timeArray[1] = pTime;
410         break;
411     case 20:
412         timeArray[2] = pTime;
413         break;
414     case 30:
415         timeArray[3] = pTime;
416         break;
417     case 40:
418         timeArray[4] = pTime;
419         break;
420     case 50:
421         timeArray[5] = pTime;
422         break;
423     case 60:
424         timeArray[6] = pTime;
425         break;
426     case 70:
427         timeArray[7] = pTime;
428         break;
429     case 80:
430         timeArray[8] = pTime;
431         break;
432     case 90:
433         timeArray[9] = pTime;
434         break;
435     case 100:
436         timeArray[10] = pTime;
437         break;
438     }
439
440     setTimeAxelLength(getTargetChoice());
441
442     for (int i = 0; i < 11; i++)
443     {
444         points[i] = changeMeasuresToDiagramPoint(speedArray[i], timeArray[i]);
445     }
446
447     setTimesIntoLabels();
448     this->repaint();
449 }
450
451 /**
452   * Sets dialog's heading and result text
453   */
454 void ResultDialog::setHeaders()
455 {
456     //QString resultString;
457     resultString.append("Time was ");
458
459     QString time;
460
461     if (this->diagramGapStem == DIAGRAMGAP100KMH)
462     {
463         time.sprintf("%.2f", timeArray[10]);
464         resultString.append(time);
465         this->setWindowTitle("Result for accelerating 100 km/h");
466     }
467
468     else if (this->diagramGapStem == DIAGRAMGAP90KMH)
469     {
470         time.sprintf("%.2f", timeArray[9]);
471         resultString.append(time);
472         this->setWindowTitle("Result for accelerating 90 km/h");
473     }
474
475     else if (this->diagramGapStem == DIAGRAMGAP80KMH)
476     {
477         time.sprintf("%.2f", timeArray[8]);
478         resultString.append(time);
479         this->setWindowTitle("Result for accelerating 80 km/h");
480     }
481
482     else if (this->diagramGapStem == DIAGRAMGAP70KMH)
483     {
484         time.sprintf("%.2f", timeArray[7]);
485         resultString.append(time);
486         this->setWindowTitle("Result for accelerating 70 km/h");
487     }
488
489     else if (this->diagramGapStem == DIAGRAMGAP60KMH)
490     {
491         time.sprintf("%.2f", timeArray[6]);
492         resultString.append(time);
493         this->setWindowTitle("Result for accelerating 60 km/h");
494     }
495
496     else if (this->diagramGapStem == DIAGRAMGAP50KMH)
497     {
498         time.sprintf("%.2f", timeArray[5]);
499         resultString.append(time);
500         this->setWindowTitle("Result for accelerating 50 km/h");
501     }
502
503     else if (this->diagramGapStem == DIAGRAMGAP40KMH)
504     {
505         time.sprintf("%.2f", timeArray[4]);
506         resultString.append(time);
507         this->setWindowTitle("Result for accelerating 40 km/h");
508     }
509
510     else if (this->diagramGapStem == DIAGRAMGAP30KMH)
511     {
512         time.sprintf("%.2f", timeArray[3]);
513         resultString.append(time);
514         this->setWindowTitle("Result for accelerating 30 km/h");
515     }
516
517     else if (this->diagramGapStem == DIAGRAMGAP20KMH)
518     {
519         time.sprintf("%.2f", timeArray[2]);
520         resultString.append(time);
521         this->setWindowTitle("Result for accelerating 20 km/h");
522     }
523
524     else
525     {
526         time.sprintf("%.2f", timeArray[1]);
527         resultString.append(time);
528         this->setWindowTitle("Result for accelerating 10 km/h");
529     }
530 }
531
532 /**
533   * Shows only wanted results and hides
534   * unwanted
535   */
536 void ResultDialog::showOrHideLabels()
537 {
538     if (this->diagramGapStem == DIAGRAMGAP10KMH)
539     {
540         ui->labelResult20kmh->hide();
541         ui->labelResult30kmh->hide();
542         ui->labelResult40kmh->hide();
543         ui->labelResult50kmh->hide();
544         ui->labelResult60kmh->hide();
545         ui->labelResult70kmh->hide();
546         ui->labelResult80kmh->hide();
547         ui->labelResult90kmh->hide();
548         ui->labelResult100kmh->hide();
549     }
550
551     else if (this->diagramGapStem == DIAGRAMGAP20KMH)
552     {
553         ui->labelResult10kmh->show();
554         ui->labelResult20kmh->show();
555         ui->labelResult30kmh->hide();
556         ui->labelResult40kmh->hide();
557         ui->labelResult50kmh->hide();
558         ui->labelResult60kmh->hide();
559         ui->labelResult70kmh->hide();
560         ui->labelResult80kmh->hide();
561         ui->labelResult90kmh->hide();
562         ui->labelResult100kmh->hide();
563     }
564
565     else if (this->diagramGapStem == DIAGRAMGAP30KMH)
566     {
567         ui->labelResult10kmh->show();
568         ui->labelResult20kmh->show();
569         ui->labelResult30kmh->show();
570         ui->labelResult40kmh->hide();
571         ui->labelResult50kmh->hide();
572         ui->labelResult60kmh->hide();
573         ui->labelResult70kmh->hide();
574         ui->labelResult80kmh->hide();
575         ui->labelResult90kmh->hide();
576         ui->labelResult100kmh->hide();
577     }
578
579     else if (this->diagramGapStem == DIAGRAMGAP40KMH)
580     {
581         ui->labelResult10kmh->show();
582         ui->labelResult20kmh->show();
583         ui->labelResult30kmh->show();
584         ui->labelResult40kmh->show();
585         ui->labelResult50kmh->hide();
586         ui->labelResult60kmh->hide();
587         ui->labelResult70kmh->hide();
588         ui->labelResult80kmh->hide();
589         ui->labelResult90kmh->hide();
590         ui->labelResult100kmh->hide();
591     }
592
593     else if (this->diagramGapStem == DIAGRAMGAP50KMH)
594     {
595         ui->labelResult10kmh->show();
596         ui->labelResult20kmh->show();
597         ui->labelResult30kmh->show();
598         ui->labelResult40kmh->show();
599         ui->labelResult50kmh->show();
600         ui->labelResult60kmh->hide();
601         ui->labelResult70kmh->hide();
602         ui->labelResult80kmh->hide();
603         ui->labelResult90kmh->hide();
604         ui->labelResult100kmh->hide();
605     }
606
607     else if (this->diagramGapStem == DIAGRAMGAP60KMH)
608     {
609         ui->labelResult10kmh->show();
610         ui->labelResult20kmh->show();
611         ui->labelResult30kmh->show();
612         ui->labelResult40kmh->show();
613         ui->labelResult50kmh->show();
614         ui->labelResult60kmh->show();
615         ui->labelResult70kmh->hide();
616         ui->labelResult80kmh->hide();
617         ui->labelResult90kmh->hide();
618         ui->labelResult100kmh->hide();
619     }
620
621     else if (this->diagramGapStem == DIAGRAMGAP70KMH)
622     {
623         ui->labelResult10kmh->show();
624         ui->labelResult20kmh->show();
625         ui->labelResult30kmh->show();
626         ui->labelResult40kmh->show();
627         ui->labelResult50kmh->show();
628         ui->labelResult60kmh->show();
629         ui->labelResult70kmh->show();
630         ui->labelResult80kmh->hide();
631         ui->labelResult90kmh->hide();
632         ui->labelResult100kmh->hide();
633     }
634
635     else if (this->diagramGapStem == DIAGRAMGAP80KMH)
636     {
637         ui->labelResult10kmh->show();
638         ui->labelResult20kmh->show();
639         ui->labelResult30kmh->show();
640         ui->labelResult40kmh->show();
641         ui->labelResult50kmh->show();
642         ui->labelResult60kmh->show();
643         ui->labelResult70kmh->show();
644         ui->labelResult80kmh->show();
645         ui->labelResult90kmh->hide();
646         ui->labelResult100kmh->hide();
647     }
648
649     else if (this->diagramGapStem == DIAGRAMGAP90KMH)
650     {
651         ui->labelResult10kmh->show();
652         ui->labelResult20kmh->show();
653         ui->labelResult30kmh->show();
654         ui->labelResult40kmh->show();
655         ui->labelResult50kmh->show();
656         ui->labelResult60kmh->show();
657         ui->labelResult70kmh->show();
658         ui->labelResult80kmh->show();
659         ui->labelResult90kmh->show();
660         ui->labelResult100kmh->hide();
661     }
662
663     else
664     {
665         ui->labelResult10kmh->show();
666         ui->labelResult20kmh->show();
667         ui->labelResult30kmh->show();
668         ui->labelResult40kmh->show();
669         ui->labelResult50kmh->show();
670         ui->labelResult60kmh->show();
671         ui->labelResult70kmh->show();
672         ui->labelResult80kmh->show();
673         ui->labelResult90kmh->show();
674         ui->labelResult100kmh->show();
675     }
676 }
677
678 /**
679   * Checks which target speed has been choosed
680   * @return targetChoice which tells to caller integer value about the target speed
681   * e.g. 20 km/h is value 2 and 60 km/h is value 6
682   */
683 int ResultDialog::getTargetChoice()
684 {
685
686     int targetChoice = 0;
687
688     if (this->diagramGapStem == DIAGRAMGAP10KMH)
689     {
690        targetChoice = 1;
691     }
692
693     else if (this->diagramGapStem == DIAGRAMGAP20KMH)
694     {
695         targetChoice = 2;
696     }
697
698     else if (this->diagramGapStem == DIAGRAMGAP30KMH)
699     {
700         targetChoice = 3;
701     }
702
703     else if (this->diagramGapStem == DIAGRAMGAP40KMH)
704     {
705         targetChoice = 4;
706     }
707
708     else if (this->diagramGapStem == DIAGRAMGAP50KMH)
709     {
710         targetChoice = 5;
711     }
712
713     else if (this->diagramGapStem == DIAGRAMGAP60KMH)
714     {
715         targetChoice = 6;
716     }
717
718     else if (this->diagramGapStem == DIAGRAMGAP70KMH)
719     {
720         targetChoice = 7;
721     }
722
723     else if (this->diagramGapStem == DIAGRAMGAP80KMH)
724     {
725         targetChoice = 8;
726     }
727
728     else if (this->diagramGapStem == DIAGRAMGAP90KMH)
729     {
730         targetChoice = 9;
731     }
732
733     else
734     {
735         targetChoice = 10;
736     }
737     return targetChoice;
738 }