spinner: pre-compute rotations

old-commit-hash: 1bcc3beae8
commatwo_master
Adeeb Shihadeh 4 years ago
parent c9db9b1fb4
commit c61d1bbce6
  1. 33
      selfdrive/ui/qt/spinner.cc
  2. 13
      selfdrive/ui/qt/spinner.hpp

@ -3,9 +3,9 @@
#include <iostream>
#include <QString>
#include <QTransform>
#include <QGridLayout>
#include <QApplication>
#include <QDesktopWidget>
#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) {

@ -1,11 +1,15 @@
#include <array>
#include <QTimer>
#include <QLabel>
#include <QWidget>
#include <QPixmap>
#include <QProgressBar>
#include <QTransform>
#include <QSocketNotifier>
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<QPixmap, spinner_fps> track_imgs;
QTimer *rotate_timer;
QSocketNotifier *notifier;
public slots:

Loading…
Cancel
Save