|  |  |  | @ -6,35 +6,58 @@ | 
			
		
	
		
			
				
					|  |  |  |  | #include <QTransform> | 
			
		
	
		
			
				
					|  |  |  |  | #include <QGridLayout> | 
			
		
	
		
			
				
					|  |  |  |  | #include <QApplication> | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #include <QPainter> | 
			
		
	
		
			
				
					|  |  |  |  | #include "spinner.hpp" | 
			
		
	
		
			
				
					|  |  |  |  | #include "qt_window.hpp" | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | Spinner::Spinner(QWidget *parent) { | 
			
		
	
		
			
				
					|  |  |  |  |   QGridLayout *main_layout = new QGridLayout(); | 
			
		
	
		
			
				
					|  |  |  |  |   main_layout->setSpacing(0); | 
			
		
	
		
			
				
					|  |  |  |  |   main_layout->setContentsMargins(200, 200, 200, 200); | 
			
		
	
		
			
				
					|  |  |  |  | // TrackWidget
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   comma = new QLabel(); | 
			
		
	
		
			
				
					|  |  |  |  |   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); | 
			
		
	
		
			
				
					|  |  |  |  | TrackWidget::TrackWidget(QWidget *parent) { | 
			
		
	
		
			
				
					|  |  |  |  |   setFixedSize(spinner_size); | 
			
		
	
		
			
				
					|  |  |  |  |   setAutoFillBackground(false); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   track = new QLabel(); | 
			
		
	
		
			
				
					|  |  |  |  |   track->setFixedSize(spinner_size); | 
			
		
	
		
			
				
					|  |  |  |  |   main_layout->addWidget(track, 0, 0, Qt::AlignHCenter | Qt::AlignVCenter); | 
			
		
	
		
			
				
					|  |  |  |  |   comma_img = QPixmap("../assets/img_spinner_comma.png").scaled(spinner_size, Qt::KeepAspectRatio, Qt::SmoothTransformation); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   // 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()); | 
			
		
	
		
			
				
					|  |  |  |  |     img = track_img.transformed(transform.rotate(360/spinner_fps), Qt::SmoothTransformation); | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   m_anim.setDuration(1000); | 
			
		
	
		
			
				
					|  |  |  |  |   m_anim.setStartValue(0); | 
			
		
	
		
			
				
					|  |  |  |  |   m_anim.setEndValue(int(track_imgs.size() -1)); | 
			
		
	
		
			
				
					|  |  |  |  |   m_anim.setLoopCount(-1); | 
			
		
	
		
			
				
					|  |  |  |  |   m_anim.start(); | 
			
		
	
		
			
				
					|  |  |  |  |   connect(&m_anim, SIGNAL(valueChanged(QVariant)), SLOT(update())); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void TrackWidget::paintEvent(QPaintEvent *event) { | 
			
		
	
		
			
				
					|  |  |  |  |   QPainter painter(this); | 
			
		
	
		
			
				
					|  |  |  |  |   QRect bg(0, 0, painter.device()->width(), painter.device()->height()); | 
			
		
	
		
			
				
					|  |  |  |  |   QBrush bgBrush("#000000"); | 
			
		
	
		
			
				
					|  |  |  |  |   painter.fillRect(bg, bgBrush); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   int track_idx = m_anim.currentValue().toInt(); | 
			
		
	
		
			
				
					|  |  |  |  |   QRect rect(track_imgs[track_idx].rect()); | 
			
		
	
		
			
				
					|  |  |  |  |   rect.moveCenter(bg.center()); | 
			
		
	
		
			
				
					|  |  |  |  |   painter.drawPixmap(rect.topLeft(), track_imgs[track_idx]); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   rect = comma_img.rect(); | 
			
		
	
		
			
				
					|  |  |  |  |   rect.moveCenter(bg.center()); | 
			
		
	
		
			
				
					|  |  |  |  |   painter.drawPixmap(rect.topLeft(), comma_img); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | // Spinner
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | Spinner::Spinner(QWidget *parent) { | 
			
		
	
		
			
				
					|  |  |  |  |   QGridLayout *main_layout = new QGridLayout(); | 
			
		
	
		
			
				
					|  |  |  |  |   main_layout->setSpacing(0); | 
			
		
	
		
			
				
					|  |  |  |  |   main_layout->setMargin(200); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   main_layout->addWidget(new TrackWidget(), 0, 0, Qt::AlignHCenter | Qt::AlignVCenter); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   text = new QLabel(); | 
			
		
	
		
			
				
					|  |  |  |  |   text->setVisible(false); | 
			
		
	
		
			
				
					|  |  |  |  |   main_layout->addWidget(text, 1, 0, Qt::AlignHCenter); | 
			
		
	
	
		
			
				
					|  |  |  | @ -51,6 +74,9 @@ Spinner::Spinner(QWidget *parent) { | 
			
		
	
		
			
				
					|  |  |  |  |     Spinner { | 
			
		
	
		
			
				
					|  |  |  |  |       background-color: black; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |     * { | 
			
		
	
		
			
				
					|  |  |  |  |       background-color: transparent; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |     QLabel { | 
			
		
	
		
			
				
					|  |  |  |  |       color: white; | 
			
		
	
		
			
				
					|  |  |  |  |       font-size: 80px; | 
			
		
	
	
		
			
				
					|  |  |  | @ -67,19 +93,10 @@ Spinner::Spinner(QWidget *parent) { | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |   )"); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   rotate_timer = new QTimer(this); | 
			
		
	
		
			
				
					|  |  |  |  |   rotate_timer->start(1000./spinner_fps); | 
			
		
	
		
			
				
					|  |  |  |  |   QObject::connect(rotate_timer, SIGNAL(timeout()), this, SLOT(rotate())); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   notifier = new QSocketNotifier(fileno(stdin), QSocketNotifier::Read); | 
			
		
	
		
			
				
					|  |  |  |  |   QObject::connect(notifier, SIGNAL(activated(int)), this, SLOT(update(int))); | 
			
		
	
		
			
				
					|  |  |  |  | }; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void Spinner::rotate() { | 
			
		
	
		
			
				
					|  |  |  |  |   track_idx = (track_idx+1) % track_imgs.size(); | 
			
		
	
		
			
				
					|  |  |  |  |   track->setPixmap(track_imgs[track_idx]); | 
			
		
	
		
			
				
					|  |  |  |  | }; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void Spinner::update(int n) { | 
			
		
	
		
			
				
					|  |  |  |  |   std::string line; | 
			
		
	
		
			
				
					|  |  |  |  |   std::getline(std::cin, line); | 
			
		
	
	
		
			
				
					|  |  |  | 
 |