Compare commits

..

6 Commits

Author SHA1 Message Date
161ff64293 Release 4.0.0 2024-03-25 14:04:30 +02:00
115bef3dbe correct subscription processing 2024-03-24 00:42:03 +02:00
b6ade7310a extend temperature sensors 2024-03-23 15:30:35 +02:00
0555185044 add time source 2024-03-23 15:11:49 +02:00
23e197789f make it build together 2024-03-23 13:57:28 +02:00
67640cccdc do not derive from qwidget in aggregates 2024-03-22 16:57:47 +02:00
67 changed files with 813 additions and 752 deletions

View File

@ -25,17 +25,17 @@ jobs:
env: env:
VERSION: ${{ steps.version.outputs.VERSION }} VERSION: ${{ steps.version.outputs.VERSION }}
- name: build debian package # - name: build debian package
run: | # run: |
sudo apt update && \ # sudo apt update && \
sudo apt install -yq cmake extra-cmake-modules g++ git gettext make && \ # sudo apt install -yq cmake extra-cmake-modules g++ git gettext make && \
sudo apt install -yq libkf5i18n-dev libkf5notifications-dev libkf5service-dev \ # sudo apt install -yq libkf5i18n-dev libkf5notifications-dev libkf5service-dev \
libkf5windowsystem-dev libkf5plasma-dev qtbase5-dev qtdeclarative5-dev \ # libkf5windowsystem-dev libkf5plasma-dev qtbase5-dev qtdeclarative5-dev \
plasma-workspace-dev && \ # plasma-workspace-dev && \
cmake -B build-deb -DKDE_INSTALL_USE_QT_SYS_PATHS=ON -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Optimization -DBUILD_FUTURE=ON -DBUILD_DEB_PACKAGE=ON sources && \ # cmake -B build-deb -DKDE_INSTALL_USE_QT_SYS_PATHS=ON -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Optimization -DBUILD_FUTURE=ON -DBUILD_DEB_PACKAGE=ON sources && \
cd build-deb && \ # cd build-deb && \
make package && \ # make package && \
cd .. # cd ..
- name: release - name: release
uses: softprops/action-gh-release@v1 uses: softprops/action-gh-release@v1
@ -45,7 +45,7 @@ jobs:
${{ steps.changelog.outputs.changelog }} ${{ steps.changelog.outputs.changelog }}
files: | files: |
awesome-widgets-*-src.tar.xz awesome-widgets-*-src.tar.xz
build-deb/plasma-widget-awesome-widgets-*.deb # build-deb/plasma-widget-awesome-widgets-*.deb
fail_on_unmatched_files: true fail_on_unmatched_files: true
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@ -1,3 +1,6 @@
Ver.4.0.0:
* migration to plasma 6
Ver.3.5.0: Ver.3.5.0:
+ wayland support + wayland support
* update code to latest standards * update code to latest standards
@ -12,7 +15,6 @@ Ver.3.4.2:
* update to new qt api * update to new qt api
- fix non printable spaces (#142, #143) - fix non printable spaces (#142, #143)
Ver.3.3.3: Ver.3.3.3:
+ add custom keys support (#101) + add custom keys support (#101)
* DBus interface improvements * DBus interface improvements

View File

@ -1,41 +1,33 @@
# Maintainer: Evgeniy Alekseev <arcanis at archlinux dot org> # Maintainer: Evgeniy Alekseev <arcanis at archlinux dot org>
pkgname=plasma5-applet-awesome-widgets pkgname=plasma6-applet-awesome-widgets
_pkgname=awesome-widgets _pkgname=awesome-widgets
pkgver=3.4.3 pkgver=4.0.0alpha1
pkgrel=1 pkgrel=1
pkgdesc="Collection of minimalistic Plasmoids which look like Awesome WM widgets (ex-PyTextMonitor)" pkgdesc="Collection of minimalistic Plasmoids which look like Awesome WM widgets (ex-PyTextMonitor)"
arch=('i686' 'x86_64') arch=('x86_64')
url="https://arcanis.me/projects/awesome-widgets" url="https://arcanis.me/projects/awesome-widgets"
license=('GPL3') license=('GPL3')
depends=('ksysguard' 'plasma-framework') depends=('plasma-workspace')
optdepends=("catalyst: for GPU monitor" optdepends=("hddtemp: for HDD temperature monitor"
"hddtemp: for HDD temperature monitor"
"smartmontools: for HDD temperature monitor" "smartmontools: for HDD temperature monitor"
"mpd: for music player monitor" "mpd: for music player monitor"
"nvidia-utils: for GPU monitor") "nvidia-utils: for GPU monitor")
makedepends=('cmake' 'extra-cmake-modules' 'python') makedepends=('cmake' 'extra-cmake-modules' 'python')
source=(https://github.com/arcan1s/awesome-widgets/releases/download/V.${pkgver}/${_pkgname}-${pkgver}-src.tar.xz) source=(https://github.com/arcan1s/awesome-widgets/releases/download/${pkgver}/${_pkgname}-${pkgver}-src.tar.xz)
install=${pkgname}.install install="$pkgname.install"
md5sums=('5953ba518191bb6fff83cdb8633c735c')
backup=('etc/xdg/plasma-dataengine-extsysmon.conf') backup=('etc/xdg/plasma-dataengine-extsysmon.conf')
prepare() {
rm -rf "${srcdir}/build"
mkdir "${srcdir}/build"
}
build () { build () {
cd "${srcdir}/build" cmake -B build -S "${_pkgname}" \
cmake -DKDE_INSTALL_USE_QT_SYS_PATHS=ON \ -DCMAKE_BUILD_TYPE=Optimization \
-DCMAKE_BUILD_TYPE=Optimization \ -DBUILD_FUTURE=ON \
-DCMAKE_INSTALL_PREFIX=/usr \ -DBUILD_TESTING=OFF
-DBUILD_FUTURE=ON \ cmake --build build
"../${_pkgname}"
make
} }
package() { package() {
cd "${srcdir}/build" DESTDIR="$pkgdir" cmake --install build
make DESTDIR="${pkgdir}" install
} }
sha256sums=('b2a7b07a1df6f710f4e0d6e5898933f4ddb131818b922dc4b8e48afe3e98a664')

View File

@ -14,9 +14,9 @@ project(awesomewidgets)
set(PROJECT_AUTHOR "Evgeniy Alekseev") set(PROJECT_AUTHOR "Evgeniy Alekseev")
set(PROJECT_CONTACT "esalexeev@gmail.com") set(PROJECT_CONTACT "esalexeev@gmail.com")
set(PROJECT_LICENSE "GPL3") set(PROJECT_LICENSE "GPL3")
set(PROJECT_VERSION_MAJOR "3") set(PROJECT_VERSION_MAJOR "4")
set(PROJECT_VERSION_MINOR "5") set(PROJECT_VERSION_MINOR "0")
set(PROJECT_VERSION_PATCH "1") set(PROJECT_VERSION_PATCH "0")
set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}") set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}")
# append git version if any # append git version if any
set(PROJECT_COMMIT_SHA "Commit hash" CACHE INTERNAL "") set(PROJECT_COMMIT_SHA "Commit hash" CACHE INTERNAL "")

View File

@ -17,14 +17,17 @@
#include "awdataengineaggregator.h" #include "awdataengineaggregator.h"
#include <QDBusConnection> #include <ksysguard/formatter/Unit.h>
#include <ksysguard/systemstats/DBusInterface.h> #include <ksysguard/systemstats/DBusInterface.h>
#include <QDBusConnection>
#include "awdebug.h" #include "awdebug.h"
AWDataEngineAggregator::AWDataEngineAggregator(QObject *_parent) AWDataEngineAggregator::AWDataEngineAggregator(QObject *_parent)
: QObject(_parent) : QObject(_parent)
, m_interface(new KSysGuard::SystemStats::DBusInterface())
{ {
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
@ -33,15 +36,14 @@ AWDataEngineAggregator::AWDataEngineAggregator(QObject *_parent)
qDBusRegisterMetaType<KSysGuard::SensorDataList>(); qDBusRegisterMetaType<KSysGuard::SensorDataList>();
qDBusRegisterMetaType<QHash<QString, KSysGuard::SensorInfo>>(); qDBusRegisterMetaType<QHash<QString, KSysGuard::SensorInfo>>();
m_interface = new KSysGuard::SystemStats::DBusInterface( connect(m_interface, &KSysGuard::SystemStats::DBusInterface::newSensorData, this,
KSysGuard::SystemStats::ServiceName, KSysGuard::SystemStats::ObjectPath, QDBusConnection::sessionBus(), this); &AWDataEngineAggregator::updateData);
connect(m_interface, &KSysGuard::SystemStats::DBusInterface::sensorMetaDataChanged, this,
connect(m_interface, SIGNAL(newSensorData(KSysGuard::SensorDataList)), this, &AWDataEngineAggregator::updateSensors);
SLOT(updateData(KSysGuard::SensorDataList))); connect(m_interface, &KSysGuard::SystemStats::DBusInterface::sensorAdded, this,
connect(m_interface, SIGNAL(sensorMetaDataChanged(const QHash<QString, KSysGuard::SensorInfo> &)), this, &AWDataEngineAggregator::sensorAdded);
SLOT(updateSensors(const QHash<QString, KSysGuard::SensorInfo> &))); connect(m_interface, &KSysGuard::SystemStats::DBusInterface::sensorRemoved, this,
connect(m_interface, SIGNAL(sensorAdded(const QString &)), this, SLOT(sensorAdded(const QString &))); &AWDataEngineAggregator::sensorRemoved);
connect(m_interface, SIGNAL(sensorRemoved(const QString &)), this, SLOT(sensorRemoved(const QString &)));
loadSources(); loadSources();
} }
@ -52,12 +54,30 @@ AWDataEngineAggregator::~AWDataEngineAggregator()
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
disconnectSources(); disconnectSources();
m_interface->deleteLater();
}
void AWDataEngineAggregator::connectSources()
{
auto keys = m_sensors.keys();
auto newKeys = QSet(keys.cbegin(), keys.cend()) - m_subscribed;
m_interface->subscribe(newKeys.values()).waitForFinished();
m_subscribed.unite(newKeys);
} }
void AWDataEngineAggregator::disconnectSources() void AWDataEngineAggregator::disconnectSources()
{ {
m_interface->unsubscribe(m_sensors.keys()); m_interface->unsubscribe(m_subscribed.values()).waitForFinished();
m_subscribed.clear();
}
bool AWDataEngineAggregator::isValidSensor(const KSysGuard::SensorInfo &_sensor)
{
return _sensor.unit != KSysGuard::UnitInvalid;
} }
@ -68,25 +88,18 @@ void AWDataEngineAggregator::loadSources()
auto sensors = response.value(); auto sensors = response.value();
updateSensors(sensors); updateSensors(sensors);
for (auto &sensor : sensors.keys()) connectSources();
sensorAdded(sensor);
}
void AWDataEngineAggregator::reconnectSources(const int interval)
{
qCDebug(LOG_AW) << "Reconnect all sources with update interval" << interval;
disconnectSources();
m_interface->subscribe(m_sensors.keys());
} }
void AWDataEngineAggregator::dropSource(const QString &_source) void AWDataEngineAggregator::dropSource(const QString &_source)
{ {
qCDebug(LOG_AW) << "Disconnect source" << _source; qCDebug(LOG_AW) << "Disconnect sensor" << _source;
m_interface->unsubscribe({_source}); if (m_subscribed.contains(_source)) {
m_interface->unsubscribe({_source}).waitForFinished();
m_subscribed.remove(_source);
}
} }
@ -94,7 +107,20 @@ void AWDataEngineAggregator::sensorAdded(const QString &_sensor)
{ {
qCDebug(LOG_AW) << "New sensor added" << _sensor; qCDebug(LOG_AW) << "New sensor added" << _sensor;
m_interface->subscribe({_sensor}); // check if sensor is actually valid
auto response = m_interface->sensors({_sensor});
response.waitForFinished();
auto info = response.value().value(_sensor);
if (!isValidSensor(info))
return;
m_sensors[_sensor] = info;
dropSource(_sensor); // force reconnect
if (!m_subscribed.contains(_sensor)) {
m_interface->subscribe({_sensor}).waitForFinished();
m_subscribed.insert(_sensor);
}
} }
@ -103,9 +129,10 @@ void AWDataEngineAggregator::sensorRemoved(const QString &_sensor)
qCDebug(LOG_AW) << "Sensor" << _sensor << "has been removed"; qCDebug(LOG_AW) << "Sensor" << _sensor << "has been removed";
m_sensors.remove(_sensor); m_sensors.remove(_sensor);
m_interface->unsubscribe({_sensor}); dropSource(_sensor);
} }
void AWDataEngineAggregator::updateData(KSysGuard::SensorDataList _data) void AWDataEngineAggregator::updateData(KSysGuard::SensorDataList _data)
{ {
emit(dataUpdated(m_sensors, _data)); emit(dataUpdated(m_sensors, _data));
@ -114,6 +141,9 @@ void AWDataEngineAggregator::updateData(KSysGuard::SensorDataList _data)
void AWDataEngineAggregator::updateSensors(const QHash<QString, KSysGuard::SensorInfo> &_sensors) void AWDataEngineAggregator::updateSensors(const QHash<QString, KSysGuard::SensorInfo> &_sensors)
{ {
for (auto sensor = _sensors.cbegin(); sensor != _sensors.cend(); ++sensor) for (auto sensor = _sensors.cbegin(); sensor != _sensors.cend(); ++sensor) {
if (!isValidSensor(sensor.value()))
continue;
m_sensors.insert(sensor.key(), sensor.value()); m_sensors.insert(sensor.key(), sensor.value());
}
} }

View File

@ -15,9 +15,7 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/ ***************************************************************************/
#pragma once
#ifndef AWDATAENGINEAGGREGATOR_H
#define AWDATAENGINEAGGREGATOR_H
#include <ksysguard/systemstats/SensorInfo.h> #include <ksysguard/systemstats/SensorInfo.h>
@ -31,7 +29,6 @@ namespace KSysGuard::SystemStats
class DBusInterface; class DBusInterface;
} }
class AWDataEngineAggregator : public QObject class AWDataEngineAggregator : public QObject
{ {
Q_OBJECT Q_OBJECT
@ -39,9 +36,10 @@ class AWDataEngineAggregator : public QObject
public: public:
explicit AWDataEngineAggregator(QObject *_parent = nullptr); explicit AWDataEngineAggregator(QObject *_parent = nullptr);
~AWDataEngineAggregator() override; ~AWDataEngineAggregator() override;
void connectSources();
void disconnectSources(); void disconnectSources();
[[nodiscard]] static bool isValidSensor(const KSysGuard::SensorInfo &_sensor);
void loadSources(); void loadSources();
void reconnectSources(const int interval);
signals: signals:
void dataUpdated(const QHash<QString, KSysGuard::SensorInfo> &_sensors, const KSysGuard::SensorDataList &_data); void dataUpdated(const QHash<QString, KSysGuard::SensorInfo> &_sensors, const KSysGuard::SensorDataList &_data);
@ -57,7 +55,5 @@ public slots:
private: private:
KSysGuard::SystemStats::DBusInterface *m_interface = nullptr; KSysGuard::SystemStats::DBusInterface *m_interface = nullptr;
QHash<QString, KSysGuard::SensorInfo> m_sensors; QHash<QString, KSysGuard::SensorInfo> m_sensors;
QSet<QString> m_subscribed;
}; };
#endif /* AWDATAENGINEAGGREGATOR_H */

View File

