diff --git a/sources/awesome-widget/plugin/awdataenginemapper.cpp b/sources/awesome-widget/plugin/awdataenginemapper.cpp new file mode 100644 index 0000000..afcf602 --- /dev/null +++ b/sources/awesome-widget/plugin/awdataenginemapper.cpp @@ -0,0 +1,448 @@ +/*************************************************************************** + * 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/ * + ***************************************************************************/ + +#include "awdataenginemapper.h" + +#include + +#include "awdebug.h" +#include "awformatterhelper.h" + + +AWDataEngineMapper::AWDataEngineMapper(QObject *_parent, + AWFormatterHelper *_custom) + : QObject(_parent) + , m_customFormatters(_custom) +{ + qCDebug(LOG_AW) << __PRETTY_FUNCTION__; + + // default formatters + // memory + m_formatter["mem"] = AWKeysAggregator::FormatterType::Float; + m_formatter["memtotmb"] = AWKeysAggregator::FormatterType::MemMBFormat; + m_formatter["memtotgb"] = AWKeysAggregator::FormatterType::MemGBFormat; + // network + m_formatter["down"] = AWKeysAggregator::FormatterType::NetSmartFormat; + m_formatter["downkb"] = AWKeysAggregator::FormatterType::Integer; + m_formatter["downtot"] = AWKeysAggregator::FormatterType::MemMBFormat; + m_formatter["downtotkb"] = AWKeysAggregator::FormatterType::Integer; + m_formatter["downunits"] = AWKeysAggregator::FormatterType::NetSmartUnits; + m_formatter["up"] = AWKeysAggregator::FormatterType::NetSmartFormat; + m_formatter["upkb"] = AWKeysAggregator::FormatterType::Integer; + m_formatter["uptot"] = AWKeysAggregator::FormatterType::MemMBFormat; + m_formatter["uptotkb"] = AWKeysAggregator::FormatterType::Integer; + m_formatter["upunits"] = AWKeysAggregator::FormatterType::NetSmartUnits; + // swap + m_formatter["swap"] = AWKeysAggregator::FormatterType::Float; + m_formatter["swaptotmb"] = AWKeysAggregator::FormatterType::MemMBFormat; + m_formatter["swaptotgb"] = AWKeysAggregator::FormatterType::MemGBFormat; +} + + +AWDataEngineMapper::~AWDataEngineMapper() +{ + qCDebug(LOG_AW) << __PRETTY_FUNCTION__; +} + + +AWKeysAggregator::FormatterType +AWDataEngineMapper::formatter(const QString &_key) const +{ + qCDebug(LOG_AW) << "Get formatter for key" << _key; + + return m_formatter.value(_key, AWKeysAggregator::FormatterType::NoFormat); +} + + +QStringList AWDataEngineMapper::keysFromSource(const QString &_source) const +{ + qCDebug(LOG_AW) << "Search for source" << _source; + + return m_map.values(_source); +} + + +// HACK units required to define should the value be calculated as temperature +// or fan data +QStringList AWDataEngineMapper::registerSource(const QString &_source, + const QString &_units, + const QStringList &_keys) +{ + qCDebug(LOG_AW) << "Source" << _source << "with units" << _units; + + // regular expressions + QRegExp cpuRegExp = QRegExp("cpu/cpu.*/TotalLoad"); + QRegExp cpuclRegExp = QRegExp("cpu/cpu.*/clock"); + QRegExp hddrRegExp = QRegExp("disk/.*/Rate/rblk"); + QRegExp hddwRegExp = QRegExp("disk/.*/Rate/wblk"); + QRegExp mountFillRegExp = QRegExp("partitions/.*/filllevel"); + QRegExp mountFreeRegExp = QRegExp("partitions/.*/freespace"); + QRegExp mountUsedRegExp = QRegExp("partitions/.*/usedspace"); + QRegExp netRegExp + = QRegExp("network/interfaces/.*/(receiver|transmitter)/data$"); + QRegExp netTotalRegExp + = QRegExp("network/interfaces/.*/(receiver|transmitter)/dataTotal$"); + + if (_source == "battery/ac") { + // AC + m_map[_source] = "ac"; + m_formatter["ac"] = AWKeysAggregator::FormatterType::ACFormat; + } else if (_source.startsWith("battery/")) { + // battery stats + QString key = _source; + key.remove("battery/"); + m_map[_source] = key; + m_formatter[key] = AWKeysAggregator::FormatterType::IntegerThree; + } else if (_source == "cpu/system/TotalLoad") { + // cpu + m_map[_source] = "cpu"; + m_formatter["cpu"] = AWKeysAggregator::FormatterType::Float; + } else if (_source.contains(cpuRegExp)) { + // cpus + QString key = _source; + key.remove("cpu/").remove("/TotalLoad"); + m_map[_source] = key; + m_formatter[key] = AWKeysAggregator::FormatterType::Float; + } else if (_source == "cpu/system/AverageClock") { + // cpucl + m_map[_source] = "cpucl"; + m_formatter["cpucl"] = AWKeysAggregator::FormatterType::Integer; + } else if (_source.contains(cpuclRegExp)) { + // cpucls + QString key = _source; + key.remove("cpu/cpu").remove("/clock"); + key = QString("cpucl%1").arg(key); + m_map[_source] = key; + m_formatter[key] = AWKeysAggregator::FormatterType::Integer; + } else if (_source.startsWith("custom")) { + // custom + QString key = _source; + key.remove("custom/"); + m_map[_source] = key; + m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat; + } else if (_source == "desktop/current/name") { + // current desktop name + m_map[_source] = "desktop"; + m_formatter["desktop"] = AWKeysAggregator::FormatterType::NoFormat; + } else if (_source == "desktop/current/number") { + // current desktop number + m_map[_source] = "ndesktop"; + m_formatter["ndesktop"] = AWKeysAggregator::FormatterType::NoFormat; + } else if (_source == "desktop/total/number") { + // desktop count + m_map[_source] = "tdesktops"; + m_formatter["tdesktops"] = AWKeysAggregator::FormatterType::NoFormat; + } else if (_source.contains(hddrRegExp)) { + // read speed + QString device = _source; + device.remove("/Rate/rblk"); + int index = m_devices["disk"].indexOf(device); + if (index > -1) { + QString key = QString("hddr%1").arg(index); + m_map[_source] = key; + m_formatter[key] = AWKeysAggregator::FormatterType::Integer; + } + } else if (_source.contains(hddwRegExp)) { + // write speed + QString device = _source; + device.remove("/Rate/wblk"); + int index = m_devices["disk"].indexOf(device); + if (index > -1) { + QString key = QString("hddw%1").arg(index); + m_map[_source] = key; + m_formatter[key] = AWKeysAggregator::FormatterType::Integer; + } + } else if (_source == "gpu/load") { + // gpu load + m_map[_source] = "gpu"; + m_formatter["gpu"] = AWKeysAggregator::FormatterType::Float; + } else if (_source == "gpu/temperature") { + // gpu temperature + m_map[_source] = "gputemp"; + m_formatter["gputemp"] = AWKeysAggregator::FormatterType::Temperature; + } else if (_source.contains(mountFillRegExp)) { + // fill level + QString device = _source; + device.remove("partitions").remove("/filllevel"); + int index = m_devices["mount"].indexOf(device); + if (index > -1) { + QString key = QString("hdd%1").arg(index); + m_map[_source] = key; + m_formatter[key] = AWKeysAggregator::FormatterType::Float; + // additional keys + m_formatter[QString("hddtotmb%1").arg(index)] + = AWKeysAggregator::FormatterType::MemMBFormat; + m_formatter[QString("hddtotgb%1").arg(index)] + = AWKeysAggregator::FormatterType::MemGBFormat; + } + } else if (_source.contains(mountFreeRegExp)) { + // free space + QString device = _source; + device.remove("partitions").remove("/freespace"); + int index = m_devices["mount"].indexOf(device); + if (index > -1) { + // mb + QString key = QString("hddfreemb%1").arg(index); + m_map[_source] = key; + m_formatter[key] = AWKeysAggregator::FormatterType::MemMBFormat; + // gb + key = QString("hddfreegb%1").arg(index); + m_map.insertMulti(_source, key); + m_formatter[key] = AWKeysAggregator::FormatterType::MemGBFormat; + } + } else if (_source.contains(mountUsedRegExp)) { + // used + QString device = _source; + device.remove("partitions").remove("/usedspace"); + int index = m_devices["mount"].indexOf(device); + if (index > -1) { + // mb + QString key = QString("hddmb%1").arg(index); + m_map[_source] = key; + m_formatter[key] = AWKeysAggregator::FormatterType::MemMBFormat; + // gb + key = QString("hddgb%1").arg(index); + m_map.insertMulti(_source, key); + m_formatter[key] = AWKeysAggregator::FormatterType::MemGBFormat; + } + } else if (_source.startsWith("hdd/temperature")) { + // hdd temperature + QString device = _source; + device.remove("hdd/temperature"); + int index = m_devices["hdd"].indexOf(device); + if (index > -1) { + QString key = QString("hddtemp%1").arg(index); + m_map[_source] = key; + m_formatter[key] = AWKeysAggregator::FormatterType::Temperature; + } + } else if (_source.startsWith("cpu/system/loadavg")) { + // load average + QString time = _source; + time.remove("cpu/system/loadavg"); + QString key = QString("la%1").arg(time); + m_map[_source] = key; + m_formatter[key] = AWKeysAggregator::FormatterType::FloatTwoSymbols; + } else if (_source == "mem/physical/application") { + // app memory + // mb + m_map[_source] = "memmb"; + m_formatter["memmb"] = AWKeysAggregator::FormatterType::MemMBFormat; + // gb + m_map.insertMulti(_source, "memgb"); + m_formatter["memgb"] = AWKeysAggregator::FormatterType::MemGBFormat; + } else if (_source == "mem/physical/free") { + // free memory + // mb + m_map[_source] = "memfreemb"; + m_formatter["memfreemb"] = AWKeysAggregator::FormatterType::MemMBFormat; + // gb + m_map.insertMulti(_source, "memfreegb"); + m_formatter["memfreegb"] = AWKeysAggregator::FormatterType::MemGBFormat; + } else if (_source == "mem/physical/used") { + // used memory + // mb + m_map[_source] = "memusedmb"; + m_formatter["memusedmb"] = AWKeysAggregator::FormatterType::MemMBFormat; + // gb + m_map.insertMulti(_source, "memusedgb"); + m_formatter["memusedgb"] = AWKeysAggregator::FormatterType::MemGBFormat; + } else if (_source == "network/current/name") { + // network device + m_map[_source] = "netdev"; + m_formatter["netdev"] = AWKeysAggregator::FormatterType::NoFormat; + } else if (_source.startsWith("network/response")) { + // network response + QString key = _source; + key.remove("network/"); + m_map[_source] = key; + m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat; + } else if (_source.contains(netRegExp)) { + // network speed + QString type = _source.contains("receiver") ? "down" : "up"; + int index = m_devices["net"].indexOf(_source.split('/')[2]); + if (index > -1) { + // kb + QString key = QString("%1kb%2").arg(type).arg(index); + m_map[_source] = key; + m_formatter[key] = AWKeysAggregator::FormatterType::Integer; + // smart + key = QString("%1%2").arg(type).arg(index); + m_map.insertMulti(_source, key); + m_formatter[key] = AWKeysAggregator::FormatterType::NetSmartFormat; + // units + key = QString("%1units%2").arg(type).arg(index); + m_map.insertMulti(_source, key); + m_formatter[key] = AWKeysAggregator::FormatterType::NetSmartUnits; + } + } else if (_source.contains(netTotalRegExp)) { + // network data total + QString type = _source.contains("receiver") ? "down" : "up"; + int index = m_devices["net"].indexOf(_source.split('/')[2]); + if (index > -1) { + // kb + QString key = QString("%1totkb%2").arg(type).arg(index); + m_map[_source] = key; + m_formatter[key] = AWKeysAggregator::FormatterType::Integer; + // mb + key = QString("%1tot%2").arg(type).arg(index); + m_map.insertMulti(_source, key); + m_formatter[key] = AWKeysAggregator::FormatterType::MemMBFormat; + } + } else if (_source.startsWith("upgrade")) { + // package manager + QString key = _source; + key.remove("upgrade/"); + m_map[_source] = key; + m_formatter[key] = AWKeysAggregator::FormatterType::IntegerThree; + } else if (_source.startsWith("player")) { + // player + QString key = _source; + key.remove("player/"); + m_map[_source] = key; + m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat; + } else if (_source == "ps/running/count") { + // running processes count + m_map[_source] = "pscount"; + m_formatter["pscount"] = AWKeysAggregator::FormatterType::NoFormat; + } else if (_source == "ps/running/list") { + // list of running processes + m_map[_source] = "ps"; + m_formatter["ps"] = AWKeysAggregator::FormatterType::List; + } else if (_source == "ps/total/count") { + // total processes count + m_map[_source] = "pstot"; + m_formatter["pstot"] = AWKeysAggregator::FormatterType::NoFormat; + } else if (_source.startsWith("quotes")) { + // quotes + QString key = _source; + key.remove("quotes/"); + m_map[_source] = key; + m_formatter[key] = AWKeysAggregator::FormatterType::Quotes; + } else if (_source == "mem/swap/free") { + // free swap + // mb + m_map[_source] = "swapfreemb"; + m_formatter["swapfreemb"] + = AWKeysAggregator::FormatterType::MemMBFormat; + // gb + m_map.insertMulti(_source, "swapfreegb"); + m_formatter["swapfreegb"] + = AWKeysAggregator::FormatterType::MemGBFormat; + } else if (_source == "mem/swap/used") { + // used swap + // mb + m_map[_source] = "swapmb"; + m_formatter["swapmb"] = AWKeysAggregator::FormatterType::MemMBFormat; + // gb + m_map.insertMulti(_source, "swapgb"); + m_formatter["swapgb"] = AWKeysAggregator::FormatterType::MemGBFormat; + } else if (_source.startsWith("lmsensors/")) { + // temperature + int index = m_devices["temp"].indexOf(_source); + // HACK on DE initialization there are no units key + if (_units.isEmpty()) + return QStringList({QString("temp%1").arg(index)}); + if (index > -1) { + QString key = QString("temp%1").arg(index); + m_map[_source] = key; + m_formatter[key] + = _units == "°C" ? AWKeysAggregator::FormatterType::Temperature + : AWKeysAggregator::FormatterType::Integer; + } + } else if (_source == "Local") { + // time + m_map[_source] = "time"; + m_formatter["time"] = AWKeysAggregator::FormatterType::Time; + // custom time + m_map.insertMulti(_source, "ctime"); + m_formatter["ctime"] = AWKeysAggregator::FormatterType::TimeCustom; + // ISO time + m_map.insertMulti(_source, "isotime"); + m_formatter["isotime"] = AWKeysAggregator::FormatterType::TimeISO; + // long time + m_map.insertMulti(_source, "longtime"); + m_formatter["longtime"] = AWKeysAggregator::FormatterType::TimeLong; + // short time + m_map.insertMulti(_source, "shorttime"); + m_formatter["shorttime"] = AWKeysAggregator::FormatterType::TimeShort; + // timestamp + m_map.insertMulti(_source, "tstime"); + m_formatter["tstime"] = AWKeysAggregator::FormatterType::Timestamp; + } else if (_source == "system/uptime") { + // uptime + m_map[_source] = "uptime"; + m_formatter["uptime"] = AWKeysAggregator::FormatterType::Uptime; + // custom uptime + m_map.insertMulti(_source, "cuptime"); + m_formatter["cuptime"] = AWKeysAggregator::FormatterType::UptimeCustom; + } else if (_source.startsWith("weather/temperature")) { + // temperature + QString key = _source; + key.remove("weather/"); + m_map[_source] = key; + m_formatter[key] = AWKeysAggregator::FormatterType::Temperature; + } else if (_source.startsWith("weather/")) { + // other weather + QString key = _source; + key.remove("weather/"); + m_map[_source] = key; + m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat; + } else if (_source.startsWith("load/load")) { + // load source + QString key = _source; + key.remove("load/"); + m_map[_source] = key; + m_formatter[key] = AWKeysAggregator::FormatterType::Temperature; + } + + QStringList foundKeys = keysFromSource(_source); + + // rewrite formatters for custom ones + QStringList customFormattersKeys; + if (m_customFormatters) + customFormattersKeys = m_customFormatters->definedFormatters(); + qCInfo(LOG_AW) << "Looking for formatters" << foundKeys << "in" + << customFormattersKeys; + for (auto &key : foundKeys) { + if (!customFormattersKeys.contains(key)) + continue; + m_formatter[key] = AWKeysAggregator::FormatterType::Custom; + } + + // drop key from dictionary if no one user requested key required it + qCInfo(LOG_AW) << "Looking for keys" << foundKeys << "in" << _keys; + bool required + = _keys.isEmpty() || std::any_of(foundKeys.cbegin(), foundKeys.cend(), + [&_keys](const QString &key) { + return _keys.contains(key); + }); + if (!required) { + m_map.remove(_source); + for (auto &key : foundKeys) + m_formatter.remove(key); + } + + return keysFromSource(_source); +} + + +void AWDataEngineMapper::setDevices(const QHash &_devices) +{ + qCDebug(LOG_AW) << "Devices" << _devices; + + m_devices = _devices; +} diff --git a/sources/awesome-widget/plugin/awdataenginemapper.h b/sources/awesome-widget/plugin/awdataenginemapper.h new file mode 100644 index 0000000..e070f23 --- /dev/null +++ b/sources/awesome-widget/plugin/awdataenginemapper.h @@ -0,0 +1,55 @@ +/*************************************************************************** + * 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 AWDATAENGINEMAPPER_H +#define AWDATAENGINEMAPPER_H + +#include +#include + +#include "awkeysaggregator.h" + + +class AWFormatterHelper; + +class AWDataEngineMapper : public QObject +{ + Q_OBJECT + +public: + explicit AWDataEngineMapper(QObject *_parent = nullptr, + AWFormatterHelper *_custom = nullptr); + virtual ~AWDataEngineMapper(); + // get methods + AWKeysAggregator::FormatterType formatter(const QString &_key) const; + QStringList keysFromSource(const QString &_source) const; + // set methods + QStringList registerSource(const QString &_source, const QString &_units, + const QStringList &_keys); + void setDevices(const QHash &_devices); + +private: + AWFormatterHelper *m_customFormatters = nullptr; + // variables + QHash m_devices; + QHash m_formatter; + QHash m_map; +}; + + +#endif /* AWDATAENGINEMAPPER_H */ diff --git a/sources/awesome-widget/plugin/awkeysaggregator.cpp b/sources/awesome-widget/plugin/awkeysaggregator.cpp index c018cf2..b099019 100644 --- a/sources/awesome-widget/plugin/awkeysaggregator.cpp +++ b/sources/awesome-widget/plugin/awkeysaggregator.cpp @@ -21,10 +21,11 @@ #include #include -#include +#include "awdataenginemapper.h" #include "awdebug.h" #include "awformatterhelper.h" +#include "version.h" AWKeysAggregator::AWKeysAggregator(QObject *_parent) @@ -33,31 +34,12 @@ AWKeysAggregator::AWKeysAggregator(QObject *_parent) qCDebug(LOG_AW) << __PRETTY_FUNCTION__; m_customFormatters = new AWFormatterHelper(nullptr); + m_mapper = new AWDataEngineMapper(this, m_customFormatters); // sort time keys + m_timeKeys = QString(TIME_KEYS).split(','); m_timeKeys.sort(); std::reverse(m_timeKeys.begin(), m_timeKeys.end()); - - // default formatters - // memory - m_formatter["mem"] = FormatterType::Float; - m_formatter["memtotmb"] = FormatterType::MemMBFormat; - m_formatter["memtotgb"] = FormatterType::MemGBFormat; - // network - m_formatter["down"] = FormatterType::NetSmartFormat; - m_formatter["downkb"] = FormatterType::Integer; - m_formatter["downtot"] = FormatterType::MemMBFormat; - m_formatter["downtotkb"] = FormatterType::Integer; - m_formatter["downunits"] = FormatterType::NetSmartUnits; - m_formatter["up"] = FormatterType::NetSmartFormat; - m_formatter["upkb"] = FormatterType::Integer; - m_formatter["uptot"] = FormatterType::MemMBFormat; - m_formatter["uptotkb"] = FormatterType::Integer; - m_formatter["upunits"] = FormatterType::NetSmartUnits; - // swap - m_formatter["swap"] = FormatterType::Float; - m_formatter["swaptotmb"] = FormatterType::MemMBFormat; - m_formatter["swaptotgb"] = FormatterType::MemGBFormat; } @@ -81,7 +63,7 @@ QString AWKeysAggregator::formatter(const QVariant &_data, QString output; QLocale loc = m_translate ? QLocale::system() : QLocale::c(); // case block - switch (m_formatter[_key]) { + switch (m_mapper->formatter(_key)) { case FormatterType::Float: output = QString("%1").arg(_data.toFloat(), 5, 'f', 1); break; @@ -173,8 +155,9 @@ QString AWKeysAggregator::formatter(const QVariant &_data, QString("%1").arg(minutes, 2, 10, QChar('0'))); source.replace("$m", QString("%1").arg(minutes)); return source; - }(m_formatter[_key] == FormatterType::Uptime ? "$ddd$hhh$mmm" - : m_customUptime, + }(m_mapper->formatter(_key) == FormatterType::Uptime + ? "$ddd$hhh$mmm" + : m_customUptime, static_cast(_data.toFloat())); break; case FormatterType::NoFormat: @@ -198,7 +181,7 @@ QStringList AWKeysAggregator::keysFromSource(const QString &_source) const { qCDebug(LOG_AW) << "Search for source" << _source; - return m_map.values(_source); + return m_mapper->keysFromSource(_source); } @@ -238,7 +221,7 @@ void AWKeysAggregator::setDevices(const QHash &_devices) { qCDebug(LOG_AW) << "Devices" << _devices; - m_devices = _devices; + m_mapper->setDevices(_devices); } @@ -258,364 +241,13 @@ void AWKeysAggregator::setTranslate(const bool _translate) } -// HACK units required to define should the value be calculated as temperature -// or fan data QStringList AWKeysAggregator::registerSource(const QString &_source, const QString &_units, const QStringList &_keys) { qCDebug(LOG_AW) << "Source" << _source << "with units" << _units; - // regular expressions - QRegExp cpuRegExp = QRegExp("cpu/cpu.*/TotalLoad"); - QRegExp cpuclRegExp = QRegExp("cpu/cpu.*/clock"); - QRegExp hddrRegExp = QRegExp("disk/.*/Rate/rblk"); - QRegExp hddwRegExp = QRegExp("disk/.*/Rate/wblk"); - QRegExp mountFillRegExp = QRegExp("partitions/.*/filllevel"); - QRegExp mountFreeRegExp = QRegExp("partitions/.*/freespace"); - QRegExp mountUsedRegExp = QRegExp("partitions/.*/usedspace"); - QRegExp netRegExp - = QRegExp("network/interfaces/.*/(receiver|transmitter)/data$"); - QRegExp netTotalRegExp - = QRegExp("network/interfaces/.*/(receiver|transmitter)/dataTotal$"); - - if (_source == "battery/ac") { - // AC - m_map[_source] = "ac"; - m_formatter["ac"] = FormatterType::ACFormat; - } else if (_source.startsWith("battery/")) { - // battery stats - QString key = _source; - key.remove("battery/"); - m_map[_source] = key; - m_formatter[key] = FormatterType::IntegerThree; - } else if (_source == "cpu/system/TotalLoad") { - // cpu - m_map[_source] = "cpu"; - m_formatter["cpu"] = FormatterType::Float; - } else if (_source.contains(cpuRegExp)) { - // cpus - QString key = _source; - key.remove("cpu/").remove("/TotalLoad"); - m_map[_source] = key; - m_formatter[key] = FormatterType::Float; - } else if (_source == "cpu/system/AverageClock") { - // cpucl - m_map[_source] = "cpucl"; - m_formatter["cpucl"] = FormatterType::Integer; - } else if (_source.contains(cpuclRegExp)) { - // cpucls - QString key = _source; - key.remove("cpu/cpu").remove("/clock"); - key = QString("cpucl%1").arg(key); - m_map[_source] = key; - m_formatter[key] = FormatterType::Integer; - } else if (_source.startsWith("custom")) { - // custom - QString key = _source; - key.remove("custom/"); - m_map[_source] = key; - m_formatter[key] = FormatterType::NoFormat; - } else if (_source == "desktop/current/name") { - // current desktop name - m_map[_source] = "desktop"; - m_formatter["desktop"] = FormatterType::NoFormat; - } else if (_source == "desktop/current/number") { - // current desktop number - m_map[_source] = "ndesktop"; - m_formatter["ndesktop"] = FormatterType::NoFormat; - } else if (_source == "desktop/total/number") { - // desktop count - m_map[_source] = "tdesktops"; - m_formatter["tdesktops"] = FormatterType::NoFormat; - } else if (_source.contains(hddrRegExp)) { - // read speed - QString device = _source; - device.remove("/Rate/rblk"); - int index = m_devices["disk"].indexOf(device); - if (index > -1) { - QString key = QString("hddr%1").arg(index); - m_map[_source] = key; - m_formatter[key] = FormatterType::Integer; - } - } else if (_source.contains(hddwRegExp)) { - // write speed - QString device = _source; - device.remove("/Rate/wblk"); - int index = m_devices["disk"].indexOf(device); - if (index > -1) { - QString key = QString("hddw%1").arg(index); - m_map[_source] = key; - m_formatter[key] = FormatterType::Integer; - } - } else if (_source == "gpu/load") { - // gpu load - m_map[_source] = "gpu"; - m_formatter["gpu"] = FormatterType::Float; - } else if (_source == "gpu/temperature") { - // gpu temperature - m_map[_source] = "gputemp"; - m_formatter["gputemp"] = FormatterType::Temperature; - } else if (_source.contains(mountFillRegExp)) { - // fill level - QString device = _source; - device.remove("partitions").remove("/filllevel"); - int index = m_devices["mount"].indexOf(device); - if (index > -1) { - QString key = QString("hdd%1").arg(index); - m_map[_source] = key; - m_formatter[key] = FormatterType::Float; - // additional keys - m_formatter[QString("hddtotmb%1").arg(index)] - = FormatterType::MemMBFormat; - m_formatter[QString("hddtotgb%1").arg(index)] - = FormatterType::MemGBFormat; - } - } else if (_source.contains(mountFreeRegExp)) { - // free space - QString device = _source; - device.remove("partitions").remove("/freespace"); - int index = m_devices["mount"].indexOf(device); - if (index > -1) { - // mb - QString key = QString("hddfreemb%1").arg(index); - m_map[_source] = key; - m_formatter[key] = FormatterType::MemMBFormat; - // gb - key = QString("hddfreegb%1").arg(index); - m_map.insertMulti(_source, key); - m_formatter[key] = FormatterType::MemGBFormat; - } - } else if (_source.contains(mountUsedRegExp)) { - // used - QString device = _source; - device.remove("partitions").remove("/usedspace"); - int index = m_devices["mount"].indexOf(device); - if (index > -1) { - // mb - QString key = QString("hddmb%1").arg(index); - m_map[_source] = key; - m_formatter[key] = FormatterType::MemMBFormat; - // gb - key = QString("hddgb%1").arg(index); - m_map.insertMulti(_source, key); - m_formatter[key] = FormatterType::MemGBFormat; - } - } else if (_source.startsWith("hdd/temperature")) { - // hdd temperature - QString device = _source; - device.remove("hdd/temperature"); - int index = m_devices["hdd"].indexOf(device); - if (index > -1) { - QString key = QString("hddtemp%1").arg(index); - m_map[_source] = key; - m_formatter[key] = FormatterType::Temperature; - } - } else if (_source.startsWith("cpu/system/loadavg")) { - // load average - QString time = _source; - time.remove("cpu/system/loadavg"); - QString key = QString("la%1").arg(time); - m_map[_source] = key; - m_formatter[key] = FormatterType::FloatTwoSymbols; - } else if (_source == "mem/physical/application") { - // app memory - // mb - m_map[_source] = "memmb"; - m_formatter["memmb"] = FormatterType::MemMBFormat; - // gb - m_map.insertMulti(_source, "memgb"); - m_formatter["memgb"] = FormatterType::MemGBFormat; - } else if (_source == "mem/physical/free") { - // free memory - // mb - m_map[_source] = "memfreemb"; - m_formatter["memfreemb"] = FormatterType::MemMBFormat; - // gb - m_map.insertMulti(_source, "memfreegb"); - m_formatter["memfreegb"] = FormatterType::MemGBFormat; - } else if (_source == "mem/physical/used") { - // used memory - // mb - m_map[_source] = "memusedmb"; - m_formatter["memusedmb"] = FormatterType::MemMBFormat; - // gb - m_map.insertMulti(_source, "memusedgb"); - m_formatter["memusedgb"] = FormatterType::MemGBFormat; - } else if (_source == "network/current/name") { - // network device - m_map[_source] = "netdev"; - m_formatter["netdev"] = FormatterType::NoFormat; - } else if (_source.startsWith("network/response")) { - // network response - QString key = _source; - key.remove("network/"); - m_map[_source] = key; - m_formatter[key] = FormatterType::NoFormat; - } else if (_source.contains(netRegExp)) { - // network speed - QString type = _source.contains("receiver") ? "down" : "up"; - int index = m_devices["net"].indexOf(_source.split('/')[2]); - if (index > -1) { - // kb - QString key = QString("%1kb%2").arg(type).arg(index); - m_map[_source] = key; - m_formatter[key] = FormatterType::Integer; - // smart - key = QString("%1%2").arg(type).arg(index); - m_map.insertMulti(_source, key); - m_formatter[key] = FormatterType::NetSmartFormat; - // units - key = QString("%1units%2").arg(type).arg(index); - m_map.insertMulti(_source, key); - m_formatter[key] = FormatterType::NetSmartUnits; - } - } else if (_source.contains(netTotalRegExp)) { - // network data total - QString type = _source.contains("receiver") ? "down" : "up"; - int index = m_devices["net"].indexOf(_source.split('/')[2]); - if (index > -1) { - // kb - QString key = QString("%1totkb%2").arg(type).arg(index); - m_map[_source] = key; - m_formatter[key] = FormatterType::Integer; - // mb - key = QString("%1tot%2").arg(type).arg(index); - m_map.insertMulti(_source, key); - m_formatter[key] = FormatterType::MemMBFormat; - } - } else if (_source.startsWith("upgrade")) { - // package manager - QString key = _source; - key.remove("upgrade/"); - m_map[_source] = key; - m_formatter[key] = FormatterType::IntegerThree; - } else if (_source.startsWith("player")) { - // player - QString key = _source; - key.remove("player/"); - m_map[_source] = key; - m_formatter[key] = FormatterType::NoFormat; - } else if (_source == "ps/running/count") { - // running processes count - m_map[_source] = "pscount"; - m_formatter["pscount"] = FormatterType::NoFormat; - } else if (_source == "ps/running/list") { - // list of running processes - m_map[_source] = "ps"; - m_formatter["ps"] = FormatterType::List; - } else if (_source == "ps/total/count") { - // total processes count - m_map[_source] = "pstot"; - m_formatter["pstot"] = FormatterType::NoFormat; - } else if (_source.startsWith("quotes")) { - // quotes - QString key = _source; - key.remove("quotes/"); - m_map[_source] = key; - m_formatter[key] = FormatterType::Quotes; - } else if (_source == "mem/swap/free") { - // free swap - // mb - m_map[_source] = "swapfreemb"; - m_formatter["swapfreemb"] = FormatterType::MemMBFormat; - // gb - m_map.insertMulti(_source, "swapfreegb"); - m_formatter["swapfreegb"] = FormatterType::MemGBFormat; - } else if (_source == "mem/swap/used") { - // used swap - // mb - m_map[_source] = "swapmb"; - m_formatter["swapmb"] = FormatterType::MemMBFormat; - // gb - m_map.insertMulti(_source, "swapgb"); - m_formatter["swapgb"] = FormatterType::MemGBFormat; - } else if (_source.startsWith("lmsensors/")) { - // temperature - int index = m_devices["temp"].indexOf(_source); - // HACK on DE initialization there are no units key - if (_units.isEmpty()) - return QStringList({QString("temp%1").arg(index)}); - if (index > -1) { - QString key = QString("temp%1").arg(index); - m_map[_source] = key; - m_formatter[key] = _units == "°C" ? FormatterType::Temperature - : FormatterType::Integer; - } - } else if (_source == "Local") { - // time - m_map[_source] = "time"; - m_formatter["time"] = FormatterType::Time; - // custom time - m_map.insertMulti(_source, "ctime"); - m_formatter["ctime"] = FormatterType::TimeCustom; - // ISO time - m_map.insertMulti(_source, "isotime"); - m_formatter["isotime"] = FormatterType::TimeISO; - // long time - m_map.insertMulti(_source, "longtime"); - m_formatter["longtime"] = FormatterType::TimeLong; - // short time - m_map.insertMulti(_source, "shorttime"); - m_formatter["shorttime"] = FormatterType::TimeShort; - // timestamp - m_map.insertMulti(_source, "tstime"); - m_formatter["tstime"] = FormatterType::Timestamp; - } else if (_source == "system/uptime") { - // uptime - m_map[_source] = "uptime"; - m_formatter["uptime"] = FormatterType::Uptime; - // custom uptime - m_map.insertMulti(_source, "cuptime"); - m_formatter["cuptime"] = FormatterType::UptimeCustom; - } else if (_source.startsWith("weather/temperature")) { - // temperature - QString key = _source; - key.remove("weather/"); - m_map[_source] = key; - m_formatter[key] = FormatterType::Temperature; - } else if (_source.startsWith("weather/")) { - // other weather - QString key = _source; - key.remove("weather/"); - m_map[_source] = key; - m_formatter[key] = FormatterType::NoFormat; - } else if (_source.startsWith("load/load")) { - // load source - QString key = _source; - key.remove("load/"); - m_map[_source] = key; - m_formatter[key] = FormatterType::Temperature; - } - - QStringList foundKeys = keysFromSource(_source); - - // rewrite formatters for custom ones - QStringList customFormattersKeys; - if (m_customFormatters) - customFormattersKeys = m_customFormatters->definedFormatters(); - qCInfo(LOG_AW) << "Looking for fprmatters" << foundKeys << "in" - << customFormattersKeys; - for (auto &key : foundKeys) { - if (!customFormattersKeys.contains(key)) - continue; - m_formatter[key] = FormatterType::Custom; - } - - // drop key from dictionary if no one user requested key required it - qCInfo(LOG_AW) << "Looking for keys" << foundKeys << "in" << _keys; - bool required - = _keys.isEmpty() || std::any_of(foundKeys.cbegin(), foundKeys.cend(), - [&_keys](const QString &key) { - return _keys.contains(key); - }); - if (!required) { - m_map.remove(_source); - for (auto &key : foundKeys) - m_formatter.remove(key); - } - - return keysFromSource(_source); + return m_mapper->registerSource(_source, _units, _keys); } diff --git a/sources/awesome-widget/plugin/awkeysaggregator.h b/sources/awesome-widget/plugin/awkeysaggregator.h index 6157dc0..d6d5d1a 100644 --- a/sources/awesome-widget/plugin/awkeysaggregator.h +++ b/sources/awesome-widget/plugin/awkeysaggregator.h @@ -22,9 +22,9 @@ #include #include -#include "version.h" class AWFormatterHelper; +class AWDataEngineMapper; class AWKeysAggregator : public QObject { @@ -37,6 +37,7 @@ class AWKeysAggregator : public QObject Q_PROPERTY(QString tempUnits MEMBER m_tempUnits WRITE setTempUnits); Q_PROPERTY(bool translate MEMBER m_translate WRITE setTranslate); +public: enum class FormatterType { // general formatters Custom, @@ -65,7 +66,6 @@ class AWKeysAggregator : public QObject UptimeCustom }; -public: explicit AWKeysAggregator(QObject *_parent = nullptr); virtual ~AWKeysAggregator(); void initFormatters(); @@ -88,15 +88,13 @@ public slots: private: float temperature(const float temp) const; AWFormatterHelper *m_customFormatters = nullptr; - QStringList m_timeKeys = QString(TIME_KEYS).split(','); + AWDataEngineMapper *m_mapper = nullptr; + QStringList m_timeKeys; // variables QString m_acOffline; QString m_acOnline; QString m_customTime; QString m_customUptime; - QHash m_devices; - QHash m_formatter; - QHash m_map; QString m_tempUnits; bool m_translate = false; }; diff --git a/sources/test/CMakeLists.txt b/sources/test/CMakeLists.txt index 045d319..b06bd64 100644 --- a/sources/test/CMakeLists.txt +++ b/sources/test/CMakeLists.txt @@ -47,6 +47,7 @@ foreach (TEST_MODULE ${TEST_MODULES}) ${CMAKE_CURRENT_SOURCE_DIR}/../awesome-widget/plugin/awcustomkeyshelper.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../awesome-widget/plugin/awdataaggregator.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../awesome-widget/plugin/awdataengineaggregator.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../awesome-widget/plugin/awdataenginemapper.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../awesome-widget/plugin/awdbusadaptor.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../awesome-widget/plugin/awformatterhelper.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../awesome-widget/plugin/awkeycache.cpp @@ -58,6 +59,7 @@ foreach (TEST_MODULE ${TEST_MODULES}) ${PROJECT_TRDPARTY_DIR}/fontdialog/fontdialog.cpp) elseif (TEST_MODULE MATCHES "awpatternfunctions") set(${TEST_MODULE}_SOURCES ${${TEST_MODULE}_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/../awesome-widget/plugin/awabstractpairhelper.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../awesome-widget/plugin/awdataenginemapper.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../awesome-widget/plugin/awformatterhelper.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../awesome-widget/plugin/awkeysaggregator.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../awesome-widget/plugin/awpatternfunctions.cpp)