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 }