From cee37c6a4a6b58ef25db675f5a34cd1cfd38ebb7 Mon Sep 17 00:00:00 2001 From: Evgenii Alekseev Date: Fri, 8 Mar 2024 17:32:07 +0200 Subject: [PATCH] port widget to dbus --- sources/3rdparty/fontdialog/fontdialog.cpp | 75 ---------------- sources/3rdparty/fontdialog/fontdialog.h | 5 -- .../awesome-widget/plugin/awconfighelper.cpp | 2 - .../plugin/awdataengineaggregator.cpp | 87 ++++--------------- .../plugin/awdataengineaggregator.h | 21 +++-- sources/awesome-widget/plugin/awkeys.cpp | 11 +-- sources/awesome-widget/plugin/awkeys.h | 10 +-- sources/libraries.cmake | 3 +- 8 files changed, 41 insertions(+), 173 deletions(-) diff --git a/sources/3rdparty/fontdialog/fontdialog.cpp b/sources/3rdparty/fontdialog/fontdialog.cpp index a659347..2cfb6cf 100644 --- a/sources/3rdparty/fontdialog/fontdialog.cpp +++ b/sources/3rdparty/fontdialog/fontdialog.cpp @@ -39,81 +39,6 @@ void CFont::setCurrentColor(const QColor color) } -int CFont::html2QFont(const int htmlWeight) -{ - int weight = 16; - switch(htmlWeight) { - case 100: - weight = 16; - break; - case 200: - case 300: - weight = 25; - break; - case 400: - weight = 50; - break; - case 500: - case 600: - weight = 63; - break; - case 700: - case 800: - weight = 75; - break; - case 900: - weight = 87; - break; - default: - break; - } - - return weight; -} - - -int CFont::qFont2html(const int weight) -{ - int htmlWeight = 400; - switch(weight) { - case 16: - htmlWeight = 100; - break; - case 25: - htmlWeight = 300; - break; - case 50: - htmlWeight = 400; - break; - case 63: - htmlWeight = 600; - break; - case 75: - htmlWeight = 800; - break; - case 87: - htmlWeight = 900; - break; - default: - break; - } - - return htmlWeight; -} - - -int CFont::htmlWeight() -{ - return CFont::qFont2html(weight()); -} - - -void CFont::setHtmlWeight(const int htmlWeight) -{ - setWeight(CFont::html2QFont(htmlWeight)); -} - - CFont CFont::fromQFont(const QFont font, const QColor color) { return CFont(font.family(), font.pointSize(), font.weight(), font.italic(), color); diff --git a/sources/3rdparty/fontdialog/fontdialog.h b/sources/3rdparty/fontdialog/fontdialog.h index 3a16d4b..6302e33 100644 --- a/sources/3rdparty/fontdialog/fontdialog.h +++ b/sources/3rdparty/fontdialog/fontdialog.h @@ -34,11 +34,6 @@ public: // color properties QColor color(); void setCurrentColor(const QColor color); - // html weight properties - static int html2QFont(const int htmlWeight); - static int qFont2html(const int weight); - int htmlWeight(); - void setHtmlWeight(const int htmlWeight); // conversion to QFont static CFont fromQFont(const QFont font, const QColor color = QColor(QString("#000000"))); diff --git a/sources/awesome-widget/plugin/awconfighelper.cpp b/sources/awesome-widget/plugin/awconfighelper.cpp index 7c716af..cdfedc0 100644 --- a/sources/awesome-widget/plugin/awconfighelper.cpp +++ b/sources/awesome-widget/plugin/awconfighelper.cpp @@ -21,7 +21,6 @@ #include #include #include -#include #include "awdebug.h" @@ -285,7 +284,6 @@ void AWConfigHelper::writeFile(QSettings &_settings, const QString &_key, const QFile file(_fileName); if (file.open(QIODevice::WriteOnly | QIODevice::Text)) { QTextStream out(&file); - out.setCodec("UTF-8"); out << _settings.value(_key).toString().toUtf8(); out.flush(); file.close(); diff --git a/sources/awesome-widget/plugin/awdataengineaggregator.cpp b/sources/awesome-widget/plugin/awdataengineaggregator.cpp index 431c20d..a60fec0 100644 --- a/sources/awesome-widget/plugin/awdataengineaggregator.cpp +++ b/sources/awesome-widget/plugin/awdataengineaggregator.cpp @@ -17,7 +17,8 @@ #include "awdataengineaggregator.h" -#include +#include +#include #include "awdebug.h" @@ -27,20 +28,19 @@ AWDataEngineAggregator::AWDataEngineAggregator(QObject *_parent) { qCDebug(LOG_AW) << __PRETTY_FUNCTION__; - m_consumer = new Plasma::DataEngineConsumer(); - m_dataEngines["systemmonitor"] = m_consumer->dataEngine("systemmonitor"); - m_dataEngines["extsysmon"] = m_consumer->dataEngine("extsysmon"); - m_dataEngines["time"] = m_consumer->dataEngine("time"); + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); + qDBusRegisterMetaType>(); - // additional method required by systemmonitor structure - m_newSourceConnection - = connect(m_dataEngines["systemmonitor"], &Plasma::DataEngine::sourceAdded, [this](const QString &source) { - emit(deviceAdded(source)); - m_dataEngines["systemmonitor"]->connectSource(source, parent(), 1000); - }); - - // required to define Qt::QueuedConnection for signal-slot connection - qRegisterMetaType("Plasma::DataEngine::Data"); + m_interface = new KSysGuard::SystemStats::DBusInterface( + KSysGuard::SystemStats::ServiceName, KSysGuard::SystemStats::ObjectPath, QDBusConnection::sessionBus(), this); + connect(m_interface, SIGNAL(newSensorData(KSysGuard::SensorDataList)), this, + SLOT(updateData(KSysGuard::SensorDataList))); + connect(m_interface, SIGNAL(sensorAdded(const QString &)), this, SLOT(sensorAdded(const QString &))); + connect(m_interface, SIGNAL(sensorMetaDataChanged(const QHash &)), this, + SLOT(updateSensor(const QHash &))); + connect(m_interface, SIGNAL(sensorRemoved(const QString &)), this, SLOT(sensorRemoved(const QString &))); } @@ -54,62 +54,5 @@ AWDataEngineAggregator::~AWDataEngineAggregator() void AWDataEngineAggregator::disconnectSources() { - for (auto dataEngine : m_dataEngines.values()) - for (auto &source : dataEngine->sources()) - dataEngine->disconnectSource(source, parent()); - disconnect(m_newSourceConnection); -} - - -void AWDataEngineAggregator::reconnectSources(const int _interval) -{ - qCDebug(LOG_AW) << "Reconnect sources with interval" << _interval; - - disconnectSources(); - - m_dataEngines["systemmonitor"]->connectAllSources(parent(), (uint)_interval); - m_dataEngines["extsysmon"]->connectAllSources(parent(), (uint)_interval); - m_dataEngines["time"]->connectSource("Local", parent(), 1000); - - m_newSourceConnection = connect( - m_dataEngines["systemmonitor"], &Plasma::DataEngine::sourceAdded, [this, _interval](const QString &source) { - emit(deviceAdded(source)); - m_dataEngines["systemmonitor"]->connectSource(source, parent(), (uint)_interval); - }); - -#ifdef BUILD_FUTURE - createQueuedConnection(); -#endif /* BUILD_FUTURE */ -} - - -void AWDataEngineAggregator::dropSource(const QString &_source) -{ - qCDebug(LOG_AW) << "Source" << _source; - - // HACK there is no possibility to check to which dataengine source - // connected we will try to disconnect it from all engines - for (auto dataEngine : m_dataEngines.values()) - dataEngine->disconnectSource(_source, parent()); -} - - -void AWDataEngineAggregator::createQueuedConnection() -{ - // HACK additional method which forces QueuedConnection instead of Auto one - // for more details refer to plasma-framework source code - for (auto &dataEngine : m_dataEngines.keys()) { - // different source set for different engines - QStringList sources = dataEngine == "time" ? QStringList() << "Local" : m_dataEngines[dataEngine]->sources(); - // reconnect sources - for (auto &source : sources) { - Plasma::DataContainer *container = m_dataEngines[dataEngine]->containerForSource(source); - // disconnect old connections first - disconnect(container, SIGNAL(dataUpdated(QString, Plasma::DataEngine::Data)), parent(), - SLOT(dataUpdated(QString, Plasma::DataEngine::Data))); - // and now reconnect with Qt::QueuedConnection type - connect(container, SIGNAL(dataUpdated(QString, Plasma::DataEngine::Data)), parent(), - SLOT(dataUpdated(QString, Plasma::DataEngine::Data)), Qt::QueuedConnection); - } - } + m_interface->unsubscribe(m_sensors.values()); } diff --git a/sources/awesome-widget/plugin/awdataengineaggregator.h b/sources/awesome-widget/plugin/awdataengineaggregator.h index 580b9b8..4ea6a54 100644 --- a/sources/awesome-widget/plugin/awdataengineaggregator.h +++ b/sources/awesome-widget/plugin/awdataengineaggregator.h @@ -19,10 +19,16 @@ #ifndef AWDATAENGINEAGGREGATOR_H #define AWDATAENGINEAGGREGATOR_H -#include -#include +#include #include +#include + + +namespace KSysGuard::SystemStats +{ + class DBusInterface; +} class AWDataEngineAggregator : public QObject @@ -33,19 +39,20 @@ public: explicit AWDataEngineAggregator(QObject *_parent = nullptr); ~AWDataEngineAggregator() override; void disconnectSources(); - void reconnectSources(int _interval); signals: void deviceAdded(const QString &_source); public slots: - void dropSource(const QString &_source); + void sensorAdded(const QString &_sensor); + void sensorRemoved(const QString &_sensor); + void updateData(KSysGuard::SensorDataList _data); + void updateSensor(const QHash &_sensor); private: void createQueuedConnection(); - Plasma::DataEngineConsumer *m_consumer = nullptr; - QHash m_dataEngines; - QMetaObject::Connection m_newSourceConnection; + KSysGuard::SystemStats::DBusInterface *m_interface = nullptr; + QSet m_sensors; }; diff --git a/sources/awesome-widget/plugin/awkeys.cpp b/sources/awesome-widget/plugin/awkeys.cpp index 1582ab6..b0d22b4 100644 --- a/sources/awesome-widget/plugin/awkeys.cpp +++ b/sources/awesome-widget/plugin/awkeys.cpp @@ -199,10 +199,11 @@ void AWKeys::editItem(const QString &_type) } -void AWKeys::dataUpdated(const QString &_sourceName, const Plasma::DataEngine::Data &_data) +void AWKeys::dataUpdated(const KSysGuard::SensorDataList &_data) { - // run concurrent data update - QtConcurrent::run(m_threadPool, this, &AWKeys::setDataBySource, _sourceName, _data); + // TODO use QtConcurrent::map or something like that + for (auto &sensor : _data) + QtConcurrent::run(m_threadPool, this, &AWKeys::setDataBySource, sensor); } @@ -351,9 +352,9 @@ QString AWKeys::parsePattern(QString _pattern) const } -void AWKeys::setDataBySource(const QString &_sourceName, const QVariantMap &_data) +void AWKeys::setDataBySource(const QString &_sourceName, const KSysGuard::SensorData &_data) { - qCDebug(LOG_AW) << "Source" << _sourceName << "with data" << _data; + qCDebug(LOG_AW) << "Source" << _sourceName << "with data" << _data.payload; // first list init QStringList tags = m_aggregator->keysFromSource(_sourceName); diff --git a/sources/awesome-widget/plugin/awkeys.h b/sources/awesome-widget/plugin/awkeys.h index 8ebf222..944f0fb 100644 --- a/sources/awesome-widget/plugin/awkeys.h +++ b/sources/awesome-widget/plugin/awkeys.h @@ -19,11 +19,11 @@ #ifndef AWKEYS_H #define AWKEYS_H -#include - #include #include +#include + class AWDataAggregator; class AWDataEngineAggregator; @@ -56,9 +56,7 @@ public: Q_INVOKABLE void editItem(const QString &_type); public slots: - void dataUpdated(const QString &_sourceName, const Plasma::DataEngine::Data &_data); - // dummy method required by DataEngine connections - static void modelChanged(const QString &, QAbstractItemModel *){}; + void dataUpdated(const KSysGuard::SensorDataList &_data); signals: void dropSourceFromDataengine(const QString &_source); @@ -74,7 +72,7 @@ private: void calculateValues(); void createDBusInterface(); [[nodiscard]] QString parsePattern(QString _pattern) const; - void setDataBySource(const QString &_sourceName, const QVariantMap &_data); + void setDataBySource(const KSysGuard::SensorData &_data); // objects AWDataAggregator *m_dataAggregator = nullptr; AWDataEngineAggregator *m_dataEngineAggregator = nullptr; diff --git a/sources/libraries.cmake b/sources/libraries.cmake index 59e5730..489e60e 100644 --- a/sources/libraries.cmake +++ b/sources/libraries.cmake @@ -22,8 +22,9 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_D find_package(KF6 REQUIRED COMPONENTS I18n Notifications Service WindowSystem) find_package(LibTaskManager REQUIRED) find_package(Plasma REQUIRED) +find_package(KSysGuard REQUIRED) include(KDEInstallDirs) include(KDECMakeSettings) include(KDECompilerSettings) set(Kf6_INCLUDE ${KDE_INSTALL_FULL_INCLUDEDIR_KF}) -set(Kf6_LIBRARIES KF6::I18n KF6::Notifications KF6::WindowSystem PW::LibTaskManager) +set(Kf6_LIBRARIES KF6::I18n KF6::Notifications KF6::WindowSystem KSysGuard::Sensors KSysGuard::SensorFaces PW::LibTaskManager)