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"
18 const int DIAGRAM_WIDTH = 400;
19 const int DIAGRAM_HEIGHT = 300;
21 const int DIAGRAMGAP10KMH = 300;
22 const int DIAGRAMGAP20KMH = 150;
23 const int DIAGRAMGAP30KMH = 100;
24 const int DIAGRAMGAP40KMH = 75;
25 const int DIAGRAMGAP50KMH = 60;
26 const int DIAGRAMGAP60KMH = 50;
27 const double DIAGRAMGAP70KMH = 42.86;
28 const double DIAGRAMGAP80KMH = 37.5;
29 const double DIAGRAMGAP90KMH = 33.33;
30 const int DIAGRAMGAP100KMH = 30;
32 const int DIAGRAMGAP5S = 80;
33 const int DIAGRAMGAP10S = 40;
34 const int DIAGRAMGAP16S = 25;
35 const int DIAGRAMGAP20S = 20;
37 const QPoint diagramStemStart(70, 330);
38 const QPoint diagramStemEnd(70, 30);
40 const QPoint diagramHorizontalStart(70, 330);
41 const QPoint diagramHorizontalEnd(470, 330);
43 const int diagramGap = 30;
45 // Test arrays for changing speeds and times to the points in diagram
46 static const int speedArray[11] = {0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
47 //static const int timeArray[10] = {1, 2, 3, 4, 5, 6, 7, 8, 10, 12};
49 // Test point array for the diagram.
53 * Constructor of this class.
54 * @param QWidget pointer to parent object. By default the value is NULL.
56 ResultDialog::ResultDialog(QWidget *parent) :
58 ui(new Ui::ResultDialog)
62 helpAccelerationDialog = NULL;
66 speedList << "0" << "10" << "20" << "30" << "40" << "50" << "60" << "70" << "80" << "90" << "100" ;
67 timeList << "0" << "1" << "2" << "3" << "4" << "5" << "6" << "7" << "8" << "9" << "10" << "11"
68 << "12" << "13" << "14" << "15" << "16" << "17" << "18" << "19" << "20";
69 this->diagramGapStem = DIAGRAMGAP100KMH;
70 this->diagramGapHorizontal = DIAGRAMGAP20S;
71 for (int i = 0; i < 11; i++)
77 ui->labelInfoToUser->setText("");
81 ui->pushButtonSend->setEnabled(true);
85 ui->pushButtonSend->setEnabled(false);
86 ui->labelInfoToUser->setText("You're not logged! Please register or log in and accelerate again.");
91 * Destructor of this class. Should be used to release all allocated resources.
93 ResultDialog::~ResultDialog()
98 void ResultDialog::changeEvent(QEvent *e)
100 QDialog::changeEvent(e);
102 case QEvent::LanguageChange:
103 ui->retranslateUi(this);
111 * Draws speed diagram to the UI
114 void ResultDialog::paintEvent(QPaintEvent *)
117 QPainter painter(this);
119 painter.setRenderHint(QPainter::Antialiasing, true);
120 painter.setPen(QPen((Qt::gray),2));
123 font.setPixelSize(12);
124 painter.setFont(font);
125 painter.setBrush(QBrush((Qt::yellow), Qt::SolidPattern));
127 fontForResult.setPixelSize(50);
128 painter.setFont(fontForResult);
129 painter.drawText(diagramStemStart.x() + 50, diagramStemStart.y() - 150, resultString);
130 painter.setFont(font);
132 painter.setPen(QPen((Qt::darkCyan),2));
133 painter.drawLine(diagramStemStart, diagramStemEnd);
134 painter.drawLine(diagramHorizontalStart, diagramHorizontalEnd);
135 painter.drawText(diagramStemStart.x() - 50, diagramStemEnd.y() + 100, "S");
136 painter.drawText(diagramStemStart.x() - 50, diagramStemEnd.y() + 115, "P");
137 painter.drawText(diagramStemStart.x() - 50, diagramStemEnd.y() + 130, "E");
138 painter.drawText(diagramStemStart.x() - 50, diagramStemEnd.y() + 145, "E");
139 painter.drawText(diagramStemStart.x() - 50, diagramStemEnd.y() + 160, "D");
140 painter.drawText(diagramStemStart.x() - 65, diagramStemEnd.y() + 180, "(km/h)");
142 painter.drawText(diagramStemStart.x() + 140, diagramStemStart.y() + 40, "T");
143 painter.drawText(diagramStemStart.x() + 150, diagramStemStart.y() + 40, "I");
144 painter.drawText(diagramStemStart.x() + 155, diagramStemStart.y() + 40, "M");
145 painter.drawText(diagramStemStart.x() + 165, diagramStemStart.y() + 40, "E");
146 painter.drawText(diagramStemStart.x() + 180, diagramStemStart.y() + 40, "(s)");
149 int currentY = diagramStemStart.y();
151 painter.setPen(QPen((Qt::darkCyan),1));
154 // Draws diagram's X-axel
155 while (currentX <= DIAGRAM_WIDTH)
157 painter.drawLine(currentX + diagramStemStart.x(), currentY, currentX + diagramStemStart.x(), currentY - 300);
158 painter.drawText(currentX + diagramStemStart.x() - 3, currentY + 20, timeList[i]);
159 currentX += this->diagramGapHorizontal;
163 currentX = diagramStemStart.x();
167 // Draws diagram's Y-axel
168 while (currentY >= -(DIAGRAM_HEIGHT))
170 painter.drawLine(currentX, diagramStemStart.y() + currentY, currentX+400, diagramStemStart.y() + currentY);
171 painter.drawText(currentX - 25, diagramStemStart.y() + currentY + 3, speedList[i]);
172 currentY -= this->diagramGapStem;
176 painter.setPen(QPen((Qt::red),2));
178 int pointsToShow = 0;
179 bool pointsUnderDiagramWidth = true;
181 for (i = 0; i < 11 ; i++)
183 if (points[i].x() > diagramHorizontalEnd.x())
186 pointsUnderDiagramWidth = false;
191 // Draws result line to the diagram
192 if (pointsUnderDiagramWidth)
194 painter.drawPolyline(points, this->getTargetChoice() + 1);
199 painter.drawPolyline(points, pointsToShow);
204 * Change the given speed and time to the point for the diagram.
205 * @param aSpeed is speed which need to change, aTime is time in seconds which need to change.
206 * @return point is calculated from aSpeed and aTime.
208 QPoint ResultDialog::changeMeasuresToDiagramPoint(int aSpeed, qreal aTime)
215 // Calculate speed and time to the point which can be drawn to the diagram
216 speedAsPixels = (DIAGRAM_HEIGHT*aSpeed) / (this->getTargetChoice() * 10);
217 timeAsPixels = DIAGRAM_WIDTH*aTime/timeAxelLength;
219 point.setY(diagramStemStart.y()-speedAsPixels);
220 point.setX(diagramStemStart.x()+timeAsPixels);
226 * Sets result times in to the labels.
228 void ResultDialog::setTimesIntoLabels()
230 QString time, timeInteger;
231 timeInteger.setNum(timeArray[4]);
232 time = "0 - 40 km/h: ";
233 time.append(timeInteger);
234 ui->labelResult40kmh->setText(time);
236 timeInteger.setNum(timeArray[3]);
237 time = "0 - 30 km/h: ";
238 time.append(timeInteger);
239 ui->labelResult30kmh->setText(time);
241 timeInteger.setNum(timeArray[2]);
242 time = "0 - 20 km/h: ";
243 time.append(timeInteger);
244 ui->labelResult20kmh->setText(time);
246 timeInteger.setNum(timeArray[1]);
247 time = "0 - 10 km/h: ";
248 time.append(timeInteger);
249 ui->labelResult10kmh->setText(time);
251 timeInteger.setNum(timeArray[6]);
252 time = "0 - 60 km/h: ";
253 time.append(timeInteger);
254 ui->labelResult60kmh->setText(time);
256 timeInteger.setNum(timeArray[5]);
257 time = "0 - 50 km/h: ";
258 time.append(timeInteger);
259 ui->labelResult50kmh->setText(time);
261 timeInteger.setNum(timeArray[7]);
262 time = "0 - 70 km/h: ";
263 time.append(timeInteger);
264 ui->labelResult70kmh->setText(time);
266 timeInteger.setNum(timeArray[8]);
267 time = "0 - 80 km/h: ";
268 time.append(timeInteger);
269 ui->labelResult80kmh->setText(time);
271 timeInteger.setNum(timeArray[9]);
272 time = "0 - 90 km/h: ";
273 time.append(timeInteger);
274 ui->labelResult90kmh->setText(time);
276 timeInteger.setNum(timeArray[10]);
277 time = "0 - 100 km/h: ";
278 time.append(timeInteger);
279 ui->labelResult100kmh->setText(time);
285 * Sets right timeAxelLength value depending the time which
286 * has spent to reach target speed.
288 void ResultDialog::setTimeAxelLength(int pChoice)
290 if (timeArray[pChoice] <= 5.0)
295 else if (timeArray[pChoice] <= 10.0 && timeArray[pChoice] > 5.0)
300 else if (timeArray[pChoice] <= 16.0 && timeArray[pChoice] > 10.0)
312 * This slot function close result dialog when new run -button has been clicked.
314 void ResultDialog::on_pushButtonNew_clicked()
316 for (int i = 0; i < 11; i++)
326 * This slot function emits sendresult signal for sending results to server when
327 * send results -button has been clicked.
328 * Emit accrealtimedialog sendresult.
330 void ResultDialog::on_pushButtonSend_clicked()
332 ui->pushButtonSend->setEnabled(false);
333 emit sendresult(timeArray[this->getTargetChoice()]);
336 double ResultDialog::getResult()
338 return timeArray[this->getTargetChoice()];
342 * This public function sets diagram's stem gap
343 * @param pValue is the speed value which determines diagram gap's value
345 void ResultDialog::setEnd(int pValue)
347 for (int i = 0; i < 11; i++)
356 this->diagramGapStem = DIAGRAMGAP10KMH;
360 this->diagramGapStem = DIAGRAMGAP20KMH;
364 this->diagramGapStem = DIAGRAMGAP30KMH;
368 this->diagramGapStem = DIAGRAMGAP40KMH;
372 this->diagramGapStem = DIAGRAMGAP50KMH;
376 this->diagramGapStem = DIAGRAMGAP60KMH;
380 this->diagramGapStem = DIAGRAMGAP70KMH;
384 this->diagramGapStem = DIAGRAMGAP80KMH;
388 this->diagramGapStem = DIAGRAMGAP90KMH;
392 this->diagramGapStem = DIAGRAMGAP100KMH;
396 this->diagramGapStem = DIAGRAMGAP100KMH;
402 * This public function stores time in timeArray
403 * @param pSpeed is the speed value at the time so we know where store time
404 * @param pTime is the result which needs to be store in timeArray
406 void ResultDialog::setValue(int pSpeed, double pTime)
411 this->diagramGapHorizontal = DIAGRAMGAP5S;
414 else if (pTime <= 10.0 && pTime > 5.0)
416 this->diagramGapHorizontal = DIAGRAMGAP10S;
419 else if (pTime <= 16.0 && pTime > 10.0)
421 this->diagramGapHorizontal = DIAGRAMGAP16S;
426 this->diagramGapHorizontal = DIAGRAMGAP20S;
432 timeArray[1] = pTime;
435 timeArray[2] = pTime;
438 timeArray[3] = pTime;
441 timeArray[4] = pTime;
444 timeArray[5] = pTime;
447 timeArray[6] = pTime;
450 timeArray[7] = pTime;
453 timeArray[8] = pTime;
456 timeArray[9] = pTime;
459 timeArray[10] = pTime;
463 setTimeAxelLength(getTargetChoice());
465 for (int i = 0; i < 11; i++)
467 points[i] = changeMeasuresToDiagramPoint(speedArray[i], timeArray[i]);
470 setTimesIntoLabels();
475 * Sets dialog's heading and result text
477 void ResultDialog::setHeaders()
479 //QString resultString;
480 resultString.append("Time was ");
484 if (this->diagramGapStem == DIAGRAMGAP100KMH)
486 time.sprintf("%.2f", timeArray[10]);
487 resultString.append(time);
488 this->setWindowTitle("Result for accelerating 100 km/h");
491 else if (this->diagramGapStem == DIAGRAMGAP90KMH)
493 time.sprintf("%.2f", timeArray[9]);
494 resultString.append(time);
495 this->setWindowTitle("Result for accelerating 90 km/h");
498 else if (this->diagramGapStem == DIAGRAMGAP80KMH)
500 time.sprintf("%.2f", timeArray[8]);
501 resultString.append(time);
502 this->setWindowTitle("Result for accelerating 80 km/h");
505 else if (this->diagramGapStem == DIAGRAMGAP70KMH)
507 time.sprintf("%.2f", timeArray[7]);
508 resultString.append(time);
509 this->setWindowTitle("Result for accelerating 70 km/h");
512 else if (this->diagramGapStem == DIAGRAMGAP60KMH)
514 time.sprintf("%.2f", timeArray[6]);
515 resultString.append(time);
516 this->setWindowTitle("Result for accelerating 60 km/h");
519 else if (this->diagramGapStem == DIAGRAMGAP50KMH)
521 time.sprintf("%.2f", timeArray[5]);
522 resultString.append(time);
523 this->setWindowTitle("Result for accelerating 50 km/h");
526 else if (this->diagramGapStem == DIAGRAMGAP40KMH)
528 time.sprintf("%.2f", timeArray[4]);
529 resultString.append(time);
530 this->setWindowTitle("Result for accelerating 40 km/h");
533 else if (this->diagramGapStem == DIAGRAMGAP30KMH)
535 time.sprintf("%.2f", timeArray[3]);
536 resultString.append(time);
537 this->setWindowTitle("Result for accelerating 30 km/h");
540 else if (this->diagramGapStem == DIAGRAMGAP20KMH)
542 time.sprintf("%.2f", timeArray[2]);
543 resultString.append(time);
544 this->setWindowTitle("Result for accelerating 20 km/h");
549 time.sprintf("%.2f", timeArray[1]);
550 resultString.append(time);
551 this->setWindowTitle("Result for accelerating 10 km/h");
556 * Shows only wanted results and hides
559 void ResultDialog::showOrHideLabels()
561 if (this->diagramGapStem == DIAGRAMGAP10KMH)
563 ui->labelResult20kmh->hide();
564 ui->labelResult30kmh->hide();
565 ui->labelResult40kmh->hide();
566 ui->labelResult50kmh->hide();
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 == DIAGRAMGAP20KMH)
576 ui->labelResult10kmh->show();
577 ui->labelResult20kmh->show();
578 ui->labelResult30kmh->hide();
579 ui->labelResult40kmh->hide();
580 ui->labelResult50kmh->hide();
581 ui->labelResult60kmh->hide();
582 ui->labelResult70kmh->hide();
583 ui->labelResult80kmh->hide();
584 ui->labelResult90kmh->hide();
585 ui->labelResult100kmh->hide();
588 else if (this->diagramGapStem == DIAGRAMGAP30KMH)
590 ui->labelResult10kmh->show();
591 ui->labelResult20kmh->show();
592 ui->labelResult30kmh->show();
593 ui->labelResult40kmh->hide();
594 ui->labelResult50kmh->hide();
595 ui->labelResult60kmh->hide();
596 ui->labelResult70kmh->hide();
597 ui->labelResult80kmh->hide();
598 ui->labelResult90kmh->hide();
599 ui->labelResult100kmh->hide();
602 else if (this->diagramGapStem == DIAGRAMGAP40KMH)
604 ui->labelResult10kmh->show();
605 ui->labelResult20kmh->show();
606 ui->labelResult30kmh->show();
607 ui->labelResult40kmh->show();
608 ui->labelResult50kmh->hide();
609 ui->labelResult60kmh->hide();
610 ui->labelResult70kmh->hide();
611 ui->labelResult80kmh->hide();
612 ui->labelResult90kmh->hide();
613 ui->labelResult100kmh->hide();
616 else if (this->diagramGapStem == DIAGRAMGAP50KMH)
618 ui->labelResult10kmh->show();
619 ui->labelResult20kmh->show();
620 ui->labelResult30kmh->show();
621 ui->labelResult40kmh->show();
622 ui->labelResult50kmh->show();
623 ui->labelResult60kmh->hide();
624 ui->labelResult70kmh->hide();
625 ui->labelResult80kmh->hide();
626 ui->labelResult90kmh->hide();
627 ui->labelResult100kmh->hide();
630 else if (this->diagramGapStem == DIAGRAMGAP60KMH)
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->hide();
639 ui->labelResult80kmh->hide();
640 ui->labelResult90kmh->hide();
641 ui->labelResult100kmh->hide();
644 else if (this->diagramGapStem == DIAGRAMGAP70KMH)
646 ui->labelResult10kmh->show();
647 ui->labelResult20kmh->show();
648 ui->labelResult30kmh->show();
649 ui->labelResult40kmh->show();
650 ui->labelResult50kmh->show();
651 ui->labelResult60kmh->show();
652 ui->labelResult70kmh->show();
653 ui->labelResult80kmh->hide();
654 ui->labelResult90kmh->hide();
655 ui->labelResult100kmh->hide();
658 else if (this->diagramGapStem == DIAGRAMGAP80KMH)
660 ui->labelResult10kmh->show();
661 ui->labelResult20kmh->show();
662 ui->labelResult30kmh->show();
663 ui->labelResult40kmh->show();
664 ui->labelResult50kmh->show();
665 ui->labelResult60kmh->show();
666 ui->labelResult70kmh->show();
667 ui->labelResult80kmh->show();
668 ui->labelResult90kmh->hide();
669 ui->labelResult100kmh->hide();
672 else if (this->diagramGapStem == DIAGRAMGAP90KMH)
674 ui->labelResult10kmh->show();
675 ui->labelResult20kmh->show();
676 ui->labelResult30kmh->show();
677 ui->labelResult40kmh->show();
678 ui->labelResult50kmh->show();
679 ui->labelResult60kmh->show();
680 ui->labelResult70kmh->show();
681 ui->labelResult80kmh->show();
682 ui->labelResult90kmh->show();
683 ui->labelResult100kmh->hide();
688 ui->labelResult10kmh->show();
689 ui->labelResult20kmh->show();
690 ui->labelResult30kmh->show();
691 ui->labelResult40kmh->show();
692 ui->labelResult50kmh->show();
693 ui->labelResult60kmh->show();
694 ui->labelResult70kmh->show();
695 ui->labelResult80kmh->show();
696 ui->labelResult90kmh->show();
697 ui->labelResult100kmh->show();
702 * Checks which target speed has been choosed
703 * @return targetChoice which tells to caller integer value about the target speed
704 * e.g. 20 km/h is value 2 and 60 km/h is value 6
706 int ResultDialog::getTargetChoice()
709 int targetChoice = 0;
711 if (this->diagramGapStem == DIAGRAMGAP10KMH)
716 else if (this->diagramGapStem == DIAGRAMGAP20KMH)
721 else if (this->diagramGapStem == DIAGRAMGAP30KMH)
726 else if (this->diagramGapStem == DIAGRAMGAP40KMH)
731 else if (this->diagramGapStem == DIAGRAMGAP50KMH)
736 else if (this->diagramGapStem == DIAGRAMGAP60KMH)
741 else if (this->diagramGapStem == DIAGRAMGAP70KMH)
746 else if (this->diagramGapStem == DIAGRAMGAP80KMH)
751 else if (this->diagramGapStem == DIAGRAMGAP90KMH)
763 void ResultDialog::setLabelInfoToUser(QString infoText)
765 this->ui->labelInfoToUser->setText(infoText);
769 * This function enable send server button.
771 void ResultDialog::setSendServerButtonEnabled()
773 ui->pushButtonSend->setEnabled(true);
777 * This slot function called when ever info button clicked.
779 void ResultDialog::on_pushButtonInfo_clicked()
781 if(!helpAccelerationDialog)
783 helpAccelerationDialog = new HelpAccelerationDialog;
785 connect(helpAccelerationDialog, SIGNAL(rejected()), this, SLOT(killHelpDialog()));
786 helpAccelerationDialog->show();
790 * This slot function called when ever dialog rejected.
792 void ResultDialog::killHelpDialog()
794 if(helpAccelerationDialog)
796 qDebug() << "__Result kill: helpAccelerationDialog";
797 delete helpAccelerationDialog;
798 helpAccelerationDialog = NULL;