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