KWidgetsAddons

kbusyindicatorwidget.cpp
1/*
2 SPDX-FileCopyrightText: 2019 Harald Sitter <sitter@kde.org>
3
4 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
5*/
6
7#include "kbusyindicatorwidget.h"
8
9#include <QApplication>
10#include <QIcon>
11#include <QPainter>
12#include <QResizeEvent>
13#include <QStyle>
14#include <QVariantAnimation>
15
16class KBusyIndicatorWidgetPrivate
17{
18public:
19 KBusyIndicatorWidgetPrivate(KBusyIndicatorWidget *parent)
20 : q(parent)
21 {
22 animation.setLoopCount(-1);
23 animation.setDuration(2000);
24 animation.setStartValue(0);
25 animation.setEndValue(360);
26 QObject::connect(&animation, &QVariantAnimation::valueChanged, q, [this](QVariant value) {
27 rotation = value.toReal();
28 q->update(); // repaint new rotation
29 });
30 }
31
32 KBusyIndicatorWidget *const q;
33 QVariantAnimation animation;
34 QIcon icon = QIcon::fromTheme(QStringLiteral("view-refresh"));
35 qreal rotation = 0;
36 QPointF paintCenter;
37};
38
41 , d(new KBusyIndicatorWidgetPrivate(this))
42{
43}
44
46
48{
50 return QSize(extent, extent);
51}
52
53bool KBusyIndicatorWidget::isRunning() const
54{
55 return d->animation.state() == QAbstractAnimation::Running;
56}
57
59{
60 d->animation.start();
61}
62
64{
65 if (d->animation.state() == QAbstractAnimation::Running) // avoid warning if never started yet
66 d->animation.pause();
67}
68
69void KBusyIndicatorWidget::setRunning(const bool enable)
70{
71 if (enable)
72 start();
73 else
74 stop();
75}
76
77void KBusyIndicatorWidget::showEvent(QShowEvent *event)
78{
79 QWidget::showEvent(event);
80 start();
81}
82
83void KBusyIndicatorWidget::hideEvent(QHideEvent *event)
84{
85 QWidget::hideEvent(event);
86 stop();
87}
88
89void KBusyIndicatorWidget::resizeEvent(QResizeEvent *event)
90{
92 d->paintCenter = QPointF(event->size().width() / 2.0, //
93 event->size().height() / 2.0);
94}
95
96void KBusyIndicatorWidget::paintEvent(QPaintEvent *)
97{
98 QPainter painter(this);
99 painter.setRenderHint(QPainter::SmoothPixmapTransform);
100
101 // Rotate around the center and then reset back to origin for icon painting.
102 painter.translate(d->paintCenter);
103 painter.rotate(d->rotation);
104 painter.translate(-d->paintCenter);
105
106 d->icon.paint(&painter, rect());
107}
108
109bool KBusyIndicatorWidget::event(QEvent *event)
110{
111 // Only overridden to be flexible WRT binary compatible in the future.
112 // Overriding later has potential to change the call going through
113 // the vtable or not.
114 return QWidget::event(event);
115}
116
117#include "moc_kbusyindicatorwidget.cpp"
void setRunning(const bool enable=true)
By calling this method with enable = true the spinning abnimation will be started.
~KBusyIndicatorWidget() override
Destroy the widget.
void start()
Start the spinning animation.
void stop()
Stop the spinning animation.
QSize minimumSizeHint() const override
Return the smallest reasonable size for the widget.
KBusyIndicatorWidget(QWidget *parent=nullptr)
Create a new KBusyIndicatorWidget widget.
QStyle * style()
QIcon fromTheme(const QString &name)
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
QObject * parent() const const
SmoothPixmapTransform
PM_SmallIconSize
virtual int pixelMetric(PixelMetric metric, const QStyleOption *option, const QWidget *widget) const const=0
qreal toReal(bool *ok) const const
void valueChanged(const QVariant &value)
QWidget(QWidget *parent, Qt::WindowFlags f)
virtual bool event(QEvent *event) override
virtual void hideEvent(QHideEvent *event)
virtual void resizeEvent(QResizeEvent *event)
virtual void showEvent(QShowEvent *event)
This file is part of the KDE documentation.
Documentation copyright © 1996-2025 The KDE developers.
Generated on Fri Jan 31 2025 11:52:27 by doxygen 1.13.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.