File indexing completed on 2024-05-19 05:35:21
0001 #ifndef oxygenscrollbarengine_h 0002 #define oxygenscrollbarengine_h 0003 0004 ////////////////////////////////////////////////////////////////////////////// 0005 // oxygenscrollbarengine.h 0006 // stores event filters and maps widgets to timelines for 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 "oxygenbaseengine.h" 0015 #include "oxygendatamap.h" 0016 #include "oxygenscrollbardata.h" 0017 0018 namespace Oxygen 0019 { 0020 //* stores scrollbar hovered action and timeLine 0021 class ScrollBarEngine : public BaseEngine 0022 { 0023 Q_OBJECT 0024 0025 public: 0026 //* constructor 0027 explicit ScrollBarEngine(QObject *parent) 0028 : BaseEngine(parent) 0029 { 0030 } 0031 0032 //* register scrollbar 0033 bool registerWidget(QWidget *); 0034 0035 //* true if widget is animated 0036 bool isAnimated(const QObject *object, QStyle::SubControl control); 0037 0038 //* animation opacity 0039 qreal opacity(const QObject *object, QStyle::SubControl control) 0040 { 0041 return isAnimated(object, control) ? _data.find(object).data()->opacity(control) : AnimationData::OpacityInvalid; 0042 } 0043 0044 //* return true if given subcontrol is hovered 0045 bool isHovered(const QObject *object, QStyle::SubControl control) 0046 { 0047 if (DataMap<ScrollBarData>::Value data = _data.find(object)) 0048 return data.data()->isHovered(control); 0049 else 0050 return false; 0051 } 0052 0053 //* control rect associated to object 0054 QRect subControlRect(const QObject *object, QStyle::SubControl control) 0055 { 0056 if (DataMap<ScrollBarData>::Value data = _data.find(object)) 0057 return data.data()->subControlRect(control); 0058 else 0059 return QRect(); 0060 } 0061 0062 //* control rect 0063 void setSubControlRect(const QObject *object, QStyle::SubControl control, const QRect &rect) 0064 { 0065 if (DataMap<ScrollBarData>::Value data = _data.find(object)) { 0066 data.data()->setSubControlRect(control, rect); 0067 } 0068 } 0069 0070 //* control rect 0071 void updateState(const QObject *object, bool state) 0072 { 0073 if (DataMap<ScrollBarData>::Value data = _data.find(object)) { 0074 data.data()->updateState(state); 0075 } 0076 } 0077 0078 //* mouse position 0079 QPoint position(const QObject *object) 0080 { 0081 if (DataMap<ScrollBarData>::Value data = _data.find(object)) 0082 return data.data()->position(); 0083 else 0084 return QPoint(-1, -1); 0085 } 0086 0087 //* enable state 0088 void setEnabled(bool value) override 0089 { 0090 BaseEngine::setEnabled(value); 0091 /* 0092 do not disable the map directly, because the contained OxygenScrollbarData 0093 are also used in non animated mode to store scrollbar arrows rect. However 0094 do disable all contains DATA object, in order to prevent actual animations 0095 */ 0096 for (const DataMap<ScrollBarData>::Value &data : std::as_const(_data)) { 0097 if (data) 0098 data.data()->setEnabled(value); 0099 } 0100 } 0101 0102 //* duration 0103 void setDuration(int value) override 0104 { 0105 BaseEngine::setDuration(value); 0106 _data.setDuration(value); 0107 } 0108 0109 public Q_SLOTS: 0110 0111 //* remove widget from map 0112 bool unregisterWidget(QObject *object) override 0113 { 0114 return _data.unregisterWidget(object); 0115 } 0116 0117 private: 0118 //* data map 0119 DataMap<ScrollBarData> _data; 0120 }; 0121 } 0122 0123 #endif