Plasma
busywidget.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "busywidget.h"
00021
00022
00023 #include <QPainter>
00024 #include <QTimer>
00025 #include <QGraphicsSceneResizeEvent>
00026 #include <QTextOption>
00027
00028
00029 #include "plasma/theme.h"
00030 #include "plasma/svg.h"
00031
00032 namespace Plasma
00033 {
00034
00035 class BusyWidgetPrivate
00036 {
00037 public:
00038 BusyWidgetPrivate()
00039 : svg(0),
00040 timerId(0),
00041 rotationAngle(0),
00042 rotation(0),
00043 running(true)
00044 {
00045 }
00046
00047 ~BusyWidgetPrivate()
00048 {
00049 }
00050
00051 void themeChanged()
00052 {
00053 frames.clear();
00054 rotationAngle = svg->elementSize("hint-rotation-angle").width();
00055
00056
00057 int nFrames = 360/rotationAngle;
00058 rotationAngle = 360/nFrames;
00059 }
00060
00061 Svg *svg;
00062 QString styleSheet;
00063 int timerId;
00064 QHash<int, QPixmap> frames;
00065 qreal rotationAngle;
00066 qreal rotation;
00067 bool running;
00068 QString label;
00069 };
00070
00071
00072 BusyWidget::BusyWidget(QGraphicsWidget *parent)
00073 : QGraphicsWidget(parent),
00074 d(new BusyWidgetPrivate)
00075 {
00076 d->svg = new Plasma::Svg(this);
00077 d->svg->setImagePath("widgets/busywidget");
00078 d->svg->setContainsMultipleImages(true);
00079 d->themeChanged();
00080
00081 connect(Plasma::Theme::defaultTheme(), SIGNAL(themeChanged()), SLOT(themeChanged()));
00082 }
00083
00084 BusyWidget::~BusyWidget()
00085 {
00086 delete d;
00087 }
00088
00089 void BusyWidget::setRunning(bool running)
00090 {
00091 if (running && !d->timerId && isVisible()) {
00092 d->timerId = startTimer(150);
00093 } else if (!running && d->timerId) {
00094 killTimer(d->timerId);
00095 d->timerId = 0;
00096 }
00097 d->running = running;
00098 }
00099
00100 bool BusyWidget::isRunning() const
00101 {
00102 return d->running;
00103 }
00104
00105 void BusyWidget::setLabel(const QString &label)
00106 {
00107 d->label = label;
00108 update();
00109 }
00110
00111 QString BusyWidget::label() const
00112 {
00113 return d->label;
00114 }
00115
00116 void BusyWidget::timerEvent(QTimerEvent *event)
00117 {
00118 if (event->timerId() != d->timerId) {
00119 QObject::timerEvent(event);
00120 return;
00121 }
00122
00123 d->rotation += d->rotationAngle;
00124
00125 qreal overflow = d->rotation - 360;
00126 if ( overflow > 0) {
00127 d->rotation = overflow;
00128 }
00129 update();
00130 }
00131
00132 void BusyWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
00133 {
00134 Q_UNUSED(option)
00135 Q_UNUSED(widget)
00136
00137 int intRotation = int(d->rotation);
00138
00139 QRect spinnerRect(QPoint(0, 0), QSize(qMin(size().width(), size().height()), qMin(size().width(), size().height())));
00140 spinnerRect.moveCenter(QPoint(size().width()/2, size().height()/2));
00141
00142 if (!isEnabled()) {
00143 painter->setOpacity(painter->opacity() / 2);
00144 }
00145
00146 if (!d->running && d->svg->hasElement("paused")) {
00147 d->svg->paint(painter, spinnerRect, "paused");
00148 } else {
00149 if (!d->frames[intRotation]) {
00150 QPointF translatedPos(spinnerRect.width()/2, spinnerRect.height()/2);
00151
00152 d->frames[intRotation] = QPixmap(spinnerRect.size());
00153 d->frames[intRotation].fill(Qt::transparent);
00154
00155 QPainter buffPainter(&d->frames[intRotation]);
00156
00157 buffPainter.setRenderHints(QPainter::SmoothPixmapTransform);
00158 buffPainter.translate(translatedPos);
00159
00160 if (d->svg->hasElement("busywidget-shadow")) {
00161 buffPainter.save();
00162 buffPainter.translate(2,2);
00163 buffPainter.rotate(intRotation);
00164 d->svg->paint(&buffPainter, QRect(-translatedPos.toPoint(), spinnerRect.size()), "busywidget-shadow");
00165 buffPainter.restore();
00166 }
00167
00168 buffPainter.rotate(intRotation);
00169 d->svg->paint(&buffPainter, QRect(-translatedPos.toPoint(), spinnerRect.size()), "busywidget");
00170 }
00171
00172 painter->drawPixmap(spinnerRect.topLeft(), d->frames[intRotation]);
00173 }
00174
00175 painter->setPen(Plasma::Theme::defaultTheme()->color(Theme::TextColor));
00176 Qt::Alignment align(Qt::AlignVCenter | Qt::AlignHCenter);
00177 painter->drawText(boundingRect(), d->label, QTextOption(align));
00178 }
00179
00180 void BusyWidget::showEvent(QShowEvent *event)
00181 {
00182 Q_UNUSED(event)
00183 if (d->running) {
00184 d->timerId = startTimer(150);
00185 }
00186 }
00187
00188 void BusyWidget::hideEvent(QHideEvent *event)
00189 {
00190 Q_UNUSED(event)
00191 if (d->timerId) {
00192 killTimer(d->timerId);
00193 }
00194
00195 d->timerId = 0;
00196 }
00197
00198 void BusyWidget::resizeEvent(QGraphicsSceneResizeEvent *event)
00199 {
00200 Q_UNUSED(event)
00201 d->frames.clear();
00202 }
00203
00204 void BusyWidget::mousePressEvent(QGraphicsSceneMouseEvent *event)
00205 {
00206 Q_UNUSED(event)
00207 emit clicked();
00208 }
00209
00210 }
00211
00212 #include <busywidget.moc>
00213