2022-03-05 22:41:29 +05:00

92 lines
2.2 KiB
C++

/*
SPDX-FileCopyrightText: 2003-2007 Craig Drummond <craig@kde.org>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "ActionLabel.h"
#include <KIconLoader>
#include <QPixmap>
#include <QTimer>
#include <QTransform>
namespace KFI
{
// Borrowed from kolourpaint...
static QTransform matrixWithZeroOrigin(const QTransform &matrix, int width, int height)
{
QRect newRect(matrix.mapRect(QRect(0, 0, width, height)));
return QTransform(matrix.m11(), matrix.m12(), matrix.m21(), matrix.m22(), matrix.dx() - newRect.left(), matrix.dy() - newRect.top());
}
static QTransform rotateMatrix(int width, int height, double angle)
{
QTransform matrix;
matrix.translate(width / 2.0, height / 2.0);
matrix.rotate(angle);
return matrixWithZeroOrigin(matrix, width, height);
}
static const int constNumIcons = 8;
static int theUsageCount;
static QPixmap *theIcons[constNumIcons];
CActionLabel::CActionLabel(QWidget *parent)
: QLabel(parent)
{
static const int constIconSize(48);
setMinimumSize(constIconSize, constIconSize);
setMaximumSize(constIconSize, constIconSize);
setAlignment(Qt::AlignCenter);
if (0 == theUsageCount++) {
QImage img(KIconLoader::global()->loadIcon("application-x-font-ttf", KIconLoader::NoGroup, 32).toImage());
double increment = 360.0 / constNumIcons;
for (int i = 0; i < constNumIcons; ++i) {
theIcons[i] = new QPixmap(QPixmap::fromImage(0 == i ? img : img.transformed(rotateMatrix(img.width(), img.height(), increment * i))));
}
}
setPixmap(*theIcons[0]);
m_timer = new QTimer(this);
connect(m_timer, &QTimer::timeout, this, &CActionLabel::rotateIcon);
}
CActionLabel::~CActionLabel()
{
if (0 == --theUsageCount) {
for (int i = 0; i < constNumIcons; ++i) {
delete theIcons[i];
theIcons[i] = nullptr;
}
}
}
void CActionLabel::startAnimation()
{
m_count = 0;
setPixmap(*theIcons[0]);
m_timer->start(1000 / constNumIcons);
}
void CActionLabel::stopAnimation()
{
m_timer->stop();
m_count = 0;
setPixmap(*theIcons[m_count]);
}
void CActionLabel::rotateIcon()
{
if (++m_count == constNumIcons) {
m_count = 0;
}
setPixmap(*theIcons[m_count]);
}
}