File indexing completed on 2024-05-12 05:28:38

0001 /*
0002  * SPDX-FileCopyrightText: 2014 Hugo Pereira Da Costa <hugo.pereira@free.fr>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "breezescrollbarengine.h"
0008 
0009 #include <QEvent>
0010 
0011 namespace Breeze
0012 {
0013 //____________________________________________________________
0014 bool ScrollBarEngine::registerWidget(QObject *target, AnimationModes modes)
0015 {
0016     // check widget
0017     if (!target) {
0018         return false;
0019     }
0020 
0021     // only handle hover and focus
0022     if (modes & AnimationHover && !dataMap(AnimationHover).contains(target)) {
0023         dataMap(AnimationHover).insert(target, new ScrollBarData(this, target, duration()), enabled());
0024     }
0025     if (modes & AnimationFocus && !dataMap(AnimationFocus).contains(target)) {
0026         dataMap(AnimationFocus).insert(target, new WidgetStateData(this, target, duration()), enabled());
0027     }
0028 
0029     // connect destruction signal
0030     connect(target, &QObject::destroyed, this, &ScrollBarEngine::unregisterWidget, Qt::UniqueConnection);
0031 
0032     return true;
0033 }
0034 
0035 //____________________________________________________________
0036 bool ScrollBarEngine::isAnimated(const QObject *object, AnimationMode mode, QStyle::SubControl control)
0037 {
0038     if (mode == AnimationHover) {
0039         if (DataMap<WidgetStateData>::Value data = this->data(object, AnimationHover)) {
0040             const ScrollBarData *scrollBarData(static_cast<const ScrollBarData *>(data.data()));
0041             const Animation::Pointer &animation = scrollBarData->animation(control);
0042             return animation.data()->isRunning();
0043 
0044         } else {
0045             return false;
0046         }
0047 
0048     } else if (control == QStyle::SC_ScrollBarSlider) {
0049         return WidgetStateEngine::isAnimated(object, mode);
0050 
0051     } else {
0052         return false;
0053     }
0054 }
0055 
0056 //____________________________________________________________
0057 AnimationMode ScrollBarEngine::animationMode(const QObject *object, QStyle::SubControl control)
0058 {
0059     // enable state
0060     if (isAnimated(object, AnimationHover, control)) {
0061         return AnimationHover;
0062     } else if (isAnimated(object, AnimationFocus, control)) {
0063         return AnimationFocus;
0064     } else if (isAnimated(object, AnimationPressed, control)) {
0065         return AnimationPressed;
0066     } else {
0067         return AnimationNone;
0068     }
0069 }
0070 
0071 //____________________________________________________________
0072 qreal ScrollBarEngine::opacity(const QObject *object, QStyle::SubControl control)
0073 {
0074     if (isAnimated(object, AnimationHover, control)) {
0075         return static_cast<const ScrollBarData *>(data(object, AnimationHover).data())->opacity(control);
0076     } else if (control == QStyle::SC_ScrollBarSlider) {
0077         return WidgetStateEngine::buttonOpacity(object);
0078     }
0079     return AnimationData::OpacityInvalid;
0080 }
0081 
0082 }