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"