mirror of
https://gitgud.io/wackyideas/aerothemeplasma.git
synced 2024-08-15 00:43:43 +00:00
230 lines
8 KiB
C++
230 lines
8 KiB
C++
/*
|
|
* SPDX-FileCopyrightText: 2014 Hugo Pereira Da Costa <hugo.pereira@free.fr>
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
|
*/
|
|
|
|
#include "breezeanimations.h"
|
|
#include "breezepropertynames.h"
|
|
#include "breezestyleconfigdata.h"
|
|
|
|
#include <QAbstractItemView>
|
|
#include <QCheckBox>
|
|
#include <QComboBox>
|
|
#include <QDial>
|
|
#include <QGroupBox>
|
|
#include <QHeaderView>
|
|
#include <QLineEdit>
|
|
#include <QProgressBar>
|
|
#include <QRadioButton>
|
|
#include <QScrollBar>
|
|
#include <QSpinBox>
|
|
#include <QTextEdit>
|
|
#include <QToolBox>
|
|
#include <QToolButton>
|
|
|
|
namespace Breeze
|
|
{
|
|
//____________________________________________________________
|
|
Animations::Animations(QObject *parent)
|
|
: QObject(parent)
|
|
{
|
|
_widgetEnabilityEngine = new WidgetStateEngine(this);
|
|
_busyIndicatorEngine = new BusyIndicatorEngine(this);
|
|
_comboBoxEngine = new WidgetStateEngine(this);
|
|
_toolButtonEngine = new WidgetStateEngine(this);
|
|
_spinBoxEngine = new SpinBoxEngine(this);
|
|
_toolBoxEngine = new ToolBoxEngine(this);
|
|
|
|
registerEngine(_headerViewEngine = new HeaderViewEngine(this));
|
|
registerEngine(_widgetStateEngine = new WidgetStateEngine(this));
|
|
registerEngine(_inputWidgetEngine = new WidgetStateEngine(this));
|
|
registerEngine(_scrollBarEngine = new ScrollBarEngine(this));
|
|
registerEngine(_stackedWidgetEngine = new StackedWidgetEngine(this));
|
|
registerEngine(_tabBarEngine = new TabBarEngine(this));
|
|
registerEngine(_dialEngine = new DialEngine(this));
|
|
}
|
|
|
|
//____________________________________________________________
|
|
void Animations::setupEngines()
|
|
{
|
|
// animation steps
|
|
AnimationData::setSteps(StyleConfigData::animationSteps());
|
|
|
|
const bool animationsEnabled(StyleConfigData::animationsEnabled());
|
|
const int animationsDuration(StyleConfigData::animationsDuration());
|
|
|
|
_widgetEnabilityEngine->setEnabled(animationsEnabled);
|
|
_comboBoxEngine->setEnabled(animationsEnabled);
|
|
_toolButtonEngine->setEnabled(animationsEnabled);
|
|
_spinBoxEngine->setEnabled(animationsEnabled);
|
|
_toolBoxEngine->setEnabled(animationsEnabled);
|
|
|
|
_widgetEnabilityEngine->setDuration(animationsDuration);
|
|
_comboBoxEngine->setDuration(animationsDuration);
|
|
_toolButtonEngine->setDuration(animationsDuration);
|
|
_spinBoxEngine->setDuration(animationsDuration);
|
|
_stackedWidgetEngine->setDuration(animationsDuration);
|
|
_toolBoxEngine->setDuration(animationsDuration);
|
|
|
|
// registered engines
|
|
for (const BaseEngine::Pointer &engine : std::as_const(_engines)) {
|
|
engine.data()->setEnabled(animationsEnabled);
|
|
engine.data()->setDuration(animationsDuration);
|
|
}
|
|
|
|
// stacked widget transition has an extra flag for animations
|
|
_stackedWidgetEngine->setEnabled(animationsEnabled && StyleConfigData::stackedWidgetTransitionsEnabled());
|
|
|
|
// busy indicator
|
|
_busyIndicatorEngine->setEnabled(StyleConfigData::progressBarAnimated());
|
|
_busyIndicatorEngine->setDuration(StyleConfigData::progressBarBusyStepDuration());
|
|
}
|
|
|
|
//____________________________________________________________
|
|
void Animations::registerWidget(QWidget *widget) const
|
|
{
|
|
if (!widget) {
|
|
return;
|
|
}
|
|
|
|
// check against noAnimations property
|
|
QVariant propertyValue(widget->property(PropertyNames::noAnimations));
|
|
if (propertyValue.isValid() && propertyValue.toBool()) {
|
|
return;
|
|
}
|
|
|
|
// all widgets are registered to the enability engine.
|
|
_widgetEnabilityEngine->registerWidget(widget, AnimationEnable);
|
|
|
|
// install animation timers
|
|
// for optimization, one should put with most used widgets here first
|
|
|
|
// buttons
|
|
if (qobject_cast<QToolButton *>(widget)) {
|
|
_toolButtonEngine->registerWidget(widget, AnimationHover | AnimationFocus);
|
|
_widgetStateEngine->registerWidget(widget, AnimationHover | AnimationFocus);
|
|
|
|
} else if (qobject_cast<QCheckBox *>(widget) || qobject_cast<QRadioButton *>(widget)) {
|
|
_widgetStateEngine->registerWidget(widget, AnimationHover | AnimationFocus | AnimationPressed);
|
|
|
|
} else if (qobject_cast<QAbstractButton *>(widget)) {
|
|
// register to toolbox engine if needed
|
|
if (qobject_cast<QToolBox *>(widget->parent())) {
|
|
_toolBoxEngine->registerWidget(widget);
|
|
}
|
|
|
|
_widgetStateEngine->registerWidget(widget, AnimationHover | AnimationFocus);
|
|
|
|
}
|
|
|
|
// groupboxes
|
|
else if (QGroupBox *groupBox = qobject_cast<QGroupBox *>(widget)) {
|
|
if (groupBox->isCheckable()) {
|
|
_widgetStateEngine->registerWidget(widget, AnimationHover | AnimationFocus);
|
|
}
|
|
}
|
|
|
|
// sliders
|
|
else if (qobject_cast<QScrollBar *>(widget)) {
|
|
_scrollBarEngine->registerWidget(widget, AnimationHover | AnimationFocus);
|
|
} else if (qobject_cast<QSlider *>(widget)) {
|
|
_widgetStateEngine->registerWidget(widget, AnimationHover | AnimationFocus);
|
|
} else if (qobject_cast<QDial *>(widget)) {
|
|
_dialEngine->registerWidget(widget, AnimationHover | AnimationFocus);
|
|
}
|
|
|
|
// progress bar
|
|
else if (qobject_cast<QProgressBar *>(widget)) {
|
|
_busyIndicatorEngine->registerWidget(widget);
|
|
}
|
|
|
|
// combo box
|
|
else if (qobject_cast<QComboBox *>(widget)) {
|
|
_comboBoxEngine->registerWidget(widget, AnimationHover);
|
|
_inputWidgetEngine->registerWidget(widget, AnimationHover | AnimationFocus);
|
|
}
|
|
|
|
// spinbox
|
|
else if (qobject_cast<QSpinBox *>(widget)) {
|
|
_spinBoxEngine->registerWidget(widget);
|
|
_inputWidgetEngine->registerWidget(widget, AnimationHover | AnimationFocus);
|
|
}
|
|
|
|
// editors
|
|
else if (qobject_cast<QLineEdit *>(widget)) {
|
|
_inputWidgetEngine->registerWidget(widget, AnimationHover | AnimationFocus);
|
|
} else if (qobject_cast<QTextEdit *>(widget)) {
|
|
_inputWidgetEngine->registerWidget(widget, AnimationHover | AnimationFocus);
|
|
} else if (widget->inherits("KTextEditor::View")) {
|
|
_inputWidgetEngine->registerWidget(widget, AnimationHover | AnimationFocus);
|
|
}
|
|
|
|
// header views
|
|
// need to come before abstract item view, otherwise is skipped
|
|
else if (qobject_cast<QHeaderView *>(widget)) {
|
|
_headerViewEngine->registerWidget(widget);
|
|
}
|
|
|
|
// lists
|
|
else if (qobject_cast<QAbstractItemView *>(widget)) {
|
|
_inputWidgetEngine->registerWidget(widget, AnimationHover | AnimationFocus);
|
|
}
|
|
|
|
// tabbar
|
|
else if (qobject_cast<QTabBar *>(widget)) {
|
|
_tabBarEngine->registerWidget(widget);
|
|
}
|
|
|
|
// scrollarea
|
|
else if (QAbstractScrollArea *scrollArea = qobject_cast<QAbstractScrollArea *>(widget)) {
|
|
if (scrollArea->frameShadow() == QFrame::Sunken && (widget->focusPolicy() & Qt::StrongFocus)) {
|
|
_inputWidgetEngine->registerWidget(widget, AnimationHover | AnimationFocus);
|
|
}
|
|
}
|
|
|
|
// stacked widgets
|
|
if (QStackedWidget *stack = qobject_cast<QStackedWidget *>(widget)) {
|
|
_stackedWidgetEngine->registerWidget(stack);
|
|
}
|
|
}
|
|
|
|
//____________________________________________________________
|
|
void Animations::unregisterWidget(QWidget *widget) const
|
|
{
|
|
if (!widget) {
|
|
return;
|
|
}
|
|
|
|
_widgetEnabilityEngine->unregisterWidget(widget);
|
|
_spinBoxEngine->unregisterWidget(widget);
|
|
_comboBoxEngine->unregisterWidget(widget);
|
|
_busyIndicatorEngine->unregisterWidget(widget);
|
|
|
|
// the following allows some optimization of widget unregistration
|
|
// it assumes that a widget can be registered atmost in one of the
|
|
// engines stored in the list.
|
|
for (const BaseEngine::Pointer &engine : std::as_const(_engines)) {
|
|
if (engine && engine.data()->unregisterWidget(widget)) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
//_______________________________________________________________
|
|
void Animations::unregisterEngine(QObject *object)
|
|
{
|
|
int index(_engines.indexOf(qobject_cast<BaseEngine *>(object)));
|
|
if (index >= 0) {
|
|
_engines.removeAt(index);
|
|
}
|
|
}
|
|
|
|
//_______________________________________________________________
|
|
void Animations::registerEngine(BaseEngine *engine)
|
|
{
|
|
_engines.append(engine);
|
|
connect(engine, &QObject::destroyed, this, &Animations::unregisterEngine);
|
|
}
|
|
|
|
}
|