Compare commits

..

27 Commits

Author SHA1 Message Date
571417f786 Release 4.0.1 2024-12-11 17:12:24 +02:00
e3d24d1890 fix: disable tooltip painting for now, because it causes error during
png rendering in qt
2024-12-11 17:09:10 +02:00
ee7bd90aae Release 4.0.0 2024-05-05 15:55:56 +03:00
f79c94e9e2 fix: add buttons to import dialog 2024-05-05 15:55:03 +03:00
66baa78cda build: fix debug builds 2024-05-05 15:41:43 +03:00
79a148a21a chore: translate awesome-widgets.pot in ru (#167)
100% translated source file: 'awesome-widgets.pot'
on 'ru'.

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2024-05-04 01:19:09 +03:00
64b4618904 refactor: split formatters and matchers into separated singleton classes (#166)
* split formatter into separated singleton classes

* split data engine matchers to classes

* nodiscard attribute for formatter methods

* small refactoring in matchers

* fix codefactor warnings

* fix test building
2024-04-30 21:53:21 +03:00
95572364c1 refactor: change ui translation mechanism 2024-04-22 14:59:03 +03:00
ba60be932a chore: review translations 2024-04-21 17:55:06 +03:00
f121db3b75 ci: get rid of development branch 2024-04-21 17:17:01 +03:00
56c0a5837f docs: fix readme formatting 2024-04-19 20:26:56 +03:00
fd24ded6b8 docs: docs and documentaion update 2024-04-19 20:20:47 +03:00
ed5ae40624 refactor: fix some minor clang-tidy warnings 2024-04-19 19:40:59 +03:00
2f4f05b5af refactor: remoove unsued code annd settings 2024-04-19 03:58:54 +03:00
c608c40c97 refactor: make version.h static 2024-04-18 18:05:46 +03:00
95d5bb99c0 refactor: review delete and new operators 2024-04-18 02:35:31 +03:00
397b523180 refactor: refresh aw plugin 2024-04-16 18:33:19 +03:00
54acc5f780 refactor: refresh shared library 2024-04-16 13:07:33 +03:00
332d78eb25 feat: replace messageboxes with notifications
Closes #157
2024-04-09 15:20:06 +03:00
960640f5bc feat: restore multithreaded processing 2024-04-08 14:40:49 +03:00
ac52888b0d refactor: use default qml library paths
previous implementation stores data in share instead of lib (I guess, I
had issues with using default paths?). Let's use normal paths instead
2024-03-31 15:17:50 +03:00
a35b57e5d2 refactor: simplify sources processing
Also fix desktop source
2024-03-30 22:34:31 +02:00
0bcceefd47 refactor: remove innclude guards, use pragma instead 2024-03-28 03:05:26 +02:00
f27050afbc refactor: use new-style qt connections 2024-03-28 02:40:17 +02:00
d71f85eaad fix: remove deprecations from test cases 2024-03-28 01:57:18 +02:00
b0df3535a5 fix: handle memory units as bytes 2024-03-28 01:56:57 +02:00
4d01b87088 initial plasma6 support 2024-03-28 01:26:46 +02:00
413 changed files with 20454 additions and 12165 deletions

View File

@ -2,9 +2,11 @@ name: build & tests
on: on:
push: push:
branches: [ development, master ] branches:
- master
pull_request: pull_request:
branches: [ development, master ] branches:
- master
env: env:
BUILD_TYPE: Release BUILD_TYPE: Release
@ -24,13 +26,13 @@ jobs:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- name: create build environment - name: create build environment
run: pacman -Sy --noconfirm base-devel cmake extra-cmake-modules python util-linux-libs xorg-server-xvfb run: pacman -Syu --noconfirm base-devel cmake extra-cmake-modules python util-linux-libs xorg-server-xvfb
- name: install dependencies - name: install dependencies
run: pacman -S --noconfirm plasma-workspace ksysguard run: pacman -S --noconfirm plasma-workspace
- name: configure cmake - name: configure cmake
run: cmake -B build -DKDE_INSTALL_USE_QT_SYS_PATHS=ON -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DBUILD_FUTURE=ON -DBUILD_TESTING=ON sources run: cmake -B build -S sources -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DBUILD_FUTURE=ON -DBUILD_TESTING=ON
- name: build - name: build
working-directory: /repo/build working-directory: /repo/build

View File

@ -1,5 +1,13 @@
Ver.4.0.1:
- temporary disable tooltip painting in main widget
Ver.4.0.0: Ver.4.0.0:
* migration to plasma 6 * migration to plasma 6
* dialog windows have been replaced by notifications
+ $gpuN keys have been added
+ new key $ssid
- $cuptime key has been removed in favour of $uptime
- $gputemp key has been replaced by $gpuN
Ver.3.5.0: Ver.3.5.0:
+ wayland support + wayland support

View File

@ -6,27 +6,20 @@ for more details. To avoid manual labor there is automatic cmake target named
`clangformat` (see below). Some additional detail see below. `clangformat` (see below). Some additional detail see below.
* Indent is only spaces. 4 spaces. * Indent is only spaces. 4 spaces.
* Any private variable should start with `m_` prefix (`m_foo`). The only one * Any private variable should start with `m_` prefix (`m_foo`). The only one exception is `Ui` object which should be named as `ui`.
exception is `Ui` object which should be named as `ui`.
* Avoid to create a large methods. Exception: if method contains lambda functions. * Avoid to create a large methods. Exception: if method contains lambda functions.
* If some method is called only once, it is recommended to use lambda functions.
Exception is `Q_INVOKABLE` methods.
* STL containers are not recommended, use Qt ones instead. * STL containers are not recommended, use Qt ones instead.
* In other hand Qt specific variables types (`qint`, `qfloat`, etc) are not * In other hand Qt specific variables types (`qint`, `qfloat`, etc) are not recommended.
recommended.
* Do not repeat yourself ([DRY](https://en.wikipedia.org/wiki/Don't_repeat_yourself)). * Do not repeat yourself ([DRY](https://en.wikipedia.org/wiki/Don't_repeat_yourself)).
* Headers declaration: * Headers declaration:
* Include only those headers which are strictly necessary inside headers. Use * Include only those headers which are strictly necessary inside headers. Use forward class declaration instead. Exception is base class header declaration.
forward class declaration instead. Exception is base class header declaration. * In a`*.cpp` file header declaration should have the following order separated by a new line in the alphabet order:
* In a`*.cpp` file header declaration should have the following order separated
by a new line in the alphabet order:
1. Class header. 1. Class header.
2. KDE specific headers. 2. KDE specific headers.
3. Qt specific headers. 3. Qt specific headers.
4. Third party headers. 4. Third party headers.
5. Project headers. 5. Project headers.
* Any header should have [include guard](https://en.wikipedia.org/wiki/Include_guard) * Any header should have `#pragma once`.
named as `CLASSNAMECAPS_H`
* If any `#if` directive is used condition should be mentioned in `#endif`: * If any `#if` directive is used condition should be mentioned in `#endif`:
``` ```
@ -36,80 +29,60 @@ for more details. To avoid manual labor there is automatic cmake target named
``` ```
* `Q_PROPERTY` macro is allowed and recommended for QObject based classes. * `Q_PROPERTY` macro is allowed and recommended for QObject based classes.
* Qt macros (e.g. `signals`, `slots`, `Q_OBJECT`, etc) are allowed. In other hand * Qt macros (e.g. `signals`, `slots`, `Q_OBJECT`, etc) are allowed. In other hand `Q_FOREACH` (`foreach`) is not allowed use `for (auto &foo : bar)` instead.
`Q_FOREACH` (`foreach`) is not allowed use `for (auto &foo : bar)` instead. * Current project standard is **C++23**.
* Current project standard is **C++17**.
* Do not use C-like code: * Do not use C-like code:
* C-like style iteration if possible. Use `for (auto &foo : bar)` and * C-like style iteration if possible. Use `for (auto &foo : bar)` and `std::for_each` instead if possible. It is also recommended to use iterators.
`std::for_each` instead if possible. It is also recommended to use iterators. * C-like casts, use `const_cast`, `static_cast`, `dymanic_Cast` instead. Using of `reinterpret_cast` is not recommended. It is highly recommended to use `dynamic_cast` with the exception catching. It is also possible to use `qvariant_cast` if required.
* C-like casts, use `const_cast`, `static_cast`, `dymanic_Cast` instead. Using
of `reinterpret_cast` is not recommended. It is highly recommended to use
`dynamic_cast` with the exception catching. It is also possible to use
`qvariant_cast` if required.
* C-like `NULL`, use `nullptr` instead. * C-like `NULL`, use `nullptr` instead.
* C-like constant definition, use `const vartype foo = bar` definition instead. * C-like constant definition, use `static const vartype foo = bar` definition instead.
* Abstract classes (which have at least one pure virtual method) are allowed. * Abstract classes (which have at least one pure virtual method) are allowed.
* Templates are allowed and recommended. Templates usually should be described * Templates are allowed and recommended. Templates usually should be described inside header not source code file.
inside header not source code file. * Hardcode is not recommended. But it is possible to use cmake variables to configure some items during build time.
* Hardcode is not recommended. But it is possible to use cmake variables to
configure some items during build time.
* Build should not require any additional system variable declaration/changing. * Build should not require any additional system variable declaration/changing.
* Any line should not end with space. * Any line should not end with space.
* Do not hesitate move public methods to private one if possible. * Do not hesitate move public methods to private one if possible.
* Do not hesitate use `const` modifier. In other hand `volatile` modifier is not * Do not hesitate use `const` modifier. In other hand `volatile` modifier is not recommended.
recommended.
* New lines rules: * New lines rules:
* One line after license header. * One line after license header.
* One line between header group declaration (see above). * One line between header group declaration (see above).
* Two lines after header declaration and before declaration at the end of a * Two lines after header declaration and before declaration at the end of a file.
file.
* One line after class and types forward declarations in headers. * One line after class and types forward declarations in headers.
* One line before each method modifiers (`public`, `public slots`, etc). * One line before each method modifiers (`public`, `public slots`, etc).
* Two lines between methods inside source code (`*.cpp`). * Two lines between methods inside source code (`*.cpp`).
* One line after `qCDebug()` information (see below). * One line after `qCDebug()` information (see below).
* One line inside a method to improve code reading. * One line inside a method to improve code reading.
* Each destructor should be virtual. * Each destructor should be virtual.
* Class constructor should have default arguments. Use `QObject *parent` property * Class constructor should have default arguments. Use `QObject *_parent` property for QObject based classes.
for QObject based classes.
* QObject based classes constructors should have explicit modifier. * QObject based classes constructors should have explicit modifier.
* Create one file (source and header) per class. * Create one file (source and header) per class.
* `else if` construction is allowed and recommended. * `else if` construction is allowed and recommended.
* 'true ? foo : bar' construction is allowed and recommended for one-line assignment. * 'true ? foo : bar' construction is allowed and recommended for one-line assignment.
* Any global pointer should be assign to `nullptr` after deletion and before * Any global pointer should be assigned to `nullptr` after deletion and before initialization. Exception: if object is deleted into class destructor.
initialization. Exception: if object is deleted into class destructor.
* Do not use semicolon in qml files unless it is required. * Do not use semicolon in qml files unless it is required.
* Any method argument including class constructors should start with `_`. * Any method argument including class constructors should start with `_`.
Comments Comments
-------- --------
Please do not hesitate to use comments inside source code (especially in non-obvious Please do not hesitate to use comments inside source code (especially in non-obvious blocks). Comments also may use the following keywords:
blocks). Comments also may use the following keywords:
* **TODO** - indicates that some new code should be implemented here later. Please * **TODO** - indicates that some new code should be implemented here later. Please note that usually these methods should be implemented before the next release.
note that usually these methods should be implemented before the next release.
* **FIXME** - some dirty hacks and/or methods which should be done better. * **FIXME** - some dirty hacks and/or methods which should be done better.
* **HACK** - hacks inside code which requires to avoid some restrictions and/or * **HACK** - hacks inside code which requires to avoid some restrictions and/or which adds additional non-obvious optimizations.
which adds additional non-obvious optimizations.
Do not use dots at the end of the comment line. Do not use dots at the end of the comment line.
Development Development
----------- -----------
* Officially the latest libraries versions should be used. In addition it is * Officially the latest libraries versions should be used. In addition, it is possible to add workarounds for all versions (usually by using preprocessor directives); in this case patches should be placed to `packages` directory.
possible to add workarounds for all versions (usually by using preprocessor
directives); in this case patches should be placed to `packages` directory.
* Build should not contain any warning. * Build should not contain any warning.
* Try to minimize message in Release build with logging disabled. It is highly * Try to minimize message in Release build with logging disabled. It is highly recommended to fix KDE/Qt specific warning if possible
recommended to fix KDE/Qt specific warning if possible * Do not use dependency to KDE libraries if there are no any strictly necessary. Exceptions are KNotification and KI18n libraries.
* Do not use dependency to KDE libraries if there are no any strictly necessary.
Exceptions are KNotification and KI18n libraries.
* It is highly recommended to use submodules for third party libraries if possible. * It is highly recommended to use submodules for third party libraries if possible.
* The main branch is **development**. Changes in this branch may be merged to the * The main branch is **master**.
master one only if it is a 'stable' build. * For experimental features development new branch `feature/foo` creation is allowed and recommended.
* For experimental features development new branch `feature-foo` creation is allowed
and recommended.
* Experimental features should be added inside `BUILD_FUTURE` definition: * Experimental features should be added inside `BUILD_FUTURE` definition:
``` ```
@ -118,54 +91,41 @@ Development
#endif /* BUILD_FUTURE */ #endif /* BUILD_FUTURE */
``` ```
* Any project specific build variable should be mentioned inside `version.h` as * Any project specific build variable should be mentioned inside `version.h` as well.
well.
* Recommended compiler is `clang`. * Recommended compiler is `clang`.
HIG HIG
--- ---
The recommended HIG is [KDE one](https://techbase.kde.org/Projects/Usability/HIG). The recommended HIG is [KDE one](https://techbase.kde.org/Projects/Usability/HIG). Avoid to paint interfaces inside plugin because QML and C++ parts may have different theming.
Avoid to paint interfaces inside plugin because QML and C++ parts may have different
theming.
Licensing Licensing
--------- ---------
All files should be licensed under GPLv3, the owner of the license should be the All files should be licensed under GPLv3, the owner of the license should be the project (i.e. **awesome-widgets**). See **Tools** section for more details.
project (i.e. **awesome-widgets**). See **Tools** section for more details.
Logging Logging
------- -------
For logging please use [QLoggingCategory](http://doc.qt.io/qt-5/qloggingcategory.html). For logging please use [QLoggingCategory](http://doc.qt.io/qt-5/qloggingcategory.html). Available categories should be declared in `awdebug.*` files. The following log levels should be used:
Available categories should be declared in `awdebug.*` files. The following log
levels should be used:
* **debug** (`qCDebug()`) - method arguments information. Please note that it * **debug** (`qCDebug()`) - method arguments information. Please note that it is recommended to logging all arguments in the one line.
is recommended to logging all arguments in the one line.
* **info** (`qCInfo()`) - additional information inside methods. * **info** (`qCInfo()`) - additional information inside methods.
* **warning** (`qCWarning()`) - not critical information, which may be caused by * **warning** (`qCWarning()`) - not critical information, which may be caused by mistakes in configuration for example.
mistakes in configuration for example. * **critical** (`qCCritical()`) - a critical error. After this error program may be terminated.
* **critical** (`qCCritical()`) - a critical error. After this error program may
be terminated.
The empty log string (e.g. `qCDebug();`) is not allowed because the method names The empty log string (e.g. `qCDebug();`) is not allowed because the method names will be stripped by compiler with `Release` build type. To log class constructor and destructor use `__PRETTY_FUNCTION__` macro.
will be stripped by compiler with `Release` build type. To log class constructor
and destructor use `__PRETTY_FUNCTION__` macro.
Testing Testing
------- -------
* Any changes should be tested by using `plasmawindowed` and `plasmashell` applications. * Any changes should be tested by using `plasmawindowed` and `plasmashell` applications. (It is also possible to use `plasmaengineexplorer` and `plasmoidviewer` in addition.)
(It is also possible to use `plasmaengineexplorer` and `plasmoidviewer` in addition.)
* Any test should be performed on real (not Virtual Machine) system. * Any test should be performed on real (not Virtual Machine) system.
* Test builds should be: * Test builds should be:
1. `-DCMAKE_BUILD_TYPE=Debug`. 1. `-DCMAKE_BUILD_TYPE=Debug`.
2. `-DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTING=ON`. 2. `-DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTING=ON`.
3. `-DCMAKE_BUILD_TYPE=Release`. 3. `-DCMAKE_BUILD_TYPE=Release`.
* Additional test functions should be declated and used only inside `BUILD_TESTING` * Additional test functions should be declated and used only inside `BUILD_TESTING` definition.
definition.
Tools Tools
----- -----
@ -222,7 +182,6 @@ Tools
// declare with default value // declare with default value
bool m_prop = false; bool m_prop = false;
``` ```
* Use `cppcheck` to avoid common errors in the code. To start application just * Use `cppcheck` to avoid common errors in the code. To start application just run `make cppcheck`.
run `make cppcheck`. * Use `clang-format` to apply valid code format. To start application just run `make clangformat`.
* Use `clang-format` to apply valid code format. To start application just run * use `-DCMAKE_CXX_COMPILER=clang++` in order to enable clang-tidy checks.
`make clangformat`.

View File

@ -14,11 +14,11 @@ A collection of minimalistic widgets which looks like Awesome Window Manager wid
Features Features
======== ========
* easy and fully configurable native Plasma widget which may be used as Conky widget or as Awesome-like information panel * easy and fully configurable native Plasma widget which may be used as desktop or panel widget
* panel which shows active desktop status * additionnal widget which shows active desktop status
* clear Conky-like configuration with html tags support * clear text configuration with html tags support
* custom command support (it may be simple action as well as special custom tag) * custom command support (it may be simple action as well as special custom tag)
* graphical item support - tooltips, bars * graphical widgets support - tooltips, bars
See [links](#Links) for more details. See [links](#Links) for more details.
@ -30,15 +30,11 @@ Instruction
Dependencies Dependencies
------------ ------------
* plasma-framework * plasma-workspace
* ksysguard (since plasma 5.22)
Optional dependencies Optional dependencies
--------------------- ---------------------
* proprietary video driver
* hddtemp
* smartmontools
* music player (mpd or MPRIS supported) * music player (mpd or MPRIS supported)
* wireless_tools * wireless_tools
@ -48,19 +44,20 @@ Make dependencies
* cmake * cmake
* extra-cmake-modules * extra-cmake-modules
In addition some distros might require to install some -dev packages, e.g. the list of required packages for deb-based distros can be found [here](https://github.com/arcan1s/awesome-widgets/blob/development/.docker/Dockerfile-ubuntu-amd64#L7). In addition, some distros might require to install some -dev packages, e.g. the list of required packages for deb-based distros can be found [here](https://github.com/arcan1s/awesome-widgets/blob/development/.docker/Dockerfile-ubuntu-amd64#L7).
Installation Installation
------------ ------------
* download sources * download sources
* install * build package
mkdir build && cd build cmake -B build -S sources -DCMAKE_BUILD_TYPE=Release
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr ../sources cmake --build build
make && sudo make install
**NOTE** on Plasma 5 it very likely requires `-DKDE_INSTALL_USE_QT_SYS_PATHS=ON` flag * install package
cmake --install build
Additional information Additional information
====================== ======================

View File

@ -5,7 +5,7 @@ VERSION="$(git describe --tags --abbrev=0)"
# build widget # build widget
ARCHIVE="awesome-widgets" ARCHIVE="awesome-widgets"
FILES="AUTHORS CHANGELOG COPYING packages patches sources" FILES="AUTHORS CHANGELOG COPYING packages patches"
IGNORELIST="build usr .kdev4 *.kdev4 .idea packages/*src.tar.xz" IGNORELIST="build usr .kdev4 *.kdev4 .idea packages/*src.tar.xz"
# create archive # create archive
[[ -e ${ARCHIVE}-${VERSION}-src.tar.xz ]] && rm -f "${ARCHIVE}-${VERSION}-src.tar.xz" [[ -e ${ARCHIVE}-${VERSION}-src.tar.xz ]] && rm -f "${ARCHIVE}-${VERSION}-src.tar.xz"

View File

@ -2,17 +2,15 @@
pkgname=plasma6-applet-awesome-widgets pkgname=plasma6-applet-awesome-widgets
_pkgname=awesome-widgets _pkgname=awesome-widgets
pkgver=4.0.0alpha1 pkgver=4.0.0alpha2
pkgrel=1 pkgrel=1
pkgdesc="Collection of minimalistic Plasmoids which look like Awesome WM widgets (ex-PyTextMonitor)" pkgdesc="Collection of minimalistic Plasmoids which look like Awesome WM widgets (ex-PyTextMonitor)"
arch=('x86_64') arch=('x86_64')
url="https://arcanis.me/projects/awesome-widgets" url="https://arcanis.me/projects/awesome-widgets"
license=('GPL3') license=('GPL3')
depends=('plasma-workspace') depends=('plasma-workspace')
optdepends=("hddtemp: for HDD temperature monitor" optdepends=("mpd: for music player monitor"
"smartmontools: for HDD temperature monitor" "wireless_tools: wifi information")
"mpd: for music player monitor"
"nvidia-utils: for GPU monitor")
makedepends=('cmake' 'extra-cmake-modules' 'python') makedepends=('cmake' 'extra-cmake-modules' 'python')
source=(https://github.com/arcan1s/awesome-widgets/releases/download/${pkgver}/${_pkgname}-${pkgver}-src.tar.xz) source=(https://github.com/arcan1s/awesome-widgets/releases/download/${pkgver}/${_pkgname}-${pkgver}-src.tar.xz)
install="$pkgname.install" install="$pkgname.install"

284
sensors
View File

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

View File

@ -58,7 +58,7 @@ CFontDialog::CFontDialog(QWidget *parent, bool needWeight, bool needItalic)
setLayout(mainGrid); setLayout(mainGrid);
colorBox = new QComboBox(this); colorBox = new QComboBox(this);
connect(colorBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(updateColor(QString))); connect(colorBox, &QComboBox::currentTextChanged, this, &CFontDialog::updateColor);
QStringList colorNames = QColor::colorNames(); QStringList colorNames = QColor::colorNames();
int index = 0; int index = 0;
for (int i=0; i<colorNames.count(); i++) { for (int i=0; i<colorNames.count(); i++) {
@ -81,8 +81,8 @@ CFontDialog::CFontDialog(QWidget *parent, bool needWeight, bool needItalic)
buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel,
Qt::Horizontal, this); Qt::Horizontal, this);
QObject::connect(buttons, SIGNAL(accepted()), this, SLOT(accept())); QObject::connect(buttons, &QDialogButtonBox::accepted, this, &CFontDialog::accept);
QObject::connect(buttons, SIGNAL(rejected()), this, SLOT(reject())); QObject::connect(buttons, &QDialogButtonBox::rejected, this, &CFontDialog::reject);
mainGrid->addWidget(buttons, 1, 0, 1, 5); mainGrid->addWidget(buttons, 1, 0, 1, 5);
italicBox->setHidden(!needItalic); italicBox->setHidden(!needItalic);

View File

@ -15,8 +15,7 @@
* License along with this library. * * License along with this library. *
***************************************************************************/ ***************************************************************************/
#ifndef FONTDIALOG_H #pragma once
#define FONTDIALOG_H
#include <QComboBox> #include <QComboBox>
#include <QDialog> #include <QDialog>
@ -72,6 +71,3 @@ private:
QSpinBox *sizeBox; QSpinBox *sizeBox;
QSpinBox *weightBox; QSpinBox *weightBox;
}; };
#endif /* FONTDIALOG_H */

View File

@ -12,7 +12,7 @@ QReplyTimeout::QReplyTimeout(QNetworkReply *reply, const int timeout)
void QReplyTimeout::timeout() void QReplyTimeout::timeout()
{ {
auto *reply = dynamic_cast<QNetworkReply *>(parent()); auto reply = dynamic_cast<QNetworkReply *>(parent());
if (reply->isRunning()) if (reply->isRunning())
reply->close(); reply->close();
} }

View File

@ -9,6 +9,9 @@ endif ()
if (POLICY CMP0071) if (POLICY CMP0071)
cmake_policy(SET CMP0071 NEW) cmake_policy(SET CMP0071 NEW)
endif () endif ()
if (POLICY CMP0160)
cmake_policy(SET CMP0160 OLD)
endif ()
project(awesomewidgets) project(awesomewidgets)
set(PROJECT_AUTHOR "Evgeniy Alekseev") set(PROJECT_AUTHOR "Evgeniy Alekseev")
@ -16,7 +19,7 @@ set(PROJECT_CONTACT "esalexeev@gmail.com")
set(PROJECT_LICENSE "GPL3") set(PROJECT_LICENSE "GPL3")
set(PROJECT_VERSION_MAJOR "4") set(PROJECT_VERSION_MAJOR "4")
set(PROJECT_VERSION_MINOR "0") set(PROJECT_VERSION_MINOR "0")
set(PROJECT_VERSION_PATCH "0") set(PROJECT_VERSION_PATCH "1")
set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}") set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}")
# append git version if any # append git version if any
set(PROJECT_COMMIT_SHA "Commit hash" CACHE INTERNAL "") set(PROJECT_COMMIT_SHA "Commit hash" CACHE INTERNAL "")

View File

@ -15,7 +15,9 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/ ***************************************************************************/
#ifndef NDEBUG
#define NDEBUG
#endif /* NDEBUG */
#include <KI18n/KLocalizedString> #include <KI18n/KLocalizedString>
#include "awdebug.h" #include "awdebug.h"
@ -41,35 +43,32 @@ QString AWDebug::getAboutText(const QString &_type)
} else if (_type == "description") { } else if (_type == "description") {
text = i18n("A set of minimalistic plasmoid widgets"); text = i18n("A set of minimalistic plasmoid widgets");
} else if (_type == "links") { } else if (_type == "links") {
text = i18n("Links:") + "<ul>" + QString("<li><a href=\"%1\">%2</a></li>").arg(HOMEPAGE).arg(i18n("Homepage")) text = i18n("Links:") + "<ul>" + QString("<li><a href=\"%1\">%2</a></li>").arg(HOMEPAGE, i18n("Homepage"))
+ QString("<li><a href=\"%1\">%2</a></li>").arg(REPOSITORY).arg(i18n("Repository")) + QString("<li><a href=\"%1\">%2</a></li>").arg(REPOSITORY, i18n("Repository"))
+ QString("<li><a href=\"%1\">%2</a></li>").arg(BUGTRACKER).arg(i18n("Bugtracker")) + QString("<li><a href=\"%1\">%2</a></li>").arg(BUGTRACKER, i18n("Bugtracker"))
+ QString("<li><a href=\"%1\">%2</a></li>").arg(TRANSLATION).arg(i18n("Translation issue")) + QString("<li><a href=\"%1\">%2</a></li>").arg(TRANSLATION, i18n("Translation issue"))
+ QString("<li><a href=\"%1\">%2</a></li>").arg(AUR_PACKAGES).arg(i18n("AUR packages")) + QString("<li><a href=\"%1\">%2</a></li>").arg(AUR_PACKAGES, i18n("AUR packages"))
+ QString("<li><a href=\"%1\">%2</a></li>").arg(OPENSUSE_PACKAGES).arg(i18n("openSUSE packages")) + QString("<li><a href=\"%1\">%2</a></li>").arg(OPENSUSE_PACKAGES, i18n("openSUSE packages")) + "</ul>";
+ "</ul>";
} else if (_type == "copy") { } else if (_type == "copy") {
text = QString("<small>&copy; %1 <a href=\"mailto:%2\">%3</a><br>").arg(DATE).arg(EMAIL).arg(AUTHOR) text = QString("<small>&copy; %1 <a href=\"mailto:%2\">%3</a><br>").arg(DATE, EMAIL, AUTHOR)
+ i18nc("This software is licensed under %1", LICENSE) + "</small>"; + i18n("This software is licensed under %1", LICENSE) + "</small>";
} else if (_type == "translators") { } else if (_type == "translators") {
QStringList translatorList = QString(TRANSLATORS).split(','); auto translatorList = QString(TRANSLATORS).split(',');
for (auto &translator : translatorList) for (auto &translator : translatorList)
translator = QString("<li>%1</li>").arg(translator); translator = QString("<li>%1</li>").arg(translator);
text = i18n("Translators:") + "<ul>" + translatorList.join("") + "</ul>"; text = i18n("Translators:") + "<ul>" + translatorList.join("") + "</ul>";
} else if (_type == "3rdparty") { } else if (_type == "3rdparty") {
QStringList trdPartyList = QString(TRDPARTY_LICENSE).split(';', Qt::SkipEmptyParts); auto trdPartyList = QString(TRDPARTY_LICENSE).split(';', Qt::SkipEmptyParts);
for (int i = 0; i < trdPartyList.count(); i++) for (auto i = 0; i < trdPartyList.count(); ++i)
trdPartyList[i] = QString("<li><a href=\"%3\">%1</a> (%2 license)</li>") trdPartyList[i] = QString("<li><a href=\"%3\">%1</a> (%2 license)</li>")
.arg(trdPartyList.at(i).split(',')[0]) .arg(trdPartyList.at(i).split(',')[0], trdPartyList.at(i).split(',')[1],
.arg(trdPartyList.at(i).split(',')[1]) trdPartyList.at(i).split(',')[2]);
.arg(trdPartyList.at(i).split(',')[2]);
text = i18n("This software uses:") + "<ul>" + trdPartyList.join("") + "</ul>"; text = i18n("This software uses:") + "<ul>" + trdPartyList.join("") + "</ul>";
} else if (_type == "thanks") { } else if (_type == "thanks") {
QStringList thanks = QString(SPECIAL_THANKS).split(';', Qt::SkipEmptyParts); auto thanks = QString(SPECIAL_THANKS).split(';', Qt::SkipEmptyParts);
for (int i = 0; i < thanks.count(); i++) for (auto i = 0; i < thanks.count(); ++i)
thanks[i] = QString("<li><a href=\"%2\">%1</a></li>") thanks[i]
.arg(thanks.at(i).split(',')[0]) = QString("<li><a href=\"%2\">%1</a></li>").arg(thanks.at(i).split(',')[0], thanks.at(i).split(',')[1]);
.arg(thanks.at(i).split(',')[1]);
text = i18n("Special thanks to:") + "<ul>" + thanks.join("") + "</ul>"; text = i18n("Special thanks to:") + "<ul>" + thanks.join("") + "</ul>";
} }

View File

@ -15,9 +15,7 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/ ***************************************************************************/
#pragma once
#ifndef AWDEBUG_H
#define AWDEBUG_H
#include <QLoggingCategory> #include <QLoggingCategory>
@ -42,6 +40,3 @@ Q_DECLARE_LOGGING_CATEGORY(LOG_DP)
Q_DECLARE_LOGGING_CATEGORY(LOG_ESM) Q_DECLARE_LOGGING_CATEGORY(LOG_ESM)
Q_DECLARE_LOGGING_CATEGORY(LOG_ESS) Q_DECLARE_LOGGING_CATEGORY(LOG_ESS)
Q_DECLARE_LOGGING_CATEGORY(LOG_LIB) Q_DECLARE_LOGGING_CATEGORY(LOG_LIB)
#endif /* AWDEBUG_H */

View File

@ -51,6 +51,12 @@ ConfigModel {
source: "dataengine.qml" source: "dataengine.qml"
} }
ConfigCategory {
name: i18n("Report bug")
icon: "tools-report-bug"
source: "bug.qml"
}
ConfigCategory { ConfigCategory {
name: i18n("About") name: i18n("About")
icon: "help-about" icon: "help-about"

View File

@ -44,9 +44,6 @@
<entry name="interval" type="Int"> <entry name="interval" type="Int">
<default>1000</default> <default>1000</default>
</entry> </entry>
<entry name="queueLimit" type="Int">
<default>0</default>
</entry>
<entry name="tempUnits" type="String"> <entry name="tempUnits" type="String">
<default>Celsius</default> <default>Celsius</default>
</entry> </entry>
@ -62,15 +59,9 @@
<entry name="acOffline" type="String"> <entry name="acOffline" type="String">
<default>( )</default> <default>( )</default>
</entry> </entry>
<entry name="telemetryCount" type="Int"> <entry name="historyCount" type="Int">
<default>100</default> <default>100</default>
</entry> </entry>
<entry name="telemetryRemote" type="Bool">
<default>false</default>
</entry>
<entry name="telemetryId" type="String">
<default></default>
</entry>
</group> </group>
<group name="Tooltip"> <group name="Tooltip">

View File

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

View File

@ -17,24 +17,20 @@
import QtQuick 2.15 import QtQuick 2.15
import QtQuick.Controls import QtQuick.Controls
import org.kde.kcmutils as KCM
import org.kde.plasma.private.awesomewidget 1.0 import org.kde.plasma.awesomewidgets
import org.kde.plasma.private.awesomewidget
Item { KCM.SimpleKCM {
id: advancedPage id: advancedPage
// backend // backend
AWActions { AWConfigHelper {
id: awActions id: awConfig
} }
width: childrenRect.width
height: childrenRect.height
implicitWidth: pageColumn.implicitWidth
implicitHeight: pageColumn.implicitHeight
property bool debug: awActions.isDebugEnabled()
property alias cfg_background: background.checked property alias cfg_background: background.checked
property alias cfg_translateStrings: translate.checked property alias cfg_translateStrings: translate.checked
property alias cfg_wrapNewLines: wrapNewLines.checked property alias cfg_wrapNewLines: wrapNewLines.checked
@ -45,19 +41,14 @@ Item {
property alias cfg_height: widgetHeight.value property alias cfg_height: widgetHeight.value
property alias cfg_width: widgetWidth.value property alias cfg_width: widgetWidth.value
property alias cfg_interval: update.value property alias cfg_interval: update.value
property alias cfg_queueLimit: queueLimit.value
property string cfg_tempUnits: tempUnits.value property string cfg_tempUnits: tempUnits.value
property alias cfg_customTime: customTime.value property alias cfg_customTime: customTime.value
property alias cfg_customUptime: customUptime.value property alias cfg_customUptime: customUptime.value
property alias cfg_acOnline: acOnline.value property alias cfg_acOnline: acOnline.value
property alias cfg_acOffline: acOffline.value property alias cfg_acOffline: acOffline.value
property alias cfg_telemetryCount: telemetryCount.value property alias cfg_historyCount: historyCount.value
property alias cfg_telemetryRemote: telemetryRemote.checked
property alias cfg_telemetryId: telemetryId.value
Column { Column {
id: pageColumn
anchors.fill: parent anchors.fill: parent
CheckBoxSelector { CheckBoxSelector {
@ -122,45 +113,36 @@ Item {
value: plasmoid.configuration.interval value: plasmoid.configuration.interval
} }
IntegerSelector {
id: queueLimit
maximumValue: 99
minimumValue: 0
stepSize: 1
text: i18n("Messages queue limit")
value: plasmoid.configuration.queueLimit
}
ComboBoxSelector { ComboBoxSelector {
id: tempUnits id: tempUnits
model: [ model: [
{ {
'label': i18n("Celsius"), "label": i18n("Celsius"),
'name': "Celsius" "name": "Celsius"
}, },
{ {
'label': i18n("Fahrenheit"), "label": i18n("Fahrenheit"),
'name': "Fahrenheit" "name": "Fahrenheit"
}, },
{ {
'label': i18n("Kelvin"), "label": i18n("Kelvin"),
'name': "Kelvin" "name": "Kelvin"
}, },
{ {
'label': i18n("Reaumur"), "label": i18n("Reaumur"),
'name': "Reaumur" "name": "Reaumur"
}, },
{ {
'label': i18n("cm^-1"), "label": i18n("cm^-1"),
'name': "cm^-1" "name": "cm^-1"
}, },
{ {
'label': i18n("kJ/mol"), "label": i18n("kJ/mol"),
'name': "kJ/mol" "name": "kJ/mol"
}, },
{ {
'label': i18n("kcal/mol"), "label": i18n("kcal/mol"),
'name': "kcal/mol" "name": "kcal/mol"
} }
] ]
text: i18n("Temperature units") text: i18n("Temperature units")
@ -194,14 +176,18 @@ Item {
GroupBox { GroupBox {
width: parent.width width: parent.width
height: implicitHeight
title: i18n("Actions") title: i18n("Actions")
Column { Column {
height: implicitHeight
width: parent.width width: parent.width
ButtonSelector { ButtonSelector {
value: i18n("Drop key cache") value: i18n("Drop key cache")
onButtonActivated: awActions.dropCache() onButtonActivated: awConfig.dropCache()
} }
ButtonSelector { ButtonSelector {
ExportDialog { ExportDialog {
id: saveConfigAs id: saveConfigAs
@ -210,11 +196,12 @@ Item {
value: i18n("Export configuration") value: i18n("Export configuration")
onButtonActivated: saveConfigAs.open() onButtonActivated: saveConfigAs.open()
} }
ButtonSelector { ButtonSelector {
ImportDialog { ImportDialog {
id: loadConfigFrom id: loadConfigFrom
onConfigurationReceived: { onConfigurationReceived: {
for (var key in configuration) for (const key in configuration)
plasmoid.configuration[key] = configuration[key] plasmoid.configuration[key] = configuration[key]
} }
} }
@ -225,34 +212,23 @@ Item {
} }
GroupBox { GroupBox {
height: implicitHeight
width: parent.width width: parent.width
title: i18n("Telemetry") title: i18n("History")
Column { Column {
height: implicitHeight
width: parent.width width: parent.width
CheckBoxSelector {
id: telemetryRemote
text: i18n("Enable remote telemetry")
}
IntegerSelector { IntegerSelector {
id: telemetryCount id: historyCount
maximumValue: 10000 maximumValue: 10000
minimumValue: 0 minimumValue: 0
stepSize: 50 stepSize: 50
text: i18n("History count") text: i18n("History count")
value: plasmoid.configuration.telemetryCount value: plasmoid.configuration.historyCount
}
LineSelector {
id: telemetryId
text: i18n("Telemetry ID")
value: plasmoid.configuration.telemetryId
} }
} }
} }
} }
Component.onCompleted: {
if (debug) console.debug()
}
} }

View File

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

View File

@ -19,12 +19,15 @@ import QtQuick 2.15
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Dialogs import QtQuick.Dialogs
import QtQuick.Layouts import QtQuick.Layouts
import org.kde.kcmutils as KCM
import org.kde.plasma.private.awesomewidget 1.0 import org.kde.plasma.awesomewidgets
import org.kde.plasma.private.awesomewidget
Dialog { KCM.SimpleKCM {
id: reportDialog id: bugPage
AWActions { AWActions {
id: awActions id: awActions
} }
@ -32,14 +35,6 @@ Dialog {
id: awBugReporter id: awBugReporter
} }
width: 640
height: 480
property bool debug: awActions.isDebugEnabled()
title: i18n("Report a bug")
standardButtons: DialogButtonBox.Ok | DialogButtonBox.Cancel | DialogButtonBox.Reset
ColumnLayout { ColumnLayout {
anchors.fill: parent anchors.fill: parent
@ -48,48 +43,55 @@ Dialog {
Layout.fillWidth: true Layout.fillWidth: true
placeholderText: i18n("Report subject") placeholderText: i18n("Report subject")
} }
ColumnLayout { ColumnLayout {
Layout.fillWidth: true Layout.fillWidth: true
GroupBox { GroupBox {
Layout.fillWidth: true Layout.fillWidth: true
height: parent.height / 5
title: i18n("Description") title: i18n("Description")
TextArea { TextArea {
id: description id: description
anchors.fill: parent anchors.fill: parent
textFormat: TextEdit.PlainText textFormat: TextEdit.PlainText
} }
} }
GroupBox { GroupBox {
Layout.fillWidth: true Layout.fillWidth: true
height: parent.height / 5
title: i18n("Steps to reproduce") title: i18n("Steps to reproduce")
TextArea { TextArea {
id: reproduce id: reproduce
anchors.fill: parent anchors.fill: parent
textFormat: TextEdit.PlainText textFormat: TextEdit.PlainText
} }
} }
GroupBox { GroupBox {
Layout.fillWidth: true Layout.fillWidth: true
height: parent.height / 5
title: i18n("Expected result") title: i18n("Expected result")
TextArea { TextArea {
id: expected id: expected
anchors.fill: parent anchors.fill: parent
textFormat: TextEdit.PlainText textFormat: TextEdit.PlainText
} }
} }
GroupBox { GroupBox {
Layout.fillWidth: true Layout.fillWidth: true
Layout.alignment: Qt.AlignBottom Layout.alignment: Qt.AlignBottom
title: i18n("Logs") title: i18n("Logs")
ColumnLayout { ColumnLayout {
anchors.fill: parent anchors.fill: parent
Layout.fillWidth: true Layout.fillWidth: true
Row { Row {
Layout.fillWidth: true Layout.fillWidth: true
Label { Label {
width: parent.width * 2 / 5 width: parent.width * 2 / 5
horizontalAlignment: Text.AlignJustify horizontalAlignment: Text.AlignJustify
@ -97,17 +99,20 @@ Dialog {
wrapMode: Text.WordWrap wrapMode: Text.WordWrap
text: i18n("Use command") text: i18n("Use command")
} }
TextField { TextField {
width: parent.width * 3 / 5 width: parent.width * 3 / 5
readOnly: true readOnly: true
text: "QT_LOGGING_RULES=*=true plasmawindowed org.kde.plasma.awesomewidget" text: "QT_LOGGING_RULES=*=true plasmawindowed org.kde.plasma.awesomewidget"
} }
} }
Button { Button {
Layout.fillWidth: true Layout.fillWidth: true
text: i18n("Load log file") text: i18n("Load log file")
onClicked: logPath.open() onClicked: logPath.open()
} }
TextArea { TextArea {
id: logBody id: logBody
Layout.fillWidth: true Layout.fillWidth: true
@ -119,34 +124,36 @@ Dialog {
FileDialog { FileDialog {
id: logPath id: logPath
title: i18n("Open log file") title: i18n("Open log file")
onAccepted: onAccepted: logBody.text = awActions.getFileContent(logPath.selectedFile.toString().replace("file://", ""))
logBody.text = awActions.getFileContent(logPath.fileUrl.toString().replace("file://", ""))
} }
} }
DialogButtonBox {
Layout.fillWidth: true
standardButtons: DialogButtonBox.Ok | DialogButtonBox.Reset
alignment: Qt.AlignRight
onAccepted: sendBugReport()
onReset: resetDialog()
}
} }
} }
onAccepted: { function sendBugReport() {
if (debug) console.debug() const text = awBugReporter.generateText(description.text, reproduce.text, expected.text, logBody.text)
var text = awBugReporter.generateText(description.text, reproduce.text,
expected.text, logBody.text)
awBugReporter.sendBugReport(title.text, text) awBugReporter.sendBugReport(title.text, text)
} }
onReset: { function resetDialog() {
if (debug) console.debug()
title.text = "" title.text = ""
description.text = "" description.text = ""
reproduce.text = "" reproduce.text = ""
expected.text = "" expected.text = ""
logBody.text = ""
} }
Component.onCompleted: { Component.onCompleted: {
if (debug) console.debug() resetDialog()
awBugReporter.doConnect() awBugReporter.doConnect()
} }
} }

View File

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

View File

@ -16,18 +16,17 @@
***************************************************************************/ ***************************************************************************/
import QtQuick 2.15 import QtQuick 2.15
import QtQuick.Controls
import QtQuick.Dialogs
import QtQuick.Layouts import QtQuick.Layouts
import org.kde.plasma.core as PlasmaCore import org.kde.plasma.core as PlasmaCore
import org.kde.plasma.plasmoid 2.0 import org.kde.plasma.plasmoid 2.0
import org.kde.plasma.private.awesomewidget 1.0 import org.kde.plasma.awesomewidgets
import "." import org.kde.plasma.private.awesomewidget
PlasmoidItem { PlasmoidItem {
id: main id: main
// backend // backend
AWKeys { AWKeys {
id: awKeys id: awKeys
@ -38,11 +37,7 @@ PlasmoidItem {
AWTelemetryHandler { AWTelemetryHandler {
id: awTelemetryHandler id: awTelemetryHandler
} }
BugReport {
id: bugReport
}
property bool debug: awActions.isDebugEnabled()
property variant tooltipSettings: { property variant tooltipSettings: {
"tooltipNumber": plasmoid.configuration.tooltipNumber, "tooltipNumber": plasmoid.configuration.tooltipNumber,
"useTooltipBackground": plasmoid.configuration.useTooltipBackground, "useTooltipBackground": plasmoid.configuration.useTooltipBackground,
@ -72,15 +67,13 @@ PlasmoidItem {
signal needToolTipUpdate(string newText) signal needToolTipUpdate(string newText)
signal sizeUpdate signal sizeUpdate
Layout.fillWidth: PlasmoidItem.formFactor !== PlasmaCore.Planar
Layout.fillWidth: PlasmoidItem.formFactor != PlasmaCore.Planar Layout.fillHeight: PlasmoidItem.formFactor !== PlasmaCore.Planar
Layout.fillHeight: PlasmoidItem.formFactor != PlasmaCore.Planar
Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter
Plasmoid.icon: "utilities-system-monitor" Plasmoid.icon: "utilities-system-monitor"
Plasmoid.backgroundHints: plasmoid.configuration.background ? "DefaultBackground" : "NoBackground" Plasmoid.backgroundHints: plasmoid.configuration.background ? "DefaultBackground" : "NoBackground"
// ui // ui
Text { Text {
id: text id: text
@ -94,7 +87,7 @@ PlasmoidItem {
color: plasmoid.configuration.fontColor color: plasmoid.configuration.fontColor
font.family: plasmoid.configuration.fontFamily font.family: plasmoid.configuration.fontFamily
font.italic: plasmoid.configuration.fontStyle == "italic" ? true : false font.italic: plasmoid.configuration.fontStyle === "italic"
font.pointSize: plasmoid.configuration.fontSize font.pointSize: plasmoid.configuration.fontSize
font.weight: General.fontWeight[plasmoid.configuration.fontWeight] font.weight: General.fontWeight[plasmoid.configuration.fontWeight]
@ -113,85 +106,55 @@ PlasmoidItem {
} }
} }
Dialog {
id: tagSelector
title: i18n("Select tag")
ComboBox {
id: tagSelectorBox
width: parent.width
editable: true
}
onAccepted: {
var tag = tagSelectorBox.editText
var message = i18n("Tag: %1", tag)
message += "<br>"
message += i18n("Value: %1", awKeys.valueByKey(tag))
message += "<br>"
message += i18n("Info: %1", awKeys.infoByKey(tag))
awActions.sendNotification("tag", message)
}
}
Plasmoid.contextualActions: [ Plasmoid.contextualActions: [
PlasmaCore.Action { PlasmaCore.Action {
text: i18n("Request key") text: i18n("Run monitor")
icon.name: "utilities-system-monitor" icon.name: "utilities-system-monitor"
onTriggered: awActions.runCmd("plasma-systemmonitor", [])
}, },
PlasmaCore.Action { PlasmaCore.Action {
text: i18n("Show README") text: i18n("Show README")
icon.name: "text-x-readme" icon.name: "text-x-readme"
onTriggered: awActions.showReadme()
}, },
PlasmaCore.Action { PlasmaCore.Action {
text: i18n("Check updates") text: i18n("Check updates")
icon.name: "system-software-update" icon.name: "system-software-update"
}, onTriggered: awActions.checkUpdates(true)
PlasmaCore.Action {
text: i18n("Report bug")
icon.name: "tools-report-bug"
} }
] ]
Component.onCompleted: { Component.onCompleted: {
if (debug) console.debug()
// init submodule // init submodule
Plasmoid.userConfiguringChanged(false) Plasmoid.userConfiguringChanged(false)
// connect data // connect data
awKeys.needTextToBeUpdated.connect(needTextUpdate) awKeys.needTextToBeUpdated.connect(needTextUpdate)
awKeys.needToolTipToBeUpdated.connect(needToolTipUpdate) //awKeys.needToolTipToBeUpdated.connect(needToolTipUpdate)
// check updates if required // check updates if required
if (plasmoid.configuration.checkUpdates) return awActions.checkUpdates(false) if (plasmoid.configuration.checkUpdates) return awActions.checkUpdates(false)
} }
onNeedTextUpdate: newText => { onNeedTextUpdate: newText => {
if (debug) console.debug()
text.text = newText text.text = newText
sizeUpdate() sizeUpdate()
} }
onNeedToolTipUpdate: newText => { onNeedToolTipUpdate: newText => {
if (debug) console.debug()
tooltip.text = newText tooltip.text = newText
} }
onSizeUpdate: { onSizeUpdate: {
if (debug) console.debug()
// 16 is a magic number // 16 is a magic number
// in other case plasmoid will increase own size on each update // in other case plasmoid will increase own size on each update
if (plasmoid.configuration.height === 0) {
if (plasmoid.configuration.height == 0) {
Layout.minimumHeight = text.contentHeight - 16 Layout.minimumHeight = text.contentHeight - 16
Layout.maximumHeight = -1 Layout.maximumHeight = -1
} else { } else {
Layout.minimumHeight = plasmoid.configuration.height Layout.minimumHeight = plasmoid.configuration.height
Layout.maximumHeight = plasmoid.configuration.height Layout.maximumHeight = plasmoid.configuration.height
} }
if (plasmoid.configuration.width == 0) { if (plasmoid.configuration.width === 0) {
Layout.minimumWidth = text.contentWidth - 16 Layout.minimumWidth = text.contentWidth - 16
Layout.maximumWidth = -1 Layout.maximumWidth = -1
} else { } else {
@ -202,12 +165,10 @@ PlasmoidItem {
Plasmoid.onUserConfiguringChanged: { Plasmoid.onUserConfiguringChanged: {
if (plasmoid.userConfiguring) return if (plasmoid.userConfiguring) return
if (debug) console.debug()
// init submodule // init submodule
awKeys.initDataAggregator(tooltipSettings) awKeys.initDataAggregator(tooltipSettings)
awKeys.initKeys(plasmoid.configuration.text, plasmoid.configuration.interval, awKeys.initKeys(plasmoid.configuration.text, plasmoid.configuration.interval, plasmoid.configuration.optimize)
plasmoid.configuration.queueLimit, plasmoid.configuration.optimize)
awKeys.setWrapNewLines(plasmoid.configuration.wrapNewLines) awKeys.setWrapNewLines(plasmoid.configuration.wrapNewLines)
// configure aggregator // configure aggregator
awKeys.setAggregatorProperty("acOffline", plasmoid.configuration.acOffline) awKeys.setAggregatorProperty("acOffline", plasmoid.configuration.acOffline)
@ -216,49 +177,8 @@ PlasmoidItem {
awKeys.setAggregatorProperty("customUptime", plasmoid.configuration.customUptime) awKeys.setAggregatorProperty("customUptime", plasmoid.configuration.customUptime)
awKeys.setAggregatorProperty("tempUnits", plasmoid.configuration.tempUnits) awKeys.setAggregatorProperty("tempUnits", plasmoid.configuration.tempUnits)
awKeys.setAggregatorProperty("translate", plasmoid.configuration.translateStrings) awKeys.setAggregatorProperty("translate", plasmoid.configuration.translateStrings)
// update telemetry ID
if (plasmoid.configuration.telemetryId.length == 0)
plasmoid.configuration.telemetryId = generateUuid()
// save telemetry // save telemetry
awTelemetryHandler.init(plasmoid.configuration.telemetryCount, awTelemetryHandler.init(plasmoid.configuration.historyCount)
plasmoid.configuration.telemetryRemote, awTelemetryHandler.put("awwidgetconfig", plasmoid.configuration.text)
plasmoid.configuration.telemetryId)
if (awTelemetryHandler.put("awwidgetconfig", plasmoid.configuration.text))
awTelemetryHandler.uploadTelemetry("awwidgetconfig", plasmoid.configuration.text)
}
function action_checkUpdates() {
if (debug) console.debug()
return awActions.checkUpdates(true)
}
function action_showReadme() {
if (debug) console.debug()
return awActions.showReadme()
}
function action_reportBug() {
if (debug) console.debug()
bugReport.reset()
bugReport.open()
}
function action_requestKey() {
if (debug) console.debug()
tagSelectorBox.model = awKeys.dictKeys(true)
return tagSelector.open()
}
// code from http://stackoverflow.com/questions/105034/create-guid-uuid-in-javascript
function generateUuid() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
} }
} }

View File

@ -1,27 +0,0 @@
# Do not edit qmldir directly it will be overrided during compilation,
# edit qml/qmldir.in file instead.
# common QML constants
singleton General 1.0 file:///usr/share/awesomewidgets/qml/General.qml
# custom QML UI classes
AboutTab file:///usr/share/awesomewidgets/qml/AboutTab.qml
AWExtensions file:///usr/share/awesomewidgets/qml/AWExtensions.qml
AWInfoLabel file:///usr/share/awesomewidgets/qml/AWInfoLabel.qml
AWTagSelector file:///usr/share/awesomewidgets/qml/AWTagSelector.qml
AWTextEditor file:///usr/share/awesomewidgets/qml/AWTextEditor.qml
BugReport file:///usr/share/awesomewidgets/qml/BugReport.qml
ButtonSelector file:///usr/share/awesomewidgets/qml/ButtonSelector.qml
CheckBoxSelector file:///usr/share/awesomewidgets/qml/CheckBoxSelector.qml
ColorSelector file:///usr/share/awesomewidgets/qml/ColorSelector.qml
ComboBoxSelector file:///usr/share/awesomewidgets/qml/ComboBoxSelector.qml
ExportDialog file:///usr/share/awesomewidgets/qml/ExportDialog.qml
FontSelector file:///usr/share/awesomewidgets/qml/FontSelector.qml
HtmlDefaultFunctionsBar file:///usr/share/awesomewidgets/qml/HtmlDefaultFunctionsBar.qml
HtmlEditorButton file:///usr/share/awesomewidgets/qml/HtmlEditorButton.qml
HtmlEditorColor file:///usr/share/awesomewidgets/qml/HtmlEditorColor.qml
HtmlEditorFont file:///usr/share/awesomewidgets/qml/HtmlEditorFont.qml
ImportDialog file:///usr/share/awesomewidgets/qml/ImportDialog.qml
IntegerSelector file:///usr/share/awesomewidgets/qml/IntegerSelector.qml
LineSelector file:///usr/share/awesomewidgets/qml/LineSelector.qml

View File

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

View File

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

View File

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

View File

@ -10,11 +10,11 @@ include_directories(
${Kf6_INCLUDE} ${Kf6_INCLUDE}
) )
file(GLOB SUBPROJECT_SOURCE *.cpp ${PROJECT_TRDPARTY_DIR}/fontdialog/*.cpp ${CMAKE_SOURCE_DIR}/*.cpp) file(GLOB SUBPROJECT_SOURCE *.cpp formatters/*.cpp matchers/*.cpp ${PROJECT_TRDPARTY_DIR}/fontdialog/*.cpp ${CMAKE_SOURCE_DIR}/*.cpp)
file(GLOB SUBPROJECT_UI *.ui) file(GLOB SUBPROJECT_UI *.ui)
file(GLOB SUBPROJECT_NOTIFY *.notifyrc) file(GLOB SUBPROJECT_NOTIFY *.notifyrc)
qt6_wrap_ui(SUBPROJECT_UI_HEADER ${SUBPROJECT_UI}) qt6_wrap_ui(SUBPROJECT_UI_HEADER ${SUBPROJECT_UI} OPTIONS --translate ui_i18n)
add_library(${PLUGIN_NAME} SHARED ${SUBPROJECT_SOURCE} ${SUBPROJECT_UI_HEADER}) add_library(${PLUGIN_NAME} SHARED ${SUBPROJECT_SOURCE} ${SUBPROJECT_UI_HEADER})
target_link_libraries(${PLUGIN_NAME} ${PROJECT_LIBRARY} ${Qt_LIBRARIES} ${Kf6_LIBRARIES}) target_link_libraries(${PLUGIN_NAME} ${PROJECT_LIBRARY} ${Qt_LIBRARIES} ${Kf6_LIBRARIES})

View File

@ -37,13 +37,13 @@ AWAbstractPairConfig::AWAbstractPairConfig(QWidget *_parent, const bool _hasEdit
ui->setupUi(this); ui->setupUi(this);
connect(ui->buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &AWAbstractPairConfig::accept);
connect(ui->buttonBox, SIGNAL(rejected()), this, SLOT(reject())); connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &AWAbstractPairConfig::reject);
// edit feature // edit feature
if (m_hasEdit) { if (m_hasEdit) {
m_editButton = ui->buttonBox->addButton(i18n("Edit"), QDialogButtonBox::ActionRole); m_editButton = ui->buttonBox->addButton(i18n("Edit"), QDialogButtonBox::ActionRole);
connect(m_editButton, SIGNAL(clicked(bool)), this, SLOT(edit())); connect(m_editButton, &QPushButton::clicked, [this]() { return edit(); });
} }
} }
@ -58,6 +58,12 @@ AWAbstractPairConfig::~AWAbstractPairConfig()
} }
void AWAbstractPairConfig::setHelper(std::unique_ptr<AWAbstractPairHelper> _helper)
{
m_helper = std::move(_helper);
}
void AWAbstractPairConfig::showDialog() void AWAbstractPairConfig::showDialog()
{ {
// update dialog // update dialog
@ -84,14 +90,14 @@ void AWAbstractPairConfig::edit()
void AWAbstractPairConfig::updateUi() void AWAbstractPairConfig::updateUi()
{ {
QPair<QString, QString> current = dynamic_cast<AWAbstractSelector *>(sender())->current(); auto current = dynamic_cast<AWAbstractSelector *>(sender())->current();
int index = m_selectors.indexOf(dynamic_cast<AWAbstractSelector *>(sender())); auto index = m_selectors.indexOf(dynamic_cast<AWAbstractSelector *>(sender()));
if ((current.first.isEmpty()) && (current.second.isEmpty())) { if ((current.first.isEmpty()) && (current.second.isEmpty())) {
// remove current selector if it is empty and does not last // remove current selector if it is empty and does not last
if (sender() == m_selectors.last()) if (sender() == m_selectors.last())
return; return;
AWAbstractSelector *selector = m_selectors.takeAt(index); auto selector = m_selectors.takeAt(index);
ui->verticalLayout->removeWidget(selector); ui->verticalLayout->removeWidget(selector);
selector->deleteLater(); selector->deleteLater();
} else { } else {
@ -109,18 +115,18 @@ void AWAbstractPairConfig::addSelector(const QStringList &_keys, const QStringLi
{ {
qCDebug(LOG_AW) << "Add selector with keys" << _keys << "values" << _values << "and current ones" << _current; qCDebug(LOG_AW) << "Add selector with keys" << _keys << "values" << _values << "and current ones" << _current;
auto *selector = new AWAbstractSelector(ui->scrollAreaWidgetContents, m_editable); auto selector = new AWAbstractSelector(ui->scrollAreaWidgetContents, m_editable);
selector->init(_keys, _values, _current); selector->init(_keys, _values, _current);
ui->verticalLayout->insertWidget(ui->verticalLayout->count() - 1, selector); ui->verticalLayout->insertWidget(ui->verticalLayout->count() - 1, selector);
connect(selector, SIGNAL(selectionChanged()), this, SLOT(updateUi())); connect(selector, &AWAbstractSelector::selectionChanged, this, &AWAbstractPairConfig::updateUi);
m_selectors.append(selector); m_selectors.append(selector);
} }
void AWAbstractPairConfig::clearSelectors() void AWAbstractPairConfig::clearSelectors()
{ {
for (auto &selector : m_selectors) { for (auto selector : m_selectors) {
disconnect(selector, SIGNAL(selectionChanged()), this, SLOT(updateUi())); disconnect(selector, &AWAbstractSelector::selectionChanged, this, &AWAbstractPairConfig::updateUi);
ui->verticalLayout->removeWidget(selector); ui->verticalLayout->removeWidget(selector);
selector->deleteLater(); selector->deleteLater();
} }
@ -130,10 +136,10 @@ void AWAbstractPairConfig::clearSelectors()
void AWAbstractPairConfig::execDialog() void AWAbstractPairConfig::execDialog()
{ {
int ret = exec(); auto ret = exec();
QHash<QString, QString> data; QHash<QString, QString> data;
for (auto &selector : m_selectors) { for (auto selector : m_selectors) {
QPair<QString, QString> select = selector->current(); auto select = selector->current();
if (select.first.isEmpty()) if (select.first.isEmpty())
continue; continue;
data[select.first] = select.second; data[select.first] = select.second;
@ -160,11 +166,12 @@ QPair<QStringList, QStringList> AWAbstractPairConfig::initKeys() const
QStringList left = {""}; QStringList left = {""};
left.append(m_helper->leftKeys().isEmpty() ? m_keys : m_helper->leftKeys()); left.append(m_helper->leftKeys().isEmpty() ? m_keys : m_helper->leftKeys());
left.sort(); left.sort();
QStringList right = {""}; QStringList right = {""};
right.append(m_helper->rightKeys().isEmpty() ? m_keys : m_helper->rightKeys()); right.append(m_helper->rightKeys().isEmpty() ? m_keys : m_helper->rightKeys());
right.sort(); right.sort();
return QPair<QStringList, QStringList>(left, right); return {left, right};
} }
@ -175,7 +182,7 @@ void AWAbstractPairConfig::updateDialog()
auto keys = initKeys(); auto keys = initKeys();
for (auto &key : m_helper->keys()) for (auto &key : m_helper->keys())
addSelector(keys.first, keys.second, QPair<QString, QString>(key, m_helper->pairs()[key])); addSelector(keys.first, keys.second, {key, pairs[key]});
// empty one // empty one
addSelector(keys.first, keys.second, QPair<QString, QString>()); addSelector(keys.first, keys.second, {});
} }

View File

@ -15,9 +15,7 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/ ***************************************************************************/
#pragma once
#ifndef AWABSTRACTPAIRCONFIG_H
#define AWABSTRACTPAIRCONFIG_H
#include <QDialog> #include <QDialog>
@ -35,14 +33,9 @@ class AWAbstractPairConfig : public QDialog
Q_OBJECT Q_OBJECT
public: public:
explicit AWAbstractPairConfig(QWidget *_parent = nullptr, bool _hasEdit = false, QStringList _keys = QStringList()); explicit AWAbstractPairConfig(QWidget *_parent = nullptr, bool _hasEdit = false, QStringList _keys = {});
~AWAbstractPairConfig() override; ~AWAbstractPairConfig() override;
template <class T> void initHelper() void setHelper(std::unique_ptr<AWAbstractPairHelper> _helper);
{
delete m_helper;
m_helper = new T(this);
}
void showDialog(); void showDialog();
// properties // properties
void setEditable(bool _first, bool _second); void setEditable(bool _first, bool _second);
@ -54,7 +47,7 @@ private slots:
private: private:
QPushButton *m_editButton = nullptr; QPushButton *m_editButton = nullptr;
Ui::AWAbstractPairConfig *ui = nullptr; Ui::AWAbstractPairConfig *ui = nullptr;
AWAbstractPairHelper *m_helper = nullptr; std::unique_ptr<AWAbstractPairHelper> m_helper;
QList<AWAbstractSelector *> m_selectors; QList<AWAbstractSelector *> m_selectors;
// properties // properties
QPair<bool, bool> m_editable = {false, false}; QPair<bool, bool> m_editable = {false, false};
@ -67,6 +60,3 @@ private:
[[nodiscard]] QPair<QStringList, QStringList> initKeys() const; [[nodiscard]] QPair<QStringList, QStringList> initKeys() const;
void updateDialog(); void updateDialog();
}; };
#endif /* AWABSTRACTPAIRCONFIG_H */

View File

@ -34,12 +34,6 @@ AWAbstractPairHelper::AWAbstractPairHelper(QString _filePath, QString _section)
} }
AWAbstractPairHelper::~AWAbstractPairHelper()
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
}
QStringList AWAbstractPairHelper::keys() const QStringList AWAbstractPairHelper::keys() const
{ {
return m_pairs.keys(); return m_pairs.keys();
@ -69,16 +63,16 @@ void AWAbstractPairHelper::initItems()
{ {
m_pairs.clear(); m_pairs.clear();
QStringList configs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, m_filePath); auto configs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, m_filePath);
for (auto &fileName : configs) { for (auto &fileName : configs) {
QSettings settings(fileName, QSettings::IniFormat); QSettings settings(fileName, QSettings::IniFormat);
qCInfo(LOG_AW) << "Configuration file" << settings.fileName(); qCInfo(LOG_AW) << "Configuration file" << settings.fileName();
settings.beginGroup(m_section); settings.beginGroup(m_section);
QStringList keys = settings.childKeys(); auto keys = settings.childKeys();
for (auto &key : keys) { for (auto &key : keys) {
QString value = settings.value(key).toString(); auto value = settings.value(key).toString();
qCInfo(LOG_AW) << "Found key" << key << "for value" << value << "in" << settings.fileName(); qCInfo(LOG_AW) << "Found key" << key << "for value" << value << "in" << settings.fileName();
if (value.isEmpty()) { if (value.isEmpty()) {
qCInfo(LOG_AW) << "Skip empty value for" << key; qCInfo(LOG_AW) << "Skip empty value for" << key;
@ -95,8 +89,8 @@ bool AWAbstractPairHelper::writeItems(const QHash<QString, QString> &_configurat
{ {
qCDebug(LOG_AW) << "Write configuration" << _configuration; qCDebug(LOG_AW) << "Write configuration" << _configuration;
QString fileName auto fileName
= QString("%1/%2").arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)).arg(m_filePath); = QString("%1/%2").arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation), m_filePath);
QSettings settings(fileName, QSettings::IniFormat); QSettings settings(fileName, QSettings::IniFormat);
qCInfo(LOG_AW) << "Configuration file" << fileName; qCInfo(LOG_AW) << "Configuration file" << fileName;
@ -107,7 +101,7 @@ bool AWAbstractPairHelper::writeItems(const QHash<QString, QString> &_configurat
settings.sync(); settings.sync();
return (settings.status() == QSettings::NoError); return settings.status() == QSettings::NoError;
} }
@ -115,14 +109,13 @@ bool AWAbstractPairHelper::removeUnusedKeys(const QStringList &_keys) const
{ {
qCDebug(LOG_AW) << "Remove keys" << _keys; qCDebug(LOG_AW) << "Remove keys" << _keys;
QString fileName auto fileName
= QString("%1/%2").arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)).arg(m_filePath); = QString("%1/%2").arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation), m_filePath);
QSettings settings(fileName, QSettings::IniFormat); QSettings settings(fileName, QSettings::IniFormat);
qCInfo(LOG_AW) << "Configuration file" << fileName; qCInfo(LOG_AW) << "Configuration file" << fileName;
settings.beginGroup(m_section); settings.beginGroup(m_section);
QStringList foundKeys = settings.childKeys(); for (auto &key : settings.childKeys()) {
for (auto &key : foundKeys) {
if (_keys.contains(key)) if (_keys.contains(key))
continue; continue;
settings.remove(key); settings.remove(key);
@ -131,5 +124,5 @@ bool AWAbstractPairHelper::removeUnusedKeys(const QStringList &_keys) const
settings.sync(); settings.sync();
return (settings.status() == QSettings::NoError); return settings.status() == QSettings::NoError;
} }

View File

@ -15,9 +15,7 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/ ***************************************************************************/
#pragma once
#ifndef AWABSTRACTPAIRHELPER_H
#define AWABSTRACTPAIRHELPER_H
#include <QHash> #include <QHash>
@ -26,7 +24,7 @@ class AWAbstractPairHelper
{ {
public: public:
explicit AWAbstractPairHelper(QString _filePath = "", QString _section = ""); explicit AWAbstractPairHelper(QString _filePath = "", QString _section = "");
virtual ~AWAbstractPairHelper(); virtual ~AWAbstractPairHelper() = default;
[[nodiscard]] QStringList keys() const; [[nodiscard]] QStringList keys() const;
[[nodiscard]] QHash<QString, QString> pairs() const; [[nodiscard]] QHash<QString, QString> pairs() const;
[[nodiscard]] QStringList values() const; [[nodiscard]] QStringList values() const;
@ -46,6 +44,3 @@ private:
QString m_filePath; QString m_filePath;
QString m_section; QString m_section;
}; };
#endif /* AWABSTRACTPAIRHELPER_H */

View File

@ -31,8 +31,8 @@ AWAbstractSelector::AWAbstractSelector(QWidget *_parent, const QPair<bool, bool>
ui->comboBox_key->setEditable(_editable.first); ui->comboBox_key->setEditable(_editable.first);
ui->comboBox_value->setEditable(_editable.second); ui->comboBox_value->setEditable(_editable.second);
connect(ui->comboBox_key, SIGNAL(currentIndexChanged(int)), this, SIGNAL(selectionChanged())); connect(ui->comboBox_key, &QComboBox::currentIndexChanged, this, &AWAbstractSelector::selectionChanged);
connect(ui->comboBox_value, SIGNAL(currentIndexChanged(int)), this, SIGNAL(selectionChanged())); connect(ui->comboBox_value, &QComboBox::currentIndexChanged, this, &AWAbstractSelector::selectionChanged);
} }
@ -46,10 +46,10 @@ AWAbstractSelector::~AWAbstractSelector()
QPair<QString, QString> AWAbstractSelector::current() const QPair<QString, QString> AWAbstractSelector::current() const
{ {
QString key = ui->comboBox_key->currentText(); auto key = ui->comboBox_key->currentText();
QString value = ui->comboBox_value->currentText(); auto value = ui->comboBox_value->currentText();
return QPair<QString, QString>(key, value); return {key, value};
} }

View File

@ -15,9 +15,7 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/ ***************************************************************************/
#pragma once
#ifndef AWABSTRACTSELECTOR_H
#define AWABSTRACTSELECTOR_H
#include <QWidget> #include <QWidget>
@ -43,6 +41,3 @@ signals:
private: private:
Ui::AWAbstractSelector *ui = nullptr; Ui::AWAbstractSelector *ui = nullptr;
}; };
#endif /* AWABSTRACTSELECTOR_H */

View File

@ -40,12 +40,6 @@ AWActions::AWActions(QObject *_parent)
} }
AWActions::~AWActions()
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
}
void AWActions::checkUpdates(const bool _showAnyway) void AWActions::checkUpdates(const bool _showAnyway)
{ {
qCDebug(LOG_AW) << "Show anyway" << _showAnyway; qCDebug(LOG_AW) << "Show anyway" << _showAnyway;
@ -65,24 +59,17 @@ QString AWActions::getFileContent(const QString &_path)
return ""; return "";
} }
QString output = inputFile.readAll(); auto output = inputFile.readAll();
inputFile.close(); inputFile.close();
return output; return output;
} }
// HACK: since QML could not use QLoggingCategory I need this hack
bool AWActions::isDebugEnabled()
{
return LOG_AW().isDebugEnabled();
}
bool AWActions::runCmd(const QString &_cmd, const QStringList &_args) bool AWActions::runCmd(const QString &_cmd, const QStringList &_args)
{ {
qCDebug(LOG_AW) << "Cmd" << _cmd << "args" << _args; qCDebug(LOG_AW) << "Cmd" << _cmd << "args" << _args;
sendNotification(QString("Info"), i18n("Run %1", _cmd)); sendNotification("system", i18n("Run %1", _cmd));
return QProcess::startDetached(_cmd, _args); return QProcess::startDetached(_cmd, _args);
} }
@ -95,20 +82,6 @@ void AWActions::showReadme()
} }
void AWActions::showLegacyInfo()
{
auto *msgBox = new QMessageBox(nullptr);
msgBox->setAttribute(Qt::WA_DeleteOnClose);
msgBox->setModal(false);
msgBox->setWindowTitle(i18n("Not supported"));
msgBox->setText(i18n("You are using mammoth's Qt version, try to update it first"));
msgBox->setStandardButtons(QMessageBox::Ok);
msgBox->setIcon(QMessageBox::Information);
msgBox->open();
}
// HACK: this method uses variables from version.h // HACK: this method uses variables from version.h
QString AWActions::getAboutText(const QString &_type) QString AWActions::getAboutText(const QString &_type)
{ {
@ -123,10 +96,10 @@ QVariantMap AWActions::getFont(const QVariantMap &_defaultFont)
qCDebug(LOG_AW) << "Default font is" << _defaultFont; qCDebug(LOG_AW) << "Default font is" << _defaultFont;
QVariantMap fontMap; QVariantMap fontMap;
int ret = 0; auto ret = 0;
CFont defaultCFont = CFont(_defaultFont["family"].toString(), _defaultFont["size"].toInt(), 400, false, auto defaultCFont = CFont(_defaultFont["family"].toString(), _defaultFont["size"].toInt(), 400, false,
_defaultFont["color"].toString()); _defaultFont["color"].toString());
CFont font = CFontDialog::getFont(i18n("Select font"), defaultCFont, false, false, &ret); auto font = CFontDialog::getFont(i18n("Select font"), defaultCFont, false, false, &ret);
fontMap["applied"] = ret; fontMap["applied"] = ret;
fontMap["color"] = font.color().name(); fontMap["color"] = font.color().name();
@ -142,7 +115,6 @@ void AWActions::sendNotification(const QString &_eventId, const QString &_messag
{ {
qCDebug(LOG_AW) << "Event" << _eventId << "with message" << _message; qCDebug(LOG_AW) << "Event" << _eventId << "with message" << _message;
KNotification *notification auto event = KNotification::event(_eventId, QString("Awesome Widget ::: %1").arg(_eventId), _message);
= KNotification::event(_eventId, QString("Awesome Widget ::: %1").arg(_eventId), _message); event->setComponentName("plasma-applet-org.kde.plasma.awesome-widget");
notification->setComponentName("plasma-applet-org.kde.plasma.awesome-widget");
} }

View File

@ -15,9 +15,7 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/ ***************************************************************************/
#pragma once
#ifndef AWACTIONS_H
#define AWACTIONS_H
#include <QMap> #include <QMap>
#include <QObject> #include <QObject>
@ -31,12 +29,10 @@ class AWActions : public QObject
public: public:
explicit AWActions(QObject *_parent = nullptr); explicit AWActions(QObject *_parent = nullptr);
~AWActions() override; ~AWActions() override = default;
Q_INVOKABLE void checkUpdates(bool _showAnyway = false); Q_INVOKABLE void checkUpdates(bool _showAnyway = false);
Q_INVOKABLE static QString getFileContent(const QString &_path); Q_INVOKABLE static QString getFileContent(const QString &_path);
Q_INVOKABLE static bool isDebugEnabled();
Q_INVOKABLE static bool runCmd(const QString &_cmd, const QStringList &_args); Q_INVOKABLE static bool runCmd(const QString &_cmd, const QStringList &_args);
Q_INVOKABLE static void showLegacyInfo();
Q_INVOKABLE static void showReadme(); Q_INVOKABLE static void showReadme();
// configuration slots // configuration slots
Q_INVOKABLE static QString getAboutText(const QString &_type); Q_INVOKABLE static QString getAboutText(const QString &_type);
@ -48,6 +44,3 @@ public slots:
private: private:
AWUpdateHelper *m_updateHelper = nullptr; AWUpdateHelper *m_updateHelper = nullptr;
}; };
#endif /* AWACTIONS_H */

View File

@ -18,6 +18,7 @@
#include "awbugreporter.h" #include "awbugreporter.h"
#include <KI18n/KLocalizedString> #include <KI18n/KLocalizedString>
#include <KNotifications/KNotification>
#include <QDesktopServices> #include <QDesktopServices>
#include <QJsonDocument> #include <QJsonDocument>
@ -32,19 +33,24 @@ AWBugReporter::AWBugReporter(QObject *_parent)
: QObject(_parent) : QObject(_parent)
{ {
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
m_manager = new QNetworkAccessManager(nullptr);
connect(m_manager, &QNetworkAccessManager::finished, this, &AWBugReporter::issueReplyReceived);
} }
AWBugReporter::~AWBugReporter() AWBugReporter::~AWBugReporter()
{ {
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
m_manager->deleteLater();
} }
void AWBugReporter::doConnect() void AWBugReporter::doConnect() const
{ {
// additional method for testing needs // additional method for testing needs
connect(this, SIGNAL(replyReceived(const int, const QString &)), this, SLOT(showInformation(int, const QString &))); connect(this, &AWBugReporter::replyReceived, this, &AWBugReporter::showInformation);
} }
@ -71,26 +77,24 @@ void AWBugReporter::sendBugReport(const QString &_title, const QString &_body)
{ {
qCDebug(LOG_AW) << "Send bug report with title" << _title << "and body" << _body; qCDebug(LOG_AW) << "Send bug report with title" << _title << "and body" << _body;
auto *manager = new QNetworkAccessManager(nullptr);
connect(manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(issueReplyRecieved(QNetworkReply *)));
QNetworkRequest request = QNetworkRequest(QUrl(BUGTRACKER_API)); auto request = QNetworkRequest(QUrl(BUGTRACKER_API));
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
// generate payload // generate payload
QVariantMap payload; QVariantMap payload;
payload["title"] = _title; payload["title"] = _title;
payload["body"] = _body; payload["body"] = _body;
payload["labels"] = QStringList() << "from application"; payload["labels"] = QStringList({"from application"});
// convert to QByteArray to send request // convert to QByteArray to send request
QByteArray data = QJsonDocument::fromVariant(payload).toJson(QJsonDocument::Compact); auto data = QJsonDocument::fromVariant(payload).toJson(QJsonDocument::Compact);
qCInfo(LOG_AW) << "Send request with _body" << data.data() << "and size" << data.size(); qCInfo(LOG_AW) << "Send request with _body" << data.data() << "and size" << data.size();
manager->post(request, data); m_manager->post(request, data);
} }
void AWBugReporter::issueReplyRecieved(QNetworkReply *_reply) void AWBugReporter::issueReplyReceived(QNetworkReply *_reply)
{ {
if (_reply->error() != QNetworkReply::NoError) { if (_reply->error() != QNetworkReply::NoError) {
qCWarning(LOG_AW) << "An error occurs" << _reply->error() << "with message" << _reply->errorString(); qCWarning(LOG_AW) << "An error occurs" << _reply->error() << "with message" << _reply->errorString();
@ -98,7 +102,7 @@ void AWBugReporter::issueReplyRecieved(QNetworkReply *_reply)
} }
QJsonParseError error{}; QJsonParseError error{};
QJsonDocument jsonDoc = QJsonDocument::fromJson(_reply->readAll(), &error); auto jsonDoc = QJsonDocument::fromJson(_reply->readAll(), &error);
if (error.error != QJsonParseError::NoError) { if (error.error != QJsonParseError::NoError) {
qCWarning(LOG_AW) << "Parse error" << error.errorString(); qCWarning(LOG_AW) << "Parse error" << error.errorString();
return emit(replyReceived(0, "")); return emit(replyReceived(0, ""));
@ -106,14 +110,20 @@ void AWBugReporter::issueReplyRecieved(QNetworkReply *_reply)
_reply->deleteLater(); _reply->deleteLater();
// convert to map // convert to map
QVariantMap response = jsonDoc.toVariant().toMap(); auto response = jsonDoc.toVariant().toMap();
QString url = response["html_url"].toString(); auto url = response["html_url"].toString();
int number = response["number"].toInt(); auto number = response["number"].toInt();
return emit(replyReceived(number, url)); return emit(replyReceived(number, url));
} }
void AWBugReporter::openBugReport()
{
QDesktopServices::openUrl(m_lastBugUrl);
}
void AWBugReporter::showInformation(const int _number, const QString &_url) void AWBugReporter::showInformation(const int _number, const QString &_url)
{ {
qCDebug(LOG_AW) << "Created issue with number" << _number << "and url" << _url; qCDebug(LOG_AW) << "Created issue with number" << _number << "and url" << _url;
@ -121,29 +131,9 @@ void AWBugReporter::showInformation(const int _number, const QString &_url)
// cache url first // cache url first
m_lastBugUrl = _url; m_lastBugUrl = _url;
auto *msgBox = new QMessageBox(nullptr); auto event = KNotification::event("system", i18n("Issue created"), i18n("Issue %1 has been created", _number));
msgBox->setAttribute(Qt::WA_DeleteOnClose); event->setComponentName("plasma-applet-org.kde.plasma.awesome-widget");
msgBox->setModal(false);
msgBox->setWindowTitle(i18n("Issue created"));
msgBox->setText(i18n("Issue %1 has been created", _number));
msgBox->setStandardButtons(QMessageBox::Open | QMessageBox::Close);
msgBox->setIcon(QMessageBox::Information);
msgBox->open(this, SLOT(userReplyOnBugReport(QAbstractButton *))); auto action = event->addAction(i18n("Details"));
} connect(action, &KNotificationAction::activated, this, &AWBugReporter::openBugReport);
void AWBugReporter::userReplyOnBugReport(QAbstractButton *_button)
{
QMessageBox::ButtonRole ret = dynamic_cast<QMessageBox *>(sender())->buttonRole(_button);
qCInfo(LOG_AW) << "User select" << ret;
switch (ret) {
case QMessageBox::AcceptRole:
QDesktopServices::openUrl(m_lastBugUrl);
break;
case QMessageBox::RejectRole:
default:
break;
}
} }

View File

@ -15,24 +15,22 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/ ***************************************************************************/
#pragma once
#ifndef AWBUGREPORTER_H
#define AWBUGREPORTER_H
#include <QObject> #include <QObject>
class QAbstractButton; class QNetworkAccessManager;
class QNetworkReply; class QNetworkReply;
class AWBugReporter : public QObject class __attribute__((visibility("default"))) AWBugReporter : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit AWBugReporter(QObject *_parent = nullptr); explicit AWBugReporter(QObject *_parent = nullptr);
~AWBugReporter() override; ~AWBugReporter() override;
Q_INVOKABLE void doConnect(); Q_INVOKABLE void doConnect() const;
Q_INVOKABLE static QString generateText(const QString &_description, const QString &_reproduce, Q_INVOKABLE static QString generateText(const QString &_description, const QString &_reproduce,
const QString &_expected, const QString &_logs); const QString &_expected, const QString &_logs);
Q_INVOKABLE void sendBugReport(const QString &_title, const QString &_body); Q_INVOKABLE void sendBugReport(const QString &_title, const QString &_body);
@ -41,13 +39,11 @@ signals:
void replyReceived(int _number, const QString &_url); void replyReceived(int _number, const QString &_url);
private slots: private slots:
void issueReplyRecieved(QNetworkReply *_reply); void issueReplyReceived(QNetworkReply *_reply);
void openBugReport();
void showInformation(int _number, const QString &_url); void showInformation(int _number, const QString &_url);
void userReplyOnBugReport(QAbstractButton *_button);
private: private:
QString m_lastBugUrl; QString m_lastBugUrl;
QNetworkAccessManager *m_manager = nullptr;
}; };
#endif /* AWBUGREPORTER_H */

View File

@ -34,17 +34,11 @@ AWConfigHelper::AWConfigHelper(QObject *_parent)
} }
AWConfigHelper::~AWConfigHelper()
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
}
QString AWConfigHelper::configurationDirectory() QString AWConfigHelper::configurationDirectory()
{ {
// get readable directory // get readable directory
QString localDir = QString("%1/awesomewidgets/configs") auto localDir = QString("%1/awesomewidgets/configs")
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)); .arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation));
// create directory and copy files from default settings // create directory and copy files from default settings
QDir localDirectory; QDir localDirectory;
@ -59,7 +53,7 @@ QString AWConfigHelper::configurationDirectory()
bool AWConfigHelper::dropCache() bool AWConfigHelper::dropCache()
{ {
QString fileName auto fileName
= QString("%1/awesomewidgets.ndx").arg(QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation)); = QString("%1/awesomewidgets.ndx").arg(QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation));
return QFile(fileName).remove(); return QFile(fileName).remove();
@ -72,10 +66,10 @@ bool AWConfigHelper::exportConfiguration(QObject *_nativeConfig, const QString &
QSettings settings(_fileName, QSettings::IniFormat); QSettings settings(_fileName, QSettings::IniFormat);
// plasmoid configuration // plasmoid configuration
const auto *configuration = dynamic_cast<const QQmlPropertyMap *>(_nativeConfig); auto configuration = dynamic_cast<const QQmlPropertyMap *>(_nativeConfig);
settings.beginGroup("plasmoid"); settings.beginGroup("plasmoid");
for (auto &key : configuration->keys()) { for (auto &key : configuration->keys()) {
QVariant value = configuration->value(key); auto value = configuration->value(key);
if (!value.isValid()) if (!value.isValid())
continue; continue;
settings.setValue(key, value); settings.setValue(key, value);
@ -84,8 +78,7 @@ bool AWConfigHelper::exportConfiguration(QObject *_nativeConfig, const QString &
// extensions // extensions
for (auto &item : m_dirs) { for (auto &item : m_dirs) {
QStringList items auto items = QDir(QString("%1/%2").arg(m_baseDir, item)).entryList({"*.desktop"}, QDir::Files);
= QDir(QString("%1/%2").arg(m_baseDir).arg(item)).entryList(QStringList() << "*.desktop", QDir::Files);
settings.beginGroup(item); settings.beginGroup(item);
for (auto &it : items) for (auto &it : items)
copyExtensions(it, item, settings, false); copyExtensions(it, item, settings, false);
@ -163,16 +156,13 @@ QVariantMap AWConfigHelper::importConfiguration(const QString &_fileName, const
QVariantMap AWConfigHelper::readDataEngineConfiguration() QVariantMap AWConfigHelper::readDataEngineConfiguration()
{ {
QString fileName = QStandardPaths::locate(QStandardPaths::ConfigLocation, "plasma-dataengine-extsysmon.conf"); auto fileName = QStandardPaths::locate(QStandardPaths::ConfigLocation, "plasma-dataengine-extsysmon.conf");
qCInfo(LOG_AW) << "Configuration file" << fileName; qCInfo(LOG_AW) << "Configuration file" << fileName;
QSettings settings(fileName, QSettings::IniFormat); QSettings settings(fileName, QSettings::IniFormat);
QVariantMap configuration; QVariantMap configuration;
settings.beginGroup("Configuration"); settings.beginGroup("Configuration");
configuration["ACPIPATH"] = settings.value("ACPIPATH", "/sys/class/power_supply/"); configuration["ACPIPATH"] = settings.value("ACPIPATH", "/sys/class/power_supply/");
configuration["GPUDEV"] = settings.value("GPUDEV", "auto");
configuration["HDDDEV"] = settings.value("HDDDEV", "all");
configuration["HDDTEMPCMD"] = settings.value("HDDTEMPCMD", "sudo smartctl -a");
configuration["MPDADDRESS"] = settings.value("MPDADDRESS", "localhost"); configuration["MPDADDRESS"] = settings.value("MPDADDRESS", "localhost");
configuration["MPDPORT"] = settings.value("MPDPORT", "6600"); configuration["MPDPORT"] = settings.value("MPDPORT", "6600");
configuration["MPRIS"] = settings.value("MPRIS", "auto"); configuration["MPRIS"] = settings.value("MPRIS", "auto");
@ -190,16 +180,13 @@ bool AWConfigHelper::writeDataEngineConfiguration(const QVariantMap &_configurat
{ {
qCDebug(LOG_AW) << "Configuration" << _configuration; qCDebug(LOG_AW) << "Configuration" << _configuration;
QString fileName = QString("%1/plasma-dataengine-extsysmon.conf") auto fileName = QString("%1/plasma-dataengine-extsysmon.conf")
.arg(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation)); .arg(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation));
QSettings settings(fileName, QSettings::IniFormat); QSettings settings(fileName, QSettings::IniFormat);
qCInfo(LOG_AW) << "Configuration file" << settings.fileName(); qCInfo(LOG_AW) << "Configuration file" << settings.fileName();
settings.beginGroup("Configuration"); settings.beginGroup("Configuration");
settings.setValue("ACPIPATH", _configuration["ACPIPATH"]); settings.setValue("ACPIPATH", _configuration["ACPIPATH"]);
settings.setValue("GPUDEV", _configuration["GPUDEV"]);
settings.setValue("HDDDEV", _configuration["HDDDEV"]);
settings.setValue("HDDTEMPCMD", _configuration["HDDTEMPCMD"]);
settings.setValue("MPDADDRESS", _configuration["MPDADDRESS"]); settings.setValue("MPDADDRESS", _configuration["MPDADDRESS"]);
settings.setValue("MPDPORT", _configuration["MPDPORT"]); settings.setValue("MPDPORT", _configuration["MPDPORT"]);
settings.setValue("MPRIS", _configuration["MPRIS"]); settings.setValue("MPRIS", _configuration["MPRIS"]);
@ -217,15 +204,15 @@ void AWConfigHelper::copyConfigs(const QString &_localDir)
{ {
qCDebug(LOG_AW) << "Local directory" << _localDir; qCDebug(LOG_AW) << "Local directory" << _localDir;
QStringList dirs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, "awesomewidgets/configs", auto dirs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, "awesomewidgets/configs",
QStandardPaths::LocateDirectory); QStandardPaths::LocateDirectory);
for (auto &dir : dirs) { for (auto &dir : dirs) {
if (dir == _localDir) if (dir == _localDir)
continue; continue;
QStringList files = QDir(dir).entryList(QDir::Files); auto files = QDir(dir).entryList(QDir::Files);
for (auto &source : files) { for (auto &source : files) {
QString destination = QString("%1/%2").arg(_localDir).arg(source); auto destination = QString("%1/%2").arg(_localDir, source);
bool status = QFile::copy(QString("%1/%2").arg(dir).arg(source), destination); auto status = QFile::copy(QString("%1/%2").arg(dir, source), destination);
qCInfo(LOG_AW) << "File" << source << "has been copied to" << destination << "with status" << status; qCInfo(LOG_AW) << "File" << source << "has been copied to" << destination << "with status" << status;
} }
} }
@ -238,7 +225,7 @@ void AWConfigHelper::copyExtensions(const QString &_item, const QString &_type,
qCDebug(LOG_AW) << "Extension" << _item << "has type" << _type << "inverse copying" << _inverse; qCDebug(LOG_AW) << "Extension" << _item << "has type" << _type << "inverse copying" << _inverse;
_settings.beginGroup(_item); _settings.beginGroup(_item);
QSettings itemSettings(QString("%1/%2/%3").arg(m_baseDir).arg(_type).arg(_item), QSettings::IniFormat); QSettings itemSettings(QString("%1/%2/%3").arg(m_baseDir, _type, _item), QSettings::IniFormat);
itemSettings.beginGroup("Desktop Entry"); itemSettings.beginGroup("Desktop Entry");
if (_inverse) if (_inverse)
copySettings(_settings, itemSettings); copySettings(_settings, itemSettings);
@ -265,7 +252,7 @@ void AWConfigHelper::readFile(QSettings &_settings, const QString &_key, const Q
QFile file(_fileName); QFile file(_fileName);
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
QString text = QString::fromUtf8(file.readAll()); auto text = QString::fromUtf8(file.readAll());
file.close(); file.close();
_settings.setValue(_key, text); _settings.setValue(_key, text);
} else { } else {

View File

@ -15,9 +15,7 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/ ***************************************************************************/
#pragma once
#ifndef AWCONFIGHELPER_H
#define AWCONFIGHELPER_H
#include <QObject> #include <QObject>
#include <QVariant> #include <QVariant>
@ -25,13 +23,13 @@
class QSettings; class QSettings;
class AWConfigHelper : public QObject class __attribute__((visibility("default"))) AWConfigHelper : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit AWConfigHelper(QObject *_parent = nullptr); explicit AWConfigHelper(QObject *_parent = nullptr);
~AWConfigHelper() override; ~AWConfigHelper() override = default;
Q_INVOKABLE [[nodiscard]] static QString configurationDirectory(); Q_INVOKABLE [[nodiscard]] static QString configurationDirectory();
Q_INVOKABLE static bool dropCache(); Q_INVOKABLE static bool dropCache();
Q_INVOKABLE bool exportConfiguration(QObject *_nativeConfig, const QString &_fileName) const; Q_INVOKABLE bool exportConfiguration(QObject *_nativeConfig, const QString &_fileName) const;
@ -52,6 +50,3 @@ private:
QString m_baseDir; QString m_baseDir;
QStringList m_dirs = {"desktops", "quotes", "scripts", "upgrade", "weather", "formatters"}; QStringList m_dirs = {"desktops", "quotes", "scripts", "upgrade", "weather", "formatters"};
}; };
#endif /* AWCONFIGHELPER_H */

View File

@ -27,11 +27,5 @@ AWCustomKeysConfig::AWCustomKeysConfig(QWidget *_parent, const QStringList &_key
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
setEditable(true, false); setEditable(true, false);
initHelper<AWCustomKeysHelper>(); setHelper(std::make_unique<AWCustomKeysHelper>());
}
AWCustomKeysConfig::~AWCustomKeysConfig()
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
} }

View File

@ -15,9 +15,7 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/ ***************************************************************************/
#pragma once
#ifndef AWCUSTOMKEYSCONFIG_H
#define AWCUSTOMKEYSCONFIG_H
#include "awabstractpairconfig.h" #include "awabstractpairconfig.h"
@ -28,8 +26,5 @@ class AWCustomKeysConfig : public AWAbstractPairConfig
public: public:
explicit AWCustomKeysConfig(QWidget *_parent = nullptr, const QStringList &_keys = QStringList()); explicit AWCustomKeysConfig(QWidget *_parent = nullptr, const QStringList &_keys = QStringList());
~AWCustomKeysConfig() override; ~AWCustomKeysConfig() override = default;
}; };
#endif /* AWCUSTOMKEYSCONFIG_H */

View File

@ -30,12 +30,6 @@ AWCustomKeysHelper::AWCustomKeysHelper(QObject *_parent)
} }
AWCustomKeysHelper::~AWCustomKeysHelper()
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
}
QString AWCustomKeysHelper::source(const QString &_key) const QString AWCustomKeysHelper::source(const QString &_key) const
{ {
qCDebug(LOG_AW) << "Get source by key" << _key; qCDebug(LOG_AW) << "Get source by key" << _key;

View File

@ -15,9 +15,7 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/ ***************************************************************************/
#pragma once
#ifndef AWCUSTOMKEYSHELPER_H
#define AWCUSTOMKEYSHELPER_H
#include <QObject> #include <QObject>
@ -30,7 +28,7 @@ class AWCustomKeysHelper : public QObject, public AWAbstractPairHelper
public: public:
explicit AWCustomKeysHelper(QObject *_parent = nullptr); explicit AWCustomKeysHelper(QObject *_parent = nullptr);
~AWCustomKeysHelper() override; ~AWCustomKeysHelper() override = default;
// get // get
[[nodiscard]] QString source(const QString &_key) const; [[nodiscard]] QString source(const QString &_key) const;
[[nodiscard]] QStringList sources() const; [[nodiscard]] QStringList sources() const;
@ -39,9 +37,4 @@ public:
void editPairs() override{}; void editPairs() override{};
QStringList leftKeys() override; QStringList leftKeys() override;
QStringList rightKeys() override; QStringList rightKeys() override;
private:
}; };
#endif /* AWCUSTOMKEYSHELPER_H */

View File

@ -50,7 +50,8 @@ AWDataAggregator::~AWDataAggregator()
{ {
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
delete m_toolTipScene; m_toolTipView->deleteLater();
m_toolTipScene->deleteLater();
} }
@ -84,26 +85,26 @@ void AWDataAggregator::setParameters(const QVariantMap &_settings)
// resize tooltip image // resize tooltip image
m_toolTipView->resize(100 * m_counts, 105); m_toolTipView->resize(100 * m_counts, 105);
requiredKeys.clear(); m_requiredKeys.clear();
if (m_configuration["cpuTooltip"].toBool()) if (m_configuration["cpuTooltip"].toBool())
requiredKeys.append("cpuTooltip"); m_requiredKeys.append("cpuTooltip");
if (m_configuration["cpuclTooltip"].toBool()) if (m_configuration["cpuclTooltip"].toBool())
requiredKeys.append("cpuclTooltip"); m_requiredKeys.append("cpuclTooltip");
if (m_configuration["memTooltip"].toBool()) if (m_configuration["memTooltip"].toBool())
requiredKeys.append("memTooltip"); m_requiredKeys.append("memTooltip");
if (m_configuration["swapTooltip"].toBool()) if (m_configuration["swapTooltip"].toBool())
requiredKeys.append("swapTooltip"); m_requiredKeys.append("swapTooltip");
if (m_configuration["downkbTooltip"].toBool()) if (m_configuration["downkbTooltip"].toBool())
requiredKeys.append("downkbTooltip"); m_requiredKeys.append("downkbTooltip");
if (m_configuration["upkbTooltip"].toBool()) if (m_configuration["upkbTooltip"].toBool())
requiredKeys.append("upkbTooltip"); m_requiredKeys.append("upkbTooltip");
if (m_configuration["batTooltip"].toBool()) if (m_configuration["batTooltip"].toBool())
requiredKeys.append("batTooltip"); m_requiredKeys.append("batTooltip");
// background // background
m_toolTipScene->setBackgroundBrush(m_configuration["useTooltipBackground"].toBool() m_toolTipScene->setBackgroundBrush(m_configuration["useTooltipBackground"].toBool()
? QBrush(QColor(m_configuration["tooltipBackground"].toString())) ? QColor(m_configuration["tooltipBackground"].toString())
: QBrush(Qt::NoBrush)); : Qt::NoBrush);
} }
@ -112,34 +113,42 @@ QPixmap AWDataAggregator::tooltipImage()
// create image // create image
m_toolTipScene->clear(); m_toolTipScene->clear();
QPen pen; QPen pen;
bool down = false; auto shift = 0.0;
for (auto &key : requiredKeys) {
for (auto i = 0; i < m_requiredKeys.count(); ++i) {
auto key = m_requiredKeys[i];
// create frame // create frame
float normX = 100.0f / static_cast<float>(m_values[key].count()); auto normX = 100.0 / static_cast<float>(m_values[key].count());
float normY = 100.0f / (1.5f * m_boundaries[key]); auto normY = 100.0 / (1.5 * m_boundaries[key]);
float shift = static_cast<float>(requiredKeys.indexOf(key)) * 100.0f;
if (down)
shift -= 100.0;
// apply pen color // apply pen color
if (key != "batTooltip") if (key != "batTooltip")
pen.setColor(QColor(m_configuration[QString("%1Color").arg(key)].toString())); pen.setColor(m_configuration[QString("%1Color").arg(key)].toString());
// paint data inside frame // paint data inside frame
for (int j = 0; j < m_values[key].count() - 1; j++) { for (int j = 0; j < m_values[key].count() - 1; j++) {
// some magic here // some magic here
float x1 = j * normX + shift; auto x1 = j * normX + shift;
float y1 = -std::fabs(m_values[key].at(j)) * normY + 5.0f; auto y1 = -std::fabs(m_values[key].at(j)) * normY + 5.0;
float x2 = (j + 1) * normX + shift; auto x2 = (j + 1) * normX + shift;
float y2 = -std::fabs(m_values[key].at(j + 1)) * normY + 5.0f; auto y2 = -std::fabs(m_values[key].at(j + 1)) * normY + 5.0;
// apply color for the battery tooltip based on charge/discharge
if (key == "batTooltip") { if (key == "batTooltip") {
if (m_values[key].at(j + 1) > 0) if (m_values[key].at(j + 1) > 0)
pen.setColor(QColor(m_configuration["batTooltipColor"].toString())); pen.setColor(QColor(m_configuration["batTooltipColor"].toString()));
else else
pen.setColor(QColor(m_configuration["batInTooltipColor"].toString())); pen.setColor(QColor(m_configuration["batInTooltipColor"].toString()));
} }
m_toolTipScene->addLine(x1, y1, x2, y2, pen); m_toolTipScene->addLine(x1, y1, x2, y2, pen);
} }
if (key == "downkbTooltip")
down = true; // increase frame shift if not downkbtooltip
// Additional workaround is required because there is frame (uokb and downkb) which contains two charts
// with the same shift
if (key != "downkbTooltip")
shift += 100.0;
} }
return m_toolTipView->grab(); return m_toolTipView->grab();
@ -154,7 +163,7 @@ void AWDataAggregator::dataUpdate(const QVariantHash &_values)
} }
void AWDataAggregator::checkValue(const QString &_source, const float _value, const float _extremum) const void AWDataAggregator::checkValue(const QString &_source, const double _value, const double _extremum) const
{ {
qCDebug(LOG_AW) << "Notification source" << _source << "with value" << _value << "called with extremum" qCDebug(LOG_AW) << "Notification source" << _source << "with value" << _value << "called with extremum"
<< _extremum; << _extremum;
@ -227,25 +236,27 @@ void AWDataAggregator::setData(const QVariantHash &_values)
{ {
// do not log these arguments // do not log these arguments
// battery update requires info is AC online or not // battery update requires info is AC online or not
setData(_values["ac"].toString() == m_configuration["acOnline"], "batTooltip", _values["bat"].toFloat()); setData(_values["ac"].toString() == m_configuration["acOnline"], "batTooltip", _values["bat"].toDouble());
// usual case // usual case
setData("cpuTooltip", _values["cpu"].toFloat(), 90.0); setData("cpuTooltip", _values["cpu"].toDouble(), 90.0);
setData("cpuclTooltip", _values["cpucl"].toFloat()); setData("cpuclTooltip", _values["cpucl"].toDouble());
setData("memTooltip", _values["mem"].toFloat(), 80.0); setData("memTooltip", _values["mem"].toDouble(), 80.0);
setData("swapTooltip", _values["swap"].toFloat(), 0.0); setData("swapTooltip", _values["swap"].toDouble(), 0.0);
setData("downkbTooltip", _values["downkb"].toFloat()); setData("downkbTooltip", _values["downkb"].toDouble());
setData("upkbTooltip", _values["upkb"].toFloat()); setData("upkbTooltip", _values["upkb"].toDouble());
// additional check for network device // additional check for network device
[this](const QString &value) { auto currentNetworkDevice = _values["netdev"].toString();
checkValue("netdev", m_currentNetworkDevice, value); checkValue("netdev", m_currentNetworkDevice, currentNetworkDevice);
m_currentNetworkDevice = value; m_currentNetworkDevice = currentNetworkDevice;
}(_values["netdev"].toString());
// additional check for GPU load // additional check for GPU load
[this](const float value) { checkValue("gpu", value, 90.0); }(_values["gpu"].toFloat()); checkValue("gpu", _values["gpu"].toDouble(), 90.0);
} }
void AWDataAggregator::setData(const QString &_source, float _value, const float _extremum) void AWDataAggregator::setData(const QString &_source, double _value, const double _extremum)
{ {
qCDebug(LOG_AW) << "Source" << _source << "to value" << _value << "with extremum" << _extremum; qCDebug(LOG_AW) << "Source" << _source << "to value" << _value << "with extremum" << _extremum;
@ -261,16 +272,20 @@ void AWDataAggregator::setData(const QString &_source, float _value, const float
m_values[_source].append(_value); m_values[_source].append(_value);
if (_source == "downkbTooltip") { if (_source == "downkbTooltip") {
QList<float> netValues = m_values["downkbTooltip"] + m_values["upkbTooltip"]; // to avoid copying of objects to another list we find max elements in each sequence and compare them
// to avoid inf value of normY auto downMax = m_values["downkbTooltip"].empty()
netValues << 1.0; ? 1.0
m_boundaries["downkbTooltip"] = 1.2f * *std::max_element(netValues.cbegin(), netValues.cend()); : *std::max_element(m_values["downkbTooltip"].cbegin(), m_values["downkbTooltip"].cend());
m_boundaries["upkbTooltip"] = m_boundaries["downkbTooltip"]; auto upMax = m_values["upkbTooltip"].empty()
? 1.0
: *std::max_element(m_values["upkbTooltip"].cbegin(), m_values["upkbTooltip"].cend());
// assign both
m_boundaries["upkbTooltip"] = m_boundaries["downkbTooltip"] = 1.2 * std::max(downMax, upMax);
} }
} }
void AWDataAggregator::setData(const bool _dontInvert, const QString &_source, float _value) void AWDataAggregator::setData(const bool _dontInvert, const QString &_source, double _value)
{ {
qCDebug(LOG_AW) << "Do not invert" << _dontInvert << "value" << _value << "for source" << _source; qCDebug(LOG_AW) << "Do not invert" << _dontInvert << "value" << _value << "for source" << _source;

View File

@ -15,18 +15,14 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/ ***************************************************************************/
#pragma once
#ifndef AWTOOLTIP_H
#define AWTOOLTIP_H
#include <QObject>
#include <QVariant> #include <QVariant>
class QGraphicsScene; class QGraphicsScene;
class QGraphicsView; class QGraphicsView;
class QPixmap; class QPixmap;
class QThreadPool;
class AWDataAggregator : public QObject class AWDataAggregator : public QObject
{ {
@ -49,25 +45,22 @@ private:
// ui // ui
QGraphicsScene *m_toolTipScene = nullptr; QGraphicsScene *m_toolTipScene = nullptr;
QGraphicsView *m_toolTipView = nullptr; QGraphicsView *m_toolTipView = nullptr;
void checkValue(const QString &_source, float _value, float _extremum) const; void checkValue(const QString &_source, double _value, double _extremum) const;
void checkValue(const QString &_source, const QString &_current, const QString &_received) const; void checkValue(const QString &_source, const QString &_current, const QString &_received) const;
void initScene(); void initScene();
static QString notificationText(const QString &_source, float _value); static QString notificationText(const QString &_source, float _value);
static QString notificationText(const QString &_source, const QString &_value); static QString notificationText(const QString &_source, const QString &_value);
// main method // main method
void setData(const QVariantHash &_values); void setData(const QVariantHash &_values);
void setData(const QString &_source, float _value, float _extremum = -1.0f); void setData(const QString &_source, double _value, double _extremum = -1.0);
// different signature for battery device // different signature for battery device
void setData(bool _dontInvert, const QString &_source, float _value); void setData(bool _dontInvert, const QString &_source, double _value);
// variables // variables
int m_counts = 0; int m_counts = 0;
QVariantHash m_configuration; QVariantHash m_configuration;
QString m_currentNetworkDevice = "lo"; QString m_currentNetworkDevice = "lo";
QHash<QString, float> m_boundaries; QHash<QString, double> m_boundaries;
QHash<QString, QList<float>> m_values; QHash<QString, QList<double>> m_values;
bool m_enablePopup = false; bool m_enablePopup = false;
QStringList requiredKeys; QStringList m_requiredKeys;
}; };
#endif /* AWTOOLTIP_H */

View File

@ -89,6 +89,9 @@ void AWDataEngineAggregator::loadSources()
auto sensors = response.value(); auto sensors = response.value();
updateSensors(sensors); updateSensors(sensors);
connectSources(); connectSources();
for (auto &sensor : m_sensors.keys())
emit(deviceAdded(sensor));
} }
@ -121,6 +124,9 @@ void AWDataEngineAggregator::sensorAdded(const QString &_sensor)
m_interface->subscribe({_sensor}).waitForFinished(); m_interface->subscribe({_sensor}).waitForFinished();
m_subscribed.insert(_sensor); m_subscribed.insert(_sensor);
} }
// notify about new device
emit(deviceAdded(_sensor));
} }
@ -133,7 +139,7 @@ void AWDataEngineAggregator::sensorRemoved(const QString &_sensor)
} }
void AWDataEngineAggregator::updateData(KSysGuard::SensorDataList _data) void AWDataEngineAggregator::updateData(const KSysGuard::SensorDataList &_data)
{ {
emit(dataUpdated(m_sensors, _data)); emit(dataUpdated(m_sensors, _data));
} }
@ -141,9 +147,9 @@ void AWDataEngineAggregator::updateData(KSysGuard::SensorDataList _data)
void AWDataEngineAggregator::updateSensors(const QHash<QString, KSysGuard::SensorInfo> &_sensors) void AWDataEngineAggregator::updateSensors(const QHash<QString, KSysGuard::SensorInfo> &_sensors)
{ {
for (auto sensor = _sensors.cbegin(); sensor != _sensors.cend(); ++sensor) { for (auto [source, sensor] : _sensors.asKeyValueRange()) {
if (!isValidSensor(sensor.value())) if (!isValidSensor(sensor))
continue; continue;
m_sensors.insert(sensor.key(), sensor.value()); m_sensors.insert(source, sensor);
} }
} }

View File

@ -49,7 +49,7 @@ public slots:
void dropSource(const QString &_source); void dropSource(const QString &_source);
void sensorAdded(const QString &_sensor); void sensorAdded(const QString &_sensor);
void sensorRemoved(const QString &_sensor); void sensorRemoved(const QString &_sensor);
void updateData(KSysGuard::SensorDataList _data); void updateData(const KSysGuard::SensorDataList &_data);
void updateSensors(const QHash<QString, KSysGuard::SensorInfo> &_sensors); void updateSensors(const QHash<QString, KSysGuard::SensorInfo> &_sensors);
private: private:

View File

@ -21,6 +21,8 @@
#include "awdebug.h" #include "awdebug.h"
#include "awformatterhelper.h" #include "awformatterhelper.h"
#include "formatters/formatters.h"
#include "matchers/matchers.h"
AWDataEngineMapper::AWDataEngineMapper(QObject *_parent, AWFormatterHelper *_custom) AWDataEngineMapper::AWDataEngineMapper(QObject *_parent, AWFormatterHelper *_custom)
@ -30,39 +32,25 @@ AWDataEngineMapper::AWDataEngineMapper(QObject *_parent, AWFormatterHelper *_cus
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
// default formatters // default formatters
// memory
m_formatter["mem"] = AWKeysAggregator::FormatterType::Float;
m_formatter["memtotmb"] = AWKeysAggregator::FormatterType::MemMBFormat;
m_formatter["memtotgb"] = AWKeysAggregator::FormatterType::MemGBFormat;
// network // network
m_formatter["down"] = AWKeysAggregator::FormatterType::NetSmartFormat; m_formatter["down"] = AWPluginFormatterNet::instance();
m_formatter["downkb"] = AWKeysAggregator::FormatterType::Integer; m_formatter["downkb"] = AWPluginFormatterMemory::instance();
m_formatter["downtot"] = AWKeysAggregator::FormatterType::MemMBFormat; m_formatter["downtot"] = AWPluginFormatterMemoryMB::instance();
m_formatter["downtotkb"] = AWKeysAggregator::FormatterType::Integer; m_formatter["downtotkb"] = AWPluginFormatterMemory::instance();
m_formatter["downunits"] = AWKeysAggregator::FormatterType::NetSmartUnits; m_formatter["downunits"] = AWPluginFormatterNetUnits::instance();
m_formatter["up"] = AWKeysAggregator::FormatterType::NetSmartFormat; m_formatter["up"] = AWPluginFormatterNet::instance();
m_formatter["upkb"] = AWKeysAggregator::FormatterType::Integer; m_formatter["upkb"] = AWPluginFormatterMemory::instance();
m_formatter["uptot"] = AWKeysAggregator::FormatterType::MemMBFormat; m_formatter["uptot"] = AWPluginFormatterMemoryMB::instance();
m_formatter["uptotkb"] = AWKeysAggregator::FormatterType::Integer; m_formatter["uptotkb"] = AWPluginFormatterMemory::instance();
m_formatter["upunits"] = AWKeysAggregator::FormatterType::NetSmartUnits; m_formatter["upunits"] = AWPluginFormatterNetUnits::instance();
// swap
m_formatter["swap"] = AWKeysAggregator::FormatterType::Float;
m_formatter["swaptotmb"] = AWKeysAggregator::FormatterType::MemMBFormat;
m_formatter["swaptotgb"] = AWKeysAggregator::FormatterType::MemGBFormat;
} }
AWDataEngineMapper::~AWDataEngineMapper() AWPluginFormaterInterface *AWDataEngineMapper::formatter(const QString &_key) const
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
}
AWKeysAggregator::FormatterType AWDataEngineMapper::formatter(const QString &_key) const
{ {
qCDebug(LOG_AW) << "Get formatter for key" << _key; qCDebug(LOG_AW) << "Get formatter for key" << _key;
return m_formatter.value(_key, AWKeysAggregator::FormatterType::NoFormat); return m_formatter.value(_key, AWPluginFormatterNoFormat::instance());
} }
@ -81,368 +69,44 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
{ {
qCDebug(LOG_AW) << "Source" << _source << "with units" << _units; qCDebug(LOG_AW) << "Source" << _source << "with units" << _units;
// regular expressions auto matchers = AWPluginMatchers::matchers;
auto cpuRegExp = QRegularExpression("^cpu/cpu.*/usage$"); auto matcher = std::find_if(matchers.cbegin(), matchers.cend(),
auto cpuclRegExp = QRegularExpression("^cpu/cpu.*/frequency$"); [&_source](auto matcher) { return matcher->matches(_source); });
auto cpuTempRegExp = QRegularExpression("^cpu/cpu.*/temperature$"); if (matcher == matchers.cend())
auto hddrRegExp = QRegularExpression("^disk/.*/read$"); return {};
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 == "extsysmon/battery/ac") { auto foundKeys = (*matcher)->keys(_source, _units, m_settings);
// AC auto keys = foundKeys.keys(); // speedup a little bit
m_map.insert(_source, "ac");
m_formatter["ac"] = AWKeysAggregator::FormatterType::ACFormat;
} else if (_source.startsWith("extsysmon/battery/")) {
// battery stats
QString key = _source;
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/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("/usage");
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Float;
} 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("/frequency");
key = QString("cpucl%1").arg(key);
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Integer;
} else if (_source.startsWith("extsysmon/custom")) {
// custom
QString key = _source;
key.remove("extsysmon/custom/");
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source == "extsysmon/desktop/name") {
// current desktop name
m_map.insert(_source, "desktop");
m_formatter["desktop"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source == "extsysmon/desktop/number") {
// current desktop number
m_map.insert(_source, "ndesktop");
m_formatter["ndesktop"] = AWKeysAggregator::FormatterType::NoFormat;
} 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("disk/").remove("/read");
int index = m_devices["disk"].indexOf(device);
if (index > -1) {
QString key = QString("hddr%1").arg(index);
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Integer;
}
} else if (_source.contains(hddwRegExp)) {
// write speed
QString device = _source;
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 == "extsysmon/gpuload/load") {
// gpu load
m_map.insert(_source, "gpu");
m_formatter["gpu"] = AWKeysAggregator::FormatterType::Float;
} 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("disk/").remove("/usedPercent");
int index = m_devices["mount"].indexOf(device);
if (index > -1) {
QString key = QString("hdd%1").arg(index);
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Float;
// additional keys
m_formatter[QString("hddtotmb%1").arg(index)] = AWKeysAggregator::FormatterType::MemMBFormat;
m_formatter[QString("hddtotgb%1").arg(index)] = AWKeysAggregator::FormatterType::MemGBFormat;
}
} else if (_source.contains(mountFreeRegExp)) {
// free space
QString device = _source;
device.remove("disk/").remove("/free");
int index = m_devices["mount"].indexOf(device);
if (index > -1) {
// mb
QString key = QString("hddfreemb%1").arg(index);
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::MemMBFormat;
// gb
key = QString("hddfreegb%1").arg(index);
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::MemGBFormat;
}
} else if (_source.contains(mountUsedRegExp)) {
// used
QString device = _source;
device.remove("disk/").remove("/used");
int index = m_devices["mount"].indexOf(device);
if (index > -1) {
// mb
QString key = QString("hddmb%1").arg(index);
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::MemMBFormat;
// gb
key = QString("hddgb%1").arg(index);
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::MemGBFormat;
}
} else if (_source.startsWith("extsysmon/hdd/temperature")) {
// hdd temperature
QString device = _source;
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/loadaverages/loadaverage")) {
// load average
QString time = _source;
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 == "memory/physical/application") {
// app memory
// mb
m_map.insert(_source, "memmb");
m_formatter["memmb"] = AWKeysAggregator::FormatterType::MemMBFormat;
// gb
m_map.insert(_source, "memgb");
m_formatter["memgb"] = AWKeysAggregator::FormatterType::MemGBFormat;
} else if (_source == "memory/physical/free") {
// free memory
// mb
m_map.insert(_source, "memfreemb");
m_formatter["memfreemb"] = AWKeysAggregator::FormatterType::MemMBFormat;
// gb
m_map.insert(_source, "memfreegb");
m_formatter["memfreegb"] = AWKeysAggregator::FormatterType::MemGBFormat;
} else if (_source == "memory/physical/used") {
// used memory
// mb
m_map.insert(_source, "memusedmb");
m_formatter["memusedmb"] = AWKeysAggregator::FormatterType::MemMBFormat;
// gb
m_map.insert(_source, "memusedgb");
m_formatter["memusedgb"] = AWKeysAggregator::FormatterType::MemGBFormat;
} else if (_source == "extsysmon/network/device") {
// network device
m_map.insert(_source, "netdev");
m_formatter["netdev"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source == "extsysmon/network/ssid") {
// current ssid
m_map.insert(_source, "ssid");
m_formatter["ssid"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source.startsWith("extsysmon/requests/response")) {
// network response
QString key = _source;
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("download") ? "down" : "up";
int index = m_devices["net"].indexOf(_source.split('/')[2]);
if (index > -1) {
// kb
QString key = QString("%1kb%2").arg(type).arg(index);
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Integer;
// smart
key = QString("%1%2").arg(type).arg(index);
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::NetSmartFormat;
// units
key = QString("%1units%2").arg(type).arg(index);
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::NetSmartUnits;
}
} else if (_source.contains(netTotalRegExp)) {
// network data total
QString type = _source.contains("download") ? "down" : "up";
int index = m_devices["net"].indexOf(_source.split('/')[2]);
if (index > -1) {
// kb
QString key = QString("%1totkb%2").arg(type).arg(index);
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Integer;
// mb
key = QString("%1tot%2").arg(type).arg(index);
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::MemMBFormat;
}
} else if (_source.startsWith("extsysmon/upgrade")) {
// package manager
QString key = _source;
key.remove("extsysmon/upgrade/");
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::IntegerThree;
} else if (_source.startsWith("extsysmon/player")) {
// player
QString key = _source;
key.remove("extsysmon/player/");
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source == "extsysmon/ps/running") {
// running processes count
m_map.insert(_source, "pscount");
m_formatter["pscount"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source == "extsysmon/ps/list") {
// list of running processes
m_map.insert(_source, "ps");
m_formatter["ps"] = AWKeysAggregator::FormatterType::List;
} else if (_source == "extsysmon/ps/count") {
// total processes count
m_map.insert(_source, "pstot");
m_formatter["pstot"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source.startsWith("extsysmon/quotes")) {
// quotes
QString key = _source;
key.remove("extsysmon/quotes/");
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Quotes;
} else if (_source == "memory/swap/free") {
// free swap
// mb
m_map.insert(_source, "swapfreemb");
m_formatter["swapfreemb"] = AWKeysAggregator::FormatterType::MemMBFormat;
// gb
m_map.insert(_source, "swapfreegb");
m_formatter["swapfreegb"] = AWKeysAggregator::FormatterType::MemGBFormat;
} else if (_source == "memory/swap/used") {
// used swap
// mb
m_map.insert(_source, "swapmb");
m_formatter["swapmb"] = AWKeysAggregator::FormatterType::MemMBFormat;
// gb
m_map.insert(_source, "swapgb");
m_formatter["swapgb"] = AWKeysAggregator::FormatterType::MemGBFormat;
} else if (_source.startsWith("lmsensors/") || _source.contains(cpuTempRegExp)
|| _source == "cpu/all/averageTemperature") {
// temperature
auto index = m_devices["temp"].indexOf(_source);
// HACK on DE initialization there are no units key
if (_units == KSysGuard::UnitInvalid)
return QStringList({QString("temp%1").arg(index)});
if (index > -1) {
QString key = QString("temp%1").arg(index);
m_map.insert(_source, key);
m_formatter[key] = _units == KSysGuard::UnitCelsius ? AWKeysAggregator::FormatterType::Temperature
: AWKeysAggregator::FormatterType::Integer;
}
} else if (_source == "extsysmon/time/now") {
// time
m_map.insert(_source, "time");
m_formatter["time"] = AWKeysAggregator::FormatterType::Time;
// custom time
m_map.insert(_source, "ctime");
m_formatter["ctime"] = AWKeysAggregator::FormatterType::TimeCustom;
// ISO time
m_map.insert(_source, "isotime");
m_formatter["isotime"] = AWKeysAggregator::FormatterType::TimeISO;
// long time
m_map.insert(_source, "longtime");
m_formatter["longtime"] = AWKeysAggregator::FormatterType::TimeLong;
// short time
m_map.insert(_source, "shorttime");
m_formatter["shorttime"] = AWKeysAggregator::FormatterType::TimeShort;
// timestamp
m_map.insert(_source, "tstime");
m_formatter["tstime"] = AWKeysAggregator::FormatterType::Timestamp;
} else if (_source == "extsysmon/system/brightness") {
m_map.insert(_source, "brightness");
m_formatter["brightness"] = AWKeysAggregator::FormatterType::IntegerThree;
} else if (_source == "extsysmon/system/volume") {
m_map.insert(_source, "volume");
m_formatter["volume"] = AWKeysAggregator::FormatterType::IntegerThree;
} 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("extsysmon/weather/temperature")) {
// temperature
QString key = _source;
key.remove("extsysmon/weather/");
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Temperature;
} else if (_source.startsWith("extsysmon/weather/")) {
// other weather
QString key = _source;
key.remove("extsysmon/weather/");
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source.startsWith("extsysmon/load/load")) {
// load source
QString key = _source;
key.remove("extsysmon/load/");
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Temperature;
}
auto foundKeys = keysFromSource(_source);
// rewrite formatters for custom ones // rewrite formatters for custom ones
QStringList customFormattersKeys; QStringList customFormattersKeys;
if (m_customFormatters) if (m_customFormatters)
customFormattersKeys = m_customFormatters->definedFormatters(); customFormattersKeys = m_customFormatters->definedFormatters();
qCInfo(LOG_AW) << "Looking for formatters" << foundKeys << "in" << customFormattersKeys; qCInfo(LOG_AW) << "Looking for formatters" << keys << "in" << customFormattersKeys;
for (auto &key : foundKeys) { for (auto &key : keys) {
if (!customFormattersKeys.contains(key)) if (!customFormattersKeys.contains(key))
continue; continue;
m_formatter[key] = AWKeysAggregator::FormatterType::Custom; foundKeys[key] = AWPluginFormatterCustom::instance();
} }
// drop key from dictionary if no one user requested key required it // check if keys were actually requested
qCInfo(LOG_AW) << "Looking for keys" << foundKeys << "in" << _keys; qCInfo(LOG_AW) << "Looking for keys" << keys << "in" << _keys;
auto required = _keys.isEmpty() || std::any_of(foundKeys.cbegin(), foundKeys.cend(), [&_keys](const QString &key) { auto required = _keys.isEmpty()
return _keys.contains(key); || std::any_of(keys.cbegin(), keys.cend(), [&_keys](auto &key) { return _keys.contains(key); });
}); if (!required)
if (!required) { return {};
m_map.remove(_source);
for (auto &key : foundKeys) // insert keys into memory
m_formatter.remove(key); for (auto [key, formatter] : foundKeys.asKeyValueRange()) {
m_map.insert(_source, key);
m_formatter[key] = formatter;
} }
return keysFromSource(_source); return keys;
} }
void AWDataEngineMapper::setDevices(const QHash<QString, QStringList> &_devices) void AWDataEngineMapper::setDevices(const AWPluginMatcherSettings &_settings)
{ {
qCDebug(LOG_AW) << "Devices" << _devices; m_settings = _settings;
m_devices = _devices;
} }

View File

@ -15,16 +15,15 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/ ***************************************************************************/
#pragma once
#ifndef AWDATAENGINEMAPPER_H
#define AWDATAENGINEMAPPER_H
#include <ksysguard/formatter/Unit.h> #include <ksysguard/formatter/Unit.h>
#include <QMultiHash> #include <QMultiHash>
#include <QObject> #include <QObject>
#include "awkeysaggregator.h" #include "formatters/awpluginformatter.h"
#include "matchers/awpluginmatchersettings.h"
class AWFormatterHelper; class AWFormatterHelper;
@ -35,21 +34,19 @@ class AWDataEngineMapper : public QObject
public: public:
explicit AWDataEngineMapper(QObject *_parent = nullptr, AWFormatterHelper *_custom = nullptr); explicit AWDataEngineMapper(QObject *_parent = nullptr, AWFormatterHelper *_custom = nullptr);
~AWDataEngineMapper() override; ~AWDataEngineMapper() override = default;
// get methods // get methods
[[nodiscard]] AWKeysAggregator::FormatterType formatter(const QString &_key) const; [[nodiscard]] AWPluginFormaterInterface *formatter(const QString &_key) const;
[[nodiscard]] QStringList keysFromSource(const QString &_source) const; [[nodiscard]] QStringList keysFromSource(const QString &_source) const;
// set methods // set methods
QStringList registerSource(const QString &_source, const KSysGuard::Unit _units, const QStringList &_keys); QStringList registerSource(const QString &_source, KSysGuard::Unit _units, const QStringList &_keys);
void setDevices(const QHash<QString, QStringList> &_devices); void setDevices(const AWPluginMatcherSettings &_settings);
private: private:
AWFormatterHelper *m_customFormatters = nullptr; AWFormatterHelper *m_customFormatters = nullptr;
AWPluginMatcherSettings m_settings;
// variables // variables
QHash<QString, QStringList> m_devices; QHash<QString, QStringList> m_devices;
QHash<QString, AWKeysAggregator::FormatterType> m_formatter; QHash<QString, AWPluginFormaterInterface *> m_formatter;
QMultiHash<QString, QString> m_map; QMultiHash<QString, QString> m_map;
}; };
#endif /* AWDATAENGINEMAPPER_H */

View File

@ -32,27 +32,20 @@ AWDBusAdaptor::AWDBusAdaptor(AWKeys *_parent)
} }
AWDBusAdaptor::~AWDBusAdaptor()
{
qCDebug(LOG_DBUS) << __PRETTY_FUNCTION__;
}
QStringList AWDBusAdaptor::ActiveServices() QStringList AWDBusAdaptor::ActiveServices()
{ {
QDBusMessage listServices = QDBusConnection::sessionBus().interface()->call(QDBus::BlockWithGui, "ListNames"); auto listServices = QDBusConnection::sessionBus().interface()->call(QDBus::BlockWithGui, "ListNames");
if (listServices.arguments().isEmpty()) { if (listServices.arguments().isEmpty()) {
qCWarning(LOG_DBUS) << "Could not find any DBus service"; qCWarning(LOG_DBUS) << "Could not find any DBus service";
return {}; return {};
} }
QStringList arguments = listServices.arguments().first().toStringList(); auto arguments = listServices.arguments().first().toStringList();
return std::accumulate(arguments.cbegin(), arguments.cend(), QStringList(), return std::accumulate(arguments.cbegin(), arguments.cend(), QStringList(), [](auto source, auto &service) {
[](QStringList source, const QString &service) { if (service.startsWith(AWDBUS_SERVICE))
if (service.startsWith(AWDBUS_SERVICE)) source.append(service);
source.append(service); return source;
return source; });
});
} }
@ -103,6 +96,6 @@ void AWDBusAdaptor::SetLogLevel(const QString &what, const QString &level, const
return; return;
} }
QString state = enabled ? "true" : "false"; auto state = enabled ? "true" : "false";
QLoggingCategory::setFilterRules(QString("%1.%2=%3").arg(what).arg(level).arg(state)); QLoggingCategory::setFilterRules(QString("%1.%2=%3").arg(what, level, state));
} }

View File

@ -15,9 +15,7 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/ ***************************************************************************/
#pragma once
#ifndef AWDBUSADAPTOR_H
#define AWDBUSADAPTOR_H
#include <QDBusAbstractAdaptor> #include <QDBusAbstractAdaptor>
@ -33,7 +31,7 @@ class AWDBusAdaptor : public QDBusAbstractAdaptor
public: public:
explicit AWDBusAdaptor(AWKeys *_parent = nullptr); explicit AWDBusAdaptor(AWKeys *_parent = nullptr);
~AWDBusAdaptor() override; ~AWDBusAdaptor() override = default;
public slots: public slots:
// get methods // get methods
@ -50,6 +48,3 @@ private:
AWKeys *m_plugin = nullptr; AWKeys *m_plugin = nullptr;
QStringList m_logLevels = {"debug", "info", "warning", "critical"}; QStringList m_logLevels = {"debug", "info", "warning", "critical"};
}; };
#endif /* AWDBUSADAPTOR_H */

View File

@ -15,9 +15,7 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/ ***************************************************************************/
#pragma once
#ifndef AWPLUGIN_H
#define AWPLUGIN_H
#include <QQmlExtensionPlugin> #include <QQmlExtensionPlugin>
@ -30,6 +28,3 @@ class AWPlugin : public QQmlExtensionPlugin
public: public:
void registerTypes(const char *uri) override; void registerTypes(const char *uri) override;
}; };
#endif /* AWPLUGIN_H */

View File

@ -27,11 +27,5 @@ AWFormatterConfig::AWFormatterConfig(QWidget *_parent, const QStringList &_keys)
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
setEditable(false, false); setEditable(false, false);
initHelper<AWFormatterHelper>(); setHelper(std::make_unique<AWFormatterHelper>());
}
AWFormatterConfig::~AWFormatterConfig()
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
} }

