2 * CarMainWindow main class
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
10 #include "resultdialog.h"
11 #include "ui_resultdialog.h"
12 #include "usersettings.h"
17 const int DIAGRAM_WIDTH = 400;
18 const int DIAGRAM_HEIGHT = 300;
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;
31 const int DIAGRAMGAP5S = 80;
32 const int DIAGRAMGAP10S = 40;
33 const int DIAGRAMGAP16S = 25;
34 const int DIAGRAMGAP20S = 20;
36 const QPoint diagramStemStart(70, 330);
37 const QPoint diagramStemEnd(70, 30);
39 const QPoint diagramHorizontalStart(70, 330);
40 const QPoint diagramHorizontalEnd(470, 330);
42 const int diagramGap = 30;
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};
48 // Test point array for the diagram.
52 * Constructor of this class.
53 * @param QWidget pointer to parent object. By default the value is NULL.
55 ResultDialog::ResultDialog(QWidget *parent) :
57 ui(new Ui::ResultDialog)
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++)
74 ui->pushButtonSend->setEnabled(true);
78 ui->pushButtonSend->setEnabled(false);
83 * Destructor of this class. Should be used to release all allocated resources.
85 ResultDialog::~ResultDialog()
90 void ResultDialog::changeEvent(QEvent *e)
92 QDialog::changeEvent(e);
94 case QEvent::LanguageChange:
95 ui->retranslateUi(this);
103 * Draws speed diagram to the UI
106 void ResultDialog::paintEvent(QPaintEvent *)
109 QPainter painter(this);
111 painter.setRenderHint(QPainter::Antialiasing, true);
112 painter.setPen(QPen((Qt::gray),2));
115 font.setPixelSize(12);
116 painter.setFont(font);
117 painter.setBrush(QBrush((Qt::yellow), Qt::SolidPattern));
119 fontForResult.setPixelSize(50);
120 painter.setFont(fontForResult);
121 painter.drawText(diagramStemStart.x() + 50, diagramStemStart.y() - 150, resultString);
122 painter.setFont(font);
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)");
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)");
141 int currentY = diagramStemStart.y();
143 painter.setPen(QPen((Qt::darkCyan),1));
146 // Draws diagram's X-axel
147 while (currentX <= DIAGRAM_WIDTH)
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;
155 currentX = diagramStemStart.x();
159 // Draws diagram's Y-axel
160 while (currentY >= -(DIAGRAM_HEIGHT))
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;
168 painter.setPen(QPen((Qt::red),2));
170 int pointsToShow = 0;
171 bool pointsUnderDiagramWidth = true;
173 for (i = 0; i < 11 ; i++)
175 if (points[i].x() > diagramHorizontalEnd.x())
178 pointsUnderDiagramWidth = false;
183 // Draws result line to the diagram
184 if (pointsUnderDiagramWidth)
186 painter.drawPolyline(points, this->getTargetChoice() + 1);
191 painter.drawPolyline(points, pointsToShow);
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.
200 QPoint ResultDialog::changeMeasuresToDiagramPoint(int aSpeed, qreal aTime)
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;
211 point.setY(diagramStemStart.y()-speedAsPixels);
212 point.setX(diagramStemStart.x()+timeAsPixels);
218 * Sets result times in to the labels.
220 void ResultDialog::setTimesIntoLabels()
222 QString time, timeInteger;
223 timeInteger.setNum(timeArray[4]);
224 time = "0 - 40 km/h: ";
225 time.append(timeInteger);
226 ui->labelResult40kmh->setText(time);
228 timeInteger.setNum(timeArray[3]);
229 time = "0 - 30 km/h: ";
230 time.append(timeInteger);
231 ui->labelResult30kmh->setText(time);
233 timeInteger.setNum(timeArray[2]);
234 time = "0 - 20 km/h: ";
235 time.append(timeInteger);
236 ui->labelResult20kmh->setText(time);
238 timeInteger.setNum(timeArray[1]);
239 time = "0 - 10 km/h: ";
240 time.append(timeInteger);
241 ui->labelResult10kmh->setText(time);
243 timeInteger.setNum(timeArray[6]);
244 time = "0 - 60 km/h: ";
245 time.append(timeInteger);
246 ui->labelResult60kmh->setText(time);
248 timeInteger.setNum(timeArray[5]);
249 time = "0 - 50 km/h: ";
250 time.append(timeInteger);
251 ui->labelResult50kmh->setText(time);
253 timeInteger.setNum(timeArray[7]);
254 time = "0 - 70 km/h: ";
255 time.append(timeInteger);
256 ui->labelResult70kmh->setText(time);
258 timeInteger.setNum(timeArray[8]);
259 time = "0 - 80 km/h: ";
260 time.append(timeInteger);
261 ui->labelResult80kmh->setText(time);
263 timeInteger.setNum(timeArray[9]);
264 time = "0 - 90 km/h: ";
265 time.append(timeInteger);
266 ui->labelResult90kmh->setText(time);
268 timeInteger.setNum(timeArray[10]);
269 time = "0 - 100 km/h: ";
270 time.append(timeInteger);
271 ui->labelResult100kmh->setText(time);
277 * Sets right timeAxelLength value depending the time which
278 * has spent to reach target speed.
280 void ResultDialog::setTimeAxelLength(int pChoice)
282 if (timeArray[pChoice] <= 5.0)
287 else if (timeArray[pChoice] <= 10.0 && timeArray[pChoice] > 5.0)
292 else if (timeArray[pChoice] <= 16.0 && timeArray[pChoice] > 10.0)
304 * This slot function close result dialog when new run -button has been clicked.
306 void ResultDialog::on_pushButtonNew_clicked()
308 for (int i = 0; i < 11; i++)
317 * This slot function emits sendresult signal for sending results to server when
318 * send results -button has been clicked.
319 * Emit accrealtimedialog sendresult.
321 void ResultDialog::on_pushButtonSend_clicked()
324 emit sendresult(timeArray[this->getTargetChoice()]);
327 double ResultDialog::getResult()
329 return timeArray[this->getTargetChoice()];
333 * This public function sets diagram's stem gap
334 * @param pValue is the speed value which determines diagram gap's value
336 void ResultDialog::setEnd(int pValue)
338 for (int i = 0; i < 11; i++)
347 this->diagramGapStem = DIAGRAMGAP10KMH;
351 this->diagramGapStem = DIAGRAMGAP20KMH;
355 this->diagramGapStem = DIAGRAMGAP30KMH;
359 this->diagramGapStem = DIAGRAMGAP40KMH;
363 this->diagramGapStem = DIAGRAMGAP50KMH;
367 this->diagramGapStem = DIAGRAMGAP60KMH;
371 this->diagramGapStem = DIAGRAMGAP70KMH;
375 this->diagramGapStem = DIAGRAMGAP80KMH;
379 this->diagramGapStem = DIAGRAMGAP90KMH;
383 this->diagramGapStem = DIAGRAMGAP100KMH;
387 this->diagramGapStem = DIAGRAMGAP100KMH;
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
397 void ResultDialog::setValue(int pSpeed, double pTime)
402 this->diagramGapHorizontal = DIAGRAMGAP5S;
405 else if (pTime <= 10.0 && pTime > 5.0)
407 this->diagramGapHorizontal = DIAGRAMGAP10S;
410 else if (pTime <= 16.0 && pTime > 10.0)
412 this->diagramGapHorizontal = DIAGRAMGAP16S;
417 this->diagramGapHorizontal = DIAGRAMGAP20S;
423 timeArray[1] = pTime;
426 timeArray[2] = pTime;
429 timeArray[3] = pTime;
432 timeArray[4] = pTime;
435 timeArray[5] = pTime;
438 timeArray[6] = pTime;
441 timeArray[7] = pTime;
444 timeArray[8] = pTime;
447 timeArray[9] = pTime;
450 timeArray[10] = pTime;
454 setTimeAxelLength(getTargetChoice());
456 for (int i = 0; i < 11; i++)
458 points[i] = changeMeasuresToDiagramPoint(speedArray[i], timeArray[i]);
461 setTimesIntoLabels();
466 * Sets dialog's heading and result text
468 void ResultDialog::setHeaders()
470 //QString resultString;
471 resultString.append("Time was ");
475 if (this->diagramGapStem == DIAGRAMGAP100KMH)
477 time.sprintf("%.2f", timeArray[10]);
478 resultString.append(time);
479 this->setWindowTitle("Result for accelerating 100 km/h");
482 else if (this->diagramGapStem == DIAGRAMGAP90KMH)
484 time.sprintf("%.2f", timeArray[9]);
485 resultString.append(time);
486 this->setWindowTitle("Result for accelerating 90 km/h");
489 else if (this->diagramGapStem == DIAGRAMGAP80KMH)
491 time.sprintf("%.2f", timeArray[8]);
492 resultString.append(time);
493 this->setWindowTitle("Result for accelerating 80 km/h");
496 else if (this->diagramGapStem == DIAGRAMGAP70KMH)
498 time.sprintf("%.2f", timeArray[7]);
499 resultString.append(time);
500 this->setWindowTitle("Result for accelerating 70 km/h");
503 else if (this->diagramGapStem == DIAGRAMGAP60KMH)
505 time.sprintf("%.2f", timeArray[6]);
506 resultString.append(time);
507 this->setWindowTitle("Result for accelerating 60 km/h");
510 else if (this->diagramGapStem == DIAGRAMGAP50KMH)
512 time.sprintf("%.2f", timeArray[5]);
513 resultString.append(time);
514 this->setWindowTitle("Result for accelerating 50 km/h");
517 else if (this->diagramGapStem == DIAGRAMGAP40KMH)
519 time.sprintf("%.2f", timeArray[4]);
520 resultString.append(time);
521 this->setWindowTitle("Result for accelerating 40 km/h");
524 else if (this->diagramGapStem == DIAGRAMGAP30KMH)
526 time.sprintf("%.2f", timeArray[3]);
527 resultString.append(time);
528 this->setWindowTitle("Result for accelerating 30 km/h");
531 else if (this->diagramGapStem == DIAGRAMGAP20KMH)
533 time.sprintf("%.2f", timeArray[2]);
534 resultString.append(time);
535 this->setWindowTitle("Result for accelerating 20 km/h");
540 time.sprintf("%.2f", timeArray[1]);
541 resultString.append(time);
542 this->setWindowTitle("Result for accelerating 10 km/h");
547 * Shows only wanted results and hides
550 void ResultDialog::showOrHideLabels()
552 if (this->diagramGapStem == DIAGRAMGAP10KMH)
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();
565 else if (this->diagramGapStem == DIAGRAMGAP20KMH)
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();
579 else if (this->diagramGapStem == DIAGRAMGAP30KMH)
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();
593 else if (this->diagramGapStem == DIAGRAMGAP40KMH)
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();
607 else if (this->diagramGapStem == DIAGRAMGAP50KMH)
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();
621 else if (this->diagramGapStem == DIAGRAMGAP60KMH)
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();
635 else if (this->diagramGapStem == DIAGRAMGAP70KMH)
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();
649 else if (this->diagramGapStem == DIAGRAMGAP80KMH)
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();
663 else if (this->diagramGapStem == DIAGRAMGAP90KMH)
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();
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();
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
697 int ResultDialog::getTargetChoice()
700 int targetChoice = 0;
702 if (this->diagramGapStem == DIAGRAMGAP10KMH)
707 else if (this->diagramGapStem == DIAGRAMGAP20KMH)
712 else if (this->diagramGapStem == DIAGRAMGAP30KMH)
717 else if (this->diagramGapStem == DIAGRAMGAP40KMH)
722 else if (this->diagramGapStem == DIAGRAMGAP50KMH)
727 else if (this->diagramGapStem == DIAGRAMGAP60KMH)
732 else if (this->diagramGapStem == DIAGRAMGAP70KMH)
737 else if (this->diagramGapStem == DIAGRAMGAP80KMH)
742 else if (this->diagramGapStem == DIAGRAMGAP90KMH)
754 void ResultDialog::setLabelInfoToUser(QString infoText)
756 this->ui->labelInfoToUser->setText(infoText);