@ -84,6 +84,7 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
// regular expressions // regular expressions
auto cpuRegExp = QRegularExpression("^cpu/cpu.*/usage$"); auto cpuRegExp = QRegularExpression("^cpu/cpu.*/usage$");
auto cpuclRegExp = QRegularExpression("^cpu/cpu.*/frequency$"); auto cpuclRegExp = QRegularExpression("^cpu/cpu.*/frequency$");
auto cpuTempRegExp = QRegularExpression("^cpu/cpu.*/temperature$");
auto hddrRegExp = QRegularExpression("^disk/.*/read$"); auto hddrRegExp = QRegularExpression("^disk/.*/read$");
auto hddwRegExp = QRegularExpression("^disk/.*/write$"); auto hddwRegExp = QRegularExpression("^disk/.*/write$");
auto mountFillRegExp = QRegularExpression("^disk/.*/usedPercent$"); auto mountFillRegExp = QRegularExpression("^disk/.*/usedPercent$");
@ -92,14 +93,14 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
auto netRegExp = QRegularExpression("^network/.*/(download|upload)$"); auto netRegExp = QRegularExpression("^network/.*/(download|upload)$");
auto netTotalRegExp = QRegularExpression("^network/.*/(totalDownload|totalUpload)$"); auto netTotalRegExp = QRegularExpression("^network/.*/(totalDownload|totalUpload)$");
if (_source == "battery/ac") { if (_source == "extsysmon/battery/ac") {
// AC // AC
m_map.insert(_source, "ac"); m_map.insert(_source, "ac");
m_formatter["ac"] = AWKeysAggregator::FormatterType::ACFormat; m_formatter["ac"] = AWKeysAggregator::FormatterType::ACFormat;
} else if (_source.startsWith("battery/")) { } else if (_source.startsWith("extsysmon/battery/")) {
// battery stats // battery stats
QString key = _source; QString key = _source;
key.remove("battery/"); key.remove("extsysmon/battery/");
m_map.insert(_source, key); m_map.insert(_source, key);
m_formatter[key] = _source.contains("rate") ? AWKeysAggregator::FormatterType::Float m_formatter[key] = _source.contains("rate") ? AWKeysAggregator::FormatterType::Float
: AWKeysAggregator::FormatterType::IntegerThree; : AWKeysAggregator::FormatterType::IntegerThree;
@ -124,21 +125,21 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
key = QString("cpucl%1").arg(key); key = QString("cpucl%1").arg(key);
m_map.insert(_source, key); m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Integer; m_formatter[key] = AWKeysAggregator::FormatterType::Integer;
} else if (_source.startsWith("custom")) { } else if (_source.startsWith("extsysmon/custom")) {
// custom // custom
QString key = _source; QString key = _source;
key.remove("custom/"); key.remove("extsysmon/custom/");
m_map.insert(_source, key); m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat; m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source == "desktop/current/name") { } else if (_source == "extsysmon/desktop/name") {
// current desktop name // current desktop name
m_map.insert(_source, "desktop"); m_map.insert(_source, "desktop");
m_formatter["desktop"] = AWKeysAggregator::FormatterType::NoFormat; m_formatter["desktop"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source == "desktop/current/number") { } else if (_source == "extsysmon/desktop/number") {
// current desktop number // current desktop number
m_map.insert(_source, "ndesktop"); m_map.insert(_source, "ndesktop");
m_formatter["ndesktop"] = AWKeysAggregator::FormatterType::NoFormat; m_formatter["ndesktop"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source == "desktop/total/number") { } else if (_source == "extsysmon/desktop/count") {
// desktop count // desktop count
m_map.insert(_source, "tdesktops"); m_map.insert(_source, "tdesktops");
m_formatter["tdesktops"] = AWKeysAggregator::FormatterType::NoFormat; m_formatter["tdesktops"] = AWKeysAggregator::FormatterType::NoFormat;
@ -162,11 +163,11 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
m_map.insert(_source, key); m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Integer; m_formatter[key] = AWKeysAggregator::FormatterType::Integer;
} }
} else if (_source == "gpu/load") { } else if (_source == "extsysmon/gpuload/load") {
// gpu load // gpu load
m_map.insert(_source, "gpu"); m_map.insert(_source, "gpu");
m_formatter["gpu"] = AWKeysAggregator::FormatterType::Float; m_formatter["gpu"] = AWKeysAggregator::FormatterType::Float;
} else if (_source == "gpu/temperature") { } else if (_source == "extsysmon/gputemp/temperature") {
// gpu temperature // gpu temperature
m_map.insert(_source, "gputemp"); m_map.insert(_source, "gputemp");
m_formatter["gputemp"] = AWKeysAggregator::FormatterType::Temperature; m_formatter["gputemp"] = AWKeysAggregator::FormatterType::Temperature;
@ -213,10 +214,10 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
m_map.insert(_source, key); m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::MemGBFormat; m_formatter[key] = AWKeysAggregator::FormatterType::MemGBFormat;
} }
} else if (_source.startsWith("hdd/temperature")) { } else if (_source.startsWith("extsysmon/hdd/temperature")) {
// hdd temperature // hdd temperature
QString device = _source; QString device = _source;
device.remove("hdd/temperature"); device.remove("extsysmon/hdd/temperature");
int index = m_devices["hdd"].indexOf(device); int index = m_devices["hdd"].indexOf(device);
if (index > -1) { if (index > -1) {
QString key = QString("hddtemp%1").arg(index); QString key = QString("hddtemp%1").arg(index);
@ -254,18 +255,18 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
// gb // gb
m_map.insert(_source, "memusedgb"); m_map.insert(_source, "memusedgb");
m_formatter["memusedgb"] = AWKeysAggregator::FormatterType::MemGBFormat; m_formatter["memusedgb"] = AWKeysAggregator::FormatterType::MemGBFormat;
} else if (_source == "network/current/name") { } else if (_source == "extsysmon/network/device") {
// network device // network device
m_map.insert(_source, "netdev"); m_map.insert(_source, "netdev");
m_formatter["netdev"] = AWKeysAggregator::FormatterType::NoFormat; m_formatter["netdev"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source == "network/current/ssid") { } else if (_source == "extsysmon/network/ssid") {
// current ssid // current ssid
m_map.insert(_source, "ssid"); m_map.insert(_source, "ssid");
m_formatter["ssid"] = AWKeysAggregator::FormatterType::NoFormat; m_formatter["ssid"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source.startsWith("network/response")) { } else if (_source.startsWith("extsysmon/requests/response")) {
// network response // network response
QString key = _source; QString key = _source;
key.remove("network/"); key.remove("extsysmon/requests/");
m_map.insert(_source, key); m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat; m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source.contains(netRegExp)) { } else if (_source.contains(netRegExp)) {
@ -300,34 +301,34 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
m_map.insert(_source, key); m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::MemMBFormat; m_formatter[key] = AWKeysAggregator::FormatterType::MemMBFormat;
} }
} else if (_source.startsWith("upgrade")) { } else if (_source.startsWith("extsysmon/upgrade")) {
// package manager // package manager
QString key = _source; QString key = _source;
key.remove("upgrade/"); key.remove("extsysmon/upgrade/");
m_map.insert(_source, key); m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::IntegerThree; m_formatter[key] = AWKeysAggregator::FormatterType::IntegerThree;
} else if (_source.startsWith("player")) { } else if (_source.startsWith("extsysmon/player")) {
// player // player
QString key = _source; QString key = _source;
key.remove("player/"); key.remove("extsysmon/player/");
m_map.insert(_source, key); m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat; m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source == "ps/running/count") { } else if (_source == "extsysmon/ps/running") {
// running processes count // running processes count
m_map.insert(_source, "pscount"); m_map.insert(_source, "pscount");
m_formatter["pscount"] = AWKeysAggregator::FormatterType::NoFormat; m_formatter["pscount"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source == "ps/running/list") { } else if (_source == "extsysmon/ps/list") {
// list of running processes // list of running processes
m_map.insert(_source, "ps"); m_map.insert(_source, "ps");
m_formatter["ps"] = AWKeysAggregator::FormatterType::List; m_formatter["ps"] = AWKeysAggregator::FormatterType::List;
} else if (_source == "ps/total/count") { } else if (_source == "extsysmon/ps/count") {
// total processes count // total processes count
m_map.insert(_source, "pstot"); m_map.insert(_source, "pstot");
m_formatter["pstot"] = AWKeysAggregator::FormatterType::NoFormat; m_formatter["pstot"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source.startsWith("quotes")) { } else if (_source.startsWith("extsysmon/quotes")) {
// quotes // quotes
QString key = _source; QString key = _source;
key.remove("quotes/"); key.remove("extsysmon/quotes/");
m_map.insert(_source, key); m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Quotes; m_formatter[key] = AWKeysAggregator::FormatterType::Quotes;
} else if (_source == "memory/swap/free") { } else if (_source == "memory/swap/free") {
@ -346,9 +347,10 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
// gb // gb
m_map.insert(_source, "swapgb"); m_map.insert(_source, "swapgb");
m_formatter["swapgb"] = AWKeysAggregator::FormatterType::MemGBFormat; m_formatter["swapgb"] = AWKeysAggregator::FormatterType::MemGBFormat;
} else if (_source.startsWith("lmsensors/")) { } else if (_source.startsWith("lmsensors/") || _source.contains(cpuTempRegExp)
|| _source == "cpu/all/averageTemperature") {
// temperature // temperature
int index = m_devices["temp"].indexOf(_source); auto index = m_devices["temp"].indexOf(_source);
// HACK on DE initialization there are no units key // HACK on DE initialization there are no units key
if (_units == KSysGuard::UnitInvalid) if (_units == KSysGuard::UnitInvalid)
return QStringList({QString("temp%1").arg(index)}); return QStringList({QString("temp%1").arg(index)});
@ -358,7 +360,7 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
m_formatter[key] = _units == KSysGuard::UnitCelsius ? AWKeysAggregator::FormatterType::Temperature m_formatter[key] = _units == KSysGuard::UnitCelsius ? AWKeysAggregator::FormatterType::Temperature
: AWKeysAggregator::FormatterType::Integer; : AWKeysAggregator::FormatterType::Integer;
} }
} else if (_source == "Local") { } else if (_source == "extsysmon/time/now") {
// time // time
m_map.insert(_source, "time"); m_map.insert(_source, "time");
m_formatter["time"] = AWKeysAggregator::FormatterType::Time; m_formatter["time"] = AWKeysAggregator::FormatterType::Time;
@ -377,40 +379,40 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
// timestamp // timestamp
m_map.insert(_source, "tstime"); m_map.insert(_source, "tstime");
m_formatter["tstime"] = AWKeysAggregator::FormatterType::Timestamp; m_formatter["tstime"] = AWKeysAggregator::FormatterType::Timestamp;
} else if (_source == "system/brightness") { } else if (_source == "extsysmon/system/brightness") {
m_map.insert(_source, "brightness"); m_map.insert(_source, "brightness");
m_formatter["brightness"] = AWKeysAggregator::FormatterType::IntegerThree; m_formatter["brightness"] = AWKeysAggregator::FormatterType::IntegerThree;
} else if (_source == "system/volume") { } else if (_source == "extsysmon/system/volume") {
m_map.insert(_source, "volume"); m_map.insert(_source, "volume");
m_formatter["volume"] = AWKeysAggregator::FormatterType::IntegerThree; m_formatter["volume"] = AWKeysAggregator::FormatterType::IntegerThree;
} else if (_source == "system/uptime") { } else if (_source == "os/system/uptime") {
// uptime // uptime
m_map.insert(_source, "uptime"); m_map.insert(_source, "uptime");
m_formatter["uptime"] = AWKeysAggregator::FormatterType::Uptime; m_formatter["uptime"] = AWKeysAggregator::FormatterType::Uptime;
// custom uptime // custom uptime
m_map.insert(_source, "cuptime"); m_map.insert(_source, "cuptime");
m_formatter["cuptime"] = AWKeysAggregator::FormatterType::UptimeCustom; m_formatter["cuptime"] = AWKeysAggregator::FormatterType::UptimeCustom;
} else if (_source.startsWith("weather/temperature")) { } else if (_source.startsWith("extsysmon/weather/temperature")) {
// temperature // temperature
QString key = _source; QString key = _source;
key.remove("weather/"); key.remove("extsysmon/weather/");
m_map.insert(_source, key); m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Temperature; m_formatter[key] = AWKeysAggregator::FormatterType::Temperature;
} else if (_source.startsWith("weather/")) { } else if (_source.startsWith("extsysmon/weather/")) {
// other weather // other weather
QString key = _source; QString key = _source;
key.remove("weather/"); key.remove("extsysmon/weather/");
m_map.insert(_source, key); m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat; m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source.startsWith("load/load")) { } else if (_source.startsWith("extsysmon/load/load")) {
// load source // load source
QString key = _source; QString key = _source;
key.remove("load/"); key.remove("extsysmon/load/");
m_map.insert(_source, key); m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Temperature; m_formatter[key] = AWKeysAggregator::FormatterType::Temperature;
} }
QStringList foundKeys = keysFromSource(_source); auto foundKeys = keysFromSource(_source);
// rewrite formatters for custom ones // rewrite formatters for custom ones
QStringList customFormattersKeys; QStringList customFormattersKeys;
@ -425,7 +427,7 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
// drop key from dictionary if no one user requested key required it // drop key from dictionary if no one user requested key required it
qCInfo(LOG_AW) << "Looking for keys" << foundKeys << "in" << _keys; qCInfo(LOG_AW) << "Looking for keys" << foundKeys << "in" << _keys;
bool required = _keys.isEmpty() || std::any_of(foundKeys.cbegin(), foundKeys.cend(), [&_keys](const QString &key) { auto required = _keys.isEmpty() || std::any_of(foundKeys.cbegin(), foundKeys.cend(), [&_keys](const QString &key) {
return _keys.contains(key); return _keys.contains(key);
}); });
if (!required) { if (!required) {

View File

@ -114,8 +114,7 @@ QStringList AWFormatterHelper::rightKeys()
void AWFormatterHelper::editItems() void AWFormatterHelper::editItems()
{ {
repaintList(); auto ret = exec();
int ret = exec();
qCInfo(LOG_AW) << "Dialog returns" << ret; qCInfo(LOG_AW) << "Dialog returns" << ret;
} }
@ -200,20 +199,20 @@ QPair<QString, AWAbstractFormatter::FormatterClass> AWFormatterHelper::readMetad
QSettings settings(_filePath, QSettings::IniFormat); QSettings settings(_filePath, QSettings::IniFormat);
settings.beginGroup("Desktop Entry"); settings.beginGroup("Desktop Entry");
QString name = settings.value("Name", _filePath).toString(); auto name = settings.value("Name", _filePath).toString();
QString type = settings.value("X-AW-Type", "NoFormat").toString(); auto type = settings.value("X-AW-Type", "NoFormat").toString();
AWAbstractFormatter::FormatterClass formatter = defineFormatterClass(type); auto formatter = defineFormatterClass(type);
settings.endGroup(); settings.endGroup();
return QPair<QString, AWAbstractFormatter::FormatterClass>(name, formatter); return QPair<QString, AWAbstractFormatter::FormatterClass>(name, formatter);
} }
void AWFormatterHelper::doCreateItem() void AWFormatterHelper::doCreateItem(QListWidget *_widget)
{ {
QStringList selection = {"NoFormat", "DateTime", "Float", "List", "Script", "String", "Json"}; QStringList selection = {"NoFormat", "DateTime", "Float", "List", "Script", "String", "Json"};
bool ok; bool ok;
QString select = QInputDialog::getItem(this, i18n("Select type"), i18n("Type:"), selection, 0, false, &ok); auto select = QInputDialog::getItem(nullptr, i18n("Select type"), i18n("Type:"), selection, 0, false, &ok);
if (!ok) { if (!ok) {
qCWarning(LOG_AW) << "No type selected"; qCWarning(LOG_AW) << "No type selected";
return; return;
@ -223,18 +222,18 @@ void AWFormatterHelper::doCreateItem()
AWAbstractFormatter::FormatterClass formatter = defineFormatterClass(select); AWAbstractFormatter::FormatterClass formatter = defineFormatterClass(select);
switch (formatter) { switch (formatter) {
case AWAbstractFormatter::FormatterClass::DateTime: case AWAbstractFormatter::FormatterClass::DateTime:
return createItem<AWDateTimeFormatter>(); return createItem<AWDateTimeFormatter>(_widget);
case AWAbstractFormatter::FormatterClass::Float: case AWAbstractFormatter::FormatterClass::Float:
return createItem<AWFloatFormatter>(); return createItem<AWFloatFormatter>(_widget);
case AWAbstractFormatter::FormatterClass::List: case AWAbstractFormatter::FormatterClass::List:
return createItem<AWListFormatter>(); return createItem<AWListFormatter>(_widget);
case AWAbstractFormatter::FormatterClass::Script: case AWAbstractFormatter::FormatterClass::Script:
return createItem<AWScriptFormatter>(); return createItem<AWScriptFormatter>(_widget);
case AWAbstractFormatter::FormatterClass::String: case AWAbstractFormatter::FormatterClass::String:
return createItem<AWStringFormatter>(); return createItem<AWStringFormatter>(_widget);
case AWAbstractFormatter::FormatterClass::Json: case AWAbstractFormatter::FormatterClass::Json:
return createItem<AWJsonFormatter>(); return createItem<AWJsonFormatter>(_widget);
case AWAbstractFormatter::FormatterClass::NoFormat: case AWAbstractFormatter::FormatterClass::NoFormat:
return createItem<AWNoFormatter>(); return createItem<AWNoFormatter>(_widget);
} }
} }

View File

@ -51,7 +51,7 @@ private:
void initFormatters(); void initFormatters();
[[nodiscard]] static QPair<QString, AWAbstractFormatter::FormatterClass> readMetadata(const QString &_filePath); [[nodiscard]] static QPair<QString, AWAbstractFormatter::FormatterClass> readMetadata(const QString &_filePath);
// parent methods // parent methods
void doCreateItem() override; void doCreateItem(QListWidget *_widget) override;
// properties // properties
QHash<QString, AWAbstractFormatter *> m_formatters; QHash<QString, AWAbstractFormatter *> m_formatters;
QHash<QString, AWAbstractFormatter *> m_formattersClasses; QHash<QString, AWAbstractFormatter *> m_formattersClasses;

View File

@ -302,18 +302,20 @@ void AWKeyOperations::addDevice(const QString &_source)
{ {
qCDebug(LOG_AW) << "Source" << _source; qCDebug(LOG_AW) << "Source" << _source;
auto diskRegexp = QRegularExpression("disk/(?:md|sd|hd)[a-z|0-9]_.*/Rate/(?:rblk)"); auto diskRegexp = QRegularExpression("disk/.*/read");
auto mountRegexp = QRegularExpression("partitions/.*/filllevel"); auto mountRegexp = QRegularExpression("disk/.*/usedPercent");
auto cpuTempRegExp = QRegularExpression("^cpu/cpu.*/temperature$");
if (_source.contains(diskRegexp)) { if (_source.contains(diskRegexp)) {
QString device = _source; auto device = _source;
device.remove("/Rate/rblk"); device.remove("disk/").remove("/read");
addKeyToCache("disk", device); addKeyToCache("disk", device);
} else if (_source.contains(mountRegexp)) { } else if (_source.contains(mountRegexp)) {
QString device = _source; auto device = _source;
device.remove("partitions").remove("/filllevel"); device.remove("disk/").remove("/usedPercent");
addKeyToCache("mount", device); addKeyToCache("mount", device);
} else if (_source.startsWith("lmsensors")) { } else if (_source.startsWith("lmsensors") || _source.contains(cpuTempRegExp)
|| _source == "cpu/all/averageTemperature") {
addKeyToCache("temp", _source); addKeyToCache("temp", _source);
} }
} }

View File

@ -56,21 +56,17 @@ AWKeys::AWKeys(QObject *_parent)
createDBusInterface(); createDBusInterface();
// update key data if required // update key data if required
connect(m_keyOperator, SIGNAL(updateKeys(const QStringList &)), this, SLOT(reinitKeys(const QStringList &))); connect(m_keyOperator, &AWKeyOperations::updateKeys, this, &AWKeys::reinitKeys);
connect(m_timer, SIGNAL(timeout()), this, SLOT(updateTextData())); connect(m_timer, &QTimer::timeout, this, &AWKeys::updateTextData);
// transfer signal from AWDataAggregator object to QML ui // transfer signal from AWDataAggregator object to QML ui
connect(m_dataAggregator, SIGNAL(toolTipPainted(const QString &)), this, connect(m_dataAggregator, &AWDataAggregator::toolTipPainted,
SIGNAL(needToolTipToBeUpdated(const QString &))); [this](const QString &_tooltip) { emit(needToolTipToBeUpdated(_tooltip)); });
connect(this, SIGNAL(dropSourceFromDataengine(const QString &)), m_dataEngineAggregator, connect(this, &AWKeys::dropSourceFromDataengine, m_dataEngineAggregator, &AWDataEngineAggregator::dropSource);
SLOT(dropSource(const QString &))); connect(m_dataEngineAggregator, &AWDataEngineAggregator::dataUpdated, this, &AWKeys::dataUpdated);
connect(m_dataEngineAggregator,
SIGNAL(dataUpdated(const QHash<QString, KSysGuard::SensorInfo> &, const KSysGuard::SensorDataList &)), this,
SLOT(dataUpdated(const QHash<QString, KSysGuard::SensorInfo> &, const KSysGuard::SensorDataList &)));
// transfer signal from dataengine to update source list // transfer signal from dataengine to update source list
connect(m_dataEngineAggregator, SIGNAL(deviceAdded(const QString &)), m_keyOperator, connect(m_dataEngineAggregator, &AWDataEngineAggregator::deviceAdded, m_keyOperator, &AWKeyOperations::addDevice);
SLOT(addDevice(const QString &)));
} }
@ -107,7 +103,6 @@ void AWKeys::initKeys(const QString &_currentPattern, const int _interval, const
m_aggregator->initFormatters(); m_aggregator->initFormatters();
m_keyOperator->setPattern(_currentPattern); m_keyOperator->setPattern(_currentPattern);
m_keyOperator->updateCache(); m_keyOperator->updateCache();
m_dataEngineAggregator->reconnectSources(_interval);
// timer // timer
m_timer->setInterval(_interval); m_timer->setInterval(_interval);
@ -373,12 +368,11 @@ void AWKeys::setDataBySource(const QString &_source, const KSysGuard::SensorInfo
// update data or drop source if there are no matches and exit // update data or drop source if there are no matches and exit
if (tags.isEmpty()) { if (tags.isEmpty()) {
qCInfo(LOG_AW) << "Source" << _source << "not found"; qCInfo(LOG_AW) << "Sensor" << _source << "not found";
return emit(dropSourceFromDataengine(_source)); return emit(dropSourceFromDataengine(_source));
} }
m_mutex.lock(); m_mutex.lock();
// HACK workaround for time values which are stored in the different path
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, &_data](const QString &tag) { m_values[tag] = _data.payload; });
m_mutex.unlock(); m_mutex.unlock();
} }

