File indexing completed on 2024-05-19 05:37:21
0001 /* 0002 * SPDX-FileCopyrightText: 2020 Arjen Hiemstra <ahiemstra@heimr.nl> 0003 * 0004 * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 0005 */ 0006 0007 #include "FaceLoader.h" 0008 0009 using namespace Qt::StringLiterals; 0010 using namespace KSysGuard; 0011 0012 QHash<QString, KSysGuard::SensorFaceController *> FaceLoader::s_faceCache; 0013 0014 FaceLoader::FaceLoader(QObject *parent) 0015 : QObject(parent) 0016 { 0017 } 0018 0019 FaceLoader::~FaceLoader() 0020 { 0021 if (m_dataObject) { 0022 m_dataObject->setFaceLoader(nullptr); 0023 } 0024 0025 if (m_oldController) { 0026 m_oldController->deleteLater(); 0027 } 0028 } 0029 0030 PageDataObject *FaceLoader::dataObject() const 0031 { 0032 return m_dataObject; 0033 } 0034 0035 void FaceLoader::setDataObject(PageDataObject *newDataObject) 0036 { 0037 if (newDataObject == m_dataObject) { 0038 return; 0039 } 0040 0041 if (m_faceController) { 0042 m_faceController->disconnect(m_dataObject); 0043 } 0044 0045 if (m_dataObject) { 0046 m_dataObject->setFaceLoader(nullptr); 0047 } 0048 0049 m_dataObject = newDataObject; 0050 0051 if (m_dataObject) { 0052 m_dataObject->setFaceLoader(this); 0053 0054 auto faceConfig = m_dataObject->value(QStringLiteral("face")).toString(); 0055 if (faceConfig.isEmpty()) { 0056 faceConfig = QStringLiteral("Face-%1").arg(reinterpret_cast<quintptr>(this)); 0057 m_dataObject->insert(QStringLiteral("face"), faceConfig); 0058 Q_EMIT m_dataObject->valueChanged(QStringLiteral("face"), faceConfig); 0059 } 0060 0061 auto cacheName = m_dataObject->fileName() + u"_"_s + faceConfig; 0062 if (s_faceCache.contains(cacheName)) { 0063 m_faceController = s_faceCache.value(cacheName); 0064 } else { 0065 auto configGroup = m_dataObject->config()->group(faceConfig); 0066 m_faceController = new SensorFaceController(configGroup, qmlEngine(this)); 0067 m_faceController->setShouldSync(false); 0068 s_faceCache.insert(cacheName, m_faceController); 0069 } 0070 0071 connect(m_faceController, &SensorFaceController::faceIdChanged, m_dataObject, &PageDataObject::markDirty); 0072 connect(m_faceController, &SensorFaceController::titleChanged, m_dataObject, &PageDataObject::markDirty); 0073 connect(m_faceController, &SensorFaceController::totalSensorsChanged, m_dataObject, &PageDataObject::markDirty); 0074 connect(m_faceController, &SensorFaceController::highPrioritySensorIdsChanged, m_dataObject, &PageDataObject::markDirty); 0075 connect(m_faceController, &SensorFaceController::lowPrioritySensorIdsChanged, m_dataObject, &PageDataObject::markDirty); 0076 connect(m_faceController, &SensorFaceController::sensorColorsChanged, m_dataObject, &PageDataObject::markDirty); 0077 connect(m_faceController, &SensorFaceController::updateRateLimitChanged, m_dataObject, &PageDataObject::markDirty); 0078 0079 Q_EMIT controllerChanged(); 0080 } 0081 0082 if (m_oldController) { 0083 delete m_oldController; 0084 m_oldController = nullptr; 0085 } 0086 0087 Q_EMIT dataObjectChanged(); 0088 } 0089 0090 SensorFaceController *FaceLoader::controller() const 0091 { 0092 return m_faceController; 0093 } 0094 0095 void FaceLoader::reset() 0096 { 0097 auto faceConfig = m_dataObject->value(QStringLiteral("face")).toString(); 0098 if (s_faceCache.contains(faceConfig)) { 0099 s_faceCache.remove(faceConfig); 0100 } 0101 0102 // Deleting the controller here, even when using deleteLater will trigger a 0103 // crash in the QML runtime because it still has references to the object 0104 // that do not get cleared. So instead, only delete it once we have a new 0105 // face controller. 0106 m_oldController = m_faceController; 0107 m_faceController = nullptr; 0108 } 0109 0110 #include "moc_FaceLoader.cpp"