aboutsummaryrefslogtreecommitdiffstats
path: root/qt-ui/qtwaitingspinner.h
diff options
context:
space:
mode:
Diffstat (limited to 'qt-ui/qtwaitingspinner.h')
-rw-r--r--qt-ui/qtwaitingspinner.h103
1 files changed, 103 insertions, 0 deletions
diff --git a/qt-ui/qtwaitingspinner.h b/qt-ui/qtwaitingspinner.h
new file mode 100644
index 000000000..254b52ec7
--- /dev/null
+++ b/qt-ui/qtwaitingspinner.h
@@ -0,0 +1,103 @@
+/* Original Work Copyright (c) 2012-2014 Alexander Turkin
+ Modified 2014 by William Hallatt
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+#ifndef QTWAITINGSPINNER_H
+#define QTWAITINGSPINNER_H
+
+#include <QWidget>
+
+#include <QTimer>
+#include <QColor>
+
+class QtWaitingSpinner : public QWidget {
+ Q_OBJECT
+public:
+ /*! Constructor for "standard" widget behaviour - use this
+ * constructor if you wish to, e.g. embed your widget in another. */
+ QtWaitingSpinner(QWidget *parent = 0);
+
+ /*! Constructor - use this constructor to automatically create a modal
+ * ("blocking") spinner on top of the calling widget/window. If a valid
+ * parent widget is provided, "centreOnParent" will ensure that
+ * QtWaitingSpinner automatically centres itself on it, if not,
+ * "centreOnParent" is ignored. */
+ QtWaitingSpinner(Qt::WindowModality modality, QWidget *parent = 0,
+ bool centreOnParent = true);
+
+public Q_SLOTS:
+ void start();
+ void stop();
+
+public:
+ void setColor(QColor color);
+ void setRoundness(qreal roundness);
+ void setMinimumTrailOpacity(qreal minOpacity);
+ void setTrailFadePercentage(qreal trail);
+ void setRevolutionsPerSecond(int rps);
+ void setNumberOfLines(int lines);
+ void setLineLength(int length);
+ void setLineWidth(int width);
+ void setInnerRadius(int radius);
+
+ bool isSpinning() const;
+
+private Q_SLOTS:
+ void rotate();
+
+protected:
+ void paintEvent(QPaintEvent *ev);
+
+private:
+ static int calculateTimerInterval(int lines, int speed);
+ static int lineCountDistanceFromPrimary(int current, int primary,
+ int totalNrOfLines);
+ static QColor currentLineColor(int distance, int totalNrOfLines,
+ qreal trailFadePerc, qreal minOpacity,
+ QColor color);
+
+ void initialise();
+ void updateSize();
+ void updateTimer();
+ void updatePosition();
+
+private:
+ // Configurable settings.
+ QColor m_color;
+ qreal m_roundness; // 0..100
+ qreal m_minTrailOpacity;
+ qreal m_trailFadePercentage;
+ int m_revPerSec; // revolutions per second
+ int m_numberOfLines;
+ int m_lineLength;
+ int m_lineWidth;
+ int m_innerRadius;
+
+private:
+ QtWaitingSpinner(const QtWaitingSpinner&);
+ QtWaitingSpinner& operator=(const QtWaitingSpinner&);
+
+ QTimer *m_timer;
+ QWidget *m_parent;
+ bool m_centreOnParent;
+ int m_currentCounter;
+ bool m_isSpinning;
+};
+
+#endif // QTWAITINGSPINNER_H