View File

@ -113,26 +113,26 @@ QString AWKeysAggregator::formatter(const QVariant &_data, const QString &_key,
output = QString("%1").arg(temperature(_data.toDouble()), 5, 'f', 1); output = QString("%1").arg(temperature(_data.toDouble()), 5, 'f', 1);
break; break;
case FormatterType::Time: case FormatterType::Time:
output = _data.toDateTime().toString(); output = QDateTime::fromSecsSinceEpoch(_data.toLongLong()).toString();
break; break;
case FormatterType::TimeCustom: case FormatterType::TimeCustom:
output = m_customTime; output = m_customTime;
[&output, loc, this](const QDateTime &dt) { [&output, loc, this](const QDateTime &dt) {
for (auto &key : m_timeKeys) for (auto &key : m_timeKeys)
output.replace(QString("$%1").arg(key), loc.toString(dt, key)); output.replace(QString("$%1").arg(key), loc.toString(dt, key));
}(_data.toDateTime()); }(QDateTime::fromSecsSinceEpoch(_data.toLongLong()));
break; break;
case FormatterType::TimeISO: case FormatterType::TimeISO:
output = _data.toDateTime().toString(Qt::ISODate); output = QDateTime::fromSecsSinceEpoch(_data.toLongLong()).toString(Qt::ISODate);
break; break;
case FormatterType::TimeLong: case FormatterType::TimeLong:
output = loc.toString(_data.toDateTime(), QLocale::LongFormat); output = loc.toString(QDateTime::fromSecsSinceEpoch(_data.toLongLong()), QLocale::LongFormat);
break; break;
case FormatterType::TimeShort: case FormatterType::TimeShort:
output = loc.toString(_data.toDateTime(), QLocale::ShortFormat); output = loc.toString(QDateTime::fromSecsSinceEpoch(_data.toLongLong()), QLocale::ShortFormat);
break; break;
case FormatterType::Timestamp: case FormatterType::Timestamp:
output = QString("%1").arg(_data.toDateTime().toMSecsSinceEpoch() / 1000.0, 10, 'f', 0); output = _data.toString();
break; break;
case FormatterType::Uptime: case FormatterType::Uptime:
case FormatterType::UptimeCustom: case FormatterType::UptimeCustom:

View File

@ -33,13 +33,13 @@ add_library(${SUBPROJECT} STATIC ${SUBPROJECT_SOURCE} ${SUBPROJECT_HEADER} ${SUB
target_link_libraries(${SUBPROJECT} ${Qt_LIBRARIES} ${Kf6_LIBRARIES}) target_link_libraries(${SUBPROJECT} ${Qt_LIBRARIES} ${Kf6_LIBRARIES})
# install # install
install(DIRECTORY ${SUBPROJECT_CONFIGS} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME}) install(DIRECTORY ${SUBPROJECT_CONFIGS} DESTINATION ${KDE_INSTALL_DATADIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_FORMATTERS} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME}) install(DIRECTORY ${SUBPROJECT_FORMATTERS} DESTINATION ${KDE_INSTALL_DATADIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_GRAPHITEMS} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME}) install(DIRECTORY ${SUBPROJECT_GRAPHITEMS} DESTINATION ${KDE_INSTALL_DATADIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_QUOTES} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME}) install(DIRECTORY ${SUBPROJECT_QUOTES} DESTINATION ${KDE_INSTALL_DATADIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_SCRIPTS} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME}) install(DIRECTORY ${SUBPROJECT_SCRIPTS} DESTINATION ${KDE_INSTALL_DATADIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_REQUESTS} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME}) install(DIRECTORY ${SUBPROJECT_REQUESTS} DESTINATION ${KDE_INSTALL_DATADIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_UPGRADE} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME}) install(DIRECTORY ${SUBPROJECT_UPGRADE} DESTINATION ${KDE_INSTALL_DATADIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_WEATHER} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME}) install(DIRECTORY ${SUBPROJECT_WEATHER} DESTINATION ${KDE_INSTALL_DATADIR}/${PROJECT_NAME})
install(FILES ${SUBPROJECT_INI} DESTINATION ${KDE_INSTALL_CONFDIR}) install(FILES ${SUBPROJECT_INI} DESTINATION /${KDE_INSTALL_CONFDIR})
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${SUBPROJECT_WEATHER_JSON} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME}/weather) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${SUBPROJECT_WEATHER_JSON} DESTINATION ${KDE_INSTALL_DATADIR}/${PROJECT_NAME}/weather)

View File

@ -28,44 +28,26 @@
AbstractExtItemAggregator::AbstractExtItemAggregator(QObject *_parent, QString _type) AbstractExtItemAggregator::AbstractExtItemAggregator(QObject *_parent, QString _type)
: QObject(_parent) : QObject(_parent)
, ui(new Ui::AbstractExtItemAggregator)
, m_type(std::move(_type)) , m_type(std::move(_type))
{ {
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
// create directory at $HOME // create directory at $HOME
auto localDir = QString("%1/awesomewidgets/%2") auto localDir = QString("%1/awesomewidgets/%2")
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation), type()); .arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation), type());
QDir localDirectory; QDir localDirectory;
if (localDirectory.mkpath(localDir)) if (localDirectory.mkpath(localDir))
qCInfo(LOG_LIB) << "Created directory" << localDir; qCInfo(LOG_LIB) << "Created directory" << localDir;
ui->setupUi(this);
copyButton = ui->buttonBox->addButton(i18n("Copy"), QDialogButtonBox::ActionRole);
createButton = ui->buttonBox->addButton(i18n("Create"), QDialogButtonBox::ActionRole);
deleteButton = ui->buttonBox->addButton(i18n("Remove"), QDialogButtonBox::ActionRole);
connect(ui->buttonBox, SIGNAL(clicked(QAbstractButton *)), this, SLOT(editItemButtonPressed(QAbstractButton *)));
connect(ui->buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
connect(ui->listWidget, SIGNAL(itemActivated(QListWidgetItem *)), this, SLOT(editItemActivated(QListWidgetItem *)));
} }
AbstractExtItemAggregator::~AbstractExtItemAggregator() void AbstractExtItemAggregator::copyItem(QListWidget *_widget)
{ {
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; auto source = itemFromWidget(_widget);
delete ui;
}
void AbstractExtItemAggregator::copyItem()
{
auto source = itemFromWidget();
auto fileName = getName(); auto fileName = getName();
auto number = uniqNumber(); auto number = uniqNumber();
auto dir = QString("%1/awesomewidgets/%2") auto dir = QString("%1/awesomewidgets/%2")
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation), m_type); .arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation), m_type);
if ((!source) || (fileName.isEmpty())) { if ((!source) || (fileName.isEmpty())) {
qCWarning(LOG_LIB) << "Nothing to copy"; qCWarning(LOG_LIB) << "Nothing to copy";
return; return;
@ -73,16 +55,16 @@ void AbstractExtItemAggregator::copyItem()
auto filePath = QString("%1/%2").arg(dir, fileName); auto filePath = QString("%1/%2").arg(dir, fileName);
auto newItem = source->copy(filePath, number); auto newItem = source->copy(filePath, number);
if (newItem->showConfiguration(this, configArgs()) == 1) { if (newItem->showConfiguration(nullptr, configArgs()) == 1) {
initItems(); initItems();
repaintList(); repaintList(_widget);
} }
} }
void AbstractExtItemAggregator::deleteItem() void AbstractExtItemAggregator::deleteItem(QListWidget *_widget)
{ {
auto source = itemFromWidget(); auto source = itemFromWidget(_widget);
if (!source) { if (!source) {
qCWarning(LOG_LIB) << "Nothing to delete"; qCWarning(LOG_LIB) << "Nothing to delete";
return; return;
@ -90,30 +72,63 @@ void AbstractExtItemAggregator::deleteItem()
if (source->tryDelete()) { if (source->tryDelete()) {
initItems(); initItems();
repaintList(); repaintList(_widget);
} }
} }
void AbstractExtItemAggregator::editItem() void AbstractExtItemAggregator::editItem(QListWidget *_widget)
{ {
auto source = itemFromWidget(); auto source = itemFromWidget(_widget);
if (!source) { if (!source) {
qCWarning(LOG_LIB) << "Nothing to edit"; qCWarning(LOG_LIB) << "Nothing to edit";
return; return;
} }
if (source->showConfiguration(this, configArgs()) == 1) { if (source->showConfiguration(nullptr, configArgs()) == 1) {
initItems(); initItems();
repaintList(); repaintList(_widget);
} }
} }
int AbstractExtItemAggregator::exec()
{
auto dialog = new QDialog();
auto ui = new Ui::AbstractExtItemAggregator();
ui->setupUi(dialog);
auto copyButton = ui->buttonBox->addButton(i18n("Copy"), QDialogButtonBox::ActionRole);
auto createButton = ui->buttonBox->addButton(i18n("Create"), QDialogButtonBox::ActionRole);
auto deleteButton = ui->buttonBox->addButton(i18n("Remove"), QDialogButtonBox::ActionRole);
connect(ui->buttonBox, &QDialogButtonBox::clicked, [&](QAbstractButton *_button) {
if (dynamic_cast<QPushButton *>(_button) == copyButton)
copyItem(ui->listWidget);
else if (dynamic_cast<QPushButton *>(_button) == createButton)
doCreateItem(ui->listWidget);
else if (dynamic_cast<QPushButton *>(_button) == deleteButton)
deleteItem(ui->listWidget);
else if (ui->buttonBox->buttonRole(_button) == QDialogButtonBox::AcceptRole)
editItem(ui->listWidget);
});
connect(ui->buttonBox, &QDialogButtonBox::rejected, [dialog]() { dialog->reject(); });
connect(ui->listWidget, &QListWidget::itemActivated, [&](QListWidgetItem *) { editItem(ui->listWidget); });
repaintList(ui->listWidget);
auto ret = dialog->exec();
dialog->deleteLater();
delete ui;
return ret;
}
QString AbstractExtItemAggregator::getName() QString AbstractExtItemAggregator::getName()
{ {
bool ok; bool ok;
auto name = QInputDialog::getText(this, i18n("Enter file name"), i18n("File name"), QLineEdit::Normal, "", &ok); auto name = QInputDialog::getText(nullptr, i18n("Enter file name"), i18n("File name"), QLineEdit::Normal, "", &ok);
if ((!ok) || (name.isEmpty())) if ((!ok) || (name.isEmpty()))
return ""; return "";
if (!name.endsWith(".desktop")) if (!name.endsWith(".desktop"))
@ -123,9 +138,9 @@ QString AbstractExtItemAggregator::getName()
} }
AbstractExtItem *AbstractExtItemAggregator::itemFromWidget() const AbstractExtItem *AbstractExtItemAggregator::itemFromWidget(QListWidget *_widget) const
{ {
auto widgetItem = ui->listWidget->currentItem(); auto widgetItem = _widget->currentItem();
if (!widgetItem) if (!widgetItem)
return nullptr; return nullptr;
@ -144,18 +159,18 @@ AbstractExtItem *AbstractExtItemAggregator::itemFromWidget() const
} }
void AbstractExtItemAggregator::repaintList() const void AbstractExtItemAggregator::repaintList(QListWidget *_widget) const
{ {
ui->listWidget->clear(); _widget->clear();
for (auto &_item : items()) { for (auto &_item : items()) {
QString fileName = QFileInfo(_item->fileName()).fileName(); QString fileName = QFileInfo(_item->fileName()).fileName();
auto item = new QListWidgetItem(fileName, ui->listWidget); auto item = new QListWidgetItem(fileName, _widget);
QStringList tooltip; QStringList tooltip;
tooltip.append(i18n("Name: %1", _item->name())); tooltip.append(i18n("Name: %1", _item->name()));
tooltip.append(i18n("Comment: %1", _item->comment())); tooltip.append(i18n("Comment: %1", _item->comment()));
tooltip.append(i18n("Identity: %1", _item->uniq())); tooltip.append(i18n("Identity: %1", _item->uniq()));
item->setToolTip(tooltip.join('\n')); item->setToolTip(tooltip.join('\n'));
ui->listWidget->addItem(item); _widget->addItem(item);
} }
} }
@ -200,22 +215,3 @@ void AbstractExtItemAggregator::setConfigArgs(const QVariant &_configArgs)
m_configArgs = _configArgs; m_configArgs = _configArgs;
} }
void AbstractExtItemAggregator::editItemActivated(QListWidgetItem *)
{
return editItem();
}
void AbstractExtItemAggregator::editItemButtonPressed(QAbstractButton *_button)
{
if (dynamic_cast<QPushButton *>(_button) == copyButton)
return copyItem();
else if (dynamic_cast<QPushButton *>(_button) == createButton)
return doCreateItem();
else if (dynamic_cast<QPushButton *>(_button) == deleteButton)
return deleteItem();
else if (ui->buttonBox->buttonRole(_button) == QDialogButtonBox::AcceptRole)
return editItem();
}

View File

@ -25,6 +25,7 @@
class QAbstractButton; class QAbstractButton;
class QListWidget;
class QListWidgetItem; class QListWidgetItem;
class AbstractExtItemAggregator : public QObject class AbstractExtItemAggregator : public QObject
@ -36,32 +37,33 @@ class AbstractExtItemAggregator : public QObject
public: public:
explicit AbstractExtItemAggregator(QObject *_parent, QString _type); explicit AbstractExtItemAggregator(QObject *_parent, QString _type);
// methods // methods
void copyItem(); void copyItem(QListWidget *_widget);
template <class T> void createItem() template <class T> void createItem(QListWidget *_widget)
{ {
auto fileName = getName(); auto fileName = getName();
int number = uniqNumber(); auto number = uniqNumber();
auto dir = QString("%1/awesomewidgets/%2") auto dir = QString("%1/awesomewidgets/%2")
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation), m_type); .arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation), m_type);
if (fileName.isEmpty()) { if (fileName.isEmpty()) {
qCWarning(LOG_LIB) << "Nothing to create"; qCWarning(LOG_LIB) << "Nothing to create";
return; return;
} }
auto filePath = QString("%1/%2").arg(dir, fileName); auto filePath = QString("%1/%2").arg(dir, fileName);
T *newItem = new T(this, filePath); auto newItem = new T(this, filePath);
newItem->setNumber(number); newItem->setNumber(number);
if (newItem->showConfiguration(this, configArgs()) == 1) { if (newItem->showConfiguration(nullptr, configArgs()) == 1) {
initItems(); initItems();
repaintList(); repaintList(_widget);
} }
}; };
void deleteItem(); void deleteItem(QListWidget *_widget);
void editItem(); void editItem(QListWidget *_widget);
[[nodiscard]] int exec();
QString getName(); QString getName();
virtual void initItems() = 0; virtual void initItems() = 0;
[[nodiscard]] AbstractExtItem *itemFromWidget() const; [[nodiscard]] AbstractExtItem *itemFromWidget(QListWidget *_widget) const;
void repaintList() const; void repaintList(QListWidget *_widget) const;
[[nodiscard]] int uniqNumber() const; [[nodiscard]] int uniqNumber() const;
// get methods // get methods
[[nodiscard]] QVariant configArgs() const; [[nodiscard]] QVariant configArgs() const;
@ -71,21 +73,12 @@ public:
// set methods // set methods
void setConfigArgs(const QVariant &_configArgs); void setConfigArgs(const QVariant &_configArgs);
private slots:
void editItemActivated(QListWidgetItem *);
void editItemButtonPressed(QAbstractButton *_button);
private: private:
// ui
Ui::AbstractExtItemAggregator *ui = nullptr;
QPushButton *copyButton = nullptr;
QPushButton *createButton = nullptr;
QPushButton *deleteButton = nullptr;
// properties // properties
QVariant m_configArgs; QVariant m_configArgs;
QString m_type; QString m_type;
// ui methods // ui methods
virtual void doCreateItem() = 0; virtual void doCreateItem(QListWidget *_widget) = 0;
}; };

View File

@ -5,120 +5,120 @@
"image": { "image": {
"__comment": "should be described as html image with full path inside", "__comment": "should be described as html image with full path inside",
"default": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/3200.gif\">", "default": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/3200.gif\">",
"800": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/01d.png\">", "800": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/01d.png\">",
"801": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/02d.png\">", "801": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/02d.png\">",
"802": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/03d.png\">", "802": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/03d.png\">",
"803": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/03d.png\">", "803": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/03d.png\">",
"804": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/04d.png\">", "804": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/04d.png\">",
"300": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">", "300": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/09d.png\">",
"301": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">", "301": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/09d.png\">",
"302": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">", "302": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/09d.png\">",
"310": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">", "310": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/09d.png\">",
"311": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">", "311": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/09d.png\">",
"312": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">", "312": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/09d.png\">",
"313": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">", "313": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/09d.png\">",
"314": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">", "314": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/09d.png\">",
"321": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">", "321": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/09d.png\">",
"520": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">", "520": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/09d.png\">",
"521": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">", "521": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/09d.png\">",
"522": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">", "522": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/09d.png\">",
"531": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">", "531": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/09d.png\">",
"500": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/10d.png\">", "500": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/10d.png\">",
"501": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/10d.png\">", "501": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/10d.png\">",
"502": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/10d.png\">", "502": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/10d.png\">",
"503": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/10d.png\">", "503": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/10d.png\">",
"504": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/10d.png\">", "504": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/10d.png\">",
"200": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/11d.png\">", "200": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/11d.png\">",
"201": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/11d.png\">", "201": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/11d.png\">",
"202": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/11d.png\">", "202": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/11d.png\">",
"210": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/11d.png\">", "210": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/11d.png\">",
"211": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/11d.png\">", "211": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/11d.png\">",
"212": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/11d.png\">", "212": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/11d.png\">",
"221": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/11d.png\">", "221": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/11d.png\">",
"230": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/11d.png\">", "230": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/11d.png\">",
"231": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/11d.png\">", "231": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/11d.png\">",
"232": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/11d.png\">", "232": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/11d.png\">",
"511": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/13d.png\">", "511": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/13d.png\">",
"600": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/13d.png\">", "600": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/13d.png\">",
"601": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/13d.png\">", "601": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/13d.png\">",
"602": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/13d.png\">", "602": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/13d.png\">",
"611": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/13d.png\">", "611": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/13d.png\">",
"612": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/13d.png\">", "612": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/13d.png\">",
"615": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/13d.png\">", "615": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/13d.png\">",
"616": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/13d.png\">", "616": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/13d.png\">",
"620": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/13d.png\">", "620": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/13d.png\">",
"621": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/13d.png\">", "621": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/13d.png\">",
"622": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/13d.png\">", "622": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/13d.png\">",
"701": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/50d.png\">", "701": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/50d.png\">",
"711": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/50d.png\">", "711": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/50d.png\">",
"721": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/50d.png\">", "721": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/50d.png\">",
"731": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/50d.png\">", "731": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/50d.png\">",
"741": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/50d.png\">", "741": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/50d.png\">",
"751": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/50d.png\">", "751": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/50d.png\">",
"761": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/50d.png\">", "761": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/50d.png\">",
"762": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/50d.png\">", "762": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/50d.png\">",
"771": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/50d.png\">", "771": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/50d.png\">",
"781": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/50d.png\">", "781": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/50d.png\">",
"0": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/0.gif\">", "0": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/0.gif\">",
"1": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/1.gif\">", "1": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/1.gif\">",
"2": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/2.gif\">", "2": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/2.gif\">",
"3": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/3.gif\">", "3": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/3.gif\">",
"4": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/4.gif\">", "4": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/4.gif\">",
"5": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/5.gif\">", "5": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/5.gif\">",
"6": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/6.gif\">", "6": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/6.gif\">",
"7": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/7.gif\">", "7": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/7.gif\">",
"8": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/8.gif\">", "8": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/8.gif\">",
"9": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/9.gif\">", "9": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/9.gif\">",
"10": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/10.gif\">", "10": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/10.gif\">",
"11": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/11.gif\">", "11": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/11.gif\">",
"12": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/12.gif\">", "12": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/12.gif\">",
"13": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/13.gif\">", "13": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/13.gif\">",
"14": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/14.gif\">", "14": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/14.gif\">",
"15": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/15.gif\">", "15": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/15.gif\">",
"16": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/16.gif\">", "16": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/16.gif\">",
"17": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/17.gif\">", "17": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/17.gif\">",
"18": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/18.gif\">", "18": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/18.gif\">",
"19": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/19.gif\">", "19": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/19.gif\">",
"20": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/20.gif\">", "20": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/20.gif\">",
"21": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/21.gif\">", "21": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/21.gif\">",
"22": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/22.gif\">", "22": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/22.gif\">",
"23": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/23.gif\">", "23": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/23.gif\">",
"24": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/24.gif\">", "24": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/24.gif\">",
"25": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/25.gif\">", "25": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/25.gif\">",
"26": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/26.gif\">", "26": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/26.gif\">",
"27": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/27.gif\">", "27": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/27.gif\">",
"28": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/28.gif\">", "28": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/28.gif\">",
"29": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/29.gif\">", "29": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/29.gif\">",
"30": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/30.gif\">", "30": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/30.gif\">",
"31": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/31.gif\">", "31": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/31.gif\">",
"32": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/32.gif\">", "32": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/32.gif\">",
"33": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/33.gif\">", "33": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/33.gif\">",
"34": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/34.gif\">", "34": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/34.gif\">",
"35": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/35.gif\">", "35": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/35.gif\">",
"36": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/36.gif\">", "36": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/36.gif\">",
"37": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/37.gif\">", "37": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/37.gif\">",
"38": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/38.gif\">", "38": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/38.gif\">",
"39": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/39.gif\">", "39": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/39.gif\">",
"40": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/40.gif\">", "40": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/40.gif\">",
"41": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/41.gif\">", "41": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/41.gif\">",
"42": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/42.gif\">", "42": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/42.gif\">",
"43": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/43.gif\">", "43": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/43.gif\">",
"44": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/44.gif\">", "44": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/44.gif\">",
"45": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/45.gif\">", "45": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/45.gif\">",
"46": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/46.gif\">", "46": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/46.gif\">",
"47": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/47.gif\">", "47": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/47.gif\">",
"3200": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/3200.gif\">" "3200": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/3200.gif\">"
}, },
"text": { "text": {

View File

@ -270,4 +270,3 @@ void AWFloatFormatter::translate(void *_ui)
ui->label_multiplier->setText(i18n("Multiplier")); ui->label_multiplier->setText(i18n("Multiplier"));
ui->label_summand->setText(i18n("Summand")); ui->label_summand->setText(i18n("Summand"));
} }

