Blame style/animations/adwaitaanimations.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 "adwaitaanimations.h"
Packit 8e9c33
#include "adwaitapropertynames.h"
Packit 8e9c33
#include "fakeadwaitastyleconfigdata.h"
Packit 8e9c33
Packit 8e9c33
#include <QAbstractItemView>
Packit 8e9c33
#include <QComboBox>
Packit 8e9c33
#include <QCheckBox>
Packit 8e9c33
#include <QDial>
Packit 8e9c33
#include <QGroupBox>
Packit 8e9c33
#include <QHeaderView>
Packit 8e9c33
#include <QLineEdit>
Packit 8e9c33
#include <QProgressBar>
Packit 8e9c33
#include <QRadioButton>
Packit 8e9c33
#include <QScrollBar>
Packit 8e9c33
#include <QSpinBox>
Packit 8e9c33
#include <QTextEdit>
Packit 8e9c33
#include <QToolBox>
Packit 8e9c33
#include <QToolButton>
Packit 8e9c33
Packit 8e9c33
namespace Adwaita
Packit 8e9c33
{
Packit 8e9c33
Packit 8e9c33
    //____________________________________________________________
Packit 8e9c33
    Animations::Animations( QObject* parent ):
Packit 8e9c33
        QObject( parent )
Packit 8e9c33
    {
Packit 8e9c33
        _widgetEnabilityEngine = new WidgetStateEngine( this );
Packit 8e9c33
        _busyIndicatorEngine = new BusyIndicatorEngine( this );
Packit 8e9c33
        _comboBoxEngine = new WidgetStateEngine( this );
Packit 8e9c33
        _toolButtonEngine = new WidgetStateEngine( this );
Packit 8e9c33
        _spinBoxEngine = new SpinBoxEngine( this );
Packit 8e9c33
        _toolBoxEngine = new ToolBoxEngine( this );
Packit 8e9c33
Packit 8e9c33
        registerEngine( _headerViewEngine = new HeaderViewEngine( this ) );
Packit 8e9c33
        registerEngine( _widgetStateEngine = new WidgetStateEngine( this ) );
Packit 8e9c33
        registerEngine( _inputWidgetEngine = new WidgetStateEngine( this ) );
Packit 8e9c33
        registerEngine( _scrollBarEngine = new ScrollBarEngine( this ) );
Packit 8e9c33
        registerEngine( _stackedWidgetEngine = new StackedWidgetEngine( this ) );
Packit 8e9c33
        registerEngine( _tabBarEngine = new TabBarEngine( this ) );
Packit 8e9c33
        registerEngine( _dialEngine = new DialEngine( this ) );
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //____________________________________________________________
Packit 8e9c33
    void Animations::setupEngines( void )
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // animation steps
Packit 8e9c33
        AnimationData::setSteps( StyleConfigData::animationSteps() );
Packit 8e9c33
Packit 8e9c33
        bool animationsEnabled( StyleConfigData::animationsEnabled() );
Packit 8e9c33
        int animationsDuration( StyleConfigData::animationsDuration() );
Packit 8e9c33
Packit 8e9c33
        _widgetEnabilityEngine->setEnabled( animationsEnabled );
Packit 8e9c33
        _comboBoxEngine->setEnabled( animationsEnabled );
Packit 8e9c33
        _toolButtonEngine->setEnabled( animationsEnabled );
Packit 8e9c33
        _spinBoxEngine->setEnabled( animationsEnabled );
Packit 8e9c33
        _toolBoxEngine->setEnabled( animationsEnabled );
Packit 8e9c33
Packit 8e9c33
        _widgetEnabilityEngine->setDuration( animationsDuration );
Packit 8e9c33
        _comboBoxEngine->setDuration( animationsDuration );
Packit 8e9c33
        _toolButtonEngine->setDuration( animationsDuration );
Packit 8e9c33
        _spinBoxEngine->setDuration( animationsDuration );
Packit 8e9c33
        _stackedWidgetEngine->setDuration( animationsDuration );
Packit 8e9c33
        _toolBoxEngine->setDuration( animationsDuration );
Packit 8e9c33
Packit 8e9c33
        // registered engines
Packit 8e9c33
        foreach( const BaseEngine::Pointer& engine, _engines )
Packit 8e9c33
        {
Packit 8e9c33
            engine.data()->setEnabled( animationsEnabled );
Packit 8e9c33
            engine.data()->setDuration( animationsDuration );
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        // stacked widget transition has an extra flag for animations
Packit 8e9c33
        _stackedWidgetEngine->setEnabled( animationsEnabled && StyleConfigData::stackedWidgetTransitionsEnabled() );
Packit 8e9c33
Packit 8e9c33
        // busy indicator
Packit 8e9c33
        _busyIndicatorEngine->setEnabled( StyleConfigData::progressBarAnimated() );
Packit 8e9c33
        _busyIndicatorEngine->setDuration( StyleConfigData::progressBarBusyStepDuration() );
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //____________________________________________________________
Packit 8e9c33
    void Animations::registerWidget( QWidget* widget ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        if( !widget ) return;
Packit 8e9c33
Packit 8e9c33
        // check against noAnimations propery
Packit 8e9c33
        QVariant propertyValue( widget->property( PropertyNames::noAnimations ) );
Packit 8e9c33
        if( propertyValue.isValid() && propertyValue.toBool() ) return;
Packit 8e9c33
Packit 8e9c33
        // all widgets are registered to the enability engine.
Packit 8e9c33
        _widgetEnabilityEngine->registerWidget( widget, AnimationEnable );
Packit 8e9c33
Packit 8e9c33
        // install animation timers
Packit 8e9c33
        // for optimization, one should put with most used widgets here first
Packit 8e9c33
Packit 8e9c33
        // buttons
Packit 8e9c33
        if( qobject_cast<QToolButton*>(widget) )
Packit 8e9c33
        {
Packit 8e9c33
Packit 8e9c33
            _toolButtonEngine->registerWidget( widget, AnimationHover|AnimationPressed );
Packit 8e9c33
            _widgetStateEngine->registerWidget( widget, AnimationHover|AnimationPressed );
Packit 8e9c33
Packit 8e9c33
        } else if( qobject_cast<QCheckBox*>(widget) || qobject_cast<QRadioButton*>(widget) ) {
Packit 8e9c33
Packit 8e9c33
            _widgetStateEngine->registerWidget( widget, AnimationHover|AnimationFocus|AnimationPressed );
Packit 8e9c33
Packit 8e9c33
        } else if( qobject_cast<QAbstractButton*>(widget) ) {
Packit 8e9c33
Packit 8e9c33
            // register to toolbox engine if needed
Packit 8e9c33
            if( qobject_cast<QToolBox*>( widget->parent() ) )
Packit 8e9c33
            { _toolBoxEngine->registerWidget( widget ); }
Packit 8e9c33
Packit 8e9c33
            _widgetStateEngine->registerWidget( widget, AnimationHover|AnimationPressed );
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        // groupboxes
Packit 8e9c33
        else if( QGroupBox* groupBox = qobject_cast<QGroupBox*>( widget ) )
Packit 8e9c33
        {
Packit 8e9c33
            if( groupBox->isCheckable() )
Packit 8e9c33
            { _widgetStateEngine->registerWidget( widget, AnimationHover|AnimationFocus ); }
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        // sliders
Packit 8e9c33
        else if( qobject_cast<QScrollBar*>( widget ) ) { _scrollBarEngine->registerWidget( widget, AnimationHover|AnimationFocus ); }
Packit 8e9c33
        else if( qobject_cast<QSlider*>( widget ) ) { _widgetStateEngine->registerWidget( widget, AnimationHover|AnimationFocus ); }
Packit 8e9c33
        else if( qobject_cast<QDial*>( widget ) ) { _dialEngine->registerWidget( widget, AnimationHover|AnimationFocus ); }
Packit 8e9c33
Packit 8e9c33
        // progress bar
Packit 8e9c33
        else if( qobject_cast<QProgressBar*>( widget ) ) { _busyIndicatorEngine->registerWidget( widget ); }
Packit 8e9c33
Packit 8e9c33
        // combo box
Packit 8e9c33
        else if( qobject_cast<QComboBox*>( widget ) ) {
Packit 8e9c33
            _comboBoxEngine->registerWidget( widget, AnimationHover|AnimationPressed );
Packit 8e9c33
            _inputWidgetEngine->registerWidget( widget, AnimationHover|AnimationFocus|AnimationPressed );
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        // spinbox
Packit 8e9c33
        else if( qobject_cast<QAbstractSpinBox*>( widget ) ) {
Packit 8e9c33
            _spinBoxEngine->registerWidget( widget );
Packit 8e9c33
            _inputWidgetEngine->registerWidget( widget, AnimationHover|AnimationFocus|AnimationPressed );
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        // editors
Packit 8e9c33
        else if( qobject_cast<QLineEdit*>( widget ) ) { _inputWidgetEngine->registerWidget( widget, AnimationHover|AnimationFocus ); }
Packit 8e9c33
        else if( qobject_cast<QTextEdit*>( widget ) ) { _inputWidgetEngine->registerWidget( widget, AnimationHover|AnimationFocus ); }
Packit 8e9c33
        else if( widget->inherits( "KTextEditor::View" ) ) { _inputWidgetEngine->registerWidget( widget, AnimationHover|AnimationFocus ); }
Packit 8e9c33
Packit 8e9c33
        // header views
Packit 8e9c33
        // need to come before abstract item view, otherwise is skipped
Packit 8e9c33
        else if( qobject_cast<QHeaderView*>( widget ) ) { _headerViewEngine->registerWidget( widget ); }
Packit 8e9c33
Packit 8e9c33
        // lists
Packit 8e9c33
        else if( qobject_cast<QAbstractItemView*>( widget ) )
Packit 8e9c33
        { _inputWidgetEngine->registerWidget( widget, AnimationHover|AnimationFocus ); }
Packit 8e9c33
Packit 8e9c33
        // tabbar
Packit 8e9c33
        else if( qobject_cast<QTabBar*>( widget ) ) { _tabBarEngine->registerWidget( widget ); }
Packit 8e9c33
Packit 8e9c33
        // scrollarea
Packit 8e9c33
        else if( QAbstractScrollArea* scrollArea = qobject_cast<QAbstractScrollArea*>( widget ) ) {
Packit 8e9c33
Packit 8e9c33
            if( scrollArea->frameShadow() == QFrame::Sunken && (widget->focusPolicy()&Qt::StrongFocus) )
Packit 8e9c33
            { _inputWidgetEngine->registerWidget( widget, AnimationHover|AnimationFocus ); }
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        // stacked widgets
Packit 8e9c33
        if( QStackedWidget* stack = qobject_cast<QStackedWidget*>( widget ) )
Packit 8e9c33
        { _stackedWidgetEngine->registerWidget( stack ); }
Packit 8e9c33
Packit 8e9c33
        return;
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //____________________________________________________________
Packit 8e9c33
    void Animations::unregisterWidget( QWidget* widget ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        if( !widget ) return;
Packit 8e9c33
Packit 8e9c33
        _widgetEnabilityEngine->unregisterWidget( widget );
Packit 8e9c33
        _spinBoxEngine->unregisterWidget( widget );
Packit 8e9c33
        _comboBoxEngine->unregisterWidget( widget );
Packit 8e9c33
        _busyIndicatorEngine->registerWidget( widget );
Packit 8e9c33
Packit 8e9c33
        // the following allows some optimization of widget unregistration
Packit 8e9c33
        // it assumes that a widget can be registered atmost in one of the
Packit 8e9c33
        // engines stored in the list.
Packit 8e9c33
        foreach( const BaseEngine::Pointer& engine, _engines )
Packit 8e9c33
        { if( engine && engine.data()->unregisterWidget( widget ) ) break; }
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //_______________________________________________________________
Packit 8e9c33
    void Animations::unregisterEngine( QObject* object )
Packit 8e9c33
    {
Packit 8e9c33
        int index( _engines.indexOf( qobject_cast<BaseEngine*>(object) ) );
Packit 8e9c33
        if( index >= 0 ) _engines.removeAt( index );
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //_______________________________________________________________
Packit 8e9c33
    void Animations::registerEngine( BaseEngine* engine )
Packit 8e9c33
    {
Packit 8e9c33
        _engines.append( engine );
Packit 8e9c33
        connect( engine, SIGNAL(destroyed(QObject*)), this, SLOT(unregisterEngine(QObject*)) );
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
}