Compare commits

..

12 Commits

Author SHA1 Message Date
63f1aa8125 release alpha2 2024-03-27 02:36:13 +02:00
3c8bf1baf1 test cases update 2024-03-27 02:30:08 +02:00
3f20aa8878 massive qml edit 2024-03-27 01:45:35 +02:00
4fcea42e8e qml improvements 2024-03-26 15:41:34 +02:00
0b2b58bd33 gpu support 2024-03-26 10:39:09 +02:00
7b60e8a42f disablle deskttop soourec 2024-03-25 15:31:42 +02:00
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
117 changed files with 1092 additions and 2540 deletions

View File

@ -27,10 +27,10 @@ jobs:
run: pacman -Sy --noconfirm base-devel cmake extra-cmake-modules python util-linux-libs xorg-server-xvfb run: pacman -Sy --noconfirm base-devel cmake extra-cmake-modules python util-linux-libs xorg-server-xvfb
- name: install dependencies - name: install dependencies
run: pacman -S --noconfirm plasma-workspace ksysguard run: pacman -S --noconfirm plasma-workspace
- name: configure cmake - name: configure cmake
run: cmake -B build -DKDE_INSTALL_USE_QT_SYS_PATHS=ON -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DBUILD_FUTURE=ON -DBUILD_TESTING=ON sources run: cmake -B build -S sources -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DBUILD_FUTURE=ON -DBUILD_TESTING=ON
- name: build - name: build
working-directory: /repo/build working-directory: /repo/build

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,30 @@
# 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.0alpha2
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=("mpd: for music player monitor")
"hddtemp: for HDD temperature monitor"
"smartmontools: for HDD temperature monitor"
"mpd: for music player 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 \
-DCMAKE_INSTALL_PREFIX=/usr \
-DBUILD_FUTURE=ON \ -DBUILD_FUTURE=ON \
"../${_pkgname}" -DBUILD_TESTING=OFF
make cmake --build build
} }
package() { package() {
cd "${srcdir}/build" DESTDIR="$pkgdir" cmake --install build
make DESTDIR="${pkgdir}" install
} }
sha256sums=('b2a7b07a1df6f710f4e0d6e5898933f4ddb131818b922dc4b8e48afe3e98a664')

284
sensors
View File

@ -1,284 +0,0 @@
cpu
cpu/all
cpu/all/averageFrequency
cpu/all/averageTemperature
cpu/all/coreCount
cpu/all/cpuCount
cpu/all/maximumFrequency
cpu/all/maximumTemperature
cpu/all/minimumFrequency
cpu/all/minimumTemperature
cpu/all/name
cpu/all/system
cpu/all/usage
cpu/all/user
cpu/all/wait
cpu/cpu0
cpu/cpu0/frequency
cpu/cpu0/name
cpu/cpu0/system
cpu/cpu0/temperature
cpu/cpu0/usage
cpu/cpu0/user
cpu/cpu0/wait
cpu/cpu1
cpu/cpu1/frequency
cpu/cpu1/name
cpu/cpu1/system
cpu/cpu1/temperature
cpu/cpu1/usage
cpu/cpu1/user
cpu/cpu1/wait
cpu/cpu10
cpu/cpu10/frequency
cpu/cpu10/name
cpu/cpu10/system
cpu/cpu10/temperature
cpu/cpu10/usage
cpu/cpu10/user
cpu/cpu10/wait
cpu/cpu11
cpu/cpu11/frequency
cpu/cpu11/name
cpu/cpu11/system
cpu/cpu11/temperature
cpu/cpu11/usage
cpu/cpu11/user
cpu/cpu11/wait
cpu/cpu12
cpu/cpu12/frequency
cpu/cpu12/name
cpu/cpu12/system
cpu/cpu12/temperature
cpu/cpu12/usage
cpu/cpu12/user
cpu/cpu12/wait
cpu/cpu13
cpu/cpu13/frequency
cpu/cpu13/name
cpu/cpu13/system
cpu/cpu13/temperature
cpu/cpu13/usage
cpu/cpu13/user
cpu/cpu13/wait
cpu/cpu14
cpu/cpu14/frequency
cpu/cpu14/name
cpu/cpu14/system
cpu/cpu14/temperature
cpu/cpu14/usage
cpu/cpu14/user
cpu/cpu14/wait
cpu/cpu15
cpu/cpu15/frequency
cpu/cpu15/name
cpu/cpu15/system
cpu/cpu15/temperature
cpu/cpu15/usage
cpu/cpu15/user
cpu/cpu15/wait
cpu/cpu16
cpu/cpu16/frequency
cpu/cpu16/name
cpu/cpu16/system
cpu/cpu16/temperature
cpu/cpu16/usage
cpu/cpu16/user
cpu/cpu16/wait
cpu/cpu17
cpu/cpu17/frequency
cpu/cpu17/name
cpu/cpu17/system
cpu/cpu17/temperature
cpu/cpu17/usage
cpu/cpu17/user
cpu/cpu17/wait
cpu/cpu18
cpu/cpu18/frequency
cpu/cpu18/name
cpu/cpu18/system
cpu/cpu18/temperature
cpu/cpu18/usage
cpu/cpu18/user
cpu/cpu18/wait
cpu/cpu19
cpu/cpu19/frequency
cpu/cpu19/name
cpu/cpu19/system
cpu/cpu19/temperature
cpu/cpu19/usage
cpu/cpu19/user
cpu/cpu19/wait
cpu/cpu2
cpu/cpu2/frequency
cpu/cpu2/name
cpu/cpu2/system
cpu/cpu2/temperature
cpu/cpu2/usage
cpu/cpu2/user
cpu/cpu2/wait
cpu/cpu3
cpu/cpu3/frequency
cpu/cpu3/name
cpu/cpu3/system
cpu/cpu3/temperature
cpu/cpu3/usage
cpu/cpu3/user
cpu/cpu3/wait
cpu/cpu4
cpu/cpu4/frequency
cpu/cpu4/name
cpu/cpu4/system
cpu/cpu4/temperature
cpu/cpu4/usage
cpu/cpu4/user
cpu/cpu4/wait
cpu/cpu5
cpu/cpu5/frequency
cpu/cpu5/name
cpu/cpu5/system
cpu/cpu5/temperature
cpu/cpu5/usage
cpu/cpu5/user
cpu/cpu5/wait
cpu/cpu6
cpu/cpu6/frequency
cpu/cpu6/name
cpu/cpu6/system
cpu/cpu6/temperature
cpu/cpu6/usage
cpu/cpu6/user
cpu/cpu6/wait
cpu/cpu7
cpu/cpu7/frequency
cpu/cpu7/name
cpu/cpu7/system
cpu/cpu7/temperature
cpu/cpu7/usage
cpu/cpu7/user
cpu/cpu7/wait
cpu/cpu8
cpu/cpu8/frequency
cpu/cpu8/name
cpu/cpu8/system
cpu/cpu8/temperature
cpu/cpu8/usage
cpu/cpu8/user
cpu/cpu8/wait
cpu/cpu9
cpu/cpu9/frequency
cpu/cpu9/name
cpu/cpu9/system
cpu/cpu9/temperature
cpu/cpu9/usage
cpu/cpu9/user
cpu/cpu9/wait
cpu/loadaverages
cpu/loadaverages/loadaverage1
cpu/loadaverages/loadaverage15
cpu/loadaverages/loadaverage5
disk
disk/52e29d18-ad4d-47ad-98c4-a09ab0914a85
disk/52e29d18-ad4d-47ad-98c4-a09ab0914a85/free
disk/52e29d18-ad4d-47ad-98c4-a09ab0914a85/freePercent
disk/52e29d18-ad4d-47ad-98c4-a09ab0914a85/name
disk/52e29d18-ad4d-47ad-98c4-a09ab0914a85/read
disk/52e29d18-ad4d-47ad-98c4-a09ab0914a85/total
disk/52e29d18-ad4d-47ad-98c4-a09ab0914a85/used
disk/52e29d18-ad4d-47ad-98c4-a09ab0914a85/usedPercent
disk/52e29d18-ad4d-47ad-98c4-a09ab0914a85/write
disk/all
disk/all/free
disk/all/freePercent
disk/all/read
disk/all/total
disk/all/used
disk/all/usedPercent
disk/all/write
disk/d10dd7bf-e382-4e44-83d7-9af6c6df7258
disk/d10dd7bf-e382-4e44-83d7-9af6c6df7258/free
disk/d10dd7bf-e382-4e44-83d7-9af6c6df7258/freePercent
disk/d10dd7bf-e382-4e44-83d7-9af6c6df7258/name
disk/d10dd7bf-e382-4e44-83d7-9af6c6df7258/read
disk/d10dd7bf-e382-4e44-83d7-9af6c6df7258/total
disk/d10dd7bf-e382-4e44-83d7-9af6c6df7258/used
disk/d10dd7bf-e382-4e44-83d7-9af6c6df7258/usedPercent
disk/d10dd7bf-e382-4e44-83d7-9af6c6df7258/write
disk/nvme0n1
disk/nvme0n1/name
disk/nvme0n1/read
disk/nvme0n1/total
disk/nvme0n1/write
gpu
lmsensors
lmsensors/BAT0-acpi-0
lmsensors/BAT0-acpi-0/in0
lmsensors/acpitz-acpi-0
lmsensors/acpitz-acpi-0/temp1
lmsensors/iwlwifi_1-virtual-0
lmsensors/iwlwifi_1-virtual-0/temp1
lmsensors/nvme-pci-0400
lmsensors/nvme-pci-0400/temp1
lmsensors/thinkpad-isa-0000
lmsensors/thinkpad-isa-0000/fan1
lmsensors/thinkpad-isa-0000/fan2
lmsensors/thinkpad-isa-0000/temp1
lmsensors/thinkpad-isa-0000/temp2
lmsensors/thinkpad-isa-0000/temp3
lmsensors/thinkpad-isa-0000/temp4
lmsensors/thinkpad-isa-0000/temp5
lmsensors/thinkpad-isa-0000/temp6
lmsensors/thinkpad-isa-0000/temp7
lmsensors/thinkpad-isa-0000/temp8
lmsensors/ucsi_source_psy_USBC000:001-isa-0000
lmsensors/ucsi_source_psy_USBC000:001-isa-0000/curr1
lmsensors/ucsi_source_psy_USBC000:001-isa-0000/in0
lmsensors/ucsi_source_psy_USBC000:002-isa-0000
lmsensors/ucsi_source_psy_USBC000:002-isa-0000/curr1
lmsensors/ucsi_source_psy_USBC000:002-isa-0000/in0
memory
memory/physical
memory/physical/application
memory/physical/applicationPercent
memory/physical/buffer
memory/physical/bufferPercent
memory/physical/cache
memory/physical/cachePercent
memory/physical/free
memory/physical/freePercent
memory/physical/total
memory/physical/used
memory/physical/usedPercent
memory/swap
memory/swap/free
memory/swap/freePercent
memory/swap/total
memory/swap/used
memory/swap/usedPercent
os
os/kernel
os/kernel/name
os/kernel/prettyName
os/kernel/version
os/plasma
os/plasma/kfVersion
os/plasma/plasmaVersion
os/plasma/qtVersion
os/plasma/windowsystem
os/system
os/system/hostname
os/system/logo
os/system/name
os/system/prettyName
os/system/uptime
os/system/url
os/system/version
power
power/4870
power/4870/capacity
power/4870/charge
power/4870/chargePercentage
power/4870/chargeRate
power/4870/design
power/4870/health
power/4870/name

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

@ -16,27 +16,20 @@
***************************************************************************/ ***************************************************************************/
import QtQuick 2.15 import QtQuick 2.15
import org.kde.kcmutils as KCM
import org.kde.plasma.private.awesomewidget 1.0 import org.kde.plasma.private.awesomewidget 1.0
Item { KCM.SimpleKCM {
id: aboutPage id: aboutPage
// backend // backend
AWActions { AWActions {
id: awActions id: awActions
} }
width: childrenRect.width
height: childrenRect.height
property bool debug: awActions.isDebugEnabled()
AboutTab { AboutTab {
textProvider: awActions textProvider: awActions
} }
Component.onCompleted: {
if (debug) console.debug()
}
} }

View File

