25 #include <QGraphicsSceneResizeEvent>
26 #include <QTextOption>
35 class BusyWidgetPrivate
54 rotationAngle = svg->elementSize(
"hint-rotation-angle").width();
57 int nFrames = 360/rotationAngle;
58 rotationAngle = 360/nFrames;
64 QHash<int, QPixmap> frames;
74 d(new BusyWidgetPrivate)
77 d->svg->setImagePath(
"widgets/busywidget");
78 d->svg->setContainsMultipleImages(
true);
91 if (running && !d->timerId && isVisible()) {
92 d->timerId = startTimer(150);
93 }
else if (!running && d->timerId) {
94 killTimer(d->timerId);
118 if (event->timerId() != d->timerId) {
119 QObject::timerEvent(event);
123 d->rotation += d->rotationAngle;
125 qreal overflow = d->rotation - 360;
127 d->rotation = overflow;
137 int intRotation = int(d->rotation);
139 QRectF spinnerRect(QPoint(0, 0), QSize(qMin(size().width(), size().height()), qMin(size().width(), size().height())));
140 spinnerRect.moveCenter(boundingRect().center());
143 painter->setOpacity(painter->opacity() / 2);
146 if (!d->running && d->svg->hasElement(
"paused")) {
147 d->svg->paint(painter, spinnerRect,
"paused");
149 if (!d->frames[intRotation]) {
150 QPointF translatedPos(spinnerRect.width()/2, spinnerRect.height()/2);
152 d->frames[intRotation] = QPixmap(spinnerRect.size().toSize());
153 d->frames[intRotation].fill(Qt::transparent);
155 QPainter buffPainter(&d->frames[intRotation]);
157 buffPainter.setRenderHints(QPainter::SmoothPixmapTransform);
158 buffPainter.translate(translatedPos);
160 if (d->svg->hasElement(
"busywidget-shadow")) {
162 buffPainter.translate(1,1);
163 buffPainter.rotate(intRotation);
164 d->svg->paint(&buffPainter, QRectF(-translatedPos.toPoint(), spinnerRect.size()),
"busywidget-shadow");
165 buffPainter.restore();
168 buffPainter.rotate(intRotation);
169 d->svg->paint(&buffPainter, QRectF(-translatedPos.toPoint(), spinnerRect.size()),
"busywidget");
172 painter->drawPixmap(spinnerRect.topLeft().toPoint(), d->frames[intRotation]);
176 Qt::Alignment align(Qt::AlignVCenter | Qt::AlignHCenter);
177 painter->drawText(boundingRect(), d->label, QTextOption(align));
184 d->timerId = startTimer(150);
192 killTimer(d->timerId);
206 event->setAccepted(
true);
211 if ((event->button() & Qt::LeftButton) ||
212 (event->buttons() & Qt::LeftButton)) {
219 #include <busywidget.moc>