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