2 * CarMainWindow main class
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
9 #include "resultdialog.h"
10 #include "ui_resultdialog.h"
11 #include "usersettings.h"
16 const int DIAGRAM_WIDTH = 400;
17 const int DIAGRAM_HEIGHT = 300;
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;
30 const int DIAGRAMGAP5S = 80;
31 const int DIAGRAMGAP10S = 40;
32 const int DIAGRAMGAP20S = 20;
34 const QPoint diagramStemStart(70, 330);
35 const QPoint diagramStemEnd(70, 30);
37 const QPoint diagramHorizontalStart(70, 330);
38 const QPoint diagramHorizontalEnd(470, 330);
40 const int diagramGap = 30;
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};
46 // Test point array for the diagram.
50 * Constructor of this class.
51 * @param QWidget pointer to parent object. By default the value is NULL.
53 ResultDialog::ResultDialog(QWidget *parent) :
55 ui(new Ui::ResultDialog)
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++)
70 ui->pushButtonSend->setEnabled(true);
74 ui->pushButtonSend->setEnabled(false);
79 * Destructor of this class. Should be used to release all allocated resources.
81 ResultDialog::~ResultDialog()
86 void ResultDialog::changeEvent(QEvent *e)
88 QDialog::changeEvent(e);
90 case QEvent::LanguageChange:
91 ui->retranslateUi(this);
99 * Draws speed diagram to the UI
102 void ResultDialog::paintEvent(QPaintEvent *)
105 QPainter painter(this);
107 painter.setRenderHint(QPainter::Antialiasing, true);
108 painter.setPen(QPen((Qt::gray),2));
111 font.setPixelSize(12);
112 painter.setFont(font);
113 painter.setBrush(QBrush((Qt::yellow), Qt::SolidPattern));
115 fontForResult.setPixelSize(50);
116 painter.setFont(fontForResult);
117 painter.drawText(diagramStemStart.x() + 50, diagramStemStart.y() - 150, resultString);
118 painter.setFont(font);
120 painter.setPen(QPen((Qt::darkCyan),2));
121 painter.drawLine(diagramStemStart, diagramStemEnd);
122 painter.drawLine(diagramHorizontalStart, diagramHorizontalEnd);
125 int currentY = diagramStemStart.y();
127 painter.setPen(QPen((Qt::darkCyan),1));
130 // Draws diagram's X-axel
131 while (currentX <= DIAGRAM_WIDTH)
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;
139 currentX = diagramStemStart.x();
143 // Draws diagram's Y-axel
144 while (currentY >= -(DIAGRAM_HEIGHT))
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;
152 painter.setPen(QPen((Qt::red),2));
154 int pointsToShow = 0;
155 bool pointsUnderDiagramWidth = true;
157 for (i = 0; i < 11 ; i++)
159 if (points[i].x() > diagramHorizontalEnd.x())
162 pointsUnderDiagramWidth = false;
167 // Draws result line to the diagram
168 if (pointsUnderDiagramWidth)
170 painter.drawPolyline(points, this->getTargetChoice() + 1);
175 painter.drawPolyline(points, pointsToShow);
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.
184 QPoint ResultDialog::changeMeasuresToDiagramPoint(int aSpeed, qreal aTime)
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;
195 point.setY(diagramStemStart.y()-speedAsPixels);
196 point.setX(diagramStemStart.x()+timeAsPixels);
202 * Sets result times in to the labels.
204 void ResultDialog::setTimesIntoLabels()
206 QString time, timeInteger;
207 timeInteger.setNum(timeArray[4]);
208 time = "0 - 40 km/h: ";
209 time.append(timeInteger);
210 ui->labelResult40kmh->setText(time);
212 timeInteger.setNum(timeArray[3]);
213 time = "0 - 30 km/h: ";
214 time.append(timeInteger);
215 ui->labelResult30kmh->setText(time);
217 timeInteger.setNum(timeArray[2]);
218 time = "0 - 20 km/h: ";
219 time.append(timeInteger);
220 ui->labelResult20kmh->setText(time);
222 timeInteger.setNum(timeArray[1]);
223 time = "0 - 10 km/h: ";
224 time.append(timeInteger);
225 ui->labelResult10kmh->setText(time);
227 timeInteger.setNum(timeArray[6]);
228 time = "0 - 60 km/h: ";
229 time.append(timeInteger);
230 ui->labelResult60kmh->setText(time);
232 timeInteger.setNum(timeArray[5]);
233 time = "0 - 50 km/h: ";
234 time.append(timeInteger);
235 ui->labelResult50kmh->setText(time);
237 timeInteger.setNum(timeArray[7]);
238 time = "0 - 70 km/h: ";
239 time.append(timeInteger);
240 ui->labelResult70kmh->setText(time);
242 timeInteger.setNum(timeArray[8]);
243 time = "0 - 80 km/h: ";
244 time.append(timeInteger);
245 ui->labelResult80kmh->setText(time);
247 timeInteger.setNum(timeArray[9]);
248 time = "0 - 90 km/h: ";
249 time.append(timeInteger);
250 ui->labelResult90kmh->setText(time);
252 timeInteger.setNum(timeArray[10]);
253 time = "0 - 100 km/h: ";
254 time.append(timeInteger);
255 ui->labelResult100kmh->setText(time);
261 * Sets right timeAxelLength value depending the time which
262 * has spent to reach target speed.
264 void ResultDialog::setTimeAxelLength(int pChoice)
266 if (timeArray[pChoice] <= 5)
271 else if (timeArray[pChoice] <= 10)
276 else if (timeArray[pChoice] <= 15)
288 * This slot function close result dialog when new run -button has been clicked.
290 void ResultDialog::on_pushButtonNew_clicked()
292 for (int i = 0; i < 11; i++)
300 * This slot function emits sendresult signal for sending results to server when
301 * send results -button has been clicked.
303 void ResultDialog::on_pushButtonSend_clicked()
305 emit sendresult(timeArray[this->getTargetChoice()]);
309 * This public function sets diagram's stem gap
310 * @param pValue is the speed value which determines diagram gap's value
312 void ResultDialog::setEnd(int pValue)
317 this->diagramGapStem = DIAGRAMGAP10KMH;
321 this->diagramGapStem = DIAGRAMGAP20KMH;
325 this->diagramGapStem = DIAGRAMGAP30KMH;
329 this->diagramGapStem = DIAGRAMGAP40KMH;
333 this->diagramGapStem = DIAGRAMGAP50KMH;
337 this->diagramGapStem = DIAGRAMGAP60KMH;
341 this->diagramGapStem = DIAGRAMGAP70KMH;
345 this->diagramGapStem = DIAGRAMGAP80KMH;
349 this->diagramGapStem = DIAGRAMGAP90KMH;
353 this->diagramGapStem = DIAGRAMGAP100KMH;
357 this->diagramGapStem = DIAGRAMGAP100KMH;
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
367 void ResultDialog::setValue(int pSpeed, double pTime)
370 if (floor(pTime) <= 5)
372 this->diagramGapHorizontal = DIAGRAMGAP5S;
375 else if (floor(pTime) <= 10)
377 this->diagramGapHorizontal = DIAGRAMGAP10S;
382 this->diagramGapHorizontal = DIAGRAMGAP20S;
388 timeArray[1] = pTime;
391 timeArray[2] = pTime;
394 timeArray[3] = pTime;
397 timeArray[4] = pTime;
400 timeArray[5] = pTime;
403 timeArray[6] = pTime;
406 timeArray[7] = pTime;
409 timeArray[8] = pTime;
412 timeArray[9] = pTime;
415 timeArray[10] = pTime;
419 setTimeAxelLength(getTargetChoice());
421 for (int i = 0; i < 11; i++)
423 points[i] = changeMeasuresToDiagramPoint(speedArray[i], timeArray[i]);
426 setTimesIntoLabels();
431 * Sets dialog's heading and result text
433 void ResultDialog::setHeaders()
435 //QString resultString;
436 resultString.append("Time was ");
438 if (this->diagramGapStem == DIAGRAMGAP100KMH)
440 resultString.append(QString::number(timeArray[10]));
441 this->setWindowTitle("Result for accelerating 100 km/h");
444 else if (this->diagramGapStem == DIAGRAMGAP90KMH)
446 resultString.append(QString::number(timeArray[9]));
447 this->setWindowTitle("Result for accelerating 90 km/h");
450 else if (this->diagramGapStem == DIAGRAMGAP80KMH)
452 resultString.append(QString::number(timeArray[8]));
453 this->setWindowTitle("Result for accelerating 80 km/h");
456 else if (this->diagramGapStem == DIAGRAMGAP70KMH)
458 resultString.append(QString::number(timeArray[7]));
459 this->setWindowTitle("Result for accelerating 70 km/h");
462 else if (this->diagramGapStem == DIAGRAMGAP60KMH)
464 resultString.append(QString::number(timeArray[6]));
465 this->setWindowTitle("Result for accelerating 60 km/h");
468 else if (this->diagramGapStem == DIAGRAMGAP50KMH)
470 resultString.append(QString::number(timeArray[5]));
471 this->setWindowTitle("Result for accelerating 50 km/h");
474 else if (this->diagramGapStem == DIAGRAMGAP40KMH)
476 resultString.append(QString::number(timeArray[4]));
477 this->setWindowTitle("Result for accelerating 40 km/h");
480 else if (this->diagramGapStem == DIAGRAMGAP30KMH)
482 resultString.append(QString::number(timeArray[3]));
483 this->setWindowTitle("Result for accelerating 30 km/h");
486 else if (this->diagramGapStem == DIAGRAMGAP20KMH)
488 resultString.append(QString::number(timeArray[2]));
489 this->setWindowTitle("Result for accelerating 20 km/h");
494 resultString.append(QString::number(timeArray[1]));
495 this->setWindowTitle("Result for accelerating 10 km/h");
500 * Shows only wanted results and hides
503 void ResultDialog::showOrHideLabels()
505 if (this->diagramGapStem == DIAGRAMGAP10KMH)
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();
518 else if (this->diagramGapStem == DIAGRAMGAP20KMH)
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();
532 else if (this->diagramGapStem == DIAGRAMGAP30KMH)
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();
546 else if (this->diagramGapStem == DIAGRAMGAP40KMH)
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();
560 else if (this->diagramGapStem == DIAGRAMGAP50KMH)
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();
574 else if (this->diagramGapStem == DIAGRAMGAP60KMH)
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();
588 else if (this->diagramGapStem == DIAGRAMGAP70KMH)
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();
602 else if (this->diagramGapStem == DIAGRAMGAP80KMH)
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();
616 else if (this->diagramGapStem == DIAGRAMGAP90KMH)
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();
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();
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
650 int ResultDialog::getTargetChoice()
653 int targetChoice = 0;
655 if (this->diagramGapStem == DIAGRAMGAP10KMH)
660 else if (this->diagramGapStem == DIAGRAMGAP20KMH)
665 else if (this->diagramGapStem == DIAGRAMGAP30KMH)
670 else if (this->diagramGapStem == DIAGRAMGAP40KMH)
675 else if (this->diagramGapStem == DIAGRAMGAP50KMH)
680 else if (this->diagramGapStem == DIAGRAMGAP60KMH)
685 else if (this->diagramGapStem == DIAGRAMGAP70KMH)
690 else if (this->diagramGapStem == DIAGRAMGAP80KMH)
695 else if (this->diagramGapStem == DIAGRAMGAP90KMH)