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 }