Compare commits

..

1 Commits

Author SHA1 Message Date
0ee8d40ade do not derive from qwidget in aggregates 2024-03-21 18:08:19 +02:00
117 changed files with 2540 additions and 1092 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
- name: install dependencies
run: pacman -S --noconfirm plasma-workspace
run: pacman -S --noconfirm plasma-workspace ksysguard
- name: configure cmake
run: cmake -B build -S sources -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DBUILD_FUTURE=ON -DBUILD_TESTING=ON
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
- name: build
working-directory: /repo/build

View File

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

View File

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

View File

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

284
sensors Normal file
View File

@ -0,0 +1,284 @@
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_CONTACT "esalexeev@gmail.com")
set(PROJECT_LICENSE "GPL3")
set(PROJECT_VERSION_MAJOR "4")
set(PROJECT_VERSION_MINOR "0")
set(PROJECT_VERSION_PATCH "0")
set(PROJECT_VERSION_MAJOR "3")
set(PROJECT_VERSION_MINOR "5")
set(PROJECT_VERSION_PATCH "1")
set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}")
# append git version if any
set(PROJECT_COMMIT_SHA "Commit hash" CACHE INTERNAL "")

View File

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

View File

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

View File

@ -16,21 +16,30 @@
***************************************************************************/
import QtQuick 2.15
import org.kde.kcmutils as KCM
import org.kde.plasma.private.awesomewidget 1.0
import "."
KCM.SimpleKCM {
Item {
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: {
25: 0,
50: 1,
63: 3,
75: 4,
87: 5,
87: 5
}
property alias cfg_fontFamily: font.value
@ -41,6 +50,7 @@ KCM.SimpleKCM {
property alias cfg_textStyleColor: selectStyleColor.value
property string cfg_textStyle: textStyle.value
Column {
id: pageColumn
anchors.fill: parent
@ -96,4 +106,9 @@ KCM.SimpleKCM {
value: plasmoid.configuration.textStyleColor
}
}
Component.onCompleted: {
if (debug) console.debug()
}
}

View File

@ -17,28 +17,36 @@
import QtQuick 2.15
import QtQuick.Controls
import org.kde.kcmutils as KCM
import org.kde.plasma.private.awesomewidget 1.0
KCM.SimpleKCM {
Item {
id: dataenginePage
// backend
AWKeys {
id: awKeys
}
AWActions {
id: awActions
}
AWConfigHelper {
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()
Column {
id: pageColumn
anchors.fill: parent
GroupBox {
height: implicitHeight
width: parent.width
@ -53,8 +61,58 @@ KCM.SimpleKCM {
GroupBox {
height: implicitHeight
width: parent.width
title: i18n("Player")
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 {
height: implicitHeight
width: parent.width
title: i18n("Player")
Column {
height: implicitHeight
width: parent.width
@ -70,16 +128,16 @@ KCM.SimpleKCM {
ComboBoxSelector {
model: [
{
"label": "disable",
"name": "disable"
'label': "disable",
'name': "disable"
},
{
"label": "mpris",
"name": "mpris"
'label': "mpris",
'name': "mpris"
},
{
"label": "mpd",
"name": "mpd"
'label': "mpd",
'name': "mpd"
}
]
text: i18n("Music player")
@ -92,40 +150,40 @@ KCM.SimpleKCM {
editable: true
model: [
{
"label": "auto",
"name": "auto"
'label': 'auto',
'name': 'auto'
},
{
"label": "amarok",
"name": "amarok"
'label': 'amarok',
'name': 'amarok'
},
{
"label": "audacious",
"name": "audacious"
'label': 'audacious',
'name': 'audacious'
},
{
"label": "clementine",
"name": "clementine"
'label': 'clementine',
'name': 'clementine'
},
{
"label": "DeaDBeeF",
"name": "DeaDBeeF"
'label': 'DeaDBeeF',
'name': 'DeaDBeeF'
},
{
"label": "vlc",
"name": "vlc"
'label': 'vlc',
'name': 'vlc'
},
{
"label": "qmmp",
"name": "qmmp"
'label': 'qmmp',
'name': 'qmmp'
},
{
"label": "xmms2",
"name": "xmms2"
'label': 'xmms2',
'name': 'xmms2'
},
{
"label": cfg_dataengine["MPRIS"],
"name": cfg_dataengine["MPRIS"]
'label': cfg_dataengine["MPRIS"],
'name': cfg_dataengine["MPRIS"]
}
]
text: i18n("MPRIS player name")
@ -153,11 +211,9 @@ KCM.SimpleKCM {
height: implicitHeight
width: parent.width
title: i18n("Extensions")
Column {
height: implicitHeight
width: parent.width
ButtonSelector {
value: i18n("Custom scripts")
onButtonActivated: awKeys.editItem("extscript")
@ -188,6 +244,8 @@ KCM.SimpleKCM {
Component.onCompleted: {
if (debug) console.debug()
// init submodule
awKeys.updateCache()
@ -197,6 +255,8 @@ KCM.SimpleKCM {
}
Component.onDestruction: {
if (debug) console.debug()
cfg_dataengine["MPRIS"] = mpris.editText
awConfig.writeDataEngineConfiguration(cfg_dataengine)
}

View File

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

View File

@ -17,13 +17,23 @@
import QtQuick 2.15
import QtQuick.Controls
import org.kde.kcmutils as KCM
import org.kde.plasma.private.awesomewidget 1.0
KCM.SimpleKCM {
Item {
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_useTooltipBackground: useTooltipBackground.checked
@ -43,6 +53,7 @@ KCM.SimpleKCM {
property alias cfg_batTooltipColor: batTooltipColor.value
property alias cfg_batInTooltipColor: batInTooltipColor.value
Column {
id: pageColumn
anchors.fill: parent
@ -167,13 +178,11 @@ KCM.SimpleKCM {
Column {
width: parent.width
enabled: networkTooltipLabel.checked
ColorSelector {
id: downkbTooltipColor
text: i18n("Download speed color")
value: plasmoid.configuration.downkbTooltipColor
}
ColorSelector {
id: upkbTooltipColor
text: i18n("Upload speed color")
@ -195,13 +204,11 @@ KCM.SimpleKCM {
Column {
width: parent.width
enabled: batteryTooltipLabel.checked
ColorSelector {
id: batTooltipColor
text: i18n("Battery active color")
value: plasmoid.configuration.batTooltipColor
}
ColorSelector {
id: batInTooltipColor
text: i18n("Battery inactive color")
@ -210,4 +217,9 @@ KCM.SimpleKCM {
}
}
}
Component.onCompleted: {
if (debug) console.debug()
}
}

View File

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

View File

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

View File

@ -71,6 +71,13 @@ 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)
{
qCDebug(LOG_AW) << "Cmd" << _cmd << "args" << _args;

View File

@ -34,6 +34,7 @@ public:
~AWActions() override;
Q_INVOKABLE void checkUpdates(bool _showAnyway = false);
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 void showLegacyInfo();
Q_INVOKABLE static void showReadme();

View File

@ -170,6 +170,9 @@ QVariantMap AWConfigHelper::readDataEngineConfiguration()
settings.beginGroup("Configuration");
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["MPDPORT"] = settings.value("MPDPORT", "6600");
configuration["MPRIS"] = settings.value("MPRIS", "auto");
@ -194,6 +197,9 @@ bool AWConfigHelper::writeDataEngineConfiguration(const QVariantMap &_configurat
settings.beginGroup("Configuration");
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("MPDPORT", _configuration["MPDPORT"]);
settings.setValue("MPRIS", _configuration["MPRIS"]);

View File

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

View File

@ -15,7 +15,9 @@
* 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>
@ -29,6 +31,7 @@ namespace KSysGuard::SystemStats
class DBusInterface;
}
class AWDataEngineAggregator : public QObject
{
Q_OBJECT
@ -36,10 +39,9 @@ class AWDataEngineAggregator : public QObject
public:
explicit AWDataEngineAggregator(QObject *_parent = nullptr);
~AWDataEngineAggregator() override;
void connectSources();
void disconnectSources();
[[nodiscard]] static bool isValidSensor(const KSysGuard::SensorInfo &_sensor);
void loadSources();
void reconnectSources(const int interval);
signals:
void dataUpdated(const QHash<QString, KSysGuard::SensorInfo> &_sensors, const KSysGuard::SensorDataList &_data);
@ -55,5 +57,7 @@ public slots:
private:
KSysGuard::SystemStats::DBusInterface *m_interface = nullptr;
QHash<QString, KSysGuard::SensorInfo> m_sensors;
QSet<QString> m_subscribed;
};
#endif /* AWDATAENGINEAGGREGATOR_H */

View File

@ -84,9 +84,6 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
// regular expressions
auto cpuRegExp = QRegularExpression("^cpu/cpu.*/usage$");
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 hddwRegExp = QRegularExpression("^disk/.*/write$");
auto mountFillRegExp = QRegularExpression("^disk/.*/usedPercent$");
@ -95,14 +92,14 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
auto netRegExp = QRegularExpression("^network/.*/(download|upload)$");
auto netTotalRegExp = QRegularExpression("^network/.*/(totalDownload|totalUpload)$");
if (_source == "extsysmon/battery/ac") {
if (_source == "battery/ac") {
// AC
m_map.insert(_source, "ac");
m_formatter["ac"] = AWKeysAggregator::FormatterType::ACFormat;
} else if (_source.startsWith("extsysmon/battery/")) {
} else if (_source.startsWith("battery/")) {
// battery stats
auto key = _source;
key.remove("extsysmon/battery/");
QString key = _source;
key.remove("battery/");
m_map.insert(_source, key);
m_formatter[key] = _source.contains("rate") ? AWKeysAggregator::FormatterType::Float
: AWKeysAggregator::FormatterType::IntegerThree;
@ -112,7 +109,7 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
m_formatter["cpu"] = AWKeysAggregator::FormatterType::Float;
} else if (_source.contains(cpuRegExp)) {
// cpus
auto key = _source;
QString key = _source;
key.remove("cpu/").remove("/usage");
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Float;
@ -122,34 +119,34 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
m_formatter["cpucl"] = AWKeysAggregator::FormatterType::Integer;
} else if (_source.contains(cpuclRegExp)) {
// cpucls
auto key = _source;
QString key = _source;
key.remove("cpu/cpu").remove("/frequency");
key = QString("cpucl%1").arg(key);
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Integer;
} else if (_source.startsWith("extsysmon/custom")) {
} else if (_source.startsWith("custom")) {
// custom
auto key = _source;
key.remove("extsysmon/custom/");
QString key = _source;
key.remove("custom/");
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source == "extsysmon/desktop/name") {
} else if (_source == "desktop/current/name") {
// current desktop name
m_map.insert(_source, "desktop");
m_formatter["desktop"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source == "extsysmon/desktop/number") {
} else if (_source == "desktop/current/number") {
// current desktop number
m_map.insert(_source, "ndesktop");
m_formatter["ndesktop"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source == "extsysmon/desktop/count") {
} else if (_source == "desktop/total/number") {
// desktop count
m_map.insert(_source, "tdesktops");
m_formatter["tdesktops"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source.contains(hddrRegExp)) {
// read speed
auto device = _source;
QString device = _source;
device.remove("disk/").remove("/read");
auto index = m_devices["disk"].indexOf(device);
int index = m_devices["disk"].indexOf(device);
if (index > -1) {
QString key = QString("hddr%1").arg(index);
m_map.insert(_source, key);
@ -157,45 +154,29 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
}
} else if (_source.contains(hddwRegExp)) {
// write speed
auto device = _source;
QString device = _source;
device.remove("disk/").remove("/write");
auto index = m_devices["disk"].indexOf(device);
int index = m_devices["disk"].indexOf(device);
if (index > -1) {
QString key = QString("hddw%1").arg(index);
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Integer;
}
} else if (_source == "gpu/all/usage") {
} else if (_source == "gpu/load") {
// gpu load
m_map.insert(_source, "gpu");
m_formatter["gpu"] = AWKeysAggregator::FormatterType::Float;
} else if (_source.contains(gpuRegExp)) {
// gpus
auto device = _source;
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 == "gpu/temperature") {
// gpu temperature
m_map.insert(_source, "gputemp");
m_formatter["gputemp"] = AWKeysAggregator::FormatterType::Temperature;
} else if (_source.contains(mountFillRegExp)) {
// fill level
auto device = _source;
QString device = _source;
device.remove("disk/").remove("/usedPercent");
auto index = m_devices["mount"].indexOf(device);
int index = m_devices["mount"].indexOf(device);
if (index > -1) {
auto key = QString("hdd%1").arg(index);
QString key = QString("hdd%1").arg(index);
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Float;
// additional keys
@ -204,9 +185,9 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
}
} else if (_source.contains(mountFreeRegExp)) {
// free space
auto device = _source;
QString device = _source;
device.remove("disk/").remove("/free");
auto index = m_devices["mount"].indexOf(device);
int index = m_devices["mount"].indexOf(device);
if (index > -1) {
// mb
QString key = QString("hddfreemb%1").arg(index);
@ -219,9 +200,9 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
}
} else if (_source.contains(mountUsedRegExp)) {
// used
auto device = _source;
QString device = _source;
device.remove("disk/").remove("/used");
auto index = m_devices["mount"].indexOf(device);
int index = m_devices["mount"].indexOf(device);
if (index > -1) {
// mb
QString key = QString("hddmb%1").arg(index);
@ -232,11 +213,21 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::MemGBFormat;
}
} else if (_source.startsWith("hdd/temperature")) {
// hdd temperature
QString device = _source;
device.remove("hdd/temperature");
int index = m_devices["hdd"].indexOf(device);
if (index > -1) {
QString key = QString("hddtemp%1").arg(index);
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Temperature;
}
} else if (_source.startsWith("cpu/loadaverages/loadaverage")) {
// load average
auto time = _source;
QString time = _source;
time.remove("cpu/loadaverages/loadaverage");
auto key = QString("la%1").arg(time);
QString key = QString("la%1").arg(time);
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::FloatTwoSymbols;
} else if (_source == "memory/physical/application") {
@ -263,27 +254,27 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
// gb
m_map.insert(_source, "memusedgb");
m_formatter["memusedgb"] = AWKeysAggregator::FormatterType::MemGBFormat;
} else if (_source == "extsysmon/network/device") {
} else if (_source == "network/current/name") {
// network device
m_map.insert(_source, "netdev");
m_formatter["netdev"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source == "extsysmon/network/ssid") {
} else if (_source == "network/current/ssid") {
// current ssid
m_map.insert(_source, "ssid");
m_formatter["ssid"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source.startsWith("extsysmon/requests/response")) {
} else if (_source.startsWith("network/response")) {
// network response
auto key = _source;
key.remove("extsysmon/requests/");
QString key = _source;
key.remove("network/");
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source.contains(netRegExp)) {
// network speed
auto type = _source.endsWith("download") ? "down" : "up";
auto index = m_devices["net"].indexOf(_source.split('/')[1]);
QString type = _source.contains("download") ? "down" : "up";
int index = m_devices["net"].indexOf(_source.split('/')[2]);
if (index > -1) {
// kb
auto key = QString("%1kb%2").arg(type).arg(index);
QString key = QString("%1kb%2").arg(type).arg(index);
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Integer;
// smart
@ -297,11 +288,11 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
}
} else if (_source.contains(netTotalRegExp)) {
// network data total
auto type = _source.endsWith("Download") ? "down" : "up";
auto index = m_devices["net"].indexOf(_source.split('/')[1]);
QString type = _source.contains("download") ? "down" : "up";
int index = m_devices["net"].indexOf(_source.split('/')[2]);
if (index > -1) {
// kb
auto key = QString("%1totkb%2").arg(type).arg(index);
QString key = QString("%1totkb%2").arg(type).arg(index);
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Integer;
// mb
@ -309,34 +300,34 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::MemMBFormat;
}
} else if (_source.startsWith("extsysmon/upgrade")) {
} else if (_source.startsWith("upgrade")) {
// package manager
auto key = _source;
key.remove("extsysmon/upgrade/");
QString key = _source;
key.remove("upgrade/");
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::IntegerThree;
} else if (_source.startsWith("extsysmon/player")) {
} else if (_source.startsWith("player")) {
// player
auto key = _source;
key.remove("extsysmon/player/");
QString key = _source;
key.remove("player/");
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source == "extsysmon/ps/running") {
} else if (_source == "ps/running/count") {
// running processes count
m_map.insert(_source, "pscount");
m_formatter["pscount"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source == "extsysmon/ps/list") {
} else if (_source == "ps/running/list") {
// list of running processes
m_map.insert(_source, "ps");
m_formatter["ps"] = AWKeysAggregator::FormatterType::List;
} else if (_source == "extsysmon/ps/count") {
} else if (_source == "ps/total/count") {
// total processes count
m_map.insert(_source, "pstot");
m_formatter["pstot"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source.startsWith("extsysmon/quotes")) {
} else if (_source.startsWith("quotes")) {
// quotes
auto key = _source;
key.remove("extsysmon/quotes/");
QString key = _source;
key.remove("quotes/");
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Quotes;
} else if (_source == "memory/swap/free") {
@ -355,20 +346,19 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
// gb
m_map.insert(_source, "swapgb");
m_formatter["swapgb"] = AWKeysAggregator::FormatterType::MemGBFormat;
} else if (_source.startsWith("lmsensors/") || _source.contains(cpuTempRegExp)
|| _source == "cpu/all/averageTemperature") {
} else if (_source.startsWith("lmsensors/")) {
// temperature
auto index = m_devices["temp"].indexOf(_source);
int index = m_devices["temp"].indexOf(_source);
// HACK on DE initialization there are no units key
if (_units == KSysGuard::UnitInvalid)
return QStringList({QString("temp%1").arg(index)});
if (index > -1) {
auto key = QString("temp%1").arg(index);
QString key = QString("temp%1").arg(index);
m_map.insert(_source, key);
m_formatter[key] = _units == KSysGuard::UnitCelsius ? AWKeysAggregator::FormatterType::Temperature
: AWKeysAggregator::FormatterType::Integer;
}
} else if (_source == "extsysmon/time/now") {
} else if (_source == "Local") {
// time
m_map.insert(_source, "time");
m_formatter["time"] = AWKeysAggregator::FormatterType::Time;
@ -387,40 +377,40 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
// timestamp
m_map.insert(_source, "tstime");
m_formatter["tstime"] = AWKeysAggregator::FormatterType::Timestamp;
} else if (_source == "extsysmon/system/brightness") {
} else if (_source == "system/brightness") {
m_map.insert(_source, "brightness");
m_formatter["brightness"] = AWKeysAggregator::FormatterType::IntegerThree;
} else if (_source == "extsysmon/system/volume") {
} else if (_source == "system/volume") {
m_map.insert(_source, "volume");
m_formatter["volume"] = AWKeysAggregator::FormatterType::IntegerThree;
} else if (_source == "os/system/uptime") {
} else if (_source == "system/uptime") {
// uptime
m_map.insert(_source, "uptime");
m_formatter["uptime"] = AWKeysAggregator::FormatterType::Uptime;
// custom uptime
m_map.insert(_source, "cuptime");
m_formatter["cuptime"] = AWKeysAggregator::FormatterType::UptimeCustom;
} else if (_source.startsWith("extsysmon/weather/temperature")) {
} else if (_source.startsWith("weather/temperature")) {
// temperature
auto key = _source;
key.remove("extsysmon/weather/");
QString key = _source;
key.remove("weather/");
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Temperature;
} else if (_source.startsWith("extsysmon/weather/")) {
} else if (_source.startsWith("weather/")) {
// other weather
auto key = _source;
key.remove("extsysmon/weather/");
QString key = _source;
key.remove("weather/");
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source.startsWith("extsysmon/load/load")) {
} else if (_source.startsWith("load/load")) {
// load source
auto key = _source;
key.remove("extsysmon/load/");
QString key = _source;
key.remove("load/");
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Temperature;
}
auto foundKeys = keysFromSource(_source);
QStringList foundKeys = keysFromSource(_source);
// rewrite formatters for custom ones
QStringList customFormattersKeys;
@ -435,7 +425,7 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
// drop key from dictionary if no one user requested key required it
qCInfo(LOG_AW) << "Looking for keys" << foundKeys << "in" << _keys;
auto required = _keys.isEmpty() || std::any_of(foundKeys.cbegin(), foundKeys.cend(), [&_keys](const QString &key) {
bool required = _keys.isEmpty() || std::any_of(foundKeys.cbegin(), foundKeys.cend(), [&_keys](const QString &key) {
return _keys.contains(key);
});
if (!required) {

View File

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

View File

@ -51,7 +51,7 @@ private:
void initFormatters();
[[nodiscard]] static QPair<QString, AWAbstractFormatter::FormatterClass> readMetadata(const QString &_filePath);
// parent methods
void doCreateItem(QListWidget *_widget) override;
void doCreateItem() override;
// properties
QHash<QString, AWAbstractFormatter *> m_formatters;
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;
auto fileName
QString fileName
= QString("%1/awesomewidgets.ndx").arg(QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation));
qCInfo(LOG_AW) << "Cache file" << fileName;
QSettings cache(fileName, QSettings::IniFormat);
@ -41,8 +41,19 @@ bool AWKeyCache::addKeyToCache(const QString &_type, const QString &_key)
for (auto &number : cache.allKeys())
cachedValues.append(cache.value(number).toString());
if (_type == "net") {
auto rawInterfaceList = QNetworkInterface::allInterfaces();
if (_type == "hdd") {
QStringList allDevices = QDir("/dev").entryList(QDir::System, QDir::Name);
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) {
QString device = interface.name();
if (cachedValues.contains(device))
@ -87,7 +98,7 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, const QStringL
if (!used.contains(key))
continue;
key.remove("hddtotmb");
auto index = key.toInt();
int index = key.toInt();
used << QString("hddfreemb%1").arg(index) << QString("hddmb%1").arg(index);
}
// hddtotgb*
@ -95,7 +106,7 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, const QStringL
if (!used.contains(key))
continue;
key.remove("hddtotgb");
auto index = key.toInt();
int index = key.toInt();
used << QString("hddfreegb%1").arg(index) << QString("hddgb%1").arg(index);
}
// mem
@ -128,7 +139,7 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, const QStringL
for (auto &key : netKeys) {
if (!used.contains(key))
continue;
auto filt = _allKeys.filter(QRegularExpression(QString("^%1[0-9]{1,}").arg(key)));
QStringList filt = _allKeys.filter(QRegularExpression(QString("^%1[0-9]{1,}").arg(key)));
for (auto &filtered : filt)
used << filtered;
}
@ -147,7 +158,7 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, const QStringL
QHash<QString, QStringList> AWKeyCache::loadKeysFromCache()
{
auto fileName
QString fileName
= QString("%1/awesomewidgets.ndx").arg(QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation));
qCInfo(LOG_AW) << "Cache file" << fileName;
QSettings cache(fileName, QSettings::IniFormat);

View File

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

View File

@ -56,17 +56,21 @@ AWKeys::AWKeys(QObject *_parent)
createDBusInterface();
// update key data if required
connect(m_keyOperator, &AWKeyOperations::updateKeys, this, &AWKeys::reinitKeys);
connect(m_timer, &QTimer::timeout, this, &AWKeys::updateTextData);
connect(m_keyOperator, SIGNAL(updateKeys(const QStringList &)), this, SLOT(reinitKeys(const QStringList &)));
connect(m_timer, SIGNAL(timeout()), this, SLOT(updateTextData()));
// transfer signal from AWDataAggregator object to QML ui
connect(m_dataAggregator, &AWDataAggregator::toolTipPainted,
[this](const QString &_tooltip) { emit(needToolTipToBeUpdated(_tooltip)); });
connect(m_dataAggregator, SIGNAL(toolTipPainted(const QString &)), this,
SIGNAL(needToolTipToBeUpdated(const QString &)));
connect(this, &AWKeys::dropSourceFromDataengine, m_dataEngineAggregator, &AWDataEngineAggregator::dropSource);
connect(m_dataEngineAggregator, &AWDataEngineAggregator::dataUpdated, this, &AWKeys::dataUpdated);
connect(this, SIGNAL(dropSourceFromDataengine(const QString &)), m_dataEngineAggregator,
SLOT(dropSource(const QString &)));
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
connect(m_dataEngineAggregator, &AWDataEngineAggregator::deviceAdded, m_keyOperator, &AWKeyOperations::addDevice);
connect(m_dataEngineAggregator, SIGNAL(deviceAdded(const QString &)), m_keyOperator,
SLOT(addDevice(const QString &)));
}
@ -103,7 +107,7 @@ void AWKeys::initKeys(const QString &_currentPattern, const int _interval, const
m_aggregator->initFormatters();
m_keyOperator->setPattern(_currentPattern);
m_keyOperator->updateCache();
m_dataEngineAggregator->loadSources();
m_dataEngineAggregator->reconnectSources(_interval);
// timer
m_timer->setInterval(_interval);
@ -369,11 +373,12 @@ void AWKeys::setDataBySource(const QString &_source, const KSysGuard::SensorInfo
// update data or drop source if there are no matches and exit
if (tags.isEmpty()) {
qCInfo(LOG_AW) << "Sensor" << _source << "not found";
qCInfo(LOG_AW) << "Source" << _source << "not found";
return emit(dropSourceFromDataengine(_source));
}
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; });
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);
break;
case FormatterType::Time:
output = QDateTime::fromSecsSinceEpoch(_data.toLongLong()).toString();
output = _data.toDateTime().toString();
break;
case FormatterType::TimeCustom:
output = m_customTime;
[&output, loc, this](const QDateTime &dt) {
for (auto &key : m_timeKeys)
output.replace(QString("$%1").arg(key), loc.toString(dt, key));
}(QDateTime::fromSecsSinceEpoch(_data.toLongLong()));
}(_data.toDateTime());
break;
case FormatterType::TimeISO:
output = QDateTime::fromSecsSinceEpoch(_data.toLongLong()).toString(Qt::ISODate);
output = _data.toDateTime().toString(Qt::ISODate);
break;
case FormatterType::TimeLong:
output = loc.toString(QDateTime::fromSecsSinceEpoch(_data.toLongLong()), QLocale::LongFormat);
output = loc.toString(_data.toDateTime(), QLocale::LongFormat);
break;
case FormatterType::TimeShort:
output = loc.toString(QDateTime::fromSecsSinceEpoch(_data.toLongLong()), QLocale::ShortFormat);
output = loc.toString(_data.toDateTime(), QLocale::ShortFormat);
break;
case FormatterType::Timestamp:
output = _data.toString();
output = QString("%1").arg(_data.toDateTime().toMSecsSinceEpoch() / 1000.0, 10, 'f', 0);
break;
case FormatterType::Uptime:
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})
# install
install(DIRECTORY ${SUBPROJECT_CONFIGS} DESTINATION ${KDE_INSTALL_DATADIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_FORMATTERS} DESTINATION ${KDE_INSTALL_DATADIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_GRAPHITEMS} DESTINATION ${KDE_INSTALL_DATADIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_QUOTES} DESTINATION ${KDE_INSTALL_DATADIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_SCRIPTS} DESTINATION ${KDE_INSTALL_DATADIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_REQUESTS} DESTINATION ${KDE_INSTALL_DATADIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_UPGRADE} DESTINATION ${KDE_INSTALL_DATADIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_WEATHER} DESTINATION ${KDE_INSTALL_DATADIR}/${PROJECT_NAME})
install(FILES ${SUBPROJECT_INI} DESTINATION /${KDE_INSTALL_CONFDIR})
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${SUBPROJECT_WEATHER_JSON} DESTINATION ${KDE_INSTALL_DATADIR}/${PROJECT_NAME}/weather)
install(DIRECTORY ${SUBPROJECT_CONFIGS} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_FORMATTERS} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_GRAPHITEMS} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_QUOTES} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_SCRIPTS} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_REQUESTS} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_UPGRADE} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_WEATHER} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME})
install(FILES ${SUBPROJECT_INI} DESTINATION ${KDE_INSTALL_CONFDIR})
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${SUBPROJECT_WEATHER_JSON} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME}/weather)

View File

@ -28,26 +28,44 @@
AbstractExtItemAggregator::AbstractExtItemAggregator(QObject *_parent, QString _type)
: QObject(_parent)
, ui(new Ui::AbstractExtItemAggregator)
, m_type(std::move(_type))
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
// create directory at $HOME
auto localDir = QString("%1/awesomewidgets/%2")
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation), type());
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation), type());
QDir localDirectory;
if (localDirectory.mkpath(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 *)));
}
void AbstractExtItemAggregator::copyItem(QListWidget *_widget)
AbstractExtItemAggregator::~AbstractExtItemAggregator()
{
auto source = itemFromWidget(_widget);
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
delete ui;
}
void AbstractExtItemAggregator::copyItem()
{
auto source = itemFromWidget();
auto fileName = getName();
auto number = uniqNumber();
auto dir = QString("%1/awesomewidgets/%2")
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation), m_type);
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation), m_type);
if ((!source) || (fileName.isEmpty())) {
qCWarning(LOG_LIB) << "Nothing to copy";
return;
@ -55,16 +73,16 @@ void AbstractExtItemAggregator::copyItem(QListWidget *_widget)
auto filePath = QString("%1/%2").arg(dir, fileName);
auto newItem = source->copy(filePath, number);
if (newItem->showConfiguration(nullptr, configArgs()) == 1) {
if (newItem->showConfiguration(this, configArgs()) == 1) {
initItems();
repaintList(_widget);
repaintList();
}
}
void AbstractExtItemAggregator::deleteItem(QListWidget *_widget)
void AbstractExtItemAggregator::deleteItem()
{
auto source = itemFromWidget(_widget);
auto source = itemFromWidget();
if (!source) {
qCWarning(LOG_LIB) << "Nothing to delete";
return;
@ -72,63 +90,30 @@ void AbstractExtItemAggregator::deleteItem(QListWidget *_widget)
if (source->tryDelete()) {
initItems();
repaintList(_widget);
repaintList();
}
}
void AbstractExtItemAggregator::editItem(QListWidget *_widget)
void AbstractExtItemAggregator::editItem()
{
auto source = itemFromWidget(_widget);
auto source = itemFromWidget();
if (!source) {
qCWarning(LOG_LIB) << "Nothing to edit";
return;
}
if (source->showConfiguration(nullptr, configArgs()) == 1) {
if (source->showConfiguration(this, configArgs()) == 1) {
initItems();
repaintList(_widget);
repaintList();
}
}
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()
{
bool ok;
auto name = QInputDialog::getText(nullptr, i18n("Enter file name"), i18n("File name"), QLineEdit::Normal, "", &ok);
auto name = QInputDialog::getText(this, i18n("Enter file name"), i18n("File name"), QLineEdit::Normal, "", &ok);
if ((!ok) || (name.isEmpty()))
return "";
if (!name.endsWith(".desktop"))
@ -138,9 +123,9 @@ QString AbstractExtItemAggregator::getName()
}
AbstractExtItem *AbstractExtItemAggregator::itemFromWidget(QListWidget *_widget) const
AbstractExtItem *AbstractExtItemAggregator::itemFromWidget() const
{
auto widgetItem = _widget->currentItem();
auto widgetItem = ui->listWidget->currentItem();
if (!widgetItem)
return nullptr;
@ -159,18 +144,18 @@ AbstractExtItem *AbstractExtItemAggregator::itemFromWidget(QListWidget *_widget)
}
void AbstractExtItemAggregator::repaintList(QListWidget *_widget) const
void AbstractExtItemAggregator::repaintList() const
{
_widget->clear();
ui->listWidget->clear();
for (auto &_item : items()) {
QString fileName = QFileInfo(_item->fileName()).fileName();
auto item = new QListWidgetItem(fileName, _widget);
auto item = new QListWidgetItem(fileName, ui->listWidget);
QStringList tooltip;
tooltip.append(i18n("Name: %1", _item->name()));
tooltip.append(i18n("Comment: %1", _item->comment()));
tooltip.append(i18n("Identity: %1", _item->uniq()));
item->setToolTip(tooltip.join('\n'));
_widget->addItem(item);
ui->listWidget->addItem(item);
}
}
@ -215,3 +200,22 @@ void AbstractExtItemAggregator::setConfigArgs(const QVariant &_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,7 +25,6 @@
class QAbstractButton;
class QListWidget;
class QListWidgetItem;
class AbstractExtItemAggregator : public QObject
@ -37,33 +36,32 @@ class AbstractExtItemAggregator : public QObject
public:
explicit AbstractExtItemAggregator(QObject *_parent, QString _type);
// methods
void copyItem(QListWidget *_widget);
template <class T> void createItem(QListWidget *_widget)
void copyItem();
template <class T> void createItem()
{
auto fileName = getName();
auto number = uniqNumber();
int number = uniqNumber();
auto dir = QString("%1/awesomewidgets/%2")
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation), m_type);
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation), m_type);
if (fileName.isEmpty()) {
qCWarning(LOG_LIB) << "Nothing to create";
return;
}
auto filePath = QString("%1/%2").arg(dir, fileName);
auto newItem = new T(this, filePath);
T *newItem = new T(this, filePath);
newItem->setNumber(number);
if (newItem->showConfiguration(nullptr, configArgs()) == 1) {
if (newItem->showConfiguration(this, configArgs()) == 1) {
initItems();
repaintList(_widget);
repaintList();
}
};
void deleteItem(QListWidget *_widget);
void editItem(QListWidget *_widget);
[[nodiscard]] int exec();
void deleteItem();
void editItem();
QString getName();
virtual void initItems() = 0;
[[nodiscard]] AbstractExtItem *itemFromWidget(QListWidget *_widget) const;
void repaintList(QListWidget *_widget) const;
[[nodiscard]] AbstractExtItem *itemFromWidget() const;
void repaintList() const;
[[nodiscard]] int uniqNumber() const;
// get methods
[[nodiscard]] QVariant configArgs() const;
@ -73,12 +71,21 @@ public:
// set methods
void setConfigArgs(const QVariant &_configArgs);
private slots:
void editItemActivated(QListWidgetItem *);
void editItemButtonPressed(QAbstractButton *_button);
private:
// ui
Ui::AbstractExtItemAggregator *ui = nullptr;
QPushButton *copyButton = nullptr;
QPushButton *createButton = nullptr;
QPushButton *deleteButton = nullptr;
// properties
QVariant m_configArgs;
QString m_type;
// ui methods
virtual void doCreateItem(QListWidget *_widget) = 0;
virtual void doCreateItem() = 0;
};

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -433,8 +433,7 @@ int GraphicalItem::showConfiguration(QWidget *_parent, const QVariant &_args)
translate(ui);
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_inactiveColor, &QToolButton::clicked, [this, ui]() { changeColor(ui); });

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -15,21 +15,28 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
import QtQuick 2.15
import org.kde.kcmutils as KCM
import QtQuick 2.0
import org.kde.plasma.private.desktoppanel 1.0
KCM.SimpleKCM {
Item {
id: aboutPage
// backend
DPAdds {
id: dpAdds
}
width: childrenRect.width
height: childrenRect.height
property bool debug: awActions.isDebugEnabled()
AboutTab {
textProvider: dpAdds
}
Component.onCompleted: {
if (debug) console.debug()
}
}

View File

@ -15,15 +15,25 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
import QtQuick 2.15
import org.kde.kcmutils as KCM
import QtQuick 2.0
import org.kde.plasma.private.desktoppanel 1.0
import "."
KCM.SimpleKCM {
Item {
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_currentFontSize: fontSize.value
@ -33,6 +43,7 @@ KCM.SimpleKCM {
property alias cfg_currentTextStyleColor: selectStyleColor.value
property string cfg_currentTextStyle: textStyle.value
Column {
id: pageColumn
anchors.fill: parent
@ -88,4 +99,9 @@ KCM.SimpleKCM {
value: plasmoid.configuration.currentTextStyleColor
}
}
Component.onCompleted: {
if (debug) console.debug()
}
}

View File

@ -15,15 +15,25 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
import QtQuick 2.15
import QtQuick.Controls
import org.kde.kcmutils as KCM
import QtQuick 2.0
import QtQuick.Controls 1.3 as QtControls
import org.kde.plasma.private.desktoppanel 1.0
KCM.SimpleKCM {
Item {
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_verticalLayout: verticalLayout.checked
@ -34,6 +44,7 @@ KCM.SimpleKCM {
property alias cfg_tooltipWidth: tooltipWidth.value
property alias cfg_tooltipColor: tooltipColor.value
Column {
id: pageColumn
anchors.fill: parent
@ -71,48 +82,48 @@ KCM.SimpleKCM {
editable: true
model: [
{
"label": "#",
"name": "#"
'label': '#',
'name': '#'
},
{
"label": "$",
"name": "$"
'label': '$',
'name': '$'
},
{
"label": "%",
"name": "%"
'label': '%',
'name': '%'
},
{
"label": "&",
"name": "&"
'label': '&',
'name': '&'
},
{
"label": "*",
"name": "*"
'label': '*',
'name': '*'
},
{
"label": "@",
"name": "@"
'label': '@',
'name': '@'
},
{
"label": "¤",
"name": "¤"
'label': '¤',
'name': '¤'
},
{
"label": "¶",
"name": "¶"
'label': '¶',
'name': '¶'
},
{
"label": "·",
"name": "·"
'label': '·',
'name': '·'
},
{
"label": "º",
"name": "º"
'label': 'º',
'name': 'º'
},
{
"label": plasmoid.configuration.mark,
"name": plasmoid.configuration.mark
'label': plasmoid.configuration.mark,
'name': plasmoid.configuration.mark
}
]
text: i18n("Mark")
@ -120,7 +131,7 @@ KCM.SimpleKCM {
onValueEdited: cfg_mark = newValue
}
GroupBox {
QtControls.GroupBox {
height: implicitHeight
width: parent.width
title: i18n("Tooltip")
@ -133,16 +144,16 @@ KCM.SimpleKCM {
id: tooltipType
model: [
{
"label": i18n("contours"),
"name": "contours"
'label': i18n("contours"),
'name': "contours"
},
{
"label": i18n("names"),
"name": "names"
'label': i18n("names"),
'name': "names"
},
{
"label": i18n("none"),
"name": "none"
'label': i18n("none"),
'name': "none"
}
]
text: i18n("Tooltip type")
@ -167,4 +178,8 @@ KCM.SimpleKCM {
}
}
}
Component.onCompleted: {
if (debug) console.debug()
}
}

View File

@ -15,15 +15,25 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
import QtQuick 2.15
import org.kde.kcmutils as KCM
import QtQuick 2.0
import org.kde.plasma.private.desktoppanel 1.0
import "."
KCM.SimpleKCM {
Item {
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_fontSize: fontSize.value
@ -33,6 +43,7 @@ KCM.SimpleKCM {
property alias cfg_textStyleColor: selectStyleColor.value
property string cfg_textStyle: textStyle.value
Column {
id: pageColumn
anchors.fill: parent
@ -88,4 +99,9 @@ KCM.SimpleKCM {
value: plasmoid.configuration.textStyleColor
}
}
Component.onCompleted: {
if (debug) console.debug()
}
}

View File

@ -15,23 +15,25 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
import QtQuick 2.15
import QtQuick.Controls
import QtQuick.Layouts
import org.kde.plasma.core as PlasmaCore
import QtQuick 2.4
import QtQuick.Controls 1.3 as QtControls
import QtQuick.Layouts 1.1
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 "."
PlasmoidItem {
Item {
id: main
// backend
DPAdds {
id: dpAdds
}
property bool debug: dpAdds.isDebugEnabled()
property variant tooltipSettings: {
"tooltipColor": plasmoid.configuration.tooltipColor,
"tooltipType": plasmoid.configuration.tooltipType,
@ -42,12 +44,17 @@ PlasmoidItem {
signal needTooltipUpdate
signal sizeUpdate
// init
Plasmoid.preferredRepresentation: Plasmoid.fullRepresentation
Plasmoid.compactRepresentation: Plasmoid.fullRepresentation
Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter
Plasmoid.icon: "utilities-system-monitor"
Plasmoid.backgroundHints: plasmoid.configuration.background ? "DefaultBackground" : "NoBackground"
// ui
GridLayout {
anchors.fill: parent
@ -94,6 +101,7 @@ PlasmoidItem {
}
}
Timer {
id: timer
interval: 1000
@ -101,16 +109,19 @@ PlasmoidItem {
}
onNeedUpdate: {
for (let i = 0; i < repeater.count; i++) {
if (debug) console.debug()
for (var i=0; i<repeater.count; i++) {
if (!repeater.itemAt(i)) {
if (debug) console.info("Nothing to do here yet", i)
timer.start()
return
}
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).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.weight = General.fontWeight[plasmoid.configuration.currentFontWeight]
repeater.itemAt(i).style = General.textStyle[plasmoid.configuration.currentTextStyle]
@ -118,7 +129,7 @@ PlasmoidItem {
} else {
repeater.itemAt(i).color = plasmoid.configuration.fontColor
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.weight = General.fontWeight[plasmoid.configuration.fontWeight]
repeater.itemAt(i).style = General.textStyle[plasmoid.configuration.textStyle]
@ -132,11 +143,13 @@ PlasmoidItem {
}
onNeedTooltipUpdate: {
for (let i = 0; i < repeater.count; i++) {
if (debug) console.debug()
for (var i=0; i<repeater.count; i++) {
repeater.itemAt(i).tooltip.text = dpAdds.toolTipImage(i)
// resize text tooltip to content size
// 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.width = repeater.itemAt(i).tooltip.implicitWidth
}
@ -144,9 +157,11 @@ PlasmoidItem {
}
onSizeUpdate: {
if (plasmoid.configuration.height === 0) {
let newHeight = 0
for (let i = 0; i < repeater.count; i++)
if (debug) console.debug()
if (plasmoid.configuration.height == 0) {
var newHeight = 0
for (var i=0; i<repeater.count; i++)
newHeight += repeater.itemAt(i).contentHeight
Layout.minimumHeight = newHeight
Layout.maximumHeight = -1
@ -154,9 +169,9 @@ PlasmoidItem {
Layout.minimumHeight = plasmoid.configuration.height
Layout.maximumHeight = plasmoid.configuration.height
}
if (plasmoid.configuration.width === 0) {
let newWidth = 0
for (let i = 0; i < repeater.count; i++)
if (plasmoid.configuration.width == 0) {
var newWidth = 0
for (var i=0; i<repeater.count; i++)
newWidth += repeater.itemAt(i).contentWidth
Layout.minimumWidth = newWidth
Layout.maximumWidth = -1
@ -168,6 +183,7 @@ PlasmoidItem {
Plasmoid.onUserConfiguringChanged: {
if (plasmoid.userConfiguring) return
if (debug) console.debug()
dpAdds.setMark(plasmoid.configuration.mark)
dpAdds.setToolTipData(tooltipSettings)
@ -176,6 +192,8 @@ PlasmoidItem {
}
Component.onCompleted: {
if (debug) console.debug()
// init submodule
Plasmoid.userConfiguringChanged(false)
dpAdds.desktopChanged.connect(needUpdate)

View File

@ -15,22 +15,29 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
import QtQuick 2.15
import org.kde.kcmutils as KCM
import QtQuick 2.0
import org.kde.plasma.private.desktoppanel 1.0
import "."
KCM.SimpleKCM {
Item {
id: widgetPage
// backend
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
Column {
id: pageColumn
anchors.fill: parent
@ -53,4 +60,9 @@ KCM.SimpleKCM {
backend: dpAdds
}
}
Component.onCompleted: {
if (debug) console.debug()
}
}

View File

@ -0,0 +1,26 @@
[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

@ -1,26 +0,0 @@
{
"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})
target_link_libraries(${PLUGIN_NAME} ${Qt_LIBRARIES} ${Kf6_LIBRARIES})
install(TARGETS ${PLUGIN_NAME} DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/plasma/private/desktoppanel)
install(FILES qmldir DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/plasma/private/desktoppanel)
install(TARGETS ${PLUGIN_NAME} DESTINATION ${QML_INSTALL_DIR}/org/kde/plasma/private/desktoppanel)
install(FILES qmldir DESTINATION ${QML_INSTALL_DIR}/org/kde/plasma/private/desktoppanel)
install(FILES ${SUBPROJECT_NOTIFY} DESTINATION ${KDE_INSTALL_KNOTIFYRCDIR})

View File

@ -49,7 +49,9 @@ DPAdds::DPAdds(QObject *_parent)
m_vdi = new TaskManager::VirtualDesktopInfo(this);
m_taskModel = new TaskManager::WindowTasksModel(this);
connect(m_vdi, &TaskManager::VirtualDesktopInfo::currentDesktopChanged, this, &DPAdds::desktopChanged);
connect(m_vdi, SIGNAL(currentDesktopChanged()), this, SIGNAL(desktopChanged()));
connect(KWindowSystem::self(), SIGNAL(windowAdded(WId)), this, SIGNAL(windowListChanged()));
connect(KWindowSystem::self(), SIGNAL(windowRemoved(WId)), this, SIGNAL(windowListChanged()));
}
@ -62,6 +64,13 @@ DPAdds::~DPAdds()
}
// HACK: since QML could not use QLoggingCategory I need this hack
bool DPAdds::isDebugEnabled()
{
return LOG_DP().isDebugEnabled();
}
int DPAdds::currentDesktop() const
{
auto current = m_vdi->currentDesktop();
@ -214,7 +223,7 @@ QString DPAdds::valueByKey(const QString &_key, int _desktop) const
QString currentMark = currentDesktop() == _desktop ? m_mark : "";
if (_key == "mark")
return QString("%1").arg(currentMark, m_mark.size(), QLatin1Char(' ')).replace(" ", "&nbsp;");
return QString("%1").arg(currentMark, m_mark.count(), QLatin1Char(' ')).replace(" ", "&nbsp;");
else if (_key == "name") {
auto name = m_vdi->desktopNames().at(_desktop);
return name.replace(" ", "&nbsp;");

View File

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

View File

@ -24,4 +24,4 @@ target_link_libraries(${SUBPROJECT}
# install
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,8 +18,6 @@
#include "extsysmon.h"
#include <KPluginFactory>
#include <QDBusMetaType>
#include <QFile>
#include <QRegularExpression>
#include <QSettings>
@ -27,6 +25,8 @@
#include "awdebug.h"
#include "extsysmonaggregator.h"
#include "gpuloadsource.h"
#include "hddtempsource.h"
ExtendedSysMon::ExtendedSysMon(QObject *_parent, const QVariantList &_args)
@ -38,19 +38,35 @@ ExtendedSysMon::ExtendedSysMon(QObject *_parent, const QVariantList &_args)
qCDebug(LOG_ESM) << metadata;
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()
{
auto fileName = QStandardPaths::locate(QStandardPaths::ConfigLocation, "plasma-dataengine-extsysmon.conf");
QString fileName = QStandardPaths::locate(QStandardPaths::ConfigLocation, "plasma-dataengine-extsysmon.conf");
qCInfo(LOG_ESM) << "Configuration file" << fileName;
QSettings settings(fileName, QSettings::IniFormat);
QHash<QString, QString> rawConfig;
settings.beginGroup("Configuration");
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["MPDPORT"] = settings.value("MPDPORT", "6600").toString();
rawConfig["MPRIS"] = settings.value("MPRIS", "auto").toString();
@ -66,6 +82,31 @@ QHash<QString, QString> ExtendedSysMon::updateConfiguration(QHash<QString, QStri
{
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
if ((_rawConfig["PLAYER"] != "mpd") && (_rawConfig["PLAYER"] != "mpris") && (_rawConfig["PLAYER"] != "disable"))
_rawConfig["PLAYER"] = "mpris";

View File

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

View File

@ -22,6 +22,9 @@
#include "customsource.h"
#include "desktopsource.h"
#include "extsysmonsensor.h"
#include "gpuloadsource.h"
#include "gputempsource.h"
#include "hddtempsource.h"
#include "loadsource.h"
#include "networksource.h"
#include "playersource.h"
@ -29,7 +32,6 @@
#include "quotessource.h"
#include "requestsource.h"
#include "systeminfosource.h"
#include "timesource.h"
#include "upgradesource.h"
#include "weathersource.h"
@ -44,47 +46,73 @@ 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)
{
qCDebug(LOG_ESM) << "Configuration" << _config;
// battery
createSensor("battery", i18n("Battery"), new BatterySource(this, {_config["ACPIPATH"]}));
auto batteryItem = new BatterySource(this, {_config["ACPIPATH"]});
for (auto &source : batteryItem->sources())
addObject(new ExtSysMonSensor(this, source, batteryItem));
// custom
createSensor("custom", i18n("Scripts"), new CustomSource(this, {}));
auto customItem = new CustomSource(this, {});
for (auto &source : customItem->sources())
addObject(new ExtSysMonSensor(this, source, customItem));
// desktop
// FIXME causes segfault in kde libs
// createSensor("desktop", i18n("Desktop"), new DesktopSource(this, {}));
auto desktopItem = new DesktopSource(this, {});
for (auto &source : desktopItem->sources())
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
createSensor("network", i18n("Network"), new NetworkSource(this, {}));
auto networkItem = new NetworkSource(this, QStringList());
for (auto &source : networkItem->sources())
addObject(new ExtSysMonSensor(this, source, networkItem));
// player
createSensor("player", i18n("Music player"),
new PlayerSource(this, {_config["PLAYER"], _config["MPDADDRESS"], _config["MPDPORT"], _config["MPRIS"],
_config["PLAYERSYMBOLS"]}));
auto playerItem
= new PlayerSource(this, {_config["PLAYER"], _config["MPDADDRESS"], _config["MPDPORT"],
_config["MPRIS"], _config["PLAYERSYMBOLS"]});
for (auto &source : playerItem->sources())
addObject(new ExtSysMonSensor(this, source, playerItem));
// processes
createSensor("ps", i18n("Processes"), new ProcessesSource(this, {}));
auto processesItem = new ProcessesSource(this, {});
for (auto &source : processesItem->sources())
addObject(new ExtSysMonSensor(this, source, processesItem));
// network request
createSensor("requests", i18n("Network requests"), new RequestSource(this, {}));
auto requestItem = new RequestSource(this, {});
for (auto &source : requestItem->sources())
addObject(new ExtSysMonSensor(this, source, requestItem));
// quotes
createSensor("quotes", i18n("Quotes"), new QuotesSource(this, {}));
auto quotesItem = new QuotesSource(this, {});
for (auto &source : quotesItem->sources())
addObject(new ExtSysMonSensor(this, source, quotesItem));
// system
createSensor("system", i18n("System"), new SystemInfoSource(this, {}));
// current time
createSensor("time", i18n("Time"), new TimeSource(this, {}));
auto systemItem = new SystemInfoSource(this, {});
for (auto &source : systemItem->sources())
addObject(new ExtSysMonSensor(this, source, systemItem));
// upgrade
createSensor("upgrade", i18n("Upgrades"), new UpgradeSource(this, {}));
auto upgradeItem = new UpgradeSource(this, {});
for (auto &source : upgradeItem->sources())
addObject(new ExtSysMonSensor(this, source, upgradeItem));
// weather
createSensor("weather", i18n("Weather"), new WeatherSource(this, {}));
auto weatherItem = new WeatherSource(this, {});
for (auto &source : weatherItem->sources())
addObject(new ExtSysMonSensor(this, source, weatherItem));
#ifdef BUILD_LOAD
// additional load source
createSensor("load", i18n("Load"), new LoadSource(this, {}));
auto loadItem = new LoadSource(this, QStringList());
for (auto &source : loadItem->sources())
addObject(new ExtSysMonSensor(this, source, loadItem));
#endif /* BUILD_LOAD */
}

View File

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

View File

@ -1,6 +1,13 @@
[Configuration]
# ACPI devices
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
MPDADDRESS=localhost
MPDPORT=6600

View File

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

View File

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

View File

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

View File

@ -17,66 +17,23 @@
#include "extsysmonsensor.h"
#include <QTimer>
#include "abstractextsysmonsource.h"
#include "awdebug.h"
ExtSysMonSensor::ExtSysMonSensor(KSysGuard::SensorContainer *_parent, const QString &_id, const QString &_name,
ExtSysMonSensor::ExtSysMonSensor(KSysGuard::SensorContainer *_parent, const QString &_id,
AbstractExtSysMonSource *_source)
: KSysGuard::SensorObject(_id, _name, _parent)
, m_source(_source)
, m_timer(new QTimer(this))
: KSysGuard::SensorObject(_id, _parent)
{
qCDebug(LOG_ESS) << __PRETTY_FUNCTION__;
loadProperties();
m_source = _source;
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()) {
auto property = sensor(source);
if (!property->isSubscribed())
continue; // skip properties which are not explicitly subscribed
auto property = new KSysGuard::SensorProperty(source, this);
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 property = new KSysGuard::SensorProperty(source, info->name, this);
property->setName(info->name);
property->setUnit(info->unit);
property->setVariantType(info->variantType);
@ -84,6 +41,15 @@ void ExtSysMonSensor::loadProperties()
property->setMin(info->min);
property->setMax(info->max);
addProperty(property);
m_properties[source] = property;
}
}
void ExtSysMonSensor::update()
{
for (auto &source : m_properties.keys()) {
auto value = m_source->data(source);
m_properties[source]->setValue(value);
}
}

View File

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

View File

@ -0,0 +1,151 @@
/***************************************************************************
* 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

@ -15,48 +15,38 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "timesource.h"
#ifndef GPULOADSOURCE_H
#define GPULOADSOURCE_H
#include <ksysguard/formatter/Unit.h>
#include <ksysguard/systemstats/SensorInfo.h>
#include <QObject>
#include "awdebug.h"
#include "abstractextsysmonsource.h"
TimeSource::TimeSource(QObject *_parent, const QStringList &_args)
: AbstractExtSysMonSource(_parent, _args)
class QProcess;
class GPULoadSource : public AbstractExtSysMonSource
{
Q_ASSERT(_args.count() == 0);
qCDebug(LOG_ESS) << __PRETTY_FUNCTION__;
}
Q_OBJECT
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;
};
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"});
}
#endif /* GPULOADSOURCE_H */

View File

@ -0,0 +1,131 @@
/***************************************************************************
* 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

@ -15,22 +15,37 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#pragma once
#ifndef GPUTEMPSOURCE_H
#define GPUTEMPSOURCE_H
#include <QObject>
#include "abstractextsysmonsource.h"
#include "extitemaggregator.h"
class TimeSource : public AbstractExtSysMonSource
class QProcess;
class GPUTemperatureSource : public AbstractExtSysMonSource
{
Q_OBJECT
public:
explicit TimeSource(QObject *_parent, const QStringList &_args);
explicit GPUTemperatureSource(QObject *_parent, const QStringList &_args);
~GPUTemperatureSource() override;
QVariant data(const QString &_source) override;
[[nodiscard]] KSysGuard::SensorInfo *initialData(const QString &_source) const override;
void run() 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 /* GPUTEMPSOURCE_H */

View File

@ -0,0 +1,152 @@
/***************************************************************************
* 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

@ -0,0 +1,55 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#ifndef 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;
auto data = new KSysGuard::SensorInfo();
if (_source.startsWith("load")) {
if (_source.startsWith("load/load")) {
data->min = 0;
data->max = 0;
data->name = "Simple sources for load tests";
@ -69,7 +69,7 @@ QStringList LoadSource::sources() const
{
QStringList sources;
for (int i = 0; i < 1000; i++)
sources.append(QString("load%1").arg(i));
sources.append(QString("load/load%1").arg(i));
return sources;
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -18,15 +18,13 @@ set(Qt_LIBRARIES
# kf6 libraries
find_package(ECM 0.0.11 REQUIRED NO_MODULE)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH})
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR})
find_package(KF6 REQUIRED COMPONENTS I18n Notifications Service WindowSystem)
find_package(KSysGuard REQUIRED)
find_package(LibTaskManager REQUIRED)
find_package(Plasma REQUIRED)
find_package(KSysGuard REQUIRED)
include(KDEInstallDirs)
include(KDECMakeSettings)
include(KDECompilerSettings)
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)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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