Merge branch 'feature/styling'
[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   */
319 void ResultDialog::on_pushButtonSend_clicked()
320 {
321     emit sendresult();
322     //emit sendresult(timeArray[this->getTargetChoice()]);
323 }
324
325 double ResultDialog::getResult()
326 {
327     return timeArray[this->getTargetChoice()];
328 }
329
330 /**
331   * This public function sets diagram's stem gap
332   * @param pValue is the speed value which determines diagram gap's value
333   */
334 void ResultDialog::setEnd(int pValue)
335 {
336     for (int i = 0; i < 11; i++)
337     {
338         timeArray[i] = 0;
339     }
340     resultString = "";
341
342     switch (pValue)
343     {
344     case 10:
345         this->diagramGapStem = DIAGRAMGAP10KMH;
346         break;
347
348     case 20:
349         this->diagramGapStem = DIAGRAMGAP20KMH;
350         break;
351
352     case 30:
353         this->diagramGapStem = DIAGRAMGAP30KMH;
354         break;
355
356     case 40:
357         this->diagramGapStem = DIAGRAMGAP40KMH;
358         break;
359
360     case 50:
361         this->diagramGapStem = DIAGRAMGAP50KMH;
362         break;
363
364     case 60:
365         this->diagramGapStem = DIAGRAMGAP60KMH;
366         break;
367
368     case 70:
369         this->diagramGapStem = DIAGRAMGAP70KMH;
370         break;
371
372     case 80:
373         this->diagramGapStem = DIAGRAMGAP80KMH;
374         break;
375
376     case 90:
377         this->diagramGapStem = DIAGRAMGAP90KMH;
378         break;
379
380     case 100:
381         this->diagramGapStem = DIAGRAMGAP100KMH;
382         break;
383
384     default:
385         this->diagramGapStem = DIAGRAMGAP100KMH;
386         break;
387     }
388 }
389
390 /**
391   * This public function stores time in timeArray
392   * @param pSpeed is the speed value at the time so we know where store time
393   * @param pTime is the result which needs to be store in timeArray
394   */
395 void ResultDialog::setValue(int pSpeed, double pTime)
396 {
397     //timeArray[0] = 0;
398     if (pTime <= 5.0)
399     {
400         this->diagramGapHorizontal = DIAGRAMGAP5S;
401     }
402
403     else if (pTime <= 10.0 && pTime > 5.0)
404     {
405        this->diagramGapHorizontal = DIAGRAMGAP10S;
406     }
407
408     else if (pTime <= 16.0 && pTime > 10.0)
409     {
410         this->diagramGapHorizontal = DIAGRAMGAP16S;
411     }
412
413     else
414     {
415         this->diagramGapHorizontal = DIAGRAMGAP20S;
416     }
417
418     switch (pSpeed)
419     {
420     case 10:
421         timeArray[1] = pTime;
422         break;
423     case 20:
424         timeArray[2] = pTime;
425         break;
426     case 30:
427         timeArray[3] = pTime;
428         break;
429     case 40:
430         timeArray[4] = pTime;
431         break;
432     case 50:
433         timeArray[5] = pTime;
434         break;
435     case 60:
436         timeArray[6] = pTime;
437         break;
438     case 70:
439         timeArray[7] = pTime;
440         break;
441     case 80:
442         timeArray[8] = pTime;
443         break;
444     case 90:
445         timeArray[9] = pTime;
446         break;
447     case 100:
448         timeArray[10] = pTime;
449         break;
450     }
451
452     setTimeAxelLength(getTargetChoice());
453
454     for (int i = 0; i < 11; i++)
455     {
456         points[i] = changeMeasuresToDiagramPoint(speedArray[i], timeArray[i]);
457     }
458
459     setTimesIntoLabels();
460     this->repaint();
461 }
462
463 /**
464   * Sets dialog's heading and result text
465   */
466 void ResultDialog::setHeaders()
467 {
468     //QString resultString;
469     resultString.append("Time was ");
470
471     QString time;
472
473     if (this->diagramGapStem == DIAGRAMGAP100KMH)
474     {
475         time.sprintf("%.2f", timeArray[10]);
476         resultString.append(time);
477         this->setWindowTitle("Result for accelerating 100 km/h");
478     }
479
480     else if (this->diagramGapStem == DIAGRAMGAP90KMH)
481     {
482         time.sprintf("%.2f", timeArray[9]);
483         resultString.append(time);
484         this->setWindowTitle("Result for accelerating 90 km/h");
485     }
486
487     else if (this->diagramGapStem == DIAGRAMGAP80KMH)
488     {
489         time.sprintf("%.2f", timeArray[8]);
490         resultString.append(time);
491         this->setWindowTitle("Result for accelerating 80 km/h");
492     }
493
494     else if (this->diagramGapStem == DIAGRAMGAP70KMH)
495     {
496         time.sprintf("%.2f", timeArray[7]);
497         resultString.append(time);
498         this->setWindowTitle("Result for accelerating 70 km/h");
499     }
500
501     else if (this->diagramGapStem == DIAGRAMGAP60KMH)
502     {
503         time.sprintf("%.2f", timeArray[6]);
504         resultString.append(time);
505         this->setWindowTitle("Result for accelerating 60 km/h");
506     }
507
508     else if (this->diagramGapStem == DIAGRAMGAP50KMH)
509     {
510         time.sprintf("%.2f", timeArray[5]);
511         resultString.append(time);
512         this->setWindowTitle("Result for accelerating 50 km/h");
513     }
514
515     else if (this->diagramGapStem == DIAGRAMGAP40KMH)
516     {
517         time.sprintf("%.2f", timeArray[4]);
518         resultString.append(time);
519         this->setWindowTitle("Result for accelerating 40 km/h");
520     }
521
522     else if (this->diagramGapStem == DIAGRAMGAP30KMH)
523     {
524         time.sprintf("%.2f", timeArray[3]);
525         resultString.append(time);
526         this->setWindowTitle("Result for accelerating 30 km/h");
527     }
528
529     else if (this->diagramGapStem == DIAGRAMGAP20KMH)
530     {
531         time.sprintf("%.2f", timeArray[2]);
532         resultString.append(time);
533         this->setWindowTitle("Result for accelerating 20 km/h");
534     }
535
536     else
537     {
538         time.sprintf("%.2f", timeArray[1]);
539         resultString.append(time);
540         this->setWindowTitle("Result for accelerating 10 km/h");
541     }
542 }
543
544 /**
545   * Shows only wanted results and hides
546   * unwanted
547   */
548 void ResultDialog::showOrHideLabels()
549 {
550     if (this->diagramGapStem == DIAGRAMGAP10KMH)
551     {
552         ui->labelResult20kmh->hide();
553         ui->labelResult30kmh->hide();
554         ui->labelResult40kmh->hide();
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 == DIAGRAMGAP20KMH)
564     {
565         ui->labelResult10kmh->show();
566         ui->labelResult20kmh->show();
567         ui->labelResult30kmh->hide();
568         ui->labelResult40kmh->hide();
569         ui->labelResult50kmh->hide();
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 == DIAGRAMGAP30KMH)
578     {
579         ui->labelResult10kmh->show();
580         ui->labelResult20kmh->show();
581         ui->labelResult30kmh->show();
582         ui->labelResult40kmh->hide();
583         ui->labelResult50kmh->hide();
584         ui->labelResult60kmh->hide();
585         ui->labelResult70kmh->hide();
586         ui->labelResult80kmh->hide();
587         ui->labelResult90kmh->hide();
588         ui->labelResult100kmh->hide();
589     }
590
591     else if (this->diagramGapStem == DIAGRAMGAP40KMH)
592     {
593         ui->labelResult10kmh->show();
594         ui->labelResult20kmh->show();
595         ui->labelResult30kmh->show();
596         ui->labelResult40kmh->show();
597         ui->labelResult50kmh->hide();
598         ui->labelResult60kmh->hide();
599         ui->labelResult70kmh->hide();
600         ui->labelResult80kmh->hide();
601         ui->labelResult90kmh->hide();
602         ui->labelResult100kmh->hide();
603     }
604
605     else if (this->diagramGapStem == DIAGRAMGAP50KMH)
606     {
607         ui->labelResult10kmh->show();
608         ui->labelResult20kmh->show();
609         ui->labelResult30kmh->show();
610         ui->labelResult40kmh->show();
611         ui->labelResult50kmh->show();
612         ui->labelResult60kmh->hide();
613         ui->labelResult70kmh->hide();
614         ui->labelResult80kmh->hide();
615         ui->labelResult90kmh->hide();
616         ui->labelResult100kmh->hide();
617     }
618
619     else if (this->diagramGapStem == DIAGRAMGAP60KMH)
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->hide();
628         ui->labelResult80kmh->hide();
629         ui->labelResult90kmh->hide();
630         ui->labelResult100kmh->hide();
631     }
632
633     else if (this->diagramGapStem == DIAGRAMGAP70KMH)
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->hide();
643         ui->labelResult90kmh->hide();
644         ui->labelResult100kmh->hide();
645     }
646
647     else if (this->diagramGapStem == DIAGRAMGAP80KMH)
648     {
649         ui->labelResult10kmh->show();
650         ui->labelResult20kmh->show();
651         ui->labelResult30kmh->show();
652         ui->labelResult40kmh->show();
653         ui->labelResult50kmh->show();
654         ui->labelResult60kmh->show();
655         ui->labelResult70kmh->show();
656         ui->labelResult80kmh->show();
657         ui->labelResult90kmh->hide();
658         ui->labelResult100kmh->hide();
659     }
660
661     else if (this->diagramGapStem == DIAGRAMGAP90KMH)
662     {
663         ui->labelResult10kmh->show();
664         ui->labelResult20kmh->show();
665         ui->labelResult30kmh->show();
666         ui->labelResult40kmh->show();
667         ui->labelResult50kmh->show();
668         ui->labelResult60kmh->show();
669         ui->labelResult70kmh->show();
670         ui->labelResult80kmh->show();
671         ui->labelResult90kmh->show();
672         ui->labelResult100kmh->hide();
673     }
674
675     else
676     {
677         ui->labelResult10kmh->show();
678         ui->labelResult20kmh->show();
679         ui->labelResult30kmh->show();
680         ui->labelResult40kmh->show();
681         ui->labelResult50kmh->show();
682         ui->labelResult60kmh->show();
683         ui->labelResult70kmh->show();
684         ui->labelResult80kmh->show();
685         ui->labelResult90kmh->show();
686         ui->labelResult100kmh->show();
687     }
688 }
689
690 /**
691   * Checks which target speed has been choosed
692   * @return targetChoice which tells to caller integer value about the target speed
693   * e.g. 20 km/h is value 2 and 60 km/h is value 6
694   */
695 int ResultDialog::getTargetChoice()
696 {
697
698     int targetChoice = 0;
699
700     if (this->diagramGapStem == DIAGRAMGAP10KMH)
701     {
702        targetChoice = 1;
703     }
704
705     else if (this->diagramGapStem == DIAGRAMGAP20KMH)
706     {
707         targetChoice = 2;
708     }
709
710     else if (this->diagramGapStem == DIAGRAMGAP30KMH)
711     {
712         targetChoice = 3;
713     }
714
715     else if (this->diagramGapStem == DIAGRAMGAP40KMH)
716     {
717         targetChoice = 4;
718     }
719
720     else if (this->diagramGapStem == DIAGRAMGAP50KMH)
721     {
722         targetChoice = 5;
723     }
724
725     else if (this->diagramGapStem == DIAGRAMGAP60KMH)
726     {
727         targetChoice = 6;
728     }
729
730     else if (this->diagramGapStem == DIAGRAMGAP70KMH)
731     {
732         targetChoice = 7;
733     }
734
735     else if (this->diagramGapStem == DIAGRAMGAP80KMH)
736     {
737         targetChoice = 8;
738     }
739
740     else if (this->diagramGapStem == DIAGRAMGAP90KMH)
741     {
742         targetChoice = 9;
743     }
744
745     else
746     {
747         targetChoice = 10;
748     }
749     return targetChoice;
750 }