You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

103 lines
2.5 KiB

/***************************************************************************
* Copyright (C) 2009 by Pino Toscano <pino@kde.org> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
***************************************************************************/
#include "animatedwidget.h"
#include <qevent.h>
#include <qpainter.h>
#include <kiconloader.h>
AnimatedWidget::AnimatedWidget( const QString& iconName, QWidget *parent )
: QWidget( parent ), m_icon( iconName ), m_frames( 0 ), m_currentFrame( 0 ),
m_size( 0 )
{
setAutoFillBackground( false );
hide();
}
AnimatedWidget::~AnimatedWidget()
{
}
void AnimatedWidget::start()
{
if ( m_timer.isActive() )
return;
if ( !m_frames )
{
load();
if ( !m_frames )
return;
}
m_timer.start( 1000 / m_frames, this );
show();
}
void AnimatedWidget::stop()
{
m_timer.stop();
m_currentFrame = 0;
hide();
}
void AnimatedWidget::paintEvent( QPaintEvent *event )
{
Q_UNUSED( event );
const int row_size = m_pixmap.width() / m_size;
const int row = m_currentFrame / row_size;
const int column = m_currentFrame % row_size;
QPainter p( this );
p.fillRect( rect(), Qt::transparent );
p.drawPixmap( 0, 0, m_pixmap, column * m_size, row * m_size, m_size, m_size );
}
void AnimatedWidget::resizeEvent( QResizeEvent *event )
{
Q_UNUSED( event );
m_timer.stop();
load();
}
void AnimatedWidget::timerEvent( QTimerEvent *event )
{
if ( event->timerId() == m_timer.timerId() )
{
m_currentFrame++;
if ( m_currentFrame == m_frames )
m_currentFrame = 0;
update();
}
QWidget::timerEvent( event );
}
void AnimatedWidget::load()
{
// FIXME implement a better logic for the animation size
m_size = 22;
const QString path = KIconLoader::global()->iconPath( m_icon, -m_size );
QPixmap pix( path );
if ( pix.isNull() )
return;
if ( ( pix.width() % m_size != 0 ) || ( pix.height() % m_size != 0 ) )
return;
m_frames = ( pix.height() / m_size ) * ( pix.width() / m_size );
m_pixmap = pix;
m_currentFrame = 0;
}
#include "animatedwidget.moc"