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