Blame src/lib/animations/adwaitaanimations.cpp

Packit Bot 052d53
/*************************************************************************
Packit Bot 052d53
 * Copyright (C) 2014 by Hugo Pereira Da Costa <hugo.pereira@free.fr>    *
Packit Bot 052d53
 *                                                                       *
Packit Bot 052d53
 * This program is free software; you can redistribute it and/or modify  *
Packit Bot 052d53
 * it under the terms of the GNU General Public License as published by  *
Packit Bot 052d53
 * the Free Software Foundation; either version 2 of the License, or     *
Packit Bot 052d53
 * (at your option) any later version.                                   *
Packit Bot 052d53
 *                                                                       *
Packit Bot 052d53
 * This program is distributed in the hope that it will be useful,       *
Packit Bot 052d53
 * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
Packit Bot 052d53
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
Packit Bot 052d53
 * GNU General Public License for more details.                          *
Packit Bot 052d53
 *                                                                       *
Packit Bot 052d53
 * You should have received a copy of the GNU General Public License     *
Packit Bot 052d53
 * along with this program; if not, write to the                         *
Packit Bot 052d53
 * Free Software Foundation, Inc.,                                       *
Packit Bot 052d53
 * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA .        *
Packit Bot 052d53
 *************************************************************************/
Packit Bot 052d53
Packit Bot 052d53
#include "adwaitaanimations.h"
Packit Bot 052d53
Packit Bot 052d53
#include <QAbstractItemView>
Packit Bot 052d53
#include <QComboBox>
Packit Bot 052d53
#include <QCheckBox>
Packit Bot 052d53
#include <QDial>
Packit Bot 052d53
#include <QGroupBox>
Packit Bot 052d53
#include <QHeaderView>
Packit Bot 052d53
#include <QLineEdit>
Packit Bot 052d53
#include <QProgressBar>
Packit Bot 052d53
#include <QRadioButton>
Packit Bot 052d53
#include <QScrollBar>
Packit Bot 052d53
#include <QSpinBox>
Packit Bot 052d53
#include <QTextEdit>
Packit Bot 052d53
#include <QToolBox>
Packit Bot 052d53
#include <QToolButton>
Packit Bot 052d53
Packit Bot 052d53
namespace Adwaita
Packit Bot 052d53
{
Packit Bot 052d53
Packit Bot 052d53
//____________________________________________________________
Packit Bot 052d53
Animations::Animations(QObject *parent)
Packit Bot 052d53
    : QObject(parent)
Packit Bot 052d53
{
Packit Bot 052d53
    _widgetEnabilityEngine = new WidgetStateEngine(this);
Packit Bot 052d53
    _busyIndicatorEngine = new BusyIndicatorEngine(this);
Packit Bot 052d53
    _comboBoxEngine = new WidgetStateEngine(this);
Packit Bot 052d53
    _toolButtonEngine = new WidgetStateEngine(this);
Packit Bot 052d53
    _spinBoxEngine = new SpinBoxEngine(this);
Packit Bot 052d53
    _toolBoxEngine = new ToolBoxEngine(this);
Packit Bot 052d53
Packit Bot 052d53
    registerEngine(_headerViewEngine = new HeaderViewEngine(this));
Packit Bot 052d53
    registerEngine(_widgetStateEngine = new WidgetStateEngine(this));
Packit Bot 052d53
    registerEngine(_inputWidgetEngine = new WidgetStateEngine(this));
Packit Bot 052d53
    registerEngine(_scrollBarEngine = new ScrollBarEngine(this));
Packit Bot 052d53
    registerEngine(_stackedWidgetEngine = new StackedWidgetEngine(this));
Packit Bot 052d53
    registerEngine(_tabBarEngine = new TabBarEngine(this));
Packit Bot 052d53
    registerEngine(_dialEngine = new DialEngine(this));
Packit Bot 052d53
}
Packit Bot 052d53
Packit Bot 052d53
//____________________________________________________________
Packit Bot 052d53
void Animations::setupEngines()
Packit Bot 052d53
{
Packit Bot 052d53
    // animation steps
Packit Bot 052d53
    AnimationData::setSteps(Adwaita::Config::AnimationSteps);
Packit Bot 052d53
Packit Bot 052d53
    bool animationsEnabled(Adwaita::Config::AnimationsEnabled);
Packit Bot 052d53
    int animationsDuration(Adwaita::Config::AnimationsDuration);
Packit Bot 052d53
Packit Bot 052d53
    _widgetEnabilityEngine->setEnabled(animationsEnabled);
Packit Bot 052d53
    _comboBoxEngine->setEnabled(animationsEnabled);
Packit Bot 052d53
    _toolButtonEngine->setEnabled(animationsEnabled);
Packit Bot 052d53
    _spinBoxEngine->setEnabled(animationsEnabled);
Packit Bot 052d53
    _toolBoxEngine->setEnabled(animationsEnabled);
Packit Bot 052d53
Packit Bot 052d53
    _widgetEnabilityEngine->setDuration(animationsDuration);
Packit Bot 052d53
    _comboBoxEngine->setDuration(animationsDuration);
Packit Bot 052d53
    _toolButtonEngine->setDuration(animationsDuration);
Packit Bot 052d53
    _spinBoxEngine->setDuration(animationsDuration);
Packit Bot 052d53
    _stackedWidgetEngine->setDuration(animationsDuration);
Packit Bot 052d53
    _toolBoxEngine->setDuration(animationsDuration);
Packit Bot 052d53
Packit Bot 052d53
    // registered engines
Packit Bot 052d53
    foreach (const BaseEngine::Pointer &engine, _engines) {
Packit Bot 052d53
        engine.data()->setEnabled(animationsEnabled);
Packit Bot 052d53
        engine.data()->setDuration(animationsDuration);
Packit Bot 052d53
    }
Packit Bot 052d53
Packit Bot 052d53
    // stacked widget transition has an extra flag for animations
Packit Bot 052d53
    _stackedWidgetEngine->setEnabled(animationsEnabled && Adwaita::Config::StackedWidgetTransitionsEnabled);
Packit Bot 052d53
Packit Bot 052d53
    // busy indicator
Packit Bot 052d53
    _busyIndicatorEngine->setEnabled(Adwaita::Config::ProgressBarAnimated);
Packit Bot 052d53
    _busyIndicatorEngine->setDuration(Adwaita::Config::ProgressBarBusyStepDuration);
Packit Bot 052d53
}
Packit Bot 052d53
Packit Bot 052d53
//____________________________________________________________
Packit Bot 052d53
void Animations::registerWidget(QWidget *widget) const
Packit Bot 052d53
{
Packit Bot 052d53
    if (!widget) {
Packit Bot 052d53
        return;
Packit Bot 052d53
    }
Packit Bot 052d53
Packit Bot 052d53
    // check against noAnimations propery
Packit Bot 052d53
    QVariant propertyValue(widget->property(PropertyNames::noAnimations));
Packit Bot 052d53
    if (propertyValue.isValid() && propertyValue.toBool()) {
Packit Bot 052d53
        return;
Packit Bot 052d53
    }
Packit Bot 052d53
Packit Bot 052d53
    // all widgets are registered to the enability engine.
Packit Bot 052d53
    _widgetEnabilityEngine->registerWidget(widget, AnimationEnable);
Packit Bot 052d53
Packit Bot 052d53
    // install animation timers
Packit Bot 052d53
    // for optimization, one should put with most used widgets here first
Packit Bot 052d53
Packit Bot 052d53
    // buttons
Packit Bot 052d53
    if (qobject_cast<QToolButton *>(widget)) {
Packit Bot 052d53
        _toolButtonEngine->registerWidget(widget, AnimationHover | AnimationPressed);
Packit Bot 052d53
        _widgetStateEngine->registerWidget(widget, AnimationHover | AnimationPressed);
Packit Bot 052d53
    } else if (qobject_cast<QCheckBox *>(widget) || qobject_cast<QRadioButton *>(widget)) {
Packit Bot 052d53
        _widgetStateEngine->registerWidget(widget, AnimationHover | AnimationFocus | AnimationPressed);
Packit Bot 052d53
    } else if (qobject_cast<QAbstractButton *>(widget)) {
Packit Bot 052d53
        // register to toolbox engine if needed
Packit Bot 052d53
        if (qobject_cast<QToolBox *>(widget->parent())) {
Packit Bot 052d53
            _toolBoxEngine->registerWidget(widget);
Packit Bot 052d53
        }
Packit Bot 052d53
Packit Bot 052d53
        _widgetStateEngine->registerWidget(widget, AnimationHover | AnimationPressed);
Packit Bot 052d53
    // groupboxes
Packit Bot 052d53
    } else if (QGroupBox *groupBox = qobject_cast<QGroupBox *>(widget)) {
Packit Bot 052d53
        if (groupBox->isCheckable()) {
Packit Bot 052d53
            _widgetStateEngine->registerWidget(widget, AnimationHover | AnimationFocus);
Packit Bot 052d53
        }
Packit Bot 052d53
    // sliders
Packit Bot 052d53
    } else if (qobject_cast<QScrollBar *>(widget)) {
Packit Bot 052d53
        _scrollBarEngine->registerWidget(widget, AnimationHover | AnimationFocus);
Packit Bot 052d53
    } else if (qobject_cast<QSlider *>(widget)) {
Packit Bot 052d53
        _widgetStateEngine->registerWidget(widget, AnimationHover | AnimationFocus);
Packit Bot 052d53
    } else if (qobject_cast<QDial *>(widget)) {
Packit Bot 052d53
        _dialEngine->registerWidget(widget, AnimationHover | AnimationFocus);
Packit Bot 052d53
    // progress bar
Packit Bot 052d53
    } else if (qobject_cast<QProgressBar *>(widget)) {
Packit Bot 052d53
        _busyIndicatorEngine->registerWidget(widget);
Packit Bot 052d53
    // combo box
Packit Bot 052d53
    } else if (qobject_cast<QComboBox *>(widget)) {
Packit Bot 052d53
        _comboBoxEngine->registerWidget(widget, AnimationHover | AnimationPressed);
Packit Bot 052d53
        _inputWidgetEngine->registerWidget(widget, AnimationHover | AnimationFocus | AnimationPressed);
Packit Bot 052d53
    // spinbox
Packit Bot 052d53
    } else if (qobject_cast<QAbstractSpinBox *>(widget)) {
Packit Bot 052d53
        _spinBoxEngine->registerWidget(widget);
Packit Bot 052d53
        _inputWidgetEngine->registerWidget(widget, AnimationHover | AnimationFocus | AnimationPressed);
Packit Bot 052d53
    // editors
Packit Bot 052d53
    } else if (qobject_cast<QLineEdit *>(widget)) {
Packit Bot 052d53
        _inputWidgetEngine->registerWidget(widget, AnimationHover | AnimationFocus);
Packit Bot 052d53
    } else if (qobject_cast<QTextEdit *>(widget)) {
Packit Bot 052d53
        _inputWidgetEngine->registerWidget(widget, AnimationHover | AnimationFocus);
Packit Bot 052d53
    } else if (widget->inherits("KTextEditor::View")) {
Packit Bot 052d53
        _inputWidgetEngine->registerWidget(widget, AnimationHover | AnimationFocus);
Packit Bot 052d53
    // header views
Packit Bot 052d53
    // need to come before abstract item view, otherwise is skipped
Packit Bot 052d53
    } else if (qobject_cast<QHeaderView *>(widget)) {
Packit Bot 052d53
        _headerViewEngine->registerWidget(widget);
Packit Bot 052d53
    // lists
Packit Bot 052d53
    } else if (qobject_cast<QAbstractItemView *>(widget)) {
Packit Bot 052d53
        _inputWidgetEngine->registerWidget(widget, AnimationHover | AnimationFocus);
Packit Bot 052d53
    // tabbar
Packit Bot 052d53
    } else if (qobject_cast<QTabBar *>(widget)) {
Packit Bot 052d53
        _tabBarEngine->registerWidget(widget);
Packit Bot 052d53
    // scrollarea
Packit Bot 052d53
    } else if (QAbstractScrollArea *scrollArea = qobject_cast<QAbstractScrollArea *>(widget)) {
Packit Bot 052d53
        if (scrollArea->frameShadow() == QFrame::Sunken && (widget->focusPolicy()&Qt::StrongFocus)) {
Packit Bot 052d53
            _inputWidgetEngine->registerWidget(widget, AnimationHover | AnimationFocus);
Packit Bot 052d53
        }
Packit Bot 052d53
    }
Packit Bot 052d53
Packit Bot 052d53
    // stacked widgets
Packit Bot 052d53
    if (QStackedWidget *stack = qobject_cast<QStackedWidget *>(widget)) {
Packit Bot 052d53
        _stackedWidgetEngine->registerWidget(stack);
Packit Bot 052d53
    }
Packit Bot 052d53
Packit Bot 052d53
    return;
Packit Bot 052d53
}
Packit Bot 052d53
Packit Bot 052d53
//____________________________________________________________
Packit Bot 052d53
void Animations::unregisterWidget(QWidget *widget) const
Packit Bot 052d53
{
Packit Bot 052d53
    if (!widget) {
Packit Bot 052d53
        return;
Packit Bot 052d53
    }
Packit Bot 052d53
Packit Bot 052d53
    _widgetEnabilityEngine->unregisterWidget(widget);
Packit Bot 052d53
    _spinBoxEngine->unregisterWidget(widget);
Packit Bot 052d53
    _comboBoxEngine->unregisterWidget(widget);
Packit Bot 052d53
    _busyIndicatorEngine->registerWidget(widget);
Packit Bot 052d53
Packit Bot 052d53
    // the following allows some optimization of widget unregistration
Packit Bot 052d53
    // it assumes that a widget can be registered atmost in one of the
Packit Bot 052d53
    // engines stored in the list.
Packit Bot 052d53
    foreach (const BaseEngine::Pointer &engine, _engines) {
Packit Bot 052d53
        if (engine && engine.data()->unregisterWidget(widget)) {
Packit Bot 052d53
            break;
Packit Bot 052d53
        }
Packit Bot 052d53
    }
Packit Bot 052d53
}
Packit Bot 052d53
Packit Bot 052d53
//_______________________________________________________________
Packit Bot 052d53
void Animations::unregisterEngine(QObject *object)
Packit Bot 052d53
{
Packit Bot 052d53
    int index(_engines.indexOf(qobject_cast<BaseEngine *>(object)));
Packit Bot 052d53
    if (index >= 0) {
Packit Bot 052d53
        _engines.removeAt(index);
Packit Bot 052d53
    }
Packit Bot 052d53
}
Packit Bot 052d53
Packit Bot 052d53
//_______________________________________________________________
Packit Bot 052d53
void Animations::registerEngine(BaseEngine *engine)
Packit Bot 052d53
{
Packit Bot 052d53
    _engines.append(engine);
Packit Bot 052d53
    connect(engine, SIGNAL(destroyed(QObject *)), this, SLOT(unregisterEngine(QObject *)));
Packit Bot 052d53
}
Packit Bot 052d53
Packit Bot 052d53
} // namespace Adwaita