@ -17,24 +17,19 @@
import QtQuick 2.15 import QtQuick 2.15
import QtQuick.Controls import QtQuick.Controls
import org.kde.kcmutils as KCM
import org.kde.plasma.private.awesomewidget 1.0 import org.kde.plasma.private.awesomewidget 1.0
Item { KCM.SimpleKCM {
id: advancedPage id: advancedPage
// backend // backend
AWActions { AWActions {
id: awActions id: awActions
} }
width: childrenRect.width
height: childrenRect.height
implicitWidth: pageColumn.implicitWidth
implicitHeight: pageColumn.implicitHeight
property bool debug: awActions.isDebugEnabled()
property alias cfg_background: background.checked property alias cfg_background: background.checked
property alias cfg_translateStrings: translate.checked property alias cfg_translateStrings: translate.checked
property alias cfg_wrapNewLines: wrapNewLines.checked property alias cfg_wrapNewLines: wrapNewLines.checked
@ -55,7 +50,6 @@ Item {
property alias cfg_telemetryRemote: telemetryRemote.checked property alias cfg_telemetryRemote: telemetryRemote.checked
property alias cfg_telemetryId: telemetryId.value property alias cfg_telemetryId: telemetryId.value
Column { Column {
id: pageColumn id: pageColumn
anchors.fill: parent anchors.fill: parent
@ -135,32 +129,32 @@ Item {
id: tempUnits id: tempUnits
model: [ model: [
{ {
'label': i18n("Celsius"), "label": i18n("Celsius"),
'name': "Celsius" "name": "Celsius"
}, },
{ {
'label': i18n("Fahrenheit"), "label": i18n("Fahrenheit"),
'name': "Fahrenheit" "name": "Fahrenheit"
}, },
{ {
'label': i18n("Kelvin"), "label": i18n("Kelvin"),
'name': "Kelvin" "name": "Kelvin"
}, },
{ {
'label': i18n("Reaumur"), "label": i18n("Reaumur"),
'name': "Reaumur" "name": "Reaumur"
}, },
{ {
'label': i18n("cm^-1"), "label": i18n("cm^-1"),
'name': "cm^-1" "name": "cm^-1"
}, },
{ {
'label': i18n("kJ/mol"), "label": i18n("kJ/mol"),
'name': "kJ/mol" "name": "kJ/mol"
}, },
{ {
'label': i18n("kcal/mol"), "label": i18n("kcal/mol"),
'name': "kcal/mol" "name": "kcal/mol"
} }
] ]
text: i18n("Temperature units") text: i18n("Temperature units")
@ -194,14 +188,18 @@ Item {
GroupBox { GroupBox {
width: parent.width width: parent.width
height: implicitHeight
title: i18n("Actions") title: i18n("Actions")
Column { Column {
height: implicitHeight
width: parent.width width: parent.width
ButtonSelector { ButtonSelector {
value: i18n("Drop key cache") value: i18n("Drop key cache")
onButtonActivated: awActions.dropCache() onButtonActivated: awActions.dropCache()
} }
ButtonSelector { ButtonSelector {
ExportDialog { ExportDialog {
id: saveConfigAs id: saveConfigAs
@ -210,11 +208,12 @@ Item {
value: i18n("Export configuration") value: i18n("Export configuration")
onButtonActivated: saveConfigAs.open() onButtonActivated: saveConfigAs.open()
} }
ButtonSelector { ButtonSelector {
ImportDialog { ImportDialog {
id: loadConfigFrom id: loadConfigFrom
onConfigurationReceived: { onConfigurationReceived: {
for (var key in configuration) for (const key in configuration)
plasmoid.configuration[key] = configuration[key] plasmoid.configuration[key] = configuration[key]
} }
} }
@ -225,15 +224,19 @@ Item {
} }
GroupBox { GroupBox {
height: implicitHeight
width: parent.width width: parent.width
title: i18n("Telemetry") title: i18n("Telemetry")
Column { Column {
height: implicitHeight
width: parent.width width: parent.width
CheckBoxSelector { CheckBoxSelector {
id: telemetryRemote id: telemetryRemote
text: i18n("Enable remote telemetry") text: i18n("Enable remote telemetry")
} }
IntegerSelector { IntegerSelector {
id: telemetryCount id: telemetryCount
maximumValue: 10000 maximumValue: 10000
@ -242,6 +245,7 @@ Item {
text: i18n("History count") text: i18n("History count")
value: plasmoid.configuration.telemetryCount value: plasmoid.configuration.telemetryCount
} }
LineSelector { LineSelector {
id: telemetryId id: telemetryId
text: i18n("Telemetry ID") text: i18n("Telemetry ID")
@ -250,9 +254,4 @@ Item {
} }
} }
} }
Component.onCompleted: {
if (debug) console.debug()
}
} }

View File

@ -16,30 +16,21 @@
***************************************************************************/ ***************************************************************************/
import QtQuick 2.15 import QtQuick 2.15
import org.kde.kcmutils as KCM
import org.kde.plasma.private.awesomewidget 1.0 import org.kde.plasma.private.awesomewidget 1.0
import "." import "."
Item { KCM.SimpleKCM {
id: appearancePage id: appearancePage
// backend
AWActions {
id: awActions
}
width: childrenRect.width
height: childrenRect.height
implicitWidth: pageColumn.implicitWidth
implicitHeight: pageColumn.implicitHeight
property bool debug: awActions.isDebugEnabled()
property variant weight: { property variant weight: {
25: 0, 25: 0,
50: 1, 50: 1,
63: 3, 63: 3,
75: 4, 75: 4,
87: 5 87: 5,
} }
property alias cfg_fontFamily: font.value property alias cfg_fontFamily: font.value
@ -50,7 +41,6 @@ Item {
property alias cfg_textStyleColor: selectStyleColor.value property alias cfg_textStyleColor: selectStyleColor.value
property string cfg_textStyle: textStyle.value property string cfg_textStyle: textStyle.value
Column { Column {
id: pageColumn id: pageColumn
anchors.fill: parent anchors.fill: parent
@ -106,9 +96,4 @@ Item {
value: plasmoid.configuration.textStyleColor value: plasmoid.configuration.textStyleColor
} }
} }
Component.onCompleted: {
if (debug) console.debug()
}
} }

View File

@ -17,36 +17,28 @@
import QtQuick 2.15 import QtQuick 2.15
import QtQuick.Controls import QtQuick.Controls
import org.kde.kcmutils as KCM
import org.kde.plasma.private.awesomewidget 1.0 import org.kde.plasma.private.awesomewidget 1.0
Item { KCM.SimpleKCM {
id: dataenginePage id: dataenginePage
// backend // backend
AWKeys { AWKeys {
id: awKeys id: awKeys
} }
AWActions {
id: awActions
}
AWConfigHelper { AWConfigHelper {
id: awConfig id: awConfig
} }
width: childrenRect.width
height: childrenRect.height
implicitWidth: pageColumn.implicitWidth
implicitHeight: pageColumn.implicitHeight
property bool debug: awActions.isDebugEnabled()
property variant cfg_dataengine: awConfig.readDataEngineConfiguration() property variant cfg_dataengine: awConfig.readDataEngineConfiguration()
Column { Column {
id: pageColumn id: pageColumn
anchors.fill: parent anchors.fill: parent
GroupBox { GroupBox {
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
@ -58,61 +50,11 @@ Item {
} }
} }
GroupBox {
height: implicitHeight
width: parent.width
title: i18n("GPU")
ComboBoxSelector {
model: [
{
'label': "auto",
'name': "auto"
},
{
'label': "disable",
'name': "disable"
},
{
'label': "ati",
'name': "ati"
},
{
'label': "nvidia",
'name': "nvidia"
}
]
text: i18n("GPU device")
value: cfg_dataengine["GPUDEV"]
onValueEdited: newValue => cfg_dataengine["GPUDEV"] = newValue
}
}
GroupBox {
height: implicitHeight
width: parent.width
title: i18n("HDD temperature")
Column {
height: implicitHeight
width: parent.width
ComboBoxSelector {
id: hdd
text: i18n("HDD")
value: cfg_dataengine["HDDDEV"]
onValueEdited: newValue => cfg_dataengine["HDDDEV"] = newValue
}
LineSelector {
text: i18n("hddtemp cmd")
value: cfg_dataengine["HDDTEMPCMD"]
onValueEdited: newValue => cfg_dataengine["HDDTEMPCMD"] = newValue
}
}
}
GroupBox { GroupBox {
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
title: i18n("Player") title: i18n("Player")
Column { Column {
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
@ -128,16 +70,16 @@ Item {
ComboBoxSelector { ComboBoxSelector {
model: [ model: [
{ {
'label': "disable", "label": "disable",
'name': "disable" "name": "disable"
}, },
{ {
'label': "mpris", "label": "mpris",
'name': "mpris" "name": "mpris"
}, },
{ {
'label': "mpd", "label": "mpd",
'name': "mpd" "name": "mpd"
} }
] ]
text: i18n("Music player") text: i18n("Music player")
@ -150,40 +92,40 @@ Item {
editable: true editable: true
model: [ model: [
{ {
'label': 'auto', "label": "auto",
'name': 'auto' "name": "auto"
}, },
{ {
'label': 'amarok', "label": "amarok",
'name': 'amarok' "name": "amarok"
}, },
{ {
'label': 'audacious', "label": "audacious",
'name': 'audacious' "name": "audacious"
}, },
{ {
'label': 'clementine', "label": "clementine",
'name': 'clementine' "name": "clementine"
}, },
{ {
'label': 'DeaDBeeF', "label": "DeaDBeeF",
'name': 'DeaDBeeF' "name": "DeaDBeeF"
}, },
{ {
'label': 'vlc', "label": "vlc",
'name': 'vlc' "name": "vlc"
}, },
{ {
'label': 'qmmp', "label": "qmmp",
'name': 'qmmp' "name": "qmmp"
}, },
{ {
'label': 'xmms2', "label": "xmms2",
'name': 'xmms2' "name": "xmms2"
}, },
{ {
'label': cfg_dataengine["MPRIS"], "label": cfg_dataengine["MPRIS"],
'name': cfg_dataengine["MPRIS"] "name": cfg_dataengine["MPRIS"]
} }
] ]
text: i18n("MPRIS player name") text: i18n("MPRIS player name")
@ -211,9 +153,11 @@ Item {
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
title: i18n("Extensions") title: i18n("Extensions")
Column { Column {
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
ButtonSelector { ButtonSelector {
value: i18n("Custom scripts") value: i18n("Custom scripts")
onButtonActivated: awKeys.editItem("extscript") onButtonActivated: awKeys.editItem("extscript")
@ -244,8 +188,6 @@ Item {
Component.onCompleted: { Component.onCompleted: {
if (debug) console.debug()
// init submodule // init submodule
awKeys.updateCache() awKeys.updateCache()
@ -255,8 +197,6 @@ Item {
} }
Component.onDestruction: { Component.onDestruction: {
if (debug) console.debug()
cfg_dataengine["MPRIS"] = mpris.editText cfg_dataengine["MPRIS"] = mpris.editText
awConfig.writeDataEngineConfiguration(cfg_dataengine) awConfig.writeDataEngineConfiguration(cfg_dataengine)
} }

View File

@ -28,6 +28,7 @@ import "."
PlasmoidItem { PlasmoidItem {
id: main id: main
// backend // backend
AWKeys { AWKeys {
id: awKeys id: awKeys
@ -42,7 +43,6 @@ PlasmoidItem {
id: bugReport id: bugReport
} }
property bool debug: awActions.isDebugEnabled()
property variant tooltipSettings: { property variant tooltipSettings: {
"tooltipNumber": plasmoid.configuration.tooltipNumber, "tooltipNumber": plasmoid.configuration.tooltipNumber,
"useTooltipBackground": plasmoid.configuration.useTooltipBackground, "useTooltipBackground": plasmoid.configuration.useTooltipBackground,
@ -72,15 +72,13 @@ PlasmoidItem {
signal needToolTipUpdate(string newText) signal needToolTipUpdate(string newText)
signal sizeUpdate signal sizeUpdate
Layout.fillWidth: PlasmoidItem.formFactor !== PlasmaCore.Planar
Layout.fillWidth: PlasmoidItem.formFactor != PlasmaCore.Planar Layout.fillHeight: PlasmoidItem.formFactor !== PlasmaCore.Planar
Layout.fillHeight: PlasmoidItem.formFactor != PlasmaCore.Planar
Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter
Plasmoid.icon: "utilities-system-monitor" Plasmoid.icon: "utilities-system-monitor"
Plasmoid.backgroundHints: plasmoid.configuration.background ? "DefaultBackground" : "NoBackground" Plasmoid.backgroundHints: plasmoid.configuration.background ? "DefaultBackground" : "NoBackground"
// ui // ui
Text { Text {
id: text id: text
@ -94,7 +92,7 @@ PlasmoidItem {
color: plasmoid.configuration.fontColor color: plasmoid.configuration.fontColor
font.family: plasmoid.configuration.fontFamily font.family: plasmoid.configuration.fontFamily
font.italic: plasmoid.configuration.fontStyle == "italic" ? true : false font.italic: plasmoid.configuration.fontStyle === "italic" ? true : false
font.pointSize: plasmoid.configuration.fontSize font.pointSize: plasmoid.configuration.fontSize
font.weight: General.fontWeight[plasmoid.configuration.fontWeight] font.weight: General.fontWeight[plasmoid.configuration.fontWeight]
@ -124,8 +122,8 @@ PlasmoidItem {
} }
onAccepted: { onAccepted: {
var tag = tagSelectorBox.editText const tag = tagSelectorBox.editText
var message = i18n("Tag: %1", tag) let message = i18n("Tag: %1", tag)
message += "<br>" message += "<br>"
message += i18n("Value: %1", awKeys.valueByKey(tag)) message += i18n("Value: %1", awKeys.valueByKey(tag))
message += "<br>" message += "<br>"
@ -138,25 +136,33 @@ PlasmoidItem {
PlasmaCore.Action { PlasmaCore.Action {
text: i18n("Request key") text: i18n("Request key")
icon.name: "utilities-system-monitor" icon.name: "utilities-system-monitor"
onTriggered: {
tagSelectorBox.model = awKeys.dictKeys(true)
tagSelector.open()
}
}, },
PlasmaCore.Action { PlasmaCore.Action {
text: i18n("Show README") text: i18n("Show README")
icon.name: "text-x-readme" icon.name: "text-x-readme"
onTriggered: awActions.showReadme()
}, },
PlasmaCore.Action { PlasmaCore.Action {
text: i18n("Check updates") text: i18n("Check updates")
icon.name: "system-software-update" icon.name: "system-software-update"
onTriggered: awActions.checkUpdates(true)
}, },
PlasmaCore.Action { PlasmaCore.Action {
text: i18n("Report bug") text: i18n("Report bug")
icon.name: "tools-report-bug" icon.name: "tools-report-bug"
onTriggered: {
bugReport.reset()
bugReport.open()
}
} }
] ]
Component.onCompleted: { Component.onCompleted: {
if (debug) console.debug()
// init submodule // init submodule
Plasmoid.userConfiguringChanged(false) Plasmoid.userConfiguringChanged(false)
// connect data // connect data
@ -167,31 +173,25 @@ PlasmoidItem {
} }
onNeedTextUpdate: newText => { onNeedTextUpdate: newText => {
if (debug) console.debug()
text.text = newText text.text = newText
sizeUpdate() sizeUpdate()
} }
onNeedToolTipUpdate: newText => { onNeedToolTipUpdate: newText => {
if (debug) console.debug()
tooltip.text = newText tooltip.text = newText
} }
onSizeUpdate: { onSizeUpdate: {
if (debug) console.debug()
// 16 is a magic number // 16 is a magic number
// in other case plasmoid will increase own size on each update // in other case plasmoid will increase own size on each update
if (plasmoid.configuration.height === 0) {
if (plasmoid.configuration.height == 0) {
Layout.minimumHeight = text.contentHeight - 16 Layout.minimumHeight = text.contentHeight - 16
Layout.maximumHeight = -1 Layout.maximumHeight = -1
} else { } else {
Layout.minimumHeight = plasmoid.configuration.height Layout.minimumHeight = plasmoid.configuration.height
Layout.maximumHeight = plasmoid.configuration.height Layout.maximumHeight = plasmoid.configuration.height
} }
if (plasmoid.configuration.width == 0) { if (plasmoid.configuration.width === 0) {
Layout.minimumWidth = text.contentWidth - 16 Layout.minimumWidth = text.contentWidth - 16
Layout.maximumWidth = -1 Layout.maximumWidth = -1
} else { } else {
@ -202,7 +202,6 @@ PlasmoidItem {
Plasmoid.onUserConfiguringChanged: { Plasmoid.onUserConfiguringChanged: {
if (plasmoid.userConfiguring) return if (plasmoid.userConfiguring) return
if (debug) console.debug()
// init submodule // init submodule
awKeys.initDataAggregator(tooltipSettings) awKeys.initDataAggregator(tooltipSettings)
@ -217,7 +216,7 @@ PlasmoidItem {
awKeys.setAggregatorProperty("tempUnits", plasmoid.configuration.tempUnits) awKeys.setAggregatorProperty("tempUnits", plasmoid.configuration.tempUnits)
awKeys.setAggregatorProperty("translate", plasmoid.configuration.translateStrings) awKeys.setAggregatorProperty("translate", plasmoid.configuration.translateStrings)
// update telemetry ID // update telemetry ID
if (plasmoid.configuration.telemetryId.length == 0) if (plasmoid.configuration.telemetryId.length === 0)
plasmoid.configuration.telemetryId = generateUuid() plasmoid.configuration.telemetryId = generateUuid()
// save telemetry // save telemetry
awTelemetryHandler.init(plasmoid.configuration.telemetryCount, awTelemetryHandler.init(plasmoid.configuration.telemetryCount,
@ -227,37 +226,10 @@ PlasmoidItem {
awTelemetryHandler.uploadTelemetry("awwidgetconfig", plasmoid.configuration.text) awTelemetryHandler.uploadTelemetry("awwidgetconfig", plasmoid.configuration.text)
} }
function action_checkUpdates() {
if (debug) console.debug()
return awActions.checkUpdates(true)
}
function action_showReadme() {
if (debug) console.debug()
return awActions.showReadme()
}
function action_reportBug() {
if (debug) console.debug()
bugReport.reset()
bugReport.open()
}
function action_requestKey() {
if (debug) console.debug()
tagSelectorBox.model = awKeys.dictKeys(true)
return tagSelector.open()
}
// code from http://stackoverflow.com/questions/105034/create-guid-uuid-in-javascript // code from http://stackoverflow.com/questions/105034/create-guid-uuid-in-javascript
function generateUuid() { function generateUuid() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) {
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); let r = Math.random() * 16 | 0, v = c === "x" ? r : (r & 0x3 | 0x8);
return v.toString(16); return v.toString(16);
}); });
} }

View File

@ -17,23 +17,13 @@
import QtQuick 2.15 import QtQuick 2.15
import QtQuick.Controls import QtQuick.Controls
import org.kde.kcmutils as KCM
import org.kde.plasma.private.awesomewidget 1.0 import org.kde.plasma.private.awesomewidget 1.0
Item { KCM.SimpleKCM {
id: tooltipPage id: tooltipPage
// backend
AWActions {
id: awActions
}
width: childrenRect.width
height: childrenRect.height
implicitWidth: pageColumn.implicitWidth
implicitHeight: pageColumn.implicitHeight
property bool debug: awActions.isDebugEnabled()
property alias cfg_tooltipNumber: tooltipNumber.value property alias cfg_tooltipNumber: tooltipNumber.value
property alias cfg_useTooltipBackground: useTooltipBackground.checked property alias cfg_useTooltipBackground: useTooltipBackground.checked
@ -53,7 +43,6 @@ Item {
property alias cfg_batTooltipColor: batTooltipColor.value property alias cfg_batTooltipColor: batTooltipColor.value
property alias cfg_batInTooltipColor: batInTooltipColor.value property alias cfg_batInTooltipColor: batInTooltipColor.value
Column { Column {
id: pageColumn id: pageColumn
anchors.fill: parent anchors.fill: parent
@ -178,11 +167,13 @@ Item {
Column { Column {
width: parent.width width: parent.width
enabled: networkTooltipLabel.checked enabled: networkTooltipLabel.checked
ColorSelector { ColorSelector {
id: downkbTooltipColor id: downkbTooltipColor
text: i18n("Download speed color") text: i18n("Download speed color")
value: plasmoid.configuration.downkbTooltipColor value: plasmoid.configuration.downkbTooltipColor
} }
ColorSelector { ColorSelector {
id: upkbTooltipColor id: upkbTooltipColor
text: i18n("Upload speed color") text: i18n("Upload speed color")
@ -204,11 +195,13 @@ Item {
Column { Column {
width: parent.width width: parent.width
enabled: batteryTooltipLabel.checked enabled: batteryTooltipLabel.checked
ColorSelector { ColorSelector {
id: batTooltipColor id: batTooltipColor
text: i18n("Battery active color") text: i18n("Battery active color")
value: plasmoid.configuration.batTooltipColor value: plasmoid.configuration.batTooltipColor
} }
ColorSelector { ColorSelector {
id: batInTooltipColor id: batInTooltipColor
text: i18n("Battery inactive color") text: i18n("Battery inactive color")
@ -217,9 +210,4 @@ Item {
} }
} }
} }
Component.onCompleted: {
if (debug) console.debug()
}
} }

View File

@ -16,13 +16,16 @@
***************************************************************************/ ***************************************************************************/
import QtQuick 2.15 import QtQuick 2.15
import QtQuick.Controls
import org.kde.kcmutils as KCM
import org.kde.plasma.private.awesomewidget 1.0 import org.kde.plasma.private.awesomewidget 1.0
import "." import "."
Item { KCM.SimpleKCM {
id: widgetPage id: widgetPage
// backend // backend
AWKeys { AWKeys {
id: awKeys id: awKeys
@ -31,19 +34,11 @@ Item {
id: awActions id: awActions
} }
width: childrenRect.width
height: childrenRect.height
implicitWidth: pageColumn.implicitWidth
implicitHeight: pageColumn.implicitHeight
property bool debug: awActions.isDebugEnabled()
property alias cfg_text: textPattern.text property alias cfg_text: textPattern.text
property bool lock: true property bool lock: true
signal needTextUpdate(string newText) signal needTextUpdate(string newText)
Column { Column {
id: pageColumn id: pageColumn
anchors.fill: parent anchors.fill: parent
@ -74,10 +69,7 @@ Item {
} }
} }
Component.onCompleted: { Component.onCompleted: {
if (debug) console.debug()
awKeys.needTextToBeUpdated.connect(needTextUpdate) awKeys.needTextToBeUpdated.connect(needTextUpdate)
// init submodule // init submodule
awKeys.initKeys(plasmoid.configuration.text, plasmoid.configuration.interval, awKeys.initKeys(plasmoid.configuration.text, plasmoid.configuration.interval,
@ -92,7 +84,6 @@ Item {
onNeedTextUpdate: newText => { onNeedTextUpdate: newText => {
if (lock) return if (lock) return
if (debug) console.debug()
extensions.showMessage(newText) extensions.showMessage(newText)
lock = true lock = true

View File

@ -19,7 +19,7 @@
"Id": "org.kde.plasma.awesomewidget", "Id": "org.kde.plasma.awesomewidget",
"License": "GPLv3", "License": "GPLv3",
"Name": "Awesome Widget", "Name": "Awesome Widget",
"Version": "3.5.1", "Version": "4.0.0",
"Website": "https://arcanis.me/projects/awesome-widgets/" "Website": "https://arcanis.me/projects/awesome-widgets/"
}, },
"X-Plasma-API-Minimum-Version": "6.0" "X-Plasma-API-Minimum-Version": "6.0"

View File

@ -71,13 +71,6 @@ QString AWActions::getFileContent(const QString &_path)
} }
// HACK: since QML could not use QLoggingCategory I need this hack
bool AWActions::isDebugEnabled()
{
return LOG_AW().isDebugEnabled();
}
bool AWActions::runCmd(const QString &_cmd, const QStringList &_args) bool AWActions::runCmd(const QString &_cmd, const QStringList &_args)
{ {
qCDebug(LOG_AW) << "Cmd" << _cmd << "args" << _args; qCDebug(LOG_AW) << "Cmd" << _cmd << "args" << _args;

View File

@ -34,7 +34,6 @@ public:
~AWActions() override; ~AWActions() override;
Q_INVOKABLE void checkUpdates(bool _showAnyway = false); Q_INVOKABLE void checkUpdates(bool _showAnyway = false);
Q_INVOKABLE static QString getFileContent(const QString &_path); Q_INVOKABLE static QString getFileContent(const QString &_path);
Q_INVOKABLE static bool isDebugEnabled();
Q_INVOKABLE static bool runCmd(const QString &_cmd, const QStringList &_args); Q_INVOKABLE static bool runCmd(const QString &_cmd, const QStringList &_args);
Q_INVOKABLE static void showLegacyInfo(); Q_INVOKABLE static void showLegacyInfo();
Q_INVOKABLE static void showReadme(); Q_INVOKABLE static void showReadme();

View File

@ -170,9 +170,6 @@ QVariantMap AWConfigHelper::readDataEngineConfiguration()
settings.beginGroup("Configuration"); settings.beginGroup("Configuration");
configuration["ACPIPATH"] = settings.value("ACPIPATH", "/sys/class/power_supply/"); configuration["ACPIPATH"] = settings.value("ACPIPATH", "/sys/class/power_supply/");
configuration["GPUDEV"] = settings.value("GPUDEV", "auto");
configuration["HDDDEV"] = settings.value("HDDDEV", "all");
configuration["HDDTEMPCMD"] = settings.value("HDDTEMPCMD", "sudo smartctl -a");
configuration["MPDADDRESS"] = settings.value("MPDADDRESS", "localhost"); configuration["MPDADDRESS"] = settings.value("MPDADDRESS", "localhost");
configuration["MPDPORT"] = settings.value("MPDPORT", "6600"); configuration["MPDPORT"] = settings.value("MPDPORT", "6600");
configuration["MPRIS"] = settings.value("MPRIS", "auto"); configuration["MPRIS"] = settings.value("MPRIS", "auto");
@ -197,9 +194,6 @@ bool AWConfigHelper::writeDataEngineConfiguration(const QVariantMap &_configurat
settings.beginGroup("Configuration"); settings.beginGroup("Configuration");
settings.setValue("ACPIPATH", _configuration["ACPIPATH"]); settings.setValue("ACPIPATH", _configuration["ACPIPATH"]);
settings.setValue("GPUDEV", _configuration["GPUDEV"]);
settings.setValue("HDDDEV", _configuration["HDDDEV"]);
settings.setValue("HDDTEMPCMD", _configuration["HDDTEMPCMD"]);
settings.setValue("MPDADDRESS", _configuration["MPDADDRESS"]); settings.setValue("MPDADDRESS", _configuration["MPDADDRESS"]);
settings.setValue("MPDPORT", _configuration["MPDPORT"]); settings.setValue("MPDPORT", _configuration["MPDPORT"]);
settings.setValue("MPRIS", _configuration["MPRIS"]); settings.setValue("MPRIS", _configuration["MPRIS"]);

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,21 @@ void AWDataEngineAggregator::loadSources()
auto sensors = response.value(); auto sensors = response.value();
updateSensors(sensors); updateSensors(sensors);
for (auto &sensor : sensors.keys()) connectSources();
sensorAdded(sensor);
}
for (auto &sensor : m_sensors.keys())
void AWDataEngineAggregator::reconnectSources(const int interval) emit(deviceAdded(sensor));
{
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 +110,23 @@ 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);
}
// notify about new device
emit(deviceAdded(_sensor));
} }
@ -103,9 +135,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 +147,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,9 @@ 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 gpuRegExp = QRegularExpression("^gpu/gpu.*/usage$");
auto gpuTempRegExp = QRegularExpression("^gpu/gpu.*/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 +95,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; auto 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;
@ -109,7 +112,7 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
m_formatter["cpu"] = AWKeysAggregator::FormatterType::Float; m_formatter["cpu"] = AWKeysAggregator::FormatterType::Float;
} else if (_source.contains(cpuRegExp)) { } else if (_source.contains(cpuRegExp)) {
// cpus // cpus
QString key = _source; auto key = _source;
key.remove("cpu/").remove("/usage"); key.remove("cpu/").remove("/usage");
m_map.insert(_source, key); m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Float; m_formatter[key] = AWKeysAggregator::FormatterType::Float;
@ -119,34 +122,34 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
m_formatter["cpucl"] = AWKeysAggregator::FormatterType::Integer; m_formatter["cpucl"] = AWKeysAggregator::FormatterType::Integer;
} else if (_source.contains(cpuclRegExp)) { } else if (_source.contains(cpuclRegExp)) {
// cpucls // cpucls
QString key = _source; auto key = _source;
key.remove("cpu/cpu").remove("/frequency"); key.remove("cpu/cpu").remove("/frequency");
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; auto 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;
} else if (_source.contains(hddrRegExp)) { } else if (_source.contains(hddrRegExp)) {
// read speed // read speed
QString device = _source; auto device = _source;
device.remove("disk/").remove("/read"); device.remove("disk/").remove("/read");
int index = m_devices["disk"].indexOf(device); auto index = m_devices["disk"].indexOf(device);
if (index > -1) { if (index > -1) {
QString key = QString("hddr%1").arg(index); QString key = QString("hddr%1").arg(index);
m_map.insert(_source, key); m_map.insert(_source, key);
@ -154,29 +157,45 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
} }
} else if (_source.contains(hddwRegExp)) { } else if (_source.contains(hddwRegExp)) {
// write speed // write speed
QString device = _source; auto device = _source;
device.remove("disk/").remove("/write"); device.remove("disk/").remove("/write");
int index = m_devices["disk"].indexOf(device); auto index = m_devices["disk"].indexOf(device);
if (index > -1) { if (index > -1) {
QString key = QString("hddw%1").arg(index); QString key = QString("hddw%1").arg(index);
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 == "gpu/all/usage") {
// 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.contains(gpuRegExp)) {
// gpu temperature // gpus
m_map.insert(_source, "gputemp"); auto device = _source;
m_formatter["gputemp"] = AWKeysAggregator::FormatterType::Temperature; device.remove("gpu/").remove("/usage");
auto index = m_devices["gpu"].indexOf(device);
if (index > -1) {
auto key = QString("gpu%1").arg(index);
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Float;
}
} else if (_source.contains(gpuTempRegExp)) {
// gpus temps
auto device = _source;
device.remove("gpu/").remove("/temperature");
auto index = m_devices["gpu"].indexOf(device);
if (index > -1) {
auto key = QString("gputemp%1").arg(index);
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Temperature;
}
} else if (_source.contains(mountFillRegExp)) { } else if (_source.contains(mountFillRegExp)) {
// fill level // fill level
QString device = _source; auto device = _source;
device.remove("disk/").remove("/usedPercent"); device.remove("disk/").remove("/usedPercent");
int index = m_devices["mount"].indexOf(device); auto index = m_devices["mount"].indexOf(device);
if (index > -1) { if (index > -1) {
QString key = QString("hdd%1").arg(index); auto key = QString("hdd%1").arg(index);
m_map.insert(_source, key); m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Float; m_formatter[key] = AWKeysAggregator::FormatterType::Float;
// additional keys // additional keys
@ -185,9 +204,9 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
} }
} else if (_source.contains(mountFreeRegExp)) { } else if (_source.contains(mountFreeRegExp)) {
// free space // free space
QString device = _source; auto device = _source;
device.remove("disk/").remove("/free"); device.remove("disk/").remove("/free");
int index = m_devices["mount"].indexOf(device); auto index = m_devices["mount"].indexOf(device);
if (index > -1) { if (index > -1) {
// mb // mb
QString key = QString("hddfreemb%1").arg(index); QString key = QString("hddfreemb%1").arg(index);
@ -200,9 +219,9 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
} }
} else if (_source.contains(mountUsedRegExp)) { } else if (_source.contains(mountUsedRegExp)) {
// used // used
QString device = _source; auto device = _source;
device.remove("disk/").remove("/used"); device.remove("disk/").remove("/used");
int index = m_devices["mount"].indexOf(device); auto index = m_devices["mount"].indexOf(device);
if (index > -1) { if (index > -1) {
// mb // mb
QString key = QString("hddmb%1").arg(index); QString key = QString("hddmb%1").arg(index);
@ -213,21 +232,11 @@ 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")) {
// hdd temperature
QString device = _source;
device.remove("hdd/temperature");
int index = m_devices["hdd"].indexOf(device);
if (index > -1) {
QString key = QString("hddtemp%1").arg(index);
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Temperature;
}
} else if (_source.startsWith("cpu/loadaverages/loadaverage")) { } else if (_source.startsWith("cpu/loadaverages/loadaverage")) {
// load average // load average
QString time = _source; auto time = _source;
time.remove("cpu/loadaverages/loadaverage"); time.remove("cpu/loadaverages/loadaverage");
QString key = QString("la%1").arg(time); auto key = QString("la%1").arg(time);
m_map.insert(_source, key); m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::FloatTwoSymbols; m_formatter[key] = AWKeysAggregator::FormatterType::FloatTwoSymbols;
} else if (_source == "memory/physical/application") { } else if (_source == "memory/physical/application") {
@ -254,27 +263,27 @@ 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; auto 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)) {
// network speed // network speed
QString type = _source.contains("download") ? "down" : "up"; auto type = _source.endsWith("download") ? "down" : "up";
int index = m_devices["net"].indexOf(_source.split('/')[2]); auto index = m_devices["net"].indexOf(_source.split('/')[1]);
if (index > -1) { if (index > -1) {
// kb // kb
QString key = QString("%1kb%2").arg(type).arg(index); auto key = QString("%1kb%2").arg(type).arg(index);
m_map.insert(_source, key); m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Integer; m_formatter[key] = AWKeysAggregator::FormatterType::Integer;
// smart // smart
@ -288,11 +297,11 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
} }
} else if (_source.contains(netTotalRegExp)) { } else if (_source.contains(netTotalRegExp)) {
// network data total // network data total
QString type = _source.contains("download") ? "down" : "up"; auto type = _source.endsWith("Download") ? "down" : "up";
int index = m_devices["net"].indexOf(_source.split('/')[2]); auto index = m_devices["net"].indexOf(_source.split('/')[1]);
if (index > -1) { if (index > -1) {
// kb // kb
QString key = QString("%1totkb%2").arg(type).arg(index); auto key = QString("%1totkb%2").arg(type).arg(index);
m_map.insert(_source, key); m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Integer; m_formatter[key] = AWKeysAggregator::FormatterType::Integer;
// mb // mb
@ -300,34 +309,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; auto 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; auto 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; auto 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,19 +355,20 @@ 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)});
if (index > -1) { if (index > -1) {
QString key = QString("temp%1").arg(index); auto key = QString("temp%1").arg(index);
m_map.insert(_source, key); m_map.insert(_source, key);
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 +387,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; auto 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; auto 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; auto 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 +435,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

@ -31,7 +31,7 @@ bool AWKeyCache::addKeyToCache(const QString &_type, const QString &_key)
{ {
qCDebug(LOG_AW) << "Key" << _key << "with type" << _type; qCDebug(LOG_AW) << "Key" << _key << "with type" << _type;
QString fileName auto fileName
= QString("%1/awesomewidgets.ndx").arg(QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation)); = QString("%1/awesomewidgets.ndx").arg(QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation));
qCInfo(LOG_AW) << "Cache file" << fileName; qCInfo(LOG_AW) << "Cache file" << fileName;
QSettings cache(fileName, QSettings::IniFormat); QSettings cache(fileName, QSettings::IniFormat);
@ -41,19 +41,8 @@ bool AWKeyCache::addKeyToCache(const QString &_type, const QString &_key)
for (auto &number : cache.allKeys()) for (auto &number : cache.allKeys())
cachedValues.append(cache.value(number).toString()); cachedValues.append(cache.value(number).toString());
if (_type == "hdd") { if (_type == "net") {
QStringList allDevices = QDir("/dev").entryList(QDir::System, QDir::Name); auto rawInterfaceList = QNetworkInterface::allInterfaces();
QStringList devices = allDevices.filter(QRegularExpression("^[hms]d[a-z]$"));
for (auto &dev : devices) {
QString device = QString("/dev/%1").arg(dev);
if (cachedValues.contains(device))
continue;
qCInfo(LOG_AW) << "Found new key" << device << "for type" << _type;
cachedValues.append(device);
cache.setValue(QString("%1").arg(cache.allKeys().count(), 3, 10, QChar('0')), device);
}
} else if (_type == "net") {
QList<QNetworkInterface> rawInterfaceList = QNetworkInterface::allInterfaces();
for (auto &interface : rawInterfaceList) { for (auto &interface : rawInterfaceList) {
QString device = interface.name(); QString device = interface.name();
if (cachedValues.contains(device)) if (cachedValues.contains(device))
@ -98,7 +87,7 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, const QStringL
if (!used.contains(key)) if (!used.contains(key))
continue; continue;
key.remove("hddtotmb"); key.remove("hddtotmb");
int index = key.toInt(); auto index = key.toInt();
used << QString("hddfreemb%1").arg(index) << QString("hddmb%1").arg(index); used << QString("hddfreemb%1").arg(index) << QString("hddmb%1").arg(index);
} }
// hddtotgb* // hddtotgb*
@ -106,7 +95,7 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, const QStringL
if (!used.contains(key)) if (!used.contains(key))
continue; continue;
key.remove("hddtotgb"); key.remove("hddtotgb");
int index = key.toInt(); auto index = key.toInt();
used << QString("hddfreegb%1").arg(index) << QString("hddgb%1").arg(index); used << QString("hddfreegb%1").arg(index) << QString("hddgb%1").arg(index);
} }
// mem // mem
@ -139,7 +128,7 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, const QStringL
for (auto &key : netKeys) { for (auto &key : netKeys) {
if (!used.contains(key)) if (!used.contains(key))
continue; continue;
QStringList filt = _allKeys.filter(QRegularExpression(QString("^%1[0-9]{1,}").arg(key))); auto filt = _allKeys.filter(QRegularExpression(QString("^%1[0-9]{1,}").arg(key)));
for (auto &filtered : filt) for (auto &filtered : filt)
used << filtered; used << filtered;
} }
@ -158,7 +147,7 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, const QStringL
QHash<QString, QStringList> AWKeyCache::loadKeysFromCache() QHash<QString, QStringList> AWKeyCache::loadKeysFromCache()
{ {
QString fileName auto fileName
= QString("%1/awesomewidgets.ndx").arg(QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation)); = QString("%1/awesomewidgets.ndx").arg(QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation));
qCInfo(LOG_AW) << "Cache file" << fileName; qCInfo(LOG_AW) << "Cache file" << fileName;
QSettings cache(fileName, QSettings::IniFormat); QSettings cache(fileName, QSettings::IniFormat);

View File

@ -72,7 +72,6 @@ QHash<QString, QStringList> AWKeyOperations::devices() const
void AWKeyOperations::updateCache() void AWKeyOperations::updateCache()
{ {
// update network and hdd list // update network and hdd list
addKeyToCache("hdd");
addKeyToCache("net"); addKeyToCache("net");
} }
@ -90,15 +89,20 @@ QStringList AWKeyOperations::dictKeys() const
allKeys.append(item->tag("timestamp")); allKeys.append(item->tag("timestamp"));
} }
// cpuclock & cpu // cpuclock & cpu
for (int i = 0; i < QThread::idealThreadCount(); i++) { for (auto i = 0; i < QThread::idealThreadCount(); i++) {
allKeys.append(QString("cpucl%1").arg(i)); allKeys.append(QString("cpucl%1").arg(i));
allKeys.append(QString("cpu%1").arg(i)); allKeys.append(QString("cpu%1").arg(i));
} }
// temperature // temperature
for (int i = 0; i < m_devices["temp"].count(); i++) for (auto i = 0; i < m_devices["temp"].count(); i++)
allKeys.append(QString("temp%1").arg(i)); allKeys.append(QString("temp%1").arg(i));
// gpu
for (auto i = 0; i < m_devices["gpu"].count(); i++) {
allKeys.append(QString("gpu%1").arg(i));
allKeys.append(QString("gputemp%1").arg(i));
}
// hdd // hdd
for (int i = 0; i < m_devices["mount"].count(); i++) { for (auto i = 0; i < m_devices["mount"].count(); i++) {
allKeys.append(QString("hddmb%1").arg(i)); allKeys.append(QString("hddmb%1").arg(i));
allKeys.append(QString("hddgb%1").arg(i)); allKeys.append(QString("hddgb%1").arg(i));
allKeys.append(QString("hddfreemb%1").arg(i)); allKeys.append(QString("hddfreemb%1").arg(i));
@ -108,15 +112,12 @@ QStringList AWKeyOperations::dictKeys() const
allKeys.append(QString("hdd%1").arg(i)); allKeys.append(QString("hdd%1").arg(i));
} }
// hdd speed // hdd speed
for (int i = 0; i < m_devices["disk"].count(); i++) { for (auto i = 0; i < m_devices["disk"].count(); i++) {
allKeys.append(QString("hddr%1").arg(i)); allKeys.append(QString("hddr%1").arg(i));
allKeys.append(QString("hddw%1").arg(i)); allKeys.append(QString("hddw%1").arg(i));
} }
// hdd temp
for (int i = 0; i < m_devices["hdd"].count(); i++)
allKeys.append(QString("hddtemp%1").arg(i));
// network // network
for (int i = 0; i < m_devices["net"].count(); i++) { for (auto i = 0; i < m_devices["net"].count(); i++) {
allKeys.append(QString("downunits%1").arg(i)); allKeys.append(QString("downunits%1").arg(i));
allKeys.append(QString("upunits%1").arg(i)); allKeys.append(QString("upunits%1").arg(i));
allKeys.append(QString("downtotkb%1").arg(i)); allKeys.append(QString("downtotkb%1").arg(i));
@ -129,8 +130,7 @@ QStringList AWKeyOperations::dictKeys() const
allKeys.append(QString("up%1").arg(i)); allKeys.append(QString("up%1").arg(i));
} }
// battery // battery
QStringList allBatteryDevices auto allBatteryDevices = QDir("/sys/class/power_supply")
= QDir("/sys/class/power_supply")
.entryList(QStringList({"BAT*"}), QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name); .entryList(QStringList({"BAT*"}), QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name);
for (int i = 0; i < allBatteryDevices.count(); i++) { for (int i = 0; i < allBatteryDevices.count(); i++) {
allKeys.append(QString("bat%1").arg(i)); allKeys.append(QString("bat%1").arg(i));
@ -205,52 +205,48 @@ QString AWKeyOperations::infoByKey(const QString &_key) const
{ {
qCDebug(LOG_AW) << "Requested key" << _key; qCDebug(LOG_AW) << "Requested key" << _key;
QString stripped = _key; auto stripped = _key;
stripped.remove(QRegularExpression("\\d+")); stripped.remove(QRegularExpression("\\d+"));
QString output; QString output;
if (_key.startsWith("bar")) { if (_key.startsWith("bar")) {
AbstractExtItem *item = m_graphicalItems->itemByTag(_key, stripped); auto *item = m_graphicalItems->itemByTag(_key, stripped);
if (item) if (item)
output = item->uniq(); output = item->uniq();
} else if (_key.startsWith("custom")) { } else if (_key.startsWith("custom")) {
AbstractExtItem *item = m_extScripts->itemByTag(_key, stripped); auto *item = m_extScripts->itemByTag(_key, stripped);
if (item) if (item)
output = item->uniq(); output = item->uniq();
} else if (_key.contains(QRegularExpression("^hdd[rw]"))) { } else if (_key.contains(QRegularExpression("^hdd[rw]"))) {
QString index = _key; auto index = _key;
index.remove(QRegularExpression("hdd[rw]")); index.remove(QRegularExpression("hdd[rw]"));
output = m_devices["disk"][index.toInt()]; output = m_devices["disk"][index.toInt()];
} else if (_key.contains(QRegularExpression("^hdd([0-9]|mb|gb|freemb|freegb|totmb|totgb)"))) { } else if (_key.contains(QRegularExpression("^hdd([0-9]|mb|gb|freemb|freegb|totmb|totgb)"))) {
QString index = _key; auto index = _key;
index.remove(QRegularExpression("^hdd(|mb|gb|freemb|freegb|totmb|totgb)")); index.remove(QRegularExpression("^hdd(|mb|gb|freemb|freegb|totmb|totgb)"));
output = m_devices["mount"][index.toInt()]; output = m_devices["mount"][index.toInt()];
} else if (_key.startsWith("hddtemp")) {
QString index = _key;
index.remove("hddtemp");
output = m_devices["hdd"][index.toInt()];
} else if (_key.contains(QRegularExpression("^(down|up)[0-9]"))) { } else if (_key.contains(QRegularExpression("^(down|up)[0-9]"))) {
QString index = _key; auto index = _key;
index.remove(QRegularExpression("^(down|up)")); index.remove(QRegularExpression("^(down|up)"));
output = m_devices["net"][index.toInt()]; output = m_devices["net"][index.toInt()];
} else if (_key.startsWith("pkgcount")) { } else if (_key.startsWith("pkgcount")) {
AbstractExtItem *item = m_extUpgrade->itemByTag(_key, stripped); auto *item = m_extUpgrade->itemByTag(_key, stripped);
if (item) if (item)
output = item->uniq(); output = item->uniq();
} else if (_key.contains(QRegularExpression("(^|perc)(ask|bid|price)(chg|)"))) { } else if (_key.contains(QRegularExpression("(^|perc)(ask|bid|price)(chg|)"))) {
AbstractExtItem *item = m_extQuotes->itemByTag(_key, stripped); auto *item = m_extQuotes->itemByTag(_key, stripped);
if (item) if (item)
output = item->uniq(); output = item->uniq();
} else if (_key.contains(QRegularExpression("(weather|weatherId|humidity|pressure|temperature)"))) { } else if (_key.contains(QRegularExpression("(weather|weatherId|humidity|pressure|temperature)"))) {
AbstractExtItem *item = m_extWeather->itemByTag(_key, stripped); auto *item = m_extWeather->itemByTag(_key, stripped);
if (item) if (item)
output = item->uniq(); output = item->uniq();
} else if (_key.startsWith("temp")) { } else if (_key.startsWith("temp")) {
QString index = _key; auto index = _key;
index.remove("temp"); index.remove("temp");
output = m_devices["temp"][index.toInt()]; output = m_devices["temp"][index.toInt()];
} else if (_key.startsWith("response")) { } else if (_key.startsWith("response")) {
AbstractExtItem *item = m_extNetRequest->itemByTag(_key, stripped); auto *item = m_extNetRequest->itemByTag(_key, stripped);
if (item) if (item)
output = item->uniq(); output = item->uniq();
} else { } else {
@ -302,19 +298,26 @@ 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$");
auto gpuRegExp = QRegularExpression("^gpu/gpu.*/usage$");
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);
} else if (_source.contains(gpuRegExp)) {
auto device = _source;
device.remove("gpu/").remove("/usage");
addKeyToCache("gpu", device);
} }
} }

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,7 @@ 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); m_dataEngineAggregator->loadSources();
// timer // timer
m_timer->setInterval(_interval); m_timer->setInterval(_interval);
@ -373,12 +369,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,7 +28,6 @@
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__;
@ -39,29 +38,12 @@ AbstractExtItemAggregator::AbstractExtItemAggregator(QObject *_parent, QString _
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")
@ -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,11 +37,11 @@ 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()) {
@ -49,19 +50,20 @@ public:
} }
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

@ -46,9 +46,8 @@ ExtQuotes::ExtQuotes(QObject *_parent, const QString &_filePath)
// HACK declare as child of nullptr to avoid crash with plasmawindowed // HACK declare as child of nullptr to avoid crash with plasmawindowed
// in the destructor // in the destructor
m_manager = new QNetworkAccessManager(nullptr); m_manager = new QNetworkAccessManager(nullptr);
connect(m_manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(quotesReplyReceived(QNetworkReply *))); connect(m_manager, &QNetworkAccessManager::finished, this, &ExtQuotes::quotesReplyReceived);
connect(this, &ExtQuotes::requestDataUpdate, this, &ExtQuotes::sendRequest);
connect(this, SIGNAL(requestDataUpdate()), this, SLOT(sendRequest()));
} }
@ -56,8 +55,8 @@ ExtQuotes::~ExtQuotes()
{ {
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
disconnect(m_manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(quotesReplyReceived(QNetworkReply *))); disconnect(m_manager, &QNetworkAccessManager::finished, this, &ExtQuotes::quotesReplyReceived);
disconnect(this, SIGNAL(requestDataUpdate()), this, SLOT(sendRequest())); disconnect(this, &ExtQuotes::requestDataUpdate, this, &ExtQuotes::sendRequest);
m_manager->deleteLater(); m_manager->deleteLater();
} }

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

@ -1,8 +1,8 @@
[Desktop Entry] [Desktop Entry]
Encoding=UTF-8 Encoding=UTF-8
Name=AAPL.NASDAQ Name=AAPL
Comment=Apple Inc Comment=Apple Inc
X-AW-Ticker="AAPL" X-AW-Ticker="AAPL.US"
X-AW-Active=false X-AW-Active=false
X-AW-ApiVersion=5 X-AW-ApiVersion=5
X-AW-Interval=60 X-AW-Interval=60

View File

@ -1,8 +1,8 @@
[Desktop Entry] [Desktop Entry]
Encoding=UTF-8 Encoding=UTF-8
Name=GOOG.NASDAQ Name=GOOG
Comment=Google Inc Comment=Google Inc
X-AW-Ticker="GOOG" X-AW-Ticker="GOOG.US"
X-AW-Active=false X-AW-Active=false
X-AW-ApiVersion=5 X-AW-ApiVersion=5
X-AW-Interval=60 X-AW-Interval=60

View File

@ -1,8 +1,8 @@
[Desktop Entry] [Desktop Entry]
Encoding=UTF-8 Encoding=UTF-8
Name=MSFT.NASDAQ Name=MSFT
Comment=Microsoft Corp Comment=Microsoft Corp
X-AW-Ticker="MSFT" X-AW-Ticker="MSFT.US"
X-AW-Active=false X-AW-Active=false
X-AW-ApiVersion=5 X-AW-ApiVersion=5
X-AW-Interval=60 X-AW-Interval=60

View File

@ -54,7 +54,7 @@ QVariantHash StooqQuotesProvider::parse(const QByteArray &_source, const QVarian
QVariantHash values; QVariantHash values;
QStringList sourceValues = QString::fromUtf8(_source).trimmed().split(','); auto sourceValues = QString::fromUtf8(_source).trimmed().split(',');
if (sourceValues.count() != 2) { if (sourceValues.count() != 2) {
qCWarning(LOG_LIB) << "Parse error" << sourceValues; qCWarning(LOG_LIB) << "Parse error" << sourceValues;
return values; return values;
@ -67,12 +67,12 @@ QVariantHash StooqQuotesProvider::parse(const QByteArray &_source, const QVarian
// last trade // last trade
auto price = sourceValues.at(0).toDouble(); auto price = sourceValues.at(0).toDouble();
values[tag("pricechg")] = oldPrice == 0.0 ? 0.0 : price - oldPrice; values[tag("pricechg")] = oldPrice == 0.0 ? 0.0 : price - oldPrice;
values[tag("percpricechg")] = 100.0 * values[tag("pricechg")].toDouble() / price; values[tag("percpricechg")] = 100.0 * values[tag("pricechg")].toDouble() / oldPrice;
values[tag("price")] = price; values[tag("price")] = price;
// volume // volume
auto volume = sourceValues.at(1).toInt(); auto volume = sourceValues.at(1).toInt();
values[tag("volumechg")] = oldVolume == 0 ? 0 : volume - oldVolume; values[tag("volumechg")] = oldVolume == 0 ? 0 : volume - oldVolume;
values[tag("percvolumechg")] = 100.0 * values[tag("volumechg")].toDouble() / volume; values[tag("percvolumechg")] = 100.0 * values[tag("volumechg")].toDouble() / oldVolume;
values[tag("volume")] = volume; values[tag("volume")] = volume;
return values; return values;

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,28 +15,21 @@
* 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.kcmutils as KCM
import org.kde.plasma.private.desktoppanel 1.0 import org.kde.plasma.private.desktoppanel 1.0
Item { KCM.SimpleKCM {
id: aboutPage id: aboutPage
// backend // backend
DPAdds { DPAdds {
id: dpAdds id: dpAdds
} }
width: childrenRect.width
height: childrenRect.height
property bool debug: awActions.isDebugEnabled()
AboutTab { AboutTab {
textProvider: dpAdds textProvider: dpAdds
} }
Component.onCompleted: {
if (debug) console.debug()
}
} }

View File

@ -15,25 +15,15 @@
* 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.kcmutils as KCM
import org.kde.plasma.private.desktoppanel 1.0 import org.kde.plasma.private.desktoppanel 1.0
import "." import "."
Item { KCM.SimpleKCM {
id: activeAppearancePage id: activeAppearancePage
// backend
DPAdds {
id: dpAdds
}
width: childrenRect.width
height: childrenRect.height
implicitWidth: pageColumn.implicitWidth
implicitHeight: pageColumn.implicitHeight
property bool debug: dpAdds.isDebugEnabled()
property alias cfg_currentFontFamily: font.value property alias cfg_currentFontFamily: font.value
property alias cfg_currentFontSize: fontSize.value property alias cfg_currentFontSize: fontSize.value
@ -43,7 +33,6 @@ Item {
property alias cfg_currentTextStyleColor: selectStyleColor.value property alias cfg_currentTextStyleColor: selectStyleColor.value
property string cfg_currentTextStyle: textStyle.value property string cfg_currentTextStyle: textStyle.value
Column { Column {
id: pageColumn id: pageColumn
anchors.fill: parent anchors.fill: parent
@ -99,9 +88,4 @@ Item {
value: plasmoid.configuration.currentTextStyleColor value: plasmoid.configuration.currentTextStyleColor
} }
} }
Component.onCompleted: {
if (debug) console.debug()
}
} }

View File

@ -15,25 +15,15 @@
* 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.kcmutils as KCM
import org.kde.plasma.private.desktoppanel 1.0 import org.kde.plasma.private.desktoppanel 1.0
Item { KCM.SimpleKCM {
id: advancedPage id: advancedPage
// backend
DPAdds {
id: dpAdds
}
width: childrenRect.width
height: childrenRect.height
implicitWidth: pageColumn.implicitWidth
implicitHeight: pageColumn.implicitHeight
property bool debug: dpAdds.isDebugEnabled()
property alias cfg_background: background.checked property alias cfg_background: background.checked
property alias cfg_verticalLayout: verticalLayout.checked property alias cfg_verticalLayout: verticalLayout.checked
@ -44,7 +34,6 @@ Item {
property alias cfg_tooltipWidth: tooltipWidth.value property alias cfg_tooltipWidth: tooltipWidth.value
property alias cfg_tooltipColor: tooltipColor.value property alias cfg_tooltipColor: tooltipColor.value
Column { Column {
id: pageColumn id: pageColumn
anchors.fill: parent anchors.fill: parent
@ -82,48 +71,48 @@ Item {
editable: true editable: true
model: [ model: [
{ {
'label': '#', "label": "#",
'name': '#' "name": "#"
}, },
{ {
'label': '$', "label": "$",
'name': '$' "name": "$"
}, },
{ {
'label': '%', "label": "%",
'name': '%' "name": "%"
}, },
{ {
'label': '&', "label": "&",
'name': '&' "name": "&"
}, },
{ {
'label': '*', "label": "*",
'name': '*' "name": "*"
}, },
{ {
'label': '@', "label": "@",
'name': '@' "name": "@"
}, },
{ {
'label': '¤', "label": "¤",
'name': '¤' "name": "¤"
}, },
{ {
'label': '¶', "label": "¶",
'name': '¶' "name": "¶"
}, },
{ {
'label': '·', "label": "·",
'name': '·' "name": "·"
}, },
{ {
'label': 'º', "label": "º",
'name': 'º' "name": "º"
}, },
{ {
'label': plasmoid.configuration.mark, "label": plasmoid.configuration.mark,
'name': plasmoid.configuration.mark "name": plasmoid.configuration.mark
} }
] ]
text: i18n("Mark") text: i18n("Mark")
@ -131,7 +120,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")
@ -144,16 +133,16 @@ Item {
id: tooltipType id: tooltipType
model: [ model: [
{ {
'label': i18n("contours"), "label": i18n("contours"),
'name': "contours" "name": "contours"
}, },
{ {
'label': i18n("names"), "label": i18n("names"),
'name': "names" "name": "names"
}, },
{ {
'label': i18n("none"), "label": i18n("none"),
'name': "none" "name": "none"
} }
] ]
text: i18n("Tooltip type") text: i18n("Tooltip type")
@ -178,8 +167,4 @@ Item {
} }
} }
} }
Component.onCompleted: {
if (debug) console.debug()
}
} }

View File

@ -15,25 +15,15 @@
* 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.kcmutils as KCM
import org.kde.plasma.private.desktoppanel 1.0 import org.kde.plasma.private.desktoppanel 1.0
import "." import "."
Item { KCM.SimpleKCM {
id: inactiveAppearancePage id: inactiveAppearancePage
// backend
DPAdds {
id: dpAdds
}
width: childrenRect.width
height: childrenRect.height
implicitWidth: pageColumn.implicitWidth
implicitHeight: pageColumn.implicitHeight
property bool debug: dpAdds.isDebugEnabled()
property alias cfg_fontFamily: font.value property alias cfg_fontFamily: font.value
property alias cfg_fontSize: fontSize.value property alias cfg_fontSize: fontSize.value
@ -43,7 +33,6 @@ Item {
property alias cfg_textStyleColor: selectStyleColor.value property alias cfg_textStyleColor: selectStyleColor.value
property string cfg_textStyle: textStyle.value property string cfg_textStyle: textStyle.value
Column { Column {
id: pageColumn id: pageColumn
anchors.fill: parent anchors.fill: parent
@ -99,9 +88,4 @@ Item {
value: plasmoid.configuration.textStyleColor value: plasmoid.configuration.textStyleColor
} }
} }
Component.onCompleted: {
if (debug) console.debug()
}
} }

View File

@ -15,25 +15,23 @@
* 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 {
id: dpAdds id: dpAdds
} }
property bool debug: dpAdds.isDebugEnabled()
property variant tooltipSettings: { property variant tooltipSettings: {
"tooltipColor": plasmoid.configuration.tooltipColor, "tooltipColor": plasmoid.configuration.tooltipColor,
"tooltipType": plasmoid.configuration.tooltipType, "tooltipType": plasmoid.configuration.tooltipType,
@ -44,17 +42,12 @@ Item {
signal needTooltipUpdate signal needTooltipUpdate
signal sizeUpdate signal sizeUpdate
// 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"
Plasmoid.backgroundHints: plasmoid.configuration.background ? "DefaultBackground" : "NoBackground" Plasmoid.backgroundHints: plasmoid.configuration.background ? "DefaultBackground" : "NoBackground"
// ui // ui
GridLayout { GridLayout {
anchors.fill: parent anchors.fill: parent
@ -101,7 +94,6 @@ Item {
} }
} }
Timer { Timer {
id: timer id: timer
interval: 1000 interval: 1000
@ -109,19 +101,16 @@ Item {
} }
onNeedUpdate: { onNeedUpdate: {
if (debug) console.debug() for (let i = 0; i < repeater.count; i++) {
for (var i=0; i<repeater.count; i++) {
if (!repeater.itemAt(i)) { if (!repeater.itemAt(i)) {
if (debug) console.info("Nothing to do here yet", i)
timer.start() timer.start()
return return
} }
repeater.itemAt(i).text = dpAdds.parsePattern(plasmoid.configuration.text, i) repeater.itemAt(i).text = dpAdds.parsePattern(plasmoid.configuration.text, i)
if (dpAdds.currentDesktop() == i) { if (dpAdds.currentDesktop() === i) {
repeater.itemAt(i).color = plasmoid.configuration.currentFontColor repeater.itemAt(i).color = plasmoid.configuration.currentFontColor
repeater.itemAt(i).font.family = plasmoid.configuration.currentFontFamily repeater.itemAt(i).font.family = plasmoid.configuration.currentFontFamily
repeater.itemAt(i).font.italic = plasmoid.configuration.currentFontStyle == "italic" repeater.itemAt(i).font.italic = plasmoid.configuration.currentFontStyle === "italic"
repeater.itemAt(i).font.pointSize = plasmoid.configuration.currentFontSize repeater.itemAt(i).font.pointSize = plasmoid.configuration.currentFontSize
repeater.itemAt(i).font.weight = General.fontWeight[plasmoid.configuration.currentFontWeight] repeater.itemAt(i).font.weight = General.fontWeight[plasmoid.configuration.currentFontWeight]
repeater.itemAt(i).style = General.textStyle[plasmoid.configuration.currentTextStyle] repeater.itemAt(i).style = General.textStyle[plasmoid.configuration.currentTextStyle]
@ -129,7 +118,7 @@ Item {
} else { } else {
repeater.itemAt(i).color = plasmoid.configuration.fontColor repeater.itemAt(i).color = plasmoid.configuration.fontColor
repeater.itemAt(i).font.family = plasmoid.configuration.fontFamily repeater.itemAt(i).font.family = plasmoid.configuration.fontFamily
repeater.itemAt(i).font.italic = plasmoid.configuration.fontStyle == "italic" repeater.itemAt(i).font.italic = plasmoid.configuration.fontStyle === "italic"
repeater.itemAt(i).font.pointSize = plasmoid.configuration.fontSize repeater.itemAt(i).font.pointSize = plasmoid.configuration.fontSize
repeater.itemAt(i).font.weight = General.fontWeight[plasmoid.configuration.fontWeight] repeater.itemAt(i).font.weight = General.fontWeight[plasmoid.configuration.fontWeight]
repeater.itemAt(i).style = General.textStyle[plasmoid.configuration.textStyle] repeater.itemAt(i).style = General.textStyle[plasmoid.configuration.textStyle]
@ -143,13 +132,11 @@ Item {
} }
onNeedTooltipUpdate: { onNeedTooltipUpdate: {
if (debug) console.debug() for (let i = 0; i < repeater.count; i++) {
for (var i=0; i<repeater.count; i++) {
repeater.itemAt(i).tooltip.text = dpAdds.toolTipImage(i) repeater.itemAt(i).tooltip.text = dpAdds.toolTipImage(i)
// resize text tooltip to content size // resize text tooltip to content size
// this hack does not work for images-based tooltips // this hack does not work for images-based tooltips
if (tooltipSettings.tooltipType == "names") { if (tooltipSettings.tooltipType === "names") {
repeater.itemAt(i).tooltip.height = repeater.itemAt(i).tooltip.implicitHeight repeater.itemAt(i).tooltip.height = repeater.itemAt(i).tooltip.implicitHeight
repeater.itemAt(i).tooltip.width = repeater.itemAt(i).tooltip.implicitWidth repeater.itemAt(i).tooltip.width = repeater.itemAt(i).tooltip.implicitWidth
} }
@ -157,11 +144,9 @@ Item {
} }
onSizeUpdate: { onSizeUpdate: {
if (debug) console.debug() if (plasmoid.configuration.height === 0) {
let newHeight = 0
if (plasmoid.configuration.height == 0) { for (let i = 0; i < repeater.count; i++)
var newHeight = 0
for (var i=0; i<repeater.count; i++)
newHeight += repeater.itemAt(i).contentHeight newHeight += repeater.itemAt(i).contentHeight
Layout.minimumHeight = newHeight Layout.minimumHeight = newHeight
Layout.maximumHeight = -1 Layout.maximumHeight = -1
@ -169,9 +154,9 @@ Item {
Layout.minimumHeight = plasmoid.configuration.height Layout.minimumHeight = plasmoid.configuration.height
Layout.maximumHeight = plasmoid.configuration.height Layout.maximumHeight = plasmoid.configuration.height
} }
if (plasmoid.configuration.width == 0) { if (plasmoid.configuration.width === 0) {
var newWidth = 0 let newWidth = 0
for (var i=0; i<repeater.count; i++) for (let i = 0; i < repeater.count; i++)
newWidth += repeater.itemAt(i).contentWidth newWidth += repeater.itemAt(i).contentWidth
Layout.minimumWidth = newWidth Layout.minimumWidth = newWidth
Layout.maximumWidth = -1 Layout.maximumWidth = -1
@ -183,7 +168,6 @@ Item {
Plasmoid.onUserConfiguringChanged: { Plasmoid.onUserConfiguringChanged: {
if (plasmoid.userConfiguring) return if (plasmoid.userConfiguring) return
if (debug) console.debug()
dpAdds.setMark(plasmoid.configuration.mark) dpAdds.setMark(plasmoid.configuration.mark)
dpAdds.setToolTipData(tooltipSettings) dpAdds.setToolTipData(tooltipSettings)
@ -192,8 +176,6 @@ Item {
} }
Component.onCompleted: { Component.onCompleted: {
if (debug) console.debug()
// init submodule // init submodule
Plasmoid.userConfiguringChanged(false) Plasmoid.userConfiguringChanged(false)
dpAdds.desktopChanged.connect(needUpdate) dpAdds.desktopChanged.connect(needUpdate)

View File

@ -15,29 +15,22 @@
* 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.kcmutils as KCM
import org.kde.plasma.private.desktoppanel 1.0 import org.kde.plasma.private.desktoppanel 1.0
import "." import "."
Item { KCM.SimpleKCM {
id: widgetPage id: widgetPage
// backend // backend
DPAdds { DPAdds {
id: dpAdds id: dpAdds
} }
width: childrenRect.width
height: childrenRect.height
implicitWidth: pageColumn.implicitWidth
implicitHeight: pageColumn.implicitHeight
property bool debug: dpAdds.isDebugEnabled()
property alias cfg_text: textPattern.text property alias cfg_text: textPattern.text
Column { Column {
id: pageColumn id: pageColumn
anchors.fill: parent anchors.fill: parent
@ -60,9 +53,4 @@ Item {
backend: dpAdds backend: dpAdds
} }
} }
Component.onCompleted: {
if (debug) console.debug()
}
} }

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": "4.0.0",
"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

@ -49,9 +49,7 @@ DPAdds::DPAdds(QObject *_parent)
m_vdi = new TaskManager::VirtualDesktopInfo(this); m_vdi = new TaskManager::VirtualDesktopInfo(this);
m_taskModel = new TaskManager::WindowTasksModel(this); m_taskModel = new TaskManager::WindowTasksModel(this);
connect(m_vdi, SIGNAL(currentDesktopChanged()), this, SIGNAL(desktopChanged())); connect(m_vdi, &TaskManager::VirtualDesktopInfo::currentDesktopChanged, this, &DPAdds::desktopChanged);
connect(KWindowSystem::self(), SIGNAL(windowAdded(WId)), this, SIGNAL(windowListChanged()));
connect(KWindowSystem::self(), SIGNAL(windowRemoved(WId)), this, SIGNAL(windowListChanged()));
} }
@ -64,13 +62,6 @@ DPAdds::~DPAdds()
} }
// HACK: since QML could not use QLoggingCategory I need this hack
bool DPAdds::isDebugEnabled()
{
return LOG_DP().isDebugEnabled();
}
int DPAdds::currentDesktop() const int DPAdds::currentDesktop() const
{ {
auto current = m_vdi->currentDesktop(); auto current = m_vdi->currentDesktop();
@ -223,7 +214,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

@ -46,7 +46,6 @@ class DPAdds : public QObject
public: public:
explicit DPAdds(QObject *_parent = nullptr); explicit DPAdds(QObject *_parent = nullptr);
~DPAdds() override; ~DPAdds() override;
Q_INVOKABLE static bool isDebugEnabled();
Q_INVOKABLE [[nodiscard]] int currentDesktop() const; Q_INVOKABLE [[nodiscard]] int currentDesktop() const;
Q_INVOKABLE static QStringList dictKeys(bool _sorted = true, const QString &_regexp = ""); Q_INVOKABLE static QStringList dictKeys(bool _sorted = true, const QString &_regexp = "");
Q_INVOKABLE [[nodiscard]] int numberOfDesktops() const; Q_INVOKABLE [[nodiscard]] int numberOfDesktops() const;

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>
@ -25,8 +27,6 @@
#include "awdebug.h" #include "awdebug.h"
#include "extsysmonaggregator.h" #include "extsysmonaggregator.h"
#include "gpuloadsource.h"
#include "hddtempsource.h"
ExtendedSysMon::ExtendedSysMon(QObject *_parent, const QVariantList &_args) ExtendedSysMon::ExtendedSysMon(QObject *_parent, const QVariantList &_args)
@ -38,35 +38,19 @@ 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;
settings.beginGroup("Configuration"); settings.beginGroup("Configuration");
rawConfig["ACPIPATH"] = settings.value("ACPIPATH", "/sys/class/power_supply/").toString(); rawConfig["ACPIPATH"] = settings.value("ACPIPATH", "/sys/class/power_supply/").toString();
rawConfig["GPUDEV"] = settings.value("GPUDEV", "auto").toString();
rawConfig["HDDDEV"] = settings.value("HDDDEV", "all").toString();
rawConfig["HDDTEMPCMD"] = settings.value("HDDTEMPCMD", "sudo smartctl -a").toString();
rawConfig["MPDADDRESS"] = settings.value("MPDADDRESS", "localhost").toString(); rawConfig["MPDADDRESS"] = settings.value("MPDADDRESS", "localhost").toString();
rawConfig["MPDPORT"] = settings.value("MPDPORT", "6600").toString(); rawConfig["MPDPORT"] = settings.value("MPDPORT", "6600").toString();
rawConfig["MPRIS"] = settings.value("MPRIS", "auto").toString(); rawConfig["MPRIS"] = settings.value("MPRIS", "auto").toString();
@ -82,31 +66,6 @@ QHash<QString, QString> ExtendedSysMon::updateConfiguration(QHash<QString, QStri
{ {
qCDebug(LOG_ESM) << "Raw configuration" << _rawConfig; qCDebug(LOG_ESM) << "Raw configuration" << _rawConfig;
// gpudev
if (_rawConfig["GPUDEV"] == "disable")
;
else if (_rawConfig["GPUDEV"] == "auto")
_rawConfig["GPUDEV"] = GPULoadSource::autoGpu();
else if ((_rawConfig["GPUDEV"] != "ati") && (_rawConfig["GPUDEV"] != "nvidia"))
_rawConfig["GPUDEV"] = GPULoadSource::autoGpu();
// hdddev
QStringList allHddDevices = HDDTemperatureSource::allHdd();
if (_rawConfig["HDDDEV"] == "all") {
_rawConfig["HDDDEV"] = allHddDevices.join(',');
} else if (_rawConfig["HDDDEV"] == "disable") {
_rawConfig["HDDDEV"] = "";
} else {
QStringList deviceList = _rawConfig["HDDDEV"].split(',', Qt::SkipEmptyParts);
QStringList devices;
auto diskRegexp = QRegularExpression("^/dev/[hms]d[a-z]$");
for (auto &device : deviceList)
if ((QFile::exists(device)) && (device.contains(diskRegexp)))
devices.append(device);
if (devices.isEmpty())
_rawConfig["HDDDEV"] = allHddDevices.join(',');
else
_rawConfig["HDDDEV"] = devices.join(',');
}
// player // player
if ((_rawConfig["PLAYER"] != "mpd") && (_rawConfig["PLAYER"] != "mpris") && (_rawConfig["PLAYER"] != "disable")) if ((_rawConfig["PLAYER"] != "mpd") && (_rawConfig["PLAYER"] != "mpris") && (_rawConfig["PLAYER"] != "disable"))
_rawConfig["PLAYER"] = "mpris"; _rawConfig["PLAYER"] = "mpris";

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

@ -22,9 +22,6 @@
#include "customsource.h" #include "customsource.h"
#include "desktopsource.h" #include "desktopsource.h"
#include "extsysmonsensor.h" #include "extsysmonsensor.h"
#include "gpuloadsource.h"
#include "gputempsource.h"
#include "hddtempsource.h"
#include "loadsource.h" #include "loadsource.h"
#include "networksource.h" #include "networksource.h"
#include "playersource.h" #include "playersource.h"
@ -32,6 +29,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 +44,47 @@ 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, {}); // FIXME causes segfault in kde libs
for (auto &source : desktopItem->sources()) // createSensor("desktop", i18n("Desktop"), new DesktopSource(this, {}));
addObject(new ExtSysMonSensor(this, source, desktopItem));
// gpu load
auto gpuLoadItem = new GPULoadSource(this, {_config["GPUDEV"]});
for (auto &source : gpuLoadItem->sources())
addObject(new ExtSysMonSensor(this, source, gpuLoadItem));
// gpu temperature
auto gpuTempItem = new GPUTemperatureSource(this, {_config["GPUDEV"]});
for (auto &source : gpuTempItem->sources())
addObject(new ExtSysMonSensor(this, source, gpuTempItem));
// hdd temperature
auto hddTempItem
= 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

@ -1,13 +1,6 @@
[Configuration] [Configuration]
# ACPI devices # ACPI devices
ACPIPATH=/sys/class/power_supply/ ACPIPATH=/sys/class/power_supply/
# May be 'nvidia' (for nvidia), 'ati' (for ATI RADEON), 'disable' or 'auto'
GPUDEV=auto
# HDD temperature
## Set block device for hddtemp comma separated or use 'all' or 'disable'
HDDDEV=all
# cmd
HDDTEMPCMD=sudo smartctl -a
# mpd server settings # mpd server settings
MPDADDRESS=localhost MPDADDRESS=localhost
MPDPORT=6600 MPDPORT=6600

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

@ -1,151 +0,0 @@
/***************************************************************************
* 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 "gpuloadsource.h"
#include <ksysguard/formatter/Unit.h>
#include <ksysguard/systemstats/SensorInfo.h>
#include <QFile>
#include <QProcess>
#include "awdebug.h"
GPULoadSource::GPULoadSource(QObject *_parent, const QStringList &_args)
: AbstractExtSysMonSource(_parent, _args)
{
Q_ASSERT(_args.count() == 1);
qCDebug(LOG_ESS) << __PRETTY_FUNCTION__;
m_device = _args.at(0);
m_process = new QProcess(nullptr);
// fucking magic from http://doc.qt.io/qt-5/qprocess.html#finished
connect(m_process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
[this](int, QProcess::ExitStatus) { return updateValue(); });
m_process->waitForFinished(0);
}
GPULoadSource::~GPULoadSource()
{
qCDebug(LOG_ESS) << __PRETTY_FUNCTION__;
m_process->kill();
m_process->deleteLater();
}
QString GPULoadSource::autoGpu()
{
QString gpu = "disable";
QFile moduleFile("/proc/modules");
if (!moduleFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
qCWarning(LOG_AW) << "Could not open file as text" << moduleFile.fileName();
return gpu;
}
QString output = moduleFile.readAll();
moduleFile.close();
if (output.contains("fglrx"))
gpu = "ati";
else if (output.contains("nvidia"))
gpu = "nvidia";
qCInfo(LOG_ESM) << "Device" << gpu;
return gpu;
}
QVariant GPULoadSource::data(const QString &_source)
{
qCDebug(LOG_ESS) << "Source" << _source;
if (_source == "gpu/load")
run();
return m_values[_source];
}
KSysGuard::SensorInfo *GPULoadSource::initialData(const QString &_source) const
{
qCDebug(LOG_ESS) << "Source" << _source;
auto data = new KSysGuard::SensorInfo();
if (_source == "gpu/load") {
data->min = 0.0;
data->max = 100.0;
data->name = "GPU usage";
data->variantType = QVariant::Double;
data->unit = KSysGuard::UnitPercent;
}
return data;
}
void GPULoadSource::run()
{
if ((m_device != "nvidia") && (m_device != "ati"))
return;
// build cmd
QString cmd = m_device == "nvidia" ? "nvidia-smi" : "aticonfig";
auto args = m_device == "nvidia" ? QStringList({"-q", "-x"}) : QStringList({"--od-getclocks"});
qCInfo(LOG_ESS) << "cmd" << cmd;
m_process->start(cmd, args);
}
QStringList GPULoadSource::sources() const
{
QStringList sources;
sources.append("gpu/load");
return sources;
}
void GPULoadSource::updateValue()
{
qCInfo(LOG_ESS) << "Cmd returns" << m_process->exitCode();
QString qdebug = QString::fromUtf8(m_process->readAllStandardError()).trimmed();
qCInfo(LOG_ESS) << "Error" << qdebug;
QString qoutput = QString::fromUtf8(m_process->readAllStandardOutput()).trimmed();
qCInfo(LOG_ESS) << "Output" << qoutput;
if (m_device == "nvidia") {
for (auto &str : qoutput.split('\n', Qt::SkipEmptyParts)) {
if (!str.contains("<gpu_util>"))
continue;
auto load = str.remove("<gpu_util>").remove("</gpu_util>").remove('%');
m_values["gpu/load"] = load.toFloat();
break;
}
} else if (m_device == "ati") {
for (auto &str : qoutput.split('\n', Qt::SkipEmptyParts)) {
if (!str.contains("load"))
continue;
QString load = str.split(' ', Qt::SkipEmptyParts)[3].remove('%');
m_values["gpu/load"] = load.toFloat();
break;
}
}
emit(dataReceived(m_values));
}

View File

@ -1,131 +0,0 @@
/***************************************************************************
* 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 "gputempsource.h"
#include <ksysguard/formatter/Unit.h>
#include <ksysguard/systemstats/SensorInfo.h>
#include <QFile>
#include <QProcess>
#include "awdebug.h"
GPUTemperatureSource::GPUTemperatureSource(QObject *_parent, const QStringList &_args)
: AbstractExtSysMonSource(_parent, _args)
{
Q_ASSERT(_args.count() == 1);
qCDebug(LOG_ESS) << __PRETTY_FUNCTION__;
m_device = _args.at(0);
m_process = new QProcess(nullptr);
// fucking magic from http://doc.qt.io/qt-5/qprocess.html#finished
connect(m_process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
[this](int, QProcess::ExitStatus) { return updateValue(); });
m_process->waitForFinished(0);
}
GPUTemperatureSource::~GPUTemperatureSource()
{
qCDebug(LOG_ESS) << __PRETTY_FUNCTION__;
m_process->kill();
m_process->deleteLater();
}
QVariant GPUTemperatureSource::data(const QString &_source)
{
qCDebug(LOG_ESS) << "Source" << _source;
if (_source == "gpu/temperature")
run();
return m_values[_source];
}
KSysGuard::SensorInfo *GPUTemperatureSource::initialData(const QString &_source) const
{
qCDebug(LOG_ESS) << "Source" << _source;
auto data = new KSysGuard::SensorInfo();
if (_source == "gpu/temperature") {
data->min = 0.0;
data->max = 0.0;
data->name = "GPU temperature";
data->variantType = QVariant::Double;
data->unit = KSysGuard::UnitCelsius;
}
return data;
}
void GPUTemperatureSource::run()
{
if ((m_device != "nvidia") && (m_device != "ati"))
return;
// build cmd
QString cmd = m_device == "nvidia" ? "nvidia-smi" : "aticonfig";
auto args = m_device == "nvidia" ? QStringList({"-q", "-x"}) : QStringList({"--od-gettemperature"});
qCInfo(LOG_ESS) << "cmd" << cmd;
m_process->start(cmd, args);
}
QStringList GPUTemperatureSource::sources() const
{
QStringList sources;
sources.append("gpu/temperature");
return sources;
}
void GPUTemperatureSource::updateValue()
{
qCInfo(LOG_ESS) << "Cmd returns" << m_process->exitCode();
QString qdebug = QString::fromUtf8(m_process->readAllStandardError()).trimmed();
qCInfo(LOG_ESS) << "Error" << qdebug;
QString qoutput = QString::fromUtf8(m_process->readAllStandardOutput()).trimmed();
qCInfo(LOG_ESS) << "Output" << qoutput;
if (m_device == "nvidia") {
for (auto &str : qoutput.split('\n', Qt::SkipEmptyParts)) {
if (!str.contains("<gpu_temp>"))
continue;
QString temp = str.remove("<gpu_temp>").remove("C</gpu_temp>");
m_values["gpu/temperature"] = temp.toFloat();
break;
}
} else if (m_device == "ati") {
for (auto &str : qoutput.split('\n', Qt::SkipEmptyParts)) {
if (!str.contains("Temperature"))
continue;
QString temp = str.split(' ', Qt::SkipEmptyParts).at(4);
m_values["gpu/temperature"] = temp.toFloat();
break;
}
}
emit(dataReceived(m_values));
}

View File

@ -1,152 +0,0 @@
/***************************************************************************
* 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 "hddtempsource.h"
#include <ksysguard/formatter/Unit.h>
#include <ksysguard/systemstats/SensorInfo.h>
#include <QDir>
#include <QProcess>
#include "awdebug.h"
HDDTemperatureSource::HDDTemperatureSource(QObject *_parent, const QStringList &_args)
: AbstractExtSysMonSource(_parent, _args)
{
Q_ASSERT(_args.count() == 2);
qCDebug(LOG_ESS) << __PRETTY_FUNCTION__;
m_devices = _args.at(0).split(',', Qt::SkipEmptyParts);
m_cmd = _args.at(1).split(' '); // lets hope no one put cmd with spaces here lol
m_smartctl = m_cmd.contains("smartctl");
qCInfo(LOG_ESS) << "Parse as smartctl" << m_smartctl;
for (auto &device : m_devices) {
m_processes[device] = new QProcess(nullptr);
// fucking magic from http://doc.qt.io/qt-5/qprocess.html#finished
connect(m_processes[device], QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
[this, &device](int, QProcess::ExitStatus) { return updateValue(device); });
m_processes[device]->waitForFinished(0);
}
}
HDDTemperatureSource::~HDDTemperatureSource()
{
qCDebug(LOG_ESS) << __PRETTY_FUNCTION__;
for (auto &device : m_devices) {
m_processes[device]->kill();
m_processes[device]->deleteLater();
}
}
QStringList HDDTemperatureSource::allHdd()
{
QStringList allDevices = QDir("/dev").entryList(QDir::System, QDir::Name);
QStringList devices = allDevices.filter(QRegularExpression("^[hms]d[a-z]$"));
for (int i = 0; i < devices.count(); i++)
devices[i] = QString("/dev/%1").arg(devices.at(i));
qCInfo(LOG_ESS) << "Device list" << devices;
return devices;
}
QVariant HDDTemperatureSource::data(const QString &_source)
{
qCDebug(LOG_ESS) << "Source" << _source;
QString device = _source;
device.remove("hdd/temperature");
// run cmd
if (m_processes[device]->state() == QProcess::NotRunning) {
auto cmd = m_cmd.first();
auto args = m_cmd.mid(1);
args.append(device);
m_processes[device]->start(cmd, args);
}
return m_values[device];
}
KSysGuard::SensorInfo *HDDTemperatureSource::initialData(const QString &_source) const
{
qCDebug(LOG_ESS) << "Source" << _source;
auto device = _source;
device.remove("hdd/temperature");
auto data = new KSysGuard::SensorInfo();
data->min = 0.0;
data->max = 0.0;
data->name = QString("HDD '%1' temperature").arg(device);
data->variantType = QVariant::Double;
data->unit = KSysGuard::UnitCelsius;
return data;
}
QStringList HDDTemperatureSource::sources() const
{
QStringList sources;
for (auto &device : m_devices)
sources.append(QString("hdd/temperature%1").arg(device));
return sources;
}
void HDDTemperatureSource::updateValue(const QString &_device)
{
qCDebug(LOG_ESS) << "Called with device" << _device;
qCInfo(LOG_ESS) << "Cmd returns" << m_processes[_device]->exitCode();
QString qdebug = QString::fromUtf8(m_processes[_device]->readAllStandardError()).trimmed();
qCInfo(LOG_ESS) << "Error" << qdebug;
QString qoutput = QString::fromUtf8(m_processes[_device]->readAllStandardOutput()).trimmed();
qCInfo(LOG_ESS) << "Output" << qoutput;
// parse
if (m_smartctl) {
QStringList lines = qoutput.split('\n', Qt::SkipEmptyParts);
for (auto &str : lines) {
if (!str.startsWith("194"))
continue;
if (str.split(' ', Qt::SkipEmptyParts).count() < 9)
continue;
m_values[_device] = str.split(' ', Qt::SkipEmptyParts).at(9).toFloat();
break;
}
} else {
QStringList lines = qoutput.split(':', Qt::SkipEmptyParts);
if (lines.count() >= 3) {
QString temp = lines.at(2);
temp.remove(QChar(0260)).remove('C');
m_values[_device] = temp.toFloat();
}
}
emit(dataReceived(m_values));
}

View File

@ -1,55 +0,0 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#ifndef HDDTEMPSOURCE_H
#define HDDTEMPSOURCE_H
#include <QObject>
#include "abstractextsysmonsource.h"
class QProcess;
class HDDTemperatureSource : public AbstractExtSysMonSource
{
Q_OBJECT
public:
explicit HDDTemperatureSource(QObject *_parent, const QStringList &_args);
~HDDTemperatureSource() override;
static QStringList allHdd();
QVariant data(const QString &_source) override;
[[nodiscard]] KSysGuard::SensorInfo *initialData(const QString &_source) const override;
void run() override{};
[[nodiscard]] QStringList sources() const override;
private slots:
void updateValue(const QString &_device);
private:
// properties
QHash<QString, QProcess *> m_processes;
// configuration and values
QStringList m_cmd;
QStringList m_devices;
bool m_smartctl;
QHash<QString, QVariant> m_values;
};
#endif /* HDDTEMPSOURCE_H */

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

@ -15,38 +15,48 @@
* 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 GPULOADSOURCE_H #include "timesource.h"
#define GPULOADSOURCE_H
#include <QObject> #include <ksysguard/formatter/Unit.h>
#include <ksysguard/systemstats/SensorInfo.h>
#include "abstractextsysmonsource.h" #include "awdebug.h"
class QProcess; TimeSource::TimeSource(QObject *_parent, const QStringList &_args)
: AbstractExtSysMonSource(_parent, _args)
class GPULoadSource : public AbstractExtSysMonSource
{ {
Q_OBJECT Q_ASSERT(_args.count() == 0);
qCDebug(LOG_ESS) << __PRETTY_FUNCTION__;
public: }
explicit GPULoadSource(QObject *_parent, const QStringList &_args);
~GPULoadSource() override;
static QString autoGpu();
QVariant data(const QString &_source) override;
[[nodiscard]] KSysGuard::SensorInfo *initialData(const QString &_source) const override;
void run() override;
[[nodiscard]] QStringList sources() const override;
private slots:
void updateValue();
private:
// configuration and values
QString m_device;
QProcess *m_process = nullptr;
QVariantHash m_values;
};
#endif /* GPULOADSOURCE_H */ 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

@ -15,37 +15,22 @@
* 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 GPUTEMPSOURCE_H #pragma once
#define GPUTEMPSOURCE_H
#include <QObject> #include <QObject>
#include "abstractextsysmonsource.h" #include "abstractextsysmonsource.h"
#include "extitemaggregator.h"
class QProcess; class TimeSource : public AbstractExtSysMonSource
class GPUTemperatureSource : public AbstractExtSysMonSource
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit GPUTemperatureSource(QObject *_parent, const QStringList &_args); explicit TimeSource(QObject *_parent, const QStringList &_args);
~GPUTemperatureSource() override;
QVariant data(const QString &_source) override; QVariant data(const QString &_source) override;
[[nodiscard]] KSysGuard::SensorInfo *initialData(const QString &_source) const override; [[nodiscard]] KSysGuard::SensorInfo *initialData(const QString &_source) const override;
void run() override; void run() override{};
[[nodiscard]] QStringList sources() const override; [[nodiscard]] QStringList sources() const override;
private slots:
void updateValue();
private:
// configuration and values
QString m_device;
QProcess *m_process = nullptr;
QVariantHash m_values;
}; };
#endif /* GPUTEMPSOURCE_H */

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

@ -68,23 +68,27 @@ Row {
} }
} }
// TODO migrate history Button {
// Button { width: parent.width / 15
// width: parent.width / 15 icon.name: "view-history"
// iconName: "view-history"
// menu: Menu { onClicked: historyConfig.open()
// id: historyConfig
// Instantiator { Menu {
// model: awTelemetryHandler.get("awwidgetconfig") id: historyConfig
// MenuItem {
// text: modelData Instantiator {
// onTriggered: textArea.text = modelData model: awTelemetryHandler.get("awwidgetconfig")
// } delegate: MenuItem {
// onObjectAdded: historyConfig.insertItem(index, object) text: modelData
// onObjectRemoved: historyConfig.removeItem(object) onTriggered: textArea.text = modelData
// } }
// }
// } onObjectAdded: (index, object) => historyConfig.insertItem(index, object)
onObjectRemoved: (index, object) => historyConfig.removeItem(object)
}
}
}
MessageDialog { MessageDialog {
id: compiledText id: compiledText

View File

@ -23,7 +23,9 @@ Label {
width: parent.width width: parent.width
horizontalAlignment: Text.AlignHCenter horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
wrapMode: Text.WordWrap wrapMode: Text.WordWrap
text: i18n("Detailed information may be found on <a href=\"https://arcanis.me/projects/awesome-widgets/\">project homepage</a>") text: i18n("Detailed information may be found on <a href=\"https://arcanis.me/projects/awesome-widgets/\">project homepage</a>")
onLinkActivated: Qt.openUrlExternally(link) onLinkActivated: Qt.openUrlExternally(link)
} }

View File

@ -19,7 +19,7 @@ import QtQuick 2.15
import QtQuick.Controls import QtQuick.Controls
Item { ScrollView {
width: parent.width width: parent.width
height: parent.height * 4 / 5 height: parent.height * 4 / 5
@ -28,7 +28,6 @@ Item {
TextArea { TextArea {
id: textArea id: textArea
anchors.fill: parent
textFormat: TextEdit.PlainText textFormat: TextEdit.PlainText
Column { Column {
@ -50,9 +49,9 @@ Item {
} }
onTextChanged: { onTextChanged: {
var currentTag = getLastTag() let currentTag = getLastTag()
// exit if there are spaces or empty // exit if there are spaces or empty
if ((currentTag.indexOf(" ") != -1) || (currentTag.length == 0)) { if ((currentTag.indexOf(" ") !== -1) || (currentTag.length === 0)) {
tooltip.visible = false tooltip.visible = false
return return
} }
@ -63,7 +62,7 @@ Item {
// show tooltip if found more than 1 or current text does not match // show tooltip if found more than 1 or current text does not match
// tag found // tag found
tooltip.visible = ((tags.count > 1) tooltip.visible = ((tags.count > 1)
|| ((tags.count == 1) && (tags.model[0] != tooltip.substring))) || ((tags.count === 1) && (tags.model[0] !== tooltip.substring)))
} }
} }
@ -78,10 +77,10 @@ Item {
function getLastTag() { function getLastTag() {
// get substring to analyze // get substring to analyze
var substring = textArea.getText(0, textArea.cursorPosition) const substring = textArea.getText(0, textArea.cursorPosition)
// find last position of index in the given substring // find last position of index in the given substring
var signIndex = substring.lastIndexOf('$') + 1 const signIndex = substring.lastIndexOf("$") + 1
if ((signIndex == 0) || (signIndex == textArea.cursorPosition)) if ((signIndex === 0) || (signIndex === textArea.cursorPosition))
return "" return ""
// get current tag text // get current tag text
return substring.substr(signIndex) return substring.substr(signIndex)

View File

@ -34,8 +34,6 @@ Dialog {
width: 640 width: 640
height: 480 height: 480
property bool debug: awActions.isDebugEnabled()
title: i18n("Report a bug") title: i18n("Report a bug")
standardButtons: DialogButtonBox.Ok | DialogButtonBox.Cancel | DialogButtonBox.Reset standardButtons: DialogButtonBox.Ok | DialogButtonBox.Cancel | DialogButtonBox.Reset
@ -48,6 +46,7 @@ Dialog {
Layout.fillWidth: true Layout.fillWidth: true
placeholderText: i18n("Report subject") placeholderText: i18n("Report subject")
} }
ColumnLayout { ColumnLayout {
Layout.fillWidth: true Layout.fillWidth: true
@ -55,41 +54,50 @@ Dialog {
Layout.fillWidth: true Layout.fillWidth: true
height: parent.height / 5 height: parent.height / 5
title: i18n("Description") title: i18n("Description")
TextArea { TextArea {
id: description id: description
anchors.fill: parent anchors.fill: parent
textFormat: TextEdit.PlainText textFormat: TextEdit.PlainText
} }
} }
GroupBox { GroupBox {
Layout.fillWidth: true Layout.fillWidth: true
height: parent.height / 5 height: parent.height / 5
title: i18n("Steps to reproduce") title: i18n("Steps to reproduce")
TextArea { TextArea {
id: reproduce id: reproduce
anchors.fill: parent anchors.fill: parent
textFormat: TextEdit.PlainText textFormat: TextEdit.PlainText
} }
} }
GroupBox { GroupBox {
Layout.fillWidth: true Layout.fillWidth: true
height: parent.height / 5 height: parent.height / 5
title: i18n("Expected result") title: i18n("Expected result")
TextArea { TextArea {
id: expected id: expected
anchors.fill: parent anchors.fill: parent
textFormat: TextEdit.PlainText textFormat: TextEdit.PlainText
} }
} }
GroupBox { GroupBox {
Layout.fillWidth: true Layout.fillWidth: true
Layout.alignment: Qt.AlignBottom Layout.alignment: Qt.AlignBottom
title: i18n("Logs") title: i18n("Logs")
ColumnLayout { ColumnLayout {
anchors.fill: parent anchors.fill: parent
Layout.fillWidth: true Layout.fillWidth: true
Row { Row {
Layout.fillWidth: true Layout.fillWidth: true
Label { Label {
width: parent.width * 2 / 5 width: parent.width * 2 / 5
horizontalAlignment: Text.AlignJustify horizontalAlignment: Text.AlignJustify
@ -97,17 +105,20 @@ Dialog {
wrapMode: Text.WordWrap wrapMode: Text.WordWrap
text: i18n("Use command") text: i18n("Use command")
} }
TextField { TextField {
width: parent.width * 3 / 5 width: parent.width * 3 / 5
readOnly: true readOnly: true
text: "QT_LOGGING_RULES=*=true plasmawindowed org.kde.plasma.awesomewidget" text: "QT_LOGGING_RULES=*=true plasmawindowed org.kde.plasma.awesomewidget"
} }
} }
Button { Button {
Layout.fillWidth: true Layout.fillWidth: true
text: i18n("Load log file") text: i18n("Load log file")
onClicked: logPath.open() onClicked: logPath.open()
} }
TextArea { TextArea {
id: logBody id: logBody
Layout.fillWidth: true Layout.fillWidth: true
@ -127,16 +138,11 @@ Dialog {
} }
onAccepted: { onAccepted: {
if (debug) console.debug() const text = awBugReporter.generateText(description.text, reproduce.text, expected.text, logBody.text)
var text = awBugReporter.generateText(description.text, reproduce.text,
expected.text, logBody.text)
awBugReporter.sendBugReport(title.text, text) awBugReporter.sendBugReport(title.text, text)
} }
onReset: { onReset: {
if (debug) console.debug()
title.text = "" title.text = ""
description.text = "" description.text = ""
reproduce.text = "" reproduce.text = ""
@ -144,8 +150,6 @@ Dialog {
} }
Component.onCompleted: { Component.onCompleted: {
if (debug) console.debug()
awBugReporter.doConnect() awBugReporter.doConnect()
} }
} }

View File

@ -32,9 +32,11 @@ Row {
id: label id: label
height: parent.height height: parent.height
width: parent.width * 2 / 5 width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
} }
Button { Button {
id: button id: button
width: parent.width * 3 / 5 width: parent.width * 3 / 5

View File

@ -30,6 +30,7 @@ Row {
height: parent.heigth height: parent.heigth
width: parent.width * 2 / 5 width: parent.width * 2 / 5
} }
CheckBox { CheckBox {
id: checkBox id: checkBox
width: parent.width * 3 / 5 width: parent.width * 3 / 5

View File

@ -20,10 +20,11 @@ import QtQuick.Dialogs
ButtonSelector { ButtonSelector {
// TODO somehow doesn't work background: Rectangle {
// background: Rectangle { implicitWidth: 100
// color: value implicitHeight: 25
// } color: value
}
onButtonActivated: colorDialog.visible = true onButtonActivated: colorDialog.visible = true

View File

@ -39,14 +39,16 @@ Row {
horizontalAlignment: Text.AlignRight horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
} }
ComboBox { ComboBox {
id: comboBox id: comboBox
width: parent.width * 3 / 5 width: parent.width * 3 / 5
textRole: 'label' textRole: "label"
onCurrentIndexChanged: valueEdited(comboBox.model[comboBox.currentIndex]['name']) onCurrentIndexChanged: valueEdited(comboBox.model[comboBox.currentIndex]["name"])
Component.onCompleted: { Component.onCompleted: {
var total = comboBox.model.length const total = comboBox.model.length
for (var i = 0; i < total; i++) { for (let i = 0; i < total; i++) {
if (comboBox.model[i]["name"] === value) if (comboBox.model[i]["name"] === value)
comboBox.currentIndex = i comboBox.currentIndex = i
} }

View File

@ -37,8 +37,9 @@ Item {
fileMode: FileDialog.SaveFile fileMode: FileDialog.SaveFile
title: i18n("Export") title: i18n("Export")
currentFolder: awConfig.configurationDirectory() currentFolder: awConfig.configurationDirectory()
onAccepted: { onAccepted: {
var status = awConfig.exportConfiguration( const status = awConfig.exportConfiguration(
configuration, configuration,
fileDialog.fileUrl.toString().replace("file://", "")) fileDialog.fileUrl.toString().replace("file://", ""))
if (status) { if (status) {
@ -51,7 +52,6 @@ Item {
messageDialog.open() messageDialog.open()
} }
} }
function open() { function open() {
return fileDialog.open() return fileDialog.open()
} }

View File

@ -21,6 +21,7 @@ import QtQuick 2.15
// required by i18n functions // required by i18n functions
import org.kde.plasma.core as PlasmaCore import org.kde.plasma.core as PlasmaCore
QtObject { QtObject {
property variant fontWeight: { property variant fontWeight: {
"light": Font.Light, "light": Font.Light,

View File

@ -30,6 +30,7 @@ Row {
text: i18n("Bgcolor") text: i18n("Bgcolor")
textField: textArea textField: textArea
} }
HtmlEditorFont { HtmlEditorFont {
width: parent.width * 3 / 15 width: parent.width * 3 / 15
textField: textArea textField: textArea
@ -45,6 +46,7 @@ Row {
textField: textArea textField: textArea
end: "<br>\n" end: "<br>\n"
} }
// font properties // font properties
HtmlEditorButton { HtmlEditorButton {
width: parent.width / 15 width: parent.width / 15
@ -53,6 +55,7 @@ Row {
start: "<b>" start: "<b>"
end: "</b>" end: "</b>"
} }
HtmlEditorButton { HtmlEditorButton {
width: parent.width / 15 width: parent.width / 15
icon.name: "format-text-italic" icon.name: "format-text-italic"
@ -60,6 +63,7 @@ Row {
start: "<i>" start: "<i>"
end: "</i>" end: "</i>"
} }
HtmlEditorButton { HtmlEditorButton {
width: parent.width / 15 width: parent.width / 15
icon.name: "format-text-underline" icon.name: "format-text-underline"
@ -67,6 +71,7 @@ Row {
start: "<u>" start: "<u>"
end: "</u>" end: "</u>"
} }
HtmlEditorButton { HtmlEditorButton {
width: parent.width / 15 width: parent.width / 15
icon.name: "format-text-strikethrough" icon.name: "format-text-strikethrough"
@ -83,6 +88,7 @@ Row {
start: "<p align=\"left\">" start: "<p align=\"left\">"
end: "</p>" end: "</p>"
} }
HtmlEditorButton { HtmlEditorButton {
width: parent.width / 15 width: parent.width / 15
icon.name: "format-justify-center" icon.name: "format-justify-center"
@ -90,6 +96,7 @@ Row {
start: "<p align=\"center\">" start: "<p align=\"center\">"
end: "</p>" end: "</p>"
} }
HtmlEditorButton { HtmlEditorButton {
width: parent.width / 15 width: parent.width / 15
icon.name: "format-justify-right" icon.name: "format-justify-right"
@ -97,6 +104,7 @@ Row {
start: "<p align=\"right\">" start: "<p align=\"right\">"
end: "</p>" end: "</p>"
} }
HtmlEditorButton { HtmlEditorButton {
width: parent.width / 15 width: parent.width / 15
icon.name: "format-justify-fill" icon.name: "format-justify-fill"

View File

@ -31,7 +31,7 @@ Button {
function updateText() { function updateText() {
// get selected text // get selected text
var selected = textField.selectedText() const selected = textField.selectedText()
// remove it from widget // remove it from widget
textField.removeSelection() textField.removeSelection()
// insert edited text // insert edited text

View File

@ -36,13 +36,13 @@ HtmlEditorButton {
clickedEvent: function() { clickedEvent: function() {
// get new font // get new font
var defaultFont = { const defaultFont = {
"color": defaultFontColor, "color": defaultFontColor,
"family": defaultFontFamily, "family": defaultFontFamily,
"size": defaultFontSize "size": defaultFontSize
} }
// we are using custom selector as soon as we need to select color as well // we are using custom selector as soon as we need to select color as well
var font = awActions.getFont(defaultFont) const font = awActions.getFont(defaultFont)
// check status // check status
if (!font.applied) if (!font.applied)

Some files were not shown because too many files have changed in this diff Show More