Merge 7b60e8a42f03c4a31865968a7c0c19ac1ffa7c4f into eecb128865d463a5e8faeb09f2b0b7d9d6d682f0

This commit is contained in:
Evgenii Alekseev 2024-03-25 13:31:52 +00:00 committed by GitHub
commit 9c342067f4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
160 changed files with 2690 additions and 2405 deletions

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,3 +1,6 @@
Ver.4.0.0:
* migration to plasma 6
Ver.3.5.0:
+ wayland support
* update code to latest standards
@ -12,7 +15,6 @@ 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,41 +1,33 @@
# Maintainer: Evgeniy Alekseev <arcanis at archlinux dot org>
pkgname=plasma5-applet-awesome-widgets
pkgname=plasma6-applet-awesome-widgets
_pkgname=awesome-widgets
pkgver=3.4.3
pkgver=4.0.0alpha1
pkgrel=1
pkgdesc="Collection of minimalistic Plasmoids which look like Awesome WM widgets (ex-PyTextMonitor)"
arch=('i686' 'x86_64')
arch=('x86_64')
url="https://arcanis.me/projects/awesome-widgets"
license=('GPL3')
depends=('ksysguard' 'plasma-framework')
optdepends=("catalyst: for GPU monitor"
"hddtemp: for HDD temperature monitor"
depends=('plasma-workspace')
optdepends=("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/V.${pkgver}/${_pkgname}-${pkgver}-src.tar.xz)
install=${pkgname}.install
md5sums=('5953ba518191bb6fff83cdb8633c735c')
source=(https://github.com/arcan1s/awesome-widgets/releases/download/${pkgver}/${_pkgname}-${pkgver}-src.tar.xz)
install="$pkgname.install"
backup=('etc/xdg/plasma-dataengine-extsysmon.conf')
prepare() {
rm -rf "${srcdir}/build"
mkdir "${srcdir}/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
cmake -B build -S "${_pkgname}" \
-DCMAKE_BUILD_TYPE=Optimization \
-DBUILD_FUTURE=ON \
-DBUILD_TESTING=OFF
cmake --build build
}
package() {
cd "${srcdir}/build"
make DESTDIR="${pkgdir}" install
DESTDIR="$pkgdir" cmake --install build
}
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

@ -39,81 +39,6 @@ void CFont::setCurrentColor(const QColor color)
}
int CFont::html2QFont(const int htmlWeight)
{
int weight = 16;
switch(htmlWeight) {
case 100:
weight = 16;
break;
case 200:
case 300:
weight = 25;
break;
case 400:
weight = 50;
break;
case 500:
case 600:
weight = 63;
break;
case 700:
case 800:
weight = 75;
break;
case 900:
weight = 87;
break;
default:
break;
}
return weight;
}
int CFont::qFont2html(const int weight)
{
int htmlWeight = 400;
switch(weight) {
case 16:
htmlWeight = 100;
break;
case 25:
htmlWeight = 300;
break;
case 50:
htmlWeight = 400;
break;
case 63:
htmlWeight = 600;
break;
case 75:
htmlWeight = 800;
break;
case 87:
htmlWeight = 900;
break;
default:
break;
}
return htmlWeight;
}
int CFont::htmlWeight()
{
return CFont::qFont2html(weight());
}
void CFont::setHtmlWeight(const int htmlWeight)
{
setWeight(CFont::html2QFont(htmlWeight));
}
CFont CFont::fromQFont(const QFont font, const QColor color)
{
return CFont(font.family(), font.pointSize(), font.weight(), font.italic(), color);

View File

@ -34,11 +34,6 @@ public:
// color properties
QColor color();
void setCurrentColor(const QColor color);
// html weight properties
static int html2QFont(const int htmlWeight);
static int qFont2html(const int weight);
int htmlWeight();
void setHtmlWeight(const int htmlWeight);
// conversion to QFont
static CFont fromQFont(const QFont font,
const QColor color = QColor(QString("#000000")));

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 "3")
set(PROJECT_VERSION_MINOR "5")
set(PROJECT_VERSION_PATCH "1")
set(PROJECT_VERSION_MAJOR "4")
set(PROJECT_VERSION_MINOR "0")
set(PROJECT_VERSION_PATCH "0")
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

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

View File

@ -1,26 +0,0 @@
[Desktop Entry]
Encoding=UTF-8
Name=Awesome Widget
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.awesomewidget
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

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

View File

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

View File

@ -7,150 +7,150 @@
<group name="Widget">
<!-- widget -->
<entry name="text" type="string">
<entry name="text" type="String">
<default>[cpu: $cpu%] [mem: $mem%] [swap: $swap%] [$netdev: $down/$upKB/s]</default>
</entry>
</group>
<group name="Advanced">
<!-- advanced -->
<entry name="background" type="bool">
<entry name="background" type="Bool">
<default>true</default>
</entry>
<entry name="translateStrings" type="bool">
<entry name="translateStrings" type="Bool">
<default>true</default>
</entry>
<entry name="wrapNewLines" type="bool">
<entry name="wrapNewLines" type="Bool">
<default>false</default>
</entry>
<entry name="wrapText" type="bool">
<entry name="wrapText" type="Bool">
<default>false</default>
</entry>
<entry name="notify" type="bool">
<entry name="notify" type="Bool">
<default>true</default>
</entry>
<entry name="checkUpdates" type="bool">
<entry name="checkUpdates" type="Bool">
<default>true</default>
</entry>
<entry name="optimize" type="bool">
<entry name="optimize" type="Bool">
<default>true</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="interval" type="int">
<entry name="interval" type="Int">
<default>1000</default>
</entry>
<entry name="queueLimit" type="int">
<entry name="queueLimit" type="Int">
<default>0</default>
</entry>
<entry name="tempUnits" type="string">
<entry name="tempUnits" type="String">
<default>Celsius</default>
</entry>
<entry name="customTime" type="string">
<entry name="customTime" type="String">
<default>$hh:$mm</default>
</entry>
<entry name="customUptime" type="string">
<entry name="customUptime" type="String">
<default>$dd,$hh,$mm</default>
</entry>
<entry name="acOnline" type="string">
<entry name="acOnline" type="String">
<default>(*)</default>
</entry>
<entry name="acOffline" type="string">
<entry name="acOffline" type="String">
<default>( )</default>
</entry>
<entry name="telemetryCount" type="int">
<entry name="telemetryCount" type="Int">
<default>100</default>
</entry>
<entry name="telemetryRemote" type="bool">
<entry name="telemetryRemote" type="Bool">
<default>false</default>
</entry>
<entry name="telemetryId" type="string">
<entry name="telemetryId" type="String">
<default></default>
</entry>
</group>
<group name="Tooltip">
<entry name="tooltipNumber" type="int">
<entry name="tooltipNumber" type="Int">
<default>100</default>
</entry>
<entry name="useTooltipBackground" type="bool">
<entry name="useTooltipBackground" type="Bool">
<default>true</default>
</entry>
<entry name="tooltipBackground" type="string">
<entry name="tooltipBackground" type="String">
<default>#ffffff</default>
</entry>
<entry name="cpuTooltip" type="bool">
<entry name="cpuTooltip" type="Bool">
<default>true</default>
</entry>
<entry name="cpuTooltipColor" type="string">
<entry name="cpuTooltipColor" type="String">
<default>#ff0000</default>
</entry>
<entry name="cpuclTooltip" type="bool">
<entry name="cpuclTooltip" type="Bool">
<default>true</default>
</entry>
<entry name="cpuclTooltipColor" type="string">
<entry name="cpuclTooltipColor" type="String">
<default>#00ff00</default>
</entry>
<entry name="memTooltip" type="bool">
<entry name="memTooltip" type="Bool">
<default>true</default>
</entry>
<entry name="memTooltipColor" type="string">
<entry name="memTooltipColor" type="String">
<default>#0000ff</default>
</entry>
<entry name="swapTooltip" type="bool">
<entry name="swapTooltip" type="Bool">
<default>true</default>
</entry>
<entry name="swapTooltipColor" type="string">
<entry name="swapTooltipColor" type="String">
<default>#ffff00</default>
</entry>
<entry name="downkbTooltip" type="bool">
<entry name="downkbTooltip" type="Bool">
<default>true</default>
</entry>
<entry name="downkbTooltipColor" type="string">
<entry name="downkbTooltipColor" type="String">
<default>#00ffff</default>
</entry>
<entry name="upkbTooltipColor" type="string">
<entry name="upkbTooltipColor" type="String">
<default>#ff00ff</default>
</entry>
<entry name="batTooltip" type="bool">
<entry name="batTooltip" type="Bool">
<default>true</default>
</entry>
<entry name="batTooltipColor" type="string">
<entry name="batTooltipColor" type="String">
<default>#008800</default>
</entry>
<entry name="batInTooltipColor" type="string">
<entry name="batInTooltipColor" type="String">
<default>#880000</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>
</group>

View File

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

View File

@ -15,8 +15,8 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
import QtQuick 2.0
import QtQuick.Controls 1.3 as QtControls
import QtQuick 2.15
import QtQuick.Controls
import org.kde.plasma.private.awesomewidget 1.0
@ -165,7 +165,7 @@ Item {
]
text: i18n("Temperature units")
value: plasmoid.configuration.tempUnits
onValueEdited: cfg_tempUnits = newValue
onValueEdited: newValue => cfg_tempUnits = newValue
}
LineSelector {
@ -192,13 +192,11 @@ Item {
value: plasmoid.configuration.acOffline
}
QtControls.GroupBox {
height: implicitHeight
GroupBox {
width: parent.width
title: i18n("Actions")
Column {
height: implicitHeight
width: parent.width
ButtonSelector {
value: i18n("Drop key cache")
@ -226,13 +224,11 @@ Item {
}
}
QtControls.GroupBox {
height: implicitHeight
GroupBox {
width: parent.width
title: i18n("Telemetry")
Column {
height: implicitHeight
width: parent.width
CheckBoxSelector {
id: telemetryRemote

View File

@ -15,7 +15,7 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
import QtQuick 2.0
import QtQuick 2.15
import org.kde.plasma.private.awesomewidget 1.0
import "."
@ -75,7 +75,7 @@ Item {
model: General.fontWeightModel
text: i18n("Font weight")
value: plasmoid.configuration.fontWeight
onValueEdited: cfg_fontWeight = newValue
onValueEdited: newValue => cfg_fontWeight = newValue
}
ComboBoxSelector {
@ -83,7 +83,7 @@ Item {
model: General.fontStyleModel
text: i18n("Font style")
value: plasmoid.configuration.fontStyle
onValueEdited: cfg_fontStyle = newValue
onValueEdited: newValue => cfg_fontStyle = newValue
}
ColorSelector {
@ -97,7 +97,7 @@ Item {
model: General.textStyleModel
text: i18n("Style")
value: plasmoid.configuration.textStyle
onValueEdited: cfg_textStyle = newValue
onValueEdited: newValue => cfg_textStyle = newValue
}
ColorSelector {

View File

@ -15,9 +15,8 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
import QtQuick 2.0
import QtQuick.Controls 1.3 as QtControls
import QtQuick.Dialogs 1.1 as QtDialogs
import QtQuick 2.15
import QtQuick.Controls
import org.kde.plasma.private.awesomewidget 1.0
@ -48,18 +47,18 @@ Item {
Column {
id: pageColumn
anchors.fill: parent
QtControls.GroupBox {
GroupBox {
height: implicitHeight
width: parent.width
title: i18n("ACPI")
LineSelector {
text: i18n("ACPI path")
value: cfg_dataengine["ACPIPATH"]
onValueEdited: cfg_dataengine["ACPIPATH"] = newValue
onValueEdited: newValue => cfg_dataengine["ACPIPATH"] = newValue
}
}
QtControls.GroupBox {
GroupBox {
height: implicitHeight
width: parent.width
title: i18n("GPU")
@ -84,11 +83,11 @@ Item {
]
text: i18n("GPU device")
value: cfg_dataengine["GPUDEV"]
onValueEdited: cfg_dataengine["GPUDEV"] = newValue
onValueEdited: newValue => cfg_dataengine["GPUDEV"] = newValue
}
}
QtControls.GroupBox {
GroupBox {
height: implicitHeight
width: parent.width
title: i18n("HDD temperature")
@ -99,18 +98,18 @@ Item {
id: hdd
text: i18n("HDD")
value: cfg_dataengine["HDDDEV"]
onValueEdited: cfg_dataengine["HDDDEV"] = newValue
onValueEdited: newValue => cfg_dataengine["HDDDEV"] = newValue
}
LineSelector {
text: i18n("hddtemp cmd")
value: cfg_dataengine["HDDTEMPCMD"]
onValueEdited: cfg_dataengine["HDDTEMPCMD"] = newValue
onValueEdited: newValue => cfg_dataengine["HDDTEMPCMD"] = newValue
}
}
}
QtControls.GroupBox {
GroupBox {
height: implicitHeight
width: parent.width
title: i18n("Player")
@ -123,7 +122,7 @@ Item {
stepSize: 1
text: i18n("Player data symbols")
value: cfg_dataengine["PLAYERSYMBOLS"]
onValueEdited: cfg_dataengine["PLAYERSYMBOLS"] = newValue
onValueEdited: newValue => cfg_dataengine["PLAYERSYMBOLS"] = newValue
}
ComboBoxSelector {
@ -143,7 +142,7 @@ Item {
]
text: i18n("Music player")
value: cfg_dataengine["PLAYER"]
onValueEdited: cfg_dataengine["PLAYER"] = newValue
onValueEdited: newValue => cfg_dataengine["PLAYER"] = newValue
}
ComboBoxSelector {
@ -194,7 +193,7 @@ Item {
LineSelector {
text: i18n("MPD address")
value: cfg_dataengine["MPDADDRESS"]
onValueEdited: cfg_dataengine["MPDADDRESS"] = newValue
onValueEdited: newValue => cfg_dataengine["MPDADDRESS"] = newValue
}
IntegerSelector {
@ -203,12 +202,12 @@ Item {
stepSize: 1
text: i18n("MPD port")
value: cfg_dataengine["MPDPORT"]
onValueEdited: cfg_dataengine["MPDPORT"] = newValue
onValueEdited: newValue => cfg_dataengine["MPDPORT"] = newValue
}
}
}
QtControls.GroupBox {
GroupBox {
height: implicitHeight
width: parent.width
title: i18n("Extensions")

View File

@ -15,19 +15,18 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
import QtQuick 2.4
import QtQuick.Controls 1.3 as QtControls
import QtQuick.Dialogs 1.2 as QtDialogs
import QtQuick.Layouts 1.1
import QtQuick 2.15
import QtQuick.Controls
import QtQuick.Dialogs
import QtQuick.Layouts
import org.kde.plasma.core as PlasmaCore
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.awesomewidget 1.0
import "."
Item {
PlasmoidItem {
id: main
// backend
AWKeys {
@ -74,17 +73,12 @@ Item {
signal sizeUpdate
// init
Plasmoid.preferredRepresentation: Plasmoid.fullRepresentation
Plasmoid.compactRepresentation: Plasmoid.fullRepresentation
Layout.fillWidth: plasmoid.formFactor != PlasmaCore.Planar
Layout.fillHeight: plasmoid.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"
Plasmoid.associatedApplication: "ksysguard"
// ui
@ -119,11 +113,11 @@ Item {
}
}
QtDialogs.Dialog {
Dialog {
id: tagSelector
title: i18n("Select tag")
QtControls.ComboBox {
ComboBox {
id: tagSelectorBox
width: parent.width
editable: true
@ -140,17 +134,29 @@ Item {
}
}
Plasmoid.contextualActions: [
PlasmaCore.Action {
text: i18n("Request key")
icon.name: "utilities-system-monitor"
},
PlasmaCore.Action {
text: i18n("Show README")
icon.name: "text-x-readme"
},
PlasmaCore.Action {
text: i18n("Check updates")
icon.name: "system-software-update"
},
PlasmaCore.Action {
text: i18n("Report bug")
icon.name: "tools-report-bug"
}
]
Component.onCompleted: {
if (debug) console.debug()
// actions
// it makes no sense to use this field with optimization enable
if (!plasmoid.configuration.optimize)
plasmoid.setAction("requestKey", i18n("Request key"), "utilities-system-monitor")
plasmoid.setAction("showReadme", i18n("Show README"), "text-x-readme")
plasmoid.setAction("checkUpdates", i18n("Check updates"), "system-software-update")
plasmoid.setAction("reportBug", i18n("Report bug"), "tools-report-bug")
// init submodule
Plasmoid.userConfiguringChanged(false)
// connect data
@ -160,14 +166,14 @@ Item {
if (plasmoid.configuration.checkUpdates) return awActions.checkUpdates(false)
}
onNeedTextUpdate: {
onNeedTextUpdate: newText => {
if (debug) console.debug()
text.text = newText
sizeUpdate()
}
onNeedToolTipUpdate: {
onNeedToolTipUpdate: newText => {
if (debug) console.debug()
tooltip.text = newText

View File

@ -15,8 +15,8 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
import QtQuick 2.0
import QtQuick.Controls 1.3 as QtControls
import QtQuick 2.15
import QtQuick.Controls
import org.kde.plasma.private.awesomewidget 1.0
@ -46,7 +46,7 @@ Item {
property alias cfg_memTooltipColor: memTooltipColor.value
property alias cfg_swapTooltip: swapTooltip.checked
property alias cfg_swapTooltipColor: swapTooltipColor.value
property alias cfg_downkbTooltip: downkbTooltip.checked
property alias cfg_downkbTooltip: networkTooltip.checked
property alias cfg_downkbTooltipColor: downkbTooltipColor.value
property alias cfg_upkbTooltipColor: upkbTooltipColor.value
property alias cfg_batTooltip: batTooltip.checked
@ -57,7 +57,8 @@ Item {
Column {
id: pageColumn
anchors.fill: parent
QtControls.Label {
Label {
width: parent.width
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
@ -74,80 +75,109 @@ Item {
value: plasmoid.configuration.tooltipNumber
}
QtControls.GroupBox {
GroupBox {
id: useTooltipBackground
height: implicitHeight
width: parent.width
checkable: true
title: i18n("Background")
property alias checked: useTooltipBackgroundLabel.checked
label: CheckBox {
id: useTooltipBackgroundLabel
text: i18n("Background")
}
ColorSelector {
id: tooltipBackground
enabled: useTooltipBackgroundLabel.checked
text: i18n("Background color")
value: plasmoid.configuration.tooltipBackground
}
}
QtControls.GroupBox {
GroupBox {
id: cpuTooltip
height: implicitHeight
width: parent.width
checkable: true
title: i18n("CPU")
property alias checked: cpuTooltipLabel.checked
label: CheckBox {
id: cpuTooltipLabel
text: i18n("CPU")
}
ColorSelector {
id: cpuTooltipColor
enabled: cpuTooltipLabel.checked
text: i18n("CPU color")
value: plasmoid.configuration.cpuTooltipColor
}
}
QtControls.GroupBox {
GroupBox {
id: cpuclTooltip
height: implicitHeight
width: parent.width
checkable: true
title: i18n("CPU clock")
property alias checked: cpuclTooltipLabel.checked
label: CheckBox {
id: cpuclTooltipLabel
text: i18n("CPU clock")
}
ColorSelector {
id: cpuclTooltipColor
enabled: cpuclTooltipLabel.checked
text: i18n("CPU clock color")
value: plasmoid.configuration.cpuclTooltipColor
}
}
QtControls.GroupBox {
GroupBox {
id: memTooltip
height: implicitHeight
width: parent.width
checkable: true
title: i18n("Memory")
property alias checked: memTooltipLabel.checked
label: CheckBox {
id: memTooltipLabel
text: i18n("Memory")
}
ColorSelector {
id: memTooltipColor
enabled: memTooltipLabel.checked
text: i18n("Memory color")
value: plasmoid.configuration.memTooltipColor
}
}
QtControls.GroupBox {
GroupBox {
id: swapTooltip
height: implicitHeight
width: parent.width
checkable: true
title: i18n("Swap")
property alias checked: swapTooltipLabel.checked
label: CheckBox {
id: swapTooltipLabel
text: i18n("Swap")
}
ColorSelector {
id: swapTooltipColor
enabled: swapTooltipLabel.checked
text: i18n("Swap color")
value: plasmoid.configuration.swapTooltipColor
}
}
QtControls.GroupBox {
id: downkbTooltip
height: implicitHeight
GroupBox {
id: networkTooltip
width: parent.width
checkable: true
title: i18n("Network")
property alias checked: networkTooltipLabel.checked
label: CheckBox {
id: networkTooltipLabel
text: i18n("Network")
}
Column {
height: implicitHeight
width: parent.width
enabled: networkTooltipLabel.checked
ColorSelector {
id: downkbTooltipColor
text: i18n("Download speed color")
@ -161,15 +191,19 @@ Item {
}
}
QtControls.GroupBox {
GroupBox {
id: batTooltip
height: implicitHeight
width: parent.width
checkable: true
title: i18n("Battery")
property alias checked: batteryTooltipLabel.checked
label: CheckBox {
id: batteryTooltipLabel
text: i18n("Battery")
}
Column {
height: implicitHeight
width: parent.width
enabled: batteryTooltipLabel.checked
ColorSelector {
id: batTooltipColor
text: i18n("Battery active color")

View File

@ -15,7 +15,7 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
import QtQuick 2.2
import QtQuick 2.15
import org.kde.plasma.private.awesomewidget 1.0
import "."
@ -90,7 +90,7 @@ Item {
awKeys.setAggregatorProperty("translate", plasmoid.configuration.translateStrings)
}
onNeedTextUpdate: {
onNeedTextUpdate: newText => {
if (lock) return
if (debug) console.debug()

View File

@ -1,26 +0,0 @@
[Desktop Entry]
Encoding=UTF-8
Name=Awesome Widget
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.awesomewidget
X-KDE-PluginInfo-Version=3.5.1
X-KDE-PluginInfo-Website=https://arcanis.me/projects/awesome-widgets/
X-KDE-PluginInfo-Category=System Information
X-KDE-PluginInfo-License=GPLv3
X-KDE-PluginInfo-EnabledByDefault=true

View File

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

View File

@ -7,17 +7,17 @@ include_directories(
${CMAKE_CURRENT_SOURCE_DIR}/../../${PROJECT_LIBRARY}/
${PROJECT_TRDPARTY_DIR}
${Qt_INCLUDE}
${Kf5_INCLUDE}
${Kf6_INCLUDE}
)
file(GLOB SUBPROJECT_SOURCE *.cpp ${PROJECT_TRDPARTY_DIR}/fontdialog/*.cpp ${CMAKE_SOURCE_DIR}/*.cpp)
file(GLOB SUBPROJECT_UI *.ui)
file(GLOB SUBPROJECT_NOTIFY *.notifyrc)
qt5_wrap_ui(SUBPROJECT_UI_HEADER ${SUBPROJECT_UI})
qt6_wrap_ui(SUBPROJECT_UI_HEADER ${SUBPROJECT_UI})
add_library(${PLUGIN_NAME} SHARED ${SUBPROJECT_SOURCE} ${SUBPROJECT_UI_HEADER})
target_link_libraries(${PLUGIN_NAME} ${PROJECT_LIBRARY} ${Qt_LIBRARIES} ${Kf5_LIBRARIES})
target_link_libraries(${PLUGIN_NAME} ${PROJECT_LIBRARY} ${Qt_LIBRARIES} ${Kf6_LIBRARIES})
install(TARGETS ${PLUGIN_NAME} DESTINATION ${QML_INSTALL_DIR}/org/kde/plasma/private/awesomewidget)
install(FILES qmldir DESTINATION ${QML_INSTALL_DIR}/org/kde/plasma/private/awesomewidget)
install(FILES ${SUBPROJECT_NOTIFY} DESTINATION ${KNOTIFYRC_INSTALL_DIR})
install(TARGETS ${PLUGIN_NAME} DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/plasma/private/awesomewidget)
install(FILES qmldir DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/plasma/private/awesomewidget)
install(FILES ${SUBPROJECT_NOTIFY} DESTINATION ${KDE_INSTALL_KNOTIFYRCDIR})

View File

@ -21,7 +21,6 @@
#include <QQmlPropertyMap>
#include <QSettings>
#include <QStandardPaths>
#include <QTextCodec>
#include "awdebug.h"
@ -285,7 +284,6 @@ void AWConfigHelper::writeFile(QSettings &_settings, const QString &_key, const
QFile file(_fileName);
if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
QTextStream out(&file);
out.setCodec("UTF-8");
out << _settings.value(_key).toString().toUtf8();
out.flush();
file.close();

View File

@ -17,30 +17,35 @@
#include "awdataengineaggregator.h"
#include <Plasma/DataContainer>
#include <ksysguard/formatter/Unit.h>
#include <ksysguard/systemstats/DBusInterface.h>
#include <QDBusConnection>
#include "awdebug.h"
AWDataEngineAggregator::AWDataEngineAggregator(QObject *_parent)
: QObject(_parent)
, m_interface(new KSysGuard::SystemStats::DBusInterface())
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
m_consumer = new Plasma::DataEngineConsumer();
m_dataEngines["systemmonitor"] = m_consumer->dataEngine("systemmonitor");
m_dataEngines["extsysmon"] = m_consumer->dataEngine("extsysmon");
m_dataEngines["time"] = m_consumer->dataEngine("time");
qDBusRegisterMetaType<KSysGuard::SensorData>();
qDBusRegisterMetaType<KSysGuard::SensorInfo>();
qDBusRegisterMetaType<KSysGuard::SensorDataList>();
qDBusRegisterMetaType<QHash<QString, KSysGuard::SensorInfo>>();
// additional method required by systemmonitor structure
m_newSourceConnection
= connect(m_dataEngines["systemmonitor"], &Plasma::DataEngine::sourceAdded, [this](const QString &source) {
emit(deviceAdded(source));
m_dataEngines["systemmonitor"]->connectSource(source, parent(), 1000);
});
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);
// required to define Qt::QueuedConnection for signal-slot connection
qRegisterMetaType<Plasma::DataEngine::Data>("Plasma::DataEngine::Data");
loadSources();
}
@ -49,67 +54,96 @@ 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()
{
for (auto dataEngine : m_dataEngines.values())
for (auto &source : dataEngine->sources())
dataEngine->disconnectSource(source, parent());
disconnect(m_newSourceConnection);
m_interface->unsubscribe(m_subscribed.values()).waitForFinished();
m_subscribed.clear();
}
void AWDataEngineAggregator::reconnectSources(const int _interval)
bool AWDataEngineAggregator::isValidSensor(const KSysGuard::SensorInfo &_sensor)
{
qCDebug(LOG_AW) << "Reconnect sources with interval" << _interval;
return _sensor.unit != KSysGuard::UnitInvalid;
}
disconnectSources();
m_dataEngines["systemmonitor"]->connectAllSources(parent(), (uint)_interval);
m_dataEngines["extsysmon"]->connectAllSources(parent(), (uint)_interval);
m_dataEngines["time"]->connectSource("Local", parent(), 1000);
void AWDataEngineAggregator::loadSources()
{
auto response = m_interface->allSensors();
response.waitForFinished();
m_newSourceConnection = connect(
m_dataEngines["systemmonitor"], &Plasma::DataEngine::sourceAdded, [this, _interval](const QString &source) {
emit(deviceAdded(source));
m_dataEngines["systemmonitor"]->connectSource(source, parent(), (uint)_interval);
});
#ifdef BUILD_FUTURE
createQueuedConnection();
#endif /* BUILD_FUTURE */
auto sensors = response.value();
updateSensors(sensors);
connectSources();
}
void AWDataEngineAggregator::dropSource(const QString &_source)
{
qCDebug(LOG_AW) << "Source" << _source;
qCDebug(LOG_AW) << "Disconnect sensor" << _source;
// HACK there is no possibility to check to which dataengine source
// connected we will try to disconnect it from all engines
for (auto dataEngine : m_dataEngines.values())
dataEngine->disconnectSource(_source, parent());
}
void AWDataEngineAggregator::createQueuedConnection()
{
// HACK additional method which forces QueuedConnection instead of Auto one
// for more details refer to plasma-framework source code
for (auto &dataEngine : m_dataEngines.keys()) {
// different source set for different engines
QStringList sources = dataEngine == "time" ? QStringList() << "Local" : m_dataEngines[dataEngine]->sources();
// reconnect sources
for (auto &source : sources) {
Plasma::DataContainer *container = m_dataEngines[dataEngine]->containerForSource(source);
// disconnect old connections first
disconnect(container, SIGNAL(dataUpdated(QString, Plasma::DataEngine::Data)), parent(),
SLOT(dataUpdated(QString, Plasma::DataEngine::Data)));
// and now reconnect with Qt::QueuedConnection type
connect(container, SIGNAL(dataUpdated(QString, Plasma::DataEngine::Data)), parent(),
SLOT(dataUpdated(QString, Plasma::DataEngine::Data)), Qt::QueuedConnection);
}
if (m_subscribed.contains(_source)) {
m_interface->unsubscribe({_source}).waitForFinished();
m_subscribed.remove(_source);
}
}
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);
}
}
void AWDataEngineAggregator::sensorRemoved(const QString &_sensor)
{
qCDebug(LOG_AW) << "Sensor" << _sensor << "has been removed";
m_sensors.remove(_sensor);
dropSource(_sensor);
}
void AWDataEngineAggregator::updateData(KSysGuard::SensorDataList _data)
{
emit(dataUpdated(m_sensors, _data));
}
void AWDataEngineAggregator::updateSensors(const QHash<QString, KSysGuard::SensorInfo> &_sensors)
{
for (auto sensor = _sensors.cbegin(); sensor != _sensors.cend(); ++sensor) {
if (!isValidSensor(sensor.value()))
continue;
m_sensors.insert(sensor.key(), sensor.value());
}
}

View File

@ -15,16 +15,20 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#pragma once
#ifndef AWDATAENGINEAGGREGATOR_H
#define AWDATAENGINEAGGREGATOR_H
#include <Plasma/DataEngine>
#include <Plasma/DataEngineConsumer>
#include <ksysguard/systemstats/SensorInfo.h>
#include <QHash>
#include <QObject>
#include <QSet>
namespace KSysGuard::SystemStats
{
class DBusInterface;
}
class AWDataEngineAggregator : public QObject
{
Q_OBJECT
@ -32,21 +36,24 @@ class AWDataEngineAggregator : public QObject
public:
explicit AWDataEngineAggregator(QObject *_parent = nullptr);
~AWDataEngineAggregator() override;
void connectSources();
void disconnectSources();
void reconnectSources(int _interval);
[[nodiscard]] static bool isValidSensor(const KSysGuard::SensorInfo &_sensor);
void loadSources();
signals:
void dataUpdated(const QHash<QString, KSysGuard::SensorInfo> &_sensors, const KSysGuard::SensorDataList &_data);
void deviceAdded(const QString &_source);
public slots:
void dropSource(const QString &_source);
void sensorAdded(const QString &_sensor);
void sensorRemoved(const QString &_sensor);
void updateData(KSysGuard::SensorDataList _data);
void updateSensors(const QHash<QString, KSysGuard::SensorInfo> &_sensors);
private:
void createQueuedConnection();
Plasma::DataEngineConsumer *m_consumer = nullptr;
QHash<QString, Plasma::DataEngine *> m_dataEngines;
QMetaObject::Connection m_newSourceConnection;
KSysGuard::SystemStats::DBusInterface *m_interface = nullptr;
QHash<QString, KSysGuard::SensorInfo> m_sensors;
QSet<QString> m_subscribed;
};
#endif /* AWDATAENGINEAGGREGATOR_H */

View File

@ -17,7 +17,7 @@
#include "awdataenginemapper.h"
#include <QRegExp>
#include <QRegularExpression>
#include "awdebug.h"
#include "awformatterhelper.h"
@ -76,75 +76,77 @@ QStringList AWDataEngineMapper::keysFromSource(const QString &_source) const
// HACK units required to define should the value be calculated as temperature
// or fan data
QStringList AWDataEngineMapper::registerSource(const QString &_source, const QString &_units, const QStringList &_keys)
QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSysGuard::Unit _units,
const QStringList &_keys)
{
qCDebug(LOG_AW) << "Source" << _source << "with units" << _units;
// regular expressions
QRegExp cpuRegExp = QRegExp("cpu/cpu.*/TotalLoad");
QRegExp cpuclRegExp = QRegExp("cpu/cpu.*/clock");
QRegExp hddrRegExp = QRegExp("disk/.*/Rate/rblk");
QRegExp hddwRegExp = QRegExp("disk/.*/Rate/wblk");
QRegExp mountFillRegExp = QRegExp("partitions/.*/filllevel");
QRegExp mountFreeRegExp = QRegExp("partitions/.*/freespace");
QRegExp mountUsedRegExp = QRegExp("partitions/.*/usedspace");
QRegExp netRegExp = QRegExp("network/interfaces/.*/(receiver|transmitter)/data$");
QRegExp netTotalRegExp = QRegExp("network/interfaces/.*/(receiver|transmitter)/dataTotal$");
auto cpuRegExp = QRegularExpression("^cpu/cpu.*/usage$");
auto cpuclRegExp = QRegularExpression("^cpu/cpu.*/frequency$");
auto cpuTempRegExp = QRegularExpression("^cpu/cpu.*/temperature$");
auto hddrRegExp = QRegularExpression("^disk/.*/read$");
auto hddwRegExp = QRegularExpression("^disk/.*/write$");
auto mountFillRegExp = QRegularExpression("^disk/.*/usedPercent$");
auto mountFreeRegExp = QRegularExpression("^disk/.*/free$");
auto mountUsedRegExp = QRegularExpression("^disk/.*/used$");
auto netRegExp = QRegularExpression("^network/.*/(download|upload)$");
auto netTotalRegExp = QRegularExpression("^network/.*/(totalDownload|totalUpload)$");
if (_source == "battery/ac") {
if (_source == "extsysmon/battery/ac") {
// AC
m_map.insert(_source, "ac");
m_formatter["ac"] = AWKeysAggregator::FormatterType::ACFormat;
} else if (_source.startsWith("battery/")) {
} else if (_source.startsWith("extsysmon/battery/")) {
// battery stats
QString key = _source;
key.remove("battery/");
key.remove("extsysmon/battery/");
m_map.insert(_source, key);
m_formatter[key] = _source.contains("rate") ? AWKeysAggregator::FormatterType::Float
: AWKeysAggregator::FormatterType::IntegerThree;
} else if (_source == "cpu/system/TotalLoad") {
} else if (_source == "cpu/all/usage") {
// cpu
m_map.insert(_source, "cpu");
m_formatter["cpu"] = AWKeysAggregator::FormatterType::Float;
} else if (_source.contains(cpuRegExp)) {
// cpus
QString key = _source;
key.remove("cpu/").remove("/TotalLoad");
key.remove("cpu/").remove("/usage");
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Float;
} else if (_source == "cpu/system/AverageClock") {
} else if (_source == "cpu/all/averageFrequency") {
// cpucl
m_map.insert(_source, "cpucl");
m_formatter["cpucl"] = AWKeysAggregator::FormatterType::Integer;
} else if (_source.contains(cpuclRegExp)) {
// cpucls
QString key = _source;
key.remove("cpu/cpu").remove("/clock");
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("custom")) {
} else if (_source.startsWith("extsysmon/custom")) {
// custom
QString key = _source;
key.remove("custom/");
key.remove("extsysmon/custom/");
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source == "desktop/current/name") {
} else if (_source == "extsysmon/desktop/name") {
// current desktop name
m_map.insert(_source, "desktop");
m_formatter["desktop"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source == "desktop/current/number") {
} else if (_source == "extsysmon/desktop/number") {
// current desktop number
m_map.insert(_source, "ndesktop");
m_formatter["ndesktop"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source == "desktop/total/number") {
} else if (_source == "extsysmon/desktop/count") {
// desktop count
m_map.insert(_source, "tdesktops");
m_formatter["tdesktops"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source.contains(hddrRegExp)) {
// read speed
QString device = _source;
device.remove("/Rate/rblk");
device.remove("disk/").remove("/read");
int index = m_devices["disk"].indexOf(device);
if (index > -1) {
QString key = QString("hddr%1").arg(index);
@ -154,25 +156,25 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const QSt
} else if (_source.contains(hddwRegExp)) {
// write speed
QString device = _source;
device.remove("/Rate/wblk");
device.remove("disk/").remove("/write");
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/load") {
} else if (_source == "extsysmon/gpuload/load") {
// gpu load
m_map.insert(_source, "gpu");
m_formatter["gpu"] = AWKeysAggregator::FormatterType::Float;
} else if (_source == "gpu/temperature") {
} else if (_source == "extsysmon/gputemp/temperature") {
// gpu temperature
m_map.insert(_source, "gputemp");
m_formatter["gputemp"] = AWKeysAggregator::FormatterType::Temperature;
} else if (_source.contains(mountFillRegExp)) {
// fill level
QString device = _source;
device.remove("partitions").remove("/filllevel");
device.remove("disk/").remove("/usedPercent");
int index = m_devices["mount"].indexOf(device);
if (index > -1) {
QString key = QString("hdd%1").arg(index);
@ -185,7 +187,7 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const QSt
} else if (_source.contains(mountFreeRegExp)) {
// free space
QString device = _source;
device.remove("partitions").remove("/freespace");
device.remove("disk/").remove("/free");
int index = m_devices["mount"].indexOf(device);
if (index > -1) {
// mb
@ -200,7 +202,7 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const QSt
} else if (_source.contains(mountUsedRegExp)) {
// used
QString device = _source;
device.remove("partitions").remove("/usedspace");
device.remove("disk/").remove("/used");
int index = m_devices["mount"].indexOf(device);
if (index > -1) {
// mb
@ -212,24 +214,24 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const QSt
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::MemGBFormat;
}
} else if (_source.startsWith("hdd/temperature")) {
} else if (_source.startsWith("extsysmon/hdd/temperature")) {
// hdd temperature
QString device = _source;
device.remove("hdd/temperature");
device.remove("extsysmon/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/system/loadavg")) {
} else if (_source.startsWith("cpu/loadaverages/loadaverage")) {
// load average
QString time = _source;
time.remove("cpu/system/loadavg");
time.remove("cpu/loadaverages/loadaverage");
QString key = QString("la%1").arg(time);
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::FloatTwoSymbols;
} else if (_source == "mem/physical/application") {
} else if (_source == "memory/physical/application") {
// app memory
// mb
m_map.insert(_source, "memmb");
@ -237,7 +239,7 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const QSt
// gb
m_map.insert(_source, "memgb");
m_formatter["memgb"] = AWKeysAggregator::FormatterType::MemGBFormat;
} else if (_source == "mem/physical/free") {
} else if (_source == "memory/physical/free") {
// free memory
// mb
m_map.insert(_source, "memfreemb");
@ -245,7 +247,7 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const QSt
// gb
m_map.insert(_source, "memfreegb");
m_formatter["memfreegb"] = AWKeysAggregator::FormatterType::MemGBFormat;
} else if (_source == "mem/physical/used") {
} else if (_source == "memory/physical/used") {
// used memory
// mb
m_map.insert(_source, "memusedmb");
@ -253,23 +255,23 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const QSt
// gb
m_map.insert(_source, "memusedgb");
m_formatter["memusedgb"] = AWKeysAggregator::FormatterType::MemGBFormat;
} else if (_source == "network/current/name") {
} else if (_source == "extsysmon/network/device") {
// network device
m_map.insert(_source, "netdev");
m_formatter["netdev"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source == "network/current/ssid") {
} else if (_source == "extsysmon/network/ssid") {
// current ssid
m_map.insert(_source, "ssid");
m_formatter["ssid"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source.startsWith("network/response")) {
} else if (_source.startsWith("extsysmon/requests/response")) {
// network response
QString key = _source;
key.remove("network/");
key.remove("extsysmon/requests/");
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source.contains(netRegExp)) {
// network speed
QString type = _source.contains("receiver") ? "down" : "up";
QString type = _source.contains("download") ? "down" : "up";
int index = m_devices["net"].indexOf(_source.split('/')[2]);
if (index > -1) {
// kb
@ -287,7 +289,7 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const QSt
}
} else if (_source.contains(netTotalRegExp)) {
// network data total
QString type = _source.contains("receiver") ? "down" : "up";
QString type = _source.contains("download") ? "down" : "up";
int index = m_devices["net"].indexOf(_source.split('/')[2]);
if (index > -1) {
// kb
@ -299,37 +301,37 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const QSt
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::MemMBFormat;
}
} else if (_source.startsWith("upgrade")) {
} else if (_source.startsWith("extsysmon/upgrade")) {
// package manager
QString key = _source;
key.remove("upgrade/");
key.remove("extsysmon/upgrade/");
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::IntegerThree;
} else if (_source.startsWith("player")) {
} else if (_source.startsWith("extsysmon/player")) {
// player
QString key = _source;
key.remove("player/");
key.remove("extsysmon/player/");
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source == "ps/running/count") {
} else if (_source == "extsysmon/ps/running") {
// running processes count
m_map.insert(_source, "pscount");
m_formatter["pscount"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source == "ps/running/list") {
} else if (_source == "extsysmon/ps/list") {
// list of running processes
m_map.insert(_source, "ps");
m_formatter["ps"] = AWKeysAggregator::FormatterType::List;
} else if (_source == "ps/total/count") {
} else if (_source == "extsysmon/ps/count") {
// total processes count
m_map.insert(_source, "pstot");
m_formatter["pstot"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source.startsWith("quotes")) {
} else if (_source.startsWith("extsysmon/quotes")) {
// quotes
QString key = _source;
key.remove("quotes/");
key.remove("extsysmon/quotes/");
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Quotes;
} else if (_source == "mem/swap/free") {
} else if (_source == "memory/swap/free") {
// free swap
// mb
m_map.insert(_source, "swapfreemb");
@ -337,7 +339,7 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const QSt
// gb
m_map.insert(_source, "swapfreegb");
m_formatter["swapfreegb"] = AWKeysAggregator::FormatterType::MemGBFormat;
} else if (_source == "mem/swap/used") {
} else if (_source == "memory/swap/used") {
// used swap
// mb
m_map.insert(_source, "swapmb");
@ -345,19 +347,20 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const QSt
// gb
m_map.insert(_source, "swapgb");
m_formatter["swapgb"] = AWKeysAggregator::FormatterType::MemGBFormat;
} else if (_source.startsWith("lmsensors/")) {
} else if (_source.startsWith("lmsensors/") || _source.contains(cpuTempRegExp)
|| _source == "cpu/all/averageTemperature") {
// temperature
int index = m_devices["temp"].indexOf(_source);
auto index = m_devices["temp"].indexOf(_source);
// HACK on DE initialization there are no units key
if (_units.isEmpty())
if (_units == KSysGuard::UnitInvalid)
return QStringList({QString("temp%1").arg(index)});
if (index > -1) {
QString key = QString("temp%1").arg(index);
m_map.insert(_source, key);
m_formatter[key] = _units == "°C" ? AWKeysAggregator::FormatterType::Temperature
: AWKeysAggregator::FormatterType::Integer;
m_formatter[key] = _units == KSysGuard::UnitCelsius ? AWKeysAggregator::FormatterType::Temperature
: AWKeysAggregator::FormatterType::Integer;
}
} else if (_source == "Local") {
} else if (_source == "extsysmon/time/now") {
// time
m_map.insert(_source, "time");
m_formatter["time"] = AWKeysAggregator::FormatterType::Time;
@ -376,40 +379,40 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const QSt
// timestamp
m_map.insert(_source, "tstime");
m_formatter["tstime"] = AWKeysAggregator::FormatterType::Timestamp;
} else if (_source == "system/brightness") {
} else if (_source == "extsysmon/system/brightness") {
m_map.insert(_source, "brightness");
m_formatter["brightness"] = AWKeysAggregator::FormatterType::IntegerThree;
} else if (_source == "system/volume") {
} else if (_source == "extsysmon/system/volume") {
m_map.insert(_source, "volume");
m_formatter["volume"] = AWKeysAggregator::FormatterType::IntegerThree;
} else if (_source == "system/uptime") {
} else if (_source == "os/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("weather/temperature")) {
} else if (_source.startsWith("extsysmon/weather/temperature")) {
// temperature
QString key = _source;
key.remove("weather/");
key.remove("extsysmon/weather/");
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Temperature;
} else if (_source.startsWith("weather/")) {
} else if (_source.startsWith("extsysmon/weather/")) {
// other weather
QString key = _source;
key.remove("weather/");
key.remove("extsysmon/weather/");
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source.startsWith("load/load")) {
} else if (_source.startsWith("extsysmon/load/load")) {
// load source
QString key = _source;
key.remove("load/");
key.remove("extsysmon/load/");
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Temperature;
}
QStringList foundKeys = keysFromSource(_source);
auto foundKeys = keysFromSource(_source);
// rewrite formatters for custom ones
QStringList customFormattersKeys;
@ -424,7 +427,7 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const QSt
// drop key from dictionary if no one user requested key required it
qCInfo(LOG_AW) << "Looking for keys" << foundKeys << "in" << _keys;
bool required = _keys.isEmpty() || std::any_of(foundKeys.cbegin(), foundKeys.cend(), [&_keys](const QString &key) {
auto required = _keys.isEmpty() || std::any_of(foundKeys.cbegin(), foundKeys.cend(), [&_keys](const QString &key) {
return _keys.contains(key);
});
if (!required) {

View File

@ -19,6 +19,8 @@
#ifndef AWDATAENGINEMAPPER_H
#define AWDATAENGINEMAPPER_H
#include <ksysguard/formatter/Unit.h>
#include <QMultiHash>
#include <QObject>
@ -38,7 +40,7 @@ public:
[[nodiscard]] AWKeysAggregator::FormatterType formatter(const QString &_key) const;
[[nodiscard]] QStringList keysFromSource(const QString &_source) const;
// set methods
QStringList registerSource(const QString &_source, const QString &_units, const QStringList &_keys);
QStringList registerSource(const QString &_source, const KSysGuard::Unit _units, const QStringList &_keys);
void setDevices(const QHash<QString, QStringList> &_devices);
private:

View File

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

View File

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

View File

@ -20,6 +20,7 @@
#include <QDir>
#include <QNetworkInterface>
#include <QRegularExpression>
#include <QSettings>
#include <QStandardPaths>
@ -42,7 +43,7 @@ bool AWKeyCache::addKeyToCache(const QString &_type, const QString &_key)
if (_type == "hdd") {
QStringList allDevices = QDir("/dev").entryList(QDir::System, QDir::Name);
QStringList devices = allDevices.filter(QRegExp("^[hms]d[a-z]$"));
QStringList devices = allDevices.filter(QRegularExpression("^[hms]d[a-z]$"));
for (auto &dev : devices) {
QString device = QString("/dev/%1").arg(dev);
if (cachedValues.contains(device))
@ -93,7 +94,7 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, const QStringL
// insert depending keys, refer to AWKeys::calculateValues()
// hddtotmb*
for (auto &key : _allKeys.filter(QRegExp("^hddtotmb"))) {
for (auto &key : _allKeys.filter(QRegularExpression("^hddtotmb"))) {
if (!used.contains(key))
continue;
key.remove("hddtotmb");
@ -101,7 +102,7 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, const QStringL
used << QString("hddfreemb%1").arg(index) << QString("hddmb%1").arg(index);
}
// hddtotgb*
for (auto &key : _allKeys.filter(QRegExp("^hddtotgb"))) {
for (auto &key : _allKeys.filter(QRegularExpression("^hddtotgb"))) {
if (!used.contains(key))
continue;
key.remove("hddtotgb");
@ -138,7 +139,7 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, const QStringL
for (auto &key : netKeys) {
if (!used.contains(key))
continue;
QStringList filt = _allKeys.filter(QRegExp(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;
}

View File

@ -18,7 +18,7 @@
#include "awkeyoperations.h"
#include <QDir>
#include <QRegExp>
#include <QRegularExpression>
#include <QThread>
#include "awcustomkeyshelper.h"
@ -206,7 +206,7 @@ QString AWKeyOperations::infoByKey(const QString &_key) const
qCDebug(LOG_AW) << "Requested key" << _key;
QString stripped = _key;
stripped.remove(QRegExp("\\d+"));
stripped.remove(QRegularExpression("\\d+"));
QString output;
if (_key.startsWith("bar")) {
@ -217,31 +217,31 @@ QString AWKeyOperations::infoByKey(const QString &_key) const
AbstractExtItem *item = m_extScripts->itemByTag(_key, stripped);
if (item)
output = item->uniq();
} else if (_key.contains(QRegExp("^hdd[rw]"))) {
} else if (_key.contains(QRegularExpression("^hdd[rw]"))) {
QString index = _key;
index.remove(QRegExp("hdd[rw]"));
index.remove(QRegularExpression("hdd[rw]"));
output = m_devices["disk"][index.toInt()];
} else if (_key.contains(QRegExp("^hdd([0-9]|mb|gb|freemb|freegb|totmb|totgb)"))) {
} else if (_key.contains(QRegularExpression("^hdd([0-9]|mb|gb|freemb|freegb|totmb|totgb)"))) {
QString index = _key;
index.remove(QRegExp("^hdd(|mb|gb|freemb|freegb|totmb|totgb)"));
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(QRegExp("^(down|up)[0-9]"))) {
} else if (_key.contains(QRegularExpression("^(down|up)[0-9]"))) {
QString index = _key;
index.remove(QRegExp("^(down|up)"));
index.remove(QRegularExpression("^(down|up)"));
output = m_devices["net"][index.toInt()];
} else if (_key.startsWith("pkgcount")) {
AbstractExtItem *item = m_extUpgrade->itemByTag(_key, stripped);
if (item)
output = item->uniq();
} else if (_key.contains(QRegExp("(^|perc)(ask|bid|price)(chg|)"))) {
} else if (_key.contains(QRegularExpression("(^|perc)(ask|bid|price)(chg|)"))) {
AbstractExtItem *item = m_extQuotes->itemByTag(_key, stripped);
if (item)
output = item->uniq();
} else if (_key.contains(QRegExp("(weather|weatherId|humidity|pressure|temperature)"))) {
} else if (_key.contains(QRegularExpression("(weather|weatherId|humidity|pressure|temperature)"))) {
AbstractExtItem *item = m_extWeather->itemByTag(_key, stripped);
if (item)
output = item->uniq();
@ -280,7 +280,7 @@ void AWKeyOperations::editItem(const QString &_type)
qCDebug(LOG_AW) << "Item type" << _type;
if (_type == "graphicalitem") {
QStringList keys = dictKeys().filter(QRegExp("^(cpu(?!cl).*|gpu$|mem$|swap$|hdd[0-9].*|bat.*)"));
QStringList keys = dictKeys().filter(QRegularExpression("^(cpu(?!cl).*|gpu$|mem$|swap$|hdd[0-9].*|bat.*)"));
keys.sort();
m_graphicalItems->setConfigArgs(keys);
return m_graphicalItems->editItems();
@ -302,18 +302,20 @@ void AWKeyOperations::addDevice(const QString &_source)
{
qCDebug(LOG_AW) << "Source" << _source;
QRegExp diskRegexp = QRegExp("disk/(?:md|sd|hd)[a-z|0-9]_.*/Rate/(?:rblk)");
QRegExp mountRegexp = QRegExp("partitions/.*/filllevel");
auto diskRegexp = QRegularExpression("disk/.*/read");
auto mountRegexp = QRegularExpression("disk/.*/usedPercent");
auto cpuTempRegExp = QRegularExpression("^cpu/cpu.*/temperature$");
if (_source.contains(diskRegexp)) {
QString device = _source;
device.remove("/Rate/rblk");
auto device = _source;
device.remove("disk/").remove("/read");
addKeyToCache("disk", device);
} else if (_source.contains(mountRegexp)) {
QString device = _source;
device.remove("partitions").remove("/filllevel");
auto device = _source;
device.remove("disk/").remove("/usedPercent");
addKeyToCache("mount", device);
} else if (_source.startsWith("lmsensors")) {
} else if (_source.startsWith("lmsensors") || _source.contains(cpuTempRegExp)
|| _source == "cpu/all/averageTemperature") {
addKeyToCache("temp", _source);
}
}

View File

@ -56,16 +56,17 @@ AWKeys::AWKeys(QObject *_parent)
createDBusInterface();
// update key data if required
connect(m_keyOperator, SIGNAL(updateKeys(const QStringList &)), this, SLOT(reinitKeys(const QStringList &)));
connect(m_timer, SIGNAL(timeout()), this, SLOT(updateTextData()));
connect(m_keyOperator, &AWKeyOperations::updateKeys, this, &AWKeys::reinitKeys);
connect(m_timer, &QTimer::timeout, this, &AWKeys::updateTextData);
// transfer signal from AWDataAggregator object to QML ui
connect(m_dataAggregator, SIGNAL(toolTipPainted(const QString &)), this,
SIGNAL(needToolTipToBeUpdated(const QString &)));
connect(this, SIGNAL(dropSourceFromDataengine(const QString &)), m_dataEngineAggregator,
SLOT(dropSource(const QString &)));
connect(m_dataAggregator, &AWDataAggregator::toolTipPainted,
[this](const QString &_tooltip) { emit(needToolTipToBeUpdated(_tooltip)); });
connect(this, &AWKeys::dropSourceFromDataengine, m_dataEngineAggregator, &AWDataEngineAggregator::dropSource);
connect(m_dataEngineAggregator, &AWDataEngineAggregator::dataUpdated, this, &AWKeys::dataUpdated);
// transfer signal from dataengine to update source list
connect(m_dataEngineAggregator, SIGNAL(deviceAdded(const QString &)), m_keyOperator,
SLOT(addDevice(const QString &)));
connect(m_dataEngineAggregator, &AWDataEngineAggregator::deviceAdded, m_keyOperator, &AWKeyOperations::addDevice);
}
@ -102,7 +103,7 @@ void AWKeys::initKeys(const QString &_currentPattern, const int _interval, const
m_aggregator->initFormatters();
m_keyOperator->setPattern(_currentPattern);
m_keyOperator->updateCache();
m_dataEngineAggregator->reconnectSources(_interval);
m_dataEngineAggregator->connectSources();
// timer
m_timer->setInterval(_interval);
@ -148,7 +149,7 @@ QStringList AWKeys::dictKeys(const bool _sorted, const QString &_regexp) const
if (_sorted)
allKeys.sort();
return allKeys.filter(QRegExp(_regexp));
return allKeys.filter(QRegularExpression(_regexp));
}
@ -185,9 +186,9 @@ QString AWKeys::valueByKey(const QString &_key) const
{
qCDebug(LOG_AW) << "Requested value for key" << _key;
QString trueKey = _key.startsWith("bar") ? m_keyOperator->infoByKey(_key) : _key;
auto realKey = _key.startsWith("bar") ? m_keyOperator->infoByKey(_key) : _key;
return m_aggregator->formatter(m_values[trueKey], trueKey, true);
return m_aggregator->formatter(m_values[realKey], realKey, true);
}
@ -199,10 +200,15 @@ void AWKeys::editItem(const QString &_type)
}
void AWKeys::dataUpdated(const QString &_sourceName, const Plasma::DataEngine::Data &_data)
void AWKeys::dataUpdated(const QHash<QString, KSysGuard::SensorInfo> &_sensors, const KSysGuard::SensorDataList &_data)
{
// run concurrent data update
QtConcurrent::run(m_threadPool, this, &AWKeys::setDataBySource, _sourceName, _data);
for (auto &single : _data) {
if (_sensors.contains(single.sensorProperty)) {
setDataBySource(single.sensorProperty, _sensors.value(single.sensorProperty), single);
}
// TODO use QtConcurrent::map or something like that
// QtConcurrent::run(m_threadPool, this, &AWKeys::setDataBySource, "ss", sensor);
}
}
@ -239,7 +245,7 @@ void AWKeys::updateTextData()
// do not do it in parallel to avoid race condition
m_mutex.lock();
calculateValues();
QString text = parsePattern(m_keyOperator->pattern());
auto text = parsePattern(m_keyOperator->pattern());
// update tooltip values under lock
m_dataAggregator->dataUpdate(m_values);
m_mutex.unlock();
@ -256,17 +262,17 @@ void AWKeys::calculateValues()
QStringList mountDevices = m_keyOperator->devices("mount");
for (auto &device : mountDevices) {
int index = mountDevices.indexOf(device);
m_values[QString("hddtotmb%1").arg(index)]
= m_values[QString("hddfreemb%1").arg(index)].toFloat() + m_values[QString("hddmb%1").arg(index)].toFloat();
m_values[QString("hddtotgb%1").arg(index)]
= m_values[QString("hddfreegb%1").arg(index)].toFloat() + m_values[QString("hddgb%1").arg(index)].toFloat();
m_values[QString("hddtotmb%1").arg(index)] = m_values[QString("hddfreemb%1").arg(index)].toDouble()
+ m_values[QString("hddmb%1").arg(index)].toDouble();
m_values[QString("hddtotgb%1").arg(index)] = m_values[QString("hddfreegb%1").arg(index)].toDouble()
+ m_values[QString("hddgb%1").arg(index)].toDouble();
}
// memtot*
m_values["memtotmb"] = m_values["memusedmb"].toInt() + m_values["memfreemb"].toInt();
m_values["memtotgb"] = m_values["memusedgb"].toFloat() + m_values["memfreegb"].toFloat();
m_values["memtotmb"] = m_values["memusedmb"].toLongLong() + m_values["memfreemb"].toLongLong();
m_values["memtotgb"] = m_values["memusedgb"].toDouble() + m_values["memfreegb"].toDouble();
// mem
m_values["mem"] = 100.0f * m_values["memmb"].toFloat() / m_values["memtotmb"].toFloat();
m_values["mem"] = 100.0f * m_values["memmb"].toDouble() / m_values["memtotmb"].toDouble();
// up, down, upkb, downkb, upunits, downunits
int netIndex = m_keyOperator->devices("net").indexOf(m_values["netdev"].toString());
@ -282,10 +288,10 @@ void AWKeys::calculateValues()
m_values["upunits"] = m_values[QString("upunits%1").arg(netIndex)];
// swaptot*
m_values["swaptotmb"] = m_values["swapmb"].toInt() + m_values["swapfreemb"].toInt();
m_values["swaptotgb"] = m_values["swapgb"].toFloat() + m_values["swapfreegb"].toFloat();
m_values["swaptotmb"] = m_values["swapmb"].toLongLong() + m_values["swapfreemb"].toLongLong();
m_values["swaptotgb"] = m_values["swapgb"].toDouble() + m_values["swapfreegb"].toDouble();
// swap
m_values["swap"] = 100.0f * m_values["swapmb"].toFloat() / m_values["swaptotmb"].toFloat();
m_values["swap"] = 100.0f * m_values["swapmb"].toDouble() / m_values["swaptotmb"].toDouble();
// user defined keys
for (auto &key : m_keyOperator->userKeys())
@ -323,7 +329,7 @@ void AWKeys::createDBusInterface()
QString AWKeys::parsePattern(QString _pattern) const
{
// screen sign
_pattern.replace("$$", QString(0x1d));
_pattern.replace("$$", QChar(0x1d));
// lambdas
for (auto &key : m_foundLambdas)
@ -343,7 +349,7 @@ QString AWKeys::parsePattern(QString _pattern) const
}
// prepare strings
_pattern.replace(QString(0x1d), "$");
_pattern.replace(QChar(0x1d), "$");
if (m_wrapNewLines)
_pattern.replace("\n", "<br>");
@ -351,25 +357,23 @@ QString AWKeys::parsePattern(QString _pattern) const
}
void AWKeys::setDataBySource(const QString &_sourceName, const QVariantMap &_data)
void AWKeys::setDataBySource(const QString &_source, const KSysGuard::SensorInfo &_sensor,
const KSysGuard::SensorData &_data)
{
qCDebug(LOG_AW) << "Source" << _sourceName << "with data" << _data;
qCDebug(LOG_AW) << "Source" << _source << _sensor.name << "with data" << _data.payload;
// first list init
QStringList tags = m_aggregator->keysFromSource(_sourceName);
auto tags = m_aggregator->keysFromSource(_source);
if (tags.isEmpty())
tags = m_aggregator->registerSource(_sourceName, _data["units"].toString(), m_requiredKeys);
tags = m_aggregator->registerSource(_source, _sensor.unit, m_requiredKeys);
// update data or drop source if there are no matches and exit
if (tags.isEmpty()) {
qCInfo(LOG_AW) << "Source" << _sourceName << "not found";
return emit(dropSourceFromDataengine(_sourceName));
qCInfo(LOG_AW) << "Sensor" << _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, &_sourceName](const QString &tag) {
m_values[tag] = _sourceName == "Local" ? _data["DateTime"] : _data["value"];
});
std::for_each(tags.cbegin(), tags.cend(), [this, &_data](const QString &tag) { m_values[tag] = _data.payload; });
m_mutex.unlock();
}

View File

@ -19,11 +19,11 @@
#ifndef AWKEYS_H
#define AWKEYS_H
#include <Plasma/DataEngine>
#include <QMutex>
#include <QObject>
#include <ksysguard/systemstats/SensorInfo.h>
class AWDataAggregator;
class AWDataEngineAggregator;
@ -56,9 +56,7 @@ public:
Q_INVOKABLE void editItem(const QString &_type);
public slots:
void dataUpdated(const QString &_sourceName, const Plasma::DataEngine::Data &_data);
// dummy method required by DataEngine connections
static void modelChanged(const QString &, QAbstractItemModel *){};
void dataUpdated(const QHash<QString, KSysGuard::SensorInfo> &_sensors, const KSysGuard::SensorDataList &_data);
signals:
void dropSourceFromDataengine(const QString &_source);
@ -74,7 +72,8 @@ private:
void calculateValues();
void createDBusInterface();
[[nodiscard]] QString parsePattern(QString _pattern) const;
void setDataBySource(const QString &_sourceName, const QVariantMap &_data);
void setDataBySource(const QString &_source, const KSysGuard::SensorInfo &_sensor,
const KSysGuard::SensorData &_data);
// objects
AWDataAggregator *m_dataAggregator = nullptr;
AWDataEngineAggregator *m_dataEngineAggregator = nullptr;

View File

@ -64,19 +64,19 @@ QString AWKeysAggregator::formatter(const QVariant &_data, const QString &_key,
// case block
switch (m_mapper->formatter(_key)) {
case FormatterType::Float:
output = QString("%1").arg(_data.toFloat(), 5, 'f', 1);
output = QString("%1").arg(_data.toDouble(), 5, 'f', 1);
break;
case FormatterType::FloatTwoSymbols:
output = QString("%1").arg(_data.toFloat(), 5, 'f', 2);
output = QString("%1").arg(_data.toDouble(), 5, 'f', 2);
break;
case FormatterType::Integer:
output = QString("%1").arg(_data.toFloat(), 4, 'f', 0);
output = QString("%1").arg(_data.toDouble(), 4, 'f', 0);
break;
case FormatterType::IntegerFive:
output = QString("%1").arg(_data.toFloat(), 5, 'f', 0);
output = QString("%1").arg(_data.toDouble(), 5, 'f', 0);
break;
case FormatterType::IntegerThree:
output = QString("%1").arg(_data.toFloat(), 3, 'f', 0);
output = QString("%1").arg(_data.toDouble(), 3, 'f', 0);
break;
case FormatterType::List:
output = _data.toStringList().join(',');
@ -85,10 +85,10 @@ QString AWKeysAggregator::formatter(const QVariant &_data, const QString &_key,
output = _data.toBool() ? m_acOnline : m_acOffline;
break;
case FormatterType::MemGBFormat:
output = QString("%1").arg(_data.toFloat() / (1024.0 * 1024.0), 5, 'f', 1);
output = QString("%1").arg(_data.toDouble() / (1024.0 * 1024.0), 5, 'f', 1);
break;
case FormatterType::MemMBFormat:
output = QString("%1").arg(_data.toFloat() / 1024.0, 5, 'f', 0);
output = QString("%1").arg(_data.toDouble() / 1024.0, 5, 'f', 0);
break;
case FormatterType::NetSmartFormat:
output = [](const float value) {
@ -96,10 +96,10 @@ QString AWKeysAggregator::formatter(const QVariant &_data, const QString &_key,
return QString("%1").arg(value / 1024.0, 4, 'f', 1);
else
return QString("%1").arg(value, 4, 'f', 0);
}(_data.toFloat());
}(_data.toDouble());
break;
case FormatterType::NetSmartUnits:
if (_data.toFloat() > 1024.0)
if (_data.toDouble() > 1024.0)
output = m_translate ? i18n("MB/s") : "MB/s";
else
output = m_translate ? i18n("KB/s") : "KB/s";
@ -110,29 +110,29 @@ QString AWKeysAggregator::formatter(const QVariant &_data, const QString &_key,
output = output.rightJustified(8, QLatin1Char(' '), true);
break;
case FormatterType::Temperature:
output = QString("%1").arg(temperature(_data.toFloat()), 5, 'f', 1);
output = QString("%1").arg(temperature(_data.toDouble()), 5, 'f', 1);
break;
case FormatterType::Time:
output = _data.toDateTime().toString();
output = QDateTime::fromSecsSinceEpoch(_data.toLongLong()).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));
}(_data.toDateTime());
}(QDateTime::fromSecsSinceEpoch(_data.toLongLong()));
break;
case FormatterType::TimeISO:
output = _data.toDateTime().toString(Qt::ISODate);
output = QDateTime::fromSecsSinceEpoch(_data.toLongLong()).toString(Qt::ISODate);
break;
case FormatterType::TimeLong:
output = loc.toString(_data.toDateTime(), QLocale::LongFormat);
output = loc.toString(QDateTime::fromSecsSinceEpoch(_data.toLongLong()), QLocale::LongFormat);
break;
case FormatterType::TimeShort:
output = loc.toString(_data.toDateTime(), QLocale::ShortFormat);
output = loc.toString(QDateTime::fromSecsSinceEpoch(_data.toLongLong()), QLocale::ShortFormat);
break;
case FormatterType::Timestamp:
output = QString("%1").arg(_data.toDateTime().toMSecsSinceEpoch() / 1000.0, 10, 'f', 0);
output = _data.toString();
break;
case FormatterType::Uptime:
case FormatterType::UptimeCustom:
@ -150,7 +150,7 @@ QString AWKeysAggregator::formatter(const QVariant &_data, const QString &_key,
source.replace("$m", QString("%1").arg(minutes));
return source;
}(m_mapper->formatter(_key) == FormatterType::Uptime ? "$ddd$hhh$mmm" : m_customUptime,
static_cast<int>(_data.toFloat()));
static_cast<int>(_data.toDouble()));
break;
case FormatterType::NoFormat:
output = _data.toString();
@ -234,7 +234,8 @@ void AWKeysAggregator::setTranslate(const bool _translate)
}
QStringList AWKeysAggregator::registerSource(const QString &_source, const QString &_units, const QStringList &_keys)
QStringList AWKeysAggregator::registerSource(const QString &_source, const KSysGuard::Unit &_units,
const QStringList &_keys)
{
qCDebug(LOG_AW) << "Source" << _source << "with units" << _units;

View File

@ -19,6 +19,8 @@
#ifndef AWKEYSAGGREGATOR_H
#define AWKEYSAGGREGATOR_H
#include <ksysguard/formatter/Unit.h>
#include <QHash>
#include <QObject>
@ -81,7 +83,7 @@ public:
void setTranslate(bool _translate);
public slots:
QStringList registerSource(const QString &_source, const QString &_units, const QStringList &_keys);
QStringList registerSource(const QString &_source, const KSysGuard::Unit &_units, const QStringList &_keys);
private:
[[nodiscard]] float temperature(float temp) const;

View File

@ -105,9 +105,9 @@ QList<AWPatternFunctions::AWFunction> AWPatternFunctions::findFunctionCalls(cons
metadata.args = QStringList();
} else {
// replace '$,' to 0x1d
argsString.replace("$,", QString(0x1d));
argsString.replace("$,", QChar(0x1d));
QStringList args = argsString.split(',');
std::for_each(args.begin(), args.end(), [](QString &arg) { arg.replace(QString(0x1d), ","); });
std::for_each(args.begin(), args.end(), [](QString &arg) { arg.replace(QChar(0x1d), ","); });
metadata.args = args;
}
// other variables
@ -130,7 +130,7 @@ QString AWPatternFunctions::insertAllKeys(QString _code, const QStringList &_key
QList<AWPatternFunctions::AWFunction> found = AWPatternFunctions::findFunctionCalls("aw_all", _code);
for (auto &function : found) {
QString separator = function.args.isEmpty() ? "," : function.args.at(0);
QStringList required = _keys.filter(QRegExp(function.body));
QStringList required = _keys.filter(QRegularExpression(function.body));
std::for_each(required.begin(), required.end(), [](QString &value) { value = QString("%1: $%1").arg(value); });
_code.replace(function.what, required.join(separator));
@ -146,7 +146,7 @@ QString AWPatternFunctions::insertKeyCount(QString _code, const QStringList &_ke
QList<AWPatternFunctions::AWFunction> found = AWPatternFunctions::findFunctionCalls("aw_count", _code);
for (auto &function : found) {
int count = _keys.filter(QRegExp(function.body)).count();
int count = _keys.filter(QRegularExpression(function.body)).count();
_code.replace(function.what, QString::number(count));
}
@ -162,7 +162,7 @@ QString AWPatternFunctions::insertKeyNames(QString _code, const QStringList &_ke
QList<AWPatternFunctions::AWFunction> found = AWPatternFunctions::findFunctionCalls("aw_names", _code);
for (auto &function : found) {
QString separator = function.args.isEmpty() ? "," : function.args.at(0);
QStringList required = _keys.filter(QRegExp(function.body));
QStringList required = _keys.filter(QRegularExpression(function.body));
_code.replace(function.what, required.join(separator));
}
@ -178,7 +178,7 @@ QString AWPatternFunctions::insertKeys(QString _code, const QStringList &_keys)
QList<AWPatternFunctions::AWFunction> found = AWPatternFunctions::findFunctionCalls("aw_keys", _code);
for (auto &function : found) {
QString separator = function.args.isEmpty() ? "," : function.args.at(0);
QStringList required = _keys.filter(QRegExp(function.body));
QStringList required = _keys.filter(QRegularExpression(function.body));
std::for_each(required.begin(), required.end(), [](QString &value) { value = QString("$%1").arg(value); });
_code.replace(function.what, required.join(separator));

View File

@ -24,6 +24,7 @@
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QSettings>
#include <QStandardPaths>
#include "awdebug.h"

View File

@ -7,7 +7,7 @@ include_directories(
${CMAKE_BINARY_DIR}
${PROJECT_TRDPARTY_DIR}
${Qt_INCLUDE}
${Kf5_INCLUDE}
${Kf6_INCLUDE}
)
file(GLOB SUBPROJECT_SOURCE *.cpp ${PROJECT_TRDPARTY_DIR}/qreplytimeout/*.cpp ${CMAKE_SOURCE_DIR}/*.cpp)
@ -28,18 +28,18 @@ file(RELATIVE_PATH SUBPROJECT_WEATHER_JSON ${CMAKE_SOURCE_DIR} ${SUBPROJECT_WEAT
# prepare
configure_file(${SUBPROJECT_WEATHER_JSON_IN} ${CMAKE_CURRENT_BINARY_DIR}/${SUBPROJECT_WEATHER_JSON})
qt5_wrap_ui(SUBPROJECT_UI_HEADER ${SUBPROJECT_UI})
qt6_wrap_ui(SUBPROJECT_UI_HEADER ${SUBPROJECT_UI})
add_library(${SUBPROJECT} STATIC ${SUBPROJECT_SOURCE} ${SUBPROJECT_HEADER} ${SUBPROJECT_UI_HEADER})
target_link_libraries(${SUBPROJECT} ${Qt_LIBRARIES} ${Kf5_LIBRARIES})
target_link_libraries(${SUBPROJECT} ${Qt_LIBRARIES} ${Kf6_LIBRARIES})
# install
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 ${CONFIG_INSTALL_DIR})
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${SUBPROJECT_WEATHER_JSON} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME}/weather)
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)

View File

@ -27,8 +27,8 @@
#include "qcronscheduler.h"
AbstractExtItem::AbstractExtItem(QWidget *_parent, const QString &_filePath)
: QDialog(_parent)
AbstractExtItem::AbstractExtItem(QObject *_parent, const QString &_filePath)
: QObject(_parent)
, m_fileName(_filePath)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
@ -97,15 +97,13 @@ void AbstractExtItem::startTimer()
QString AbstractExtItem::writtableConfig() const
{
QString path = m_fileName;
QString name = QFileInfo(path).fileName();
path.remove(path.count() - name.count() - 1, name.count() + 1);
QString dir = QFileInfo(path).fileName();
auto path = m_fileName;
auto name = QFileInfo(path).fileName();
path.remove(path.length() - name.length() - 1, name.length() + 1);
auto dir = QFileInfo(path).fileName();
return QString("%1/awesomewidgets/%2/%3")
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation))
.arg(dir)
.arg(name);
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation), dir, name);
}
@ -269,8 +267,8 @@ void AbstractExtItem::deinitSocket()
m_socket->close();
QLocalServer::removeServer(socket());
delete m_socket;
disconnect(m_socket, SIGNAL(newConnection()), this, SLOT(newConnectionReceived()));
delete m_socket;
}

View File

@ -18,14 +18,14 @@
#ifndef ABSTRACTEXTITEM_H
#define ABSTRACTEXTITEM_H
#include <QDialog>
#include <QVariant>
class QCronScheduler;
class QLocalServer;
class QWidget;
class AbstractExtItem : public QDialog
class AbstractExtItem : public QObject
{
Q_OBJECT
Q_PROPERTY(bool active READ isActive WRITE setActive)
@ -40,7 +40,7 @@ class AbstractExtItem : public QDialog
Q_PROPERTY(QString uniq READ uniq)
public:
explicit AbstractExtItem(QWidget *_parent = nullptr, const QString &_filePath = "");
explicit AbstractExtItem(QObject *_parent = nullptr, const QString &_filePath = "");
~AbstractExtItem() override;
virtual void bumpApi(int _newVer);
virtual AbstractExtItem *copy(const QString &_fileName, int _number) = 0;
@ -78,7 +78,7 @@ public slots:
virtual void initSocket();
virtual void readConfiguration();
virtual QVariantHash run() = 0;
virtual int showConfiguration(const QVariant &_args) = 0;
virtual int showConfiguration(QWidget *_parent, const QVariant &_args) = 0;
[[nodiscard]] virtual bool tryDelete() const;
virtual void writeConfiguration() const;
@ -89,7 +89,8 @@ private:
QCronScheduler *m_scheduler = nullptr;
QString m_fileName = "/dev/null";
int m_times = 0;
virtual void translate() = 0;
// FIXME find a better way to do it
virtual void translate(void *_ui) = 0;
// properties
int m_apiVersion = 0;
bool m_active = true;

View File

@ -26,65 +26,45 @@
#include <utility>
AbstractExtItemAggregator::AbstractExtItemAggregator(QWidget *_parent, QString _type)
: QDialog(_parent)
, ui(new Ui::AbstractExtItemAggregator)
AbstractExtItemAggregator::AbstractExtItemAggregator(QObject *_parent, QString _type)
: QObject(_parent)
, m_type(std::move(_type))
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
// create directory at $HOME
QString localDir = QString("%1/awesomewidgets/%2")
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation))
.arg(type());
auto localDir = QString("%1/awesomewidgets/%2")
.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 *)));
}
AbstractExtItemAggregator::~AbstractExtItemAggregator()
void AbstractExtItemAggregator::copyItem(QListWidget *_widget)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
delete ui;
}
void AbstractExtItemAggregator::copyItem()
{
AbstractExtItem *source = itemFromWidget();
QString fileName = getName();
int number = uniqNumber();
QString dir = QString("%1/awesomewidgets/%2")
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation))
.arg(m_type);
auto source = itemFromWidget(_widget);
auto fileName = getName();
auto number = uniqNumber();
auto dir = QString("%1/awesomewidgets/%2")
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation), m_type);
if ((!source) || (fileName.isEmpty())) {
qCWarning(LOG_LIB) << "Nothing to copy";
return;
}
QString filePath = QString("%1/%2").arg(dir).arg(fileName);
auto filePath = QString("%1/%2").arg(dir, fileName);
AbstractExtItem *newItem = source->copy(filePath, number);
if (newItem->showConfiguration(configArgs()) == 1) {
auto newItem = source->copy(filePath, number);
if (newItem->showConfiguration(nullptr, configArgs()) == 1) {
initItems();
repaintList();
repaintList(_widget);
}
}
void AbstractExtItemAggregator::deleteItem()
void AbstractExtItemAggregator::deleteItem(QListWidget *_widget)
{
AbstractExtItem *source = itemFromWidget();
auto source = itemFromWidget(_widget);
if (!source) {
qCWarning(LOG_LIB) << "Nothing to delete";
return;
@ -92,30 +72,63 @@ void AbstractExtItemAggregator::deleteItem()
if (source->tryDelete()) {
initItems();
repaintList();
repaintList(_widget);
}
}
void AbstractExtItemAggregator::editItem()
void AbstractExtItemAggregator::editItem(QListWidget *_widget)
{
AbstractExtItem *source = itemFromWidget();
auto source = itemFromWidget(_widget);
if (!source) {
qCWarning(LOG_LIB) << "Nothing to edit";
return;
}
if (source->showConfiguration(configArgs()) == 1) {
if (source->showConfiguration(nullptr, configArgs()) == 1) {
initItems();
repaintList();
repaintList(_widget);
}
}
int AbstractExtItemAggregator::exec()
{
auto dialog = new QDialog();
auto ui = new Ui::AbstractExtItemAggregator();
ui->setupUi(dialog);
auto copyButton = ui->buttonBox->addButton(i18n("Copy"), QDialogButtonBox::ActionRole);
auto createButton = ui->buttonBox->addButton(i18n("Create"), QDialogButtonBox::ActionRole);
auto deleteButton = ui->buttonBox->addButton(i18n("Remove"), QDialogButtonBox::ActionRole);
connect(ui->buttonBox, &QDialogButtonBox::clicked, [&](QAbstractButton *_button) {
if (dynamic_cast<QPushButton *>(_button) == copyButton)
copyItem(ui->listWidget);
else if (dynamic_cast<QPushButton *>(_button) == createButton)
doCreateItem(ui->listWidget);
else if (dynamic_cast<QPushButton *>(_button) == deleteButton)
deleteItem(ui->listWidget);
else if (ui->buttonBox->buttonRole(_button) == QDialogButtonBox::AcceptRole)
editItem(ui->listWidget);
});
connect(ui->buttonBox, &QDialogButtonBox::rejected, [dialog]() { dialog->reject(); });
connect(ui->listWidget, &QListWidget::itemActivated, [&](QListWidgetItem *) { editItem(ui->listWidget); });
repaintList(ui->listWidget);
auto ret = dialog->exec();
dialog->deleteLater();
delete ui;
return ret;
}
QString AbstractExtItemAggregator::getName()
{
bool ok;
QString name = QInputDialog::getText(this, i18n("Enter file name"), i18n("File name"), QLineEdit::Normal, "", &ok);
auto name = QInputDialog::getText(nullptr, i18n("Enter file name"), i18n("File name"), QLineEdit::Normal, "", &ok);
if ((!ok) || (name.isEmpty()))
return "";
if (!name.endsWith(".desktop"))
@ -125,15 +138,15 @@ QString AbstractExtItemAggregator::getName()
}
AbstractExtItem *AbstractExtItemAggregator::itemFromWidget() const
AbstractExtItem *AbstractExtItemAggregator::itemFromWidget(QListWidget *_widget) const
{
QListWidgetItem *widgetItem = ui->listWidget->currentItem();
auto widgetItem = _widget->currentItem();
if (!widgetItem)
return nullptr;
AbstractExtItem *found = nullptr;
for (auto &item : items()) {
QString fileName = QFileInfo(item->fileName()).fileName();
auto fileName = QFileInfo(item->fileName()).fileName();
if (fileName != widgetItem->text())
continue;
found = item;
@ -146,18 +159,18 @@ AbstractExtItem *AbstractExtItemAggregator::itemFromWidget() const
}
void AbstractExtItemAggregator::repaintList() const
void AbstractExtItemAggregator::repaintList(QListWidget *_widget) const
{
ui->listWidget->clear();
_widget->clear();
for (auto &_item : items()) {
QString fileName = QFileInfo(_item->fileName()).fileName();
auto *item = new QListWidgetItem(fileName, ui->listWidget);
auto item = new QListWidgetItem(fileName, _widget);
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'));
ui->listWidget->addItem(item);
_widget->addItem(item);
}
}
@ -202,22 +215,3 @@ 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

@ -18,7 +18,6 @@
#ifndef ABSTRACTEXTITEMAGGREGATOR_H
#define ABSTRACTEXTITEMAGGREGATOR_H
#include <QDialog>
#include <QStandardPaths>
#include "abstractextitem.h"
@ -26,49 +25,45 @@
class QAbstractButton;
class QListWidget;
class QListWidgetItem;
namespace Ui
{
class AbstractExtItemAggregator;
}
class AbstractExtItemAggregator : public QDialog
class AbstractExtItemAggregator : public QObject
{
Q_OBJECT
Q_PROPERTY(QVariant configArgs READ configArgs WRITE setConfigArgs)
Q_PROPERTY(QVariant type READ type)
public:
explicit AbstractExtItemAggregator(QWidget *_parent, QString _type);
~AbstractExtItemAggregator() override;
explicit AbstractExtItemAggregator(QObject *_parent, QString _type);
// methods
void copyItem();
template <class T> void createItem()
void copyItem(QListWidget *_widget);
template <class T> void createItem(QListWidget *_widget)
{
QString fileName = getName();
int number = uniqNumber();
QString dir = QString("%1/awesomewidgets/%2")
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation))
.arg(m_type);
auto fileName = getName();
auto number = uniqNumber();
auto dir = QString("%1/awesomewidgets/%2")
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation), m_type);
if (fileName.isEmpty()) {
qCWarning(LOG_LIB) << "Nothing to create";
return;
}
QString filePath = QString("%1/%2").arg(dir).arg(fileName);
auto filePath = QString("%1/%2").arg(dir, fileName);
T *newItem = new T(this, filePath);
auto newItem = new T(this, filePath);
newItem->setNumber(number);
if (newItem->showConfiguration(configArgs()) == 1) {
if (newItem->showConfiguration(nullptr, configArgs()) == 1) {
initItems();
repaintList();
repaintList(_widget);
}
};
void deleteItem();
void editItem();
void deleteItem(QListWidget *_widget);
void editItem(QListWidget *_widget);
[[nodiscard]] int exec();
QString getName();
virtual void initItems() = 0;
[[nodiscard]] AbstractExtItem *itemFromWidget() const;
void repaintList() const;
[[nodiscard]] AbstractExtItem *itemFromWidget(QListWidget *_widget) const;
void repaintList(QListWidget *_widget) const;
[[nodiscard]] int uniqNumber() const;
// get methods
[[nodiscard]] QVariant configArgs() const;
@ -78,21 +73,12 @@ 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() = 0;
virtual void doCreateItem(QListWidget *_widget) = 0;
};

View File

@ -22,19 +22,13 @@
#include "awdebug.h"
AWAbstractFormatter::AWAbstractFormatter(QWidget *_parent, const QString &_filePath)
AWAbstractFormatter::AWAbstractFormatter(QObject *_parent, const QString &_filePath)
: AbstractExtItem(_parent, _filePath)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
}
AWAbstractFormatter::~AWAbstractFormatter()
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
}
void AWAbstractFormatter::copyDefaults(AbstractExtItem *_other) const
{
AbstractExtItem::copyDefaults(_other);
@ -45,7 +39,7 @@ void AWAbstractFormatter::copyDefaults(AbstractExtItem *_other) const
QString AWAbstractFormatter::uniq() const
{
return QString("%1(%2)").arg(name()).arg(strType());
return QString("%1(%2)").arg(name(), strType());
}

View File

@ -18,6 +18,8 @@
#ifndef AWABSTRACTFORMATTER_H
#define AWABSTRACTFORMATTER_H
#include <QRegularExpression>
#include "abstractextitem.h"
@ -30,8 +32,8 @@ class AWAbstractFormatter : public AbstractExtItem
public:
enum class FormatterClass { DateTime, Float, List, Script, String, NoFormat, Json };
explicit AWAbstractFormatter(QWidget *_parent = nullptr, const QString &_filePath = "");
~AWAbstractFormatter() override;
explicit AWAbstractFormatter(QObject *_parent = nullptr, const QString &_filePath = "");
~AWAbstractFormatter() override = default;
[[nodiscard]] virtual QString convert(const QVariant &_value) const = 0;
void copyDefaults(AbstractExtItem *_other) const override;
[[nodiscard]] QString uniq() const override;

View File

@ -15,7 +15,6 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awdatetimeformatter.h"
#include "ui_awdatetimeformatter.h"
@ -27,24 +26,13 @@
#include "awdebug.h"
AWDateTimeFormatter::AWDateTimeFormatter(QWidget *_parent, const QString &_filePath)
AWDateTimeFormatter::AWDateTimeFormatter(QObject *_parent, const QString &_filePath)
: AWAbstractFormatter(_parent, _filePath)
, ui(new Ui::AWDateTimeFormatter)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty())
AWDateTimeFormatter::readConfiguration();
ui->setupUi(this);
AWDateTimeFormatter::translate();
}
AWDateTimeFormatter::~AWDateTimeFormatter()
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
delete ui;
}
@ -60,7 +48,7 @@ AWDateTimeFormatter *AWDateTimeFormatter::copy(const QString &_fileName, const i
{
qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
auto *item = new AWDateTimeFormatter(dynamic_cast<QWidget *>(parent()), _fileName);
auto item = new AWDateTimeFormatter(parent(), _fileName);
AWAbstractFormatter::copyDefaults(item);
item->setFormat(format());
item->setTranslateString(translateString());
@ -114,27 +102,36 @@ void AWDateTimeFormatter::readConfiguration()
}
int AWDateTimeFormatter::showConfiguration(const QVariant &_args)
int AWDateTimeFormatter::showConfiguration(QWidget *_parent, const QVariant &_args)
{
Q_UNUSED(_args)
auto dialog = new QDialog(_parent);
auto ui = new Ui::AWDateTimeFormatter();
ui->setupUi(dialog);
translate(ui);
ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment());
ui->label_typeValue->setText("DateTime");
ui->lineEdit_format->setText(format());
ui->checkBox_translate->setCheckState(translateString() ? Qt::Checked : Qt::Unchecked);
int ret = exec();
if (ret != 1)
return ret;
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text());
setFormat(ui->lineEdit_format->text());
setTranslateString(ui->checkBox_translate->checkState() == Qt::Checked);
auto ret = dialog->exec();
if (ret == 1) {
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text());
setFormat(ui->lineEdit_format->text());
setTranslateString(ui->checkBox_translate->checkState() == Qt::Checked);
writeConfiguration();
}
dialog->deleteLater();
delete ui;
writeConfiguration();
return ret;
}
@ -160,9 +157,10 @@ void AWDateTimeFormatter::initLocale()
m_locale = m_translate ? QLocale::system() : QLocale::c();
}
void AWDateTimeFormatter::translate()
void AWDateTimeFormatter::translate(void *_ui)
{
auto ui = reinterpret_cast<Ui::AWDateTimeFormatter *>(_ui);
ui->label_name->setText(i18n("Name"));
ui->label_comment->setText(i18n("Comment"));
ui->label_type->setText(i18n("Type"));

View File

@ -23,11 +23,6 @@
#include "awabstractformatter.h"
namespace Ui
{
class AWDateTimeFormatter;
}
class AWDateTimeFormatter : public AWAbstractFormatter
{
Q_OBJECT
@ -35,8 +30,7 @@ class AWDateTimeFormatter : public AWAbstractFormatter
Q_PROPERTY(bool translateString READ translateString WRITE setTranslateString)
public:
explicit AWDateTimeFormatter(QWidget *_parent = nullptr, const QString &_filePath = "");
~AWDateTimeFormatter() override;
explicit AWDateTimeFormatter(QObject *_parent = nullptr, const QString &_filePath = "");
[[nodiscard]] QString convert(const QVariant &_value) const override;
AWDateTimeFormatter *copy(const QString &_fileName, int _number) override;
// properties
@ -47,13 +41,12 @@ public:
public slots:
void readConfiguration() override;
int showConfiguration(const QVariant &_args) override;
int showConfiguration(QWidget *_parent, const QVariant &_args) override;
void writeConfiguration() const override;
private:
Ui::AWDateTimeFormatter *ui = nullptr;
void initLocale();
void translate() override;
void translate(void *_ui) override;
// properties
QLocale m_locale;
QString m_format = "";

View File

@ -5,120 +5,120 @@
"image": {
"__comment": "should be described as html image with full path inside",
"default": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/3200.gif\">",
"default": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/3200.gif\">",
"800": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/01d.png\">",
"800": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/01d.png\">",
"801": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/02d.png\">",
"801": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/02d.png\">",
"802": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/03d.png\">",
"803": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/03d.png\">",
"802": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/03d.png\">",
"803": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/03d.png\">",
"804": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/04d.png\">",
"804": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/04d.png\">",
"300": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">",
"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\">",
"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\">",
"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\">",
"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\">",
"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\">",
"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\">",
"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\">",
"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\">",
"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\">",
"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\">",
"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\">"
"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\">"
},
"text": {

View File

@ -15,7 +15,6 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awfloatformatter.h"
#include "ui_awfloatformatter.h"
@ -26,24 +25,13 @@
#include "awdebug.h"
AWFloatFormatter::AWFloatFormatter(QWidget *_parent, const QString &_filePath)
AWFloatFormatter::AWFloatFormatter(QObject *_parent, const QString &_filePath)
: AWAbstractFormatter(_parent, _filePath)
, ui(new Ui::AWFloatFormatter)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty())
AWFloatFormatter::readConfiguration();
ui->setupUi(this);
AWFloatFormatter::translate();
}
AWFloatFormatter::~AWFloatFormatter()
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
delete ui;
}
@ -51,7 +39,7 @@ QString AWFloatFormatter::convert(const QVariant &_value) const
{
qCDebug(LOG_LIB) << "Convert value" << _value;
QString output
auto output
= QString("%1").arg(_value.toDouble() * multiplier() + summand(), count(), format(), precision(), fillChar());
if (forceWidth())
output = output.left(count());
@ -64,7 +52,7 @@ AWFloatFormatter *AWFloatFormatter::copy(const QString &_fileName, const int _nu
{
qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
auto *item = new AWFloatFormatter(dynamic_cast<QWidget *>(parent()), _fileName);
auto item = new AWFloatFormatter(parent(), _fileName);
AWAbstractFormatter::copyDefaults(item);
item->setCount(count());
item->setFormat(format());
@ -202,10 +190,15 @@ void AWFloatFormatter::readConfiguration()
}
int AWFloatFormatter::showConfiguration(const QVariant &_args)
int AWFloatFormatter::showConfiguration(QWidget *_parent, const QVariant &_args)
{
Q_UNUSED(_args)
auto dialog = new QDialog(_parent);
auto ui = new Ui::AWFloatFormatter();
ui->setupUi(dialog);
translate(ui);
ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment());
ui->label_typeValue->setText("Float");
@ -217,22 +210,26 @@ int AWFloatFormatter::showConfiguration(const QVariant &_args)
ui->doubleSpinBox_multiplier->setValue(multiplier());
ui->doubleSpinBox_summand->setValue(summand());
int ret = exec();
if (ret != 1)
return ret;
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text());
setFormat(ui->comboBox_format->currentText().at(0).toLatin1());
setPrecision(ui->spinBox_precision->value());
setCount(ui->spinBox_width->value());
setFillChar(ui->lineEdit_fill->text().at(0));
setForceWidth(ui->checkBox_forceWidth->checkState() == Qt::Checked);
setMultiplier(ui->doubleSpinBox_multiplier->value());
setSummand(ui->doubleSpinBox_summand->value());
auto ret = dialog->exec();
if (ret == 1) {
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text());
setFormat(ui->comboBox_format->currentText().at(0).toLatin1());
setPrecision(ui->spinBox_precision->value());
setCount(ui->spinBox_width->value());
setFillChar(ui->lineEdit_fill->text().at(0));
setForceWidth(ui->checkBox_forceWidth->checkState() == Qt::Checked);
setMultiplier(ui->doubleSpinBox_multiplier->value());
setSummand(ui->doubleSpinBox_summand->value());
writeConfiguration();
}
dialog->deleteLater();
delete ui;
writeConfiguration();
return ret;
}
@ -258,8 +255,10 @@ void AWFloatFormatter::writeConfiguration() const
}
void AWFloatFormatter::translate()
void AWFloatFormatter::translate(void *_ui)
{
auto ui = reinterpret_cast<Ui::AWFloatFormatter *>(_ui);
ui->label_name->setText(i18n("Name"));
ui->label_comment->setText(i18n("Comment"));
ui->label_type->setText(i18n("Type"));

View File

@ -21,11 +21,6 @@
#include "awabstractformatter.h"
namespace Ui
{
class AWFloatFormatter;
}
class AWFloatFormatter : public AWAbstractFormatter
{
Q_OBJECT
@ -38,8 +33,7 @@ class AWFloatFormatter : public AWAbstractFormatter
Q_PROPERTY(double summand READ summand WRITE setSummand)
public:
explicit AWFloatFormatter(QWidget *_parent = nullptr, const QString &_filePath = "");
~AWFloatFormatter() override;
explicit AWFloatFormatter(QObject *_parent = nullptr, const QString &_filePath = "");
[[nodiscard]] QString convert(const QVariant &_value) const override;
AWFloatFormatter *copy(const QString &_fileName, int _number) override;
// properties
@ -60,12 +54,11 @@ public:
public slots:
void readConfiguration() override;
int showConfiguration(const QVariant &_args) override;
int showConfiguration(QWidget *_parent, const QVariant &_args) override;
void writeConfiguration() const override;
private:
Ui::AWFloatFormatter *ui = nullptr;
void translate() override;
void translate(void *_ui) override;
// properties
int m_count = 0;
QChar m_fillChar = QChar();

View File

@ -15,7 +15,6 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awjsonformatter.h"
#include "ui_awjsonformatter.h"
@ -27,24 +26,13 @@
#include "awdebug.h"
AWJsonFormatter::AWJsonFormatter(QWidget *_parent, const QString &_filePath)
AWJsonFormatter::AWJsonFormatter(QObject *_parent, const QString &_filePath)
: AWAbstractFormatter(_parent, _filePath)
, ui(new Ui::AWJsonFormatter)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty())
AWJsonFormatter::readConfiguration();
ui->setupUi(this);
AWJsonFormatter::translate();
}
AWJsonFormatter::~AWJsonFormatter()
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
delete ui;
}
@ -53,8 +41,8 @@ QString AWJsonFormatter::convert(const QVariant &_value) const
qCDebug(LOG_LIB) << "Convert value" << _value;
// check if _value is string and parse first if required
QJsonDocument json = _value.type() == QVariant::String ? QJsonDocument::fromJson(_value.toString().toUtf8())
: QJsonDocument::fromVariant(_value);
QJsonDocument json = _value.userType() == QMetaType::QString ? QJsonDocument::fromJson(_value.toString().toUtf8())
: QJsonDocument::fromVariant(_value);
QVariant converted = json.toVariant();
for (auto &element : m_splittedPath)
converted = getFromJson(converted, element);
@ -67,7 +55,7 @@ AWJsonFormatter *AWJsonFormatter::copy(const QString &_fileName, const int _numb
{
qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
auto *item = new AWJsonFormatter(dynamic_cast<QWidget *>(parent()), _fileName);
auto item = new AWJsonFormatter(parent(), _fileName);
AWAbstractFormatter::copyDefaults(item);
item->setNumber(_number);
item->setPath(path());
@ -105,25 +93,34 @@ void AWJsonFormatter::readConfiguration()
}
int AWJsonFormatter::showConfiguration(const QVariant &args)
int AWJsonFormatter::showConfiguration(QWidget *_parent, const QVariant &args)
{
Q_UNUSED(args)
auto dialog = new QDialog(_parent);
auto ui = new Ui::AWJsonFormatter();
ui->setupUi(dialog);
translate(ui);
ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment());
ui->label_typeValue->setText("Json");
ui->lineEdit_path->setText(path());
int ret = exec();
if (ret != 1)
return ret;
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text());
setPath(ui->lineEdit_path->text());
auto ret = dialog->exec();
if (ret == 1) {
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text());
setPath(ui->lineEdit_path->text());
writeConfiguration();
}
dialog->deleteLater();
delete ui;
writeConfiguration();
return ret;
}
@ -147,9 +144,9 @@ QVariant AWJsonFormatter::getFromJson(const QVariant &_value, const QVariant &_e
{
qCDebug(LOG_LIB) << "Looking for element" << _element << "in" << _value;
if (_element.type() == QVariant::String) {
if (_element.userType() == QMetaType::QString) {
return getFromMap(_value, _element.toString());
} else if (_element.type() == QVariant::Int) {
} else if (_element.userType() == QMetaType::Int) {
return getFromList(_value, _element.toInt());
} else {
qCWarning(LOG_LIB) << "Unknown type" << _element.typeName();
@ -187,8 +184,10 @@ void AWJsonFormatter::initPath()
}
void AWJsonFormatter::translate()
void AWJsonFormatter::translate(void *_ui)
{
auto ui = reinterpret_cast<Ui::AWJsonFormatter *>(_ui);
ui->label_name->setText(i18n("Name"));
ui->label_comment->setText(i18n("Comment"));
ui->label_type->setText(i18n("Type"));

View File

@ -21,19 +21,13 @@
#include "awabstractformatter.h"
namespace Ui
{
class AWJsonFormatter;
}
class AWJsonFormatter : public AWAbstractFormatter
{
Q_OBJECT
Q_PROPERTY(QString path READ path WRITE setPath)
public:
explicit AWJsonFormatter(QWidget *_parent = nullptr, const QString &_filePath = "");
~AWJsonFormatter() override;
explicit AWJsonFormatter(QObject *_parent = nullptr, const QString &_filePath = "");
[[nodiscard]] QString convert(const QVariant &_value) const override;
AWJsonFormatter *copy(const QString &_fileName, int _number) override;
// properties
@ -42,16 +36,15 @@ public:
public slots:
void readConfiguration() override;
int showConfiguration(const QVariant &_args) override;
int showConfiguration(QWidget *_parent, const QVariant &_args) override;
void writeConfiguration() const override;
private:
Ui::AWJsonFormatter *ui = nullptr;
static QVariant getFromJson(const QVariant &_value, const QVariant &_element);
static QVariant getFromList(const QVariant &_value, int _index);
static QVariant getFromMap(const QVariant &_value, const QString &_key);
void initPath();
void translate() override;
void translate(void *_ui) override;
// properties
QString m_path;
QVariantList m_splittedPath;

View File

@ -15,7 +15,6 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awlistformatter.h"
#include "ui_awlistformatter.h"
@ -26,24 +25,13 @@
#include "awdebug.h"
AWListFormatter::AWListFormatter(QWidget *_parent, const QString &_filePath)
AWListFormatter::AWListFormatter(QObject *_parent, const QString &_filePath)
: AWAbstractFormatter(_parent, _filePath)
, ui(new Ui::AWListFormatter)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty())
AWListFormatter::readConfiguration();
ui->setupUi(this);
AWListFormatter::translate();
}
AWListFormatter::~AWListFormatter()
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
delete ui;
}
@ -51,7 +39,7 @@ QString AWListFormatter::convert(const QVariant &_value) const
{
qCDebug(LOG_LIB) << "Convert value" << _value;
QStringList output = _value.toStringList();
auto output = _value.toStringList();
if (isSorted())
output.sort();
@ -63,7 +51,7 @@ AWListFormatter *AWListFormatter::copy(const QString &_fileName, const int _numb
{
qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
auto *item = new AWListFormatter(dynamic_cast<QWidget *>(parent()), _fileName);
auto item = new AWListFormatter(parent(), _fileName);
AWAbstractFormatter::copyDefaults(item);
item->setFilter(filter());
item->setSeparator(separator());
@ -97,7 +85,7 @@ void AWListFormatter::setFilter(const QString &_filter)
qCDebug(LOG_LIB) << "Filter" << _filter;
m_filter = _filter;
m_regex = QRegExp(m_filter);
m_regex = QRegularExpression(m_filter);
}
@ -133,10 +121,15 @@ void AWListFormatter::readConfiguration()
}
int AWListFormatter::showConfiguration(const QVariant &_args)
int AWListFormatter::showConfiguration(QWidget *_parent, const QVariant &_args)
{
Q_UNUSED(_args)
auto dialog = new QDialog(_parent);
auto ui = new Ui::AWListFormatter();
ui->setupUi(dialog);
translate(ui);
ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment());
ui->label_typeValue->setText("List");
@ -144,18 +137,22 @@ int AWListFormatter::showConfiguration(const QVariant &_args)
ui->lineEdit_separator->setText(separator());
ui->checkBox_sorted->setCheckState(isSorted() ? Qt::Checked : Qt::Unchecked);
int ret = exec();
if (ret != 1)
return ret;
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text());
setFilter(ui->lineEdit_filter->text());
setSeparator(ui->lineEdit_separator->text());
setSorted(ui->checkBox_sorted->checkState() == Qt::Checked);
auto ret = dialog->exec();
if (ret == 1) {
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text());
setFilter(ui->lineEdit_filter->text());
setSeparator(ui->lineEdit_separator->text());
setSorted(ui->checkBox_sorted->checkState() == Qt::Checked);
writeConfiguration();
}
dialog->deleteLater();
delete ui;
writeConfiguration();
return ret;
}
@ -177,8 +174,10 @@ void AWListFormatter::writeConfiguration() const
}
void AWListFormatter::translate()
void AWListFormatter::translate(void *_ui)
{
auto ui = reinterpret_cast<Ui::AWListFormatter *>(_ui);
ui->label_name->setText(i18n("Name"));
ui->label_comment->setText(i18n("Comment"));
ui->label_type->setText(i18n("Type"));

View File

@ -21,11 +21,6 @@
#include "awabstractformatter.h"
namespace Ui
{
class AWListFormatter;
}
class AWListFormatter : public AWAbstractFormatter
{
Q_OBJECT
@ -34,8 +29,7 @@ class AWListFormatter : public AWAbstractFormatter
Q_PROPERTY(bool sorted READ isSorted WRITE setSorted)
public:
explicit AWListFormatter(QWidget *_parent = nullptr, const QString &_filePath = "");
~AWListFormatter() override;
explicit AWListFormatter(QObject *_parent = nullptr, const QString &_filePath = "");
[[nodiscard]] QString convert(const QVariant &_value) const override;
AWListFormatter *copy(const QString &_fileName, int _number) override;
// properties
@ -48,17 +42,16 @@ public:
public slots:
void readConfiguration() override;
int showConfiguration(const QVariant &_args) override;
int showConfiguration(QWidget *_parent, const QVariant &_args) override;
void writeConfiguration() const override;
private:
Ui::AWListFormatter *ui = nullptr;
void translate() override;
void translate(void *_ui) override;
// properties
QString m_filter = "";
QString m_separator = "";
bool m_sorted = false;
QRegExp m_regex;
QRegularExpression m_regex;
};

View File

@ -15,7 +15,6 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awnoformatter.h"
#include "ui_awnoformatter.h"
@ -24,24 +23,13 @@
#include "awdebug.h"
AWNoFormatter::AWNoFormatter(QWidget *_parent, const QString &_filePath)
AWNoFormatter::AWNoFormatter(QObject *_parent, const QString &_filePath)
: AWAbstractFormatter(_parent, _filePath)
, ui(new Ui::AWNoFormatter)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty())
AWNoFormatter::readConfiguration();
ui->setupUi(this);
AWNoFormatter::translate();
}
AWNoFormatter::~AWNoFormatter()
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
delete ui;
}
@ -57,7 +45,7 @@ AWNoFormatter *AWNoFormatter::copy(const QString &_fileName, const int _number)
{
qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
auto *item = new AWNoFormatter(dynamic_cast<QWidget *>(parent()), _fileName);
auto item = new AWNoFormatter(parent(), _fileName);
AWAbstractFormatter::copyDefaults(item);
item->setNumber(_number);
@ -65,29 +53,40 @@ AWNoFormatter *AWNoFormatter::copy(const QString &_fileName, const int _number)
}
int AWNoFormatter::showConfiguration(const QVariant &_args)
int AWNoFormatter::showConfiguration(QWidget *_parent, const QVariant &_args)
{
Q_UNUSED(_args)
auto dialog = new QDialog(_parent);
auto ui = new Ui::AWNoFormatter();
ui->setupUi(dialog);
translate(ui);
ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment());
ui->label_typeValue->setText("NoFormat");
int ret = exec();
if (ret != 1)
return ret;
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text());
auto ret = dialog->exec();
if (ret == 1) {
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text());
writeConfiguration();
}
dialog->deleteLater();
delete ui;
writeConfiguration();
return ret;
}
void AWNoFormatter::translate()
void AWNoFormatter::translate(void *_ui)
{
auto ui = reinterpret_cast<Ui::AWNoFormatter *>(_ui);
ui->label_name->setText(i18n("Name"));
ui->label_comment->setText(i18n("Comment"));
ui->label_type->setText(i18n("Type"));

View File

@ -21,27 +21,20 @@
#include "awabstractformatter.h"
namespace Ui
{
class AWNoFormatter;
}
class AWNoFormatter : public AWAbstractFormatter
{
Q_OBJECT
public:
explicit AWNoFormatter(QWidget *_parent = nullptr, const QString &_filePath = "");
~AWNoFormatter() override;
explicit AWNoFormatter(QObject *_parent = nullptr, const QString &_filePath = "");
[[nodiscard]] QString convert(const QVariant &_value) const override;
AWNoFormatter *copy(const QString &_fileName, int _number) override;
public slots:
int showConfiguration(const QVariant &_args) override;
int showConfiguration(QWidget *_parent, const QVariant &_args) override;
private:
Ui::AWNoFormatter *ui = nullptr;
void translate() override;
void translate(void *_ui) override;
// properties
};

View File

@ -15,7 +15,6 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awscriptformatter.h"
#include "ui_awscriptformatter.h"
@ -27,24 +26,13 @@
#include "awdebug.h"
AWScriptFormatter::AWScriptFormatter(QWidget *_parent, const QString &_filePath)
AWScriptFormatter::AWScriptFormatter(QObject *_parent, const QString &_filePath)
: AWAbstractFormatter(_parent, _filePath)
, ui(new Ui::AWScriptFormatter)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty())
AWScriptFormatter::readConfiguration();
ui->setupUi(this);
AWScriptFormatter::translate();
}
AWScriptFormatter::~AWScriptFormatter()
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
delete ui;
}
@ -54,9 +42,8 @@ QString AWScriptFormatter::convert(const QVariant &_value) const
// init engine
QJSEngine engine;
QJSValue fn = engine.evaluate(m_program);
QJSValueList args = QJSValueList() << _value.toString();
QJSValue result = fn.call(args);
auto fn = engine.evaluate(m_program);
auto result = fn.call({_value.toString()});
if (result.isError()) {
qCWarning(LOG_LIB) << "Uncaught exception at line" << result.property("lineNumber").toInt() << ":"
@ -72,7 +59,7 @@ AWScriptFormatter *AWScriptFormatter::copy(const QString &_fileName, const int _
{
qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
auto *item = new AWScriptFormatter(dynamic_cast<QWidget *>(parent()), _fileName);
auto item = new AWScriptFormatter(parent(), _fileName);
AWAbstractFormatter::copyDefaults(item);
item->setAppendCode(appendCode());
item->setCode(code());
@ -150,10 +137,15 @@ void AWScriptFormatter::readConfiguration()
}
int AWScriptFormatter::showConfiguration(const QVariant &_args)
int AWScriptFormatter::showConfiguration(QWidget *_parent, const QVariant &_args)
{
Q_UNUSED(_args)
auto dialog = new QDialog(_parent);
auto ui = new Ui::AWScriptFormatter();
ui->setupUi(dialog);
translate(ui);
ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment());
ui->label_typeValue->setText("Script");
@ -161,19 +153,23 @@ int AWScriptFormatter::showConfiguration(const QVariant &_args)
ui->checkBox_hasReturn->setCheckState(hasReturn() ? Qt::Checked : Qt::Unchecked);
ui->textEdit_code->setPlainText(code());
int ret = exec();
if (ret != 1)
return ret;
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text());
setAppendCode(ui->checkBox_appendCode->checkState() == Qt::Checked);
setHasReturn(ui->checkBox_hasReturn->checkState() == Qt::Checked);
setCode(ui->textEdit_code->toPlainText());
initProgram();
int ret = dialog->exec();
if (ret == 1) {
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text());
setAppendCode(ui->checkBox_appendCode->checkState() == Qt::Checked);
setHasReturn(ui->checkBox_hasReturn->checkState() == Qt::Checked);
setCode(ui->textEdit_code->toPlainText());
initProgram();
writeConfiguration();
}
dialog->deleteLater();
delete ui;
writeConfiguration();
return ret;
}
@ -199,7 +195,7 @@ void AWScriptFormatter::initProgram()
{
// init JS code
if (appendCode())
m_program = QString("(function(value) { %1%2 })").arg(code()).arg(hasReturn() ? "" : "; return output;");
m_program = QString("(function(value) { %1%2 })").arg(code(), hasReturn() ? "" : "; return output;");
else
m_program = code();
@ -207,8 +203,10 @@ void AWScriptFormatter::initProgram()
}
void AWScriptFormatter::translate()
void AWScriptFormatter::translate(void *_ui)
{
auto ui = reinterpret_cast<Ui::AWScriptFormatter *>(_ui);
ui->label_name->setText(i18n("Name"));
ui->label_comment->setText(i18n("Comment"));
ui->label_type->setText(i18n("Type"));

View File

@ -21,11 +21,6 @@
#include "awabstractformatter.h"
namespace Ui
{
class AWScriptFormatter;
}
class AWScriptFormatter : public AWAbstractFormatter
{
Q_OBJECT
@ -35,8 +30,7 @@ class AWScriptFormatter : public AWAbstractFormatter
Q_PROPERTY(QString program READ program)
public:
explicit AWScriptFormatter(QWidget *_parent = nullptr, const QString &_filePath = "");
~AWScriptFormatter() override;
explicit AWScriptFormatter(QObject *_parent = nullptr, const QString &_filePath = "");
[[nodiscard]] QString convert(const QVariant &_value) const override;
AWScriptFormatter *copy(const QString &_fileName, int _number) override;
// properties
@ -50,13 +44,12 @@ public:
public slots:
void readConfiguration() override;
int showConfiguration(const QVariant &_args) override;
int showConfiguration(QWidget *_parent, const QVariant &_args) override;
void writeConfiguration() const override;
private:
Ui::AWScriptFormatter *ui = nullptr;
void initProgram();
void translate() override;
void translate(void *_ui) override;
// properties
bool m_appendCode = true;
QString m_code = "";

View File

@ -15,7 +15,6 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awstringformatter.h"
#include "ui_awstringformatter.h"
@ -26,24 +25,13 @@
#include "awdebug.h"
AWStringFormatter::AWStringFormatter(QWidget *_parent, const QString &_filePath)
AWStringFormatter::AWStringFormatter(QObject *_parent, const QString &_filePath)
: AWAbstractFormatter(_parent, _filePath)
, ui(new Ui::AWStringFormatter)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty())
AWStringFormatter::readConfiguration();
ui->setupUi(this);
AWStringFormatter::translate();
}
AWStringFormatter::~AWStringFormatter()
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
delete ui;
}
@ -51,7 +39,7 @@ QString AWStringFormatter::convert(const QVariant &_value) const
{
qCDebug(LOG_LIB) << "Convert value" << _value;
QString output = QString("%1").arg(_value.toString(), count(), fillChar());
auto output = QString("%1").arg(_value.toString(), count(), fillChar());
if (forceWidth())
output = output.left(count());
@ -63,7 +51,7 @@ AWStringFormatter *AWStringFormatter::copy(const QString &_fileName, const int _
{
qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
auto *item = new AWStringFormatter(dynamic_cast<QWidget *>(parent()), _fileName);
auto item = new AWStringFormatter(parent(), _fileName);
AWAbstractFormatter::copyDefaults(item);
item->setCount(count());
item->setFillChar(fillChar());
@ -132,10 +120,15 @@ void AWStringFormatter::readConfiguration()
}
int AWStringFormatter::showConfiguration(const QVariant &_args)
int AWStringFormatter::showConfiguration(QWidget *_parent, const QVariant &_args)
{
Q_UNUSED(_args)
auto dialog = new QDialog(_parent);
auto ui = new Ui::AWStringFormatter();
ui->setupUi(dialog);
translate(ui);
ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment());
ui->label_typeValue->setText("String");
@ -143,18 +136,22 @@ int AWStringFormatter::showConfiguration(const QVariant &_args)
ui->lineEdit_fill->setText(QString(fillChar()));
ui->checkBox_forceWidth->setCheckState(forceWidth() ? Qt::Checked : Qt::Unchecked);
int ret = exec();
if (ret != 1)
return ret;
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text());
setCount(ui->spinBox_width->value());
setFillChar(ui->lineEdit_fill->text().at(0));
setForceWidth(ui->checkBox_forceWidth->checkState() == Qt::Checked);
auto ret = dialog->exec();
if (ret == 1) {
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text());
setCount(ui->spinBox_width->value());
setFillChar(ui->lineEdit_fill->text().at(0));
setForceWidth(ui->checkBox_forceWidth->checkState() == Qt::Checked);
writeConfiguration();
}
dialog->deleteLater();
delete ui;
writeConfiguration();
return ret;
}
@ -176,8 +173,10 @@ void AWStringFormatter::writeConfiguration() const
}
void AWStringFormatter::translate()
void AWStringFormatter::translate(void *_ui)
{
auto ui = reinterpret_cast<Ui::AWStringFormatter *>(_ui);
ui->label_name->setText(i18n("Name"));
ui->label_comment->setText(i18n("Comment"));
ui->label_type->setText(i18n("Type"));

View File

@ -21,11 +21,6 @@
#include "awabstractformatter.h"
namespace Ui
{
class AWStringFormatter;
}
class AWStringFormatter : public AWAbstractFormatter
{
Q_OBJECT
@ -34,8 +29,7 @@ class AWStringFormatter : public AWAbstractFormatter
Q_PROPERTY(bool forceWidth READ forceWidth WRITE setForceWidth)
public:
explicit AWStringFormatter(QWidget *_parent = nullptr, const QString &_filePath = "");
~AWStringFormatter() override;
explicit AWStringFormatter(QObject *_parent = nullptr, const QString &_filePath = "");
[[nodiscard]] QString convert(const QVariant &_value) const override;
AWStringFormatter *copy(const QString &_fileName, int _number) override;
// properties
@ -48,12 +42,11 @@ public:
public slots:
void readConfiguration() override;
int showConfiguration(const QVariant &_args) override;
int showConfiguration(QWidget *_parent, const QVariant &_args) override;
void writeConfiguration() const override;
private:
Ui::AWStringFormatter *ui = nullptr;
void translate() override;
void translate(void *_ui) override;
// properties
int m_count = 0;
QChar m_fillChar = QChar();

View File

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

View File

@ -20,25 +20,20 @@
#include <KI18n/KLocalizedString>
#include <QDir>
#include <QSettings>
#include <QTextCodec>
#include <qreplytimeout/qreplytimeout.h>
#include "awdebug.h"
ExtNetworkRequest::ExtNetworkRequest(QWidget *_parent, const QString &_filePath)
ExtNetworkRequest::ExtNetworkRequest(QObject *_parent, const QString &_filePath)
: AbstractExtItem(_parent, _filePath)
, ui(new Ui::ExtNetworkRequest)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty())
ExtNetworkRequest::readConfiguration();
ui->setupUi(this);
ExtNetworkRequest::translate();
m_values[tag("response")] = "";
@ -59,7 +54,6 @@ ExtNetworkRequest::~ExtNetworkRequest()
disconnect(this, SIGNAL(requestDataUpdate()), this, SLOT(sendRequest()));
m_manager->deleteLater();
delete ui;
}
@ -67,7 +61,7 @@ ExtNetworkRequest *ExtNetworkRequest::copy(const QString &_fileName, const int _
{
qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
auto *item = new ExtNetworkRequest(dynamic_cast<QWidget *>(parent()), _fileName);
auto item = new ExtNetworkRequest(parent(), _fileName);
copyDefaults(item);
item->setNumber(_number);
item->setStringUrl(stringUrl());
@ -121,10 +115,15 @@ QVariantHash ExtNetworkRequest::run()
}
int ExtNetworkRequest::showConfiguration(const QVariant &_args)
int ExtNetworkRequest::showConfiguration(QWidget *_parent, const QVariant &_args)
{
Q_UNUSED(_args)
auto dialog = new QDialog(_parent);
auto ui = new Ui::ExtNetworkRequest();
ui->setupUi(dialog);
translate(ui);
ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment());
ui->label_numberValue->setText(QString("%1").arg(number()));
@ -134,20 +133,24 @@ int ExtNetworkRequest::showConfiguration(const QVariant &_args)
ui->lineEdit_socket->setText(socket());
ui->spinBox_interval->setValue(interval());
int ret = exec();
if (ret != 1)
return ret;
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setNumber(ui->label_numberValue->text().toInt());
setApiVersion(AW_EXTNETREQUEST_API);
setStringUrl(ui->lineEdit_url->text());
setActive(ui->checkBox_active->checkState() == Qt::Checked);
setCron(ui->lineEdit_schedule->text());
setSocket(ui->lineEdit_socket->text());
setInterval(ui->spinBox_interval->value());
auto ret = dialog->exec();
if (ret == 1) {
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setNumber(ui->label_numberValue->text().toInt());
setApiVersion(AW_EXTNETREQUEST_API);
setStringUrl(ui->lineEdit_url->text());
setActive(ui->checkBox_active->checkState() == Qt::Checked);
setCron(ui->lineEdit_schedule->text());
setSocket(ui->lineEdit_socket->text());
setInterval(ui->spinBox_interval->value());
writeConfiguration();
}
dialog->deleteLater();
delete ui;
writeConfiguration();
return ret;
}
@ -174,7 +177,7 @@ void ExtNetworkRequest::networkReplyReceived(QNetworkReply *_reply)
}
m_isRunning = false;
m_values[tag("response")] = QTextCodec::codecForMib(106)->toUnicode(_reply->readAll()).trimmed();
m_values[tag("response")] = QString::fromUtf8(_reply->readAll()).trimmed();
emit(dataReceived(m_values));
}
@ -183,7 +186,7 @@ void ExtNetworkRequest::networkReplyReceived(QNetworkReply *_reply)
void ExtNetworkRequest::sendRequest()
{
m_isRunning = true;
QNetworkReply *reply = m_manager->get(QNetworkRequest(m_url));
auto reply = m_manager->get(QNetworkRequest(m_url));
new QReplyTimeout(reply, REQUEST_TIMEOUT);
}
@ -194,8 +197,10 @@ void ExtNetworkRequest::initUrl()
}
void ExtNetworkRequest::translate()
void ExtNetworkRequest::translate(void *_ui)
{
auto ui = reinterpret_cast<Ui::ExtNetworkRequest *>(_ui);
ui->label_name->setText(i18n("Name"));
ui->label_comment->setText(i18n("Comment"));
ui->label_number->setText(i18n("Tag"));

View File

@ -23,18 +23,13 @@
#include "abstractextitem.h"
namespace Ui
{
class ExtNetworkRequest;
}
class ExtNetworkRequest : public AbstractExtItem
{
Q_OBJECT
Q_PROPERTY(QString stringUrl READ stringUrl WRITE setStringUrl)
public:
explicit ExtNetworkRequest(QWidget *_parent = nullptr, const QString &_filePath = "");
explicit ExtNetworkRequest(QObject *_parent = nullptr, const QString &_filePath = "");
~ExtNetworkRequest() override;
ExtNetworkRequest *copy(const QString &_fileName, int _number) override;
// get methods
@ -46,7 +41,7 @@ public:
public slots:
void readConfiguration() override;
QVariantHash run() override;
int showConfiguration(const QVariant &_args) override;
int showConfiguration(QWidget *_parent, const QVariant &_args) override;
void writeConfiguration() const override;
private slots:
@ -57,9 +52,8 @@ private:
QNetworkAccessManager *m_manager = nullptr;
QUrl m_url;
bool m_isRunning = false;
Ui::ExtNetworkRequest *ui = nullptr;
void initUrl();
void translate() override;
void translate(void *_ui) override;
// properties
QString m_stringUrl = "https://httpbin.org/get";
// values

View File

@ -20,7 +20,6 @@
#include <KI18n/KLocalizedString>
#include <QDir>
#include <QSettings>
#include <qreplytimeout/qreplytimeout.h>
@ -29,16 +28,13 @@
#include "stooqquotesprovider.h"
ExtQuotes::ExtQuotes(QWidget *_parent, const QString &_filePath)
ExtQuotes::ExtQuotes(QObject *_parent, const QString &_filePath)
: AbstractExtItem(_parent, _filePath)
, ui(new Ui::ExtQuotes)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty())
ExtQuotes::readConfiguration();
ui->setupUi(this);
ExtQuotes::translate();
m_values[tag("price")] = 0.0;
m_values[tag("pricechg")] = 0.0;
@ -64,7 +60,6 @@ ExtQuotes::~ExtQuotes()
disconnect(this, SIGNAL(requestDataUpdate()), this, SLOT(sendRequest()));
m_manager->deleteLater();
delete ui;
}
@ -72,7 +67,7 @@ ExtQuotes *ExtQuotes::copy(const QString &_fileName, const int _number)
{
qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
auto *item = new ExtQuotes(dynamic_cast<QWidget *>(parent()), _fileName);
auto item = new ExtQuotes(parent(), _fileName);
copyDefaults(item);
item->setNumber(_number);
item->setTicker(ticker());
@ -126,10 +121,15 @@ QVariantHash ExtQuotes::run()
}
int ExtQuotes::showConfiguration(const QVariant &_args)
int ExtQuotes::showConfiguration(QWidget *_parent, const QVariant &_args)
{
Q_UNUSED(_args)
auto dialog = new QDialog(_parent);
auto ui = new Ui::ExtQuotes();
ui->setupUi(dialog);
translate(ui);
ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment());
ui->label_numberValue->setText(QString("%1").arg(number()));
@ -139,20 +139,24 @@ int ExtQuotes::showConfiguration(const QVariant &_args)
ui->lineEdit_socket->setText(socket());
ui->spinBox_interval->setValue(interval());
int ret = exec();
if (ret != 1)
return ret;
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setNumber(ui->label_numberValue->text().toInt());
setApiVersion(AW_EXTQUOTES_API);
setTicker(ui->lineEdit_ticker->text());
setActive(ui->checkBox_active->checkState() == Qt::Checked);
setCron(ui->lineEdit_schedule->text());
setSocket(ui->lineEdit_socket->text());
setInterval(ui->spinBox_interval->value());
auto ret = dialog->exec();
if (ret == 1) {
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setNumber(ui->label_numberValue->text().toInt());
setApiVersion(AW_EXTQUOTES_API);
setTicker(ui->lineEdit_ticker->text());
setActive(ui->checkBox_active->checkState() == Qt::Checked);
setCron(ui->lineEdit_schedule->text());
setSocket(ui->lineEdit_socket->text());
setInterval(ui->spinBox_interval->value());
writeConfiguration();
}
dialog->deleteLater();
delete ui;
writeConfiguration();
return ret;
}
@ -182,7 +186,7 @@ void ExtQuotes::quotesReplyReceived(QNetworkReply *_reply)
auto text = _reply->readAll();
_reply->deleteLater();
QVariantHash data = m_providerObject->parse(text, m_values);
auto data = m_providerObject->parse(text, m_values);
if (data.isEmpty())
return;
m_values = data;
@ -194,7 +198,7 @@ void ExtQuotes::quotesReplyReceived(QNetworkReply *_reply)
void ExtQuotes::sendRequest()
{
m_isRunning = true;
QNetworkReply *reply = m_manager->get(QNetworkRequest(m_providerObject->url()));
auto reply = m_manager->get(QNetworkRequest(m_providerObject->url()));
new QReplyTimeout(reply, REQUEST_TIMEOUT);
}
@ -210,8 +214,10 @@ void ExtQuotes::initProvider()
}
void ExtQuotes::translate()
void ExtQuotes::translate(void *_ui)
{
auto ui = reinterpret_cast<Ui::ExtQuotes *>(_ui);
ui->label_name->setText(i18n("Name"));
ui->label_comment->setText(i18n("Comment"));
ui->label_number->setText(i18n("Tag"));

View File

@ -24,10 +24,6 @@
class AbstractQuotesProvider;
namespace Ui
{
class ExtQuotes;
}
class ExtQuotes : public AbstractExtItem
{
@ -35,7 +31,7 @@ class ExtQuotes : public AbstractExtItem
Q_PROPERTY(QString ticker READ ticker WRITE setTicker)
public:
explicit ExtQuotes(QWidget *_parent = nullptr, const QString &_filePath = "");
explicit ExtQuotes(QObject *_parent = nullptr, const QString &_filePath = "");
~ExtQuotes() override;
ExtQuotes *copy(const QString &_fileName, int _number) override;
// get methods
@ -47,7 +43,7 @@ public:
public slots:
void readConfiguration() override;
QVariantHash run() override;
int showConfiguration(const QVariant &_args) override;
int showConfiguration(QWidget *_parent, const QVariant &_args) override;
void writeConfiguration() const override;
private slots:
@ -58,9 +54,8 @@ private:
AbstractQuotesProvider *m_providerObject = nullptr;
QNetworkAccessManager *m_manager = nullptr;
bool m_isRunning = false;
Ui::ExtQuotes *ui = nullptr;
void initProvider();
void translate() override;
void translate(void *_ui) override;
// properties
QString m_ticker = "EURUSD=X";
// values

View File

@ -24,22 +24,18 @@
#include <QJsonDocument>
#include <QSettings>
#include <QStandardPaths>
#include <QTextCodec>
#include "awdebug.h"
ExtScript::ExtScript(QWidget *_parent, const QString &_filePath)
ExtScript::ExtScript(QObject *_parent, const QString &_filePath)
: AbstractExtItem(_parent, _filePath)
, ui(new Ui::ExtScript)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty())
ExtScript::readConfiguration();
readJsonFilters();
ui->setupUi(this);
ExtScript::translate();
m_values[tag("custom")] = "";
@ -59,7 +55,6 @@ ExtScript::~ExtScript()
m_process->kill();
m_process->deleteLater();
disconnect(this, SIGNAL(requestDataUpdate()), this, SLOT(startProcess()));
delete ui;
}
@ -67,7 +62,7 @@ ExtScript *ExtScript::copy(const QString &_fileName, const int _number)
{
qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
auto *item = new ExtScript(dynamic_cast<QWidget *>(parent()), _fileName);
auto item = new ExtScript(parent(), _fileName);
copyDefaults(item);
item->setExecutable(executable());
item->setNumber(_number);
@ -180,7 +175,7 @@ QString ExtScript::applyFilters(QString _value) const
for (auto &filt : filters()) {
qCInfo(LOG_LIB) << "Found filter" << filt;
QVariantMap filter = m_jsonFilters[filt].toMap();
auto filter = m_jsonFilters[filt].toMap();
if (filter.isEmpty()) {
qCWarning(LOG_LIB) << "Could not find filter" << _value << "in the json";
continue;
@ -226,7 +221,7 @@ void ExtScript::readConfiguration()
void ExtScript::readJsonFilters()
{
QString fileName = jsonFiltersFile();
auto fileName = jsonFiltersFile();
QFile jsonFile(fileName);
if (!jsonFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
qCWarning(LOG_LIB) << "Could not open" << fileName;
@ -236,7 +231,7 @@ void ExtScript::readJsonFilters()
jsonFile.close();
QJsonParseError error{};
QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonText.toUtf8(), &error);
auto jsonDoc = QJsonDocument::fromJson(jsonText.toUtf8(), &error);
if (error.error != QJsonParseError::NoError) {
qCWarning(LOG_LIB) << "Parse error" << error.errorString();
return;
@ -257,10 +252,15 @@ QVariantHash ExtScript::run()
}
int ExtScript::showConfiguration(const QVariant &_args)
int ExtScript::showConfiguration(QWidget *_parent, const QVariant &_args)
{
Q_UNUSED(_args)
auto dialog = new QDialog(_parent);
auto ui = new Ui::ExtScript();
ui->setupUi(dialog);
translate(ui);
ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment());
ui->label_numberValue->setText(QString("%1").arg(number()));
@ -275,25 +275,29 @@ int ExtScript::showConfiguration(const QVariant &_args)
ui->checkBox_linesFilter->setCheckState(filters().contains("newline") ? Qt::Checked : Qt::Unchecked);
ui->checkBox_spaceFilter->setCheckState(filters().contains("space") ? Qt::Checked : Qt::Unchecked);
int ret = exec();
if (ret != 1)
return ret;
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setNumber(ui->label_numberValue->text().toInt());
setApiVersion(AW_EXTSCRIPT_API);
setExecutable(ui->lineEdit_command->text());
setActive(ui->checkBox_active->checkState() == Qt::Checked);
setRedirect(static_cast<Redirect>(ui->comboBox_redirect->currentIndex()));
setCron(ui->lineEdit_schedule->text());
setSocket(ui->lineEdit_socket->text());
setInterval(ui->spinBox_interval->value());
// filters
updateFilter("color", ui->checkBox_colorFilter->checkState() == Qt::Checked);
updateFilter("newline", ui->checkBox_linesFilter->checkState() == Qt::Checked);
updateFilter("space", ui->checkBox_spaceFilter->checkState() == Qt::Checked);
int ret = dialog->exec();
if (ret == 1) {
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setNumber(ui->label_numberValue->text().toInt());
setApiVersion(AW_EXTSCRIPT_API);
setExecutable(ui->lineEdit_command->text());
setActive(ui->checkBox_active->checkState() == Qt::Checked);
setRedirect(static_cast<Redirect>(ui->comboBox_redirect->currentIndex()));
setCron(ui->lineEdit_schedule->text());
setSocket(ui->lineEdit_socket->text());
setInterval(ui->spinBox_interval->value());
// filters
updateFilter("color", ui->checkBox_colorFilter->checkState() == Qt::Checked);
updateFilter("newline", ui->checkBox_linesFilter->checkState() == Qt::Checked);
updateFilter("space", ui->checkBox_spaceFilter->checkState() == Qt::Checked);
writeConfiguration();
}
dialog->deleteLater();
delete ui;
writeConfiguration();
return ret;
}
@ -325,9 +329,9 @@ void ExtScript::startProcess()
void ExtScript::updateValue()
{
qCInfo(LOG_LIB) << "Cmd returns" << m_process->exitCode();
QString qdebug = QTextCodec::codecForMib(106)->toUnicode(m_process->readAllStandardError()).trimmed();
auto qdebug = QString::fromUtf8(m_process->readAllStandardError()).trimmed();
qCInfo(LOG_LIB) << "Error" << qdebug;
QString qoutput = QTextCodec::codecForMib(106)->toUnicode(m_process->readAllStandardOutput()).trimmed();
auto qoutput = QString::fromUtf8(m_process->readAllStandardOutput()).trimmed();
qCInfo(LOG_LIB) << "Output" << qoutput;
QString strValue;
@ -351,8 +355,10 @@ void ExtScript::updateValue()
}
void ExtScript::translate()
void ExtScript::translate(void *_ui)
{
auto ui = reinterpret_cast<Ui::ExtScript *>(_ui);
ui->label_name->setText(i18n("Name"));
ui->label_comment->setText(i18n("Comment"));
ui->label_number->setText(i18n("Tag"));

View File

@ -23,11 +23,6 @@
#include "abstractextitem.h"
namespace Ui
{
class ExtScript;
}
class ExtScript : public AbstractExtItem
{
Q_OBJECT
@ -38,7 +33,7 @@ class ExtScript : public AbstractExtItem
public:
enum class Redirect { stdout2stderr = 0, nothing = 1, stderr2stdout = 2, swap = 3 };
explicit ExtScript(QWidget *_parent = nullptr, const QString &_filePath = "");
explicit ExtScript(QObject *_parent = nullptr, const QString &_filePath = "");
~ExtScript() override;
ExtScript *copy(const QString &_fileName, int _number) override;
static QString jsonFiltersFile();
@ -62,7 +57,7 @@ public slots:
void readConfiguration() override;
void readJsonFilters();
QVariantHash run() override;
int showConfiguration(const QVariant &_args) override;
int showConfiguration(QWidget *_parent, const QVariant &_args) override;
void writeConfiguration() const override;
private slots:
@ -71,8 +66,7 @@ private slots:
private:
QProcess *m_process = nullptr;
Ui::ExtScript *ui = nullptr;
void translate() override;
void translate(void *_ui) override;
// properties
QString m_executable = "/usr/bin/true";
QStringList m_filters = QStringList();

View File

@ -21,21 +21,17 @@
#include <KI18n/KLocalizedString>
#include <QSettings>
#include <QTextCodec>
#include "awdebug.h"
ExtUpgrade::ExtUpgrade(QWidget *_parent, const QString &_filePath)
ExtUpgrade::ExtUpgrade(QObject *_parent, const QString &_filePath)
: AbstractExtItem(_parent, _filePath)
, ui(new Ui::ExtUpgrade)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty())
ExtUpgrade::readConfiguration();
ui->setupUi(this);
ExtUpgrade::translate();
m_values[tag("pkgcount")] = 0;
@ -54,7 +50,6 @@ ExtUpgrade::~ExtUpgrade()
m_process->kill();
m_process->deleteLater();
disconnect(this, SIGNAL(requestDataUpdate()), this, SLOT(startProcess()));
delete ui;
}
@ -62,7 +57,7 @@ ExtUpgrade *ExtUpgrade::copy(const QString &_fileName, const int _number)
{
qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
auto *item = new ExtUpgrade(dynamic_cast<QWidget *>(parent()), _fileName);
auto item = new ExtUpgrade(parent(), _fileName);
copyDefaults(item);
item->setExecutable(executable());
item->setFilter(filter());
@ -150,10 +145,15 @@ QVariantHash ExtUpgrade::run()
}
int ExtUpgrade::showConfiguration(const QVariant &_args)
int ExtUpgrade::showConfiguration(QWidget *_parent, const QVariant &_args)
{
Q_UNUSED(_args)
auto dialog = new QDialog(_parent);
auto ui = new Ui::ExtUpgrade();
ui->setupUi(dialog);
translate(ui);
ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment());
ui->label_numberValue->setText(QString("%1").arg(number()));
@ -165,22 +165,26 @@ int ExtUpgrade::showConfiguration(const QVariant &_args)
ui->lineEdit_socket->setText(socket());
ui->spinBox_interval->setValue(interval());
int ret = exec();
if (ret != 1)
return ret;
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setNumber(ui->label_numberValue->text().toInt());
setApiVersion(AW_EXTUPGRADE_API);
setExecutable(ui->lineEdit_command->text());
setFilter(ui->lineEdit_filter->text());
setActive(ui->checkBox_active->checkState() == Qt::Checked);
setNull(ui->spinBox_null->value());
setCron(ui->lineEdit_schedule->text());
setSocket(ui->lineEdit_socket->text());
setInterval(ui->spinBox_interval->value());
auto ret = dialog->exec();
if (ret == 1) {
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setNumber(ui->label_numberValue->text().toInt());
setApiVersion(AW_EXTUPGRADE_API);
setExecutable(ui->lineEdit_command->text());
setFilter(ui->lineEdit_filter->text());
setActive(ui->checkBox_active->checkState() == Qt::Checked);
setNull(ui->spinBox_null->value());
setCron(ui->lineEdit_schedule->text());
setSocket(ui->lineEdit_socket->text());
setInterval(ui->spinBox_interval->value());
writeConfiguration();
}
dialog->deleteLater();
delete ui;
writeConfiguration();
return ret;
}
@ -214,18 +218,20 @@ void ExtUpgrade::updateValue()
qCInfo(LOG_LIB) << "Cmd returns" << m_process->exitCode();
qCInfo(LOG_LIB) << "Error" << m_process->readAllStandardError();
QString qoutput = QTextCodec::codecForMib(106)->toUnicode(m_process->readAllStandardOutput()).trimmed();
auto qoutput = QString::fromUtf8(m_process->readAllStandardOutput()).trimmed();
m_values[tag("pkgcount")] = [this](const QString &output) {
return filter().isEmpty() ? output.split('\n', Qt::SkipEmptyParts).count() - null()
: output.split('\n', Qt::SkipEmptyParts).filter(QRegExp(filter())).count();
: output.split('\n', Qt::SkipEmptyParts).filter(QRegularExpression(filter())).count();
}(qoutput);
emit(dataReceived(m_values));
}
void ExtUpgrade::translate()
void ExtUpgrade::translate(void *_ui)
{
auto ui = reinterpret_cast<Ui::ExtUpgrade *>(_ui);
ui->label_name->setText(i18n("Name"));
ui->label_comment->setText(i18n("Comment"));
ui->label_number->setText(i18n("Tag"));

View File

@ -23,11 +23,6 @@
#include "abstractextitem.h"
namespace Ui
{
class ExtUpgrade;
}
class ExtUpgrade : public AbstractExtItem
{
Q_OBJECT
@ -36,7 +31,7 @@ class ExtUpgrade : public AbstractExtItem
Q_PROPERTY(int null READ null WRITE setNull)
public:
explicit ExtUpgrade(QWidget *_parent = nullptr, const QString &_filePath = "");
explicit ExtUpgrade(QObject *_parent = nullptr, const QString &_filePath = "");
~ExtUpgrade() override;
ExtUpgrade *copy(const QString &_fileName, int _number) override;
// get methods
@ -52,7 +47,7 @@ public:
public slots:
void readConfiguration() override;
QVariantHash run() override;
int showConfiguration(const QVariant &_args) override;
int showConfiguration(QWidget *_parent, const QVariant &_args) override;
void writeConfiguration() const override;
private slots:
@ -61,8 +56,7 @@ private slots:
private:
QProcess *m_process = nullptr;
Ui::ExtUpgrade *ui = nullptr;
void translate() override;
void translate(void *_ui) override;
// properties
QString m_executable = "/usr/bin/true";
QString m_filter = "";

View File

@ -29,20 +29,16 @@
#include "awdebug.h"
#include "owmweatherprovider.h"
#include "yahooweatherprovider.h"
ExtWeather::ExtWeather(QWidget *_parent, const QString &_filePath)
ExtWeather::ExtWeather(QObject *_parent, const QString &_filePath)
: AbstractExtItem(_parent, _filePath)
, ui(new Ui::ExtWeather)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty())
ExtWeather::readConfiguration();
readJsonMap();
ui->setupUi(this);
ExtWeather::translate();
m_values[tag("weatherId")] = 0;
m_values[tag("weather")] = "";
@ -67,7 +63,6 @@ ExtWeather::~ExtWeather()
disconnect(this, SIGNAL(requestDataUpdate()), this, SLOT(sendRequest()));
m_manager->deleteLater();
delete ui;
}
@ -75,7 +70,7 @@ ExtWeather *ExtWeather::copy(const QString &_fileName, const int _number)
{
qCDebug(LOG_LIB) << "File" << _fileName << "number" << _number;
auto *item = new ExtWeather(dynamic_cast<QWidget *>(parent()), _fileName);
auto item = new ExtWeather(parent(), _fileName);
copyDefaults(item);
item->setCity(city());
item->setCountry(country());
@ -102,7 +97,7 @@ QString ExtWeather::weatherFromInt(const int _id) const
{
qCDebug(LOG_LIB) << "Weather ID" << _id;
QVariantMap map = m_jsonMap[m_image ? "image" : "text"].toMap();
auto map = m_jsonMap[m_image ? "image" : "text"].toMap();
return map.value(QString::number(_id), map["default"]).toString();
}
@ -236,7 +231,7 @@ void ExtWeather::readConfiguration()
void ExtWeather::readJsonMap()
{
QString fileName = jsonMapFile();
auto fileName = jsonMapFile();
QFile jsonFile(fileName);
if (!jsonFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
qCWarning(LOG_LIB) << "Could not open" << fileName;
@ -246,7 +241,7 @@ void ExtWeather::readJsonMap()
jsonFile.close();
QJsonParseError error{};
QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonText.toUtf8(), &error);
auto jsonDoc = QJsonDocument::fromJson(jsonText.toUtf8(), &error);
if (error.error != QJsonParseError::NoError) {
qCWarning(LOG_LIB) << "Parse error" << error.errorString();
return;
@ -267,10 +262,15 @@ QVariantHash ExtWeather::run()
}
int ExtWeather::showConfiguration(const QVariant &_args)
int ExtWeather::showConfiguration(QWidget *_parent, const QVariant &_args)
{
Q_UNUSED(_args)
auto dialog = new QDialog(_parent);
auto ui = new Ui::ExtWeather();
ui->setupUi(dialog);
translate(ui);
ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment());
ui->label_numberValue->setText(QString("%1").arg(number()));
@ -284,24 +284,28 @@ int ExtWeather::showConfiguration(const QVariant &_args)
ui->lineEdit_socket->setText(socket());
ui->spinBox_interval->setValue(interval());
int ret = exec();
if (ret != 1)
return ret;
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setNumber(ui->label_numberValue->text().toInt());
setApiVersion(AW_EXTWEATHER_API);
setCity(ui->lineEdit_city->text());
setCountry(ui->lineEdit_country->text());
setProvider(static_cast<Provider>(ui->comboBox_provider->currentIndex()));
setTs(ui->spinBox_timestamp->value());
setImage(ui->checkBox_image->checkState() == Qt::Checked);
setActive(ui->checkBox_active->checkState() == Qt::Checked);
setCron(ui->lineEdit_schedule->text());
setSocket(ui->lineEdit_socket->text());
setInterval(ui->spinBox_interval->value());
int ret = dialog->exec();
if (ret == 1) {
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setNumber(ui->label_numberValue->text().toInt());
setApiVersion(AW_EXTWEATHER_API);
setCity(ui->lineEdit_city->text());
setCountry(ui->lineEdit_country->text());
setProvider(static_cast<Provider>(ui->comboBox_provider->currentIndex()));
setTs(ui->spinBox_timestamp->value());
setImage(ui->checkBox_image->checkState() == Qt::Checked);
setActive(ui->checkBox_active->checkState() == Qt::Checked);
setCron(ui->lineEdit_schedule->text());
setSocket(ui->lineEdit_socket->text());
setInterval(ui->spinBox_interval->value());
writeConfiguration();
}
dialog->deleteLater();
delete ui;
writeConfiguration();
return ret;
}
@ -328,7 +332,7 @@ void ExtWeather::writeConfiguration() const
void ExtWeather::sendRequest()
{
m_isRunning = true;
QNetworkReply *reply = m_manager->get(QNetworkRequest(m_providerObject->url()));
auto reply = m_manager->get(QNetworkRequest(m_providerObject->url()));
new QReplyTimeout(reply, REQUEST_TIMEOUT);
}
@ -342,14 +346,14 @@ void ExtWeather::weatherReplyReceived(QNetworkReply *_reply)
m_isRunning = false;
QJsonParseError error{};
QJsonDocument jsonDoc = QJsonDocument::fromJson(_reply->readAll(), &error);
auto jsonDoc = QJsonDocument::fromJson(_reply->readAll(), &error);
_reply->deleteLater();
if (error.error != QJsonParseError::NoError) {
qCWarning(LOG_LIB) << "Parse error" << error.errorString();
return;
}
QVariantHash data = m_providerObject->parse(jsonDoc.toVariant().toMap());
auto data = m_providerObject->parse(jsonDoc.toVariant().toMap());
if (data.isEmpty())
return;
m_values = data;
@ -370,8 +374,10 @@ void ExtWeather::initProvider()
}
void ExtWeather::translate()
void ExtWeather::translate(void *_ui)
{
auto ui = reinterpret_cast<Ui::ExtWeather *>(_ui);
ui->label_name->setText(i18n("Name"));
ui->label_comment->setText(i18n("Comment"));
ui->label_number->setText(i18n("Tag"));

View File

@ -42,7 +42,7 @@ class ExtWeather : public AbstractExtItem
public:
enum class Provider { OWM = 0, Yahoo = 1 };
explicit ExtWeather(QWidget *_parent = nullptr, const QString &_filePath = "");
explicit ExtWeather(QObject *_parent = nullptr, const QString &_filePath = "");
~ExtWeather() override;
ExtWeather *copy(const QString &_fileName, int _number) override;
static QString jsonMapFile();
@ -67,7 +67,7 @@ public slots:
void readConfiguration() override;
void readJsonMap();
QVariantHash run() override;
int showConfiguration(const QVariant &_args) override;
int showConfiguration(QWidget *_parent, const QVariant &_args) override;
void writeConfiguration() const override;
private slots:
@ -78,9 +78,8 @@ private:
AbstractWeatherProvider *m_providerObject = nullptr;
QNetworkAccessManager *m_manager = nullptr;
bool m_isRunning = false;
Ui::ExtWeather *ui = nullptr;
void initProvider();
void translate() override;
void translate(void *_ui) override;
// properties
QString m_city = "London";
QString m_country = "uk";

View File

@ -32,9 +32,8 @@
#include "graphicalitemhelper.h"
GraphicalItem::GraphicalItem(QWidget *_parent, const QString &_filePath)
GraphicalItem::GraphicalItem(QObject *_parent, const QString &_filePath)
: AbstractExtItem(_parent, _filePath)
, ui(new Ui::GraphicalItem)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
@ -53,21 +52,6 @@ GraphicalItem::GraphicalItem(QWidget *_parent, const QString &_filePath)
if (!_filePath.isEmpty())
GraphicalItem::readConfiguration();
ui->setupUi(this);
GraphicalItem::translate();
connect(ui->checkBox_custom, SIGNAL(stateChanged(int)), this, SLOT(changeValue(int)));
connect(ui->comboBox_type, SIGNAL(currentIndexChanged(int)), this, SLOT(changeCountState(int)));
connect(ui->toolButton_activeColor, SIGNAL(clicked()), this, SLOT(changeColor()));
connect(ui->toolButton_inactiveColor, SIGNAL(clicked()), this, SLOT(changeColor()));
}
GraphicalItem::~GraphicalItem()
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
delete ui;
}
@ -75,7 +59,7 @@ GraphicalItem *GraphicalItem::copy(const QString &_fileName, const int _number)
{
qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
auto *item = new GraphicalItem(dynamic_cast<QWidget *>(parent()), _fileName);
auto item = new GraphicalItem(parent(), _fileName);
copyDefaults(item);
item->setActiveColor(activeColor());
item->setBar(bar());
@ -100,7 +84,7 @@ QString GraphicalItem::image(const QVariant &value)
m_scene->clear();
int scale[2] = {1, 1};
float converted = GraphicalItemHelper::getPercents(value.toFloat(), minValue(), maxValue());
auto converted = GraphicalItemHelper::getPercents(value.toFloat(), minValue(), maxValue());
// paint
switch (m_type) {
@ -132,11 +116,11 @@ QString GraphicalItem::image(const QVariant &value)
}
// convert
QPixmap pixmap = m_view->grab().transformed(QTransform().scale(scale[0], scale[1]));
auto pixmap = m_view->grab().transformed(QTransform().scale(scale[0], scale[1]));
QByteArray byteArray;
QBuffer buffer(&byteArray);
pixmap.save(&buffer, "PNG");
QString url = QString("<img src=\"data:image/png;base64,%1\"/>").arg(QString(byteArray.toBase64()));
auto url = QString("<img src=\"data:image/png;base64,%1\"/>").arg(QString(byteArray.toBase64()));
return url;
}
@ -438,10 +422,21 @@ void GraphicalItem::readConfiguration()
}
int GraphicalItem::showConfiguration(const QVariant &_args)
int GraphicalItem::showConfiguration(QWidget *_parent, const QVariant &_args)
{
qCDebug(LOG_LIB) << "Combobox arguments" << _args;
QStringList tags = _args.toStringList();
auto tags = _args.toStringList();
auto dialog = new QDialog(_parent);
auto ui = new Ui::GraphicalItem();
ui->setupUi(dialog);
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->toolButton_activeColor, &QToolButton::clicked, [this, ui]() { changeColor(ui); });
connect(ui->toolButton_inactiveColor, &QToolButton::clicked, [this, ui]() { changeColor(ui); });
ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment());
@ -476,25 +471,29 @@ int GraphicalItem::showConfiguration(const QVariant &_args)
emit(ui->comboBox_type->currentIndexChanged(ui->comboBox_type->currentIndex()));
emit(ui->checkBox_custom->stateChanged(ui->checkBox_custom->checkState()));
int ret = exec();
if (ret != 1)
return ret;
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_GRAPHITEM_API);
setCount(ui->spinBox_count->value());
setCustom(ui->checkBox_custom->isChecked());
setBar(m_custom ? ui->lineEdit_customValue->text() : ui->comboBox_value->currentText());
setMaxValue(static_cast<float>(ui->doubleSpinBox_max->value()));
setMinValue(static_cast<float>(ui->doubleSpinBox_min->value()));
setActiveColor(ui->lineEdit_activeColor->text());
setInactiveColor(ui->lineEdit_inactiveColor->text());
setType(static_cast<Type>(ui->comboBox_type->currentIndex()));
setDirection(static_cast<Direction>(ui->comboBox_direction->currentIndex()));
setItemHeight(ui->spinBox_height->value());
setItemWidth(ui->spinBox_width->value());
int ret = dialog->exec();
if (ret == 1) {
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_GRAPHITEM_API);
setCount(ui->spinBox_count->value());
setCustom(ui->checkBox_custom->isChecked());
setBar(m_custom ? ui->lineEdit_customValue->text() : ui->comboBox_value->currentText());
setMaxValue(static_cast<float>(ui->doubleSpinBox_max->value()));
setMinValue(static_cast<float>(ui->doubleSpinBox_min->value()));
setActiveColor(ui->lineEdit_activeColor->text());
setInactiveColor(ui->lineEdit_inactiveColor->text());
setType(static_cast<Type>(ui->comboBox_type->currentIndex()));
setDirection(static_cast<Direction>(ui->comboBox_direction->currentIndex()));
setItemHeight(ui->spinBox_height->value());
setItemWidth(ui->spinBox_width->value());
writeConfiguration();
}
dialog->deleteLater();
delete ui;
writeConfiguration();
return ret;
}
@ -524,23 +523,23 @@ void GraphicalItem::writeConfiguration() const
}
void GraphicalItem::changeColor()
void GraphicalItem::changeColor(Ui::GraphicalItem *_ui)
{
QLineEdit *lineEdit;
int state;
if (sender() == ui->toolButton_activeColor) {
lineEdit = ui->lineEdit_activeColor;
state = ui->comboBox_activeImageType->currentIndex();
if (sender() == _ui->toolButton_activeColor) {
lineEdit = _ui->lineEdit_activeColor;
state = _ui->comboBox_activeImageType->currentIndex();
} else {
lineEdit = ui->lineEdit_inactiveColor;
state = ui->comboBox_inactiveImageType->currentIndex();
lineEdit = _ui->lineEdit_inactiveColor;
state = _ui->comboBox_inactiveImageType->currentIndex();
}
qCInfo(LOG_LIB) << "Using state" << state << "and lineEdit" << lineEdit;
QString outputColor;
if (state == 0) {
QColor color = GraphicalItemHelper::stringToColor(lineEdit->text());
QColor newColor = QColorDialog::getColor(color, this, i18n("Select color"), QColorDialog::ShowAlphaChannel);
auto color = GraphicalItemHelper::stringToColor(lineEdit->text());
auto newColor = QColorDialog::getColor(color, nullptr, i18n("Select color"), QColorDialog::ShowAlphaChannel);
if (!newColor.isValid())
return;
qCInfo(LOG_LIB) << "Selected color" << newColor;
@ -553,9 +552,9 @@ void GraphicalItem::changeColor()
outputColor = QString("color://%1").arg(colorText.join(','));
} else if (state == 1) {
QString path = lineEdit->text();
QString directory = QFileInfo(path).absolutePath();
outputColor = QFileDialog::getOpenFileUrl(this, i18n("Select path"), directory,
auto path = lineEdit->text();
auto directory = QFileInfo(path).absolutePath();
outputColor = QFileDialog::getOpenFileUrl(nullptr, i18n("Select path"), directory,
i18n("Images (*.png *.bpm *.jpg);;All files (*.*)"))
.toString();
@ -570,26 +569,28 @@ void GraphicalItem::changeColor()
}
void GraphicalItem::changeCountState(const int _state)
void GraphicalItem::changeCountState(Ui::GraphicalItem *_ui, const int _state)
{
qCDebug(LOG_LIB) << "Current state is" << _state;
// 3 is magic number. Actually 3 is Graph mode
ui->widget_count->setHidden(_state != 3);
_ui->widget_count->setHidden(_state != 3);
}
void GraphicalItem::changeValue(const int _state)
void GraphicalItem::changeValue(Ui::GraphicalItem *_ui, const int _state)
{
qCDebug(LOG_LIB) << "Current state is" << _state;
ui->widget_value->setHidden(_state != Qt::Unchecked);
ui->widget_customValue->setHidden(_state == Qt::Unchecked);
_ui->widget_value->setHidden(_state != Qt::Unchecked);
_ui->widget_customValue->setHidden(_state == Qt::Unchecked);
}
void GraphicalItem::translate()
void GraphicalItem::translate(void *_ui)
{
auto ui = reinterpret_cast<Ui::GraphicalItem *>(_ui);
ui->label_name->setText(i18n("Name"));
ui->label_comment->setText(i18n("Comment"));
ui->label_number->setText(i18n("Tag"));

View File

@ -52,8 +52,7 @@ public:
enum class Direction { LeftToRight = 0, RightToLeft = 1 };
enum class Type { Horizontal = 0, Vertical = 1, Circle = 2, Graph = 3, Bars = 4 };
explicit GraphicalItem(QWidget *_parent = nullptr, const QString &_filePath = "");
~GraphicalItem() override;
explicit GraphicalItem(QObject *_parent = nullptr, const QString &_filePath = "");
GraphicalItem *copy(const QString &_fileName, int _number) override;
QString image(const QVariant &value);
void initScene();
@ -92,20 +91,19 @@ public:
public slots:
void readConfiguration() override;
QVariantHash run() override { return {}; };
int showConfiguration(const QVariant &_args) override;
int showConfiguration(QWidget *_parent, const QVariant &_args) override;
void writeConfiguration() const override;
private slots:
void changeColor();
void changeCountState(int _state);
void changeValue(int _state);
void changeColor(Ui::GraphicalItem *_ui);
void changeCountState(Ui::GraphicalItem *_ui, int _state);
void changeValue(Ui::GraphicalItem *_ui, int _state);
private:
GraphicalItemHelper *m_helper = nullptr;
QGraphicsScene *m_scene = nullptr;
QGraphicsView *m_view = nullptr;
Ui::GraphicalItem *ui = nullptr;
void translate() override;
void translate(void *_ui) override;
// properties
QString m_bar = "cpu";
int m_count = 100;

View File

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

View File

@ -17,7 +17,6 @@
#include "stooqquotesprovider.h"
#include <QTextCodec>
#include <QUrlQuery>
#include "awdebug.h"
@ -55,7 +54,7 @@ QVariantHash StooqQuotesProvider::parse(const QByteArray &_source, const QVarian
QVariantHash values;
QStringList sourceValues = QTextCodec::codecForMib(106)->toUnicode(_source).trimmed().split(',');
QStringList sourceValues = QString::fromUtf8(_source).trimmed().split(',');
if (sourceValues.count() != 2) {
qCWarning(LOG_LIB) << "Parse error" << sourceValues;
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"].toFloat() / 33.863753);
values[tag("pressure")] = static_cast<int>(_atmosphere["pressure"].toDouble() / 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"].toFloat() + weatherMap["low"].toFloat()) / 2.0;
values[tag("temperature")] = (weatherMap["high"].toDouble() + weatherMap["low"].toDouble()) / 2.0;
// ... and no forecast data for humidity and pressure
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.desktop ${CMAKE_CURRENT_SOURCE_DIR}/package/metadata.desktop)
configure_file(metadata.json ${CMAKE_CURRENT_SOURCE_DIR}/package/metadata.json)
add_subdirectory(plugin)
plasma_install_package(package org.kde.plasma.desktoppanel)

View File

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

View File

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

View File

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

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -6,15 +6,15 @@ include_directories(
${CMAKE_BINARY_DIR}
${PROJECT_TRDPARTY_DIR}
${Qt_INCLUDE}
${Kf5_INCLUDE}
${Kf6_INCLUDE}
)
file(GLOB SUBPROJECT_SOURCE *.cpp ${PROJECT_TRDPARTY_DIR}/fontdialog/*.cpp ${CMAKE_SOURCE_DIR}/*.cpp)
file(GLOB SUBPROJECT_NOTIFY *.notifyrc)
add_library(${PLUGIN_NAME} SHARED ${SUBPROJECT_SOURCE})
target_link_libraries(${PLUGIN_NAME} ${Qt_LIBRARIES} ${Kf5_LIBRARIES})
target_link_libraries(${PLUGIN_NAME} ${Qt_LIBRARIES} ${Kf6_LIBRARIES})
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 ${KNOTIFYRC_INSTALL_DIR})
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(FILES ${SUBPROJECT_NOTIFY} DESTINATION ${KDE_INSTALL_KNOTIFYRCDIR})

View File

@ -92,7 +92,7 @@ QStringList DPAdds::dictKeys(const bool _sorted, const QString &_regexp)
if (_sorted)
allKeys.sort();
return allKeys.filter(QRegExp(_regexp));
return allKeys.filter(QRegularExpression(_regexp));
}
@ -223,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.count(), QLatin1Char(' ')).replace(" ", "&nbsp;");
return QString("%1").arg(currentMark, m_mark.size(), QLatin1Char(' ')).replace(" ", "&nbsp;");
else if (_key == "name") {
auto name = m_vdi->desktopNames().at(_desktop);
return name.replace(" ", "&nbsp;");

View File

@ -1,4 +1,4 @@
set(SUBPROJECT plasma_dataengine_extsysmon)
set(SUBPROJECT ksystemstats_plugin_extsysmon)
message(STATUS "Subproject ${SUBPROJECT}")
add_definitions(-DTRANSLATION_DOMAIN=\"plasma_applet_org.kde.plasma.awesomewidget\")
@ -9,27 +9,19 @@ include_directories(
${CMAKE_CURRENT_SOURCE_DIR}/../${PROJECT_MONITORSOURCES}/
${PROJECT_TRDPARTY_DIR}
${Qt_INCLUDE}
${Kf5_INCLUDE}
${Kf6_INCLUDE}
)
file(GLOB SUBPROJECT_DESKTOP_IN *.desktop)
file(RELATIVE_PATH SUBPROJECT_DESKTOP ${CMAKE_SOURCE_DIR} ${SUBPROJECT_DESKTOP_IN})
file(GLOB SUBPROJECT_SOURCE *.cpp ${CMAKE_SOURCE_DIR}/*.cpp)
file(GLOB SUBPROJECT_HEADER *.h)
file(GLOB SUBPROJECT_CONF *.conf)
# prepare
configure_file(${SUBPROJECT_DESKTOP_IN} ${CMAKE_CURRENT_BINARY_DIR}/${SUBPROJECT_DESKTOP})
# make
add_library(${SUBPROJECT} MODULE ${SUBPROJECT_SOURCE} ${SUBPROJECT_HEADER})
target_link_libraries(${SUBPROJECT}
${PROJECT_LIBRARY} ${PROJECT_MONITORSOURCES}
${Qt_LIBRARIES} ${Kf5_LIBRARIES})
kcoreaddons_desktop_to_json(${SUBPROJECT} ${CMAKE_CURRENT_BINARY_DIR}/${SUBPROJECT_DESKTOP}
SERVICE_TYPES plasma-dataengine.desktop)
${Qt_LIBRARIES} ${Kf6_LIBRARIES})
# install
install(TARGETS ${SUBPROJECT} DESTINATION ${PLUGIN_INSTALL_DIR}/plasma/dataengine)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${SUBPROJECT_DESKTOP} DESTINATION ${SERVICES_INSTALL_DIR})
install(FILES ${SUBPROJECT_CONF} DESTINATION ${CONFIG_INSTALL_DIR})
install(TARGETS ${SUBPROJECT} DESTINATION ${KDE_INSTALL_PLUGINDIR}/ksystemstats)
install(FILES ${SUBPROJECT_CONF} DESTINATION /${KDE_INSTALL_CONFDIR})

View File

@ -17,7 +17,11 @@
#include "extsysmon.h"
#include <KPluginFactory>
#include <QDBusMetaType>
#include <QFile>
#include <QRegularExpression>
#include <QSettings>
#include <QStandardPaths>
@ -28,65 +32,21 @@
ExtendedSysMon::ExtendedSysMon(QObject *_parent, const QVariantList &_args)
: Plasma::DataEngine(_parent, _args)
: KSysGuard::SensorPlugin(_parent, _args)
{
Q_UNUSED(_args)
qSetMessagePattern(AWDebug::LOG_FORMAT);
qCDebug(LOG_ESM) << __PRETTY_FUNCTION__;
for (auto &metadata : AWDebug::getBuildData())
qCDebug(LOG_ESM) << metadata;
setMinimumPollingInterval(333);
readConfiguration();
// init aggregator
m_aggregator = new ExtSysMonAggregator(this, m_configuration);
for (auto &source : m_aggregator->sources())
setData(source, m_aggregator->initialData(source));
}
ExtendedSysMon::~ExtendedSysMon()
{
qCDebug(LOG_ESM) << __PRETTY_FUNCTION__;
}
QStringList ExtendedSysMon::sources() const
{
return m_aggregator->sources();
}
bool ExtendedSysMon::sourceRequestEvent(const QString &_source)
{
qCDebug(LOG_ESM) << "Source" << _source;
return updateSourceEvent(_source);
}
bool ExtendedSysMon::updateSourceEvent(const QString &_source)
{
qCDebug(LOG_ESM) << "Source" << _source;
if (m_aggregator->hasSource(_source)) {
QVariant data = m_aggregator->data(_source);
if (data.isNull())
return false;
setData(_source, "value", data);
} else {
qCWarning(LOG_ESM) << "Unknown source" << _source;
return false;
}
return true;
addContainer(new ExtSysMonAggregator("extsysmon", "Extended system monitor", this, m_configuration));
}
void ExtendedSysMon::readConfiguration()
{
QString fileName = QStandardPaths::locate(QStandardPaths::ConfigLocation, "plasma-dataengine-extsysmon.conf");
auto fileName = QStandardPaths::locate(QStandardPaths::ConfigLocation, "plasma-dataengine-extsysmon.conf");
qCInfo(LOG_ESM) << "Configuration file" << fileName;
QSettings settings(fileName, QSettings::IniFormat);
QHash<QString, QString> rawConfig;
@ -119,15 +79,15 @@ QHash<QString, QString> ExtendedSysMon::updateConfiguration(QHash<QString, QStri
else if ((_rawConfig["GPUDEV"] != "ati") && (_rawConfig["GPUDEV"] != "nvidia"))
_rawConfig["GPUDEV"] = GPULoadSource::autoGpu();
// hdddev
QStringList allHddDevices = HDDTemperatureSource::allHdd();
auto 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);
auto deviceList = _rawConfig["HDDDEV"].split(',', Qt::SkipEmptyParts);
QStringList devices;
QRegExp diskRegexp = QRegExp("^/dev/[hms]d[a-z]$");
auto diskRegexp = QRegularExpression("^/dev/[hms]d[a-z]$");
for (auto &device : deviceList)
if ((QFile::exists(device)) && (device.contains(diskRegexp)))
devices.append(device);
@ -149,6 +109,6 @@ QHash<QString, QString> ExtendedSysMon::updateConfiguration(QHash<QString, QStri
}
K_EXPORT_PLASMA_DATAENGINE_WITH_JSON(extsysmon, ExtendedSysMon, "plasma-dataengine-extsysmon.json")
K_PLUGIN_CLASS_WITH_JSON(ExtendedSysMon, "metadata.json")
#include "extsysmon.moc"

View File

@ -18,27 +18,19 @@
#ifndef EXTSYSMON_H
#define EXTSYSMON_H
#include <Plasma/DataEngine>
#include <ksysguard/systemstats/SensorPlugin.h>
class ExtSysMonAggregator;
class ExtendedSysMon : public Plasma::DataEngine
class ExtendedSysMon : public KSysGuard::SensorPlugin
{
Q_OBJECT
public:
explicit ExtendedSysMon(QObject *_parent, const QVariantList &_args);
~ExtendedSysMon() override;
protected:
[[nodiscard]] QStringList sources() const override;
bool sourceRequestEvent(const QString &_source) override;
bool updateSourceEvent(const QString &_source) override;
[[nodiscard]] QString providerName() const override { return QStringLiteral("extsysmon"); }
private:
// configuration
ExtSysMonAggregator *m_aggregator = nullptr;
QHash<QString, QString> m_configuration;
// methods
void readConfiguration();

View File

@ -21,6 +21,7 @@
#include "batterysource.h"
#include "customsource.h"
#include "desktopsource.h"
#include "extsysmonsensor.h"
#include "gpuloadsource.h"
#include "gputempsource.h"
#include "hddtempsource.h"
@ -31,12 +32,14 @@
#include "quotessource.h"
#include "requestsource.h"
#include "systeminfosource.h"
#include "timesource.h"
#include "upgradesource.h"
#include "weathersource.h"
ExtSysMonAggregator::ExtSysMonAggregator(QObject *_parent, const QHash<QString, QString> &_config)
: QObject(_parent)
ExtSysMonAggregator::ExtSysMonAggregator(const QString &_id, const QString &_name, KSysGuard::SensorPlugin *_parent,
const QHash<QString, QString> &_config)
: KSysGuard::SensorContainer(_id, _name, _parent)
{
qCDebug(LOG_ESM) << __PRETTY_FUNCTION__;
@ -44,41 +47,11 @@ ExtSysMonAggregator::ExtSysMonAggregator(QObject *_parent, const QHash<QString,
}
ExtSysMonAggregator::~ExtSysMonAggregator()
void ExtSysMonAggregator::createSensor(const QString &_id, const QString &_name, AbstractExtSysMonSource *_source)
{
qCDebug(LOG_ESM) << __PRETTY_FUNCTION__;
qCDebug(LOG_ESM) << "Register sensor" << _name << "with id" << _id;
m_map.clear();
}
QVariant ExtSysMonAggregator::data(const QString &_source) const
{
qCDebug(LOG_ESM) << "Source" << _source;
return m_map[_source]->data(_source);
}
bool ExtSysMonAggregator::hasSource(const QString &_source) const
{
qCDebug(LOG_ESM) << "Source" << _source;
return m_map.contains(_source);
}
QVariantMap ExtSysMonAggregator::initialData(const QString &_source) const
{
qCDebug(LOG_ESM) << "Source" << _source;
return hasSource(_source) ? m_map[_source]->initialData(_source) : QVariantMap();
}
QStringList ExtSysMonAggregator::sources() const
{
return m_map.keys();
addObject(new ExtSysMonSensor(this, _id, _name, _source));
}
@ -87,68 +60,41 @@ void ExtSysMonAggregator::init(const QHash<QString, QString> &_config)
qCDebug(LOG_ESM) << "Configuration" << _config;
// battery
AbstractExtSysMonSource *batteryItem = new BatterySource(this, QStringList() << _config["ACPIPATH"]);
for (auto &source : batteryItem->sources())
m_map[source] = batteryItem;
createSensor("battery", i18n("Battery"), new BatterySource(this, {_config["ACPIPATH"]}));
// custom
AbstractExtSysMonSource *customItem = new CustomSource(this, QStringList());
for (auto &source : customItem->sources())
m_map[source] = customItem;
createSensor("custom", i18n("Scripts"), new CustomSource(this, {}));
// desktop
AbstractExtSysMonSource *desktopItem = new DesktopSource(this, QStringList());
for (auto &source : desktopItem->sources())
m_map[source] = desktopItem;
// FIXME causes segfault in kde libs
// createSensor("desktop", i18n("Desktop"), new DesktopSource(this, {}));
// gpu load
AbstractExtSysMonSource *gpuLoadItem = new GPULoadSource(this, QStringList({_config["GPUDEV"]}));
for (auto &source : gpuLoadItem->sources())
m_map[source] = gpuLoadItem;
createSensor("gpuload", i18n("GPU load"), new GPULoadSource(this, {_config["GPUDEV"]}));
// gpu temperature
AbstractExtSysMonSource *gpuTempItem = new GPUTemperatureSource(this, QStringList({_config["GPUDEV"]}));
for (auto &source : gpuTempItem->sources())
m_map[source] = gpuTempItem;
createSensor("gputemp", i18n("GPU temperature"), new GPUTemperatureSource(this, {_config["GPUDEV"]}));
// hdd temperature
AbstractExtSysMonSource *hddTempItem
= new HDDTemperatureSource(this, QStringList({_config["HDDDEV"], _config["HDDTEMPCMD"]}));
for (auto &source : hddTempItem->sources())
m_map[source] = hddTempItem;
createSensor("hdd", i18n("HDD temperature"),
new HDDTemperatureSource(this, {_config["HDDDEV"], _config["HDDTEMPCMD"]}));
// network
AbstractExtSysMonSource *networkItem = new NetworkSource(this, QStringList());
for (auto &source : networkItem->sources())
m_map[source] = networkItem;
createSensor("network", i18n("Network"), new NetworkSource(this, {}));
// player
AbstractExtSysMonSource *playerItem
= new PlayerSource(this, QStringList({_config["PLAYER"], _config["MPDADDRESS"], _config["MPDPORT"],
_config["MPRIS"], _config["PLAYERSYMBOLS"]}));
for (auto &source : playerItem->sources())
m_map[source] = playerItem;
createSensor("player", i18n("Music player"),
new PlayerSource(this, {_config["PLAYER"], _config["MPDADDRESS"], _config["MPDPORT"], _config["MPRIS"],
_config["PLAYERSYMBOLS"]}));
// processes
AbstractExtSysMonSource *processesItem = new ProcessesSource(this, QStringList());
for (auto &source : processesItem->sources())
m_map[source] = processesItem;
createSensor("ps", i18n("Processes"), new ProcessesSource(this, {}));
// network request
AbstractExtSysMonSource *requestItem = new RequestSource(this, QStringList());
for (auto &source : requestItem->sources())
m_map[source] = requestItem;
createSensor("requests", i18n("Network requests"), new RequestSource(this, {}));
// quotes
AbstractExtSysMonSource *quotesItem = new QuotesSource(this, QStringList());
for (auto &source : quotesItem->sources())
m_map[source] = quotesItem;
createSensor("quotes", i18n("Quotes"), new QuotesSource(this, {}));
// system
AbstractExtSysMonSource *systemItem = new SystemInfoSource(this, QStringList());
for (auto &source : systemItem->sources())
m_map[source] = systemItem;
createSensor("system", i18n("System"), new SystemInfoSource(this, {}));
// current time
createSensor("time", i18n("Time"), new TimeSource(this, {}));
// upgrade
AbstractExtSysMonSource *upgradeItem = new UpgradeSource(this, QStringList());
for (auto &source : upgradeItem->sources())
m_map[source] = upgradeItem;
createSensor("upgrade", i18n("Upgrades"), new UpgradeSource(this, {}));
// weather
AbstractExtSysMonSource *weatherItem = new WeatherSource(this, QStringList());
for (auto &source : weatherItem->sources())
m_map[source] = weatherItem;
createSensor("weather", i18n("Weather"), new WeatherSource(this, {}));
#ifdef BUILD_LOAD
// additional load source
AbstractExtSysMonSource *loadItem = new LoadSource(this, QStringList());
for (auto &source : loadItem->sources())
m_map[source] = loadItem;
createSensor("load", i18n("Load"), new LoadSource(this, {}));
#endif /* BUILD_LOAD */
}

View File

@ -15,30 +15,26 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#ifndef EXTSYSMONAGGREGATOR_H
#define EXTSYSMONAGGREGATOR_H
#pragma once
#include <QObject>
#include <ksysguard/systemstats/SensorContainer.h>
#include "abstractextsysmonsource.h"
class ExtSysMonAggregator : public QObject
class AbstractExtSysMonSource;
class ExtSysMonSensor;
class ExtSysMonAggregator : public KSysGuard::SensorContainer
{
Q_OBJECT
public:
explicit ExtSysMonAggregator(QObject *_parent, const QHash<QString, QString> &_config);
~ExtSysMonAggregator() override;
[[nodiscard]] QVariant data(const QString &_source) const;
[[nodiscard]] bool hasSource(const QString &_source) const;
[[nodiscard]] QVariantMap initialData(const QString &_source) const;
[[nodiscard]] QStringList sources() const;
explicit ExtSysMonAggregator(const QString &_id, const QString &_name, KSysGuard::SensorPlugin *_parent,
const QHash<QString, QString> &_config);
private:
void createSensor(const QString &_id, const QString &_name, AbstractExtSysMonSource *_source);
void init(const QHash<QString, QString> &_config);
QHash<QString, AbstractExtSysMonSource *> m_map;
};
#endif /* EXTSYSMONAGGREGATOR_H */

View File

@ -0,0 +1,3 @@
{
"providerName": "extsysmon"
}

View File

@ -1,16 +0,0 @@
[Desktop Entry]
Encoding=UTF-8
Name=Extended SystemMonitor
Comment=Adds some additional functions to System DataEngine
ServiceTypes=Plasma/DataEngine
Type=Service
Icon=utilities-system-monitor
X-KDE-Library=plasma_dataengine_extsysmon
X-KDE-PluginInfo-Author=Evgeniy Alekseev aka arcanis
X-KDE-PluginInfo-Email=esalexeev@gmail.com
X-KDE-PluginInfo-Name=extsysmon
X-KDE-PluginInfo-Version=@PROJECT_VERSION@
X-KDE-PluginInfo-Category=System Information
X-KDE-PluginInfo-License=GPL3

View File

@ -8,11 +8,11 @@ include_directories(
${CMAKE_CURRENT_SOURCE_DIR}/../${PROJECT_LIBRARY}/
${PROJECT_TRDPARTY_DIR}
${Qt_INCLUDE}
${Kf5_INCLUDE}
${Kf6_INCLUDE}
)
file(GLOB SUBPROJECT_SOURCE *.cpp)
file(GLOB SUBPROJECT_HEADER *.h)
add_library(${SUBPROJECT} STATIC ${SUBPROJECT_SOURCE} ${SUBPROJECT_HEADER})
target_link_libraries(${SUBPROJECT} ${PROJECT_LIBRARY} ${Qt_LIBRARIES} ${Kf5_LIBRARIES})
target_link_libraries(${SUBPROJECT} ${PROJECT_LIBRARY} ${Qt_LIBRARIES} ${Kf6_LIBRARIES})

View File

@ -19,10 +19,15 @@
#define ABSTRACTEXTSYSMONSOURCE_H
#include <QObject>
#include <QRegExp>
#include <QRegularExpression>
#include <QVariant>
namespace KSysGuard
{
class SensorInfo;
}
class AbstractExtSysMonSource : public QObject
{
Q_OBJECT
@ -32,15 +37,14 @@ public:
: QObject(_parent){};
~AbstractExtSysMonSource() override = default;
virtual QVariant data(const QString &_source) = 0;
[[nodiscard]] virtual QVariantMap initialData(const QString &_source) const = 0;
[[nodiscard]] virtual KSysGuard::SensorInfo *initialData(const QString &_source) const = 0;
virtual void run() = 0;
[[nodiscard]] virtual QStringList sources() const = 0;
// used by extensions
static int index(const QString &_source)
{
QRegExp rx("\\d+");
rx.indexIn(_source);
return rx.cap().toInt();
QRegularExpression rx("\\d+");
return rx.match(_source).captured().toInt();
}
signals:

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