diff --git a/selfdrive/ui/qt/spinner.cc b/selfdrive/ui/qt/spinner.cc index 77151f3bba..1a261995ca 100644 --- a/selfdrive/ui/qt/spinner.cc +++ b/selfdrive/ui/qt/spinner.cc @@ -3,9 +3,9 @@ #include #include +#include #include #include -#include #include "spinner.hpp" #include "qt_window.hpp" @@ -15,19 +15,26 @@ Spinner::Spinner(QWidget *parent) { main_layout->setSpacing(0); main_layout->setContentsMargins(200, 200, 200, 200); - const int img_size = 360; - comma = new QLabel(); - comma->setPixmap(QPixmap("../assets/img_spinner_comma.png").scaled(img_size, img_size, Qt::KeepAspectRatio, Qt::SmoothTransformation)); - comma->setFixedSize(img_size, img_size); + comma->setPixmap(QPixmap("../assets/img_spinner_comma.png").scaled(spinner_size, Qt::KeepAspectRatio, Qt::SmoothTransformation)); + comma->setFixedSize(spinner_size); main_layout->addWidget(comma, 0, 0, Qt::AlignHCenter | Qt::AlignVCenter); - track_img = QPixmap("../assets/img_spinner_track.png").scaled(img_size, img_size, Qt::KeepAspectRatio, Qt::SmoothTransformation); track = new QLabel(); - track->setPixmap(track_img); - track->setFixedSize(img_size, img_size); + track->setFixedSize(spinner_size); main_layout->addWidget(track, 0, 0, Qt::AlignHCenter | Qt::AlignVCenter); + // pre-compute all the track imgs. make this a gif instead? + track_idx = 0; + QTransform transform; + QPixmap track_img = QPixmap("../assets/img_spinner_track.png").scaled(spinner_size, Qt::KeepAspectRatio, Qt::SmoothTransformation); + for (auto &img : track_imgs) { + QPixmap r = track_img.transformed(transform.rotate(360/spinner_fps), Qt::SmoothTransformation); + int x = (r.width() - track->width()) / 2; + int y = (r.height() - track->height()) / 2; + img = r.copy(x, y, track->width(), track->height()); + } + text = new QLabel(); text->setVisible(false); main_layout->addWidget(text, 1, 0, Qt::AlignHCenter); @@ -61,7 +68,7 @@ Spinner::Spinner(QWidget *parent) { )"); rotate_timer = new QTimer(this); - rotate_timer->start(1000/30.); + rotate_timer->start(1000./spinner_fps); QObject::connect(rotate_timer, SIGNAL(timeout()), this, SLOT(rotate())); notifier = new QSocketNotifier(fileno(stdin), QSocketNotifier::Read); @@ -69,12 +76,8 @@ Spinner::Spinner(QWidget *parent) { }; void Spinner::rotate() { - transform.rotate(5); - - QPixmap r = track_img.transformed(transform.rotate(5), Qt::SmoothTransformation); - int x = (r.width() - track->width()) / 2; - int y = (r.height() - track->height()) / 2; - track->setPixmap(r.copy(x, y, track->width(), track->height())); + track_idx = (track_idx+1) % track_imgs.size(); + track->setPixmap(track_imgs[track_idx]); }; void Spinner::update(int n) { diff --git a/selfdrive/ui/qt/spinner.hpp b/selfdrive/ui/qt/spinner.hpp index ea0f8afdcf..8bdd13a3d2 100644 --- a/selfdrive/ui/qt/spinner.hpp +++ b/selfdrive/ui/qt/spinner.hpp @@ -1,11 +1,15 @@ +#include + #include #include #include #include #include -#include #include +constexpr int spinner_fps = 30; +constexpr QSize spinner_size = QSize(360, 360); + class Spinner : public QWidget { Q_OBJECT @@ -13,12 +17,13 @@ public: explicit Spinner(QWidget *parent = 0); private: - QPixmap track_img; - QTimer *rotate_timer; + int track_idx; QLabel *comma, *track; QLabel *text; QProgressBar *progress_bar; - QTransform transform; + std::array track_imgs; + + QTimer *rotate_timer; QSocketNotifier *notifier; public slots: