From c4612d84ed027172a4f145a1977b58d3e1c31357 Mon Sep 17 00:00:00 2001 From: arcan1s Date: Mon, 5 Oct 2015 00:00:38 +0300 Subject: [PATCH] move dataengine control to plugin part (ref to #66) --- .../package/contents/ui/dataengine.qml | 21 ++- .../package/contents/ui/main.qml | 68 +------- .../package/contents/ui/widget.qml | 55 +------ sources/awesome-widget/plugin/CMakeLists.txt | 4 +- .../plugin/awdataengineaggregator.cpp | 123 +++++++++++++++ .../plugin/awdataengineaggregator.h | 58 +++++++ sources/awesome-widget/plugin/awkeys.cpp | 145 ++++++++++-------- sources/awesome-widget/plugin/awkeys.h | 22 +-- 8 files changed, 297 insertions(+), 199 deletions(-) create mode 100644 sources/awesome-widget/plugin/awdataengineaggregator.cpp create mode 100644 sources/awesome-widget/plugin/awdataengineaggregator.h diff --git a/sources/awesome-widget/package/contents/ui/dataengine.qml b/sources/awesome-widget/package/contents/ui/dataengine.qml index e8b21c6..be40f4a 100644 --- a/sources/awesome-widget/package/contents/ui/dataengine.qml +++ b/sources/awesome-widget/package/contents/ui/dataengine.qml @@ -118,16 +118,6 @@ Item { QtControls.ComboBox { id: hdd width: parent.width * 3 / 5 - model: awKeys.getHddDevices(true) - Component.onCompleted: { - if (debug) console.debug() - for (var i=0; i + +#include + +#include "awdebug.h" +#include "awkeys.h" + + +AWDataEngineAggregator::AWDataEngineAggregator(QObject *parent, const int interval) + : QObject(parent) +{ + qCDebug(LOG_AW); + + setInterval(interval); + initDataEngines(); + connectVisualization(); +} + + +AWDataEngineAggregator::~AWDataEngineAggregator() +{ + qCDebug(LOG_AW); + + m_dataEngines.clear(); +} + + +void AWDataEngineAggregator::setInterval(const int _interval) +{ + qCDebug(LOG_AW); + qCDebug(LOG_AW) << "Interval" << _interval; + + m_interval = _interval; +} + + +void AWDataEngineAggregator::connectVisualization() +{ + qCDebug(LOG_AW); + + connect(this, SIGNAL(updateData(QString, QVariantHash)), + parent(), SLOT(dataUpdated(QString, QVariantHash))); + + return static_cast(parent())->unlock(); +} + + +void AWDataEngineAggregator::disconnectVisualization() +{ + qCDebug(LOG_AW); + + disconnect(this, SIGNAL(updateData(QString, QVariantHash)), + parent(), SLOT(dataUpdated(QString, QVariantHash))); + + return QTimer::singleShot(5 * m_interval, this, SLOT(connectVisualization())); +} + + +void AWDataEngineAggregator::dropSource(const QString source) +{ + qCDebug(LOG_AW); + qCDebug(LOG_AW) << "Source" << source; + + // this method is only used for systemmonitor dataengine + m_dataEngines[QString("systemmonitor")]->disconnectSource(source, this); +} + + +void AWDataEngineAggregator::reconnectSources() +{ + qCDebug(LOG_AW); + + m_dataEngines[QString("systemmonitor")]->connectAllSources(this, m_interval); + m_dataEngines[QString("extsysmon")]->connectAllSources(this, m_interval); + m_dataEngines[QString("time")]->connectSource(QString("Local"), this, 1000); +} + + +void AWDataEngineAggregator::dataUpdated(const QString sourceName, const Plasma::DataEngine::Data data) +{ + qCDebug(LOG_AW); + qCDebug(LOG_AW) << "Source" << sourceName; + qCDebug(LOG_AW) << "Data" << data; + + return emit(updateData(QString(sourceName), qvariant_cast(data))); +} + + +void AWDataEngineAggregator::initDataEngines() +{ + qCDebug(LOG_AW); + + Plasma::DataEngineConsumer *deConsumer = new Plasma::DataEngineConsumer(); + m_dataEngines[QString("systemmonitor")] = deConsumer->dataEngine(QString("systemmonitor")); + m_dataEngines[QString("extsysmon")] = deConsumer->dataEngine(QString("extsysmon")); + m_dataEngines[QString("time")] = deConsumer->dataEngine(QString("time")); + + // additional method required by systemmonitor structure + connect(m_dataEngines[QString("systemmonitor")], &Plasma::DataEngine::sourceAdded, + [this](const QString source) { + static_cast(parent())->addDevice(source); + m_dataEngines[QString("systemmonitor")]->connectSource(source, this, m_interval); + }); +} diff --git a/sources/awesome-widget/plugin/awdataengineaggregator.h b/sources/awesome-widget/plugin/awdataengineaggregator.h new file mode 100644 index 0000000..629e4d3 --- /dev/null +++ b/sources/awesome-widget/plugin/awdataengineaggregator.h @@ -0,0 +1,58 @@ +/*************************************************************************** + * This file is part of awesome-widgets * + * * + * awesome-widgets is free software: you can redistribute it and/or * + * modify it under the terms of the GNU General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * * + * awesome-widgets is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * + ***************************************************************************/ + + +#ifndef AWDATAENGINEAGGREGATOR_H +#define AWDATAENGINEAGGREGATOR_H + +#include +#include + + +class AWDataEngineAggregator : public QObject +{ + Q_OBJECT + Q_PROPERTY(int interval MEMBER m_interval WRITE setInterval); + +public: + explicit AWDataEngineAggregator(QObject *parent = nullptr, const int interval = 1000); + virtual ~AWDataEngineAggregator(); + // properties + void setInterval(const int _interval); + +signals: + void updateData(const QString sourceName, const QVariantHash sdata); + +public slots: + // additional methods to control this and visualization + void connectVisualization(); + void disconnectVisualization(); + void dropSource(const QString source); + void reconnectSources(); + // data engines operations + void dataUpdated(const QString sourceName, const Plasma::DataEngine::Data data); + // dummy method required by DataEngine connections + void modelChanged(QString, QAbstractItemModel *) {}; + +private: + void initDataEngines(); + QHash m_dataEngines; + int m_interval; +}; + + +#endif /* AWDATAENGINEAGGREGATOR_H */ diff --git a/sources/awesome-widget/plugin/awkeys.cpp b/sources/awesome-widget/plugin/awkeys.cpp index 089c88f..c8e4c5f 100644 --- a/sources/awesome-widget/plugin/awkeys.cpp +++ b/sources/awesome-widget/plugin/awkeys.cpp @@ -27,9 +27,10 @@ #include #include +#include "awdataaggregator.h" +#include "awdataengineaggregator.h" #include "awdebug.h" #include "awkeysaggregator.h" -#include "awdataaggregator.h" #include "extquotes.h" #include "extscript.h" #include "extupgrade.h" @@ -57,7 +58,7 @@ AWKeys::AWKeys(QObject *parent) // transfer signal from AWDataAggregator object to QML ui connect(dataAggregator, SIGNAL(toolTipPainted(const QString)), this, SIGNAL(needToolTipToBeUpdated(const QString))); - connect(this, SIGNAL(needToBeUpdated()), this, SLOT(dataUpdate())); + connect(this, SIGNAL(needToBeUpdated()), this, SLOT(updateTextData())); } @@ -73,12 +74,21 @@ AWKeys::~AWKeys() if (extWeather != nullptr) delete extWeather; // core + if (dataEngineAggregator != nullptr) delete dataEngineAggregator; if (threadPool != nullptr) delete threadPool; delete aggregator; delete dataAggregator; } +void AWKeys::unlock() +{ + qCDebug(LOG_AW); + + lock = false; +} + + void AWKeys::initDataAggregator(const QVariantMap tooltipParams) { qCDebug(LOG_AW); @@ -88,13 +98,21 @@ void AWKeys::initDataAggregator(const QVariantMap tooltipParams) } -void AWKeys::initKeys(const QString currentPattern, const int limit) +void AWKeys::initKeys(const QString currentPattern, const int interval, const int limit) { qCDebug(LOG_AW); qCDebug(LOG_AW) << "Pattern" << currentPattern; + qCDebug(LOG_AW) << "Interval" << interval; + qCDebug(LOG_AW) << "Queue limit" << limit; // init m_pattern = currentPattern; + if (dataEngineAggregator == nullptr) { + dataEngineAggregator = new AWDataEngineAggregator(this, interval); + connect(this, SIGNAL(dropSourceFromDataengine(QString)), + dataEngineAggregator, SLOT(dropSource(QString))); + } else + dataEngineAggregator->setInterval(interval); #ifdef BUILD_FUTURE // queue limit. It may be configured by using QUEUE_LIMIT cmake limit flag. // In other hand since I'm using global thread pool, it makes sense to limit @@ -102,9 +120,9 @@ void AWKeys::initKeys(const QString currentPattern, const int limit) queueLimit = limit == 0 ? QThread::idealThreadCount() : limit; threadPool->setMaxThreadCount(queueLimit); #endif /* BUILD_FUTURE */ - // update network and hdd list - addKeyToCache(QString("hdd")); - addKeyToCache(QString("net")); + updateCache(); + + return dataEngineAggregator->reconnectSources(); } @@ -125,33 +143,13 @@ void AWKeys::setWrapNewLines(const bool wrap) } -void AWKeys::unlock() +void AWKeys::updateCache() { qCDebug(LOG_AW); - lock = false; -} - - -void AWKeys::addDevice(const QString source) -{ - qCDebug(LOG_AW); - qCDebug(LOG_AW) << "Source" << source; - - QRegExp diskRegexp = QRegExp(QString("disk/(?:md|sd|hd)[a-z|0-9]_.*/Rate/(?:rblk)")); - QRegExp mountRegexp = QRegExp(QString("partitions/.*/filllevel")); - - if (source.contains(diskRegexp)) { - QString device = source; - device.remove(QString("/Rate/rblk")); - addKeyToCache(QString("disk"), device); - } else if (source.contains(mountRegexp)) { - QString device = source; - device.remove(QString("partitions")).remove(QString("/filllevel")); - addKeyToCache(QString("mount"), device); - } else if (source.startsWith(QString("lmsensors"))) { - addKeyToCache(QString("temp"), source); - } + // update network and hdd list + addKeyToCache(QString("hdd")); + addKeyToCache(QString("net")); } @@ -325,26 +323,6 @@ QStringList AWKeys::getHddDevices() const } -void AWKeys::dataUpdateReceived(const QString sourceName, const QVariantMap data) -{ - qCDebug(LOG_AW); - qCDebug(LOG_AW) << "Source" << sourceName; - qCDebug(LOG_AW) << "Data" << data; - - if (lock) return; - if (sourceName == QString("update")) return emit(needToBeUpdated()); - -#ifdef BUILD_FUTURE - // run concurrent data update - QtConcurrent::run(threadPool, [this, sourceName, data]() { - return setDataBySource(sourceName, data); - }); -#else /* BUILD_FUTURE */ - return setDataBySource(sourceName, data); -#endif /* BUILD_FUTURE */ -} - - QString AWKeys::infoByKey(QString key) const { qCDebug(LOG_AW); @@ -404,21 +382,45 @@ void AWKeys::editItem(const QString type) } -void AWKeys::dataUpdate() +void AWKeys::addDevice(const QString source) { qCDebug(LOG_AW); + qCDebug(LOG_AW) << "Source" << source; + + QRegExp diskRegexp = QRegExp(QString("disk/(?:md|sd|hd)[a-z|0-9]_.*/Rate/(?:rblk)")); + QRegExp mountRegexp = QRegExp(QString("partitions/.*/filllevel")); + + if (source.contains(diskRegexp)) { + QString device = source; + device.remove(QString("/Rate/rblk")); + addKeyToCache(QString("disk"), device); + } else if (source.contains(mountRegexp)) { + QString device = source; + device.remove(QString("partitions")).remove(QString("/filllevel")); + addKeyToCache(QString("mount"), device); + } else if (source.startsWith(QString("lmsensors"))) { + addKeyToCache(QString("temp"), source); + } +} + + +void AWKeys::dataUpdated(const QString sourceName, const QVariantHash data) +{ + qCDebug(LOG_AW); + qCDebug(LOG_AW) << "Source" << sourceName; + qCDebug(LOG_AW) << "Data" << data; + + if (lock) return; + if (sourceName == QString("update")) return emit(needToBeUpdated()); #ifdef BUILD_FUTURE - QFuture text = QtConcurrent::run(threadPool, [this]() { - calculateValues(); - return parsePattern(m_pattern); + // run concurrent data update + QtConcurrent::run(threadPool, [this, sourceName, data]() { + return setDataBySource(sourceName, data); }); #else /* BUILD_FUTURE */ - calculateValues(); - QString text = parsePattern(m_pattern); + return setDataBySource(sourceName, data); #endif /* BUILD_FUTURE */ - emit(needTextToBeUpdated(text)); - emit(dataAggregator->updateData(values)); } @@ -464,7 +466,7 @@ void AWKeys::reinitKeys() // init QStringList allKeys = dictKeys(); -#ifdef BUILD_TEST +#ifdef BUILD_TESTING // not documented feature - place all available tags m_pattern = m_pattern.replace(QString("$ALL"), [allKeys]() { QStringList strings; @@ -472,7 +474,7 @@ void AWKeys::reinitKeys() strings.append(QString("%1: $%1").arg(tag)); return strings.join(QString(" | ")); }()); -#endif /* BUILD_TEST */ +#endif /* BUILD_TESTING */ // append lists // bars @@ -528,6 +530,24 @@ void AWKeys::reinitKeys() } +void AWKeys::updateTextData() +{ + qCDebug(LOG_AW); + +#ifdef BUILD_FUTURE + QFuture text = QtConcurrent::run(threadPool, [this]() { + calculateValues(); + return parsePattern(m_pattern); + }); +#else /* BUILD_FUTURE */ + calculateValues(); + QString text = parsePattern(m_pattern); +#endif /* BUILD_FUTURE */ + emit(needTextToBeUpdated(text)); + emit(dataAggregator->updateData(values)); +} + + void AWKeys::addKeyToCache(const QString type, const QString key) { qCDebug(LOG_AW); @@ -679,7 +699,7 @@ QString AWKeys::parsePattern(QString pattern) const } -void AWKeys::setDataBySource(const QString sourceName, const QVariantMap data) +void AWKeys::setDataBySource(const QString sourceName, const QVariantHash data) { qCDebug(LOG_AW); qCDebug(LOG_AW) << "Source" << sourceName; @@ -690,8 +710,7 @@ void AWKeys::setDataBySource(const QString sourceName, const QVariantMap data) if (++queue > queueLimit) { qCWarning(LOG_AW) << "Messages queue" << queue-- << "more than limits" << queueLimit; lock = true; - emit(disconnectPlugin()); - return; + return dataEngineAggregator->disconnectVisualization(); } #endif /* BUILD_FUTURE */ diff --git a/sources/awesome-widget/plugin/awkeys.h b/sources/awesome-widget/plugin/awkeys.h index 5cb311b..5bc2c02 100644 --- a/sources/awesome-widget/plugin/awkeys.h +++ b/sources/awesome-widget/plugin/awkeys.h @@ -25,6 +25,7 @@ class AWDataAggregator; +class AWDataEngineAggregator; class AWKeysAggregator; class ExtQuotes; class ExtScript; @@ -40,45 +41,48 @@ class AWKeys : public QObject public: explicit AWKeys(QObject *parent = nullptr); virtual ~AWKeys(); - Q_INVOKABLE void initDataAggregator(const QVariantMap tooltipParams); - Q_INVOKABLE void initKeys(const QString currentPattern, const int limit); + Q_INVOKABLE void initKeys(const QString currentPattern, const int interval, + const int limit); Q_INVOKABLE void setAggregatorProperty(const QString key, const QVariant value); Q_INVOKABLE void setWrapNewLines(const bool wrap = false); Q_INVOKABLE void unlock(); + Q_INVOKABLE void updateCache(); // keys - Q_INVOKABLE void addDevice(const QString source); Q_INVOKABLE QStringList dictKeys(const bool sorted = false, const QString regexp = QString()) const; Q_INVOKABLE QStringList getHddDevices() const; - Q_INVOKABLE void dataUpdateReceived(const QString sourceName, const QVariantMap data); // values Q_INVOKABLE QString infoByKey(QString key) const; Q_INVOKABLE QString valueByKey(QString key) const; // configuration Q_INVOKABLE void editItem(const QString type); +public slots: + void addDevice(const QString source); + void dataUpdated(const QString sourceName, const QVariantHash data); + signals: - void disconnectPlugin() const; void dropSourceFromDataengine(const QString source); void needTextToBeUpdated(const QString newText) const; void needToolTipToBeUpdated(const QString newText) const; void needToBeUpdated(); private slots: - void dataUpdate(); void loadKeysFromCache(); void reinitKeys(); + void updateTextData(); private: // methods void addKeyToCache(const QString type, const QString key = QString("")); void calculateValues(); QString parsePattern(QString pattern) const; - void setDataBySource(const QString sourceName, const QVariantMap data); + void setDataBySource(const QString sourceName, const QVariantHash data); // objects - AWKeysAggregator *aggregator = nullptr; AWDataAggregator *dataAggregator = nullptr; + AWDataEngineAggregator *dataEngineAggregator = nullptr; + AWKeysAggregator *aggregator = nullptr; ExtItemAggregator *graphicalItems = nullptr; ExtItemAggregator *extQuotes = nullptr; ExtItemAggregator *extScripts = nullptr; @@ -92,8 +96,8 @@ private: bool m_wrapNewLines = false; // queue and stream lock properties QThreadPool *threadPool = nullptr; - bool lock = true; int queueLimit, queue = 0; + bool lock = true; };