25#include <QGraphicsSceneResizeEvent>
35class 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);
84BusyWidget::~BusyWidget()
89void BusyWidget::setRunning(
bool running)
91 if (
running && !d->timerId && isVisible()) {
92 d->timerId = startTimer(150);
93 }
else if (!
running && d->timerId) {
94 killTimer(d->timerId);
100bool BusyWidget::isRunning()
const
105void BusyWidget::setLabel(
const QString &label)
111QString BusyWidget::label()
const
116void BusyWidget::timerEvent(QTimerEvent *event)
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));
180void BusyWidget::showEvent(QShowEvent *event)
184 d->timerId = startTimer(150);
188void BusyWidget::hideEvent(QHideEvent *event)
192 killTimer(d->timerId);
198void BusyWidget::resizeEvent(QGraphicsSceneResizeEvent *event)
204void BusyWidget::mousePressEvent(QGraphicsSceneMouseEvent *event)
206 event->setAccepted(
true);
209void BusyWidget::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
211 if ((event->button() & Qt::LeftButton) ||
212 (event->buttons() & Qt::LeftButton)) {
219#include <busywidget.moc>
A theme aware image-centric SVG class.
static Theme * defaultTheme()
Singleton pattern accessor.
@ TextColor
the text color to be used by items resting on the background
Namespace for everything in libplasma.