1 /*
2 
3     This file is part of QProgressIndicator,
4     an open-source recent files menu widget
5 
6     SPDX-FileCopyrightText: 2009-2010 Morgan Leborgne
7     SPDX-License-Identifier: LGPL-3.0-or-later
8 */
9 
10 #pragma once
11 
12 #include <QWidget>
13 #include <QColor>
14 
15 /**
16  * @class QProgressIndicator
17  * @brief The QProgressIndicator class lets an application display a progress indicator to show that a long task is
18  * under way.
19  * Progress indicators are indeterminate and do nothing more than spin to show that the application is busy.
20  *
21  * @sa QProgressBar
22  */
23 class QProgressIndicator : public QWidget
24 {
25     Q_OBJECT
26     Q_PROPERTY(int delay READ animationDelay WRITE setAnimationDelay)
27     Q_PROPERTY(bool displayedWhenStopped READ isDisplayedWhenStopped WRITE setDisplayedWhenStopped)
28     Q_PROPERTY(QColor color READ color WRITE setColor)
29   public:
30     explicit QProgressIndicator(QWidget *parent = nullptr);
31 
32     /**
33      * Returns the delay between animation steps.
34      * @return The number of milliseconds between animation steps. By default, the animation delay is set to
35      * 40 milliseconds.
36      *
37      * @sa setAnimationDelay
38      */
animationDelay()39     int animationDelay() const { return m_delay; }
40 
41     /**
42      * Returns a Boolean value indicating whether the component is currently animated.
43      * @return Animation state.
44      * @sa startAnimation stopAnimation
45      */
46     bool isAnimated() const;
47 
48     /**
49      * Returns a Boolean value indicating whether the receiver shows itself even when it is not animating.
50      * @return Return true if the progress indicator shows itself even when it is not animating. By default,
51      * it returns false.
52      * @sa setDisplayedWhenStopped
53      */
54     bool isDisplayedWhenStopped() const;
55 
56     /**
57      * Returns the color of the component.
58      * @sa setColor
59      */
color()60     const QColor &color() const { return m_color; }
61 
62     QSize sizeHint() const override;
63     int heightForWidth(int w) const override;
64   public slots:
65     /**
66      * Starts the spin animation.
67      * @sa stopAnimation isAnimated
68      */
69     void startAnimation();
70 
71     /**
72      * Stops the spin animation.
73      * @sa startAnimation isAnimated
74      */
75     void stopAnimation();
76 
77     /**
78      * Sets the delay between animation steps.
79      * Setting the \a delay to a value larger than 40 slows the animation, while setting the @a delay to a
80      * smaller value speeds it up.
81      * @param delay The delay, in milliseconds.
82      * @sa animationDelay
83      */
84     void setAnimationDelay(int delay);
85 
86     /**
87      * Sets whether the component hides itself when it is not animating.
88      * @param state The animation state. Set false to hide the progress indicator when it is not animating; otherwise true.
89      * @sa isDisplayedWhenStopped
90      */
91     void setDisplayedWhenStopped(bool state);
92 
93     /**
94      * Sets the color of the components to the given color.
95      * @sa color
96      */
97     void setColor(const QColor &color);
98 
99   protected:
100     void timerEvent(QTimerEvent *event) override;
101     void paintEvent(QPaintEvent *event) override;
102 
103   private:
104     int m_angle { 0 };
105     int m_timerId { -1 };
106     int m_delay { 40 };
107     bool m_displayedWhenStopped { false };
108     QColor m_color { Qt::black };
109 };
110