File indexing completed on 2024-05-19 05:28:50

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 #pragma once
0008 
0009 #include "breeze.h"
0010 #include "breezebaseengine.h"
0011 #include "breezedatamap.h"
0012 #include "breezewidgetstatedata.h"
0013 
0014 namespace Breeze
0015 {
0016 //* used for simple widgets
0017 class WidgetStateEngine : public BaseEngine
0018 {
0019     Q_OBJECT
0020 
0021 public:
0022     //* constructor
0023     explicit WidgetStateEngine(QObject *parent)
0024         : BaseEngine(parent)
0025     {
0026     }
0027 
0028     //* register widget
0029     bool registerWidget(QObject *target, AnimationModes modes);
0030 
0031     //* true if widget hover state is changed
0032     bool updateState(const QObject *, AnimationMode, bool);
0033 
0034     //* true if widget is animated
0035     // void* because object is just used as key for lookup
0036     bool isAnimated(const void *, AnimationMode);
0037 
0038     //* animation opacity,
0039     // void* because object is just used as key for lookup
0040     qreal opacity(const void *object, AnimationMode mode)
0041     {
0042         return isAnimated(object, mode) ? data(object, mode).data()->opacity() : AnimationData::OpacityInvalid;
0043     }
0044 
0045     //* animation mode
0046     /** precedence on focus */
0047     AnimationMode frameAnimationMode(const QObject *object)
0048     {
0049         if (isAnimated(object, AnimationEnable)) {
0050             return AnimationEnable;
0051         } else if (isAnimated(object, AnimationFocus)) {
0052             return AnimationFocus;
0053         } else if (isAnimated(object, AnimationHover)) {
0054             return AnimationHover;
0055         } else {
0056             return AnimationNone;
0057         }
0058     }
0059 
0060     //* animation opacity
0061     /** precedence on focus */
0062     qreal frameOpacity(const QObject *object)
0063     {
0064         if (isAnimated(object, AnimationEnable)) {
0065             return data(object, AnimationEnable).data()->opacity();
0066         } else if (isAnimated(object, AnimationFocus)) {
0067             return data(object, AnimationFocus).data()->opacity();
0068         } else if (isAnimated(object, AnimationHover)) {
0069             return data(object, AnimationHover).data()->opacity();
0070         } else {
0071             return AnimationData::OpacityInvalid;
0072         }
0073     }
0074 
0075     //* animation mode
0076     /** precedence on mouseOver */
0077     AnimationMode buttonAnimationMode(const QObject *object)
0078     {
0079         if (isAnimated(object, AnimationEnable)) {
0080             return AnimationEnable;
0081         } else if (isAnimated(object, AnimationHover)) {
0082             return AnimationHover;
0083         } else if (isAnimated(object, AnimationFocus)) {
0084             return AnimationFocus;
0085         } else {
0086             return AnimationNone;
0087         }
0088     }
0089 
0090     //* animation opacity
0091     /** precedence on mouseOver */
0092     qreal buttonOpacity(const QObject *object)
0093     {
0094         if (isAnimated(object, AnimationEnable)) {
0095             return data(object, AnimationEnable).data()->opacity();
0096         } else if (isAnimated(object, AnimationHover)) {
0097             return data(object, AnimationHover).data()->opacity();
0098         } else if (isAnimated(object, AnimationFocus)) {
0099             return data(object, AnimationFocus).data()->opacity();
0100         } else {
0101             return AnimationData::OpacityInvalid;
0102         }
0103     }
0104 
0105     //* duration
0106     void setEnabled(bool value) override
0107     {
0108         BaseEngine::setEnabled(value);
0109         _hoverData.setEnabled(value);
0110         _focusData.setEnabled(value);
0111         _enableData.setEnabled(value);
0112         _pressedData.setEnabled(value);
0113     }
0114 
0115     //* duration
0116     void setDuration(int value) override
0117     {
0118         BaseEngine::setDuration(value);
0119         _hoverData.setDuration(value);
0120         _focusData.setDuration(value);
0121         _enableData.setDuration(value);
0122         _pressedData.setDuration(value / 2);
0123     }
0124 
0125 public Q_SLOTS:
0126 
0127     //* remove widget from map
0128     bool unregisterWidget(QObject *object) override
0129     {
0130         if (!object) {
0131             return false;
0132         }
0133         bool found = false;
0134         if (_hoverData.unregisterWidget(object)) {
0135             found = true;
0136         }
0137         if (_focusData.unregisterWidget(object)) {
0138             found = true;
0139         }
0140         if (_enableData.unregisterWidget(object)) {
0141             found = true;
0142         }
0143         if (_pressedData.unregisterWidget(object)) {
0144             found = true;
0145         }
0146         return found;
0147     }
0148 
0149 protected:
0150     //* returns data associated to widget
0151     // void* because object is just used as key for lookup
0152     DataMap<WidgetStateData>::Value data(const void *, AnimationMode);
0153 
0154     //* returns data map associated to animation mode
0155     DataMap<WidgetStateData> &dataMap(AnimationMode);
0156 
0157 private:
0158     //* maps
0159     DataMap<WidgetStateData> _hoverData;
0160     DataMap<WidgetStateData> _focusData;
0161     DataMap<WidgetStateData> _enableData;
0162     DataMap<WidgetStateData> _pressedData;
0163 };
0164 
0165 }