File indexing completed on 2024-05-12 17:08:28
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 KSysGuard; 0010 0011 QHash<QString, KSysGuard::SensorFaceController *> FaceLoader::s_faceCache; 0012 0013 FaceLoader::FaceLoader(QObject *parent) 0014 : QObject(parent) 0015 { 0016 } 0017 0018 FaceLoader::~FaceLoader() 0019 { 0020 if (m_dataObject) { 0021 m_dataObject->setFaceLoader(nullptr); 0022 } 0023 0024 if (m_oldController) { 0025 m_oldController->deleteLater(); 0026 } 0027 } 0028 0029 PageDataObject *FaceLoader::dataObject() const 0030 { 0031 return m_dataObject; 0032 } 0033 0034 void FaceLoader::setDataObject(PageDataObject *newDataObject) 0035 { 0036 if (newDataObject == m_dataObject) { 0037 return; 0038 } 0039 0040 if (m_faceController) { 0041 m_faceController->disconnect(m_dataObject); 0042 } 0043 0044 if (m_dataObject) { 0045 m_dataObject->setFaceLoader(nullptr); 0046 } 0047 0048 m_dataObject = newDataObject; 0049 0050 if (m_dataObject) { 0051 m_dataObject->setFaceLoader(this); 0052 0053 auto faceConfig = m_dataObject->value(QStringLiteral("face")).toString(); 0054 if (faceConfig.isEmpty()) { 0055 faceConfig = QStringLiteral("Face-%1").arg(reinterpret_cast<quintptr>(this)); 0056 m_dataObject->insert(QStringLiteral("face"), faceConfig); 0057 Q_EMIT m_dataObject->valueChanged(QStringLiteral("face"), faceConfig); 0058 } 0059 0060 if (s_faceCache.contains(faceConfig)) { 0061 m_faceController = s_faceCache.value(faceConfig); 0062 } else { 0063 auto configGroup = m_dataObject->config()->group(faceConfig); 0064 m_faceController = new SensorFaceController(configGroup, qmlEngine(this)); 0065 m_faceController->setShouldSync(false); 0066 s_faceCache.insert(faceConfig, m_faceController); 0067 } 0068 0069 connect(m_faceController, &SensorFaceController::faceIdChanged, m_dataObject, &PageDataObject::markDirty); 0070 connect(m_faceController, &SensorFaceController::titleChanged, m_dataObject, &PageDataObject::markDirty); 0071 connect(m_faceController, &SensorFaceController::totalSensorsChanged, m_dataObject, &PageDataObject::markDirty); 0072 connect(m_faceController, &SensorFaceController::highPrioritySensorIdsChanged, m_dataObject, &PageDataObject::markDirty); 0073 connect(m_faceController, &SensorFaceController::lowPrioritySensorIdsChanged, m_dataObject, &PageDataObject::markDirty); 0074 connect(m_faceController, &SensorFaceController::sensorColorsChanged, m_dataObject, &PageDataObject::markDirty); 0075 connect(m_faceController, &SensorFaceController::updateRateLimitChanged, m_dataObject, &PageDataObject::markDirty); 0076 0077 Q_EMIT controllerChanged(); 0078 } 0079 0080 if (m_oldController) { 0081 delete m_oldController; 0082 m_oldController = nullptr; 0083 } 0084 0085 Q_EMIT dataObjectChanged(); 0086 } 0087 0088 SensorFaceController *FaceLoader::controller() const 0089 { 0090 return m_faceController; 0091 } 0092 0093 void FaceLoader::reset() 0094 { 0095 auto faceConfig = m_dataObject->value(QStringLiteral("face")).toString(); 0096 if (s_faceCache.contains(faceConfig)) { 0097 s_faceCache.remove(faceConfig); 0098 } 0099 0100 // Deleting the controller here, even when using deleteLater will trigger a 0101 // crash in the QML runtime because it still has references to the object 0102 // that do not get cleared. So instead, only delete it once we have a new 0103 // face controller. 0104 m_oldController = m_faceController; 0105 m_faceController = nullptr; 0106 }