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

0001 
0002 //////////////////////////////////////////////////////////////////////////////
0003 // oxygenwidgetstateengine.h
0004 // stores event filters and maps widgets to timelines for animations
0005 // -------------------
0006 //
0007 // SPDX-FileCopyrightText: 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr>
0008 //
0009 // SPDX-License-Identifier: MIT
0010 //////////////////////////////////////////////////////////////////////////////
0011 
0012 #include "oxygenwidgetstateengine.h"
0013 
0014 #include "oxygenenabledata.h"
0015 
0016 namespace Oxygen
0017 {
0018 //____________________________________________________________
0019 bool WidgetStateEngine::registerWidget(QWidget *widget, AnimationModes mode)
0020 {
0021     if (!widget)
0022         return false;
0023     if (mode & AnimationHover && !_hoverData.contains(widget)) {
0024         _hoverData.insert(widget, new WidgetStateData(this, widget, duration()), enabled());
0025     }
0026     if (mode & AnimationFocus && !_focusData.contains(widget)) {
0027         _focusData.insert(widget, new WidgetStateData(this, widget, duration()), enabled());
0028     }
0029     if (mode & AnimationEnable && !_enableData.contains(widget)) {
0030         _enableData.insert(widget, new EnableData(this, widget, duration()), enabled());
0031     }
0032 
0033     // connect destruction signal
0034     connect(widget, SIGNAL(destroyed(QObject *)), this, SLOT(unregisterWidget(QObject *)), Qt::UniqueConnection);
0035 
0036     return true;
0037 }
0038 
0039 //____________________________________________________________
0040 BaseEngine::WidgetList WidgetStateEngine::registeredWidgets(AnimationModes mode) const
0041 {
0042     WidgetList out;
0043 
0044     // the typedef is needed to make Krazy happy
0045     typedef DataMap<WidgetStateData>::Value Value;
0046 
0047     if (mode & AnimationHover) {
0048         for (const Value &value : std::as_const(_hoverData)) {
0049             if (value)
0050                 out.insert(value.data()->target().data());
0051         }
0052     }
0053 
0054     if (mode & AnimationFocus) {
0055         for (const Value &value : std::as_const(_focusData)) {
0056             if (value)
0057                 out.insert(value.data()->target().data());
0058         }
0059     }
0060 
0061     if (mode & AnimationEnable) {
0062         for (const Value &value : std::as_const(_enableData)) {
0063             if (value)
0064                 out.insert(value.data()->target().data());
0065         }
0066     }
0067 
0068     return out;
0069 }
0070 
0071 //____________________________________________________________
0072 bool WidgetStateEngine::updateState(const QObject *object, AnimationMode mode, bool value)
0073 {
0074     DataMap<WidgetStateData>::Value data(WidgetStateEngine::data(object, mode));
0075     return (data && data.data()->updateState(value));
0076 }
0077 
0078 //____________________________________________________________
0079 bool WidgetStateEngine::isAnimated(const QObject *object, AnimationMode mode)
0080 {
0081     DataMap<WidgetStateData>::Value data(WidgetStateEngine::data(object, mode));
0082     return (data && data.data()->animation() && data.data()->animation().data()->isRunning());
0083 }
0084 
0085 //____________________________________________________________
0086 DataMap<WidgetStateData>::Value WidgetStateEngine::data(const QObject *object, AnimationMode mode)
0087 {
0088     switch (mode) {
0089     case AnimationHover:
0090         return _hoverData.find(object).data();
0091     case AnimationFocus:
0092         return _focusData.find(object).data();
0093     case AnimationEnable:
0094         return _enableData.find(object).data();
0095     default:
0096         return DataMap<WidgetStateData>::Value();
0097     }
0098 }
0099 }