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 #include <QDesktopServices>
20 const int DIAGRAM_WIDTH = 400;
21 const int DIAGRAM_HEIGHT = 300;
23 const int DIAGRAMGAP10KMH = 300;
24 const int DIAGRAMGAP20KMH = 150;
25 const int DIAGRAMGAP30KMH = 100;
26 const int DIAGRAMGAP40KMH = 75;
27 const int DIAGRAMGAP50KMH = 60;
28 const int DIAGRAMGAP60KMH = 50;
29 const double DIAGRAMGAP70KMH = 42.86;
30 const double DIAGRAMGAP80KMH = 37.5;
31 const double DIAGRAMGAP90KMH = 33.33;
32 const int DIAGRAMGAP100KMH = 30;
34 const int DIAGRAMGAP5S = 80;
35 const int DIAGRAMGAP10S = 40;
36 const int DIAGRAMGAP16S = 25;
37 const int DIAGRAMGAP20S = 20;
39 const QPoint diagramStemStart(70, 330);
40 const QPoint diagramStemEnd(70, 30);
42 const QPoint diagramHorizontalStart(70, 330);
43 const QPoint diagramHorizontalEnd(470, 330);
45 const int diagramGap = 30;
47 // Test arrays for changing speeds and times to the points in diagram
48 static const int speedArray[11] = {0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
49 //static const int timeArray[10] = {1, 2, 3, 4, 5, 6, 7, 8, 10, 12};
51 // Test point array for the diagram.
55 * Constructor of this class.
56 * @param QWidget pointer to parent object. By default the value is NULL.
58 ResultDialog::ResultDialog(QWidget *parent) :
60 ui(new Ui::ResultDialog)
64 helpAccelerationDialog = NULL;
68 speedList << "0" << "10" << "20" << "30" << "40" << "50" << "60" << "70" << "80" << "90" << "100" ;
69 timeList << "0" << "1" << "2" << "3" << "4" << "5" << "6" << "7" << "8" << "9" << "10" << "11"
70 << "12" << "13" << "14" << "15" << "16" << "17" << "18" << "19" << "20";
71 this->diagramGapStem = DIAGRAMGAP100KMH;
72 this->diagramGapHorizontal = DIAGRAMGAP20S;
73 for (int i = 0; i < 11; i++)
79 ui->labelInfoToUser->setText("");
83 ui->pushButtonSend->setEnabled(true);
87 ui->pushButtonSend->setEnabled(false);
88 ui->labelInfoToUser->setText("You're not logged! Please register or log in and accelerate again.");
93 * Destructor of this class. Should be used to release all allocated resources.
95 ResultDialog::~ResultDialog()
100 void ResultDialog::changeEvent(QEvent *e)
102 QDialog::changeEvent(e);
104 case QEvent::LanguageChange:
105 ui->retranslateUi(this);
113 * Draws speed diagram to the UI
116 void ResultDialog::paintEvent(QPaintEvent *)
119 //Create Pixmap, where image will be draw
120 QPixmap image(ui->scrollArea->width(), ui->scrollArea->height()/*DIAGRAM_WIDTH+100, DIAGRAM_HEIGHT+70*/);
122 //Create painter and give paramemeter where image will be draw
123 QPainter painter(&image);
124 painter.setPen(Qt::white);
125 painter.setBrush(Qt::white);
126 painter.drawRect(QRect(0, 0, ui->scrollArea->width(), ui->scrollArea->height()/*DIAGRAM_WIDTH+100, DIAGRAM_HEIGHT+70*/));
129 painter.setRenderHint(QPainter::Antialiasing, true);
130 painter.setPen(QPen((Qt::gray),2));
133 font.setPixelSize(12);
134 painter.setFont(font);
135 painter.setBrush(QBrush((Qt::yellow), Qt::SolidPattern));
137 fontForResult.setPixelSize(50);
138 painter.setFont(fontForResult);
139 painter.drawText(diagramStemStart.x() + 30, diagramStemStart.y() - 150, resultString);
140 painter.setFont(font);
142 painter.setPen(QPen((Qt::darkCyan),2));
143 painter.drawLine(diagramStemStart, diagramStemEnd);
144 painter.drawLine(diagramHorizontalStart, diagramHorizontalEnd);
145 painter.drawText(diagramStemStart.x() - 50, diagramStemEnd.y() + 100, "S");
146 painter.drawText(diagramStemStart.x() - 50, diagramStemEnd.y() + 115, "P");
147 painter.drawText(diagramStemStart.x() - 50, diagramStemEnd.y() + 130, "E");
148 painter.drawText(diagramStemStart.x() - 50, diagramStemEnd.y() + 145, "E");
149 painter.drawText(diagramStemStart.x() - 50, diagramStemEnd.y() + 160, "D");
150 painter.drawText(diagramStemStart.x() - 65, diagramStemEnd.y() + 180, "(km/h)");
152 painter.drawText(diagramStemStart.x() + 140, diagramStemStart.y() + 40, "T");
153 painter.drawText(diagramStemStart.x() + 150, diagramStemStart.y() + 40, "I");
154 painter.drawText(diagramStemStart.x() + 155, diagramStemStart.y() + 40, "M");
155 painter.drawText(diagramStemStart.x() + 165, diagramStemStart.y() + 40, "E");
156 painter.drawText(diagramStemStart.x() + 180, diagramStemStart.y() + 40, "(s)");
159 int currentY = diagramStemStart.y();
161 painter.setPen(QPen((Qt::darkCyan),1));
164 // Draws diagram's X-axel
165 while (currentX <= DIAGRAM_WIDTH)
167 painter.drawLine(currentX + diagramStemStart.x(), currentY, currentX + diagramStemStart.x(), currentY - 300);
168 painter.drawText(currentX + diagramStemStart.x() - 3, currentY + 20, timeList[i]);
169 currentX += this->diagramGapHorizontal;
173 currentX = diagramStemStart.x();
177 // Draws diagram's Y-axel
178 while (currentY >= -(DIAGRAM_HEIGHT))
180 painter.drawLine(currentX, diagramStemStart.y() + currentY, currentX+400, diagramStemStart.y() + currentY);
181 painter.drawText(currentX - 25, diagramStemStart.y() + currentY + 3, speedList[i]);
182 currentY -= this->diagramGapStem;
186 painter.setPen(QPen((Qt::red),2));
188 int pointsToShow = 0;
189 bool pointsUnderDiagramWidth = true;
191 for (i = 0; i < 11 ; i++)
193 if (points[i].x() > diagramHorizontalEnd.x())
196 pointsUnderDiagramWidth = false;
201 // Draws result line to the diagram
202 if (pointsUnderDiagramWidth)
204 painter.drawPolyline(points, this->getTargetChoice() + 1);
209 painter.drawPolyline(points, pointsToShow);
211 //Save image in file acceleration.png
212 image.save("acceleration.png", 0, -1);
215 QLabel *imageLabel = new QLabel(this);
217 //Set image pixmap to label
218 imageLabel->setPixmap(image);
220 //Set image label to scrollArea
221 ui->scrollArea->setWidget(imageLabel);
226 * Change the given speed and time to the point for the diagram.
227 * @param aSpeed is speed which need to change, aTime is time in seconds which need to change.
228 * @return point is calculated from aSpeed and aTime.
230 QPoint ResultDialog::changeMeasuresToDiagramPoint(int aSpeed, qreal aTime)
237 // Calculate speed and time to the point which can be drawn to the diagram
238 speedAsPixels = (DIAGRAM_HEIGHT*aSpeed) / (this->getTargetChoice() * 10);
239 timeAsPixels = DIAGRAM_WIDTH*aTime/timeAxelLength;
241 point.setY(diagramStemStart.y()-speedAsPixels);
242 point.setX(diagramStemStart.x()+timeAsPixels);
248 * Sets result times in to the labels.
250 void ResultDialog::setTimesIntoLabels()
252 QString time, timeInteger;
253 timeInteger.setNum(timeArray[4]);
254 time = "0 - 40 km/h: ";
255 time.append(timeInteger);
256 ui->labelResult40kmh->setText(time);
258 timeInteger.setNum(timeArray[3]);
259 time = "0 - 30 km/h: ";
260 time.append(timeInteger);
261 ui->labelResult30kmh->setText(time);
263 timeInteger.setNum(timeArray[2]);
264 time = "0 - 20 km/h: ";
265 time.append(timeInteger);
266 ui->labelResult20kmh->setText(time);
268 timeInteger.setNum(timeArray[1]);
269 time = "0 - 10 km/h: ";
270 time.append(timeInteger);
271 ui->labelResult10kmh->setText(time);
273 timeInteger.setNum(timeArray[6]);
274 time = "0 - 60 km/h: ";
275 time.append(timeInteger);
276 ui->labelResult60kmh->setText(time);
278 timeInteger.setNum(timeArray[5]);
279 time = "0 - 50 km/h: ";
280 time.append(timeInteger);
281 ui->labelResult50kmh->setText(time);
283 timeInteger.setNum(timeArray[7]);
284 time = "0 - 70 km/h: ";
285 time.append(timeInteger);
286 ui->labelResult70kmh->setText(time);
288 timeInteger.setNum(timeArray[8]);
289 time = "0 - 80 km/h: ";
290 time.append(timeInteger);
291 ui->labelResult80kmh->setText(time);
293 timeInteger.setNum(timeArray[9]);
294 time = "0 - 90 km/h: ";
295 time.append(timeInteger);
296 ui->labelResult90kmh->setText(time);
298 timeInteger.setNum(timeArray[10]);
299 time = "0 - 100 km/h: ";
300 time.append(timeInteger);
301 ui->labelResult100kmh->setText(time);
307 * Sets right timeAxelLength value depending the time which
308 * has spent to reach target speed.
310 void ResultDialog::setTimeAxelLength(int pChoice)
312 if (timeArray[pChoice] <= 5.0)
317 else if (timeArray[pChoice] <= 10.0 && timeArray[pChoice] > 5.0)
322 else if (timeArray[pChoice] <= 16.0 && timeArray[pChoice] > 10.0)
334 * This slot function close result dialog when new run -button has been clicked.
336 void ResultDialog::on_pushButtonNew_clicked()
338 for (int i = 0; i < 11; i++)
348 * This slot function emits sendresult signal for sending results to server when
349 * send results -button has been clicked.
350 * Emit accrealtimedialog sendresult.
352 void ResultDialog::on_pushButtonSend_clicked()
354 ui->pushButtonSend->setEnabled(false);
355 emit sendresult(timeArray[this->getTargetChoice()]);
358 double ResultDialog::getResult()
360 return timeArray[this->getTargetChoice()];
364 * This public function sets diagram's stem gap
365 * @param pValue is the speed value which determines diagram gap's value
367 void ResultDialog::setEnd(int pValue)
369 for (int i = 0; i < 11; i++)
378 this->diagramGapStem = DIAGRAMGAP10KMH;
382 this->diagramGapStem = DIAGRAMGAP20KMH;
386 this->diagramGapStem = DIAGRAMGAP30KMH;
390 this->diagramGapStem = DIAGRAMGAP40KMH;
394 this->diagramGapStem = DIAGRAMGAP50KMH;
398 this->diagramGapStem = DIAGRAMGAP60KMH;
402 this->diagramGapStem = DIAGRAMGAP70KMH;
406 this->diagramGapStem = DIAGRAMGAP80KMH;
410 this->diagramGapStem = DIAGRAMGAP90KMH;
414 this->diagramGapStem = DIAGRAMGAP100KMH;
418 this->diagramGapStem = DIAGRAMGAP100KMH;
424 * This public function stores time in timeArray
425 * @param pSpeed is the speed value at the time so we know where store time
426 * @param pTime is the result which needs to be store in timeArray
428 void ResultDialog::setValue(int pSpeed, double pTime)
433 this->diagramGapHorizontal = DIAGRAMGAP5S;
436 else if (pTime <= 10.0 && pTime > 5.0)
438 this->diagramGapHorizontal = DIAGRAMGAP10S;
441 else if (pTime <= 16.0 && pTime > 10.0)
443 this->diagramGapHorizontal = DIAGRAMGAP16S;
448 this->diagramGapHorizontal = DIAGRAMGAP20S;
454 timeArray[1] = pTime;
457 timeArray[2] = pTime;
460 timeArray[3] = pTime;
463 timeArray[4] = pTime;
466 timeArray[5] = pTime;
469 timeArray[6] = pTime;
472 timeArray[7] = pTime;
475 timeArray[8] = pTime;
478 timeArray[9] = pTime;
481 timeArray[10] = pTime;
485 setTimeAxelLength(getTargetChoice());
487 for (int i = 0; i < 11; i++)
489 points[i] = changeMeasuresToDiagramPoint(speedArray[i], timeArray[i]);
492 setTimesIntoLabels();
497 * Sets dialog's heading and result text
499 void ResultDialog::setHeaders()
501 //QString resultString;
502 resultString.append("Time was ");
506 if (this->diagramGapStem == DIAGRAMGAP100KMH)
508 time.sprintf("%.2f", timeArray[10]);
509 resultString.append(time);
510 this->setWindowTitle("Result for accelerating 100 km/h");
513 else if (this->diagramGapStem == DIAGRAMGAP90KMH)
515 time.sprintf("%.2f", timeArray[9]);
516 resultString.append(time);
517 this->setWindowTitle("Result for accelerating 90 km/h");
520 else if (this->diagramGapStem == DIAGRAMGAP80KMH)
522 time.sprintf("%.2f", timeArray[8]);
523 resultString.append(time);
524 this->setWindowTitle("Result for accelerating 80 km/h");
527 else if (this->diagramGapStem == DIAGRAMGAP70KMH)
529 time.sprintf("%.2f", timeArray[7]);
530 resultString.append(time);
531 this->setWindowTitle("Result for accelerating 70 km/h");
534 else if (this->diagramGapStem == DIAGRAMGAP60KMH)
536 time.sprintf("%.2f", timeArray[6]);
537 resultString.append(time);
538 this->setWindowTitle("Result for accelerating 60 km/h");
541 else if (this->diagramGapStem == DIAGRAMGAP50KMH)
543 time.sprintf("%.2f", timeArray[5]);
544 resultString.append(time);
545 this->setWindowTitle("Result for accelerating 50 km/h");
548 else if (this->diagramGapStem == DIAGRAMGAP40KMH)
550 time.sprintf("%.2f", timeArray[4]);
551 resultString.append(time);
552 this->setWindowTitle("Result for accelerating 40 km/h");
555 else if (this->diagramGapStem == DIAGRAMGAP30KMH)
557 time.sprintf("%.2f", timeArray[3]);
558 resultString.append(time);
559 this->setWindowTitle("Result for accelerating 30 km/h");
562 else if (this->diagramGapStem == DIAGRAMGAP20KMH)
564 time.sprintf("%.2f", timeArray[2]);
565 resultString.append(time);
566 this->setWindowTitle("Result for accelerating 20 km/h");
571 time.sprintf("%.2f", timeArray[1]);
572 resultString.append(time);
573 this->setWindowTitle("Result for accelerating 10 km/h");
578 * Shows only wanted results and hides
581 void ResultDialog::showOrHideLabels()
583 if (this->diagramGapStem == DIAGRAMGAP10KMH)
585 ui->labelResult20kmh->hide();
586 ui->labelResult30kmh->hide();
587 ui->labelResult40kmh->hide();
588 ui->labelResult50kmh->hide();
589 ui->labelResult60kmh->hide();
590 ui->labelResult70kmh->hide();
591 ui->labelResult80kmh->hide();
592 ui->labelResult90kmh->hide();
593 ui->labelResult100kmh->hide();
596 else if (this->diagramGapStem == DIAGRAMGAP20KMH)
598 ui->labelResult10kmh->show();
599 ui->labelResult20kmh->show();
600 ui->labelResult30kmh->hide();
601 ui->labelResult40kmh->hide();
602 ui->labelResult50kmh->hide();
603 ui->labelResult60kmh->hide();
604 ui->labelResult70kmh->hide();
605 ui->labelResult80kmh->hide();
606 ui->labelResult90kmh->hide();
607 ui->labelResult100kmh->hide();
610 else if (this->diagramGapStem == DIAGRAMGAP30KMH)
612 ui->labelResult10kmh->show();
613 ui->labelResult20kmh->show();
614 ui->labelResult30kmh->show();
615 ui->labelResult40kmh->hide();
616 ui->labelResult50kmh->hide();
617 ui->labelResult60kmh->hide();
618 ui->labelResult70kmh->hide();
619 ui->labelResult80kmh->hide();
620 ui->labelResult90kmh->hide();
621 ui->labelResult100kmh->hide();
624 else if (this->diagramGapStem == DIAGRAMGAP40KMH)
626 ui->labelResult10kmh->show();
627 ui->labelResult20kmh->show();
628 ui->labelResult30kmh->show();
629 ui->labelResult40kmh->show();
630 ui->labelResult50kmh->hide();
631 ui->labelResult60kmh->hide();
632 ui->labelResult70kmh->hide();
633 ui->labelResult80kmh->hide();
634 ui->labelResult90kmh->hide();
635 ui->labelResult100kmh->hide();
638 else if (this->diagramGapStem == DIAGRAMGAP50KMH)
640 ui->labelResult10kmh->show();
641 ui->labelResult20kmh->show();
642 ui->labelResult30kmh->show();
643 ui->labelResult40kmh->show();
644 ui->labelResult50kmh->show();
645 ui->labelResult60kmh->hide();
646 ui->labelResult70kmh->hide();
647 ui->labelResult80kmh->hide();
648 ui->labelResult90kmh->hide();
649 ui->labelResult100kmh->hide();
652 else if (this->diagramGapStem == DIAGRAMGAP60KMH)
654 ui->labelResult10kmh->show();
655 ui->labelResult20kmh->show();
656 ui->labelResult30kmh->show();
657 ui->labelResult40kmh->show();
658 ui->labelResult50kmh->show();
659 ui->labelResult60kmh->show();
660 ui->labelResult70kmh->hide();
661 ui->labelResult80kmh->hide();
662 ui->labelResult90kmh->hide();
663 ui->labelResult100kmh->hide();
666 else if (this->diagramGapStem == DIAGRAMGAP70KMH)
668 ui->labelResult10kmh->show();
669 ui->labelResult20kmh->show();
670 ui->labelResult30kmh->show();
671 ui->labelResult40kmh->show();
672 ui->labelResult50kmh->show();
673 ui->labelResult60kmh->show();
674 ui->labelResult70kmh->show();
675 ui->labelResult80kmh->hide();
676 ui->labelResult90kmh->hide();
677 ui->labelResult100kmh->hide();
680 else if (this->diagramGapStem == DIAGRAMGAP80KMH)
682 ui->labelResult10kmh->show();
683 ui->labelResult20kmh->show();
684 ui->labelResult30kmh->show();
685 ui->labelResult40kmh->show();
686 ui->labelResult50kmh->show();
687 ui->labelResult60kmh->show();
688 ui->labelResult70kmh->show();
689 ui->labelResult80kmh->show();
690 ui->labelResult90kmh->hide();
691 ui->labelResult100kmh->hide();
694 else if (this->diagramGapStem == DIAGRAMGAP90KMH)
696 ui->labelResult10kmh->show();
697 ui->labelResult20kmh->show();
698 ui->labelResult30kmh->show();
699 ui->labelResult40kmh->show();
700 ui->labelResult50kmh->show();
701 ui->labelResult60kmh->show();
702 ui->labelResult70kmh->show();
703 ui->labelResult80kmh->show();
704 ui->labelResult90kmh->show();
705 ui->labelResult100kmh->hide();
710 ui->labelResult10kmh->show();
711 ui->labelResult20kmh->show();
712 ui->labelResult30kmh->show();
713 ui->labelResult40kmh->show();
714 ui->labelResult50kmh->show();
715 ui->labelResult60kmh->show();
716 ui->labelResult70kmh->show();
717 ui->labelResult80kmh->show();
718 ui->labelResult90kmh->show();
719 ui->labelResult100kmh->show();
724 * Checks which target speed has been choosed
725 * @return targetChoice which tells to caller integer value about the target speed
726 * e.g. 20 km/h is value 2 and 60 km/h is value 6
728 int ResultDialog::getTargetChoice()
731 int targetChoice = 0;
733 if (this->diagramGapStem == DIAGRAMGAP10KMH)
738 else if (this->diagramGapStem == DIAGRAMGAP20KMH)
743 else if (this->diagramGapStem == DIAGRAMGAP30KMH)
748 else if (this->diagramGapStem == DIAGRAMGAP40KMH)
753 else if (this->diagramGapStem == DIAGRAMGAP50KMH)
758 else if (this->diagramGapStem == DIAGRAMGAP60KMH)
763 else if (this->diagramGapStem == DIAGRAMGAP70KMH)
768 else if (this->diagramGapStem == DIAGRAMGAP80KMH)
773 else if (this->diagramGapStem == DIAGRAMGAP90KMH)
785 void ResultDialog::setLabelInfoToUser(QString infoText)
787 this->ui->labelInfoToUser->setText(infoText);
791 * This function enable send server button.
793 void ResultDialog::setSendServerButtonEnabled()
795 ui->pushButtonSend->setEnabled(true);
799 * This slot function called when ever info button clicked.
801 void ResultDialog::on_pushButtonInfo_clicked()
803 if(!helpAccelerationDialog)
805 helpAccelerationDialog = new HelpAccelerationDialog;
807 connect(helpAccelerationDialog, SIGNAL(rejected()), this, SLOT(killHelpDialog()));
808 helpAccelerationDialog->show();
812 * This slot function called when ever dialog rejected.
814 void ResultDialog::killHelpDialog()
816 if(helpAccelerationDialog)
818 qDebug() << "__Result kill: helpAccelerationDialog";
819 delete helpAccelerationDialog;
820 helpAccelerationDialog = NULL;
824 * This slot function opens E-mail application with attachment file
825 * (acceleration.png). Image of resultdialog
828 void ResultDialog::on_pushButtonEMail_clicked()
830 QDesktopServices::openUrl(QUrl("mailto:name@domain.com?Subject=Acceleration Result&Body=Hi, Here are my acceleration result!&Attachment=acceleration.png"));