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 }