File indexing completed on 2024-04-28 05:31:38

0001 /*
0002     SPDX-FileCopyrightText: 2019 David Edmundson <davidedmundson@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "process_data_provider.h"
0008 #include "process_attribute.h"
0009 #include "processes.h"
0010 
0011 using namespace KSysGuard;
0012 
0013 class Q_DECL_HIDDEN KSysGuard::ProcessDataProvider::Private
0014 {
0015 public:
0016     KSysGuard::Processes *m_processes;
0017     QList<ProcessAttribute *> m_attributes;
0018     bool m_enabled = false;
0019 };
0020 
0021 ProcessDataProvider::ProcessDataProvider(QObject *parent, const QVariantList &args)
0022     : QObject(parent)
0023     , d(new Private)
0024 {
0025     // cast is needed to allow us to use KPluginFactory, but not have null pointers during subclass construction
0026     auto procList = qobject_cast<KSysGuard::Processes *>(parent);
0027     Q_ASSERT(procList);
0028     d->m_processes = procList;
0029 
0030     Q_UNUSED(args)
0031 }
0032 
0033 ProcessDataProvider::~ProcessDataProvider()
0034 {
0035 }
0036 
0037 KSysGuard::Processes *ProcessDataProvider::processes() const
0038 {
0039     return d->m_processes;
0040 }
0041 
0042 KSysGuard::Process *ProcessDataProvider::getProcess(long pid)
0043 {
0044     auto process = d->m_processes->getProcess(pid);
0045     if (!process) {
0046         processes()->updateOrAddProcess(pid);
0047     }
0048     process = processes()->getProcess(pid);
0049     return process;
0050 }
0051 
0052 QList<ProcessAttribute *> ProcessDataProvider::attributes() const
0053 {
0054     return d->m_attributes;
0055 }
0056 
0057 bool ProcessDataProvider::enabled() const
0058 {
0059     return d->m_enabled;
0060 }
0061 
0062 void ProcessDataProvider::addProcessAttribute(ProcessAttribute *attribute)
0063 {
0064     d->m_attributes << attribute;
0065     connect(attribute, &ProcessAttribute::enabledChanged, this, [this](bool enabled) {
0066         if (enabled == d->m_enabled) {
0067             return;
0068         }
0069         bool wasEnabled = d->m_enabled;
0070 
0071         d->m_enabled = std::any_of(d->m_attributes.constBegin(), d->m_attributes.constEnd(), [](ProcessAttribute *p) {
0072             return p->enabled();
0073         });
0074 
0075         if (d->m_enabled != wasEnabled) {
0076             handleEnabledChanged(d->m_enabled);
0077         }
0078     });
0079 }