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