|
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 |
}
|