View File

@ -91,4 +91,3 @@ void AWNoFormatter::translate(void *_ui)
ui->label_comment->setText(i18n("Comment")); ui->label_comment->setText(i18n("Comment"));
ui->label_type->setText(i18n("Type")); ui->label_type->setText(i18n("Type"));
} }

View File

@ -214,4 +214,3 @@ void AWScriptFormatter::translate(void *_ui)
ui->checkBox_hasReturn->setText(i18n("Has return")); ui->checkBox_hasReturn->setText(i18n("Has return"));
ui->label_code->setText(i18n("Code")); ui->label_code->setText(i18n("Code"));
} }

View File

@ -56,7 +56,6 @@ public:
void editItems() void editItems()
{ {
repaintList();
auto ret = exec(); auto ret = exec();
qCInfo(LOG_LIB) << "Dialog returns" << ret; qCInfo(LOG_LIB) << "Dialog returns" << ret;
}; };
@ -123,7 +122,7 @@ private:
QList<AbstractExtItem *> m_items; QList<AbstractExtItem *> m_items;
QList<T *> m_activeItems; QList<T *> m_activeItems;
void doCreateItem() override { return createItem<T>(); } void doCreateItem(QListWidget *_widget) override { return createItem<T>(_widget); }
QList<AbstractExtItem *> getItems() QList<AbstractExtItem *> getItems()
{ {
@ -137,7 +136,7 @@ private:
if (!file.endsWith(".desktop")) if (!file.endsWith(".desktop"))
continue; continue;
qCInfo(LOG_LIB) << "Found file" << file << "in" << dir; qCInfo(LOG_LIB) << "Found file" << file << "in" << dir;
QString filePath = QString("%1/%2").arg(dir).arg(file); auto filePath = QString("%1/%2").arg(dir, file);
// check if already exists // check if already exists
if (std::any_of(items.cbegin(), items.cend(), if (std::any_of(items.cbegin(), items.cend(),
[&filePath](AbstractExtItem *item) { return (item->fileName() == filePath); })) [&filePath](AbstractExtItem *item) { return (item->fileName() == filePath); }))
@ -147,8 +146,7 @@ private:
} }
// sort items // sort items
std::sort(items.begin(), items.end(), std::sort(items.begin(), items.end(), [](auto *lhs, auto *rhs) { return lhs->number() < rhs->number(); });
[](const AbstractExtItem *lhs, const AbstractExtItem *rhs) { return lhs->number() < rhs->number(); });
return items; return items;
}; };
}; };

View File

@ -433,7 +433,8 @@ int GraphicalItem::showConfiguration(QWidget *_parent, const QVariant &_args)
translate(ui); translate(ui);
connect(ui->checkBox_custom, &QCheckBox::stateChanged, [this, ui](const int state) { changeValue(ui, state); }); connect(ui->checkBox_custom, &QCheckBox::stateChanged, [this, ui](const int state) { changeValue(ui, state); });
connect(ui->comboBox_type, &QComboBox::currentIndexChanged, [this, ui](const int state) { changeCountState(ui, state); }); connect(ui->comboBox_type, &QComboBox::currentIndexChanged,
[this, ui](const int state) { changeCountState(ui, state); });
connect(ui->toolButton_activeColor, &QToolButton::clicked, [this, ui]() { changeColor(ui); }); connect(ui->toolButton_activeColor, &QToolButton::clicked, [this, ui]() { changeColor(ui); });
connect(ui->toolButton_inactiveColor, &QToolButton::clicked, [this, ui]() { changeColor(ui); }); connect(ui->toolButton_inactiveColor, &QToolButton::clicked, [this, ui]() { changeColor(ui); });

View File

@ -93,9 +93,9 @@ QVariantHash OWMWeatherProvider::parseSingleJson(const QVariantMap &_json) const
// main data // main data
QVariantMap mainWeather = _json["main"].toMap(); QVariantMap mainWeather = _json["main"].toMap();
if (!weather.isEmpty()) { if (!weather.isEmpty()) {
output[tag("humidity")] = mainWeather["humidity"].toFloat(); output[tag("humidity")] = mainWeather["humidity"].toDouble();
output[tag("pressure")] = mainWeather["pressure"].toFloat(); output[tag("pressure")] = mainWeather["pressure"].toDouble();
output[tag("temperature")] = mainWeather["temp"].toFloat(); output[tag("temperature")] = mainWeather["temp"].toDouble();
} }
// timestamp // timestamp

View File

@ -86,7 +86,7 @@ QVariantHash YahooWeatherProvider::parseCurrent(const QVariantMap &_json, const
values[tag("timestamp")] = condition["date"].toString(); values[tag("timestamp")] = condition["date"].toString();
values[tag("humidity")] = _atmosphere["humidity"].toInt(); values[tag("humidity")] = _atmosphere["humidity"].toInt();
// HACK temporary fix of invalid values on Yahoo! side // HACK temporary fix of invalid values on Yahoo! side
values[tag("pressure")] = static_cast<int>(_atmosphere["pressure"].toFloat() / 33.863753); values[tag("pressure")] = static_cast<int>(_atmosphere["pressure"].toDouble() / 33.863753);
return values; return values;
} }
@ -103,7 +103,7 @@ QVariantHash YahooWeatherProvider::parseForecast(const QVariantMap &_json) const
values[tag("weatherId")] = id; values[tag("weatherId")] = id;
values[tag("timestamp")] = weatherMap["date"].toString(); values[tag("timestamp")] = weatherMap["date"].toString();
// yahoo provides high and low temperatures. Lets calculate average one // yahoo provides high and low temperatures. Lets calculate average one
values[tag("temperature")] = (weatherMap["high"].toFloat() + weatherMap["low"].toFloat()) / 2.0; values[tag("temperature")] = (weatherMap["high"].toDouble() + weatherMap["low"].toDouble()) / 2.0;
// ... and no forecast data for humidity and pressure // ... and no forecast data for humidity and pressure
values[tag("humidity")] = 0; values[tag("humidity")] = 0;
values[tag("pressure")] = 0.0; values[tag("pressure")] = 0.0;

View File

@ -1,7 +1,7 @@
set(SUBPROJECT plasma_applet_desktop-panel) set(SUBPROJECT plasma_applet_desktop-panel)
message(STATUS "Subproject ${SUBPROJECT}") message(STATUS "Subproject ${SUBPROJECT}")
configure_file(metadata.desktop ${CMAKE_CURRENT_SOURCE_DIR}/package/metadata.desktop) configure_file(metadata.json ${CMAKE_CURRENT_SOURCE_DIR}/package/metadata.json)
add_subdirectory(plugin) add_subdirectory(plugin)
plasma_install_package(package org.kde.plasma.desktoppanel) plasma_install_package(package org.kde.plasma.desktoppanel)

View File

@ -1,26 +0,0 @@
[Desktop Entry]
Encoding=UTF-8
Name=Desktop Panel
Comment=A minimalistic Plasmoid
Comment[en]=A minimalistic Plasmoid
Comment[es]=Un plasmoide minimalista
Comment[es]=Un script Plasmoïde minimaliste
Comment[pt_BR]=Um script Plasmoid
Comment[ru]=Минималистичный плазмоид
Comment[uk]=Мінімалістичний плазмоїд
X-KDE-ServiceTypes=Plasma/Applet
Type=Service
Icon=utilities-system-monitor
X-KDE-ServiceTypes=Plasma/Applet
X-Plasma-API=declarativeappletscript
X-Plasma-MainScript=ui/main.qml
X-KDE-PluginInfo-Author=Evgeniy Alekseev aka arcanis
X-KDE-PluginInfo-Email=esalexeev@gmail.com
X-KDE-PluginInfo-Name=org.kde.plasma.desktoppanel
X-KDE-PluginInfo-Version=@PROJECT_VERSION@
X-KDE-PluginInfo-Website=https://arcanis.me/projects/awesome-widgets/
X-KDE-PluginInfo-Category=System Information
X-KDE-PluginInfo-License=GPLv3
X-KDE-PluginInfo-EnabledByDefault=true

View File

@ -1,4 +1,5 @@
{ {
"KPackageStructure": "Plasma/Applet",
"KPlugin": { "KPlugin": {
"Authors": [ "Authors": [
{ {
@ -18,12 +19,8 @@
"Id": "org.kde.plasma.desktoppanel", "Id": "org.kde.plasma.desktoppanel",
"License": "GPLv3", "License": "GPLv3",
"Name": "Desktop Panel", "Name": "Desktop Panel",
"ServiceTypes": [
"Plasma/Applet"
],
"Version": "@PROJECT_VERSION@", "Version": "@PROJECT_VERSION@",
"Website": "https://arcanis.me/projects/awesome-widgets/" "Website": "https://arcanis.me/projects/awesome-widgets/"
}, },
"X-Plasma-API": "declarativeappletscript", "X-Plasma-API-Minimum-Version": "6.0"
"X-Plasma-MainScript": "ui/main.qml"
} }

View File

@ -15,7 +15,7 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/ ***************************************************************************/
import QtQuick 2.0 import QtQuick 2.15
import org.kde.plasma.configuration 2.0 import org.kde.plasma.configuration 2.0

View File

@ -7,88 +7,88 @@
<group name="Widget"> <group name="Widget">
<!-- widget --> <!-- widget -->
<entry name="text" type="string"> <entry name="text" type="String">
<default>[$mark$number/$total: $name]</default> <default>[$mark$number/$total: $name]</default>
</entry> </entry>
</group> </group>
<group name="Advanced"> <group name="Advanced">
<!-- advanced --> <!-- advanced -->
<entry name="background" type="bool"> <entry name="background" type="Bool">
<default>true</default> <default>true</default>
</entry> </entry>
<entry name="verticalLayout" type="bool"> <entry name="verticalLayout" type="Bool">
<default>false</default> <default>false</default>
</entry> </entry>
<entry name="height" type="int"> <entry name="height" type="Int">
<default>0</default> <default>0</default>
</entry> </entry>
<entry name="width" type="int"> <entry name="width" type="Int">
<default>0</default> <default>0</default>
</entry> </entry>
<entry name="mark" type="string"> <entry name="mark" type="String">
<default>¤</default> <default>¤</default>
</entry> </entry>
<entry name="tooltipType" type="string"> <entry name="tooltipType" type="String">
<default>contours</default> <default>contours</default>
</entry> </entry>
<entry name="tooltipWidth" type="int"> <entry name="tooltipWidth" type="Int">
<default>200</default> <default>200</default>
</entry> </entry>
<entry name="tooltipColor" type="string"> <entry name="tooltipColor" type="String">
<default>#ffffff</default> <default>#ffffff</default>
</entry> </entry>
</group> </group>
<group name="Appearance"> <group name="Appearance">
<!-- appearance --> <!-- appearance -->
<entry name="textAlign" type="string"> <entry name="textAlign" type="String">
<default>center</default> <default>center</default>
</entry> </entry>
<entry name="fontFamily" type="string"> <entry name="fontFamily" type="String">
<default>Terminus</default> <default>Terminus</default>
</entry> </entry>
<entry name="fontSize" type="int"> <entry name="fontSize" type="Int">
<default>12</default> <default>12</default>
</entry> </entry>
<entry name="fontColor" type="string"> <entry name="fontColor" type="String">
<default>#000000</default> <default>#000000</default>
</entry> </entry>
<entry name="fontWeight" type="string"> <entry name="fontWeight" type="String">
<default>normal</default> <default>normal</default>
</entry> </entry>
<entry name="fontStyle" type="string"> <entry name="fontStyle" type="String">
<default>normal</default> <default>normal</default>
</entry> </entry>
<entry name="textStyle" type="string"> <entry name="textStyle" type="String">
<default>normal</default> <default>normal</default>
</entry> </entry>
<entry name="textStyleColor" type="string"> <entry name="textStyleColor" type="String">
<default>#000000</default> <default>#000000</default>
</entry> </entry>
<!-- current --> <!-- current -->
<entry name="currentTextAlign" type="string"> <entry name="currentTextAlign" type="String">
<default>center</default> <default>center</default>
</entry> </entry>
<entry name="currentFontFamily" type="string"> <entry name="currentFontFamily" type="String">
<default>Terminus</default> <default>Terminus</default>
</entry> </entry>
<entry name="currentFontSize" type="int"> <entry name="currentFontSize" type="Int">
<default>12</default> <default>12</default>
</entry> </entry>
<entry name="currentFontColor" type="string"> <entry name="currentFontColor" type="String">
<default>#ff0000</default> <default>#ff0000</default>
</entry> </entry>
<entry name="currentFontWeight" type="string"> <entry name="currentFontWeight" type="String">
<default>normal</default> <default>normal</default>
</entry> </entry>
<entry name="currentFontStyle" type="string"> <entry name="currentFontStyle" type="String">
<default>normal</default> <default>normal</default>
</entry> </entry>
<entry name="currentTextStyle" type="string"> <entry name="currentTextStyle" type="String">
<default>normal</default> <default>normal</default>
</entry> </entry>
<entry name="currentTextStyleColor" type="string"> <entry name="currentTextStyleColor" type="String">
<default>#000000</default> <default>#000000</default>
</entry> </entry>
</group> </group>

View File

@ -15,7 +15,7 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/ ***************************************************************************/
import QtQuick 2.0 import QtQuick 2.15
import org.kde.plasma.private.desktoppanel 1.0 import org.kde.plasma.private.desktoppanel 1.0

View File

@ -15,7 +15,7 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/ ***************************************************************************/
import QtQuick 2.0 import QtQuick 2.15
import org.kde.plasma.private.desktoppanel 1.0 import org.kde.plasma.private.desktoppanel 1.0
import "." import "."

View File

@ -15,8 +15,8 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/ ***************************************************************************/
import QtQuick 2.0 import QtQuick 2.15
import QtQuick.Controls 1.3 as QtControls import QtQuick.Controls
import org.kde.plasma.private.desktoppanel 1.0 import org.kde.plasma.private.desktoppanel 1.0
@ -131,7 +131,7 @@ Item {
onValueEdited: cfg_mark = newValue onValueEdited: cfg_mark = newValue
} }
QtControls.GroupBox { GroupBox {
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
title: i18n("Tooltip") title: i18n("Tooltip")

View File

@ -15,7 +15,7 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/ ***************************************************************************/
import QtQuick 2.0 import QtQuick 2.15
import org.kde.plasma.private.desktoppanel 1.0 import org.kde.plasma.private.desktoppanel 1.0
import "." import "."

View File

@ -15,18 +15,17 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/ ***************************************************************************/
import QtQuick 2.4 import QtQuick 2.15
import QtQuick.Controls 1.3 as QtControls import QtQuick.Controls
import QtQuick.Layouts 1.1 import QtQuick.Layouts
import org.kde.plasma.core as PlasmaCore
import org.kde.plasma.plasmoid 2.0 import org.kde.plasma.plasmoid 2.0
import org.kde.plasma.core 2.0 as PlasmaCore
import org.kde.plasma.components 2.0 as PlasmaComponents
import org.kde.plasma.private.desktoppanel 1.0 import org.kde.plasma.private.desktoppanel 1.0
import "." import "."
Item { PlasmoidItem {
id: main id: main
// backend // backend
DPAdds { DPAdds {
@ -46,9 +45,6 @@ Item {
// init // init
Plasmoid.preferredRepresentation: Plasmoid.fullRepresentation
Plasmoid.compactRepresentation: Plasmoid.fullRepresentation
Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter
Plasmoid.icon: "utilities-system-monitor" Plasmoid.icon: "utilities-system-monitor"

View File

@ -15,7 +15,7 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/ ***************************************************************************/
import QtQuick 2.0 import QtQuick 2.15
import org.kde.plasma.private.desktoppanel 1.0 import org.kde.plasma.private.desktoppanel 1.0
import "." import "."

View File

@ -1,26 +0,0 @@
[Desktop Entry]
Encoding=UTF-8
Name=Desktop Panel
Comment=A minimalistic Plasmoid
Comment[en]=A minimalistic Plasmoid
Comment[es]=Un plasmoide minimalista
Comment[es]=Un script Plasmoïde minimaliste
Comment[pt_BR]=Um script Plasmoid
Comment[ru]=Минималистичный плазмоид
Comment[uk]=Мінімалістичний плазмоїд
X-KDE-ServiceTypes=Plasma/Applet
Type=Service
Icon=utilities-system-monitor
X-KDE-ServiceTypes=Plasma/Applet
X-Plasma-API=declarativeappletscript
X-Plasma-MainScript=ui/main.qml
X-KDE-PluginInfo-Author=Evgeniy Alekseev aka arcanis
X-KDE-PluginInfo-Email=esalexeev@gmail.com
X-KDE-PluginInfo-Name=org.kde.plasma.desktoppanel
X-KDE-PluginInfo-Version=3.5.1
X-KDE-PluginInfo-Website=https://arcanis.me/projects/awesome-widgets/
X-KDE-PluginInfo-Category=System Information
X-KDE-PluginInfo-License=GPLv3
X-KDE-PluginInfo-EnabledByDefault=true

View File

@ -0,0 +1,26 @@
{
"KPackageStructure": "Plasma/Applet",
"KPlugin": {
"Authors": [
{
"Email": "esalexeev@gmail.com",
"Name": "Evgeniy Alekseev aka arcanis"
}
],
"Category": "System Information",
"Description": "A minimalistic Plasmoid",
"Description[en]": "A minimalistic Plasmoid",
"Description[es]": "Un script Plasmoïde minimaliste",
"Description[pt_BR]": "Um script Plasmoid",
"Description[ru]": "Минималистичный плазмоид",
"Description[uk]": "Мінімалістичний плазмоїд",
"EnabledByDefault": true,
"Icon": "utilities-system-monitor",
"Id": "org.kde.plasma.desktoppanel",
"License": "GPLv3",
"Name": "Desktop Panel",
"Version": "3.5.1",
"Website": "https://arcanis.me/projects/awesome-widgets/"
},
"X-Plasma-API-Minimum-Version": "6.0"
}

View File

@ -15,6 +15,6 @@ file(GLOB SUBPROJECT_NOTIFY *.notifyrc)
add_library(${PLUGIN_NAME} SHARED ${SUBPROJECT_SOURCE}) add_library(${PLUGIN_NAME} SHARED ${SUBPROJECT_SOURCE})
target_link_libraries(${PLUGIN_NAME} ${Qt_LIBRARIES} ${Kf6_LIBRARIES}) target_link_libraries(${PLUGIN_NAME} ${Qt_LIBRARIES} ${Kf6_LIBRARIES})
install(TARGETS ${PLUGIN_NAME} DESTINATION ${QML_INSTALL_DIR}/org/kde/plasma/private/desktoppanel) install(TARGETS ${PLUGIN_NAME} DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/plasma/private/desktoppanel)
install(FILES qmldir DESTINATION ${QML_INSTALL_DIR}/org/kde/plasma/private/desktoppanel) install(FILES qmldir DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/plasma/private/desktoppanel)
install(FILES ${SUBPROJECT_NOTIFY} DESTINATION ${KDE_INSTALL_KNOTIFYRCDIR}) install(FILES ${SUBPROJECT_NOTIFY} DESTINATION ${KDE_INSTALL_KNOTIFYRCDIR})

View File

@ -223,7 +223,7 @@ QString DPAdds::valueByKey(const QString &_key, int _desktop) const
QString currentMark = currentDesktop() == _desktop ? m_mark : ""; QString currentMark = currentDesktop() == _desktop ? m_mark : "";
if (_key == "mark") if (_key == "mark")
return QString("%1").arg(currentMark, m_mark.count(), QLatin1Char(' ')).replace(" ", "&nbsp;"); return QString("%1").arg(currentMark, m_mark.size(), QLatin1Char(' ')).replace(" ", "&nbsp;");
else if (_key == "name") { else if (_key == "name") {
auto name = m_vdi->desktopNames().at(_desktop); auto name = m_vdi->desktopNames().at(_desktop);
return name.replace(" ", "&nbsp;"); return name.replace(" ", "&nbsp;");

View File

@ -24,4 +24,4 @@ target_link_libraries(${SUBPROJECT}
# install # install
install(TARGETS ${SUBPROJECT} DESTINATION ${KDE_INSTALL_PLUGINDIR}/ksystemstats) install(TARGETS ${SUBPROJECT} DESTINATION ${KDE_INSTALL_PLUGINDIR}/ksystemstats)
install(FILES ${SUBPROJECT_CONF} DESTINATION ${KDE_INSTALL_CONFDIR}) install(FILES ${SUBPROJECT_CONF} DESTINATION /${KDE_INSTALL_CONFDIR})

View File

@ -18,6 +18,8 @@
#include "extsysmon.h" #include "extsysmon.h"
#include <KPluginFactory> #include <KPluginFactory>
#include <QDBusMetaType>
#include <QFile> #include <QFile>
#include <QRegularExpression> #include <QRegularExpression>
#include <QSettings> #include <QSettings>
@ -38,26 +40,13 @@ ExtendedSysMon::ExtendedSysMon(QObject *_parent, const QVariantList &_args)
qCDebug(LOG_ESM) << metadata; qCDebug(LOG_ESM) << metadata;
readConfiguration(); readConfiguration();
addContainer(new ExtSysMonAggregator("extsysmon", "Extended system monitor", this, m_configuration));
addContainer(new ExtSysMonAggregator("extsysmon", "extsysmon", this, m_configuration));
}
ExtendedSysMon::~ExtendedSysMon()
{
qCDebug(LOG_ESM) << __PRETTY_FUNCTION__;
}
void ExtendedSysMon::update()
{
// m_aggregator->update();
} }
void ExtendedSysMon::readConfiguration() void ExtendedSysMon::readConfiguration()
{ {
QString fileName = QStandardPaths::locate(QStandardPaths::ConfigLocation, "plasma-dataengine-extsysmon.conf"); auto fileName = QStandardPaths::locate(QStandardPaths::ConfigLocation, "plasma-dataengine-extsysmon.conf");
qCInfo(LOG_ESM) << "Configuration file" << fileName; qCInfo(LOG_ESM) << "Configuration file" << fileName;
QSettings settings(fileName, QSettings::IniFormat); QSettings settings(fileName, QSettings::IniFormat);
QHash<QString, QString> rawConfig; QHash<QString, QString> rawConfig;
@ -90,13 +79,13 @@ QHash<QString, QString> ExtendedSysMon::updateConfiguration(QHash<QString, QStri
else if ((_rawConfig["GPUDEV"] != "ati") && (_rawConfig["GPUDEV"] != "nvidia")) else if ((_rawConfig["GPUDEV"] != "ati") && (_rawConfig["GPUDEV"] != "nvidia"))
_rawConfig["GPUDEV"] = GPULoadSource::autoGpu(); _rawConfig["GPUDEV"] = GPULoadSource::autoGpu();
// hdddev // hdddev
QStringList allHddDevices = HDDTemperatureSource::allHdd(); auto allHddDevices = HDDTemperatureSource::allHdd();
if (_rawConfig["HDDDEV"] == "all") { if (_rawConfig["HDDDEV"] == "all") {
_rawConfig["HDDDEV"] = allHddDevices.join(','); _rawConfig["HDDDEV"] = allHddDevices.join(',');
} else if (_rawConfig["HDDDEV"] == "disable") { } else if (_rawConfig["HDDDEV"] == "disable") {
_rawConfig["HDDDEV"] = ""; _rawConfig["HDDDEV"] = "";
} else { } else {
QStringList deviceList = _rawConfig["HDDDEV"].split(',', Qt::SkipEmptyParts); auto deviceList = _rawConfig["HDDDEV"].split(',', Qt::SkipEmptyParts);
QStringList devices; QStringList devices;
auto diskRegexp = QRegularExpression("^/dev/[hms]d[a-z]$"); auto diskRegexp = QRegularExpression("^/dev/[hms]d[a-z]$");
for (auto &device : deviceList) for (auto &device : deviceList)

View File

@ -27,12 +27,8 @@ class ExtendedSysMon : public KSysGuard::SensorPlugin
public: public:
explicit ExtendedSysMon(QObject *_parent, const QVariantList &_args); explicit ExtendedSysMon(QObject *_parent, const QVariantList &_args);
~ExtendedSysMon() override;
[[nodiscard]] QString providerName() const override { return QStringLiteral("extsysmon"); } [[nodiscard]] QString providerName() const override { return QStringLiteral("extsysmon"); }
void update() override;
private: private:
// configuration // configuration
QHash<QString, QString> m_configuration; QHash<QString, QString> m_configuration;

View File

@ -32,6 +32,7 @@
#include "quotessource.h" #include "quotessource.h"
#include "requestsource.h" #include "requestsource.h"
#include "systeminfosource.h" #include "systeminfosource.h"
#include "timesource.h"
#include "upgradesource.h" #include "upgradesource.h"
#include "weathersource.h" #include "weathersource.h"
@ -46,73 +47,53 @@ ExtSysMonAggregator::ExtSysMonAggregator(const QString &_id, const QString &_nam
} }
void ExtSysMonAggregator::createSensor(const QString &_id, const QString &_name, AbstractExtSysMonSource *_source)
{
qCDebug(LOG_ESM) << "Register sensor" << _name << "with id" << _id;
addObject(new ExtSysMonSensor(this, _id, _name, _source));
}
void ExtSysMonAggregator::init(const QHash<QString, QString> &_config) void ExtSysMonAggregator::init(const QHash<QString, QString> &_config)
{ {
qCDebug(LOG_ESM) << "Configuration" << _config; qCDebug(LOG_ESM) << "Configuration" << _config;
// battery // battery
auto batteryItem = new BatterySource(this, {_config["ACPIPATH"]}); createSensor("battery", i18n("Battery"), new BatterySource(this, {_config["ACPIPATH"]}));
for (auto &source : batteryItem->sources())
addObject(new ExtSysMonSensor(this, source, batteryItem));
// custom // custom
auto customItem = new CustomSource(this, {}); createSensor("custom", i18n("Scripts"), new CustomSource(this, {}));
for (auto &source : customItem->sources())
addObject(new ExtSysMonSensor(this, source, customItem));
// desktop // desktop
auto desktopItem = new DesktopSource(this, {}); createSensor("desktop", i18n("Desktop"), new DesktopSource(this, {}));
for (auto &source : desktopItem->sources())
addObject(new ExtSysMonSensor(this, source, desktopItem));
// gpu load // gpu load
auto gpuLoadItem = new GPULoadSource(this, {_config["GPUDEV"]}); createSensor("gpuload", i18n("GPU load"), new GPULoadSource(this, {_config["GPUDEV"]}));
for (auto &source : gpuLoadItem->sources())
addObject(new ExtSysMonSensor(this, source, gpuLoadItem));
// gpu temperature // gpu temperature
auto gpuTempItem = new GPUTemperatureSource(this, {_config["GPUDEV"]}); createSensor("gputemp", i18n("GPU temperature"), new GPUTemperatureSource(this, {_config["GPUDEV"]}));
for (auto &source : gpuTempItem->sources())
addObject(new ExtSysMonSensor(this, source, gpuTempItem));
// hdd temperature // hdd temperature
auto hddTempItem createSensor("hdd", i18n("HDD temperature"),
= new HDDTemperatureSource(this, {_config["HDDDEV"], _config["HDDTEMPCMD"]}); new HDDTemperatureSource(this, {_config["HDDDEV"], _config["HDDTEMPCMD"]}));
for (auto &source : hddTempItem->sources())
addObject(new ExtSysMonSensor(this, source, hddTempItem));
// network // network
auto networkItem = new NetworkSource(this, QStringList()); createSensor("network", i18n("Network"), new NetworkSource(this, {}));
for (auto &source : networkItem->sources())
addObject(new ExtSysMonSensor(this, source, networkItem));
// player // player
auto playerItem createSensor("player", i18n("Music player"),
= new PlayerSource(this, {_config["PLAYER"], _config["MPDADDRESS"], _config["MPDPORT"], new PlayerSource(this, {_config["PLAYER"], _config["MPDADDRESS"], _config["MPDPORT"], _config["MPRIS"],
_config["MPRIS"], _config["PLAYERSYMBOLS"]}); _config["PLAYERSYMBOLS"]}));
for (auto &source : playerItem->sources())
addObject(new ExtSysMonSensor(this, source, playerItem));
// processes // processes
auto processesItem = new ProcessesSource(this, {}); createSensor("ps", i18n("Processes"), new ProcessesSource(this, {}));
for (auto &source : processesItem->sources())
addObject(new ExtSysMonSensor(this, source, processesItem));
// network request // network request
auto requestItem = new RequestSource(this, {}); createSensor("requests", i18n("Network requests"), new RequestSource(this, {}));
for (auto &source : requestItem->sources())
addObject(new ExtSysMonSensor(this, source, requestItem));
// quotes // quotes
auto quotesItem = new QuotesSource(this, {}); createSensor("quotes", i18n("Quotes"), new QuotesSource(this, {}));
for (auto &source : quotesItem->sources())
addObject(new ExtSysMonSensor(this, source, quotesItem));
// system // system
auto systemItem = new SystemInfoSource(this, {}); createSensor("system", i18n("System"), new SystemInfoSource(this, {}));
for (auto &source : systemItem->sources()) // current time
addObject(new ExtSysMonSensor(this, source, systemItem)); createSensor("time", i18n("Time"), new TimeSource(this, {}));
// upgrade // upgrade
auto upgradeItem = new UpgradeSource(this, {}); createSensor("upgrade", i18n("Upgrades"), new UpgradeSource(this, {}));
for (auto &source : upgradeItem->sources())
addObject(new ExtSysMonSensor(this, source, upgradeItem));
// weather // weather
auto weatherItem = new WeatherSource(this, {}); createSensor("weather", i18n("Weather"), new WeatherSource(this, {}));
for (auto &source : weatherItem->sources())
addObject(new ExtSysMonSensor(this, source, weatherItem));
#ifdef BUILD_LOAD #ifdef BUILD_LOAD
// additional load source // additional load source
auto loadItem = new LoadSource(this, QStringList()); createSensor("load", i18n("Load"), new LoadSource(this, {}));
for (auto &source : loadItem->sources())
addObject(new ExtSysMonSensor(this, source, loadItem));
#endif /* BUILD_LOAD */ #endif /* BUILD_LOAD */
} }

View File

@ -15,14 +15,17 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/ ***************************************************************************/
#ifndef EXTSYSMONAGGREGATOR_H #pragma once
#define EXTSYSMONAGGREGATOR_H
#include <QObject> #include <QObject>
#include <ksysguard/systemstats/SensorContainer.h> #include <ksysguard/systemstats/SensorContainer.h>
#include "abstractextsysmonsource.h" #include "abstractextsysmonsource.h"
class AbstractExtSysMonSource;
class ExtSysMonSensor;
class ExtSysMonAggregator : public KSysGuard::SensorContainer class ExtSysMonAggregator : public KSysGuard::SensorContainer
{ {
Q_OBJECT Q_OBJECT
@ -32,8 +35,6 @@ public:
const QHash<QString, QString> &_config); const QHash<QString, QString> &_config);
private: private:
void createSensor(const QString &_id, const QString &_name, AbstractExtSysMonSource *_source);
void init(const QHash<QString, QString> &_config); void init(const QHash<QString, QString> &_config);
}; };
#endif /* EXTSYSMONAGGREGATOR_H */

View File

@ -48,12 +48,12 @@ BatterySource::~BatterySource()
QStringList BatterySource::getSources() QStringList BatterySource::getSources()
{ {
QStringList sources; QStringList sources;
sources.append("battery/ac"); sources.append("ac");
sources.append("battery/bat"); sources.append("bat");
sources.append("battery/batleft"); sources.append("batleft");
sources.append("battery/batnow"); sources.append("batnow");
sources.append("battery/batrate"); sources.append("batrate");
sources.append("battery/battotal"); sources.append("battotal");
auto directory = QDir(m_acpiPath); auto directory = QDir(m_acpiPath);
@ -63,11 +63,11 @@ QStringList BatterySource::getSources()
qCInfo(LOG_ESS) << "Init batteries count as" << m_batteriesCount; qCInfo(LOG_ESS) << "Init batteries count as" << m_batteriesCount;
for (int i = 0; i < m_batteriesCount; i++) { for (int i = 0; i < m_batteriesCount; i++) {
sources.append(QString("battery/bat%1").arg(i)); sources.append(QString("bat%1").arg(i));
sources.append(QString("battery/batleft%1").arg(i)); sources.append(QString("batleft%1").arg(i));
sources.append(QString("battery/batnow%1").arg(i)); sources.append(QString("batnow%1").arg(i));
sources.append(QString("battery/batrate%1").arg(i)); sources.append(QString("batrate%1").arg(i));
sources.append(QString("battery/battotal%1").arg(i)); sources.append(QString("battotal%1").arg(i));
} }
} }
@ -82,8 +82,7 @@ QVariant BatterySource::data(const QString &_source)
if (!m_values.contains(_source)) if (!m_values.contains(_source))
run(); run();
QVariant value = m_values.take(_source); return m_values.take(_source);
return value;
} }
@ -92,65 +91,65 @@ KSysGuard::SensorInfo *BatterySource::initialData(const QString &_source) const
qCDebug(LOG_ESS) << "Source" << _source; qCDebug(LOG_ESS) << "Source" << _source;
auto data = new KSysGuard::SensorInfo(); auto data = new KSysGuard::SensorInfo();
if (_source == "battery/ac") { if (_source == "ac") {
data->name = "Is AC online or not"; data->name = "Is AC online or not";
data->variantType = QVariant::Bool; data->variantType = QVariant::Bool;
data->unit = KSysGuard::UnitNone; data->unit = KSysGuard::UnitNone;
} else if (_source == "battery/bat") { } else if (_source == "bat") {
data->min = 0; data->min = 0;
data->max = 100; data->max = 100;
data->name = "Average battery usage"; data->name = "Average battery usage";
data->variantType = QVariant::Int; data->variantType = QVariant::Int;
data->unit = KSysGuard::UnitPercent; data->unit = KSysGuard::UnitPercent;
} else if (_source == "battery/batleft") { } else if (_source == "batleft") {
data->min = 0; data->min = 0;
data->max = 0; data->max = 0;
data->name = "Battery discharge time"; data->name = "Battery discharge time";
data->variantType = QVariant::Int; data->variantType = QVariant::Int;
data->unit = KSysGuard::UnitSecond; data->unit = KSysGuard::UnitSecond;
} else if (_source == "battery/batnow") { } else if (_source == "batnow") {
data->min = 0; data->min = 0;
data->max = 0; data->max = 0;
data->name = "Current battery capacity"; data->name = "Current battery capacity";
data->variantType = QVariant::Int; data->variantType = QVariant::Int;
data->unit = KSysGuard::UnitNone; data->unit = KSysGuard::UnitNone;
} else if (_source == "battery/batrate") { } else if (_source == "batrate") {
data->min = 0; data->min = 0;
data->max = 0; data->max = 0;
data->name = "Average battery discharge rate"; data->name = "Average battery discharge rate";
data->variantType = QVariant::Double; data->variantType = QVariant::Double;
data->unit = KSysGuard::UnitRate; data->unit = KSysGuard::UnitRate;
} else if (_source == "battery/battotal") { } else if (_source == "battotal") {
data->min = 0; data->min = 0;
data->max = 0; data->max = 0;
data->name = "Full battery capacity"; data->name = "Full battery capacity";
data->variantType = QVariant::Int; data->variantType = QVariant::Int;
data->unit = KSysGuard::UnitNone; data->unit = KSysGuard::UnitNone;
} else if (_source.startsWith("battery/batleft")) { } else if (_source.startsWith("batleft")) {
data->min = 0; data->min = 0;
data->max = 0; data->max = 0;
data->name = QString("Battery %1 discharge time").arg(index(_source)); data->name = QString("Battery %1 discharge time").arg(index(_source));
data->variantType = QVariant::Int; data->variantType = QVariant::Int;
data->unit = KSysGuard::UnitSecond; data->unit = KSysGuard::UnitSecond;
} else if (_source.startsWith("battery/batnow")) { } else if (_source.startsWith("batnow")) {
data->min = 0; data->min = 0;
data->max = 0; data->max = 0;
data->name = QString("Battery %1 capacity").arg(index(_source)); data->name = QString("Battery %1 capacity").arg(index(_source));
data->variantType = QVariant::Int; data->variantType = QVariant::Int;
data->unit = KSysGuard::UnitNone; data->unit = KSysGuard::UnitNone;
} else if (_source.startsWith("battery/battotal")) { } else if (_source.startsWith("battotal")) {
data->min = 0; data->min = 0;
data->max = 0; data->max = 0;
data->name = QString("Battery %1 full capacity").arg(index(_source)); data->name = QString("Battery %1 full capacity").arg(index(_source));
data->variantType = QVariant::Int; data->variantType = QVariant::Int;
data->unit = KSysGuard::UnitNone; data->unit = KSysGuard::UnitNone;
} else if (_source.startsWith("battery/batrate")) { } else if (_source.startsWith("batrate")) {
data->min = 0; data->min = 0;
data->max = 0; data->max = 0;
data->name = QString("Battery %1 discharge rate").arg(index(_source)); data->name = QString("Battery %1 discharge rate").arg(index(_source));
data->variantType = QVariant::Double; data->variantType = QVariant::Double;
data->unit = KSysGuard::UnitRate; data->unit = KSysGuard::UnitRate;
} else if (_source.startsWith("battery/bat")) { } else if (_source.startsWith("bat")) {
data->min = 0; data->min = 0;
data->max = 100; data->max = 100;
data->name = QString("Battery %1 usage").arg(index(_source)); data->name = QString("Battery %1 usage").arg(index(_source));
@ -167,7 +166,7 @@ void BatterySource::run()
// adaptor // adaptor
QFile acFile(QString("%1/AC/online").arg(m_acpiPath)); QFile acFile(QString("%1/AC/online").arg(m_acpiPath));
if (acFile.open(QIODevice::ReadOnly | QIODevice::Text)) if (acFile.open(QIODevice::ReadOnly | QIODevice::Text))
m_values["battery/ac"] = (QString(acFile.readLine()).trimmed().toInt() == 1); m_values["ac"] = (QString(acFile.readLine()).trimmed().toInt() == 1);
acFile.close(); acFile.close();
// batteries // batteries
@ -178,28 +177,27 @@ void BatterySource::run()
if (currentLevelFile.open(QIODevice::ReadOnly | QIODevice::Text)) { if (currentLevelFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
auto value = QString(currentLevelFile.readLine()).toInt(); auto value = QString(currentLevelFile.readLine()).toInt();
m_trend[i + 1].append(value); m_trend[i + 1].append(value);
m_values[QString("battery/batnow%1").arg(i)] = value; m_values[QString("batnow%1").arg(i)] = value;
} }
currentLevelFile.close(); currentLevelFile.close();
// total // total
QFile fullLevelFile(QString("%1/BAT%2/energy_full").arg(m_acpiPath).arg(i)); QFile fullLevelFile(QString("%1/BAT%2/energy_full").arg(m_acpiPath).arg(i));
if (fullLevelFile.open(QIODevice::ReadOnly | QIODevice::Text)) if (fullLevelFile.open(QIODevice::ReadOnly | QIODevice::Text))
m_values[QString("battery/battotal%1").arg(i)] = QString(fullLevelFile.readLine()).toInt(); m_values[QString("battotal%1").arg(i)] = QString(fullLevelFile.readLine()).toInt();
fullLevelFile.close(); fullLevelFile.close();
m_values[QString("battery/bat%1").arg(i)] m_values[QString("bat%1").arg(i)] = static_cast<int>(100 * m_values[QString("batnow%1").arg(i)].toFloat()
= static_cast<int>(100 * m_values[QString("battery/batnow%1").arg(i)].toFloat() / m_values[QString("battotal%1").arg(i)].toFloat());
/ m_values[QString("battery/battotal%1").arg(i)].toFloat());
// accumulate // accumulate
currentLevel += m_values[QString("battery/batnow%1").arg(i)].toFloat(); currentLevel += m_values[QString("batnow%1").arg(i)].toFloat();
fullLevel += m_values[QString("battery/battotal%1").arg(i)].toFloat(); fullLevel += m_values[QString("battotal%1").arg(i)].toFloat();
} }
// total // total
m_trend[0].append(static_cast<int>(currentLevel)); m_trend[0].append(static_cast<int>(currentLevel));
m_values["battery/batnow"] = static_cast<int>(currentLevel); m_values["batnow"] = static_cast<int>(currentLevel);
m_values["battery/battotal"] = static_cast<int>(fullLevel); m_values["battotal"] = static_cast<int>(fullLevel);
m_values["battery/bat"] = static_cast<int>(100 * currentLevel / fullLevel); m_values["bat"] = static_cast<int>(100 * currentLevel / fullLevel);
calculateRates(); calculateRates();
} }
@ -245,15 +243,14 @@ void BatterySource::calculateRates()
for (int i = 0; i < m_batteriesCount; i++) { for (int i = 0; i < m_batteriesCount; i++) {
auto approx = approximate(m_trend[i + 1]); auto approx = approximate(m_trend[i + 1]);
m_values[QString("battery/batrate%1").arg(i)] = approx / interval; m_values[QString("batrate%1").arg(i)] = approx / interval;
m_values[QString("battery/batleft%1").arg(i)] m_values[QString("batleft%1").arg(i)] = interval * m_values[QString("batnow%1").arg(i)].toFloat() / approx;
= interval * m_values[QString("battery/batnow%1").arg(i)].toFloat() / approx;
} }
// total // total
auto approx = approximate(m_trend[0]); auto approx = approximate(m_trend[0]);
m_values["battery/batrate"] = approx / interval; m_values["batrate"] = approx / interval;
m_values["battery/batleft"] = interval * m_values["battery/batnow"].toFloat() / approx; m_values["batleft"] = interval * m_values["batnow"].toFloat() / approx;
// old data cleanup // old data cleanup
for (auto &trend : m_trend.keys()) { for (auto &trend : m_trend.keys()) {

View File

@ -74,7 +74,7 @@ QStringList CustomSource::getSources()
{ {
QStringList sources; QStringList sources;
for (auto &item : m_extScripts->activeItems()) for (auto &item : m_extScripts->activeItems())
sources.append(QString("custom/%1").arg(item->tag("custom"))); sources.append(item->tag("custom"));
return sources; return sources;
} }

View File

@ -51,13 +51,13 @@ QVariant DesktopSource::data(const QString &_source)
auto decrement = KWindowSystem::isPlatformX11() ? 1 : 0; auto decrement = KWindowSystem::isPlatformX11() ? 1 : 0;
auto current = nativeIndex - decrement; auto current = nativeIndex - decrement;
if (_source == "desktop/current/name") { if (_source == "name") {
return m_vdi->desktopNames().at(current); return m_vdi->desktopNames().at(current);
} else if (_source == "desktop/current/number") { } else if (_source == "number") {
return current + 1; return current + 1;
} else if (_source == "desktop/total/name") { } else if (_source == "names") {
return m_vdi->desktopNames(); return m_vdi->desktopNames();
} else if (_source == "desktop/total/number") { } else if (_source == "count") {
return m_vdi->numberOfDesktops(); return m_vdi->numberOfDesktops();
} }
@ -70,20 +70,20 @@ KSysGuard::SensorInfo *DesktopSource::initialData(const QString &_source) const
qCDebug(LOG_ESS) << "Source" << _source; qCDebug(LOG_ESS) << "Source" << _source;
auto data = new KSysGuard::SensorInfo(); auto data = new KSysGuard::SensorInfo();
if (_source == "desktop/current/name") { if (_source == "name") {
data->name = "Current desktop name"; data->name = "Current desktop name";
data->variantType = QVariant::String; data->variantType = QVariant::String;
data->unit = KSysGuard::UnitNone; data->unit = KSysGuard::UnitNone;
} else if (_source == "desktop/current/number") { } else if (_source == "number") {
data->min = 0; data->min = 0;
data->name = "Current desktop number"; data->name = "Current desktop number";
data->variantType = QVariant::Int; data->variantType = QVariant::Int;
data->unit = KSysGuard::UnitNone; data->unit = KSysGuard::UnitNone;
} else if (_source == "desktop/total/name") { } else if (_source == "names") {
data->name = "All desktops by name"; data->name = "All desktops by name";
data->variantType = QVariant::StringList; data->variantType = QVariant::StringList;
data->unit = KSysGuard::UnitNone; data->unit = KSysGuard::UnitNone;
} else if (_source == "desktop/total/number") { } else if (_source == "count") {
data->min = 0; data->min = 0;
data->name = "Desktops count"; data->name = "Desktops count";
data->variantType = QVariant::Int; data->variantType = QVariant::Int;
@ -97,10 +97,10 @@ KSysGuard::SensorInfo *DesktopSource::initialData(const QString &_source) const
QStringList DesktopSource::sources() const QStringList DesktopSource::sources() const
{ {
QStringList sources; QStringList sources;
sources.append("desktop/current/name"); sources.append("name");
sources.append("desktop/current/number"); sources.append("number");
sources.append("desktop/total/name"); sources.append("names");
sources.append("desktop/total/number"); sources.append("count");
return sources; return sources;
} }

View File

@ -17,23 +17,66 @@
#include "extsysmonsensor.h" #include "extsysmonsensor.h"
#include <QTimer>
#include "abstractextsysmonsource.h" #include "abstractextsysmonsource.h"
#include "awdebug.h" #include "awdebug.h"
ExtSysMonSensor::ExtSysMonSensor(KSysGuard::SensorContainer *_parent, const QString &_id, ExtSysMonSensor::ExtSysMonSensor(KSysGuard::SensorContainer *_parent, const QString &_id, const QString &_name,
AbstractExtSysMonSource *_source) AbstractExtSysMonSource *_source)
: KSysGuard::SensorObject(_id, _parent) : KSysGuard::SensorObject(_id, _name, _parent)
, m_source(_source)
, m_timer(new QTimer(this))
{ {
qCDebug(LOG_ESS) << __PRETTY_FUNCTION__; qCDebug(LOG_ESS) << __PRETTY_FUNCTION__;
m_source = _source; loadProperties();
connect(this, &SensorObject::subscribedChanged, [this](bool _state) { changeSubscription(_state); });
connect(m_timer, &QTimer::timeout, [this]() { update(); });
}
ExtSysMonSensor::~ExtSysMonSensor()
{
qCDebug(LOG_ESS) << __PRETTY_FUNCTION__;
m_timer->stop();
m_timer->deleteLater();
}
void ExtSysMonSensor::changeSubscription(bool _subscribed)
{
qCDebug(LOG_ESS) << "Subscription changed to" << _subscribed;
if (_subscribed) {
m_timer->start(1000);
} else {
m_timer->stop();
}
}
void ExtSysMonSensor::update()
{
for (auto &source : m_source->sources()) { for (auto &source : m_source->sources()) {
auto property = new KSysGuard::SensorProperty(source, this); auto property = sensor(source);
if (!property->isSubscribed())
continue; // skip properties which are not explicitly subscribed
auto value = m_source->data(source);
property->setValue(value);
}
}
void ExtSysMonSensor::loadProperties()
{
for (auto &source : m_source->sources()) {
auto info = m_source->initialData(source); auto info = m_source->initialData(source);
property->setName(info->name); auto property = new KSysGuard::SensorProperty(source, info->name, this);
property->setUnit(info->unit); property->setUnit(info->unit);
property->setVariantType(info->variantType); property->setVariantType(info->variantType);
@ -41,15 +84,6 @@ ExtSysMonSensor::ExtSysMonSensor(KSysGuard::SensorContainer *_parent, const QStr
property->setMin(info->min); property->setMin(info->min);
property->setMax(info->max); property->setMax(info->max);
m_properties[source] = property; addProperty(property);
}
}
void ExtSysMonSensor::update()
{
for (auto &source : m_properties.keys()) {
auto value = m_source->data(source);
m_properties[source]->setValue(value);
} }
} }

View File

@ -22,19 +22,23 @@
class AbstractExtSysMonSource; class AbstractExtSysMonSource;
class QTimer;
class ExtSysMonSensor : public KSysGuard::SensorObject class ExtSysMonSensor : public KSysGuard::SensorObject
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit ExtSysMonSensor(KSysGuard::SensorContainer *_parent, const QString &_id, AbstractExtSysMonSource *_source); explicit ExtSysMonSensor(KSysGuard::SensorContainer *_parent, const QString &_id, const QString &_name,
~ExtSysMonSensor() override = default; AbstractExtSysMonSource *_source);
~ExtSysMonSensor() override;
void changeSubscription(bool _subscribed);
void update(); void update();
private: private:
QHash<QString, KSysGuard::SensorProperty *> m_properties; void loadProperties();
AbstractExtSysMonSource *m_source = nullptr; AbstractExtSysMonSource *m_source = nullptr;
QTimer *m_timer = nullptr;
}; };

View File

@ -75,7 +75,7 @@ QVariant GPULoadSource::data(const QString &_source)
{ {
qCDebug(LOG_ESS) << "Source" << _source; qCDebug(LOG_ESS) << "Source" << _source;
if (_source == "gpu/load") if (_source == "load")
run(); run();
return m_values[_source]; return m_values[_source];
@ -87,7 +87,7 @@ KSysGuard::SensorInfo *GPULoadSource::initialData(const QString &_source) const
qCDebug(LOG_ESS) << "Source" << _source; qCDebug(LOG_ESS) << "Source" << _source;
auto data = new KSysGuard::SensorInfo(); auto data = new KSysGuard::SensorInfo();
if (_source == "gpu/load") { if (_source == "load") {
data->min = 0.0; data->min = 0.0;
data->max = 100.0; data->max = 100.0;
data->name = "GPU usage"; data->name = "GPU usage";
@ -115,7 +115,7 @@ void GPULoadSource::run()
QStringList GPULoadSource::sources() const QStringList GPULoadSource::sources() const
{ {
QStringList sources; QStringList sources;
sources.append("gpu/load"); sources.append("load");
return sources; return sources;
} }
@ -134,7 +134,7 @@ void GPULoadSource::updateValue()
if (!str.contains("<gpu_util>")) if (!str.contains("<gpu_util>"))
continue; continue;
auto load = str.remove("<gpu_util>").remove("</gpu_util>").remove('%'); auto load = str.remove("<gpu_util>").remove("</gpu_util>").remove('%');
m_values["gpu/load"] = load.toFloat(); m_values["load"] = load.toFloat();
break; break;
} }
} else if (m_device == "ati") { } else if (m_device == "ati") {
@ -142,7 +142,7 @@ void GPULoadSource::updateValue()
if (!str.contains("load")) if (!str.contains("load"))
continue; continue;
QString load = str.split(' ', Qt::SkipEmptyParts)[3].remove('%'); QString load = str.split(' ', Qt::SkipEmptyParts)[3].remove('%');
m_values["gpu/load"] = load.toFloat(); m_values["load"] = load.toFloat();
break; break;
} }
} }

View File

@ -55,7 +55,7 @@ QVariant GPUTemperatureSource::data(const QString &_source)
{ {
qCDebug(LOG_ESS) << "Source" << _source; qCDebug(LOG_ESS) << "Source" << _source;
if (_source == "gpu/temperature") if (_source == "temperature")
run(); run();
return m_values[_source]; return m_values[_source];
@ -67,7 +67,7 @@ KSysGuard::SensorInfo *GPUTemperatureSource::initialData(const QString &_source)
qCDebug(LOG_ESS) << "Source" << _source; qCDebug(LOG_ESS) << "Source" << _source;
auto data = new KSysGuard::SensorInfo(); auto data = new KSysGuard::SensorInfo();
if (_source == "gpu/temperature") { if (_source == "temperature") {
data->min = 0.0; data->min = 0.0;
data->max = 0.0; data->max = 0.0;
data->name = "GPU temperature"; data->name = "GPU temperature";
@ -95,7 +95,7 @@ void GPUTemperatureSource::run()
QStringList GPUTemperatureSource::sources() const QStringList GPUTemperatureSource::sources() const
{ {
QStringList sources; QStringList sources;
sources.append("gpu/temperature"); sources.append("temperature");
return sources; return sources;
} }
@ -114,7 +114,7 @@ void GPUTemperatureSource::updateValue()
if (!str.contains("<gpu_temp>")) if (!str.contains("<gpu_temp>"))
continue; continue;
QString temp = str.remove("<gpu_temp>").remove("C</gpu_temp>"); QString temp = str.remove("<gpu_temp>").remove("C</gpu_temp>");
m_values["gpu/temperature"] = temp.toFloat(); m_values["temperature"] = temp.toFloat();
break; break;
} }
} else if (m_device == "ati") { } else if (m_device == "ati") {
@ -122,7 +122,7 @@ void GPUTemperatureSource::updateValue()
if (!str.contains("Temperature")) if (!str.contains("Temperature"))
continue; continue;
QString temp = str.split(' ', Qt::SkipEmptyParts).at(4); QString temp = str.split(' ', Qt::SkipEmptyParts).at(4);
m_values["gpu/temperature"] = temp.toFloat(); m_values["temperature"] = temp.toFloat();
break; break;
} }
} }

View File

@ -77,7 +77,7 @@ QVariant HDDTemperatureSource::data(const QString &_source)
qCDebug(LOG_ESS) << "Source" << _source; qCDebug(LOG_ESS) << "Source" << _source;
QString device = _source; QString device = _source;
device.remove("hdd/temperature"); device.remove("temperature");
// run cmd // run cmd
if (m_processes[device]->state() == QProcess::NotRunning) { if (m_processes[device]->state() == QProcess::NotRunning) {
auto cmd = m_cmd.first(); auto cmd = m_cmd.first();
@ -95,7 +95,7 @@ KSysGuard::SensorInfo *HDDTemperatureSource::initialData(const QString &_source)
qCDebug(LOG_ESS) << "Source" << _source; qCDebug(LOG_ESS) << "Source" << _source;
auto device = _source; auto device = _source;
device.remove("hdd/temperature"); device.remove("temperature");
auto data = new KSysGuard::SensorInfo(); auto data = new KSysGuard::SensorInfo();
data->min = 0.0; data->min = 0.0;
@ -112,7 +112,7 @@ QStringList HDDTemperatureSource::sources() const
{ {
QStringList sources; QStringList sources;
for (auto &device : m_devices) for (auto &device : m_devices)
sources.append(QString("hdd/temperature%1").arg(device)); sources.append(QString("temperature%1").arg(device));
return sources; return sources;
} }

View File

@ -53,7 +53,7 @@ KSysGuard::SensorInfo *LoadSource::initialData(const QString &_source) const
qCDebug(LOG_ESS) << "Source" << _source; qCDebug(LOG_ESS) << "Source" << _source;
auto data = new KSysGuard::SensorInfo(); auto data = new KSysGuard::SensorInfo();
if (_source.startsWith("load/load")) { if (_source.startsWith("load")) {
data->min = 0; data->min = 0;
data->max = 0; data->max = 0;
data->name = "Simple sources for load tests"; data->name = "Simple sources for load tests";
@ -69,7 +69,7 @@ QStringList LoadSource::sources() const
{ {
QStringList sources; QStringList sources;
for (int i = 0; i < 1000; i++) for (int i = 0; i < 1000; i++)
sources.append(QString("load/load%1").arg(i)); sources.append(QString("load%1").arg(i));
return sources; return sources;
} }

View File

@ -65,11 +65,11 @@ KSysGuard::SensorInfo *NetworkSource::initialData(const QString &_source) const
qCDebug(LOG_ESS) << "Source" << _source; qCDebug(LOG_ESS) << "Source" << _source;
auto data = new KSysGuard::SensorInfo(); auto data = new KSysGuard::SensorInfo();
if (_source == "network/current/name") { if (_source == "device") {
data->name = "Current network device name"; data->name = "Current network device name";
data->variantType = QVariant::String; data->variantType = QVariant::String;
data->unit = KSysGuard::UnitNone; data->unit = KSysGuard::UnitNone;
} else if (_source == "network/current/ssid") { } else if (_source == "ssid") {
data->name = "Current SSID name"; data->name = "Current SSID name";
data->variantType = QVariant::String; data->variantType = QVariant::String;
data->unit = KSysGuard::UnitNone; data->unit = KSysGuard::UnitNone;
@ -81,16 +81,18 @@ KSysGuard::SensorInfo *NetworkSource::initialData(const QString &_source) const
void NetworkSource::run() void NetworkSource::run()
{ {
m_values["network/current/name"] = NetworkSource::getCurrentDevice(); m_values["device"] = NetworkSource::getCurrentDevice();
m_process->start("iwgetid", QStringList() << "-r"); if (m_process->state() == QProcess::ProcessState::NotRunning) {
m_process->start("iwgetid", {"-r"});
}
} }
QStringList NetworkSource::sources() const QStringList NetworkSource::sources() const
{ {
QStringList sources; QStringList sources;
sources.append("network/current/name"); sources.append("device");
sources.append("network/current/ssid"); sources.append("ssid");
return sources; return sources;
} }
@ -104,7 +106,7 @@ void NetworkSource::updateSsid()
QString qoutput = QString::fromUtf8(m_process->readAllStandardOutput()).trimmed(); QString qoutput = QString::fromUtf8(m_process->readAllStandardOutput()).trimmed();
qCInfo(LOG_ESS) << "Output" << qoutput; qCInfo(LOG_ESS) << "Output" << qoutput;
m_values["network/current/ssid"] = qoutput; m_values["ssid"] = qoutput;
} }

View File

@ -95,51 +95,51 @@ KSysGuard::SensorInfo *PlayerSource::initialData(const QString &_source) const
qCDebug(LOG_ESS) << "Source" << _source; qCDebug(LOG_ESS) << "Source" << _source;
auto data = new KSysGuard::SensorInfo(); auto data = new KSysGuard::SensorInfo();
if (_source == "player/album") { if (_source == "album") {
data->name = "Current song album"; data->name = "Current song album";
data->variantType = QVariant::String; data->variantType = QVariant::String;
data->unit = KSysGuard::UnitNone; data->unit = KSysGuard::UnitNone;
} else if (_source == "player/salbum") { } else if (_source == "salbum") {
data->name = QString("Current song album (%1 symbols)").arg(m_symbols); data->name = QString("Current song album (%1 symbols)").arg(m_symbols);
data->variantType = QVariant::String; data->variantType = QVariant::String;
data->unit = KSysGuard::UnitNone; data->unit = KSysGuard::UnitNone;
} else if (_source == "player/dalbum") { } else if (_source == "dalbum") {
data->name = QString("Current song album (%1 symbols, dynamic)").arg(m_symbols); data->name = QString("Current song album (%1 symbols, dynamic)").arg(m_symbols);
data->variantType = QVariant::String; data->variantType = QVariant::String;
data->unit = KSysGuard::UnitNone; data->unit = KSysGuard::UnitNone;
} else if (_source == "player/artist") { } else if (_source == "artist") {
data->name = "Current song artist"; data->name = "Current song artist";
data->variantType = QVariant::String; data->variantType = QVariant::String;
data->unit = KSysGuard::UnitNone; data->unit = KSysGuard::UnitNone;
} else if (_source == "player/sartist") { } else if (_source == "sartist") {
data->name = QString("Current song artist (%1 symbols)").arg(m_symbols); data->name = QString("Current song artist (%1 symbols)").arg(m_symbols);
data->variantType = QVariant::String; data->variantType = QVariant::String;
data->unit = KSysGuard::UnitNone; data->unit = KSysGuard::UnitNone;
} else if (_source == "player/dartist") { } else if (_source == "dartist") {
data->name = QString("Current song artist (%1 symbols, dynamic)").arg(m_symbols); data->name = QString("Current song artist (%1 symbols, dynamic)").arg(m_symbols);
data->variantType = QVariant::String; data->variantType = QVariant::String;
data->unit = KSysGuard::UnitNone; data->unit = KSysGuard::UnitNone;
} else if (_source == "player/duration") { } else if (_source == "duration") {
data->min = 0; data->min = 0;
data->max = 0; data->max = 0;
data->name = "Current song duration"; data->name = "Current song duration";
data->variantType = QVariant::Int; data->variantType = QVariant::Int;
data->unit = KSysGuard::UnitSecond; data->unit = KSysGuard::UnitSecond;
} else if (_source == "player/progress") { } else if (_source == "progress") {
data->min = 0; data->min = 0;
data->max = 0; data->max = 0;
data->name = "Current song progress"; data->name = "Current song progress";
data->variantType = QVariant::Int; data->variantType = QVariant::Int;
data->unit = KSysGuard::UnitSecond; data->unit = KSysGuard::UnitSecond;
} else if (_source == "player/title") { } else if (_source == "title") {
data->name = "Current song title"; data->name = "Current song title";
data->variantType = QVariant::String; data->variantType = QVariant::String;
data->unit = KSysGuard::UnitNone; data->unit = KSysGuard::UnitNone;
} else if (_source == "player/stitle") { } else if (_source == "stitle") {
data->name = QString("Current song title (%1 symbols)").arg(m_symbols); data->name = QString("Current song title (%1 symbols)").arg(m_symbols);
data->variantType = QVariant::String; data->variantType = QVariant::String;
data->unit = KSysGuard::UnitNone; data->unit = KSysGuard::UnitNone;
} else if (_source == "player/dtitle") { } else if (_source == "dtitle") {
data->name = QString("Current song title (%1 symbols, dynamic)").arg(m_symbols); data->name = QString("Current song title (%1 symbols, dynamic)").arg(m_symbols);
data->variantType = QVariant::String; data->variantType = QVariant::String;
data->unit = KSysGuard::UnitNone; data->unit = KSysGuard::UnitNone;
@ -166,33 +166,30 @@ void PlayerSource::run()
// dymanic properties // dymanic properties
// solid // solid
m_values["player/salbum"] = stripString(m_values["player/album"].toString(), m_symbols); m_values["salbum"] = stripString(m_values["album"].toString(), m_symbols);
m_values["player/sartist"] = stripString(m_values["player/artist"].toString(), m_symbols); m_values["sartist"] = stripString(m_values["artist"].toString(), m_symbols);
m_values["player/stitle"] = stripString(m_values["player/title"].toString(), m_symbols); m_values["stitle"] = stripString(m_values["title"].toString(), m_symbols);
// dynamic // dynamic
m_values["player/dalbum"] m_values["dalbum"] = buildString(m_values["dalbum"].toString(), m_values["album"].toString(), m_symbols);
= buildString(m_values["player/dalbum"].toString(), m_values["player/album"].toString(), m_symbols); m_values["dartist"] = buildString(m_values["dartist"].toString(), m_values["artist"].toString(), m_symbols);
m_values["player/dartist"] m_values["dtitle"] = buildString(m_values["dtitle"].toString(), m_values["title"].toString(), m_symbols);
= buildString(m_values["player/dartist"].toString(), m_values["player/artist"].toString(), m_symbols);
m_values["player/dtitle"]
= buildString(m_values["player/dtitle"].toString(), m_values["player/title"].toString(), m_symbols);
} }
QStringList PlayerSource::sources() const QStringList PlayerSource::sources() const
{ {
QStringList sources; QStringList sources;
sources.append("player/album"); sources.append("album");
sources.append("player/dalbum"); sources.append("dalbum");
sources.append("player/salbum"); sources.append("salbum");
sources.append("player/artist"); sources.append("artist");
sources.append("player/dartist"); sources.append("dartist");
sources.append("player/sartist"); sources.append("sartist");
sources.append("player/duration"); sources.append("duration");
sources.append("player/progress"); sources.append("progress");
sources.append("player/title"); sources.append("title");
sources.append("player/dtitle"); sources.append("dtitle");
sources.append("player/stitle"); sources.append("stitle");
return sources; return sources;
} }
@ -245,10 +242,10 @@ void PlayerSource::mpdSocketReadyRead()
// there are one more time... // there are one more time...
if ((metadata == "time") && (data.contains(':'))) { if ((metadata == "time") && (data.contains(':'))) {
QStringList times = data.split(':'); QStringList times = data.split(':');
m_mpdCached["player/duration"] = times.at(0).toInt(); m_mpdCached["duration"] = times.at(0).toInt();
m_mpdCached["player/progress"] = times.at(1).toInt(); m_mpdCached["progress"] = times.at(1).toInt();
} else if (m_metadata.contains(metadata)) { } else if (m_metadata.contains(metadata)) {
m_mpdCached[QString("player/%1").arg(metadata)] = data; m_mpdCached[metadata] = data;
} }
} }
} }
@ -266,11 +263,11 @@ void PlayerSource::mpdSocketWritten(const qint64 _bytes)
QVariantHash PlayerSource::defaultInfo() QVariantHash PlayerSource::defaultInfo()
{ {
QVariantHash info; QVariantHash info;
info["player/album"] = "unknown"; info["album"] = "unknown";
info["player/artist"] = "unknown"; info["artist"] = "unknown";
info["player/duration"] = 0; info["duration"] = 0;
info["player/progress"] = 0; info["progress"] = 0;
info["player/title"] = "unknown"; info["title"] = "unknown";
return info; return info;
} }
@ -321,11 +318,11 @@ QVariantHash PlayerSource::getPlayerMprisInfo(const QString &_mpris)
// another portion of dirty magic // another portion of dirty magic
auto map = qdbus_cast<QVariantHash>( auto map = qdbus_cast<QVariantHash>(
response.arguments().first().value<QDBusVariant>().variant().value<QDBusArgument>()); response.arguments().first().value<QDBusVariant>().variant().value<QDBusArgument>());
info["player/album"] = map.value("xesam:album", "unknown"); info["album"] = map.value("xesam:album", "unknown");
// artist is array // artist is array
info["player/artist"] = map.value("xesam:artist", "unknown").toString(); info["artist"] = map.value("xesam:artist", "unknown").toString();
info["player/duration"] = map.value("mpris:length", 0).toInt() / (1000 * 1000); info["duration"] = map.value("mpris:length", 0).toInt() / (1000 * 1000);
info["player/title"] = map.value("xesam:title", "unknown"); info["title"] = map.value("xesam:title", "unknown");
} }
// position // position
@ -336,8 +333,7 @@ QVariantHash PlayerSource::getPlayerMprisInfo(const QString &_mpris)
qCWarning(LOG_ESS) << "Error message" << response.errorMessage(); qCWarning(LOG_ESS) << "Error message" << response.errorMessage();
} else { } else {
// this cast is simpler than the previous one ;) // this cast is simpler than the previous one ;)
info["player/progress"] info["progress"] = response.arguments().first().value<QDBusVariant>().variant().toLongLong() / (1000 * 1000);
= response.arguments().first().value<QDBusVariant>().variant().toLongLong() / (1000 * 1000);
} }
return info; return info;

View File

@ -56,17 +56,17 @@ KSysGuard::SensorInfo *ProcessesSource::initialData(const QString &_source) cons
qCDebug(LOG_ESS) << "Source" << _source; qCDebug(LOG_ESS) << "Source" << _source;
auto data = new KSysGuard::SensorInfo(); auto data = new KSysGuard::SensorInfo();
if (_source == "ps/running/count") { if (_source == "running") {
data->min = 0; data->min = 0;
data->max = 0; data->max = 0;
data->name = "Count of running processes"; data->name = "Count of running processes";
data->variantType = QVariant::Int; data->variantType = QVariant::Int;
data->unit = KSysGuard::UnitNone; data->unit = KSysGuard::UnitNone;
} else if (_source == "ps/running/list") { } else if (_source == "list") {
data->name = "All running processes list"; data->name = "All running processes list";
data->variantType = QVariant::StringList; data->variantType = QVariant::StringList;
data->unit = KSysGuard::UnitNone; data->unit = KSysGuard::UnitNone;
} else if (_source == "ps/total/count") { } else if (_source == "count") {
data->min = 0; data->min = 0;
data->max = 0; data->max = 0;
data->name = "Total count of processes"; data->name = "Total count of processes";
@ -99,18 +99,18 @@ void ProcessesSource::run()
cmdFile.close(); cmdFile.close();
} }
m_values["ps/running/count"] = running.count(); m_values["running"] = running.count();
m_values["ps/running/list"] = running; m_values["list"] = running;
m_values["ps/total/count"] = directories.count(); m_values["count"] = directories.count();
} }
QStringList ProcessesSource::sources() const QStringList ProcessesSource::sources() const
{ {
QStringList sources; QStringList sources;
sources.append("ps/running/count"); sources.append("running");
sources.append("ps/running/list"); sources.append("list");
sources.append("ps/total/count"); sources.append("count");
return sources; return sources;
} }

View File

@ -48,14 +48,12 @@ QVariant QuotesSource::data(const QString &_source)
qCDebug(LOG_ESS) << "Source" << _source; qCDebug(LOG_ESS) << "Source" << _source;
int ind = index(_source); int ind = index(_source);
auto service = _source; if (!m_values.contains(_source)) {
service.remove("quotes/");
if (!m_values.contains(service)) {
QVariantHash data = m_extQuotes->itemByTagNumber(ind)->run(); QVariantHash data = m_extQuotes->itemByTagNumber(ind)->run();
for (auto &key : data.keys()) for (auto &key : data.keys())
m_values[key] = data[key]; m_values[key] = data[key];
} }
QVariant value = m_values.take(service); QVariant value = m_values.take(_source);
return value; return value;
} }
@ -66,37 +64,37 @@ KSysGuard::SensorInfo *QuotesSource::initialData(const QString &_source) const
int ind = index(_source); int ind = index(_source);
auto data = new KSysGuard::SensorInfo; auto data = new KSysGuard::SensorInfo;
if (_source.startsWith("quotes/pricechg")) { if (_source.startsWith("pricechg")) {
data->min = 0.0; data->min = 0.0;
data->max = 0.0; data->max = 0.0;
data->name = QString("Absolute price changes for '%1'").arg(m_extQuotes->itemByTagNumber(ind)->uniq()); data->name = QString("Absolute price changes for '%1'").arg(m_extQuotes->itemByTagNumber(ind)->uniq());
data->variantType = QVariant::Double; data->variantType = QVariant::Double;
data->unit = KSysGuard::UnitNone; data->unit = KSysGuard::UnitNone;
} else if (_source.startsWith("quotes/price")) { } else if (_source.startsWith("price")) {
data->min = 0.0; data->min = 0.0;
data->max = 0.0; data->max = 0.0;
data->name = QString("Price for '%1'").arg(m_extQuotes->itemByTagNumber(ind)->uniq()); data->name = QString("Price for '%1'").arg(m_extQuotes->itemByTagNumber(ind)->uniq());
data->variantType = QVariant::Double; data->variantType = QVariant::Double;
data->unit = KSysGuard::UnitNone; data->unit = KSysGuard::UnitNone;
} else if (_source.startsWith("quotes/percpricechg")) { } else if (_source.startsWith("percpricechg")) {
data->min = -100.0; data->min = -100.0;
data->max = 100.0; data->max = 100.0;
data->name = QString("Price changes for '%1'").arg(m_extQuotes->itemByTagNumber(ind)->uniq()); data->name = QString("Price changes for '%1'").arg(m_extQuotes->itemByTagNumber(ind)->uniq());
data->variantType = QVariant::Double; data->variantType = QVariant::Double;
data->unit = KSysGuard::UnitPercent; data->unit = KSysGuard::UnitPercent;
} else if (_source.startsWith("quotes/volumechg")) { } else if (_source.startsWith("volumechg")) {
data->min = 0; data->min = 0;
data->max = 0; data->max = 0;
data->name = QString("Absolute volume changes for '%1'").arg(m_extQuotes->itemByTagNumber(ind)->uniq()); data->name = QString("Absolute volume changes for '%1'").arg(m_extQuotes->itemByTagNumber(ind)->uniq());
data->variantType = QVariant::Int; data->variantType = QVariant::Int;
data->unit = KSysGuard::UnitNone; data->unit = KSysGuard::UnitNone;
} else if (_source.startsWith("quotes/volume")) { } else if (_source.startsWith("volume")) {
data->min = 0; data->min = 0;
data->max = 0; data->max = 0;
data->name = QString("Volume for '%1'").arg(m_extQuotes->itemByTagNumber(ind)->uniq()); data->name = QString("Volume for '%1'").arg(m_extQuotes->itemByTagNumber(ind)->uniq());
data->variantType = QVariant::Int; data->variantType = QVariant::Int;
data->unit = KSysGuard::UnitNone; data->unit = KSysGuard::UnitNone;
} else if (_source.startsWith("quotes/percvolumechg")) { } else if (_source.startsWith("percvolumechg")) {
data->min = -100.0; data->min = -100.0;
data->max = 100.0; data->max = 100.0;
data->name = QString("Volume changes for '%1'").arg(m_extQuotes->itemByTagNumber(ind)->uniq()); data->name = QString("Volume changes for '%1'").arg(m_extQuotes->itemByTagNumber(ind)->uniq());
@ -118,12 +116,12 @@ QStringList QuotesSource::getSources()
{ {
QStringList sources; QStringList sources;
for (auto &item : m_extQuotes->activeItems()) { for (auto &item : m_extQuotes->activeItems()) {
sources.append(QString("quotes/%1").arg(item->tag("price"))); sources.append(item->tag("price"));
sources.append(QString("quotes/%1").arg(item->tag("pricechg"))); sources.append(item->tag("pricechg"));
sources.append(QString("quotes/%1").arg(item->tag("percpricechg"))); sources.append(item->tag("percpricechg"));
sources.append(QString("quotes/%1").arg(item->tag("volume"))); sources.append(item->tag("volume"));
sources.append(QString("quotes/%1").arg(item->tag("volumechg"))); sources.append(item->tag("volumechg"));
sources.append(QString("quotes/%1").arg(item->tag("percvolumechg"))); sources.append(item->tag("percvolumechg"));
} }
return sources; return sources;

View File

@ -48,14 +48,12 @@ QVariant RequestSource::data(const QString &_source)
qCDebug(LOG_ESS) << "Source" << _source; qCDebug(LOG_ESS) << "Source" << _source;
int ind = index(_source); int ind = index(_source);
auto service = _source; if (!m_values.contains(_source)) {
service.remove("network/");
if (!m_values.contains(service)) {
QVariantHash data = m_extNetRequest->itemByTagNumber(ind)->run(); QVariantHash data = m_extNetRequest->itemByTagNumber(ind)->run();
for (auto &key : data.keys()) for (auto &key : data.keys())
m_values[key] = data[key]; m_values[key] = data[key];
} }
QVariant value = m_values.take(service); QVariant value = m_values.take(_source);
return value; return value;
} }
@ -66,7 +64,7 @@ KSysGuard::SensorInfo *RequestSource::initialData(const QString &_source) const
int ind = index(_source); int ind = index(_source);
auto data = new KSysGuard::SensorInfo(); auto data = new KSysGuard::SensorInfo();
if (_source.startsWith("network/response")) { if (_source.startsWith("response")) {
data->name = QString("Network response for %1").arg(m_extNetRequest->itemByTagNumber(ind)->uniq()); data->name = QString("Network response for %1").arg(m_extNetRequest->itemByTagNumber(ind)->uniq());
data->variantType = QVariant::String; data->variantType = QVariant::String;
data->unit = KSysGuard::UnitNone; data->unit = KSysGuard::UnitNone;
@ -86,7 +84,7 @@ QStringList RequestSource::getSources()
{ {
QStringList sources; QStringList sources;
for (auto &item : m_extNetRequest->activeItems()) for (auto &item : m_extNetRequest->activeItems())
sources.append(QString("network/%1").arg(item->tag("response"))); sources.append(item->tag("response"));
return sources; return sources;
} }

View File

@ -59,13 +59,13 @@ KSysGuard::SensorInfo *SystemInfoSource::initialData(const QString &_source) con
qCDebug(LOG_ESS) << "Source" << _source; qCDebug(LOG_ESS) << "Source" << _source;
auto data = new KSysGuard::SensorInfo(); auto data = new KSysGuard::SensorInfo();
if (_source == "system/brightness") { if (_source == "brightness") {
data->min = 0.0; data->min = 0.0;
data->max = 100.0; data->max = 100.0;
data->name = "Screen brightness"; data->name = "Screen brightness";
data->variantType = QVariant::Double; data->variantType = QVariant::Double;
data->unit = KSysGuard::UnitPercent; data->unit = KSysGuard::UnitPercent;
} else if (_source == "system/volume") { } else if (_source == "volume") {
data->min = 0.0; data->min = 0.0;
data->max = 100.0; data->max = 100.0;
data->name = "Master volume"; data->name = "Master volume";
@ -79,16 +79,16 @@ KSysGuard::SensorInfo *SystemInfoSource::initialData(const QString &_source) con
void SystemInfoSource::run() void SystemInfoSource::run()
{ {
m_values["system/brightness"] = SystemInfoSource::getCurrentBrightness(); m_values["brightness"] = SystemInfoSource::getCurrentBrightness();
m_values["system/volume"] = SystemInfoSource::getCurrentVolume(); m_values["volume"] = SystemInfoSource::getCurrentVolume();
} }
QStringList SystemInfoSource::sources() const QStringList SystemInfoSource::sources() const
{ {
QStringList sources; QStringList sources;
sources.append("system/brightness"); sources.append("brightness");
sources.append("system/volume"); sources.append("volume");
return sources; return sources;
} }
@ -100,24 +100,24 @@ QVariant SystemInfoSource::fromDBusVariant(const QVariant &value)
} }
float SystemInfoSource::getCurrentBrightness() double SystemInfoSource::getCurrentBrightness()
{ {
qCDebug(LOG_ESS) << "Get current brightness"; qCDebug(LOG_ESS) << "Get current brightness";
auto maxBrightness auto maxBrightness
= sendDBusRequest("org.kde.Solid.PowerManagement", "/org/kde/Solid/PowerManagement/Actions/BrightnessControl", = sendDBusRequest("org.kde.Solid.PowerManagement", "/org/kde/Solid/PowerManagement/Actions/BrightnessControl",
"org.kde.Solid.PowerManagement.Actions.BrightnessControl", "brightnessMax") "org.kde.Solid.PowerManagement.Actions.BrightnessControl", "brightnessMax")
.toFloat(); .toDouble();
auto brightness auto brightness
= sendDBusRequest("org.kde.Solid.PowerManagement", "/org/kde/Solid/PowerManagement/Actions/BrightnessControl", = sendDBusRequest("org.kde.Solid.PowerManagement", "/org/kde/Solid/PowerManagement/Actions/BrightnessControl",
"org.kde.Solid.PowerManagement.Actions.BrightnessControl", "brightness") "org.kde.Solid.PowerManagement.Actions.BrightnessControl", "brightness")
.toFloat(); .toDouble();
return std::round(100.0f * brightness / maxBrightness); return std::round(100.0 * brightness / maxBrightness);
} }
float SystemInfoSource::getCurrentVolume() double SystemInfoSource::getCurrentVolume()
{ {
qCDebug(LOG_ESS) << "Get current volume"; qCDebug(LOG_ESS) << "Get current volume";
@ -129,7 +129,7 @@ float SystemInfoSource::getCurrentVolume()
if (currentMixer.isEmpty()) { if (currentMixer.isEmpty()) {
qCWarning(LOG_ESS) << "Mixer is empty"; qCWarning(LOG_ESS) << "Mixer is empty";
return std::numeric_limits<float>::quiet_NaN(); return std::numeric_limits<double>::quiet_NaN();
} }
currentMixer.replace(":", "_").replace(".", "_").replace("-", "_"); currentMixer.replace(":", "_").replace(".", "_").replace("-", "_");
@ -140,14 +140,14 @@ float SystemInfoSource::getCurrentVolume()
.toString(); .toString();
if (currentControl.isEmpty()) { if (currentControl.isEmpty()) {
qCWarning(LOG_ESS) << "Control is empty"; qCWarning(LOG_ESS) << "Control is empty";
return std::numeric_limits<float>::quiet_NaN(); return std::numeric_limits<double>::quiet_NaN();
} }
currentControl.replace(":", "_").replace(".", "_").replace("-", "_"); currentControl.replace(":", "_").replace(".", "_").replace("-", "_");
auto path = QString("/Mixers/%1/%2").arg(currentMixer).arg(currentControl); auto path = QString("/Mixers/%1/%2").arg(currentMixer).arg(currentControl);
return fromDBusVariant(sendDBusRequest("org.kde.kmix", path, "org.freedesktop.DBus.Properties", "Get", return fromDBusVariant(sendDBusRequest("org.kde.kmix", path, "org.freedesktop.DBus.Properties", "Get",
QVariantList({"org.kde.KMix.Control", "volume"}))) QVariantList({"org.kde.KMix.Control", "volume"})))
.toFloat(); .toDouble();
} }

View File

@ -39,8 +39,8 @@ private:
// configuration and values // configuration and values
QVariantHash m_values; QVariantHash m_values;
static QVariant fromDBusVariant(const QVariant &value); static QVariant fromDBusVariant(const QVariant &value);
static float getCurrentBrightness(); static double getCurrentBrightness();
static float getCurrentVolume(); static double getCurrentVolume();
static QVariant sendDBusRequest(const QString &destination, const QString &path, const QString &interface, static QVariant sendDBusRequest(const QString &destination, const QString &path, const QString &interface,
const QString &method, const QVariantList &args = QVariantList()); const QString &method, const QVariantList &args = QVariantList());
}; };

View File

@ -0,0 +1,62 @@
/***************************************************************************
* 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 "timesource.h"
#include <ksysguard/formatter/Unit.h>
#include <ksysguard/systemstats/SensorInfo.h>
#include "awdebug.h"
TimeSource::TimeSource(QObject *_parent, const QStringList &_args)
: AbstractExtSysMonSource(_parent, _args)
{
Q_ASSERT(_args.count() == 0);
qCDebug(LOG_ESS) << __PRETTY_FUNCTION__;
}
QVariant TimeSource::data(const QString &_source)
{
qCDebug(LOG_ESS) << "Source" << _source;
if (_source == "now") {
return QDateTime::currentSecsSinceEpoch();
}
return {};
}
KSysGuard::SensorInfo *TimeSource::initialData(const QString &_source) const
{
qCDebug(LOG_ESS) << "Source" << _source;
auto data = new KSysGuard::SensorInfo();
data->name = "Current time";
data->variantType = QVariant::LongLong;
data->unit = KSysGuard::UnitSecond;
return data;
}
QStringList TimeSource::sources() const
{
return QStringList({"now"});
}

View File

@ -0,0 +1,36 @@
/***************************************************************************
* 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/ *
***************************************************************************/
#pragma once
#include <QObject>
#include "abstractextsysmonsource.h"
#include "extitemaggregator.h"
class TimeSource : public AbstractExtSysMonSource
{
Q_OBJECT
public:
explicit TimeSource(QObject *_parent, const QStringList &_args);
QVariant data(const QString &_source) override;
[[nodiscard]] KSysGuard::SensorInfo *initialData(const QString &_source) const override;
void run() override{};
[[nodiscard]] QStringList sources() const override;
};

View File

@ -75,7 +75,7 @@ QStringList UpgradeSource::getSources()
{ {
QStringList sources; QStringList sources;
for (auto &item : m_extUpgrade->activeItems()) for (auto &item : m_extUpgrade->activeItems())
sources.append(QString("upgrade/%1").arg(item->tag("pkgcount"))); sources.append(item->tag("pkgcount"));
return sources; return sources;
} }

View File

@ -48,15 +48,11 @@ QVariant WeatherSource::data(const QString &_source)
qCDebug(LOG_ESS) << "Source" << _source; qCDebug(LOG_ESS) << "Source" << _source;
int ind = index(_source); int ind = index(_source);
auto service = _source; if (!m_values.contains(_source)) {
service.remove("weather/"); auto data = m_extWeather->itemByTagNumber(ind)->run();
if (!m_values.contains(service)) { m_values.insert(data);
QVariantHash data = m_extWeather->itemByTagNumber(ind)->run();
for (auto &key : data.keys())
m_values[key] = data[key];
} }
QVariant value = m_values.take(service); return m_values.take(_source);
return value;
} }
@ -66,37 +62,37 @@ KSysGuard::SensorInfo *WeatherSource::initialData(const QString &_source) const
int ind = index(_source); int ind = index(_source);
auto data = new KSysGuard::SensorInfo(); auto data = new KSysGuard::SensorInfo();
if (_source.startsWith("weather/weatherId")) { if (_source.startsWith("weatherId")) {
data->min = 0; data->min = 0;
data->max = 1000; data->max = 1000;
data->name = QString("Numeric weather ID for '%1'").arg(m_extWeather->itemByTagNumber(ind)->uniq()); data->name = QString("Numeric weather ID for '%1'").arg(m_extWeather->itemByTagNumber(ind)->uniq());
data->variantType = QVariant::Int; data->variantType = QVariant::Int;
data->unit = KSysGuard::UnitNone; data->unit = KSysGuard::UnitNone;
} else if (_source.startsWith("weather/weather")) { } else if (_source.startsWith("weather")) {
data->name = QString("ID string map for '%1'").arg(m_extWeather->itemByTagNumber(ind)->uniq()); data->name = QString("ID string map for '%1'").arg(m_extWeather->itemByTagNumber(ind)->uniq());
data->variantType = QVariant::String; data->variantType = QVariant::String;
data->unit = KSysGuard::UnitNone; data->unit = KSysGuard::UnitNone;
} else if (_source.startsWith("weather/humidity")) { } else if (_source.startsWith("humidity")) {
data->min = 0; data->min = 0;
data->max = 100; data->max = 100;
data->name = QString("Humidity for '%1'").arg(m_extWeather->itemByTagNumber(ind)->uniq()); data->name = QString("Humidity for '%1'").arg(m_extWeather->itemByTagNumber(ind)->uniq());
data->variantType = QVariant::Int; data->variantType = QVariant::Int;
data->unit = KSysGuard::UnitPercent; data->unit = KSysGuard::UnitPercent;
} else if (_source.startsWith("weather/pressure")) { } else if (_source.startsWith("pressure")) {
data->min = 0; data->min = 0;
data->max = 0; data->max = 0;
data->name = QString("Atmospheric pressure for '%1'").arg(m_extWeather->itemByTagNumber(ind)->uniq()); data->name = QString("Atmospheric pressure for '%1'").arg(m_extWeather->itemByTagNumber(ind)->uniq());
data->variantType = QVariant::Int; data->variantType = QVariant::Int;
data->unit = KSysGuard::UnitNone; data->unit = KSysGuard::UnitNone;
} else if (_source.startsWith("weather/temperature")) { } else if (_source.startsWith("temperature")) {
data->min = 0.0; data->min = 0.0;
data->max = 0.0; data->max = 0.0;
data->name = QString("Temperature for '%1'").arg(m_extWeather->itemByTagNumber(ind)->uniq()); data->name = QString("Temperature for '%1'").arg(m_extWeather->itemByTagNumber(ind)->uniq());
data->variantType = QVariant::Double; data->variantType = QVariant::Double;
data->unit = KSysGuard::UnitCelsius; data->unit = KSysGuard::UnitCelsius;
} else if (_source.startsWith("weather/timestamp")) { } else if (_source.startsWith("timestamp")) {
data->name = QString("Timestamp for '%1'").arg(m_extWeather->itemByTagNumber(ind)->uniq()); data->name = QString("Timestamp for '%1'").arg(m_extWeather->itemByTagNumber(ind)->uniq());
data->variantType = QVariant::String; data->variantType = QVariant::DateTime;
data->unit = KSysGuard::UnitNone; data->unit = KSysGuard::UnitNone;
} }
@ -114,12 +110,12 @@ QStringList WeatherSource::getSources()
{ {
QStringList sources; QStringList sources;
for (auto &item : m_extWeather->activeItems()) { for (auto &item : m_extWeather->activeItems()) {
sources.append(QString("weather/%1").arg(item->tag("weatherId"))); sources.append(item->tag("weatherId"));
sources.append(QString("weather/%1").arg(item->tag("weather"))); sources.append(item->tag("weather"));
sources.append(QString("weather/%1").arg(item->tag("humidity"))); sources.append(item->tag("humidity"));
sources.append(QString("weather/%1").arg(item->tag("pressure"))); sources.append(item->tag("pressure"));
sources.append(QString("weather/%1").arg(item->tag("temperature"))); sources.append(item->tag("temperature"));
sources.append(QString("weather/%1").arg(item->tag("timestamp"))); sources.append(item->tag("timestamp"));
} }
return sources; return sources;

View File

@ -18,13 +18,15 @@ set(Qt_LIBRARIES
# kf6 libraries # kf6 libraries
find_package(ECM 0.0.11 REQUIRED NO_MODULE) find_package(ECM 0.0.11 REQUIRED NO_MODULE)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR}) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH})
find_package(KF6 REQUIRED COMPONENTS I18n Notifications Service WindowSystem) find_package(KF6 REQUIRED COMPONENTS I18n Notifications Service WindowSystem)
find_package(KSysGuard REQUIRED)
find_package(LibTaskManager REQUIRED) find_package(LibTaskManager REQUIRED)
find_package(Plasma REQUIRED) find_package(Plasma REQUIRED)
find_package(KSysGuard REQUIRED)
include(KDEInstallDirs) include(KDEInstallDirs)
include(KDECMakeSettings) include(KDECMakeSettings)
include(KDECompilerSettings) include(KDECompilerSettings)
set(Kf6_INCLUDE ${KDE_INSTALL_FULL_INCLUDEDIR_KF}) set(Kf6_INCLUDE ${KDE_INSTALL_FULL_INCLUDEDIR_KF})
set(Kf6_LIBRARIES KF6::CoreAddons KF6::I18n KF6::Notifications KF6::WindowSystem KSysGuard::Sensors KSysGuard::SensorFaces KSysGuard::SystemStats PW::LibTaskManager) set(Kf6_LIBRARIES KF6::CoreAddons KF6::I18n KF6::Notifications KF6::WindowSystem KSysGuard::Sensors KSysGuard::SensorFaces KSysGuard::SystemStats PW::LibTaskManager)

