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

0001 //////////////////////////////////////////////////////////////////////////////
0002 // oxygenmenuengine.cpp
0003 // stores event filters and maps widgets to timelines for animations
0004 // -------------------
0005 //
0006 // SPDX-FileCopyrightText: 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr>
0007 //
0008 // SPDX-License-Identifier: MIT
0009 //////////////////////////////////////////////////////////////////////////////
0010 
0011 #include "oxygenmenuengine.h"
0012 
0013 namespace Oxygen
0014 {
0015 //____________________________________________________________
0016 MenuEngineV1::MenuEngineV1(QObject *parent, MenuBaseEngine *other)
0017     : MenuBaseEngine(parent)
0018 {
0019     if (other) {
0020         const auto otherWidgets = other->registeredWidgets();
0021         for (QWidget *widget : otherWidgets) {
0022             registerWidget(widget);
0023         }
0024     }
0025 }
0026 
0027 //____________________________________________________________
0028 bool MenuEngineV1::registerWidget(QWidget *widget)
0029 {
0030     if (!widget)
0031         return false;
0032 
0033     // create new data class
0034     if (!_data.contains(widget))
0035         _data.insert(widget, new MenuDataV1(this, widget, duration()), enabled());
0036 
0037     // connect destruction signal
0038     connect(widget, SIGNAL(destroyed(QObject *)), this, SLOT(unregisterWidget(QObject *)), Qt::UniqueConnection);
0039     return true;
0040 }
0041 
0042 //____________________________________________________________
0043 bool MenuEngineV1::isAnimated(const QObject *object, WidgetIndex index)
0044 {
0045     DataMap<MenuDataV1>::Value data(_data.find(object));
0046     if (!data) {
0047         return false;
0048     }
0049 
0050     if (Animation::Pointer animation = data.data()->animation(index)) {
0051         return animation.data()->isRunning();
0052 
0053     } else
0054         return false;
0055 }
0056 
0057 //____________________________________________________________
0058 BaseEngine::WidgetList MenuEngineV1::registeredWidgets(void) const
0059 {
0060     WidgetList out;
0061 
0062     // the typedef is needed to make Krazy happy
0063     typedef DataMap<MenuDataV1>::Value Value;
0064     for (const Value &value : std::as_const(_data)) {
0065         if (value)
0066             out.insert(value.data()->target().data());
0067     }
0068 
0069     return out;
0070 }
0071 
0072 //____________________________________________________________
0073 MenuEngineV2::MenuEngineV2(QObject *parent, MenuBaseEngine *other)
0074     : MenuBaseEngine(parent)
0075     , _followMouseDuration(150)
0076 {
0077     if (other) {
0078         const auto otherWidgets = other->registeredWidgets();
0079         for (QWidget *widget : otherWidgets) {
0080             registerWidget(widget);
0081         }
0082     }
0083 }
0084 
0085 //____________________________________________________________
0086 bool MenuEngineV2::registerWidget(QWidget *widget)
0087 {
0088     if (!widget)
0089         return false;
0090 
0091     // create new data class
0092     if (!_data.contains(widget)) {
0093         DataMap<MenuDataV2>::Value value(new MenuDataV2(this, widget, duration()));
0094         value.data()->setFollowMouseDuration(followMouseDuration());
0095         _data.insert(widget, value, enabled());
0096     }
0097 
0098     // connect destruction signal
0099     connect(widget, SIGNAL(destroyed(QObject *)), this, SLOT(unregisterWidget(QObject *)), Qt::UniqueConnection);
0100 
0101     return true;
0102 }
0103 
0104 //____________________________________________________________
0105 QRect MenuEngineV2::currentRect(const QObject *object, WidgetIndex)
0106 {
0107     if (!enabled())
0108         return QRect();
0109     DataMap<MenuDataV2>::Value data(_data.find(object));
0110     return data ? data.data()->currentRect() : QRect();
0111 }
0112 
0113 //____________________________________________________________
0114 bool MenuEngineV2::isAnimated(const QObject *object, WidgetIndex index)
0115 {
0116     DataMap<MenuDataV2>::Value data(_data.find(object));
0117     if (!data) {
0118         return false;
0119     }
0120 
0121     switch (index) {
0122     case Oxygen::Previous: {
0123         if (Animation::Pointer animation = data.data()->animation()) {
0124             return animation.data()->direction() == Animation::Backward && animation.data()->isRunning();
0125         } else
0126             return false;
0127     }
0128 
0129     case Oxygen::Current: {
0130         if (data.data()->animation() && data.data()->animation().data()->isRunning())
0131             return true;
0132         else
0133             return false;
0134     }
0135 
0136     default:
0137         return false;
0138     }
0139 }
0140 
0141 //____________________________________________________________
0142 QRect MenuEngineV2::animatedRect(const QObject *object)
0143 {
0144     if (!enabled())
0145         return QRect();
0146     DataMap<MenuDataV2>::Value data(_data.find(object));
0147     return data ? data.data()->animatedRect() : QRect();
0148 }
0149 
0150 //____________________________________________________________
0151 bool MenuEngineV2::isTimerActive(const QObject *object)
0152 {
0153     if (!enabled())
0154         return false;
0155     DataMap<MenuDataV2>::Value data(_data.find(object));
0156     return data ? data.data()->timer().isActive() : false;
0157 }
0158 
0159 //____________________________________________________________
0160 BaseEngine::WidgetList MenuEngineV2::registeredWidgets(void) const
0161 {
0162     WidgetList out;
0163 
0164     // the typedef is needed to make Krazy happy
0165     typedef DataMap<MenuDataV2>::Value Value;
0166     for (const Value &value : std::as_const(_data)) {
0167         if (value)
0168             out.insert(value.data()->target().data());
0169     }
0170 
0171     return out;
0172 }
0173 }