View File

@ -15,9 +15,7 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/ ***************************************************************************/
#pragma once
#ifndef AWFORMATTERCONFIG_H
#define AWFORMATTERCONFIG_H
#include "awabstractpairconfig.h" #include "awabstractpairconfig.h"
@ -28,8 +26,5 @@ class AWFormatterConfig : public AWAbstractPairConfig
public: public:
explicit AWFormatterConfig(QWidget *_parent = nullptr, const QStringList &_keys = QStringList()); explicit AWFormatterConfig(QWidget *_parent = nullptr, const QStringList &_keys = QStringList());
~AWFormatterConfig() override; ~AWFormatterConfig() override = default;
}; };
#endif /* AWFORMATTERCONFIG_H */

View File

@ -33,7 +33,7 @@
#include "awstringformatter.h" #include "awstringformatter.h"
AWFormatterHelper::AWFormatterHelper(QWidget *_parent) AWFormatterHelper::AWFormatterHelper(QObject *_parent)
: AbstractExtItemAggregator(_parent, "formatters") : AbstractExtItemAggregator(_parent, "formatters")
, AWAbstractPairHelper("awesomewidgets/formatters/formatters.ini", "Formatters") , AWAbstractPairHelper("awesomewidgets/formatters/formatters.ini", "Formatters")
{ {
@ -58,8 +58,7 @@ void AWFormatterHelper::initItems()
// assign internal storage // assign internal storage
m_formatters.clear(); m_formatters.clear();
for (auto &key : pairs().keys()) { for (auto [key, name] : pairs().asKeyValueRange()) {
auto name = pairs()[key];
if (!m_formattersClasses.contains(name)) { if (!m_formattersClasses.contains(name)) {
qCWarning(LOG_AW) << "Invalid formatter" << name << "found in" << key; qCWarning(LOG_AW) << "Invalid formatter" << name << "found in" << key;
continue; continue;
@ -87,7 +86,7 @@ QStringList AWFormatterHelper::definedFormatters() const
QList<AbstractExtItem *> AWFormatterHelper::items() const QList<AbstractExtItem *> AWFormatterHelper::items() const
{ {
QList<AbstractExtItem *> converted; QList<AbstractExtItem *> converted;
for (auto &item : m_formattersClasses.values()) for (auto item : m_formattersClasses.values())
converted.append(item); converted.append(item);
return converted; return converted;
@ -123,7 +122,7 @@ AWAbstractFormatter::FormatterClass AWFormatterHelper::defineFormatterClass(cons
{ {
qCDebug(LOG_AW) << "Define formatter class for" << _stringType; qCDebug(LOG_AW) << "Define formatter class for" << _stringType;
AWAbstractFormatter::FormatterClass formatter = AWAbstractFormatter::FormatterClass::NoFormat; auto formatter = AWAbstractFormatter::FormatterClass::NoFormat;
if (_stringType == "DateTime") if (_stringType == "DateTime")
formatter = AWAbstractFormatter::FormatterClass::DateTime; formatter = AWAbstractFormatter::FormatterClass::DateTime;
else if (_stringType == "Float") else if (_stringType == "Float")
@ -151,17 +150,17 @@ void AWFormatterHelper::initFormatters()
auto dirs = directories(); auto dirs = directories();
for (auto &dir : dirs) { for (auto &dir : dirs) {
QStringList files = QDir(dir).entryList(QDir::Files, QDir::Name); auto files = QDir(dir).entryList(QDir::Files, QDir::Name);
for (auto &file : files) { for (auto &file : files) {
// check filename // check filename
if (!file.endsWith(".desktop")) if (!file.endsWith(".desktop"))
continue; continue;
qCInfo(LOG_AW) << "Found file" << file << "in" << dir; qCInfo(LOG_AW) << "Found file" << file << "in" << dir;
QString filePath = QString("%1/%2").arg(dir).arg(file); auto filePath = QString("%1/%2").arg(dir, file);
// check if already exists // check if already exists
auto values = m_formattersClasses.values(); auto values = m_formattersClasses.values();
if (std::any_of(values.cbegin(), values.cend(), if (std::any_of(values.cbegin(), values.cend(),
[&filePath](const AWAbstractFormatter *item) { return (item->fileName() == filePath); })) [&filePath](auto item) { return (item->filePath() == filePath); }))
continue; continue;
auto metadata = readMetadata(filePath); auto metadata = readMetadata(filePath);
@ -198,13 +197,14 @@ QPair<QString, AWAbstractFormatter::FormatterClass> AWFormatterHelper::readMetad
qCDebug(LOG_AW) << "Read initial parameters from" << _filePath; qCDebug(LOG_AW) << "Read initial parameters from" << _filePath;
QSettings settings(_filePath, QSettings::IniFormat); QSettings settings(_filePath, QSettings::IniFormat);
settings.beginGroup("Desktop Entry"); settings.beginGroup("Desktop Entry");
auto name = settings.value("Name", _filePath).toString(); auto name = settings.value("Name", _filePath).toString();
auto type = settings.value("X-AW-Type", "NoFormat").toString(); auto type = settings.value("X-AW-Type", "NoFormat").toString();
auto formatter = defineFormatterClass(type); auto formatter = defineFormatterClass(type);
settings.endGroup(); settings.endGroup();
return QPair<QString, AWAbstractFormatter::FormatterClass>(name, formatter); return {name, formatter};
} }
@ -219,7 +219,7 @@ void AWFormatterHelper::doCreateItem(QListWidget *_widget)
} }
qCInfo(LOG_AW) << "Selected type" << select; qCInfo(LOG_AW) << "Selected type" << select;
AWAbstractFormatter::FormatterClass formatter = defineFormatterClass(select); auto formatter = defineFormatterClass(select);
switch (formatter) { switch (formatter) {
case AWAbstractFormatter::FormatterClass::DateTime: case AWAbstractFormatter::FormatterClass::DateTime:
return createItem<AWDateTimeFormatter>(_widget); return createItem<AWDateTimeFormatter>(_widget);

View File

@ -15,9 +15,7 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/ ***************************************************************************/
#pragma once
#ifndef AWFORMATTERHELPER_H
#define AWFORMATTERHELPER_H
#include "abstractextitemaggregator.h" #include "abstractextitemaggregator.h"
#include "awabstractformatter.h" #include "awabstractformatter.h"
@ -29,7 +27,7 @@ class AWFormatterHelper : public AbstractExtItemAggregator, public AWAbstractPai
Q_OBJECT Q_OBJECT
public: public:
explicit AWFormatterHelper(QWidget *_parent = nullptr); explicit AWFormatterHelper(QObject *_parent = nullptr);
~AWFormatterHelper() override; ~AWFormatterHelper() override;
// read-write methods // read-write methods
void initItems() override; void initItems() override;
@ -56,6 +54,3 @@ private:
QHash<QString, AWAbstractFormatter *> m_formatters; QHash<QString, AWAbstractFormatter *> m_formatters;
QHash<QString, AWAbstractFormatter *> m_formattersClasses; QHash<QString, AWAbstractFormatter *> m_formattersClasses;
}; };
#endif /* AWFORMATTERHELPER_H */

View File

@ -31,7 +31,7 @@ bool AWKeyCache::addKeyToCache(const QString &_type, const QString &_key)
{ {
qCDebug(LOG_AW) << "Key" << _key << "with type" << _type; qCDebug(LOG_AW) << "Key" << _key << "with type" << _type;
QString fileName auto fileName
= QString("%1/awesomewidgets.ndx").arg(QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation)); = QString("%1/awesomewidgets.ndx").arg(QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation));
qCInfo(LOG_AW) << "Cache file" << fileName; qCInfo(LOG_AW) << "Cache file" << fileName;
QSettings cache(fileName, QSettings::IniFormat); QSettings cache(fileName, QSettings::IniFormat);
@ -41,21 +41,10 @@ bool AWKeyCache::addKeyToCache(const QString &_type, const QString &_key)
for (auto &number : cache.allKeys()) for (auto &number : cache.allKeys())
cachedValues.append(cache.value(number).toString()); cachedValues.append(cache.value(number).toString());
if (_type == "hdd") { if (_type == "net") {
QStringList allDevices = QDir("/dev").entryList(QDir::System, QDir::Name); auto rawInterfaceList = QNetworkInterface::allInterfaces();
QStringList devices = allDevices.filter(QRegularExpression("^[hms]d[a-z]$"));
for (auto &dev : devices) {
QString device = QString("/dev/%1").arg(dev);
if (cachedValues.contains(device))
continue;
qCInfo(LOG_AW) << "Found new key" << device << "for type" << _type;
cachedValues.append(device);
cache.setValue(QString("%1").arg(cache.allKeys().count(), 3, 10, QChar('0')), device);
}
} else if (_type == "net") {
QList<QNetworkInterface> rawInterfaceList = QNetworkInterface::allInterfaces();
for (auto &interface : rawInterfaceList) { for (auto &interface : rawInterfaceList) {
QString device = interface.name(); auto device = interface.name();
if (cachedValues.contains(device)) if (cachedValues.contains(device))
continue; continue;
qCInfo(LOG_AW) << "Found new key" << device << "for type" << _type; qCInfo(LOG_AW) << "Found new key" << device << "for type" << _type;
@ -85,66 +74,27 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, const QStringL
used.unite(QSet(_bars.cbegin(), _bars.cend())); used.unite(QSet(_bars.cbegin(), _bars.cend()));
used.unite(QSet(_userKeys.cbegin(), _userKeys.cend())); used.unite(QSet(_userKeys.cbegin(), _userKeys.cend()));
// insert keys from tooltip // insert keys from tooltip
for (auto &key : _tooltip.keys()) { for (auto [key, value] : _tooltip.asKeyValueRange()) {
if ((key.endsWith("Tooltip")) && (_tooltip[key].toBool())) { if ((key.endsWith("Tooltip")) && value.toBool()) {
key.remove("Tooltip"); auto local = key;
used << key; local.remove("Tooltip");
used << local;
} }
} }
// insert depending keys, refer to AWKeys::calculateValues() // insert keys which depend on others, refer to AWKeys::calculateValues()
// hddtotmb*
for (auto &key : _allKeys.filter(QRegularExpression("^hddtotmb"))) {
if (!used.contains(key))
continue;
key.remove("hddtotmb");
int index = key.toInt();
used << QString("hddfreemb%1").arg(index) << QString("hddmb%1").arg(index);
}
// hddtotgb*
for (auto &key : _allKeys.filter(QRegularExpression("^hddtotgb"))) {
if (!used.contains(key))
continue;
key.remove("hddtotgb");
int index = key.toInt();
used << QString("hddfreegb%1").arg(index) << QString("hddgb%1").arg(index);
}
// mem
if (used.contains("mem"))
used << "memmb"
<< "memtotmb";
// memtotmb
if (used.contains("memtotmb"))
used << "memusedmb"
<< "memfreemb";
// memtotgb
if (used.contains("memtotgb"))
used << "memusedgb"
<< "memfreegb";
// swap
if (used.contains("swap"))
used << "swapmb"
<< "swaptotmb";
// swaptotmb
if (used.contains("swaptotmb"))
used << "swapmb"
<< "swapfreemb";
// memtotgb
if (used.contains("swaptotgb"))
used << "swapgb"
<< "swapfreegb";
// network keys // network keys
QStringList netKeys( QStringList netKeys(
{"up", "upkb", "uptot", "uptotkb", "upunits", "down", "downkb", "downtot", "downtotkb", "downunits"}); {"up", "upkb", "uptot", "uptotkb", "upunits", "down", "downkb", "downtot", "downtotkb", "downunits"});
for (auto &key : netKeys) { for (auto &key : netKeys) {
if (!used.contains(key)) if (!used.contains(key))
continue; continue;
QStringList filt = _allKeys.filter(QRegularExpression(QString("^%1[0-9]{1,}").arg(key))); auto filt = _allKeys.filter(QRegularExpression(QString("^%1[0-9]{1,}").arg(key)));
for (auto &filtered : filt) for (auto &filtered : filt)
used << filtered; used << filtered;
} }
// netdev key // netdev key
if (std::any_of(netKeys.cbegin(), netKeys.cend(), [&used](const QString &key) { return used.contains(key); })) if (std::any_of(netKeys.cbegin(), netKeys.cend(), [&used](auto &key) { return used.contains(key); }))
used << "netdev"; used << "netdev";
// HACK append dummy if there are no other keys. This hack is required // HACK append dummy if there are no other keys. This hack is required
@ -156,18 +106,23 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, const QStringL
} }
QHash<QString, QStringList> AWKeyCache::loadKeysFromCache() AWPluginMatcherSettings AWKeyCache::loadKeysFromCache()
{ {
QString fileName auto fileName
= QString("%1/awesomewidgets.ndx").arg(QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation)); = QString("%1/awesomewidgets.ndx").arg(QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation));
qCInfo(LOG_AW) << "Cache file" << fileName; qCInfo(LOG_AW) << "Cache file" << fileName;
QSettings cache(fileName, QSettings::IniFormat); QSettings cache(fileName, QSettings::IniFormat);
QHash<QString, QStringList> devices; AWPluginMatcherSettings devices;
for (auto &group : cache.childGroups()) { QHash<QString, QStringList *> groups = {
{"disk", &devices.disk}, {"gpu", &devices.gpu}, {"mount", &devices.mount},
{"net", &devices.network}, {"temp", &devices.sensors},
};
for (auto [group, list] : groups.asKeyValueRange()) {
cache.beginGroup(group); cache.beginGroup(group);
for (auto &key : cache.allKeys()) for (auto &key : cache.allKeys())
devices[group].append(cache.value(key).toString()); list->append(cache.value(key).toString());
cache.endGroup(); cache.endGroup();
} }

View File

@ -15,22 +15,18 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/ ***************************************************************************/
#pragma once
#ifndef AWKEYCACHE_H
#define AWKEYCACHE_H
#include <QHash>
#include <QString> #include <QString>
#include <QVariant> #include <QVariant>
#include <matchers/awpluginmatchersettings.h>
namespace AWKeyCache namespace AWKeyCache
{ {
bool addKeyToCache(const QString &_type, const QString &_key = ""); bool addKeyToCache(const QString &_type, const QString &_key = "");
QStringList getRequiredKeys(const QStringList &_keys, const QStringList &_bars, const QVariantMap &_tooltip, QStringList getRequiredKeys(const QStringList &_keys, const QStringList &_bars, const QVariantMap &_tooltip,
const QStringList &_userKeys, const QStringList &_allKeys); const QStringList &_userKeys, const QStringList &_allKeys);
QHash<QString, QStringList> loadKeysFromCache(); AWPluginMatcherSettings loadKeysFromCache();
} // namespace AWKeyCache } // namespace AWKeyCache
#endif /* AWKEYCACHE_H */

View File

@ -40,30 +40,16 @@ AWKeyOperations::AWKeyOperations(QObject *_parent)
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
m_customKeys = new AWCustomKeysHelper(this); m_customKeys = new AWCustomKeysHelper(this);
m_graphicalItems = new ExtItemAggregator<GraphicalItem>(nullptr, "desktops"); m_graphicalItems = new ExtItemAggregator<GraphicalItem>(this, "desktops");
m_extNetRequest = new ExtItemAggregator<ExtNetworkRequest>(nullptr, "requests"); m_extNetRequest = new ExtItemAggregator<ExtNetworkRequest>(this, "requests");
m_extQuotes = new ExtItemAggregator<ExtQuotes>(nullptr, "quotes"); m_extQuotes = new ExtItemAggregator<ExtQuotes>(this, "quotes");
m_extScripts = new ExtItemAggregator<ExtScript>(nullptr, "scripts"); m_extScripts = new ExtItemAggregator<ExtScript>(this, "scripts");
m_extUpgrade = new ExtItemAggregator<ExtUpgrade>(nullptr, "upgrade"); m_extUpgrade = new ExtItemAggregator<ExtUpgrade>(this, "upgrade");
m_extWeather = new ExtItemAggregator<ExtWeather>(nullptr, "weather"); m_extWeather = new ExtItemAggregator<ExtWeather>(this, "weather");
} }
AWKeyOperations::~AWKeyOperations() AWPluginMatcherSettings AWKeyOperations::devices() const
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
}
QStringList AWKeyOperations::devices(const QString &_type) const
{
qCDebug(LOG_AW) << "Looking for type" << _type;
return m_devices[_type];
}
QHash<QString, QStringList> AWKeyOperations::devices() const
{ {
return m_devices; return m_devices;
} }
@ -72,7 +58,6 @@ QHash<QString, QStringList> AWKeyOperations::devices() const
void AWKeyOperations::updateCache() void AWKeyOperations::updateCache()
{ {
// update network and hdd list // update network and hdd list
addKeyToCache("hdd");
addKeyToCache("net"); addKeyToCache("net");
} }
@ -81,7 +66,7 @@ QStringList AWKeyOperations::dictKeys() const
{ {
QStringList allKeys; QStringList allKeys;
// weather // weather
for (auto &item : m_extWeather->activeItems()) { for (auto item : m_extWeather->activeItems()) {
allKeys.append(item->tag("weatherId")); allKeys.append(item->tag("weatherId"));
allKeys.append(item->tag("weather")); allKeys.append(item->tag("weather"));
allKeys.append(item->tag("humidity")); allKeys.append(item->tag("humidity"));
@ -90,15 +75,20 @@ QStringList AWKeyOperations::dictKeys() const
allKeys.append(item->tag("timestamp")); allKeys.append(item->tag("timestamp"));
} }
// cpuclock & cpu // cpuclock & cpu
for (int i = 0; i < QThread::idealThreadCount(); i++) { for (auto i = 0; i < QThread::idealThreadCount(); ++i) {
allKeys.append(QString("cpucl%1").arg(i)); allKeys.append(QString("cpucl%1").arg(i));
allKeys.append(QString("cpu%1").arg(i)); allKeys.append(QString("cpu%1").arg(i));
} }
// temperature // temperature
for (int i = 0; i < m_devices["temp"].count(); i++) for (auto i = 0; i < m_devices.sensors.count(); ++i)
allKeys.append(QString("temp%1").arg(i)); allKeys.append(QString("temp%1").arg(i));
// gpu
for (auto i = 0; i < m_devices.gpu.count(); ++i) {
allKeys.append(QString("gpu%1").arg(i));
allKeys.append(QString("gputemp%1").arg(i));
}
// hdd // hdd
for (int i = 0; i < m_devices["mount"].count(); i++) { for (auto i = 0; i < m_devices.mount.count(); ++i) {
allKeys.append(QString("hddmb%1").arg(i)); allKeys.append(QString("hddmb%1").arg(i));
allKeys.append(QString("hddgb%1").arg(i)); allKeys.append(QString("hddgb%1").arg(i));
allKeys.append(QString("hddfreemb%1").arg(i)); allKeys.append(QString("hddfreemb%1").arg(i));
@ -108,15 +98,12 @@ QStringList AWKeyOperations::dictKeys() const
allKeys.append(QString("hdd%1").arg(i)); allKeys.append(QString("hdd%1").arg(i));
} }
// hdd speed // hdd speed
for (int i = 0; i < m_devices["disk"].count(); i++) { for (auto i = 0; i < m_devices.disk.count(); ++i) {
allKeys.append(QString("hddr%1").arg(i)); allKeys.append(QString("hddr%1").arg(i));
allKeys.append(QString("hddw%1").arg(i)); allKeys.append(QString("hddw%1").arg(i));
} }
// hdd temp
for (int i = 0; i < m_devices["hdd"].count(); i++)
allKeys.append(QString("hddtemp%1").arg(i));
// network // network
for (int i = 0; i < m_devices["net"].count(); i++) { for (auto i = 0; i < m_devices.network.count(); ++i) {
allKeys.append(QString("downunits%1").arg(i)); allKeys.append(QString("downunits%1").arg(i));
allKeys.append(QString("upunits%1").arg(i)); allKeys.append(QString("upunits%1").arg(i));
allKeys.append(QString("downtotkb%1").arg(i)); allKeys.append(QString("downtotkb%1").arg(i));
@ -129,10 +116,9 @@ QStringList AWKeyOperations::dictKeys() const
allKeys.append(QString("up%1").arg(i)); allKeys.append(QString("up%1").arg(i));
} }
// battery // battery
QStringList allBatteryDevices auto allBatteryDevices = QDir("/sys/class/power_supply")
= QDir("/sys/class/power_supply") .entryList(QStringList({"BAT*"}), QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name);
.entryList(QStringList({"BAT*"}), QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name); for (int i = 0; i < allBatteryDevices.count(); ++i) {
for (int i = 0; i < allBatteryDevices.count(); i++) {
allKeys.append(QString("bat%1").arg(i)); allKeys.append(QString("bat%1").arg(i));
allKeys.append(QString("batleft%1").arg(i)); allKeys.append(QString("batleft%1").arg(i));
allKeys.append(QString("batnow%1").arg(i)); allKeys.append(QString("batnow%1").arg(i));
@ -140,10 +126,10 @@ QStringList AWKeyOperations::dictKeys() const
allKeys.append(QString("battotal%1").arg(i)); allKeys.append(QString("battotal%1").arg(i));
} }
// package manager // package manager
for (auto &item : m_extUpgrade->activeItems()) for (auto item : m_extUpgrade->activeItems())
allKeys.append(item->tag("pkgcount")); allKeys.append(item->tag("pkgcount"));
// quotes // quotes
for (auto &item : m_extQuotes->activeItems()) { for (auto item : m_extQuotes->activeItems()) {
allKeys.append(item->tag("price")); allKeys.append(item->tag("price"));
allKeys.append(item->tag("pricechg")); allKeys.append(item->tag("pricechg"));
allKeys.append(item->tag("percpricechg")); allKeys.append(item->tag("percpricechg"));
@ -152,13 +138,13 @@ QStringList AWKeyOperations::dictKeys() const
allKeys.append(item->tag("percvolumechg")); allKeys.append(item->tag("percvolumechg"));
} }
// custom // custom
for (auto &item : m_extScripts->activeItems()) for (auto item : m_extScripts->activeItems())
allKeys.append(item->tag("custom")); allKeys.append(item->tag("custom"));
// network requests // network requests
for (auto &item : m_extNetRequest->activeItems()) for (auto item : m_extNetRequest->activeItems())
allKeys.append(item->tag("response")); allKeys.append(item->tag("response"));
// bars // bars
for (auto &item : m_graphicalItems->activeItems()) for (auto item : m_graphicalItems->activeItems())
allKeys.append(item->tag("bar")); allKeys.append(item->tag("bar"));
// user defined keys // user defined keys
allKeys.append(m_customKeys->keys()); allKeys.append(m_customKeys->keys());
@ -205,52 +191,58 @@ QString AWKeyOperations::infoByKey(const QString &_key) const
{ {
qCDebug(LOG_AW) << "Requested key" << _key; qCDebug(LOG_AW) << "Requested key" << _key;
QString stripped = _key; static auto numberRegExp = QRegularExpression("\\d+");
stripped.remove(QRegularExpression("\\d+"));
auto stripped = _key;
stripped.remove(numberRegExp);
QString output; QString output;
static auto hddRegExp = QRegularExpression("^hdd(|mb|gb|freemb|freegb|totmb|totgb)");
static auto hddrwRegExp = QRegularExpression("^hdd[rw]");
static auto hddMatchRegExp = QRegularExpression("^hdd([0-9]|mb|gb|freemb|freegb|totmb|totgb)");
static auto netRegExp = QRegularExpression("^(down|up)");
static auto netMatchRegExp = QRegularExpression("^(down|up)[0-9]");
static auto quotesRegExp = QRegularExpression("^(|perc)(ask|bid|price)(chg|)");
static auto weatherRegExp = QRegularExpression("^(weather|weatherId|humidity|pressure|temperature)");
if (_key.startsWith("bar")) { if (_key.startsWith("bar")) {
AbstractExtItem *item = m_graphicalItems->itemByTag(_key, stripped); auto item = m_graphicalItems->itemByTag(_key, stripped);
if (item) if (item)
output = item->uniq(); output = item->uniq();
} else if (_key.startsWith("custom")) { } else if (_key.startsWith("custom")) {
AbstractExtItem *item = m_extScripts->itemByTag(_key, stripped); auto item = m_extScripts->itemByTag(_key, stripped);
if (item) if (item)
output = item->uniq(); output = item->uniq();
} else if (_key.contains(QRegularExpression("^hdd[rw]"))) { } else if (_key.contains(hddrwRegExp)) {
QString index = _key; auto index = _key;
index.remove(QRegularExpression("hdd[rw]")); index.remove(hddrwRegExp);
output = m_devices["disk"][index.toInt()]; output = m_devices.disk[index.toInt()];
} else if (_key.contains(QRegularExpression("^hdd([0-9]|mb|gb|freemb|freegb|totmb|totgb)"))) { } else if (_key.contains(hddMatchRegExp)) {
QString index = _key; auto index = _key;
index.remove(QRegularExpression("^hdd(|mb|gb|freemb|freegb|totmb|totgb)")); index.remove(hddRegExp);
output = m_devices["mount"][index.toInt()]; output = m_devices.mount[index.toInt()];
} else if (_key.startsWith("hddtemp")) { } else if (_key.contains(netMatchRegExp)) {
QString index = _key; auto index = _key;
index.remove("hddtemp"); index.remove(netRegExp);
output = m_devices["hdd"][index.toInt()]; output = m_devices.network[index.toInt()];
} else if (_key.contains(QRegularExpression("^(down|up)[0-9]"))) {
QString index = _key;
index.remove(QRegularExpression("^(down|up)"));
output = m_devices["net"][index.toInt()];
} else if (_key.startsWith("pkgcount")) { } else if (_key.startsWith("pkgcount")) {
AbstractExtItem *item = m_extUpgrade->itemByTag(_key, stripped); auto item = m_extUpgrade->itemByTag(_key, stripped);
if (item) if (item)
output = item->uniq(); output = item->uniq();
} else if (_key.contains(QRegularExpression("(^|perc)(ask|bid|price)(chg|)"))) { } else if (_key.contains(quotesRegExp)) {
AbstractExtItem *item = m_extQuotes->itemByTag(_key, stripped); auto item = m_extQuotes->itemByTag(_key, stripped);
if (item) if (item)
output = item->uniq(); output = item->uniq();
} else if (_key.contains(QRegularExpression("(weather|weatherId|humidity|pressure|temperature)"))) { } else if (_key.contains(weatherRegExp)) {
AbstractExtItem *item = m_extWeather->itemByTag(_key, stripped); auto item = m_extWeather->itemByTag(_key, stripped);
if (item) if (item)
output = item->uniq(); output = item->uniq();
} else if (_key.startsWith("temp")) { } else if (_key.startsWith("temp")) {
QString index = _key; auto index = _key;
index.remove("temp"); index.remove("temp");
output = m_devices["temp"][index.toInt()]; output = m_devices.sensors[index.toInt()];
} else if (_key.startsWith("response")) { } else if (_key.startsWith("response")) {
AbstractExtItem *item = m_extNetRequest->itemByTag(_key, stripped); auto item = m_extNetRequest->itemByTag(_key, stripped);
if (item) if (item)
output = item->uniq(); output = item->uniq();
} else { } else {
@ -279,8 +271,10 @@ void AWKeyOperations::editItem(const QString &_type)
{ {
qCDebug(LOG_AW) << "Item type" << _type; qCDebug(LOG_AW) << "Item type" << _type;
static auto supportsGraphicalRegExp = QRegularExpression("^(cpu(?!cl).*|gpu$|mem$|swap$|hdd[0-9].*|bat.*)");
if (_type == "graphicalitem") { if (_type == "graphicalitem") {
QStringList keys = dictKeys().filter(QRegularExpression("^(cpu(?!cl).*|gpu$|mem$|swap$|hdd[0-9].*|bat.*)")); auto keys = dictKeys().filter(supportsGraphicalRegExp);
keys.sort(); keys.sort();
m_graphicalItems->setConfigArgs(keys); m_graphicalItems->setConfigArgs(keys);
return m_graphicalItems->editItems(); return m_graphicalItems->editItems();
@ -302,9 +296,10 @@ void AWKeyOperations::addDevice(const QString &_source)
{ {
qCDebug(LOG_AW) << "Source" << _source; qCDebug(LOG_AW) << "Source" << _source;
auto diskRegexp = QRegularExpression("disk/.*/read"); static auto diskRegexp = QRegularExpression("^disk/.*/read$");
auto mountRegexp = QRegularExpression("disk/.*/usedPercent"); static auto mountRegexp = QRegularExpression("^disk/.*/usedPercent$");
auto cpuTempRegExp = QRegularExpression("^cpu/cpu.*/temperature$"); static auto cpuTempRegExp = QRegularExpression("^cpu/cpu.*/temperature$");
static auto gpuRegExp = QRegularExpression("^gpu/gpu.*/usage$");
if (_source.contains(diskRegexp)) { if (_source.contains(diskRegexp)) {
auto device = _source; auto device = _source;
@ -317,6 +312,10 @@ void AWKeyOperations::addDevice(const QString &_source)
} else if (_source.startsWith("lmsensors") || _source.contains(cpuTempRegExp) } else if (_source.startsWith("lmsensors") || _source.contains(cpuTempRegExp)
|| _source == "cpu/all/averageTemperature") { || _source == "cpu/all/averageTemperature") {
addKeyToCache("temp", _source); addKeyToCache("temp", _source);
} else if (_source.contains(gpuRegExp)) {
auto device = _source;
device.remove("gpu/").remove("/usage");
addKeyToCache("gpu", device);
} }
} }
@ -343,7 +342,7 @@ void AWKeyOperations::reinitKeys()
m_extWeather->initItems(); m_extWeather->initItems();
// init // init
QStringList allKeys = dictKeys(); auto allKeys = dictKeys();
// apply aw_* functions // apply aw_* functions
m_pattern = AWPatternFunctions::insertAllKeys(m_pattern, allKeys); m_pattern = AWPatternFunctions::insertAllKeys(m_pattern, allKeys);

View File

@ -15,13 +15,12 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/ ***************************************************************************/
#pragma once
#ifndef AWKEYOPERATIONS_H
#define AWKEYOPERATIONS_H
#include <QObject> #include <QObject>
#include "extitemaggregator.h" #include "extitemaggregator.h"
#include "matchers/awpluginmatchersettings.h"
class AWCustomKeysHelper; class AWCustomKeysHelper;
@ -39,9 +38,8 @@ class AWKeyOperations : public QObject
public: public:
explicit AWKeyOperations(QObject *_parent = nullptr); explicit AWKeyOperations(QObject *_parent = nullptr);
~AWKeyOperations() override; ~AWKeyOperations() override = default;
[[nodiscard]] QStringList devices(const QString &_type) const; [[nodiscard]] AWPluginMatcherSettings devices() const;
[[nodiscard]] QHash<QString, QStringList> devices() const;
void updateCache(); void updateCache();
// keys // keys
[[nodiscard]] QStringList dictKeys() const; [[nodiscard]] QStringList dictKeys() const;
@ -75,9 +73,6 @@ private:
ExtItemAggregator<ExtUpgrade> *m_extUpgrade = nullptr; ExtItemAggregator<ExtUpgrade> *m_extUpgrade = nullptr;
ExtItemAggregator<ExtWeather> *m_extWeather = nullptr; ExtItemAggregator<ExtWeather> *m_extWeather = nullptr;
// variables // variables
QHash<QString, QStringList> m_devices; AWPluginMatcherSettings m_devices;
QString m_pattern; QString m_pattern;
}; };
#endif /* AWKEYOPERATIONS_H */

View File

@ -19,9 +19,8 @@
#include <QDBusConnection> #include <QDBusConnection>
#include <QDBusError> #include <QDBusError>
#include <QThread> #include <QRegularExpression>
#include <QTimer> #include <QTimer>
#include <QtConcurrent/QtConcurrent>
#include "awdataaggregator.h" #include "awdataaggregator.h"
#include "awdataengineaggregator.h" #include "awdataengineaggregator.h"
@ -42,9 +41,6 @@ AWKeys::AWKeys(QObject *_parent)
for (auto &metadata : AWDebug::getBuildData()) for (auto &metadata : AWDebug::getBuildData())
qCDebug(LOG_AW) << metadata; qCDebug(LOG_AW) << metadata;
// thread pool
m_threadPool = new QThreadPool(this);
m_aggregator = new AWKeysAggregator(this); m_aggregator = new AWKeysAggregator(this);
m_dataAggregator = new AWDataAggregator(this); m_dataAggregator = new AWDataAggregator(this);
m_dataEngineAggregator = new AWDataEngineAggregator(this); m_dataEngineAggregator = new AWDataEngineAggregator(this);
@ -91,18 +87,17 @@ void AWKeys::initDataAggregator(const QVariantMap &_tooltipParams)
} }
void AWKeys::initKeys(const QString &_currentPattern, const int _interval, const int _limit, const bool _optimize) void AWKeys::initKeys(const QString &_currentPattern, const int _interval, const bool _optimize)
{ {
qCDebug(LOG_AW) << "Pattern" << _currentPattern << "with interval" << _interval << "and queue limit" << _limit qCDebug(LOG_AW) << "Pattern" << _currentPattern << "with interval" << _interval << "with optimization" << _optimize;
<< "with optimization" << _optimize;
// init // init
m_optimize = _optimize; m_optimize = _optimize;
m_threadPool->setMaxThreadCount(_limit == 0 ? QThread::idealThreadCount() : _limit);
// child objects // child objects
m_aggregator->initFormatters(); m_aggregator->initFormatters();
m_keyOperator->setPattern(_currentPattern); m_keyOperator->setPattern(_currentPattern);
m_keyOperator->updateCache(); m_keyOperator->updateCache();
m_dataEngineAggregator->loadSources();
// timer // timer
m_timer->setInterval(_interval); m_timer->setInterval(_interval);
@ -152,26 +147,6 @@ QStringList AWKeys::dictKeys(const bool _sorted, const QString &_regexp) const
} }
QVariantList AWKeys::getHddDevices() const
{
QStringList hddDevices = m_keyOperator->devices("hdd");
// required by selector in the UI
hddDevices.insert(0, "disable");
hddDevices.insert(0, "auto");
// build model
QVariantList devices;
for (auto &device : hddDevices) {
QVariantMap model;
model["label"] = device;
model["name"] = device;
devices.append(model);
}
return devices;
}
QString AWKeys::infoByKey(const QString &_key) const QString AWKeys::infoByKey(const QString &_key) const
{ {
qCDebug(LOG_AW) << "Requested info for key" << _key; qCDebug(LOG_AW) << "Requested info for key" << _key;
@ -201,12 +176,13 @@ void AWKeys::editItem(const QString &_type)
void AWKeys::dataUpdated(const QHash<QString, KSysGuard::SensorInfo> &_sensors, const KSysGuard::SensorDataList &_data) void AWKeys::dataUpdated(const QHash<QString, KSysGuard::SensorInfo> &_sensors, const KSysGuard::SensorDataList &_data)
{ {
for (auto &single : _data) { qCDebug(LOG_AW) << "Update data for" << _data.count() << "items";
if (_sensors.contains(single.sensorProperty)) {
setDataBySource(single.sensorProperty, _sensors.value(single.sensorProperty), single); for (auto &data : _data) {
} if (!_sensors.contains(data.sensorProperty))
// TODO use QtConcurrent::map or something like that continue;
// QtConcurrent::run(m_threadPool, this, &AWKeys::setDataBySource, "ss", sensor); auto sensor = _sensors[data.sensorProperty];
setDataBySource(data.sensorProperty, sensor, data.payload);
} }
} }
@ -222,7 +198,7 @@ void AWKeys::reinitKeys(const QStringList &_currentKeys)
// generate list of required keys for bars // generate list of required keys for bars
QStringList barKeys; QStringList barKeys;
for (auto &bar : m_foundBars) { for (auto &bar : m_foundBars) {
GraphicalItem *item = m_keyOperator->giByKey(bar); auto item = m_keyOperator->giByKey(bar);
if (item->isCustom()) if (item->isCustom())
item->setUsedKeys(AWPatternFunctions::findKeys(item->bar(), _currentKeys, false)); item->setUsedKeys(AWPatternFunctions::findKeys(item->bar(), _currentKeys, false));
else else
@ -242,12 +218,10 @@ void AWKeys::reinitKeys(const QStringList &_currentKeys)
void AWKeys::updateTextData() void AWKeys::updateTextData()
{ {
// do not do it in parallel to avoid race condition // do not do it in parallel to avoid race condition
m_mutex.lock();
calculateValues(); calculateValues();
auto text = parsePattern(m_keyOperator->pattern()); auto text = parsePattern(m_keyOperator->pattern());
// update tooltip values under lock // update tooltip values under lock
m_dataAggregator->dataUpdate(m_values); m_dataAggregator->dataUpdate(m_values);
m_mutex.unlock();
emit(needTextToBeUpdated(text)); emit(needTextToBeUpdated(text));
} }
@ -257,24 +231,10 @@ void AWKeys::updateTextData()
// specified pattern. Usually they are values which depend on several others // specified pattern. Usually they are values which depend on several others
void AWKeys::calculateValues() void AWKeys::calculateValues()
{ {
// hddtot* auto devices = m_keyOperator->devices();
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)].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"].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"].toDouble() / m_values["memtotmb"].toDouble();
// up, down, upkb, downkb, upunits, downunits // up, down, upkb, downkb, upunits, downunits
int netIndex = m_keyOperator->devices("net").indexOf(m_values["netdev"].toString()); auto netIndex = devices.network.indexOf(m_values["netdev"].toString());
m_values["down"] = m_values[QString("down%1").arg(netIndex)]; m_values["down"] = m_values[QString("down%1").arg(netIndex)];
m_values["downkb"] = m_values[QString("downkb%1").arg(netIndex)]; m_values["downkb"] = m_values[QString("downkb%1").arg(netIndex)];
m_values["downtot"] = m_values[QString("downtot%1").arg(netIndex)]; m_values["downtot"] = m_values[QString("downtot%1").arg(netIndex)];
@ -286,12 +246,6 @@ void AWKeys::calculateValues()
m_values["uptotkb"] = m_values[QString("uptotkb%1").arg(netIndex)]; m_values["uptotkb"] = m_values[QString("uptotkb%1").arg(netIndex)];
m_values["upunits"] = m_values[QString("upunits%1").arg(netIndex)]; m_values["upunits"] = m_values[QString("upunits%1").arg(netIndex)];
// swaptot*
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"].toDouble() / m_values["swaptotmb"].toDouble();
// user defined keys // user defined keys
for (auto &key : m_keyOperator->userKeys()) for (auto &key : m_keyOperator->userKeys())
m_values[key] = m_values[m_keyOperator->userKeySource(key)]; m_values[key] = m_values[m_keyOperator->userKeySource(key)];
@ -308,7 +262,7 @@ void AWKeys::createDBusInterface()
auto id = reinterpret_cast<qlonglong>(this); auto id = reinterpret_cast<qlonglong>(this);
// create session // create session
QDBusConnection instanceBus = QDBusConnection::sessionBus(); auto instanceBus = QDBusConnection::sessionBus();
// HACK we are going to use different services because it binds to // HACK we are going to use different services because it binds to
// application // application
if (instanceBus.registerService(QString("%1.i%2").arg(AWDBUS_SERVICE).arg(id))) { if (instanceBus.registerService(QString("%1.i%2").arg(AWDBUS_SERVICE).arg(id))) {
@ -319,7 +273,7 @@ void AWKeys::createDBusInterface()
} }
// and same instance but for id independent service // and same instance but for id independent service
QDBusConnection commonBus = QDBusConnection::sessionBus(); auto commonBus = QDBusConnection::sessionBus();
if (commonBus.registerService(AWDBUS_SERVICE)) if (commonBus.registerService(AWDBUS_SERVICE))
commonBus.registerObject(AWDBUS_PATH, new AWDBusAdaptor(this), QDBusConnection::ExportAllContents); commonBus.registerObject(AWDBUS_PATH, new AWDBusAdaptor(this), QDBusConnection::ExportAllContents);
} }
@ -340,10 +294,10 @@ QString AWKeys::parsePattern(QString _pattern) const
// bars // bars
for (auto &bar : m_foundBars) { for (auto &bar : m_foundBars) {
GraphicalItem *item = m_keyOperator->giByKey(bar); auto item = m_keyOperator->giByKey(bar);
QString image = item->isCustom() ? item->image( auto image = item->isCustom() ? item->image(
AWPatternFunctions::expandLambdas(item->bar(), m_aggregator, m_values, item->usedKeys())) AWPatternFunctions::expandLambdas(item->bar(), m_aggregator, m_values, item->usedKeys()))
: item->image(m_values[item->bar()]); : item->image(m_values[item->bar()]);
_pattern.replace(QString("$%1").arg(bar), image); _pattern.replace(QString("$%1").arg(bar), image);
} }
@ -356,10 +310,9 @@ QString AWKeys::parsePattern(QString _pattern) const
} }
void AWKeys::setDataBySource(const QString &_source, const KSysGuard::SensorInfo &_sensor, void AWKeys::setDataBySource(const QString &_source, const KSysGuard::SensorInfo &_sensor, const QVariant &_value)
const KSysGuard::SensorData &_data)
{ {
qCDebug(LOG_AW) << "Source" << _source << _sensor.name << "with data" << _data.payload; qCDebug(LOG_AW) << "Source" << _source << _sensor.name << "with data" << _value;
// first list init // first list init
auto tags = m_aggregator->keysFromSource(_source); auto tags = m_aggregator->keysFromSource(_source);
@ -372,7 +325,5 @@ void AWKeys::setDataBySource(const QString &_source, const KSysGuard::SensorInfo
return emit(dropSourceFromDataengine(_source)); return emit(dropSourceFromDataengine(_source));
} }
m_mutex.lock(); std::for_each(tags.cbegin(), tags.cend(), [this, _value](const QString &tag) { m_values[tag] = _value; });
std::for_each(tags.cbegin(), tags.cend(), [this, &_data](const QString &tag) { m_values[tag] = _data.payload; });
m_mutex.unlock();
} }

View File

@ -15,11 +15,8 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/ ***************************************************************************/
#pragma once
#ifndef AWKEYS_H
#define AWKEYS_H
#include <QMutex>
#include <QObject> #include <QObject>
#include <ksysguard/systemstats/SensorInfo.h> #include <ksysguard/systemstats/SensorInfo.h>
@ -29,10 +26,9 @@ class AWDataAggregator;
class AWDataEngineAggregator; class AWDataEngineAggregator;
class AWKeyOperations; class AWKeyOperations;
class AWKeysAggregator; class AWKeysAggregator;
class QThreadPool;
class QTimer; class QTimer;
class AWKeys : public QObject class __attribute__((visibility("default"))) AWKeys : public QObject
{ {
Q_OBJECT Q_OBJECT
@ -40,7 +36,7 @@ public:
explicit AWKeys(QObject *_parent = nullptr); explicit AWKeys(QObject *_parent = nullptr);
~AWKeys() override; ~AWKeys() override;
Q_INVOKABLE void initDataAggregator(const QVariantMap &_tooltipParams); Q_INVOKABLE void initDataAggregator(const QVariantMap &_tooltipParams);
Q_INVOKABLE void initKeys(const QString &_currentPattern, int _interval, int _limit, bool _optimize); Q_INVOKABLE void initKeys(const QString &_currentPattern, int _interval, bool _optimize);
Q_INVOKABLE void setAggregatorProperty(const QString &_key, const QVariant &_value); Q_INVOKABLE void setAggregatorProperty(const QString &_key, const QVariant &_value);
Q_INVOKABLE void setWrapNewLines(bool _wrap); Q_INVOKABLE void setWrapNewLines(bool _wrap);
// additional method to force load keys from Qml UI. Used in some // additional method to force load keys from Qml UI. Used in some
@ -48,22 +44,19 @@ public:
Q_INVOKABLE void updateCache(); Q_INVOKABLE void updateCache();
// keys // keys
Q_INVOKABLE [[nodiscard]] QStringList dictKeys(bool _sorted = false, const QString &_regexp = "") const; Q_INVOKABLE [[nodiscard]] QStringList dictKeys(bool _sorted = false, const QString &_regexp = "") const;
Q_INVOKABLE [[nodiscard]] QVariantList getHddDevices() const;
// values // values
Q_INVOKABLE [[nodiscard]] QString infoByKey(const QString &_key) const; Q_INVOKABLE [[nodiscard]] QString infoByKey(const QString &_key) const;
Q_INVOKABLE [[nodiscard]] QString valueByKey(const QString &_key) const; Q_INVOKABLE [[nodiscard]] QString valueByKey(const QString &_key) const;
// configuration // configuration
Q_INVOKABLE void editItem(const QString &_type); Q_INVOKABLE void editItem(const QString &_type);
public slots:
void dataUpdated(const QHash<QString, KSysGuard::SensorInfo> &_sensors, const KSysGuard::SensorDataList &_data);
signals: signals:
void dropSourceFromDataengine(const QString &_source); void dropSourceFromDataengine(const QString &_source);
void needTextToBeUpdated(const QString &_newText) const; void needTextToBeUpdated(const QString &_newText) const;
void needToolTipToBeUpdated(const QString &_newText) const; void needToolTipToBeUpdated(const QString &_newText) const;
private slots: private slots:
void dataUpdated(const QHash<QString, KSysGuard::SensorInfo> &_sensors, const KSysGuard::SensorDataList &_data);
void reinitKeys(const QStringList &_currentKeys); void reinitKeys(const QStringList &_currentKeys);
void updateTextData(); void updateTextData();
@ -72,8 +65,7 @@ private:
void calculateValues(); void calculateValues();
void createDBusInterface(); void createDBusInterface();
[[nodiscard]] QString parsePattern(QString _pattern) const; [[nodiscard]] QString parsePattern(QString _pattern) const;
void setDataBySource(const QString &_source, const KSysGuard::SensorInfo &_sensor, void setDataBySource(const QString &_source, const KSysGuard::SensorInfo &_sensor, const QVariant &_value);
const KSysGuard::SensorData &_data);
// objects // objects
AWDataAggregator *m_dataAggregator = nullptr; AWDataAggregator *m_dataAggregator = nullptr;
AWDataEngineAggregator *m_dataEngineAggregator = nullptr; AWDataEngineAggregator *m_dataEngineAggregator = nullptr;
@ -86,10 +78,4 @@ private:
QVariantHash m_values; QVariantHash m_values;
bool m_optimize = false; bool m_optimize = false;
bool m_wrapNewLines = false; bool m_wrapNewLines = false;
// multithread features
QThreadPool *m_threadPool = nullptr;
QMutex m_mutex;
}; };
#endif /* AWKEYS_H */

View File

@ -17,15 +17,9 @@
#include "awkeysaggregator.h" #include "awkeysaggregator.h"
#include <KI18n/KLocalizedString>
#include <QDateTime>
#include <QLocale>
#include "awdataenginemapper.h" #include "awdataenginemapper.h"
#include "awdebug.h" #include "awdebug.h"
#include "awformatterhelper.h" #include "awformatterhelper.h"
#include "version.h"
AWKeysAggregator::AWKeysAggregator(QObject *_parent) AWKeysAggregator::AWKeysAggregator(QObject *_parent)
@ -33,25 +27,38 @@ AWKeysAggregator::AWKeysAggregator(QObject *_parent)
{ {
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
m_customFormatters = new AWFormatterHelper(nullptr); m_settings.customFormatters = new AWFormatterHelper(this);
m_mapper = new AWDataEngineMapper(this, m_customFormatters); m_mapper = new AWDataEngineMapper(this, m_settings.customFormatters);
// sort time keys
m_timeKeys = QString(TIME_KEYS).split(',');
m_timeKeys.sort();
std::reverse(m_timeKeys.begin(), m_timeKeys.end());
}
AWKeysAggregator::~AWKeysAggregator()
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
} }
void AWKeysAggregator::initFormatters() void AWKeysAggregator::initFormatters()
{ {
m_customFormatters->initItems(); m_settings.customFormatters->initItems();
}
QString AWKeysAggregator::acOffline() const
{
return m_settings.acOffline;
}
QString AWKeysAggregator::acOnline() const
{
return m_settings.acOnline;
}
QString AWKeysAggregator::customTime() const
{
return m_settings.customTime;
}
QString AWKeysAggregator::customUptime() const
{
return m_settings.customUptime;
} }
@ -59,108 +66,7 @@ QString AWKeysAggregator::formatter(const QVariant &_data, const QString &_key,
{ {
qCDebug(LOG_AW) << "Data" << _data << "for key" << _key; qCDebug(LOG_AW) << "Data" << _data << "for key" << _key;
QString output; auto output = m_mapper->formatter(_key)->format(_data, _key, m_settings);
QLocale loc = m_translate ? QLocale::system() : QLocale::c();
// case block
switch (m_mapper->formatter(_key)) {
case FormatterType::Float:
output = QString("%1").arg(_data.toDouble(), 5, 'f', 1);
break;
case FormatterType::FloatTwoSymbols:
output = QString("%1").arg(_data.toDouble(), 5, 'f', 2);
break;
case FormatterType::Integer:
output = QString("%1").arg(_data.toDouble(), 4, 'f', 0);
break;
case FormatterType::IntegerFive:
output = QString("%1").arg(_data.toDouble(), 5, 'f', 0);
break;
case FormatterType::IntegerThree:
output = QString("%1").arg(_data.toDouble(), 3, 'f', 0);
break;
case FormatterType::List:
output = _data.toStringList().join(',');
break;
case FormatterType::ACFormat:
output = _data.toBool() ? m_acOnline : m_acOffline;
break;
case FormatterType::MemGBFormat:
output = QString("%1").arg(_data.toDouble() / (1024.0 * 1024.0), 5, 'f', 1);
break;
case FormatterType::MemMBFormat:
output = QString("%1").arg(_data.toDouble() / 1024.0, 5, 'f', 0);
break;
case FormatterType::NetSmartFormat:
output = [](const float value) {
if (value > 1024.0)
return QString("%1").arg(value / 1024.0, 4, 'f', 1);
else
return QString("%1").arg(value, 4, 'f', 0);
}(_data.toDouble());
break;
case FormatterType::NetSmartUnits:
if (_data.toDouble() > 1024.0)
output = m_translate ? i18n("MB/s") : "MB/s";
else
output = m_translate ? i18n("KB/s") : "KB/s";
break;
case FormatterType::Quotes:
// first cast
output = QString("%1").arg(_data.toDouble(), 0, 'f');
output = output.rightJustified(8, QLatin1Char(' '), true);
break;
case FormatterType::Temperature:
output = QString("%1").arg(temperature(_data.toDouble()), 5, 'f', 1);
break;
case FormatterType::Time:
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));
}(QDateTime::fromSecsSinceEpoch(_data.toLongLong()));
break;
case FormatterType::TimeISO:
output = QDateTime::fromSecsSinceEpoch(_data.toLongLong()).toString(Qt::ISODate);
break;
case FormatterType::TimeLong:
output = loc.toString(QDateTime::fromSecsSinceEpoch(_data.toLongLong()), QLocale::LongFormat);
break;
case FormatterType::TimeShort:
output = loc.toString(QDateTime::fromSecsSinceEpoch(_data.toLongLong()), QLocale::ShortFormat);
break;
case FormatterType::Timestamp:
output = _data.toString();
break;
case FormatterType::Uptime:
case FormatterType::UptimeCustom:
output =
[](QString source, const int uptime) {
int seconds = uptime - uptime % 60;
int minutes = seconds / 60 % 60;
int hours = ((seconds / 60) - minutes) / 60 % 24;
int days = (((seconds / 60) - minutes) / 60 - hours) / 24;
source.replace("$dd", QString("%1").arg(days, 3, 10, QChar('0')));
source.replace("$d", QString("%1").arg(days));
source.replace("$hh", QString("%1").arg(hours, 2, 10, QChar('0')));
source.replace("$h", QString("%1").arg(hours));
source.replace("$mm", QString("%1").arg(minutes, 2, 10, QChar('0')));
source.replace("$m", QString("%1").arg(minutes));
return source;
}(m_mapper->formatter(_key) == FormatterType::Uptime ? "$ddd$hhh$mmm" : m_customUptime,
static_cast<int>(_data.toDouble()));
break;
case FormatterType::NoFormat:
output = _data.toString();
break;
case FormatterType::Custom:
if (m_customFormatters)
output = m_customFormatters->convert(_data, _key);
break;
}
// replace spaces to non-breakable ones // replace spaces to non-breakable ones
replaceSpace &= (!_key.startsWith("custom") && (!_key.startsWith("weather"))); replaceSpace &= (!_key.startsWith("custom") && (!_key.startsWith("weather")));
if (replaceSpace) if (replaceSpace)
@ -178,11 +84,23 @@ QStringList AWKeysAggregator::keysFromSource(const QString &_source) const
} }
QString AWKeysAggregator::tempUnits() const
{
return m_settings.tempUnits;
}
bool AWKeysAggregator::translate() const
{
return m_settings.translate;
}
void AWKeysAggregator::setAcOffline(const QString &_inactive) void AWKeysAggregator::setAcOffline(const QString &_inactive)
{ {
qCDebug(LOG_AW) << "Inactive AC string" << _inactive; qCDebug(LOG_AW) << "Inactive AC string" << _inactive;
m_acOffline = _inactive; m_settings.acOffline = _inactive;
} }
@ -190,7 +108,7 @@ void AWKeysAggregator::setAcOnline(const QString &_active)
{ {
qCDebug(LOG_AW) << "Active AC string" << _active; qCDebug(LOG_AW) << "Active AC string" << _active;
m_acOnline = _active; m_settings.acOnline = _active;
} }
@ -198,7 +116,7 @@ void AWKeysAggregator::setCustomTime(const QString &_customTime)
{ {
qCDebug(LOG_AW) << "Format" << _customTime; qCDebug(LOG_AW) << "Format" << _customTime;
m_customTime = _customTime; m_settings.customTime = _customTime;
} }
@ -206,15 +124,13 @@ void AWKeysAggregator::setCustomUptime(const QString &_customUptime)
{ {
qCDebug(LOG_AW) << "Format" << _customUptime; qCDebug(LOG_AW) << "Format" << _customUptime;
m_customUptime = _customUptime; m_settings.customUptime = _customUptime;
} }
void AWKeysAggregator::setDevices(const QHash<QString, QStringList> &_devices) void AWKeysAggregator::setDevices(const AWPluginMatcherSettings &_settings)
{ {
qCDebug(LOG_AW) << "Devices" << _devices; m_mapper->setDevices(_settings);
m_mapper->setDevices(_devices);
} }
@ -222,7 +138,7 @@ void AWKeysAggregator::setTempUnits(const QString &_units)
{ {
qCDebug(LOG_AW) << "Units" << _units; qCDebug(LOG_AW) << "Units" << _units;
m_tempUnits = _units; m_settings.tempUnits = _units;
} }
@ -230,40 +146,14 @@ void AWKeysAggregator::setTranslate(const bool _translate)
{ {
qCDebug(LOG_AW) << "Translate" << _translate; qCDebug(LOG_AW) << "Translate" << _translate;
m_translate = _translate; m_settings.translate = _translate;
} }
QStringList AWKeysAggregator::registerSource(const QString &_source, const KSysGuard::Unit &_units, QStringList AWKeysAggregator::registerSource(const QString &_source, const KSysGuard::Unit _units,
const QStringList &_keys) const QStringList &_keys)
{ {
qCDebug(LOG_AW) << "Source" << _source << "with units" << _units; qCDebug(LOG_AW) << "Source" << _source << "with units" << _units;
return m_mapper->registerSource(_source, _units, _keys); return m_mapper->registerSource(_source, _units, _keys);
} }
float AWKeysAggregator::temperature(const float temp) const
{
qCDebug(LOG_AW) << "Temperature value" << temp;
float converted = temp;
if (m_tempUnits == "Celsius") {
} else if (m_tempUnits == "Fahrenheit") {
converted = temp * 9.0f / 5.0f + 32.0f;
} else if (m_tempUnits == "Kelvin") {
converted = temp + 273.15f;
} else if (m_tempUnits == "Reaumur") {
converted = temp * 0.8f;
} else if (m_tempUnits == "cm^-1") {
converted = (temp + 273.15f) * 0.695f;
} else if (m_tempUnits == "kJ/mol") {
converted = (temp + 273.15f) * 8.31f;
} else if (m_tempUnits == "kcal/mol") {
converted = (temp + 273.15f) * 1.98f;
} else {
qCWarning(LOG_AW) << "Invalid units" << m_tempUnits;
}
return converted;
}

View File

@ -15,89 +15,55 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/ ***************************************************************************/
#pragma once
#ifndef AWKEYSAGGREGATOR_H
#define AWKEYSAGGREGATOR_H
#include <ksysguard/formatter/Unit.h> #include <ksysguard/formatter/Unit.h>
#include <QHash> #include <QHash>
#include <QObject> #include <QObject>
#include "formatters/awpluginformatsettings.h"
#include "matchers/awpluginmatchersettings.h"
class AWFormatterHelper;
class AWDataEngineMapper; class AWDataEngineMapper;
class AWKeysAggregator : public QObject class AWKeysAggregator : public QObject
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY(QString acOffline MEMBER m_acOffline WRITE setAcOffline); Q_PROPERTY(QString acOffline READ acOffline WRITE setAcOffline);
Q_PROPERTY(QString acOnline MEMBER m_acOnline WRITE setAcOnline); Q_PROPERTY(QString acOnline READ acOnline WRITE setAcOnline);
Q_PROPERTY(QString customTime MEMBER m_customTime WRITE setCustomTime); Q_PROPERTY(QString customTime READ customTime WRITE setCustomTime);
Q_PROPERTY(QString customUptime MEMBER m_customUptime WRITE setCustomUptime); Q_PROPERTY(QString customUptime READ customUptime WRITE setCustomUptime);
Q_PROPERTY(QString tempUnits MEMBER m_tempUnits WRITE setTempUnits); Q_PROPERTY(QString tempUnits READ tempUnits WRITE setTempUnits);
Q_PROPERTY(bool translate MEMBER m_translate WRITE setTranslate); Q_PROPERTY(bool translate READ translate WRITE setTranslate);
public: public:
enum class FormatterType {
// general formatters
Custom,
NoFormat,
Float,
FloatTwoSymbols,
Integer,
IntegerFive,
IntegerThree,
List,
// unit specific formatters
ACFormat,
MemGBFormat,
MemMBFormat,
NetSmartFormat,
NetSmartUnits,
Quotes,
Temperature,
Time,
TimeCustom,
TimeISO,
TimeLong,
TimeShort,
Timestamp,
Uptime,
UptimeCustom
};
explicit AWKeysAggregator(QObject *_parent = nullptr); explicit AWKeysAggregator(QObject *_parent = nullptr);
~AWKeysAggregator() override; ~AWKeysAggregator() override = default;
void initFormatters(); void initFormatters();
// get methods // get methods
[[nodiscard]] QString acOffline() const;
[[nodiscard]] QString acOnline() const;
[[nodiscard]] QString customTime() const;
[[nodiscard]] QString customUptime() const;
[[nodiscard]] QString formatter(const QVariant &_data, const QString &_key, bool replaceSpace) const; [[nodiscard]] QString formatter(const QVariant &_data, const QString &_key, bool replaceSpace) const;
[[nodiscard]] QStringList keysFromSource(const QString &_source) const; [[nodiscard]] QStringList keysFromSource(const QString &_source) const;
[[nodiscard]] QString tempUnits() const;
[[nodiscard]] bool translate() const;
// set methods // set methods
void setAcOffline(const QString &_inactive); void setAcOffline(const QString &_inactive);
void setAcOnline(const QString &_active); void setAcOnline(const QString &_active);
void setCustomTime(const QString &_customTime); void setCustomTime(const QString &_customTime);
void setCustomUptime(const QString &_customUptime); void setCustomUptime(const QString &_customUptime);
void setDevices(const QHash<QString, QStringList> &_devices); void setDevices(const AWPluginMatcherSettings &_settings);
void setTempUnits(const QString &_units); void setTempUnits(const QString &_units);
void setTranslate(bool _translate); void setTranslate(bool _translate);
public slots: public slots:
QStringList registerSource(const QString &_source, const KSysGuard::Unit &_units, const QStringList &_keys); QStringList registerSource(const QString &_source, KSysGuard::Unit _units, const QStringList &_keys);
private: private:
[[nodiscard]] float temperature(float temp) const; AWPluginFormatSettings m_settings;
AWFormatterHelper *m_customFormatters = nullptr;
AWDataEngineMapper *m_mapper = nullptr; AWDataEngineMapper *m_mapper = nullptr;
QStringList m_timeKeys;
// variables
QString m_acOffline;
QString m_acOnline;
QString m_customTime;
QString m_customUptime;
QString m_tempUnits;
bool m_translate = false;
}; };
#endif /* AWKEYSAGGREGATOR_H */

View File

@ -29,15 +29,9 @@ AWPairConfigFactory::AWPairConfigFactory(QObject *_parent)
} }
AWPairConfigFactory::~AWPairConfigFactory()
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
}
void AWPairConfigFactory::showFormatterDialog(const QStringList &_keys) void AWPairConfigFactory::showFormatterDialog(const QStringList &_keys)
{ {
auto *config = new AWFormatterConfig(nullptr, _keys); auto config = new AWFormatterConfig(nullptr, _keys);
config->showDialog(); config->showDialog();
config->deleteLater(); config->deleteLater();
} }
@ -45,7 +39,7 @@ void AWPairConfigFactory::showFormatterDialog(const QStringList &_keys)
void AWPairConfigFactory::showKeysDialog(const QStringList &_keys) void AWPairConfigFactory::showKeysDialog(const QStringList &_keys)
{ {
auto *config = new AWCustomKeysConfig(nullptr, _keys); auto config = new AWCustomKeysConfig(nullptr, _keys);
config->showDialog(); config->showDialog();
config->deleteLater(); config->deleteLater();
} }

View File

@ -15,9 +15,7 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/ ***************************************************************************/
#pragma once
#ifndef AWPAIRCONFIGFACTORY_H
#define AWPAIRCONFIGFACTORY_H
#include <QObject> #include <QObject>
@ -28,12 +26,7 @@ class AWPairConfigFactory : public QObject
public: public:
explicit AWPairConfigFactory(QObject *_parent = nullptr); explicit AWPairConfigFactory(QObject *_parent = nullptr);
~AWPairConfigFactory() override; ~AWPairConfigFactory() override = default;
Q_INVOKABLE static void showFormatterDialog(const QStringList &_keys); Q_INVOKABLE static void showFormatterDialog(const QStringList &_keys);
Q_INVOKABLE static void showKeysDialog(const QStringList &_keys); Q_INVOKABLE static void showKeysDialog(const QStringList &_keys);
private:
}; };
#endif /* AWPAIRCONFIGFACTORY_H */

View File

@ -36,7 +36,7 @@ QString AWPatternFunctions::expandLambdas(QString _code, AWKeysAggregator *_aggr
for (auto &lambdaKey : _usedKeys) for (auto &lambdaKey : _usedKeys)
_code.replace(QString("$%1").arg(lambdaKey), _aggregator->formatter(_metadata[lambdaKey], lambdaKey, false)); _code.replace(QString("$%1").arg(lambdaKey), _aggregator->formatter(_metadata[lambdaKey], lambdaKey, false));
qCInfo(LOG_AW) << "Expression" << _code; qCInfo(LOG_AW) << "Expression" << _code;
QJSValue result = engine.evaluate(_code); auto result = engine.evaluate(_code);
if (result.isError()) { if (result.isError()) {
qCWarning(LOG_AW) << "Uncaught exception at line" << result.property("lineNumber").toInt() << ":" qCWarning(LOG_AW) << "Uncaught exception at line" << result.property("lineNumber").toInt() << ":"
<< result.toString(); << result.toString();
@ -52,17 +52,17 @@ QString AWPatternFunctions::expandTemplates(QString _code)
qCDebug(LOG_AW) << "Expand templates in" << _code; qCDebug(LOG_AW) << "Expand templates in" << _code;
// match the following construction $template{{some code here}} // match the following construction $template{{some code here}}
QRegularExpression templatesRegexp(R"(\$template\{\{(?<body>.*?)\}\})"); static QRegularExpression templatesRegexp(R"(\$template\{\{(?<body>.*?)\}\})");
templatesRegexp.setPatternOptions(QRegularExpression::DotMatchesEverythingOption); templatesRegexp.setPatternOptions(QRegularExpression::DotMatchesEverythingOption);
QRegularExpressionMatchIterator it = templatesRegexp.globalMatch(_code); auto it = templatesRegexp.globalMatch(_code);
while (it.hasNext()) { while (it.hasNext()) {
QRegularExpressionMatch match = it.next(); auto match = it.next();
QString body = match.captured("body"); auto body = match.captured("body");
QJSEngine engine; QJSEngine engine;
qCInfo(LOG_AW) << "Expression" << body; qCInfo(LOG_AW) << "Expression" << body;
QJSValue result = engine.evaluate(body); auto result = engine.evaluate(body);
QString templateResult = ""; QString templateResult = "";
if (result.isError()) { if (result.isError()) {
qCWarning(LOG_AW) << "Uncaught exception at line" << result.property("lineNumber").toInt() << ":" qCWarning(LOG_AW) << "Uncaught exception at line" << result.property("lineNumber").toInt() << ":"
@ -94,20 +94,20 @@ QList<AWPatternFunctions::AWFunction> AWPatternFunctions::findFunctionCalls(cons
regex.setPatternOptions(QRegularExpression::DotMatchesEverythingOption); regex.setPatternOptions(QRegularExpression::DotMatchesEverythingOption);
QList<AWPatternFunctions::AWFunction> foundFunctions; QList<AWPatternFunctions::AWFunction> foundFunctions;
QRegularExpressionMatchIterator it = regex.globalMatch(_code); auto it = regex.globalMatch(_code);
while (it.hasNext()) { while (it.hasNext()) {
QRegularExpressionMatch match = it.next(); auto match = it.next();
AWPatternFunctions::AWFunction metadata; AWPatternFunctions::AWFunction metadata;
// work with args // work with args
QString argsString = match.captured("args"); auto argsString = match.captured("args");
if (argsString.isEmpty()) { if (argsString.isEmpty()) {
metadata.args = QStringList(); metadata.args = QStringList();
} else { } else {
// replace '$,' to 0x1d // replace '$,' to 0x1d
argsString.replace("$,", QChar(0x1d)); argsString.replace("$,", QChar(0x1d));
QStringList args = argsString.split(','); auto args = argsString.split(',');
std::for_each(args.begin(), args.end(), [](QString &arg) { arg.replace(QChar(0x1d), ","); }); std::for_each(args.begin(), args.end(), [](auto &arg) { arg.replace(QChar(0x1d), ","); });
metadata.args = args; metadata.args = args;
} }
// other variables // other variables
@ -127,11 +127,11 @@ QString AWPatternFunctions::insertAllKeys(QString _code, const QStringList &_key
{ {
qCDebug(LOG_AW) << "Looking for keys in code" << _code << "using list" << _keys; qCDebug(LOG_AW) << "Looking for keys in code" << _code << "using list" << _keys;
QList<AWPatternFunctions::AWFunction> found = AWPatternFunctions::findFunctionCalls("aw_all", _code); auto found = AWPatternFunctions::findFunctionCalls("aw_all", _code);
for (auto &function : found) { for (auto &function : found) {
QString separator = function.args.isEmpty() ? "," : function.args.at(0); auto separator = function.args.isEmpty() ? "," : function.args.at(0);
QStringList required = _keys.filter(QRegularExpression(function.body)); auto required = _keys.filter(QRegularExpression(function.body));
std::for_each(required.begin(), required.end(), [](QString &value) { value = QString("%1: $%1").arg(value); }); std::for_each(required.begin(), required.end(), [](auto &value) { value = QString("%1: $%1").arg(value); });
_code.replace(function.what, required.join(separator)); _code.replace(function.what, required.join(separator));
} }
@ -144,9 +144,9 @@ QString AWPatternFunctions::insertKeyCount(QString _code, const QStringList &_ke
{ {
qCDebug(LOG_AW) << "Looking for count in code" << _code << "using list" << _keys; qCDebug(LOG_AW) << "Looking for count in code" << _code << "using list" << _keys;
QList<AWPatternFunctions::AWFunction> found = AWPatternFunctions::findFunctionCalls("aw_count", _code); auto found = AWPatternFunctions::findFunctionCalls("aw_count", _code);
for (auto &function : found) { for (auto &function : found) {
int count = _keys.filter(QRegularExpression(function.body)).count(); auto count = _keys.filter(QRegularExpression(function.body)).count();
_code.replace(function.what, QString::number(count)); _code.replace(function.what, QString::number(count));
} }
@ -159,10 +159,10 @@ QString AWPatternFunctions::insertKeyNames(QString _code, const QStringList &_ke
{ {
qCDebug(LOG_AW) << "Looking for key names in code" << _code << "using list" << _keys; qCDebug(LOG_AW) << "Looking for key names in code" << _code << "using list" << _keys;
QList<AWPatternFunctions::AWFunction> found = AWPatternFunctions::findFunctionCalls("aw_names", _code); auto found = AWPatternFunctions::findFunctionCalls("aw_names", _code);
for (auto &function : found) { for (auto &function : found) {
QString separator = function.args.isEmpty() ? "," : function.args.at(0); auto separator = function.args.isEmpty() ? "," : function.args.at(0);
QStringList required = _keys.filter(QRegularExpression(function.body)); auto required = _keys.filter(QRegularExpression(function.body));
_code.replace(function.what, required.join(separator)); _code.replace(function.what, required.join(separator));
} }
@ -175,11 +175,11 @@ QString AWPatternFunctions::insertKeys(QString _code, const QStringList &_keys)
{ {
qCDebug(LOG_AW) << "Looking for keys in code" << _code << "using list" << _keys; qCDebug(LOG_AW) << "Looking for keys in code" << _code << "using list" << _keys;
QList<AWPatternFunctions::AWFunction> found = AWPatternFunctions::findFunctionCalls("aw_keys", _code); auto found = AWPatternFunctions::findFunctionCalls("aw_keys", _code);
for (auto &function : found) { for (auto &function : found) {
QString separator = function.args.isEmpty() ? "," : function.args.at(0); auto separator = function.args.isEmpty() ? "," : function.args.at(0);
QStringList required = _keys.filter(QRegularExpression(function.body)); auto required = _keys.filter(QRegularExpression(function.body));
std::for_each(required.begin(), required.end(), [](QString &value) { value = QString("$%1").arg(value); }); std::for_each(required.begin(), required.end(), [](auto &value) { value = QString("$%1").arg(value); });
_code.replace(function.what, required.join(separator)); _code.replace(function.what, required.join(separator));
} }
@ -192,26 +192,25 @@ QString AWPatternFunctions::insertMacros(QString _code)
{ {
qCDebug(LOG_AW) << "Looking for macros in code" << _code; qCDebug(LOG_AW) << "Looking for macros in code" << _code;
QList<AWPatternFunctions::AWFunction> found = AWPatternFunctions::findFunctionCalls("aw_macro", _code); auto found = AWPatternFunctions::findFunctionCalls("aw_macro", _code);
for (auto &macro : found) { for (auto &macro : found) {
// get macro params // get macro params
if (macro.args.isEmpty()) { if (macro.args.isEmpty()) {
qCWarning(LOG_AW) << "No macro name found for" << macro.what; qCWarning(LOG_AW) << "No macro name found for" << macro.what;
continue; continue;
} }
QString name = macro.args.takeFirst(); auto name = macro.args.takeFirst();
// find macro usage // find macro usage
QList<AWPatternFunctions::AWFunction> macroUsage auto macroUsage = AWPatternFunctions::findFunctionCalls(QString("aw_macro_%1").arg(name), _code);
= AWPatternFunctions::findFunctionCalls(QString("aw_macro_%1").arg(name), _code);
for (auto &function : macroUsage) { for (auto &function : macroUsage) {
if (function.args.count() != macro.args.count()) { if (function.args.count() != macro.args.count()) {
qCWarning(LOG_AW) << "Invalid args count found for call" << function.what << "with macro" << macro.what; qCWarning(LOG_AW) << "Invalid args count found for call" << function.what << "with macro" << macro.what;
continue; continue;
} }
// generate body to replace // generate body to replace
QString result = macro.body; auto result = macro.body;
std::for_each(macro.args.cbegin(), macro.args.cend(), [&result, macro, function](const QString &arg) { std::for_each(macro.args.cbegin(), macro.args.cend(), [&result, macro, function](auto &arg) {
int index = macro.args.indexOf(arg); auto index = macro.args.indexOf(arg);
result.replace(QString("$%1").arg(arg), function.args.at(index)); result.replace(QString("$%1").arg(arg), function.args.at(index));
}); });
// do replace // do replace
@ -231,7 +230,7 @@ QStringList AWPatternFunctions::findKeys(const QString &_code, const QStringList
qCDebug(LOG_AW) << "Looking for keys in code" << _code << "using list" << _keys; qCDebug(LOG_AW) << "Looking for keys in code" << _code << "using list" << _keys;
QStringList selectedKeys; QStringList selectedKeys;
QString replacedCode = _code; auto replacedCode = _code;
for (auto &key : _keys) for (auto &key : _keys)
if ((key.startsWith("bar") == _isBars) && (replacedCode.contains(QString("$%1").arg(key)))) { if ((key.startsWith("bar") == _isBars) && (replacedCode.contains(QString("$%1").arg(key)))) {
qCInfo(LOG_AW) << "Found key" << key << "with bar enabled" << _isBars; qCInfo(LOG_AW) << "Found key" << key << "with bar enabled" << _isBars;
@ -251,13 +250,13 @@ QStringList AWPatternFunctions::findLambdas(const QString &_code)
QStringList selectedKeys; QStringList selectedKeys;
// match the following construction ${{some code here}} // match the following construction ${{some code here}}
QRegularExpression lambdaRegexp(R"(\$\{\{(?<body>.*?)\}\})"); static QRegularExpression lambdaRegexp(R"(\$\{\{(?<body>.*?)\}\})");
lambdaRegexp.setPatternOptions(QRegularExpression::DotMatchesEverythingOption); lambdaRegexp.setPatternOptions(QRegularExpression::DotMatchesEverythingOption);
QRegularExpressionMatchIterator it = lambdaRegexp.globalMatch(_code); auto it = lambdaRegexp.globalMatch(_code);
while (it.hasNext()) { while (it.hasNext()) {
QRegularExpressionMatch match = it.next(); auto match = it.next();
QString lambda = match.captured("body"); auto lambda = match.captured("body");
// append // append
qCInfo(LOG_AW) << "Found lambda" << lambda; qCInfo(LOG_AW) << "Found lambda" << lambda;

View File

@ -15,9 +15,7 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/ ***************************************************************************/
#pragma once
#ifndef AWPATTERNFUNCTIONS_H
#define AWPATTERNFUNCTIONS_H
#include <QString> #include <QString>
#include <QVariant> #include <QVariant>
@ -25,7 +23,7 @@
class AWKeysAggregator; class AWKeysAggregator;
namespace AWPatternFunctions namespace __attribute__((visibility("default"))) AWPatternFunctions
{ {
typedef struct { typedef struct {
QStringList args; QStringList args;
@ -47,6 +45,3 @@ QString insertMacros(QString _code);
QStringList findKeys(const QString &_code, const QStringList &_keys, bool _isBars); QStringList findKeys(const QString &_code, const QStringList &_keys, bool _isBars);
QStringList findLambdas(const QString &_code); QStringList findLambdas(const QString &_code);
} // namespace AWPatternFunctions } // namespace AWPatternFunctions
#endif /* AWPATTERNFUNCTIONS_H */

View File

@ -18,8 +18,6 @@
#include "awtelemetryhandler.h" #include "awtelemetryhandler.h"
#include <QJsonDocument> #include <QJsonDocument>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QSettings> #include <QSettings>
#include <QStandardPaths> #include <QStandardPaths>
#include <QUuid> #include <QUuid>
@ -27,23 +25,13 @@
#include "awdebug.h" #include "awdebug.h"
AWTelemetryHandler::AWTelemetryHandler(QObject *_parent, const QString &_clientId) AWTelemetryHandler::AWTelemetryHandler(QObject *_parent)
: QObject(_parent) : QObject(_parent)
{ {
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
m_localFile = QString("%1/awesomewidgets/telemetry.ini") m_localFile = QString("%1/awesomewidgets/telemetry.ini")
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)); .arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation));
// override client id if any
if (!_clientId.isEmpty())
m_clientId = _clientId;
}
AWTelemetryHandler::~AWTelemetryHandler()
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
} }
@ -71,14 +59,11 @@ QString AWTelemetryHandler::getLast(const QString &_group) const
} }
void AWTelemetryHandler::init(const int _count, const bool _enableRemote, const QString &_clientId) void AWTelemetryHandler::init(const int _count)
{ {
qCDebug(LOG_AW) << "Init telemetry with count" << _count << "enable remote" << _enableRemote << "client ID" qCDebug(LOG_AW) << "Init telemetry with count" << _count;
<< _clientId;
m_storeCount = _count; m_storeCount = _count;
m_uploadEnabled = _enableRemote;
m_clientId = _clientId;
} }
@ -106,7 +91,7 @@ bool AWTelemetryHandler::put(const QString &_group, const QString &_value) const
settings.remove(""); settings.remove("");
// and save now // and save now
for (auto &val : saved) { for (auto &val : saved) {
QString key = getKey(settings.childKeys().count()); auto key = getKey(settings.childKeys().count());
settings.setValue(key, val); settings.setValue(key, val);
} }
@ -118,59 +103,6 @@ bool AWTelemetryHandler::put(const QString &_group, const QString &_value) const
} }
void AWTelemetryHandler::uploadTelemetry(const QString &_group, const QString &_value)
{
qCDebug(LOG_AW) << "Upload data with group" << _group << "and value" << _value;
if (!m_uploadEnabled) {
qCInfo(LOG_AW) << "Upload disabled by configuration";
return;
}
auto *manager = new QNetworkAccessManager(nullptr);
connect(manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(telemetryReplyRecieved(QNetworkReply *)));
QUrl url(REMOTE_TELEMETRY_URL);
QNetworkRequest request(url);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
// generate payload
QVariantMap payload;
payload["api"] = AW_TELEMETRY_API;
payload["client_id"] = m_clientId;
payload["metadata"] = _value;
payload["type"] = _group;
// convert to QByteArray to send request
QByteArray data = QJsonDocument::fromVariant(payload).toJson(QJsonDocument::Compact);
qCInfo(LOG_AW) << "Send request with body" << data.data() << "and size" << data.size();
manager->post(request, data);
}
void AWTelemetryHandler::telemetryReplyRecieved(QNetworkReply *_reply)
{
if (_reply->error() != QNetworkReply::NoError) {
qCWarning(LOG_AW) << "An error occurs" << _reply->error() << "with message" << _reply->errorString();
return;
}
QJsonParseError error{};
QJsonDocument jsonDoc = QJsonDocument::fromJson(_reply->readAll(), &error);
if (error.error != QJsonParseError::NoError) {
qCWarning(LOG_AW) << "Parse error" << error.errorString();
return;
}
_reply->deleteLater();
// convert to map
QVariantMap response = jsonDoc.toVariant().toMap();
QString message = response["message"].toString();
qCInfo(LOG_AW) << "Server reply on telemetry" << message;
return emit(replyReceived(message));
}
QString AWTelemetryHandler::getKey(const int _count) QString AWTelemetryHandler::getKey(const int _count)
{ {
qCDebug(LOG_AW) << "Get key for keys count" << _count; qCDebug(LOG_AW) << "Get key for keys count" << _count;

View File

@ -15,43 +15,25 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/ ***************************************************************************/
#pragma once
#ifndef AWTELEMETRYHANDLER_H
#define AWTELEMETRYHANDLER_H
#include <QObject> #include <QObject>
class QNetworkReply; class __attribute__((visibility("default"))) AWTelemetryHandler : public QObject
class AWTelemetryHandler : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
const char *REMOTE_TELEMETRY_URL = "https://arcanis.me/telemetry"; explicit AWTelemetryHandler(QObject *_parent = nullptr);
~AWTelemetryHandler() override = default;
explicit AWTelemetryHandler(QObject *_parent = nullptr, const QString &_clientId = "");
~AWTelemetryHandler() override;
Q_INVOKABLE [[nodiscard]] QStringList get(const QString &_group) const; Q_INVOKABLE [[nodiscard]] QStringList get(const QString &_group) const;
Q_INVOKABLE [[nodiscard]] QString getLast(const QString &_group) const; Q_INVOKABLE [[nodiscard]] QString getLast(const QString &_group) const;
Q_INVOKABLE void init(int _count, bool _enableRemote, const QString &_clientId); Q_INVOKABLE void init(int _count);
Q_INVOKABLE [[nodiscard]] bool put(const QString &_group, const QString &_value) const; Q_INVOKABLE [[nodiscard]] bool put(const QString &_group, const QString &_value) const;
Q_INVOKABLE void uploadTelemetry(const QString &_group, const QString &_value);
signals:
void replyReceived(const QString &_message);
private slots:
void telemetryReplyRecieved(QNetworkReply *_reply);
private: private:
static QString getKey(int _count); static QString getKey(int _count);
QString m_clientId;
QString m_localFile; QString m_localFile;
int m_storeCount = 0; int m_storeCount = 0;
bool m_uploadEnabled = false;
}; };
#endif /* AWTELEMETRYHANDLER_H */

View File

@ -17,7 +17,11 @@
#include "awupdatehelper.h" #include "awupdatehelper.h"
#ifndef NDEBUG
#define NDEBUG
#endif /* NDEBUG */
#include <KI18n/KLocalizedString> #include <KI18n/KLocalizedString>
#include <KNotifications/KNotification>
#include <QDesktopServices> #include <QDesktopServices>
#include <QJsonDocument> #include <QJsonDocument>
@ -40,21 +44,15 @@ AWUpdateHelper::AWUpdateHelper(QObject *_parent)
} }
AWUpdateHelper::~AWUpdateHelper()
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
}
void AWUpdateHelper::checkUpdates(const bool _showAnyway) void AWUpdateHelper::checkUpdates(const bool _showAnyway)
{ {
qCDebug(LOG_AW) << "Show anyway" << _showAnyway; qCDebug(LOG_AW) << "Show anyway" << _showAnyway;
// showAnyway options requires to show message if no updates found on direct // showAnyway options required to show message if no updates found on direct
// request. In case of automatic check no message will be shown // request. In case of automatic check no message will be shown
auto *manager = new QNetworkAccessManager(nullptr); auto manager = new QNetworkAccessManager(nullptr);
connect(manager, &QNetworkAccessManager::finished, connect(manager, &QNetworkAccessManager::finished,
[_showAnyway, this](QNetworkReply *reply) { return versionReplyRecieved(reply, _showAnyway); }); [_showAnyway, this](QNetworkReply *reply) { return versionReplyReceived(reply, _showAnyway); });
manager->get(QNetworkRequest(QUrl(VERSION_API))); manager->get(QNetworkRequest(QUrl(VERSION_API)));
} }
@ -63,15 +61,14 @@ void AWUpdateHelper::checkUpdates(const bool _showAnyway)
bool AWUpdateHelper::checkVersion() bool AWUpdateHelper::checkVersion()
{ {
QSettings settings(m_genericConfig, QSettings::IniFormat); QSettings settings(m_genericConfig, QSettings::IniFormat);
QVersionNumber version = QVersionNumber::fromString(settings.value("Version", QString(VERSION)).toString()); auto version = QVersionNumber::fromString(settings.value("Version", QString(VERSION)).toString());
// update version // update version
settings.setValue("Version", QString(VERSION)); settings.setValue("Version", QString(VERSION));
settings.sync(); settings.sync();
qCInfo(LOG_AW) << "Found version" << version << "actual one is" << m_foundVersion; qCInfo(LOG_AW) << "Found version" << version << "actual one is" << m_foundVersion;
if ((version != m_foundVersion) && (!QString(CHANGELOG).isEmpty())) { if ((version != m_foundVersion) && (!QString(CHANGELOG).isEmpty())) {
genMessageBox(i18nc("Changelog of %1", VERSION), QString(CHANGELOG).replace('@', '\n'), QMessageBox::Ok) sendNotification(i18n("Changelog of %1", VERSION), QString(CHANGELOG).replace('@', '\n'));
->open();
return true; return true;
} else if (version != m_foundVersion) { } else if (version != m_foundVersion) {
qCWarning(LOG_AW) << "No changelog information provided"; qCWarning(LOG_AW) << "No changelog information provided";
@ -84,49 +81,40 @@ bool AWUpdateHelper::checkVersion()
} }
void AWUpdateHelper::openReleasesPage()
{
QDesktopServices::openUrl(QString(RELEASES) + m_foundVersion.toString());
}
void AWUpdateHelper::showInfo(const QVersionNumber &_version) void AWUpdateHelper::showInfo(const QVersionNumber &_version)
{ {
qCDebug(LOG_AW) << "Version" << _version; qCDebug(LOG_AW) << "Version" << _version;
QString text = i18n("You are using the actual version %1", _version.toString()); auto text = i18n("You are using the actual version %1", _version.toString());
if (!QString(COMMIT_SHA).isEmpty()) if (!QString(COMMIT_SHA).isEmpty())
text += QString(" (%1)").arg(QString(COMMIT_SHA)); text += QString(" (%1)").arg(QString(COMMIT_SHA));
return genMessageBox(i18n("No new version found"), text, QMessageBox::Ok)->open(); sendNotification(i18n("No new version found"), text);
} }
void AWUpdateHelper::showUpdates(const QVersionNumber &_version) void AWUpdateHelper::showUpdates(const QVersionNumber &_version) const
{ {
qCDebug(LOG_AW) << "Version" << _version; qCDebug(LOG_AW) << "Version" << _version;
QString text; QString text;
text += i18nc("Current version : %1", VERSION); text += i18n("Current version : %1", VERSION);
text += QString(COMMIT_SHA).isEmpty() ? "\n" : QString(" (%1)\n").arg(QString(COMMIT_SHA)); text += QString(COMMIT_SHA).isEmpty() ? "\n" : QString(" (%1)\n").arg(QString(COMMIT_SHA));
text += i18n("New version : %1", _version.toString()) + "\n\n"; text += i18n("New version : %1", _version.toString()) + "\n\n";
text += i18n("Click \"Ok\" to download"); text += i18n("Click \"Ok\" to download");
genMessageBox(i18n("There are updates"), text, QMessageBox::Ok | QMessageBox::Cancel) auto event = sendNotification(i18n("There are updates"), text);
->open(this, SLOT(userReplyOnUpdates(QAbstractButton *))); auto action = event->addAction(i18n("Details"));
connect(action, &KNotificationAction::activated, this, &AWUpdateHelper::openReleasesPage);
} }
void AWUpdateHelper::userReplyOnUpdates(QAbstractButton *_button) void AWUpdateHelper::versionReplyReceived(QNetworkReply *_reply, const bool _showAnyway)
{
QMessageBox::ButtonRole ret = dynamic_cast<QMessageBox *>(sender())->buttonRole(_button);
qCInfo(LOG_AW) << "User select" << ret;
switch (ret) {
case QMessageBox::AcceptRole:
QDesktopServices::openUrl(QString(RELEASES) + m_foundVersion.toString());
break;
case QMessageBox::RejectRole:
default:
break;
}
}
void AWUpdateHelper::versionReplyRecieved(QNetworkReply *_reply, const bool _showAnyway)
{ {
qCDebug(LOG_AW) << "Show message anyway" << _showAnyway; qCDebug(LOG_AW) << "Show message anyway" << _showAnyway;
if (_reply->error() != QNetworkReply::NoError) { if (_reply->error() != QNetworkReply::NoError) {
@ -134,22 +122,23 @@ void AWUpdateHelper::versionReplyRecieved(QNetworkReply *_reply, const bool _sho
return; return;
} }
QJsonParseError error = QJsonParseError(); auto error = QJsonParseError();
QJsonDocument jsonDoc = QJsonDocument::fromJson(_reply->readAll(), &error); auto jsonDoc = QJsonDocument::fromJson(_reply->readAll(), &error);
if (error.error != QJsonParseError::NoError) { if (error.error != QJsonParseError::NoError) {
qCWarning(LOG_AW) << "Parse error" << error.errorString(); qCWarning(LOG_AW) << "Parse error" << error.errorString();
return; return;
} }
_reply->deleteLater(); _reply->deleteLater();
_reply->manager()->deleteLater(); // remember to delete manager too
// convert to map // convert to map
QVariantMap firstRelease = jsonDoc.toVariant().toList().first().toMap(); auto firstRelease = jsonDoc.toVariant().toList().first().toMap();
QString version = firstRelease["tag_name"].toString(); auto version = firstRelease["tag_name"].toString();
version.remove("V."); version.remove("V.");
m_foundVersion = QVersionNumber::fromString(version); m_foundVersion = QVersionNumber::fromString(version);
qCInfo(LOG_AW) << "Update found version to" << m_foundVersion; qCInfo(LOG_AW) << "Update found version to" << m_foundVersion;
QVersionNumber oldVersion = QVersionNumber::fromString(VERSION); auto oldVersion = QVersionNumber::fromString(VERSION);
if (oldVersion < m_foundVersion) if (oldVersion < m_foundVersion)
return showUpdates(m_foundVersion); return showUpdates(m_foundVersion);
else if (_showAnyway) else if (_showAnyway)
@ -158,18 +147,12 @@ void AWUpdateHelper::versionReplyRecieved(QNetworkReply *_reply, const bool _sho
// additional method which is used to show message box which does not block UI // additional method which is used to show message box which does not block UI
QMessageBox *AWUpdateHelper::genMessageBox(const QString &_title, const QString &_body, KNotification *AWUpdateHelper::sendNotification(const QString &_title, const QString &_body)
const QMessageBox::StandardButtons _buttons)
{ {
qCDebug(LOG_AW) << "Construct message box with title" << _title << "and body" << _body; qCDebug(LOG_AW) << "Construct message box with title" << _title << "and body" << _body;
auto *msgBox = new QMessageBox(nullptr); auto event = KNotification::event("system", _title, _body);
msgBox->setAttribute(Qt::WA_DeleteOnClose); event->setComponentName("plasma-applet-org.kde.plasma.awesome-widget");
msgBox->setModal(false);
msgBox->setWindowTitle(_title);
msgBox->setText(_body);
msgBox->setStandardButtons(_buttons);
msgBox->setIcon(QMessageBox::Information);
return msgBox; return event;
} }

View File

@ -15,39 +15,33 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/ ***************************************************************************/
#pragma once
#ifndef AWUPDATEHELPER_H
#define AWUPDATEHELPER_H
#include <QMessageBox>
#include <QObject> #include <QObject>
#include <QVersionNumber> #include <QVersionNumber>
class KNotification;
class QNetworkReply; class QNetworkReply;
class AWUpdateHelper : public QObject class __attribute__((visibility("default"))) AWUpdateHelper : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit AWUpdateHelper(QObject *_parent = nullptr); explicit AWUpdateHelper(QObject *_parent = nullptr);
~AWUpdateHelper() override; ~AWUpdateHelper() override = default;
void checkUpdates(bool _showAnyway = false); void checkUpdates(bool _showAnyway = false);
bool checkVersion(); bool checkVersion();
private slots: private slots:
void openReleasesPage();
static void showInfo(const QVersionNumber &_version); static void showInfo(const QVersionNumber &_version);
void showUpdates(const QVersionNumber &_version); void showUpdates(const QVersionNumber &_version) const;
void userReplyOnUpdates(QAbstractButton *_button); void versionReplyReceived(QNetworkReply *_reply, bool _showAnyway);
void versionReplyRecieved(QNetworkReply *_reply, bool _showAnyway);
private: private:
static QMessageBox *genMessageBox(const QString &_title, const QString &_body, static KNotification *sendNotification(const QString &_title, const QString &_body);
QMessageBox::StandardButtons _buttons);
QVersionNumber m_foundVersion; QVersionNumber m_foundVersion;
QString m_genericConfig; QString m_genericConfig;
}; };
#endif /* AWUPDATEHELPER_H */

View File

@ -0,0 +1,37 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#pragma once
#include <QString>
class AWFormatterHelper;
struct AWPluginFormatSettings {
QString acOffline;
QString acOnline;
QString customTime;
QString customUptime;
QString tempUnits;
bool translate = false;
AWFormatterHelper *customFormatters = nullptr;
};

View File

@ -0,0 +1,69 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#pragma once
#include <QLocale>
#include <QVariant>
#include <memory>
#include "awpluginformatsettings.h"
class AWPluginFormaterInterface
{
public:
virtual ~AWPluginFormaterInterface() = default;
[[nodiscard]] virtual QString format(const QVariant &_value, const QString &_key,
const AWPluginFormatSettings &_settings) const
= 0;
virtual void load(){};
};
template <typename Formatter> class AWPluginFormatter : public AWPluginFormaterInterface
{
public:
static constexpr double KBinBytes = 1024.0;
static constexpr double MBinBytes = 1024.0 * KBinBytes;
static constexpr double GBinBytes = 1024.0 * MBinBytes;
AWPluginFormatter(AWPluginFormatter &) = delete;
void operator=(const AWPluginFormatter &) = delete;
[[nodiscard]] static Formatter *instance()
{
static auto instance = loadInstance();
return instance.get();
};
[[nodiscard]] static QLocale locale(const AWPluginFormatSettings &_settings)
{
return _settings.translate ? QLocale::system() : QLocale::c();
};
protected:
AWPluginFormatter() = default;
[[nodiscard]] static std::unique_ptr<Formatter> loadInstance()
{
auto instance = std::make_unique<Formatter>();
instance->load();
return instance;
};
};

View File

@ -0,0 +1,25 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awpluginformatterac.h"
QString AWPluginFormatterAC::format(const QVariant &_value, const QString &,
const AWPluginFormatSettings &_settings) const
{
return _value.toBool() ? _settings.acOnline : _settings.acOffline;
}

View File

@ -0,0 +1,28 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#pragma once
#include "awpluginformatter.h"
class AWPluginFormatterAC : public AWPluginFormatter<AWPluginFormatterAC>
{
public:
[[nodiscard]] QString format(const QVariant &_value, const QString &,
const AWPluginFormatSettings &_settings) const override;
};

View File

@ -0,0 +1,29 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awpluginformattercustom.h"
#include "awformatterhelper.h"
QString AWPluginFormatterCustom::format(const QVariant &_value, const QString &_key,
const AWPluginFormatSettings &_settings) const
{
if (_settings.customFormatters)
return _settings.customFormatters->convert(_value, _key);
return _value.toString();
}

View File

@ -0,0 +1,28 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#pragma once
#include "awpluginformatter.h"
class AWPluginFormatterCustom : public AWPluginFormatter<AWPluginFormatterCustom>
{
public:
[[nodiscard]] QString format(const QVariant &_value, const QString &_key,
const AWPluginFormatSettings &_settings) const override;
};

View File

@ -0,0 +1,25 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awpluginformatterdouble.h"
QString AWPluginFormatterDouble::format(const QVariant &_value, const QString &, const AWPluginFormatSettings &) const
{
auto output = QString("%1").arg(_value.toDouble(), 0, 'f');
return output.rightJustified(8, QLatin1Char(' '), true);
}

View File

@ -0,0 +1,28 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#pragma once
#include "awpluginformatter.h"
class AWPluginFormatterDouble : public AWPluginFormatter<AWPluginFormatterDouble>
{
public:
[[nodiscard]] QString format(const QVariant &_value, const QString &,
const AWPluginFormatSettings &) const override;
};

View File

@ -0,0 +1,24 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awpluginformatterfloat.h"
QString AWPluginFormatterFloat::format(const QVariant &_value, const QString &, const AWPluginFormatSettings &) const
{
return QString("%1").arg(_value.toDouble(), 5, 'f', 1);
}

View File

@ -0,0 +1,28 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#pragma once
#include "awpluginformatter.h"
class AWPluginFormatterFloat : public AWPluginFormatter<AWPluginFormatterFloat>
{
public:
[[nodiscard]] QString format(const QVariant &_value, const QString &,
const AWPluginFormatSettings &) const override;
};

View File

@ -0,0 +1,25 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awpluginformatterfloatprecise.h"
QString AWPluginFormatterFloatPrecise::format(const QVariant &_value, const QString &,
const AWPluginFormatSettings &) const
{
return QString("%1").arg(_value.toDouble(), 5, 'f', 2);
}

View File

@ -0,0 +1,28 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#pragma once
#include "awpluginformatter.h"
class AWPluginFormatterFloatPrecise : public AWPluginFormatter<AWPluginFormatterFloatPrecise>
{
public:
[[nodiscard]] QString format(const QVariant &_value, const QString &,
const AWPluginFormatSettings &) const override;
};

View File

@ -0,0 +1,24 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awpluginformatterinteger.h"
QString AWPluginFormatterInteger::format(const QVariant &_value, const QString &, const AWPluginFormatSettings &) const
{
return QString("%1").arg(_value.toDouble(), 4, 'f', 0);
}

View File

@ -0,0 +1,28 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#pragma once
#include "awpluginformatter.h"
class AWPluginFormatterInteger : public AWPluginFormatter<AWPluginFormatterInteger>
{
public:
[[nodiscard]] QString format(const QVariant &_value, const QString &,
const AWPluginFormatSettings &) const override;
};

View File

@ -0,0 +1,25 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awpluginformatterintegershort.h"
QString AWPluginFormatterIntegerShort::format(const QVariant &_value, const QString &,
const AWPluginFormatSettings &) const
{
return QString("%1").arg(_value.toDouble(), 3, 'f', 0);
}

View File

@ -0,0 +1,28 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#pragma once
#include "awpluginformatter.h"
class AWPluginFormatterIntegerShort : public AWPluginFormatter<AWPluginFormatterIntegerShort>
{
public:
[[nodiscard]] QString format(const QVariant &_value, const QString &,
const AWPluginFormatSettings &) const override;
};

View File

@ -0,0 +1,25 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awpluginformatterintegerwide.h"
QString AWPluginFormatterIntegerWide::format(const QVariant &_value, const QString &,
const AWPluginFormatSettings &) const
{
return QString("%1").arg(_value.toDouble(), 5, 'f', 0);
}

View File

@ -0,0 +1,28 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#pragma once
#include "awpluginformatter.h"
class AWPluginFormatterIntegerWide : public AWPluginFormatter<AWPluginFormatterIntegerWide>
{
public:
[[nodiscard]] QString format(const QVariant &_value, const QString &,
const AWPluginFormatSettings &) const override;
};

View File

@ -0,0 +1,24 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awpluginformatterlist.h"
QString AWPluginFormatterList::format(const QVariant &_value, const QString &, const AWPluginFormatSettings &) const
{
return _value.toStringList().join(",");
}

View File

@ -0,0 +1,28 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#pragma once
#include "awpluginformatter.h"
class AWPluginFormatterList : public AWPluginFormatter<AWPluginFormatterList>
{
public:
[[nodiscard]] QString format(const QVariant &_value, const QString &,
const AWPluginFormatSettings &) const override;
};

View File

@ -0,0 +1,24 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awpluginformattermemory.h"
QString AWPluginFormatterMemory::format(const QVariant &_value, const QString &, const AWPluginFormatSettings &) const
{
return QString("%1").arg(_value.toDouble() / KBinBytes, 5, 'f', 0);
}

View File

@ -0,0 +1,28 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#pragma once
#include "awpluginformatter.h"
class AWPluginFormatterMemory : public AWPluginFormatter<AWPluginFormatterMemory>
{
public:
[[nodiscard]] QString format(const QVariant &_value, const QString &,
const AWPluginFormatSettings &) const override;
};

View File

@ -0,0 +1,24 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awpluginformattermemorygb.h"
QString AWPluginFormatterMemoryGB::format(const QVariant &_value, const QString &, const AWPluginFormatSettings &) const
{
return QString("%1").arg(_value.toDouble() / GBinBytes, 5, 'f', 1);
}

View File

@ -0,0 +1,28 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#pragma once
#include "awpluginformatter.h"
class AWPluginFormatterMemoryGB : public AWPluginFormatter<AWPluginFormatterMemoryGB>
{
public:
[[nodiscard]] QString format(const QVariant &_value, const QString &,
const AWPluginFormatSettings &) const override;
};

View File

@ -0,0 +1,24 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awpluginformattermemorymb.h"
QString AWPluginFormatterMemoryMB::format(const QVariant &_value, const QString &, const AWPluginFormatSettings &) const
{
return QString("%1").arg(_value.toDouble() / MBinBytes, 5, 'f', 0);
}

View File

@ -0,0 +1,28 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#pragma once
#include "awpluginformatter.h"
class AWPluginFormatterMemoryMB : public AWPluginFormatter<AWPluginFormatterMemoryMB>
{
public:
[[nodiscard]] QString format(const QVariant &_value, const QString &,
const AWPluginFormatSettings &) const override;
};

View File

@ -0,0 +1,37 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awpluginformatternet.h"
QString AWPluginFormatterNet::format(const QVariant &_value, const QString &, const AWPluginFormatSettings &) const
{
auto value = _value.toDouble();
return (value > MBinBytes) ? formatMB(value) : formatKB(value);
}
QString AWPluginFormatterNet::formatKB(const double &_value)
{
return QString("%1").arg(_value / KBinBytes, 4, 'f', 0);
}
QString AWPluginFormatterNet::formatMB(const double &_value)
{
return QString("%1").arg(_value / MBinBytes, 4, 'f', 1);
}

View File

@ -15,34 +15,18 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/ ***************************************************************************/
#pragma once
#ifndef TESTGPULOADSOURCE_H #include "awpluginformatter.h"
#define TESTGPULOADSOURCE_H
#include <QObject>
#include <QPair>
class GPULoadSource; class AWPluginFormatterNet : public AWPluginFormatter<AWPluginFormatterNet>
class TestGPULoadSource : public QObject
{ {
Q_OBJECT public:
[[nodiscard]] QString format(const QVariant &_value, const QString &,
private slots: const AWPluginFormatSettings &) const override;
// initialization
void initTestCase();
void cleanupTestCase();
// test
void test_sources();
void test_gpuload();
private: private:
GPULoadSource *source = nullptr; [[nodiscard]] static QString formatKB(const double &_value);
QString device; [[nodiscard]] static QString formatMB(const double &_value);
QString src = "gpu/load";
QPair<float, float> load = QPair<float, float>(0.0f, 100.0f);
}; };
#endif /* TESTGPULOADSOURCE_H */

View File

@ -0,0 +1,40 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awpluginformatternetunits.h"
#include <KI18n/KLocalizedString>
QString AWPluginFormatterNetUnits::format(const QVariant &_value, const QString &,
const AWPluginFormatSettings &_settings) const
{
auto value = _value.toDouble();
return (value > MBinBytes) ? formatMB(_settings) : formatKB(_settings);
}
QString AWPluginFormatterNetUnits::formatKB(const AWPluginFormatSettings &_settings)
{
return _settings.translate ? i18n("KB/s") : "KB/s";
}
QString AWPluginFormatterNetUnits::formatMB(const AWPluginFormatSettings &_settings)
{
return _settings.translate ? i18n("MB/s") : "MB/s";
}

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