mirror of
https://github.com/dragonpilot/dragonpilot.git
synced 2026-06-25 07:52:03 +08:00
spinner: pre-compute rotations
This commit is contained in:
+18
-15
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user