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