2024-02-17 22:51:19 +00:00
|
|
|
/*
|
|
|
|
* SPDX-FileCopyrightText: 2014 Hugo Pereira Da Costa <hugo.pereira@free.fr>
|
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "breezescrollbarengine.h"
|
|
|
|
|
|
|
|
#include <QEvent>
|
|
|
|
|
|
|
|
namespace Breeze
|
|
|
|
{
|
|
|
|
//____________________________________________________________
|
2024-08-09 01:20:25 +00:00
|
|
|
bool ScrollBarEngine::registerWidget(QObject *target, AnimationModes modes)
|
2024-02-17 22:51:19 +00:00
|
|
|
{
|
|
|
|
// check widget
|
2024-08-09 01:20:25 +00:00
|
|
|
if (!target) {
|
2024-02-17 22:51:19 +00:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// only handle hover and focus
|
2024-08-09 01:20:25 +00:00
|
|
|
if (modes & AnimationHover && !dataMap(AnimationHover).contains(target)) {
|
|
|
|
dataMap(AnimationHover).insert(target, new ScrollBarData(this, target, duration()), enabled());
|
2024-02-17 22:51:19 +00:00
|
|
|
}
|
2024-08-09 01:20:25 +00:00
|
|
|
if (modes & AnimationFocus && !dataMap(AnimationFocus).contains(target)) {
|
|
|
|
dataMap(AnimationFocus).insert(target, new WidgetStateData(this, target, duration()), enabled());
|
2024-02-17 22:51:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// connect destruction signal
|
2024-08-09 01:20:25 +00:00
|
|
|
connect(target, &QObject::destroyed, this, &ScrollBarEngine::unregisterWidget, Qt::UniqueConnection);
|
2024-02-17 22:51:19 +00:00
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
//____________________________________________________________
|
|
|
|
bool ScrollBarEngine::isAnimated(const QObject *object, AnimationMode mode, QStyle::SubControl control)
|
|
|
|
{
|
|
|
|
if (mode == AnimationHover) {
|
|
|
|
if (DataMap<WidgetStateData>::Value data = this->data(object, AnimationHover)) {
|
|
|
|
const ScrollBarData *scrollBarData(static_cast<const ScrollBarData *>(data.data()));
|
|
|
|
const Animation::Pointer &animation = scrollBarData->animation(control);
|
|
|
|
return animation.data()->isRunning();
|
|
|
|
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
} else if (control == QStyle::SC_ScrollBarSlider) {
|
|
|
|
return WidgetStateEngine::isAnimated(object, mode);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//____________________________________________________________
|
|
|
|
AnimationMode ScrollBarEngine::animationMode(const QObject *object, QStyle::SubControl control)
|
|
|
|
{
|
|
|
|
// enable state
|
|
|
|
if (isAnimated(object, AnimationHover, control)) {
|
|
|
|
return AnimationHover;
|
|
|
|
} else if (isAnimated(object, AnimationFocus, control)) {
|
|
|
|
return AnimationFocus;
|
|
|
|
} else if (isAnimated(object, AnimationPressed, control)) {
|
|
|
|
return AnimationPressed;
|
|
|
|
} else {
|
|
|
|
return AnimationNone;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//____________________________________________________________
|
|
|
|
qreal ScrollBarEngine::opacity(const QObject *object, QStyle::SubControl control)
|
|
|
|
{
|
|
|
|
if (isAnimated(object, AnimationHover, control)) {
|
|
|
|
return static_cast<const ScrollBarData *>(data(object, AnimationHover).data())->opacity(control);
|
|
|
|
} else if (control == QStyle::SC_ScrollBarSlider) {
|
|
|
|
return WidgetStateEngine::buttonOpacity(object);
|
|
|
|
}
|
|
|
|
return AnimationData::OpacityInvalid;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|