File indexing completed on 2024-05-12 04:06:27

0001 /*
0002     SPDX-FileCopyrightText: 2009 Stefan Majewsky <majewsky@gmx.net>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "loadingwidget.h"
0008 
0009 #include <cmath>
0010 #include <QPainter>
0011 #include <QRadialGradient>
0012 #include <QTimer>
0013 
0014 Palapeli::LoadingWidget::LoadingWidget(QWidget* parent)
0015     : QWidget(parent)
0016     , m_updateTimer(new QTimer(this))
0017     , m_angleDegrees(0)
0018 {
0019     setMinimumSize(QSize(64, 64));
0020     m_updateTimer->setInterval(30);
0021         connect(m_updateTimer, &QTimer::timeout, this,
0022                 qOverload<>(&QWidget::update));
0023 }
0024 
0025 void Palapeli::LoadingWidget::showEvent(QShowEvent* event)
0026 {
0027     Q_UNUSED(event)
0028     m_updateTimer->start();
0029 }
0030 
0031 void Palapeli::LoadingWidget::hideEvent(QHideEvent* event)
0032 {
0033     Q_UNUSED(event)
0034     m_updateTimer->stop();
0035 }
0036 
0037 void Palapeli::LoadingWidget::paintEvent(QPaintEvent* event)
0038 {
0039     Q_UNUSED(event)
0040     m_angleDegrees = (m_angleDegrees + 14) % 360;
0041     const qreal pointerAngle = 2 * M_PI * m_angleDegrees / 360.0;
0042     const QPointF pointerDirection(cos(pointerAngle), sin(pointerAngle));
0043 
0044     QPainter painter(this);
0045     painter.setRenderHint(QPainter::Antialiasing);
0046     const QColor baseColor = painter.pen().color();
0047     const QColor baseColorTransparent(baseColor.red(), baseColor.green(), baseColor.blue(), 0);
0048     painter.setPen(Qt::NoPen);
0049 
0050     //metrics
0051     const QPoint center = rect().center();
0052     const qreal distance = 32;
0053     for (int i = 0; i < 8; ++i)
0054     {
0055         //determine position of circle
0056         const qreal angle = 0.25 * M_PI * i;
0057         const QPointF thisDirection(cos(angle), sin(angle));
0058         const QPointF thisCenter = center + distance * thisDirection;
0059         //determine size of circle
0060         const qreal scalarProd = thisDirection.x() * pointerDirection.x() + thisDirection.y() * pointerDirection.y();
0061         const qreal thisRadius = 10 + 5 * scalarProd;
0062         QSizeF thisSize(2 * thisRadius, 2 * thisRadius);
0063         //create gradient for circle
0064         QRadialGradient gradient(thisCenter, thisRadius);
0065         gradient.setColorAt(0, baseColor);
0066         gradient.setColorAt(0.4, baseColor);
0067         gradient.setColorAt(0.6, baseColorTransparent);
0068         painter.setBrush(gradient);
0069         //draw circle
0070         QRectF thisRect(QPointF(), thisSize);
0071         thisRect.moveCenter(thisCenter);
0072         painter.drawEllipse(thisRect);
0073     }
0074 }