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