View File

@ -20,9 +20,9 @@ include_directories(
set(AWTESTLIBRARY_HEADERS awtestlibrary.h) set(AWTESTLIBRARY_HEADERS awtestlibrary.h)
set(AWTESTLIBRARY_SOURCES awtestlibrary.cpp) set(AWTESTLIBRARY_SOURCES awtestlibrary.cpp)
add_library(${SUBPROJECT}-awtest STATIC ${AWTESTLIBRARY_SOURCES} ${AWTESTLIBRARY_HEADERS}) add_library(${SUBPROJECT}-awtest STATIC ${AWTESTLIBRARY_SOURCES} ${AWTESTLIBRARY_HEADERS})
target_link_libraries(${SUBPROJECT}-awtest ${Qt_LIBRARIES} ${Qt5Test_LIBRARIES} ${Kf6_LIBRARIES}) target_link_libraries(${SUBPROJECT}-awtest ${Qt_LIBRARIES} ${Qt6Test_LIBRARIES} ${Kf6_LIBRARIES})
set(LIBRARY_TEST_SET ${SUBPROJECT}-awtest ${PROJECT_LIBRARY} ${PROJECT_MONITORSOURCES} set(LIBRARY_TEST_SET ${SUBPROJECT}-awtest ${PROJECT_LIBRARY} ${PROJECT_MONITORSOURCES}
${Qt_LIBRARIES} ${Kf6_LIBRARIES} ${Qt5Test_LIBRARIES}) ${Qt_LIBRARIES} ${Kf6_LIBRARIES} ${Qt6Test_LIBRARIES})
# modules # modules
set(TEST_MODULES set(TEST_MODULES

View File

@ -16,12 +16,12 @@ foreach (_current_PO_FILE ${_po_files})
install( install(
FILES ${CMAKE_CURRENT_BINARY_DIR}/${_lang}.gmo FILES ${CMAKE_CURRENT_BINARY_DIR}/${_lang}.gmo
DESTINATION ${LOCALE_INSTALL_DIR}/${_lang}/LC_MESSAGES/ DESTINATION ${KDE_INSTALL_LOCALEDIR}/${_lang}/LC_MESSAGES/
RENAME ${MO_NAME} RENAME ${MO_NAME}
) )
install( install(
FILES ${CMAKE_CURRENT_BINARY_DIR}/${_lang}.gmo FILES ${CMAKE_CURRENT_BINARY_DIR}/${_lang}.gmo
DESTINATION ${LOCALE_INSTALL_DIR}/${_lang}/LC_MESSAGES/ DESTINATION ${KDE_INSTALL_LOCALEDIR}/${_lang}/LC_MESSAGES/
RENAME ${SND_MO_NAME} RENAME ${SND_MO_NAME}
) )
list(APPEND _gmoFiles ${_gmoFile}) list(APPEND _gmoFiles ${_gmoFile})