diff --git a/sources/awesome-widget/package/contents/ui/dataengine.qml b/sources/awesome-widget/package/contents/ui/dataengine.qml index d059407..23e49a4 100644 --- a/sources/awesome-widget/package/contents/ui/dataengine.qml +++ b/sources/awesome-widget/package/contents/ui/dataengine.qml @@ -191,10 +191,6 @@ KCM.SimpleKCM { Component.onCompleted: { // init submodule awKeys.updateCache() - - // update hdd model - hdd.model = awKeys.getHddDevices() - hdd.onCompleted } Component.onDestruction: { diff --git a/sources/awesome-widget/plugin/awdataengineaggregator.cpp b/sources/awesome-widget/plugin/awdataengineaggregator.cpp index 36be7bd..0296133 100644 --- a/sources/awesome-widget/plugin/awdataengineaggregator.cpp +++ b/sources/awesome-widget/plugin/awdataengineaggregator.cpp @@ -139,17 +139,24 @@ void AWDataEngineAggregator::sensorRemoved(const QString &_sensor) } -void AWDataEngineAggregator::updateData(KSysGuard::SensorDataList _data) +void AWDataEngineAggregator::updateData(const KSysGuard::SensorDataList &_data) { - emit(dataUpdated(m_sensors, _data)); + auto data = std::accumulate( + _data.cbegin(), _data.cend(), QHash>(), + [this](auto current, auto &single) { + if (m_sensors.contains(single.sensorProperty)) + current[single.sensorProperty] = {m_sensors.value(single.sensorProperty), single.payload}; + return current; + }); + emit(dataUpdated(data)); } void AWDataEngineAggregator::updateSensors(const QHash &_sensors) { - for (auto sensor = _sensors.cbegin(); sensor != _sensors.cend(); ++sensor) { - if (!isValidSensor(sensor.value())) + for (auto [source, sensor] : _sensors.asKeyValueRange()) { + if (!isValidSensor(sensor)) continue; - m_sensors.insert(sensor.key(), sensor.value()); + m_sensors.insert(source, sensor); } } diff --git a/sources/awesome-widget/plugin/awdataengineaggregator.h b/sources/awesome-widget/plugin/awdataengineaggregator.h index 244811a..e3469a5 100644 --- a/sources/awesome-widget/plugin/awdataengineaggregator.h +++ b/sources/awesome-widget/plugin/awdataengineaggregator.h @@ -42,14 +42,14 @@ public: void loadSources(); signals: - void dataUpdated(const QHash &_sensors, const KSysGuard::SensorDataList &_data); + void dataUpdated(const QHash> &_data); 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 updateData(const KSysGuard::SensorDataList &_data); void updateSensors(const QHash &_sensors); private: diff --git a/sources/awesome-widget/plugin/awkeys.cpp b/sources/awesome-widget/plugin/awkeys.cpp index 8009849..eec8cff 100644 --- a/sources/awesome-widget/plugin/awkeys.cpp +++ b/sources/awesome-widget/plugin/awkeys.cpp @@ -153,26 +153,6 @@ QStringList AWKeys::dictKeys(const bool _sorted, const QString &_regexp) const } -QVariantList AWKeys::getHddDevices() const -{ - QStringList hddDevices = m_keyOperator->devices("hdd"); - // required by selector in the UI - hddDevices.insert(0, "disable"); - hddDevices.insert(0, "auto"); - - // build model - QVariantList devices; - for (auto &device : hddDevices) { - QVariantMap model; - model["label"] = device; - model["name"] = device; - devices.append(model); - } - - return devices; -} - - QString AWKeys::infoByKey(const QString &_key) const { qCDebug(LOG_AW) << "Requested info for key" << _key; @@ -200,15 +180,13 @@ void AWKeys::editItem(const QString &_type) } -void AWKeys::dataUpdated(const QHash &_sensors, const KSysGuard::SensorDataList &_data) +void AWKeys::dataUpdated(const QHash> &_data) { - for (auto &single : _data) { - if (_sensors.contains(single.sensorProperty)) { - setDataBySource(single.sensorProperty, _sensors.value(single.sensorProperty), single); - } - // TODO use QtConcurrent::map or something like that - // QtConcurrent::run(m_threadPool, this, &AWKeys::setDataBySource, "ss", sensor); - } + qCDebug(LOG_AW) << "Update data for" << _data.count() << "items"; + + // though it is better to use QtConcurrent::map here, but it might cause stack corruption + for (auto [source, data] : _data.asKeyValueRange()) + std::ignore = QtConcurrent::run(m_threadPool, &AWKeys::setDataBySource, this, source, data.first, data.second); } @@ -357,10 +335,9 @@ QString AWKeys::parsePattern(QString _pattern) const } -void AWKeys::setDataBySource(const QString &_source, const KSysGuard::SensorInfo &_sensor, - const KSysGuard::SensorData &_data) +void AWKeys::setDataBySource(const QString &_source, const KSysGuard::SensorInfo &_sensor, const QVariant &_value) { - qCDebug(LOG_AW) << "Source" << _source << _sensor.name << "with data" << _data.payload; + qCDebug(LOG_AW) << "Source" << _source << _sensor.name << "with data" << _value; // first list init auto tags = m_aggregator->keysFromSource(_source); @@ -374,6 +351,6 @@ void AWKeys::setDataBySource(const QString &_source, const KSysGuard::SensorInfo } m_mutex.lock(); - std::for_each(tags.cbegin(), tags.cend(), [this, &_data](const QString &tag) { m_values[tag] = _data.payload; }); + std::for_each(tags.cbegin(), tags.cend(), [this, _value](const QString &tag) { m_values[tag] = _value; }); m_mutex.unlock(); } diff --git a/sources/awesome-widget/plugin/awkeys.h b/sources/awesome-widget/plugin/awkeys.h index 98ce5ca..a0b9e7c 100644 --- a/sources/awesome-widget/plugin/awkeys.h +++ b/sources/awesome-widget/plugin/awkeys.h @@ -46,22 +46,19 @@ public: Q_INVOKABLE void updateCache(); // keys Q_INVOKABLE [[nodiscard]] QStringList dictKeys(bool _sorted = false, const QString &_regexp = "") const; - Q_INVOKABLE [[nodiscard]] QVariantList getHddDevices() const; // values Q_INVOKABLE [[nodiscard]] QString infoByKey(const QString &_key) const; Q_INVOKABLE [[nodiscard]] QString valueByKey(const QString &_key) const; // configuration Q_INVOKABLE void editItem(const QString &_type); -public slots: - void dataUpdated(const QHash &_sensors, const KSysGuard::SensorDataList &_data); - signals: void dropSourceFromDataengine(const QString &_source); void needTextToBeUpdated(const QString &_newText) const; void needToolTipToBeUpdated(const QString &_newText) const; private slots: + void dataUpdated(const QHash> &_data); void reinitKeys(const QStringList &_currentKeys); void updateTextData(); @@ -70,8 +67,7 @@ private: void calculateValues(); void createDBusInterface(); [[nodiscard]] QString parsePattern(QString _pattern) const; - void setDataBySource(const QString &_source, const KSysGuard::SensorInfo &_sensor, - const KSysGuard::SensorData &_data); + void setDataBySource(const QString &_source, const KSysGuard::SensorInfo &_sensor, const QVariant &_value); // objects AWDataAggregator *m_dataAggregator = nullptr; AWDataEngineAggregator *m_dataEngineAggregator = nullptr; diff --git a/sources/extsysmonsources/extsysmonsensor.cpp b/sources/extsysmonsources/extsysmonsensor.cpp index b910aec..7d38eb7 100644 --- a/sources/extsysmonsources/extsysmonsensor.cpp +++ b/sources/extsysmonsources/extsysmonsensor.cpp @@ -73,10 +73,7 @@ void ExtSysMonSensor::update() void ExtSysMonSensor::loadProperties() { - auto sensors = m_source->sources(); - for (auto sensor = sensors.cbegin(); sensor != sensors.cend(); ++sensor) { - auto source = sensor.key(); - auto info = sensor.value(); + for (auto [source, info] : m_source->sources().asKeyValueRange()) { auto property = new KSysGuard::SensorProperty(source, info->name, this); property->setUnit(info->unit); diff --git a/sources/libraries.cmake b/sources/libraries.cmake index 2d9aaa9..901715e 100644 --- a/sources/libraries.cmake +++ b/sources/libraries.cmake @@ -2,7 +2,7 @@ find_package(Gettext REQUIRED) # main qt libraries -find_package(Qt6 6.6.0 REQUIRED COMPONENTS Core DBus Network Qml Test Widgets) +find_package(Qt6 6.6.0 REQUIRED COMPONENTS Core Concurrent DBus Network Qml Test Widgets) add_definitions( ${Qt6Core_DEFINITIONS} ${Qt6DBus_DEFINITIONS} ${Qt6Network_DEFINITIONS} ${Qt6Qml_DEFINITIONS} ${Qt6Widgets_DEFINITIONS} @@ -12,7 +12,7 @@ set(Qt_INCLUDE ${Qt6Qml_INCLUDE_DIRS} ${Qt6Widgets_INCLUDE_DIRS} ) set(Qt_LIBRARIES - ${Qt6Core_LIBRARIES} ${Qt6DBus_LIBRARIES} ${Qt6Network_LIBRARIES} + ${Qt6Core_LIBRARIES} ${Qt6Concurrent_LIBRARIES} ${Qt6DBus_LIBRARIES} ${Qt6Network_LIBRARIES} ${Qt6Qml_LIBRARIES} ${Qt6Widgets_LIBRARIES} ) diff --git a/sources/test/testawkeys.cpp b/sources/test/testawkeys.cpp index 4cea17f..fae42cf 100644 --- a/sources/test/testawkeys.cpp +++ b/sources/test/testawkeys.cpp @@ -73,12 +73,6 @@ void TestAWKeys::cleanupTestCase() } -void TestAWKeys::test_hddDevices() -{ - QVERIFY(plugin->getHddDevices().count() >= 2); -} - - void TestAWKeys::test_dictKeys() { auto keys = plugin->dictKeys(); diff --git a/sources/test/testawkeys.h b/sources/test/testawkeys.h index 6ba97e8..2546448 100644 --- a/sources/test/testawkeys.h +++ b/sources/test/testawkeys.h @@ -31,7 +31,6 @@ private slots: void initTestCase(); void cleanupTestCase(); // test - void test_hddDevices(); void test_dictKeys(); void test_pattern(); void test_tooltip();