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