Blame style/animations/adwaitabusyindicatorengine.cpp

Packit 8e9c33
/*************************************************************************
Packit 8e9c33
 * Copyright (C) 2014 by Hugo Pereira Da Costa <hugo.pereira@free.fr>    *
Packit 8e9c33
 *                                                                       *
Packit 8e9c33
 * This program is free software; you can redistribute it and/or modify  *
Packit 8e9c33
 * it under the terms of the GNU General Public License as published by  *
Packit 8e9c33
 * the Free Software Foundation; either version 2 of the License, or     *
Packit 8e9c33
 * (at your option) any later version.                                   *
Packit 8e9c33
 *                                                                       *
Packit 8e9c33
 * This program is distributed in the hope that it will be useful,       *
Packit 8e9c33
 * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
Packit 8e9c33
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
Packit 8e9c33
 * GNU General Public License for more details.                          *
Packit 8e9c33
 *                                                                       *
Packit 8e9c33
 * You should have received a copy of the GNU General Public License     *
Packit 8e9c33
 * along with this program; if not, write to the                         *
Packit 8e9c33
 * Free Software Foundation, Inc.,                                       *
Packit 8e9c33
 * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA .        *
Packit 8e9c33
 *************************************************************************/
Packit 8e9c33
Packit 8e9c33
#include "adwaitabusyindicatorengine.h"
Packit 8e9c33
Packit 8e9c33
#include "adwaita.h"
Packit 8e9c33
Packit 8e9c33
#include <QVariant>
Packit 8e9c33
Packit 8e9c33
namespace Adwaita
Packit 8e9c33
{
Packit 8e9c33
Packit 8e9c33
    //_______________________________________________
Packit 8e9c33
    BusyIndicatorEngine::BusyIndicatorEngine( QObject* object ):
Packit 8e9c33
        BaseEngine( object )
Packit 8e9c33
    {}
Packit 8e9c33
Packit 8e9c33
    //_______________________________________________
Packit 8e9c33
    bool BusyIndicatorEngine::registerWidget( QObject* object )
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // check widget validity
Packit 8e9c33
        if( !object ) return false;
Packit 8e9c33
Packit 8e9c33
         // create new data class
Packit 8e9c33
        if( !_data.contains( object ) )
Packit 8e9c33
        {
Packit 8e9c33
            _data.insert( object, new BusyIndicatorData( this ) );
Packit 8e9c33
Packit 8e9c33
            // connect destruction signal
Packit 8e9c33
            connect( object, SIGNAL(destroyed(QObject*)), this, SLOT(unregisterWidget(QObject*)), Qt::UniqueConnection );
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        return true;
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //____________________________________________________________
Packit 8e9c33
    bool BusyIndicatorEngine::isAnimated( const QObject* object )
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        DataMap<BusyIndicatorData>::Value data( BusyIndicatorEngine::data( object ) );
Packit 8e9c33
        return data && data.data()->isAnimated();
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //____________________________________________________________
Packit 8e9c33
    void BusyIndicatorEngine::setDuration( int value )
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        if( duration() == value ) return;
Packit 8e9c33
        BaseEngine::setDuration( value );
Packit 8e9c33
Packit 8e9c33
        // restart timer with specified time
Packit 8e9c33
        if( _animation )
Packit 8e9c33
        { _animation.data()->setDuration( value ); }
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //____________________________________________________________
Packit 8e9c33
    void BusyIndicatorEngine::setAnimated( const QObject* object, bool value )
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        DataMap<BusyIndicatorData>::Value data( BusyIndicatorEngine::data( object ) );
Packit 8e9c33
        if( data )
Packit 8e9c33
        {
Packit 8e9c33
            // update data
Packit 8e9c33
            data.data()->setAnimated( value );
Packit 8e9c33
Packit 8e9c33
            // start timer if needed
Packit 8e9c33
            if( value )
Packit 8e9c33
            {
Packit 8e9c33
                if( !_animation )
Packit 8e9c33
                {
Packit 8e9c33
Packit 8e9c33
                    // create animation if not already there
Packit 8e9c33
                    _animation = new Animation( duration(), this );
Packit 8e9c33
Packit 8e9c33
                    // setup
Packit 8e9c33
                    _animation.data()->setStartValue( 0.0 );
Packit 8e9c33
                    _animation.data()->setEndValue( 100.0 );
Packit 8e9c33
                    _animation.data()->setTargetObject( this );
Packit 8e9c33
                    _animation.data()->setPropertyName( "value" );
Packit 8e9c33
                    _animation.data()->setLoopCount( -1 );
Packit 8e9c33
                    _animation.data()->setDuration( duration() * 3);
Packit 8e9c33
Packit 8e9c33
                }
Packit 8e9c33
Packit 8e9c33
                // start if  not already running
Packit 8e9c33
                if( !_animation.data()->isRunning() )
Packit 8e9c33
                { _animation.data()->start(); }
Packit 8e9c33
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        return;
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
Packit 8e9c33
    //____________________________________________________________
Packit 8e9c33
    DataMap<BusyIndicatorData>::Value BusyIndicatorEngine::data( const QObject* object )
Packit 8e9c33
    { return _data.find( object ).data(); }
Packit 8e9c33
Packit 8e9c33
    //_______________________________________________
Packit 8e9c33
    void BusyIndicatorEngine::setValue( int value )
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // update
Packit 8e9c33
        _value = value;
Packit 8e9c33
Packit 8e9c33
        bool animated( false );
Packit 8e9c33
Packit 8e9c33
        // loop over objects in map
Packit 8e9c33
        for( DataMap<BusyIndicatorData>::iterator iter = _data.begin(); iter != _data.end(); ++iter )
Packit 8e9c33
        {
Packit 8e9c33
Packit 8e9c33
            if( iter.value().data()->isAnimated() )
Packit 8e9c33
            {
Packit 8e9c33
Packit 8e9c33
                // update animation flag
Packit 8e9c33
                animated = true;
Packit 8e9c33
Packit 8e9c33
                // emit update signal on object
Packit 8e9c33
                if( const_cast<QObject*>( iter.key() )->inherits( "QQuickStyleItem" ))
Packit 8e9c33
                {
Packit 8e9c33
Packit 8e9c33
                    //QtQuickControls "rerender" method is updateItem
Packit 8e9c33
                    QMetaObject::invokeMethod( const_cast<QObject*>( iter.key() ), "updateItem", Qt::QueuedConnection);
Packit 8e9c33
Packit 8e9c33
                } else {
Packit 8e9c33
Packit 8e9c33
                    QMetaObject::invokeMethod( const_cast<QObject*>( iter.key() ), "update", Qt::QueuedConnection);
Packit 8e9c33
Packit 8e9c33
                }
Packit 8e9c33
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        if( _animation && !animated )
Packit 8e9c33
        {
Packit 8e9c33
            _animation.data()->stop();
Packit 8e9c33
            _animation.data()->deleteLater();
Packit 8e9c33
            _animation.clear();
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //__________________________________________________________
Packit 8e9c33
    bool BusyIndicatorEngine::unregisterWidget( QObject* object )
Packit 8e9c33
    {
Packit 8e9c33
        bool removed( _data.unregisterWidget( object ) );
Packit 8e9c33
        if( _animation && _data.isEmpty() )
Packit 8e9c33
        {
Packit 8e9c33
            _animation.data()->stop();
Packit 8e9c33
            _animation.data()->deleteLater();
Packit 8e9c33
            _animation.clear();
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        return removed;
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
}