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 }