File indexing completed on 2024-05-19 05:35:22

0001 #ifndef oxygenwidgetstateengine_h
0002 #define oxygenwidgetstateengine_h
0003 
0004 //////////////////////////////////////////////////////////////////////////////
0005 // oxygenwidgetstateengine.h
0006 // stores event filters and maps widgets to animations
0007 // -------------------
0008 //
0009 // SPDX-FileCopyrightText: 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr>
0010 //
0011 // SPDX-License-Identifier: MIT
0012 //////////////////////////////////////////////////////////////////////////////
0013 
0014 #include "oxygen.h"
0015 #include "oxygenbaseengine.h"
0016 #include "oxygendatamap.h"
0017 #include "oxygenwidgetstatedata.h"
0018 
0019 namespace Oxygen
0020 {
0021 //* used for simple widgets
0022 class WidgetStateEngine : public BaseEngine
0023 {
0024     Q_OBJECT
0025 
0026 public:
0027     //* constructor
0028     explicit WidgetStateEngine(QObject *parent)
0029         : BaseEngine(parent)
0030     {
0031     }
0032 
0033     //* register widget
0034     bool registerWidget(QWidget *, AnimationModes);
0035 
0036     //* returns registered widgets
0037     WidgetList registeredWidgets(AnimationModes) const;
0038 
0039     using BaseEngine::registeredWidgets;
0040 
0041     //* true if widget hover state is changed
0042     bool updateState(const QObject *, AnimationMode, bool);
0043 
0044     //* true if widget is animated
0045     bool isAnimated(const QObject *, AnimationMode);
0046 
0047     //* animation opacity
0048     qreal opacity(const QObject *object, AnimationMode mode)
0049     {
0050         return isAnimated(object, mode) ? data(object, mode).data()->opacity() : AnimationData::OpacityInvalid;
0051     }
0052 
0053     //* animation mode
0054     /** precedence on focus */
0055     AnimationMode frameAnimationMode(const QObject *object)
0056     {
0057         if (isAnimated(object, AnimationEnable))
0058             return AnimationEnable;
0059         else if (isAnimated(object, AnimationFocus))
0060             return AnimationFocus;
0061         else if (isAnimated(object, AnimationHover))
0062             return AnimationHover;
0063         else
0064             return AnimationNone;
0065     }
0066 
0067     //* animation opacity
0068     /** precedence on focus */
0069     qreal frameOpacity(const QObject *object)
0070     {
0071         if (isAnimated(object, AnimationEnable))
0072             return data(object, AnimationEnable).data()->opacity();
0073         else if (isAnimated(object, AnimationFocus))
0074             return data(object, AnimationFocus).data()->opacity();
0075         else if (isAnimated(object, AnimationHover))
0076             return data(object, AnimationHover).data()->opacity();
0077         else
0078             return AnimationData::OpacityInvalid;
0079     }
0080 
0081     //* animation mode
0082     /** precedence on mouseOver */
0083     AnimationMode buttonAnimationMode(const QObject *object)
0084     {
0085         if (isAnimated(object, AnimationEnable))
0086             return AnimationEnable;
0087         else if (isAnimated(object, AnimationHover))
0088             return AnimationHover;
0089         else if (isAnimated(object, AnimationFocus))
0090             return AnimationFocus;
0091         else
0092             return AnimationNone;
0093     }
0094 
0095     //* animation opacity
0096     /** precedence on mouseOver */
0097     qreal buttonOpacity(const QObject *object)
0098     {
0099         if (isAnimated(object, AnimationEnable))
0100             return data(object, AnimationEnable).data()->opacity();
0101         else if (isAnimated(object, AnimationHover))
0102             return data(object, AnimationHover).data()->opacity();
0103         else if (isAnimated(object, AnimationFocus))
0104             return data(object, AnimationFocus).data()->opacity();
0105         else
0106             return AnimationData::OpacityInvalid;
0107     }
0108 
0109     //* duration
0110     void setEnabled(bool value) override
0111     {
0112         BaseEngine::setEnabled(value);
0113         _hoverData.setEnabled(value);
0114         _focusData.setEnabled(value);
0115         _enableData.setEnabled(value);
0116     }
0117 
0118     //* duration
0119     void setDuration(int value) override
0120     {
0121         BaseEngine::setDuration(value);
0122         _hoverData.setDuration(value);
0123         _focusData.setDuration(value);
0124         _enableData.setDuration(value);
0125     }
0126 
0127 public Q_SLOTS:
0128 
0129     //* remove widget from map
0130     bool unregisterWidget(QObject *object) override
0131     {
0132         if (!object)
0133             return false;
0134         bool found = false;
0135         if (_hoverData.unregisterWidget(object))
0136             found = true;
0137         if (_focusData.unregisterWidget(object))
0138             found = true;
0139         if (_enableData.unregisterWidget(object))
0140             found = true;
0141         return found;
0142     }
0143 
0144 private:
0145     //* returns data associated to widget
0146     DataMap<WidgetStateData>::Value data(const QObject *, AnimationMode);
0147 
0148     //* maps
0149     DataMap<WidgetStateData> _hoverData;
0150     DataMap<WidgetStateData> _focusData;
0151     DataMap<WidgetStateData> _enableData;
0152 };
0153 }
0154 
0155 #endif