mirror of
				https://github.com/arcan1s/awesome-widgets.git
				synced 2025-10-26 03:13:42 +00:00 
			
		
		
		
	Compare commits
	
		
			69 Commits
		
	
	
		
			V.3.3.3
			...
			84e5b7d64e
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 84e5b7d64e | |||
| 56c0a5837f | |||
| fd24ded6b8 | |||
| ed5ae40624 | |||
| 2f4f05b5af | |||
| c608c40c97 | |||
| 95d5bb99c0 | |||
| 397b523180 | |||
| 54acc5f780 | |||
| 332d78eb25 | |||
| 960640f5bc | |||
| ac52888b0d | |||
| a35b57e5d2 | |||
| 0bcceefd47 | |||
| f27050afbc | |||
| d71f85eaad | |||
| b0df3535a5 | |||
| 4d01b87088 | |||
| eecb128865 | |||
| 0565d3533f | |||
| 88f70c0ea6 | |||
| 338828da88 | |||
| 09a3c32d0c | |||
| e9beea2d7a | |||
| 1e69aa93f5 | |||
| 73f1617cbf | |||
| dea9d488df | |||
| 84de9755b5 | |||
| ff40ac96d8 | |||
| de9d90df4a | |||
| 883659272d | |||
| 0c443e9278 | |||
| 6ec30b71d1 | |||
| 4ed19a38d9 | |||
| e592de9555 | |||
| 1e0316c4de | |||
| 91abbdcd96 | |||
| e81d765098 | |||
| 8eaf444a25 | |||
| 183e7d8a20 | |||
| a4a1ae064f | |||
| 3e81cd16bb | |||
| 55319521b2 | |||
| e525cb4742 | |||
| 0f19bce80d | |||
| e0df575aa9 | |||
| 276248a748 | |||
| c05a87a540 | |||
| 9f46a17b98 | |||
| c2a18f8845 | |||
| 308b721c87 | |||
| c4c37406a5 | |||
| ffb66586d3 | |||
| 935fa04757 | |||
| fee70b7385 | |||
| ed21e3fb18 | |||
| 5807d4d75e | |||
| 5bd95fe41a | |||
| 13edbc5eb1 | |||
| 3b41239672 | |||
| b30bd35add | |||
| 4bba061d66 | |||
| ce30d90a23 | |||
| 423eabd857 | |||
| e5a9e99438 | |||
| eb911551eb | |||
| 5886dcc50b | |||
| 2d7d4c55a2 | |||
| ea5d73d8fd | 
| @ -1,11 +0,0 @@ | |||||||
| FROM base/archlinux |  | ||||||
|  |  | ||||||
| RUN pacman -Sy |  | ||||||
|  |  | ||||||
| # toolchain |  | ||||||
| RUN pacman -S --noconfirm base-devel cmake extra-cmake-modules python |  | ||||||
| # kf5 and qt5 libraries |  | ||||||
| RUN pacman -S --noconfirm plasma-framework |  | ||||||
|  |  | ||||||
| # required by tests |  | ||||||
| RUN pacman -S --noconfirm xorg-server-xvfb |  | ||||||
| @ -1,12 +0,0 @@ | |||||||
| FROM multiarch/ubuntu-core:amd64-xenial |  | ||||||
|  |  | ||||||
| RUN apt-get update |  | ||||||
| # toolchain |  | ||||||
| RUN apt-get install -y cmake extra-cmake-modules g++ git gettext |  | ||||||
| # kf5 and qt5 libraries |  | ||||||
| RUN apt-get install -y libkf5i18n-dev libkf5notifications-dev libkf5service-dev \ |  | ||||||
|       libkf5windowsystem-dev plasma-framework-dev qtbase5-dev qtdeclarative5-dev \ |  | ||||||
|       plasma-framework |  | ||||||
|  |  | ||||||
| # required by tests |  | ||||||
| RUN apt-get install -y xvfb |  | ||||||
| @ -1,12 +0,0 @@ | |||||||
| FROM multiarch/ubuntu-core:i386-xenial |  | ||||||
|  |  | ||||||
| RUN apt-get update |  | ||||||
| # toolchain |  | ||||||
| RUN apt-get install -y cmake extra-cmake-modules g++ git gettext |  | ||||||
| # kf5 and qt5 libraries |  | ||||||
| RUN apt-get install -y libkf5i18n-dev libkf5notifications-dev libkf5service-dev \ |  | ||||||
|       libkf5windowsystem-dev plasma-framework-dev qtbase5-dev qtdeclarative5-dev \ |  | ||||||
|       plasma-framework |  | ||||||
|  |  | ||||||
| # required by tests |  | ||||||
| RUN apt-get install -y xvfb |  | ||||||
| @ -1,14 +0,0 @@ | |||||||
| #!/bin/bash |  | ||||||
|  |  | ||||||
| set -e |  | ||||||
|  |  | ||||||
| rm -rf build-arch |  | ||||||
| mkdir build-arch |  | ||||||
|  |  | ||||||
| # build |  | ||||||
| cd build-arch |  | ||||||
| cmake -DKDE_INSTALL_USE_QT_SYS_PATHS=ON -DCMAKE_BUILD_TYPE=Optimization -DCMAKE_INSTALL_PREFIX=/usr -DBUILD_FUTURE=ON -DBUILD_TESTING=ON ../sources |  | ||||||
| make |  | ||||||
|  |  | ||||||
| # tests |  | ||||||
| xvfb-run make test |  | ||||||
| @ -1,16 +0,0 @@ | |||||||
| #!/bin/bash |  | ||||||
|  |  | ||||||
| set -e |  | ||||||
|  |  | ||||||
| rm -rf build-ubuntu |  | ||||||
| mkdir build-ubuntu |  | ||||||
|  |  | ||||||
| # patches |  | ||||||
| git apply patches/qt5.6-qversionnumber.patch |  | ||||||
| git apply patches/qt5.5-qstringlist-and-qinfo.patch |  | ||||||
|  |  | ||||||
| # build |  | ||||||
| cd build-ubuntu |  | ||||||
| cmake -DKDE_INSTALL_USE_QT_SYS_PATHS=ON -DCMAKE_BUILD_TYPE=Optimization -DCMAKE_INSTALL_PREFIX=/usr -DBUILD_FUTURE=ON -DBUILD_DEB_PACKAGE=ON ../sources |  | ||||||
| make package |  | ||||||
|  |  | ||||||
| @ -1,18 +0,0 @@ | |||||||
| #!/bin/bash |  | ||||||
|  |  | ||||||
| set -e |  | ||||||
|  |  | ||||||
| rm -rf build-ubuntu |  | ||||||
| mkdir build-ubuntu |  | ||||||
|  |  | ||||||
| # patches |  | ||||||
| git apply patches/qt5.6-qversionnumber.patch |  | ||||||
| git apply patches/qt5.5-qstringlist-and-qinfo.patch |  | ||||||
|  |  | ||||||
| # build |  | ||||||
| cd build-ubuntu |  | ||||||
| cmake -DKDE_INSTALL_USE_QT_SYS_PATHS=ON -DCMAKE_BUILD_TYPE=Optimization -DCMAKE_INSTALL_PREFIX=/usr -DBUILD_FUTURE=ON -DBUILD_TESTING=ON ../sources |  | ||||||
| make |  | ||||||
|  |  | ||||||
| # tests |  | ||||||
| xvfb-run make test |  | ||||||
							
								
								
									
										43
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,43 @@ | |||||||
|  | name: build & tests | ||||||
|  |  | ||||||
|  | on: | ||||||
|  |   push: | ||||||
|  |     branches: | ||||||
|  |       - master | ||||||
|  |   pull_request: | ||||||
|  |     branches: | ||||||
|  |       - master | ||||||
|  |  | ||||||
|  | env: | ||||||
|  |   BUILD_TYPE: Release | ||||||
|  |  | ||||||
|  | jobs: | ||||||
|  |   run-tests: | ||||||
|  |      | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |      | ||||||
|  |     container: | ||||||
|  |       image: archlinux:latest | ||||||
|  |       volumes: | ||||||
|  |         - ${{ github.workspace }}:/repo | ||||||
|  |       options: -w /repo | ||||||
|  |  | ||||||
|  |     steps: | ||||||
|  |     - uses: actions/checkout@v3 | ||||||
|  |  | ||||||
|  |     - name: create build environment | ||||||
|  |       run: pacman -Syu --noconfirm base-devel cmake extra-cmake-modules python util-linux-libs xorg-server-xvfb | ||||||
|  |      | ||||||
|  |     - name: install dependencies | ||||||
|  |       run: pacman -S --noconfirm plasma-workspace | ||||||
|  |      | ||||||
|  |     - name: configure cmake | ||||||
|  |       run: cmake -B build -S sources -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DBUILD_FUTURE=ON -DBUILD_TESTING=ON | ||||||
|  |      | ||||||
|  |     - name: build | ||||||
|  |       working-directory: /repo/build | ||||||
|  |       run: make | ||||||
|  |      | ||||||
|  |     - name: test | ||||||
|  |       working-directory: /repo/build | ||||||
|  |       run: xvfb-run -a make test | ||||||
							
								
								
									
										51
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,51 @@ | |||||||
|  | name: release | ||||||
|  |  | ||||||
|  | on: | ||||||
|  |   push: | ||||||
|  |     tags: | ||||||
|  |       - '*' | ||||||
|  |  | ||||||
|  | jobs: | ||||||
|  |   make-release: | ||||||
|  |  | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |  | ||||||
|  |     steps: | ||||||
|  |       - uses: actions/checkout@v3 | ||||||
|  |  | ||||||
|  |       - name: create changelog | ||||||
|  |         id: changelog | ||||||
|  |         uses: jaywcjlove/changelog-generator@main | ||||||
|  |         with: | ||||||
|  |           token: ${{ secrets.GITHUB_TOKEN }} | ||||||
|  |           filter: 'Release \d+\.\d+\.\d+' | ||||||
|  |  | ||||||
|  |       - name: create archive | ||||||
|  |         run: bash create_archive.sh | ||||||
|  |         env: | ||||||
|  |           VERSION: ${{ steps.version.outputs.VERSION }} | ||||||
|  |  | ||||||
|  | #      - name: build debian package | ||||||
|  | #        run: | | ||||||
|  | #          sudo apt update && \ | ||||||
|  | #          sudo apt install -yq cmake extra-cmake-modules g++ git gettext make && \ | ||||||
|  | #          sudo apt install -yq libkf5i18n-dev libkf5notifications-dev libkf5service-dev \ | ||||||
|  | #            libkf5windowsystem-dev libkf5plasma-dev qtbase5-dev qtdeclarative5-dev \ | ||||||
|  | #            plasma-workspace-dev && \ | ||||||
|  | #          cmake -B build-deb -DKDE_INSTALL_USE_QT_SYS_PATHS=ON -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Optimization -DBUILD_FUTURE=ON -DBUILD_DEB_PACKAGE=ON sources && \ | ||||||
|  | #          cd build-deb && \ | ||||||
|  | #          make package && \ | ||||||
|  | #          cd .. | ||||||
|  |  | ||||||
|  |       - name: release | ||||||
|  |         uses: softprops/action-gh-release@v1 | ||||||
|  |         with: | ||||||
|  |           body: | | ||||||
|  |             ${{ steps.changelog.outputs.compareurl }} | ||||||
|  |             ${{ steps.changelog.outputs.changelog }} | ||||||
|  |           files: | | ||||||
|  |             awesome-widgets-*-src.tar.xz | ||||||
|  | #            build-deb/plasma-widget-awesome-widgets-*.deb | ||||||
|  |           fail_on_unmatched_files: true | ||||||
|  |         env: | ||||||
|  |           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||||||
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -47,3 +47,4 @@ pkg | |||||||
|  |  | ||||||
| # clion settings | # clion settings | ||||||
| .idea | .idea | ||||||
|  | cmake-build* | ||||||
|  | |||||||
							
								
								
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							| @ -1,3 +0,0 @@ | |||||||
| [submodule "sources/3rdparty/fontdialog"] |  | ||||||
| 	path = sources/3rdparty/fontdialog |  | ||||||
| 	url = https://github.com/arcan1s/qtadds-fontdialog.git |  | ||||||
							
								
								
									
										28
									
								
								.travis.yml
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								.travis.yml
									
									
									
									
									
								
							| @ -1,28 +0,0 @@ | |||||||
| sudo: required |  | ||||||
|  |  | ||||||
| arch: |  | ||||||
|     packages: |  | ||||||
|         - plasma-framework |  | ||||||
|         # build deps |  | ||||||
|         - cmake |  | ||||||
|         - extra-cmake-modules |  | ||||||
|         - python |  | ||||||
|         # test |  | ||||||
|         - xorg-server-xvfb |  | ||||||
|         # additional targets |  | ||||||
|         - clang |  | ||||||
|         - cppcheck |  | ||||||
|     script: |  | ||||||
|         - export DISPLAY=:99.0 |  | ||||||
|         - git clone https://github.com/arcan1s/awesome-widgets/ |  | ||||||
|         - cd awesome-widgets; git submodule update --init --recursive |  | ||||||
|         - mkdir awesome-widgets/build |  | ||||||
|         - cd awesome-widgets/build; cmake -DKDE_INSTALL_USE_QT_SYS_PATHS=ON -DCMAKE_BUILD_TYPE=Optimization -DCMAKE_INSTALL_PREFIX=/usr -DBUILD_FUTURE=ON -DBUILD_TESTING=ON ../sources |  | ||||||
|         - cd awesome-widgets/build; make |  | ||||||
|         - cd awesome-widgets/build; make cppcheck |  | ||||||
|         - cd awesome-widgets/build; make clangformat && ( [ `git status -s | wc -l` -eq 0 ] || exit 1 ) |  | ||||||
|         - cd awesome-widgets/build; xvfb-run make test |  | ||||||
|         - sleep 3 |  | ||||||
|  |  | ||||||
| script: |  | ||||||
|     - "curl -s https://raw.githubusercontent.com/mikkeloscar/arch-travis/master/arch-travis.sh | bash" |  | ||||||
| @ -1,13 +0,0 @@ | |||||||
| sudo: required |  | ||||||
|  |  | ||||||
| env: |  | ||||||
|   - DOCKER_TAG="arcan1s/awesome-widgets" |  | ||||||
|  |  | ||||||
| services: |  | ||||||
|   - docker |  | ||||||
|  |  | ||||||
| before_install: |  | ||||||
|   - docker build --tag="${DOCKER_TAG}" .docker |  | ||||||
|  |  | ||||||
| scirpt: |  | ||||||
|   - docker run "${DOCKER_TAG}" .docker/build.sh |  | ||||||
							
								
								
									
										2
									
								
								AUTHORS
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								AUTHORS
									
									
									
									
									
								
							| @ -11,3 +11,5 @@ Ernesto Avilés Vzqz (Spanish) | |||||||
| Виктор Слободян (Ukrainian) | Виктор Слободян (Ukrainian) | ||||||
| Steve Lemuel (Chinese) | Steve Lemuel (Chinese) | ||||||
| Mariusz Kocoń (Polish) | Mariusz Kocoń (Polish) | ||||||
|  | Ibnu Daru Aji (Indonesian) | ||||||
|  | Antonio Vivace (Italian) | ||||||
|  | |||||||
							
								
								
									
										17
									
								
								CHANGELOG
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								CHANGELOG
									
									
									
									
									
								
							| @ -1,3 +1,20 @@ | |||||||
|  | Ver.4.0.0: | ||||||
|  | * migration to plasma 6 | ||||||
|  |  | ||||||
|  | Ver.3.5.0: | ||||||
|  | + wayland support | ||||||
|  | * update code to latest standards | ||||||
|  | - drop support of windows preview | ||||||
|  |  | ||||||
|  | Ver.3.4.2: | ||||||
|  | + Italian translation (#136, thanks to @avivace) | ||||||
|  | + stooq quotes support (default) (#131) | ||||||
|  | + Indonesian translation (#132, thanks to @ibnuda) | ||||||
|  | + new keys - $batleftN, $batnowN, $batrateN, $battotalN, $brightness, $volume | ||||||
|  | * fix compiler warnings | ||||||
|  | * update to new qt api | ||||||
|  | - fix non printable spaces (#142, #143) | ||||||
|  |  | ||||||
| Ver.3.3.3: | Ver.3.3.3: | ||||||
| + add custom keys support (#101) | + add custom keys support (#101) | ||||||
| * DBus interface improvements | * DBus interface improvements | ||||||
|  | |||||||
							
								
								
									
										115
									
								
								CONTRIBUTING.md
									
									
									
									
									
								
							
							
						
						
									
										115
									
								
								CONTRIBUTING.md
									
									
									
									
									
								
							| @ -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++11**. |  | ||||||
| * 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`. |  | ||||||
|  | |||||||
							
								
								
									
										29
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								README.md
									
									
									
									
									
								
							| @ -1,7 +1,7 @@ | |||||||
| awesome-widgets (ex-pytextmonitor) | awesome-widgets (ex-pytextmonitor) | ||||||
| ================================== | ================================== | ||||||
|  |  | ||||||
| [](https://travis-ci.org/arcan1s/awesome-widgets) | [](https://github.com/arcan1s/awesome-widgets/actions/workflows/build.yml) | ||||||
| [](https://scan.coverity.com/projects/awesome-widgets) | [](https://scan.coverity.com/projects/awesome-widgets) | ||||||
|  |  | ||||||
| Information | Information | ||||||
| @ -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,13 @@ Instruction | |||||||
| Dependencies | Dependencies | ||||||
| ------------ | ------------ | ||||||
|  |  | ||||||
| * plasma-framework | * plasma-workspace | ||||||
|  |  | ||||||
| Optional dependencies | Optional dependencies | ||||||
| --------------------- | --------------------- | ||||||
|  |  | ||||||
| * proprietary video driver |  | ||||||
| * hddtemp |  | ||||||
| * smartmontools |  | ||||||
| * music player (mpd or MPRIS supported) | * music player (mpd or MPRIS supported) | ||||||
|  | * wireless_tools | ||||||
|  |  | ||||||
| Make dependencies | Make dependencies | ||||||
| ----------------- | ----------------- | ||||||
| @ -46,17 +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). | ||||||
|  |  | ||||||
| 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 ../ |       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 | ||||||
| ====================== | ====================== | ||||||
|  | |||||||
| @ -1,32 +1,20 @@ | |||||||
| #!/bin/bash | #!/bin/bash | ||||||
|  |  | ||||||
| SRCDIR="sources" | SRCDIR="sources" | ||||||
| MAJOR=$(grep -m1 PROJECT_VERSION_MAJOR sources/CMakeLists.txt | awk '{print $2}' | sed 's/^.\(.*\)..$/\1/') | VERSION="$(git describe --tags --abbrev=0)" | ||||||
| MINOR=$(grep -m1 PROJECT_VERSION_MINOR sources/CMakeLists.txt | awk '{print $2}' | sed 's/^.\(.*\)..$/\1/') |  | ||||||
| PATCH=$(grep -m1 PROJECT_VERSION_PATCH sources/CMakeLists.txt | awk '{print $2}' | sed 's/^.\(.*\)..$/\1/') |  | ||||||
| VERSION="${MAJOR}.${MINOR}.${PATCH}" |  | ||||||
|  |  | ||||||
| # update submodules |  | ||||||
| git submodule update --init --recursive |  | ||||||
|  |  | ||||||
| # build widget | # build widget | ||||||
| ARCHIVE="awesome-widgets" | ARCHIVE="awesome-widgets" | ||||||
| FILES="AUTHORS CHANGELOG COPYING packages patches" | FILES="AUTHORS CHANGELOG COPYING packages patches sources" | ||||||
| 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" | ||||||
| [[ -d ${ARCHIVE} ]] && rm -rf "${ARCHIVE}" | [[ -d ${ARCHIVE} ]] && rm -rf "${ARCHIVE}" | ||||||
|  |  | ||||||
| cp -r "${SRCDIR}" "${ARCHIVE}" | cp -r "${SRCDIR}" "${ARCHIVE}" | ||||||
| for FILE in ${FILES[*]}; do cp -r "$FILE" "${ARCHIVE}"; done | for FILE in ${FILES[*]}; do cp -r "$FILE" "${ARCHIVE}"; done | ||||||
| for FILE in ${IGNORELIST[*]}; do rm -rf "${ARCHIVE}/${FILE}"; done | for FILE in ${IGNORELIST[*]}; do rm -rf "${ARCHIVE}/${FILE}"; done | ||||||
| tar cJf "${ARCHIVE}-${VERSION}-src.tar.xz" "${ARCHIVE}" |  | ||||||
| ln -sf "../${ARCHIVE}-${VERSION}-src.tar.xz" packages |  | ||||||
| rm -rf "${ARCHIVE}" |  | ||||||
|  |  | ||||||
| # update md5sum | tar cJf "${ARCHIVE}-${VERSION}-src.tar.xz" "${ARCHIVE}" | ||||||
| MD5SUMS=$(md5sum ${ARCHIVE}-${VERSION}-src.tar.xz | awk '{print $1}') |  | ||||||
| sed -i "/md5sums=('[0-9A-Fa-f]*/s/[^'][^)]*/md5sums=('${MD5SUMS}'/" packages/PKGBUILD | rm -rf "${ARCHIVE}" | ||||||
| sed -i "s/pkgver=[0-9.]*/pkgver=${VERSION}/" packages/PKGBUILD |  | ||||||
| # clear |  | ||||||
| find . -type f -name '*src.tar.xz' -not -name "*${VERSION}-src.tar.xz" -exec rm -rf {} \; |  | ||||||
| find packages -type l -xtype l -exec rm -rf {} \; |  | ||||||
|  | |||||||
| @ -1,41 +1,31 @@ | |||||||
| # Maintainer: Evgeniy Alekseev <arcanis at archlinux dot org> | # Maintainer: Evgeniy Alekseev <arcanis at archlinux dot org> | ||||||
|  |  | ||||||
| pkgname=plasma5-applet-awesome-widgets | pkgname=plasma6-applet-awesome-widgets | ||||||
| _pkgname=awesome-widgets | _pkgname=awesome-widgets | ||||||
| pkgver=3.3.3 | pkgver=4.0.0alpha2 | ||||||
| pkgrel=1 | pkgrel=1 | ||||||
| pkgdesc="Collection of minimalistic Plasmoids which look like Awesome WM widgets (ex-PyTextMonitor)" | pkgdesc="Collection of minimalistic Plasmoids which look like Awesome WM widgets (ex-PyTextMonitor)" | ||||||
| arch=('i686' 'x86_64') | arch=('x86_64') | ||||||
| url="https://arcanis.me/projects/awesome-widgets" | url="https://arcanis.me/projects/awesome-widgets" | ||||||
| license=('GPL3') | license=('GPL3') | ||||||
| depends=('plasma-framework') | depends=('plasma-workspace') | ||||||
| optdepends=("catalyst: for GPU monitor" | optdepends=("mpd: for music player monitor" | ||||||
|             "hddtemp: for HDD temperature monitor" |             "wireless_tools: wifi information") | ||||||
|             "smartmontools: for HDD temperature monitor" |  | ||||||
|             "mpd: for music player monitor" |  | ||||||
|             "nvidia-utils: for GPU monitor") |  | ||||||
| makedepends=('cmake' 'extra-cmake-modules' 'python') | makedepends=('cmake' 'extra-cmake-modules' 'python') | ||||||
| source=(https://github.com/arcan1s/awesome-widgets/releases/download/V.${pkgver}/${_pkgname}-${pkgver}-src.tar.xz) | source=(https://github.com/arcan1s/awesome-widgets/releases/download/${pkgver}/${_pkgname}-${pkgver}-src.tar.xz) | ||||||
| install=${pkgname}.install | install="$pkgname.install" | ||||||
| md5sums=('ce2413868cbb230e358e75a15975a1e5') |  | ||||||
| backup=('etc/xdg/plasma-dataengine-extsysmon.conf') | backup=('etc/xdg/plasma-dataengine-extsysmon.conf') | ||||||
|  |  | ||||||
| prepare() { |  | ||||||
|   rm -rf "${srcdir}/build" |  | ||||||
|   mkdir "${srcdir}/build" |  | ||||||
| } |  | ||||||
|  |  | ||||||
| build () { | build () { | ||||||
|   cd "${srcdir}/build" |     cmake -B build -S "${_pkgname}" \ | ||||||
|   cmake -DKDE_INSTALL_USE_QT_SYS_PATHS=ON \ |  | ||||||
|           -DCMAKE_BUILD_TYPE=Optimization \ |           -DCMAKE_BUILD_TYPE=Optimization \ | ||||||
|         -DCMAKE_INSTALL_PREFIX=/usr \ |  | ||||||
|           -DBUILD_FUTURE=ON \ |           -DBUILD_FUTURE=ON \ | ||||||
|         "../${_pkgname}" |           -DBUILD_TESTING=OFF | ||||||
|   make |     cmake --build build | ||||||
| } | } | ||||||
|  |  | ||||||
| package() { | package() { | ||||||
|   cd "${srcdir}/build" |       DESTDIR="$pkgdir" cmake --install build | ||||||
|   make DESTDIR="${pkgdir}" install |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | sha256sums=('b2a7b07a1df6f710f4e0d6e5898933f4ddb131818b922dc4b8e48afe3e98a664') | ||||||
|  | |||||||
| @ -1,11 +0,0 @@ | |||||||
| cmake |  | ||||||
| extra-cmake-modules |  | ||||||
| g++ |  | ||||||
| git |  | ||||||
| libkf5i18n-dev |  | ||||||
| libkf5notifications-dev |  | ||||||
| libkf5service-dev |  | ||||||
| libkf5windowsystem-dev |  | ||||||
| plasma-framework-dev |  | ||||||
| qtbase5-dev |  | ||||||
| qtdeclarative5-dev |  | ||||||
| @ -1,33 +0,0 @@ | |||||||
| diff --git a/sources/awdebug.h b/sources/awdebug.h |  | ||||||
| index 8447c65..4eef49a 100644 |  | ||||||
| --- a/sources/awdebug.h |  | ||||||
| +++ b/sources/awdebug.h |  | ||||||
| @@ -23,10 +23,15 @@ |  | ||||||
|   |  | ||||||
|  #include "version.h" |  | ||||||
|   |  | ||||||
| +#ifndef qCInfo |  | ||||||
| +#define qCInfo qCDebug |  | ||||||
| +#endif |  | ||||||
| + |  | ||||||
| + |  | ||||||
|  namespace AWDebug |  | ||||||
|  { |  | ||||||
|  const char LOG_FORMAT[] = "[%{time " |  | ||||||
| -                          "process}][%{if-debug}DD%{endif}%{if-info}II%{endif}%" |  | ||||||
| +                          "process}][%{if-debug}DD%{endif}%" |  | ||||||
|                            "{if-warning}WW%{endif}%{if-critical}CC%{endif}%{if-" |  | ||||||
|                            "fatal}FF%{endif}][%{category}][%{function}] " |  | ||||||
|                            "%{message}"; |  | ||||||
| diff --git a/sources/awesome-widget/plugin/awkeysaggregator.h b/sources/awesome-widget/plugin/awkeysaggregator.h |  | ||||||
| index d6d5d1a..ee301df 100644 |  | ||||||
| --- a/sources/awesome-widget/plugin/awkeysaggregator.h |  | ||||||
| +++ b/sources/awesome-widget/plugin/awkeysaggregator.h |  | ||||||
| @@ -21,6 +21,7 @@ |  | ||||||
|   |  | ||||||
|  #include <QHash> |  | ||||||
|  #include <QObject> |  | ||||||
| +#include <QStringList> |  | ||||||
|   |  | ||||||
|   |  | ||||||
|  class AWFormatterHelper; |  | ||||||
| @ -1,139 +0,0 @@ | |||||||
| diff --git a/sources/awesome-widget/plugin/awupdatehelper.cpp b/sources/awesome-widget/plugin/awupdatehelper.cpp |  | ||||||
| index f6b5338..b5a3163 100644 |  | ||||||
| --- a/sources/awesome-widget/plugin/awupdatehelper.cpp |  | ||||||
| +++ b/sources/awesome-widget/plugin/awupdatehelper.cpp |  | ||||||
| @@ -35,7 +35,7 @@ AWUpdateHelper::AWUpdateHelper(QObject *_parent) |  | ||||||
|  { |  | ||||||
|      qCDebug(LOG_AW) << __PRETTY_FUNCTION__; |  | ||||||
|   |  | ||||||
| -    m_foundVersion = QVersionNumber::fromString(VERSION); |  | ||||||
| +    m_foundVersion = VERSION; |  | ||||||
|      m_genericConfig = QString("%1/awesomewidgets/general.ini") |  | ||||||
|                            .arg(QStandardPaths::writableLocation( |  | ||||||
|                                QStandardPaths::GenericDataLocation)); |  | ||||||
| @@ -67,8 +67,7 @@ void AWUpdateHelper::checkUpdates(const bool _showAnyway) |  | ||||||
|  bool AWUpdateHelper::checkVersion() |  | ||||||
|  { |  | ||||||
|      QSettings settings(m_genericConfig, QSettings::IniFormat); |  | ||||||
| -    QVersionNumber version = QVersionNumber::fromString( |  | ||||||
| -        settings.value("Version", QString(VERSION)).toString()); |  | ||||||
| +    QString version = settings.value("Version", VERSION).toString(); |  | ||||||
|      // update version |  | ||||||
|      settings.setValue("Version", QString(VERSION)); |  | ||||||
|      settings.sync(); |  | ||||||
| @@ -91,12 +90,11 @@ bool AWUpdateHelper::checkVersion() |  | ||||||
|  } |  | ||||||
|   |  | ||||||
|   |  | ||||||
| -void AWUpdateHelper::showInfo(const QVersionNumber &_version) |  | ||||||
| +void AWUpdateHelper::showInfo(const QString &_version) |  | ||||||
|  { |  | ||||||
|      qCDebug(LOG_AW) << "Version" << _version; |  | ||||||
|   |  | ||||||
| -    QString text |  | ||||||
| -        = i18n("You are using the actual version %1", _version.toString()); |  | ||||||
| +    QString text = i18n("You are using the actual version %1", _version); |  | ||||||
|      if (!QString(COMMIT_SHA).isEmpty()) |  | ||||||
|          text += QString(" (%1)").arg(QString(COMMIT_SHA)); |  | ||||||
|      return genMessageBox(i18n("No new version found"), text, QMessageBox::Ok) |  | ||||||
| @@ -104,7 +102,7 @@ void AWUpdateHelper::showInfo(const QVersionNumber &_version) |  | ||||||
|  } |  | ||||||
|   |  | ||||||
|   |  | ||||||
| -void AWUpdateHelper::showUpdates(const QVersionNumber &_version) |  | ||||||
| +void AWUpdateHelper::showUpdates(const QString &_version) |  | ||||||
|  { |  | ||||||
|      qCDebug(LOG_AW) << "Version" << _version; |  | ||||||
|   |  | ||||||
| @@ -113,7 +111,7 @@ void AWUpdateHelper::showUpdates(const QVersionNumber &_version) |  | ||||||
|      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) + "\n\n"; |  | ||||||
|      text += i18n("Click \"Ok\" to download"); |  | ||||||
|   |  | ||||||
|      genMessageBox(i18n("There are updates"), text, |  | ||||||
| @@ -130,8 +128,7 @@ void AWUpdateHelper::userReplyOnUpdates(QAbstractButton *_button) |  | ||||||
|   |  | ||||||
|      switch (ret) { |  | ||||||
|      case QMessageBox::AcceptRole: |  | ||||||
| -        QDesktopServices::openUrl(QString(RELEASES) |  | ||||||
| -                                  + m_foundVersion.toString()); |  | ||||||
| +        QDesktopServices::openUrl(QString(RELEASES) + m_foundVersion); |  | ||||||
|          break; |  | ||||||
|      case QMessageBox::RejectRole: |  | ||||||
|      default: |  | ||||||
| @@ -162,14 +159,23 @@ void AWUpdateHelper::versionReplyRecieved(QNetworkReply *_reply, |  | ||||||
|      QVariantMap firstRelease = jsonDoc.toVariant().toList().first().toMap(); |  | ||||||
|      QString version = firstRelease["tag_name"].toString(); |  | ||||||
|      version.remove("V."); |  | ||||||
| -    m_foundVersion = QVersionNumber::fromString(version); |  | ||||||
| +    m_foundVersion = version; |  | ||||||
|      qCInfo(LOG_AW) << "Update found version to" << m_foundVersion; |  | ||||||
|   |  | ||||||
| -    QVersionNumber oldVersion = QVersionNumber::fromString(VERSION); |  | ||||||
| -    if (oldVersion < m_foundVersion) |  | ||||||
| -        return showUpdates(m_foundVersion); |  | ||||||
| +    // FIXME: possible there is a better way to check versions |  | ||||||
| +    int old_major = QString(VERSION).split(QChar('.')).at(0).toInt(); |  | ||||||
| +    int old_minor = QString(VERSION).split(QChar('.')).at(1).toInt(); |  | ||||||
| +    int old_patch = QString(VERSION).split(QChar('.')).at(2).toInt(); |  | ||||||
| +    int new_major = version.split(QChar('.')).at(0).toInt(); |  | ||||||
| +    int new_minor = version.split(QChar('.')).at(1).toInt(); |  | ||||||
| +    int new_patch = version.split(QChar('.')).at(2).toInt(); |  | ||||||
| +    if ((old_major < new_major) |  | ||||||
| +        || ((old_major == new_major) && (old_minor < new_minor)) |  | ||||||
| +        || ((old_major == new_major) && (old_minor == new_minor) |  | ||||||
| +            && (old_patch < new_patch))) |  | ||||||
| +        return showUpdates(version); |  | ||||||
|      else if (_showAnyway) |  | ||||||
| -        return showInfo(m_foundVersion); |  | ||||||
| +        return showInfo(version); |  | ||||||
|  } |  | ||||||
|   |  | ||||||
|   |  | ||||||
| diff --git a/sources/awesome-widget/plugin/awupdatehelper.h b/sources/awesome-widget/plugin/awupdatehelper.h |  | ||||||
| index cfd26e7..b311be2 100644 |  | ||||||
| --- a/sources/awesome-widget/plugin/awupdatehelper.h |  | ||||||
| +++ b/sources/awesome-widget/plugin/awupdatehelper.h |  | ||||||
| @@ -21,7 +21,6 @@ |  | ||||||
|   |  | ||||||
|  #include <QMessageBox> |  | ||||||
|  #include <QObject> |  | ||||||
| -#include <QVersionNumber> |  | ||||||
|   |  | ||||||
|   |  | ||||||
|  class QNetworkReply; |  | ||||||
| @@ -37,15 +36,15 @@ public: |  | ||||||
|      bool checkVersion(); |  | ||||||
|   |  | ||||||
|  private slots: |  | ||||||
| -    void showInfo(const QVersionNumber &_version); |  | ||||||
| -    void showUpdates(const QVersionNumber &_version); |  | ||||||
| +    void showInfo(const QString &_version); |  | ||||||
| +    void showUpdates(const QString &_version); |  | ||||||
|      void userReplyOnUpdates(QAbstractButton *_button); |  | ||||||
|      void versionReplyRecieved(QNetworkReply *_reply, const bool _showAnyway); |  | ||||||
|   |  | ||||||
|  private: |  | ||||||
|      QMessageBox *genMessageBox(const QString &_title, const QString &_body, |  | ||||||
|                                 const QMessageBox::StandardButtons _buttons); |  | ||||||
| -    QVersionNumber m_foundVersion; |  | ||||||
| +    QString m_foundVersion; |  | ||||||
|      QString m_genericConfig; |  | ||||||
|  }; |  | ||||||
|   |  | ||||||
| diff --git a/sources/libraries.cmake b/sources/libraries.cmake |  | ||||||
| index 6f171a6..004b39f 100644 |  | ||||||
| --- a/sources/libraries.cmake |  | ||||||
| +++ b/sources/libraries.cmake |  | ||||||
| @@ -2,7 +2,7 @@ |  | ||||||
|  find_package(Gettext REQUIRED) |  | ||||||
|   |  | ||||||
|  # main qt libraries |  | ||||||
| -find_package(Qt5 5.6.0 REQUIRED COMPONENTS Core DBus Network Qml Test Widgets) |  | ||||||
| +find_package(Qt5 5.5.0 REQUIRED COMPONENTS Core DBus Network Qml Test Widgets) |  | ||||||
|  add_definitions( |  | ||||||
|          ${Qt5Core_DEFINITIONS} ${Qt5DBus_DEFINITIONS} ${Qt5Network_DEFINITIONS} |  | ||||||
|          ${Qt5Qml_DEFINITIONS} ${Qt5Widgets_DEFINITIONS} |  | ||||||
| @ -1,27 +1,26 @@ | |||||||
| --- | --- | ||||||
| Language:        Cpp | Language:        Cpp | ||||||
| AccessModifierOffset: -4 | AccessModifierOffset: -4 | ||||||
| AlignAfterOpenBracket: true | AlignAfterOpenBracket: Align | ||||||
| AlignConsecutiveAssignments: false | AlignConsecutiveAssignments: None | ||||||
| AlignEscapedNewlinesLeft: false |  | ||||||
| AlignOperands:   true | AlignOperands:   true | ||||||
| AlignTrailingComments: true | AlignTrailingComments: true | ||||||
| AllowAllParametersOfDeclarationOnNextLine: true | AllowAllParametersOfDeclarationOnNextLine: true | ||||||
| AllowShortBlocksOnASingleLine: false | AllowShortBlocksOnASingleLine: Never | ||||||
| AllowShortCaseLabelsOnASingleLine: false | AllowShortCaseLabelsOnASingleLine: false | ||||||
| AllowShortFunctionsOnASingleLine: Inline | AllowShortFunctionsOnASingleLine: Inline | ||||||
| AllowShortIfStatementsOnASingleLine: false | AllowShortIfStatementsOnASingleLine: Never | ||||||
| AllowShortLoopsOnASingleLine: false | AllowShortLoopsOnASingleLine: false | ||||||
| AlwaysBreakAfterDefinitionReturnType: None | AlwaysBreakAfterDefinitionReturnType: None | ||||||
| AlwaysBreakBeforeMultilineStrings: false | AlwaysBreakBeforeMultilineStrings: false | ||||||
| AlwaysBreakTemplateDeclarations: false | AlwaysBreakTemplateDeclarations: No | ||||||
| BinPackArguments: true | BinPackArguments: true | ||||||
| BinPackParameters: true | BinPackParameters: true | ||||||
| BreakBeforeBinaryOperators: All | BreakBeforeBinaryOperators: All | ||||||
| BreakBeforeBraces: Linux | BreakBeforeBraces: Linux | ||||||
| BreakBeforeTernaryOperators: true | BreakBeforeTernaryOperators: true | ||||||
| BreakConstructorInitializersBeforeComma: true | BreakConstructorInitializersBeforeComma: true | ||||||
| ColumnLimit:     80 | ColumnLimit:     120 | ||||||
| CommentPragmas:  '^ IWYU pragma:' | CommentPragmas:  '^ IWYU pragma:' | ||||||
| ConstructorInitializerAllOnOneLineOrOnePerLine: false | ConstructorInitializerAllOnOneLineOrOnePerLine: false | ||||||
| ConstructorInitializerIndentWidth: 4 | ConstructorInitializerIndentWidth: 4 | ||||||
| @ -59,7 +58,7 @@ SpacesInContainerLiterals: true | |||||||
| SpacesInCStyleCastParentheses: false | SpacesInCStyleCastParentheses: false | ||||||
| SpacesInParentheses: false | SpacesInParentheses: false | ||||||
| SpacesInSquareBrackets: false | SpacesInSquareBrackets: false | ||||||
| Standard:        Cpp11 | Standard:        Latest | ||||||
| TabWidth:        8 | TabWidth:        8 | ||||||
| UseTab:          Never | UseTab:          Never | ||||||
| ... | ... | ||||||
|  | |||||||
| @ -1,26 +0,0 @@ | |||||||
| [Buildset] |  | ||||||
| BuildItems=@Variant(\x00\x00\x00\t\x00\x00\x00\x00\x01\x00\x00\x00\x0b\x00\x00\x00\x00\x01\x00\x00\x00\x1e\x00a\x00w\x00e\x00s\x00o\x00m\x00e\x00-\x00w\x00i\x00d\x00g\x00e\x00t\x00s) |  | ||||||
|  |  | ||||||
| [CMake] |  | ||||||
| Build Directory Count=1 |  | ||||||
| Current Build Directory Index=0 |  | ||||||
| ProjectRootRelative=./ |  | ||||||
|  |  | ||||||
| [CMake][CMake Build Directory 0] |  | ||||||
| Build Directory Path=file:///home/arcanis/Documents/github/awesome-widgets/build |  | ||||||
| Build Type=Optimization |  | ||||||
| CMake Binary=file:///usr/bin/cmake |  | ||||||
| Environment Profile= |  | ||||||
| Extra Arguments= |  | ||||||
| Install Directory=file:///usr |  | ||||||
|  |  | ||||||
| [Defines And Includes][Compiler] |  | ||||||
| Name=GCC |  | ||||||
| Path=gcc |  | ||||||
| Type=GCC |  | ||||||
|  |  | ||||||
| [Launch] |  | ||||||
| Launch Configurations= |  | ||||||
|  |  | ||||||
| [Project] |  | ||||||
| VersionControlSupport=kdevgit |  | ||||||
| @ -1,23 +0,0 @@ | |||||||
| [Buildset] |  | ||||||
| BuildItems=@Variant(\x00\x00\x00\t\x00\x00\x00\x00\x01\x00\x00\x00\x0b\x00\x00\x00\x00\x01\x00\x00\x00\x1e\x00a\x00w\x00e\x00s\x00o\x00m\x00e\x00-\x00w\x00i\x00d\x00g\x00e\x00t\x00s) |  | ||||||
|  |  | ||||||
| [CMake] |  | ||||||
| Build Directory Count=1 |  | ||||||
| Current Build Directory Index=0 |  | ||||||
| ProjectRootRelative=./ |  | ||||||
|  |  | ||||||
| [CMake][CMake Build Directory 0] |  | ||||||
| Build Directory Path=file:///home/arcanis/Documents/github/awesome-widgets/build |  | ||||||
| Build Type=Release |  | ||||||
| CMake Binary=file:///usr/bin/cmake |  | ||||||
| Environment Profile= |  | ||||||
| Extra Arguments= |  | ||||||
| Install Directory=file:///usr |  | ||||||
|  |  | ||||||
| [Defines And Includes][Compiler] |  | ||||||
| Name=GCC |  | ||||||
| Path=gcc |  | ||||||
| Type=GCC |  | ||||||
|  |  | ||||||
| [Project] |  | ||||||
| VersionControlSupport=kdevgit |  | ||||||
							
								
								
									
										1
									
								
								sources/3rdparty/fontdialog
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								sources/3rdparty/fontdialog
									
									
									
									
										vendored
									
									
								
							 Submodule sources/3rdparty/fontdialog deleted from e7bcf8ee85
									
								
							
							
								
								
									
										165
									
								
								sources/3rdparty/fontdialog/COPYING
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										165
									
								
								sources/3rdparty/fontdialog/COPYING
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,165 @@ | |||||||
|  | GNU LESSER GENERAL PUBLIC LICENSE | ||||||
|  |                        Version 3, 29 June 2007 | ||||||
|  |  | ||||||
|  |  Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> | ||||||
|  |  Everyone is permitted to copy and distribute verbatim copies | ||||||
|  |  of this license document, but changing it is not allowed. | ||||||
|  |  | ||||||
|  |  | ||||||
|  |   This version of the GNU Lesser General Public License incorporates | ||||||
|  | the terms and conditions of version 3 of the GNU General Public | ||||||
|  | License, supplemented by the additional permissions listed below. | ||||||
|  |  | ||||||
|  |   0. Additional Definitions. | ||||||
|  |  | ||||||
|  |   As used herein, "this License" refers to version 3 of the GNU Lesser | ||||||
|  | General Public License, and the "GNU GPL" refers to version 3 of the GNU | ||||||
|  | General Public License. | ||||||
|  |  | ||||||
|  |   "The Library" refers to a covered work governed by this License, | ||||||
|  | other than an Application or a Combined Work as defined below. | ||||||
|  |  | ||||||
|  |   An "Application" is any work that makes use of an interface provided | ||||||
|  | by the Library, but which is not otherwise based on the Library. | ||||||
|  | Defining a subclass of a class defined by the Library is deemed a mode | ||||||
|  | of using an interface provided by the Library. | ||||||
|  |  | ||||||
|  |   A "Combined Work" is a work produced by combining or linking an | ||||||
|  | Application with the Library.  The particular version of the Library | ||||||
|  | with which the Combined Work was made is also called the "Linked | ||||||
|  | Version". | ||||||
|  |  | ||||||
|  |   The "Minimal Corresponding Source" for a Combined Work means the | ||||||
|  | Corresponding Source for the Combined Work, excluding any source code | ||||||
|  | for portions of the Combined Work that, considered in isolation, are | ||||||
|  | based on the Application, and not on the Linked Version. | ||||||
|  |  | ||||||
|  |   The "Corresponding Application Code" for a Combined Work means the | ||||||
|  | object code and/or source code for the Application, including any data | ||||||
|  | and utility programs needed for reproducing the Combined Work from the | ||||||
|  | Application, but excluding the System Libraries of the Combined Work. | ||||||
|  |  | ||||||
|  |   1. Exception to Section 3 of the GNU GPL. | ||||||
|  |  | ||||||
|  |   You may convey a covered work under sections 3 and 4 of this License | ||||||
|  | without being bound by section 3 of the GNU GPL. | ||||||
|  |  | ||||||
|  |   2. Conveying Modified Versions. | ||||||
|  |  | ||||||
|  |   If you modify a copy of the Library, and, in your modifications, a | ||||||
|  | facility refers to a function or data to be supplied by an Application | ||||||
|  | that uses the facility (other than as an argument passed when the | ||||||
|  | facility is invoked), then you may convey a copy of the modified | ||||||
|  | version: | ||||||
|  |  | ||||||
|  |    a) under this License, provided that you make a good faith effort to | ||||||
|  |    ensure that, in the event an Application does not supply the | ||||||
|  |    function or data, the facility still operates, and performs | ||||||
|  |    whatever part of its purpose remains meaningful, or | ||||||
|  |  | ||||||
|  |    b) under the GNU GPL, with none of the additional permissions of | ||||||
|  |    this License applicable to that copy. | ||||||
|  |  | ||||||
|  |   3. Object Code Incorporating Material from Library Header Files. | ||||||
|  |  | ||||||
|  |   The object code form of an Application may incorporate material from | ||||||
|  | a header file that is part of the Library.  You may convey such object | ||||||
|  | code under terms of your choice, provided that, if the incorporated | ||||||
|  | material is not limited to numerical parameters, data structure | ||||||
|  | layouts and accessors, or small macros, inline functions and templates | ||||||
|  | (ten or fewer lines in length), you do both of the following: | ||||||
|  |  | ||||||
|  |    a) Give prominent notice with each copy of the object code that the | ||||||
|  |    Library is used in it and that the Library and its use are | ||||||
|  |    covered by this License. | ||||||
|  |  | ||||||
|  |    b) Accompany the object code with a copy of the GNU GPL and this license | ||||||
|  |    document. | ||||||
|  |  | ||||||
|  |   4. Combined Works. | ||||||
|  |  | ||||||
|  |   You may convey a Combined Work under terms of your choice that, | ||||||
|  | taken together, effectively do not restrict modification of the | ||||||
|  | portions of the Library contained in the Combined Work and reverse | ||||||
|  | engineering for debugging such modifications, if you also do each of | ||||||
|  | the following: | ||||||
|  |  | ||||||
|  |    a) Give prominent notice with each copy of the Combined Work that | ||||||
|  |    the Library is used in it and that the Library and its use are | ||||||
|  |    covered by this License. | ||||||
|  |  | ||||||
|  |    b) Accompany the Combined Work with a copy of the GNU GPL and this license | ||||||
|  |    document. | ||||||
|  |  | ||||||
|  |    c) For a Combined Work that displays copyright notices during | ||||||
|  |    execution, include the copyright notice for the Library among | ||||||
|  |    these notices, as well as a reference directing the user to the | ||||||
|  |    copies of the GNU GPL and this license document. | ||||||
|  |  | ||||||
|  |    d) Do one of the following: | ||||||
|  |  | ||||||
|  |        0) Convey the Minimal Corresponding Source under the terms of this | ||||||
|  |        License, and the Corresponding Application Code in a form | ||||||
|  |        suitable for, and under terms that permit, the user to | ||||||
|  |        recombine or relink the Application with a modified version of | ||||||
|  |        the Linked Version to produce a modified Combined Work, in the | ||||||
|  |        manner specified by section 6 of the GNU GPL for conveying | ||||||
|  |        Corresponding Source. | ||||||
|  |  | ||||||
|  |        1) Use a suitable shared library mechanism for linking with the | ||||||
|  |        Library.  A suitable mechanism is one that (a) uses at run time | ||||||
|  |        a copy of the Library already present on the user's computer | ||||||
|  |        system, and (b) will operate properly with a modified version | ||||||
|  |        of the Library that is interface-compatible with the Linked | ||||||
|  |        Version. | ||||||
|  |  | ||||||
|  |    e) Provide Installation Information, but only if you would otherwise | ||||||
|  |    be required to provide such information under section 6 of the | ||||||
|  |    GNU GPL, and only to the extent that such information is | ||||||
|  |    necessary to install and execute a modified version of the | ||||||
|  |    Combined Work produced by recombining or relinking the | ||||||
|  |    Application with a modified version of the Linked Version. (If | ||||||
|  |    you use option 4d0, the Installation Information must accompany | ||||||
|  |    the Minimal Corresponding Source and Corresponding Application | ||||||
|  |    Code. If you use option 4d1, you must provide the Installation | ||||||
|  |    Information in the manner specified by section 6 of the GNU GPL | ||||||
|  |    for conveying Corresponding Source.) | ||||||
|  |  | ||||||
|  |   5. Combined Libraries. | ||||||
|  |  | ||||||
|  |   You may place library facilities that are a work based on the | ||||||
|  | Library side by side in a single library together with other library | ||||||
|  | facilities that are not Applications and are not covered by this | ||||||
|  | License, and convey such a combined library under terms of your | ||||||
|  | choice, if you do both of the following: | ||||||
|  |  | ||||||
|  |    a) Accompany the combined library with a copy of the same work based | ||||||
|  |    on the Library, uncombined with any other library facilities, | ||||||
|  |    conveyed under the terms of this License. | ||||||
|  |  | ||||||
|  |    b) Give prominent notice with the combined library that part of it | ||||||
|  |    is a work based on the Library, and explaining where to find the | ||||||
|  |    accompanying uncombined form of the same work. | ||||||
|  |  | ||||||
|  |   6. Revised Versions of the GNU Lesser General Public License. | ||||||
|  |  | ||||||
|  |   The Free Software Foundation may publish revised and/or new versions | ||||||
|  | of the GNU Lesser General Public License from time to time. Such new | ||||||
|  | versions will be similar in spirit to the present version, but may | ||||||
|  | differ in detail to address new problems or concerns. | ||||||
|  |  | ||||||
|  |   Each version is given a distinguishing version number. If the | ||||||
|  | Library as you received it specifies that a certain numbered version | ||||||
|  | of the GNU Lesser General Public License "or any later version" | ||||||
|  | applies to it, you have the option of following the terms and | ||||||
|  | conditions either of that published version or of any later version | ||||||
|  | published by the Free Software Foundation. If the Library as you | ||||||
|  | received it does not specify a version number of the GNU Lesser | ||||||
|  | General Public License, you may choose any version of the GNU Lesser | ||||||
|  | General Public License ever published by the Free Software Foundation. | ||||||
|  |  | ||||||
|  |   If the Library as you received it specifies that a proxy can decide | ||||||
|  | whether future versions of the GNU Lesser General Public License shall | ||||||
|  | apply, that proxy's public statement of acceptance of any version is | ||||||
|  | permanent authorization for you to choose that version for the | ||||||
|  | Library. | ||||||
							
								
								
									
										4
									
								
								sources/3rdparty/fontdialog/README.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								sources/3rdparty/fontdialog/README.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | |||||||
|  | qtadds-fontdialog | ||||||
|  | ================= | ||||||
|  |  | ||||||
|  | Font dialog which provides a font color settings | ||||||
							
								
								
									
										140
									
								
								sources/3rdparty/fontdialog/fontdialog.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										140
									
								
								sources/3rdparty/fontdialog/fontdialog.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,140 @@ | |||||||
|  | /*************************************************************************** | ||||||
|  |  *  Copyright (C) 2014  Evgeniy Alekseev                                      * | ||||||
|  |  *                                                                         * | ||||||
|  |  *  This library is free software; you can redistribute it and/or          * | ||||||
|  |  *  modify it under the terms of the GNU Lesser General Public             * | ||||||
|  |  *  License as published by the Free Software Foundation; either           * | ||||||
|  |  *  version 3.0 of the License, or (at your option) any later version.     * | ||||||
|  |  *                                                                         * | ||||||
|  |  *  This library 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       * | ||||||
|  |  *  Lesser General Public License for more details.                        * | ||||||
|  |  *                                                                         * | ||||||
|  |  *  You should have received a copy of the GNU Lesser General Public       * | ||||||
|  |  *  License along with this library.                                       * | ||||||
|  |  ***************************************************************************/ | ||||||
|  |  | ||||||
|  | #include "fontdialog.h" | ||||||
|  |  | ||||||
|  | #include <QGridLayout> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | CFont::CFont(const QString family, int pointSize, int weight, bool italic, QColor color) | ||||||
|  |     : QFont(family, pointSize, weight, italic) | ||||||
|  | { | ||||||
|  |     setCurrentColor(color); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | QColor CFont::color() | ||||||
|  | { | ||||||
|  |     return currentColor; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void CFont::setCurrentColor(const QColor color) | ||||||
|  | { | ||||||
|  |     currentColor = color; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | CFont CFont::fromQFont(const QFont font, const QColor color) | ||||||
|  | { | ||||||
|  |     return CFont(font.family(), font.pointSize(), font.weight(), font.italic(), color); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | QFont CFont::toQFont() | ||||||
|  | { | ||||||
|  |     return QFont(family(), pointSize(), weight(), italic()); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | CFontDialog::CFontDialog(QWidget *parent, bool needWeight, bool needItalic) | ||||||
|  |     : QDialog(parent) | ||||||
|  | { | ||||||
|  |     QGridLayout *mainGrid = new QGridLayout(this); | ||||||
|  |     setLayout(mainGrid); | ||||||
|  |  | ||||||
|  |     colorBox = new QComboBox(this); | ||||||
|  |     connect(colorBox, &QComboBox::currentTextChanged, this, &CFontDialog::updateColor); | ||||||
|  |     QStringList colorNames = QColor::colorNames(); | ||||||
|  |     int index = 0; | ||||||
|  |     for (int i=0; i<colorNames.count(); i++) { | ||||||
|  |         QColor color(colorNames[i]); | ||||||
|  |         colorBox->addItem(colorNames[i], color); | ||||||
|  |         QModelIndex idx = colorBox->model()->index(index++, 0); | ||||||
|  |         colorBox->model()->setData(idx, color, Qt::BackgroundRole); | ||||||
|  |     } | ||||||
|  |     mainGrid->addWidget(colorBox, 0, 0); | ||||||
|  |     fontBox = new QFontComboBox(this); | ||||||
|  |     mainGrid->addWidget(fontBox, 0, 1); | ||||||
|  |     sizeBox = new QSpinBox(this); | ||||||
|  |     mainGrid->addWidget(sizeBox, 0, 2); | ||||||
|  |     weightBox = new QSpinBox(this); | ||||||
|  |     mainGrid->addWidget(weightBox, 0, 3); | ||||||
|  |     italicBox = new QComboBox(this); | ||||||
|  |     italicBox->addItem(tr("normal")); | ||||||
|  |     italicBox->addItem(tr("italic")); | ||||||
|  |     mainGrid->addWidget(italicBox, 0, 4); | ||||||
|  |  | ||||||
|  |     buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, | ||||||
|  |                                    Qt::Horizontal, this); | ||||||
|  |     QObject::connect(buttons, &QDialogButtonBox::accepted, this, &CFontDialog::accept); | ||||||
|  |     QObject::connect(buttons, &QDialogButtonBox::rejected, this, &CFontDialog::reject); | ||||||
|  |     mainGrid->addWidget(buttons, 1, 0, 1, 5); | ||||||
|  |  | ||||||
|  |     italicBox->setHidden(!needItalic); | ||||||
|  |     weightBox->setHidden(!needWeight); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | CFontDialog::~CFontDialog() | ||||||
|  | { | ||||||
|  |     delete colorBox; | ||||||
|  |     delete buttons; | ||||||
|  |     delete fontBox; | ||||||
|  |     delete italicBox; | ||||||
|  |     delete sizeBox; | ||||||
|  |     delete weightBox; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void CFontDialog::updateColor(const QString color) | ||||||
|  | { | ||||||
|  |     colorBox->setStyleSheet(QString("background:%1").arg(QColor(color).name())); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | CFont CFontDialog::getFont(const QString title, CFont defaultFont, bool needWeight, bool needItalic, int *status) | ||||||
|  | { | ||||||
|  |     CFontDialog dlg(0, needWeight, needItalic); | ||||||
|  |  | ||||||
|  |     dlg.setWindowTitle(title); | ||||||
|  |     QStringList colorNames = QColor::colorNames(); | ||||||
|  |     for (int i=0; i<colorNames.count(); i++) | ||||||
|  |         if (QColor(colorNames[i]) == defaultFont.color()) { | ||||||
|  |             dlg.colorBox->setCurrentIndex(i); | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |     dlg.fontBox->setCurrentFont(defaultFont); | ||||||
|  |     dlg.sizeBox->setValue(defaultFont.pointSize()); | ||||||
|  |     dlg.weightBox->setValue(defaultFont.weight()); | ||||||
|  |     if (defaultFont.italic()) | ||||||
|  |         dlg.italicBox->setCurrentIndex(1); | ||||||
|  |     else | ||||||
|  |         dlg.italicBox->setCurrentIndex(0); | ||||||
|  |  | ||||||
|  |     CFont font = CFont(defaultFont); | ||||||
|  |     int ret = dlg.exec(); | ||||||
|  |     if (ret == 1) | ||||||
|  |         font = CFont(dlg.fontBox->currentFont().family(), | ||||||
|  |                      dlg.sizeBox->value(), | ||||||
|  |                      dlg.weightBox->value(), | ||||||
|  |                      dlg.italicBox->currentIndex() == 1, | ||||||
|  |                      QColor(dlg.colorBox->currentText())); | ||||||
|  |     if (status != nullptr) | ||||||
|  |         *status = ret; | ||||||
|  |     return font; | ||||||
|  | } | ||||||
							
								
								
									
										73
									
								
								sources/3rdparty/fontdialog/fontdialog.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								sources/3rdparty/fontdialog/fontdialog.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,73 @@ | |||||||
|  | /*************************************************************************** | ||||||
|  |  *  Copyright (C) 2014  Evgeniy Alekseev                                      * | ||||||
|  |  *                                                                         * | ||||||
|  |  *  This library is free software; you can redistribute it and/or          * | ||||||
|  |  *  modify it under the terms of the GNU Lesser General Public             * | ||||||
|  |  *  License as published by the Free Software Foundation; either           * | ||||||
|  |  *  version 3.0 of the License, or (at your option) any later version.     * | ||||||
|  |  *                                                                         * | ||||||
|  |  *  This library 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       * | ||||||
|  |  *  Lesser General Public License for more details.                        * | ||||||
|  |  *                                                                         * | ||||||
|  |  *  You should have received a copy of the GNU Lesser General Public       * | ||||||
|  |  *  License along with this library.                                       * | ||||||
|  |  ***************************************************************************/ | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include <QComboBox> | ||||||
|  | #include <QDialog> | ||||||
|  | #include <QDialogButtonBox> | ||||||
|  | #include <QFontComboBox> | ||||||
|  | #include <QSpinBox> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class CFont : public QFont | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     explicit CFont(const QString family, int pointSize = -1, | ||||||
|  |                    int weight = -1, bool italic = false, | ||||||
|  |                    QColor color = QColor(QString("#000000"))); | ||||||
|  |     // color properties | ||||||
|  |     QColor color(); | ||||||
|  |     void setCurrentColor(const QColor color); | ||||||
|  |     // conversion to QFont | ||||||
|  |     static CFont fromQFont(const QFont font, | ||||||
|  |                            const QColor color = QColor(QString("#000000"))); | ||||||
|  |     QFont toQFont(); | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |     QColor currentColor; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class CFontDialog : public QDialog | ||||||
|  | { | ||||||
|  |     Q_OBJECT | ||||||
|  |  | ||||||
|  | public: | ||||||
|  |     explicit CFontDialog(QWidget *parent = 0, | ||||||
|  |                          const bool needWeight = true, | ||||||
|  |                          const bool needItalic = true); | ||||||
|  |     ~CFontDialog(); | ||||||
|  |     static CFont getFont(const QString title = tr("Select font"), | ||||||
|  |                          CFont defaultFont = CFont(QString("Arial"), | ||||||
|  |                                                    12, 400, false, | ||||||
|  |                                                    QColor(QString("#000000"))), | ||||||
|  |                          const bool needWeight = true, | ||||||
|  |                          const bool needItalic = true, | ||||||
|  |                          int *status = nullptr); | ||||||
|  |  | ||||||
|  | private slots: | ||||||
|  |     void updateColor(const QString color); | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |     QComboBox *colorBox; | ||||||
|  |     QDialogButtonBox *buttons; | ||||||
|  |     QFontComboBox *fontBox; | ||||||
|  |     QComboBox *italicBox; | ||||||
|  |     QSpinBox *sizeBox; | ||||||
|  |     QSpinBox *weightBox; | ||||||
|  | }; | ||||||
| @ -12,7 +12,7 @@ QReplyTimeout::QReplyTimeout(QNetworkReply *reply, const int timeout) | |||||||
|  |  | ||||||
| void QReplyTimeout::timeout() | void QReplyTimeout::timeout() | ||||||
| { | { | ||||||
|     QNetworkReply *reply = static_cast<QNetworkReply *>(parent()); |     auto reply = dynamic_cast<QNetworkReply *>(parent()); | ||||||
|     if (reply->isRunning()) |     if (reply->isRunning()) | ||||||
|         reply->close(); |         reply->close(); | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,21 +1,25 @@ | |||||||
| cmake_minimum_required(VERSION 2.8.12) | cmake_minimum_required(VERSION 3.16.0) | ||||||
|  |  | ||||||
| # some fucking magic | # some fucking magic | ||||||
| cmake_policy(SET CMP0003 OLD) |  | ||||||
| cmake_policy(SET CMP0002 OLD) |  | ||||||
| cmake_policy(SET CMP0011 NEW) | cmake_policy(SET CMP0011 NEW) | ||||||
| cmake_policy(SET CMP0015 NEW) | cmake_policy(SET CMP0015 NEW) | ||||||
| if (POLICY CMP0063) | if (POLICY CMP0063) | ||||||
|     cmake_policy(SET CMP0063 OLD) |     cmake_policy(SET CMP0063 NEW) | ||||||
|  | endif () | ||||||
|  | if (POLICY CMP0071) | ||||||
|  |     cmake_policy(SET CMP0071 NEW) | ||||||
|  | endif () | ||||||
|  | if (POLICY CMP0160) | ||||||
|  |     cmake_policy(SET CMP0160 OLD) | ||||||
| endif () | endif () | ||||||
|  |  | ||||||
| project(awesomewidgets) | project(awesomewidgets) | ||||||
| set(PROJECT_AUTHOR "Evgeniy Alekseev") | set(PROJECT_AUTHOR "Evgeniy Alekseev") | ||||||
| set(PROJECT_CONTACT "esalexeev@gmail.com") | set(PROJECT_CONTACT "esalexeev@gmail.com") | ||||||
| set(PROJECT_LICENSE "GPL3") | set(PROJECT_LICENSE "GPL3") | ||||||
| set(PROJECT_VERSION_MAJOR "3") | set(PROJECT_VERSION_MAJOR "4") | ||||||
| set(PROJECT_VERSION_MINOR "3") | set(PROJECT_VERSION_MINOR "0") | ||||||
| set(PROJECT_VERSION_PATCH "3") | set(PROJECT_VERSION_PATCH "0") | ||||||
| set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}") | set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}") | ||||||
| # append git version if any | # append git version if any | ||||||
| set(PROJECT_COMMIT_SHA "Commit hash" CACHE INTERNAL "") | set(PROJECT_COMMIT_SHA "Commit hash" CACHE INTERNAL "") | ||||||
| @ -41,40 +45,23 @@ option(BUILD_TESTING "Build with additional test abilities" OFF) | |||||||
| set(PROJECT_CHANGELOG "Changelog" CACHE INTERNAL "") | set(PROJECT_CHANGELOG "Changelog" CACHE INTERNAL "") | ||||||
| include(changelog.cmake) | include(changelog.cmake) | ||||||
|  |  | ||||||
| # flags | # directories | ||||||
| if (CMAKE_COMPILER_IS_GNUCXX) |  | ||||||
|     set(CMAKE_CXX_FLAGS "-Wall -Wno-cpp -std=c++11") |  | ||||||
|     set(CMAKE_CXX_FLAGS_DEBUG "-g -O0") |  | ||||||
|     set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG") |  | ||||||
|     set(CMAKE_CXX_FLAGS_OPTIMIZATION "-Ofast -DNDEBUG") |  | ||||||
|     # avoid newer gcc warnings |  | ||||||
|     add_definitions(-D_DEFAULT_SOURCE) |  | ||||||
| elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang") |  | ||||||
|     set(CMAKE_CXX_FLAGS "-Wall -std=c++11") |  | ||||||
|     set(CMAKE_CXX_FLAGS_DEBUG "-g -O0") |  | ||||||
|     set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG") |  | ||||||
|     set(CMAKE_CXX_FLAGS_OPTIMIZATION "-Ofast -DNDEBUG") |  | ||||||
|     # linker flags |  | ||||||
| else () |  | ||||||
|     message(FATAL_ERROR "Unknown compiler") |  | ||||||
| endif () |  | ||||||
| if (CMAKE_BUILD_TYPE MATCHES Debug) |  | ||||||
|     set(CMAKE_VERBOSE_MAKEFILE ON) |  | ||||||
| endif () |  | ||||||
|  |  | ||||||
| # required by successfully coverity and cppcheck build |  | ||||||
| set(CMAKE_EXPORT_COMPILE_COMMANDS ON) |  | ||||||
|  |  | ||||||
| set(PROJECT_TRDPARTY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty) | set(PROJECT_TRDPARTY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty) | ||||||
| set(PROJECT_LIBRARY awesomewidgets) | set(PROJECT_LIBRARY awesomewidgets) | ||||||
| set(PROJECT_MONITORSOURCES extsysmonsources) | set(PROJECT_MONITORSOURCES extsysmonsources) | ||||||
|  |  | ||||||
|  | # modules | ||||||
|  | include(compiler.cmake) | ||||||
| include(libraries.cmake) | include(libraries.cmake) | ||||||
| include(clang-format.cmake) | include(clang-format.cmake) | ||||||
| include(cppcheck.cmake) | include(cppcheck.cmake) | ||||||
| include(coverity.cmake) | include(coverity.cmake) | ||||||
|  |  | ||||||
|  | # pre-configure | ||||||
| get_directory_property(CMAKE_DEFINITIONS COMPILE_DEFINITIONS) | get_directory_property(CMAKE_DEFINITIONS COMPILE_DEFINITIONS) | ||||||
| configure_file(${CMAKE_SOURCE_DIR}/version.h.in ${CMAKE_CURRENT_BINARY_DIR}/version.h) | configure_file(${CMAKE_SOURCE_DIR}/version.h.in ${CMAKE_CURRENT_BINARY_DIR}/version.h) | ||||||
|  |  | ||||||
|  | # build components | ||||||
| add_subdirectory(awesomewidgets) | add_subdirectory(awesomewidgets) | ||||||
| add_subdirectory(extsysmonsources) | add_subdirectory(extsysmonsources) | ||||||
| add_subdirectory(extsysmon) | add_subdirectory(extsysmon) | ||||||
| @ -90,4 +77,3 @@ if (BUILD_TESTING) | |||||||
| endif () | endif () | ||||||
|  |  | ||||||
| include(packages-recipe.cmake) | include(packages-recipe.cmake) | ||||||
|  |  | ||||||
|  | |||||||
| @ -21,16 +21,12 @@ | |||||||
| #include "awdebug.h" | #include "awdebug.h" | ||||||
|  |  | ||||||
|  |  | ||||||
| Q_LOGGING_CATEGORY(LOG_AW, "org.kde.plasma.awesomewidget", | Q_LOGGING_CATEGORY(LOG_AW, "org.kde.plasma.awesomewidget", QtMsgType::QtWarningMsg) | ||||||
|                    QtMsgType::QtWarningMsg) |  | ||||||
| Q_LOGGING_CATEGORY(LOG_DBUS, "org.kde.plasma.awdbus", QtMsgType::QtWarningMsg) | Q_LOGGING_CATEGORY(LOG_DBUS, "org.kde.plasma.awdbus", QtMsgType::QtWarningMsg) | ||||||
| Q_LOGGING_CATEGORY(LOG_DP, "org.kde.plasma.desktoppanel", | Q_LOGGING_CATEGORY(LOG_DP, "org.kde.plasma.desktoppanel", QtMsgType::QtWarningMsg) | ||||||
|                    QtMsgType::QtWarningMsg) |  | ||||||
| Q_LOGGING_CATEGORY(LOG_ESM, "org.kde.plasma.extsysmon", QtMsgType::QtWarningMsg) | Q_LOGGING_CATEGORY(LOG_ESM, "org.kde.plasma.extsysmon", QtMsgType::QtWarningMsg) | ||||||
| Q_LOGGING_CATEGORY(LOG_ESS, "org.kde.plasma.extsysmonsources", | Q_LOGGING_CATEGORY(LOG_ESS, "org.kde.plasma.extsysmonsources", QtMsgType::QtWarningMsg) | ||||||
|                    QtMsgType::QtWarningMsg) | Q_LOGGING_CATEGORY(LOG_LIB, "org.kde.plasma.awesomewidgets", QtMsgType::QtWarningMsg) | ||||||
| Q_LOGGING_CATEGORY(LOG_LIB, "org.kde.plasma.awesomewidgets", |  | ||||||
|                    QtMsgType::QtWarningMsg) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| QString AWDebug::getAboutText(const QString &_type) | QString AWDebug::getAboutText(const QString &_type) | ||||||
| @ -45,57 +41,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>" |         text = i18n("Links:") + "<ul>" + QString("<li><a href=\"%1\">%2</a></li>").arg(HOMEPAGE, i18n("Homepage")) | ||||||
|                + QString("<li><a href=\"%1\">%2</a></li>") |                + QString("<li><a href=\"%1\">%2</a></li>").arg(REPOSITORY, i18n("Repository")) | ||||||
|                      .arg(HOMEPAGE) |                + QString("<li><a href=\"%1\">%2</a></li>").arg(BUGTRACKER, i18n("Bugtracker")) | ||||||
|                      .arg(i18n("Homepage")) |                + QString("<li><a href=\"%1\">%2</a></li>").arg(TRANSLATION, i18n("Translation issue")) | ||||||
|                + QString("<li><a href=\"%1\">%2</a></li>") |                + QString("<li><a href=\"%1\">%2</a></li>").arg(AUR_PACKAGES, i18n("AUR packages")) | ||||||
|                      .arg(REPOSITORY) |                + QString("<li><a href=\"%1\">%2</a></li>").arg(OPENSUSE_PACKAGES, i18n("openSUSE packages")) + "</ul>"; | ||||||
|                      .arg(i18n("Repository")) |  | ||||||
|                + QString("<li><a href=\"%1\">%2</a></li>") |  | ||||||
|                      .arg(BUGTRACKER) |  | ||||||
|                      .arg(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(AUR_PACKAGES) |  | ||||||
|                      .arg(i18n("AUR packages")) |  | ||||||
|                + QString("<li><a href=\"%1\">%2</a></li>") |  | ||||||
|                      .arg(OPENSUSE_PACKAGES) |  | ||||||
|                      .arg(i18n("openSUSE packages")) |  | ||||||
|                + "</ul>"; |  | ||||||
|     } else if (_type == "copy") { |     } else if (_type == "copy") { | ||||||
|         text = QString("<small>© %1 <a href=\"mailto:%2\">%3</a><br>") |         text = QString("<small>© %1 <a href=\"mailto:%2\">%3</a><br>").arg(DATE, EMAIL, AUTHOR) | ||||||
|                    .arg(DATE) |                + i18n("This software is licensed under %1", LICENSE) + "</small>"; | ||||||
|                    .arg(EMAIL) |  | ||||||
|                    .arg(AUTHOR) |  | ||||||
|                + 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 |         text = i18n("Translators:") + "<ul>" + translatorList.join("") + "</ul>"; | ||||||
|             = i18n("Translators:") + "<ul>" + translatorList.join("") + "</ul>"; |  | ||||||
|     } else if (_type == "3rdparty") { |     } else if (_type == "3rdparty") { | ||||||
|         QStringList trdPartyList |         auto trdPartyList = QString(TRDPARTY_LICENSE).split(';', Qt::SkipEmptyParts); | ||||||
|             = QString(TRDPARTY_LICENSE).split(';', QString::SkipEmptyParts); |         for (auto i = 0; i < trdPartyList.count(); ++i) | ||||||
|         for (int i = 0; i < trdPartyList.count(); i++) |             trdPartyList[i] = QString("<li><a href=\"%3\">%1</a> (%2 license)</li>") | ||||||
|             trdPartyList[i] |                                   .arg(trdPartyList.at(i).split(',')[0], trdPartyList.at(i).split(',')[1], | ||||||
|                 = QString("<li><a href=\"%3\">%1</a> (%2 license)</li>") |                                        trdPartyList.at(i).split(',')[2]); | ||||||
|                       .arg(trdPartyList.at(i).split(',')[0]) |         text = i18n("This software uses:") + "<ul>" + trdPartyList.join("") + "</ul>"; | ||||||
|                       .arg(trdPartyList.at(i).split(',')[1]) |  | ||||||
|                       .arg(trdPartyList.at(i).split(',')[2]); |  | ||||||
|         text = i18n("This software uses:") + "<ul>" + trdPartyList.join("") |  | ||||||
|                + "</ul>"; |  | ||||||
|     } else if (_type == "thanks") { |     } else if (_type == "thanks") { | ||||||
|         QStringList thanks |         auto thanks = QString(SPECIAL_THANKS).split(';', Qt::SkipEmptyParts); | ||||||
|             = QString(SPECIAL_THANKS).split(';', QString::SkipEmptyParts); |         for (auto i = 0; i < thanks.count(); ++i) | ||||||
|         for (int i = 0; i < thanks.count(); i++) |             thanks[i] | ||||||
|             thanks[i] = QString("<li><a href=\"%2\">%1</a></li>") |                 = QString("<li><a href=\"%2\">%1</a></li>").arg(thanks.at(i).split(',')[0], thanks.at(i).split(',')[1]); | ||||||
|                             .arg(thanks.at(i).split(',')[0]) |  | ||||||
|                             .arg(thanks.at(i).split(',')[1]); |  | ||||||
|         text = i18n("Special thanks to:") + "<ul>" + thanks.join("") + "</ul>"; |         text = i18n("Special thanks to:") + "<ul>" + thanks.join("") + "</ul>"; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @ -117,10 +88,8 @@ QStringList AWDebug::getBuildData() | |||||||
|     metadata.append(QString("    AW_GRAPHITEM_API: %1").arg(AW_GRAPHITEM_API)); |     metadata.append(QString("    AW_GRAPHITEM_API: %1").arg(AW_GRAPHITEM_API)); | ||||||
|     metadata.append(QString("    AW_EXTQUOTES_API: %1").arg(AW_EXTQUOTES_API)); |     metadata.append(QString("    AW_EXTQUOTES_API: %1").arg(AW_EXTQUOTES_API)); | ||||||
|     metadata.append(QString("    AW_EXTSCRIPT_API: %1").arg(AW_EXTSCRIPT_API)); |     metadata.append(QString("    AW_EXTSCRIPT_API: %1").arg(AW_EXTSCRIPT_API)); | ||||||
|     metadata.append( |     metadata.append(QString("    AW_EXTUPGRADE_API: %1").arg(AW_EXTUPGRADE_API)); | ||||||
|         QString("    AW_EXTUPGRADE_API: %1").arg(AW_EXTUPGRADE_API)); |     metadata.append(QString("    AW_EXTWEATHER_API: %1").arg(AW_EXTWEATHER_API)); | ||||||
|     metadata.append( |  | ||||||
|         QString("    AW_EXTWEATHER_API: %1").arg(AW_EXTWEATHER_API)); |  | ||||||
|     metadata.append(QString("    AW_FORMATTER_API: %1").arg(AW_FORMATTER_API)); |     metadata.append(QString("    AW_FORMATTER_API: %1").arg(AW_FORMATTER_API)); | ||||||
|     metadata.append(QString("    REQUEST_TIMEOUT: %1").arg(REQUEST_TIMEOUT)); |     metadata.append(QString("    REQUEST_TIMEOUT: %1").arg(REQUEST_TIMEOUT)); | ||||||
|     metadata.append(QString("    TIME_KEYS: %1").arg(TIME_KEYS)); |     metadata.append(QString("    TIME_KEYS: %1").arg(TIME_KEYS)); | ||||||
| @ -128,41 +97,27 @@ QStringList AWDebug::getBuildData() | |||||||
|     // cmake properties |     // cmake properties | ||||||
|     metadata.append("cmake properties:"); |     metadata.append("cmake properties:"); | ||||||
|     metadata.append(QString("    CMAKE_BUILD_TYPE: %1").arg(CMAKE_BUILD_TYPE)); |     metadata.append(QString("    CMAKE_BUILD_TYPE: %1").arg(CMAKE_BUILD_TYPE)); | ||||||
|     metadata.append( |     metadata.append(QString("    CMAKE_CXX_COMPILER: %1").arg(CMAKE_CXX_COMPILER)); | ||||||
|         QString("    CMAKE_CXX_COMPILER: %1").arg(CMAKE_CXX_COMPILER)); |  | ||||||
|     metadata.append(QString("    CMAKE_CXX_FLAGS: %1").arg(CMAKE_CXX_FLAGS)); |     metadata.append(QString("    CMAKE_CXX_FLAGS: %1").arg(CMAKE_CXX_FLAGS)); | ||||||
|     metadata.append( |     metadata.append(QString("    CMAKE_CXX_FLAGS_DEBUG: %1").arg(CMAKE_CXX_FLAGS_DEBUG)); | ||||||
|         QString("    CMAKE_CXX_FLAGS_DEBUG: %1").arg(CMAKE_CXX_FLAGS_DEBUG)); |     metadata.append(QString("    CMAKE_CXX_FLAGS_RELEASE: %1").arg(CMAKE_CXX_FLAGS_RELEASE)); | ||||||
|     metadata.append(QString("    CMAKE_CXX_FLAGS_RELEASE: %1") |     metadata.append(QString("    CMAKE_CXX_FLAGS_OPTIMIZATION: %1").arg(CMAKE_CXX_FLAGS_OPTIMIZATION)); | ||||||
|                         .arg(CMAKE_CXX_FLAGS_RELEASE)); |     metadata.append(QString("    CMAKE_DEFINITIONS: %1").arg(CMAKE_DEFINITIONS)); | ||||||
|     metadata.append(QString("    CMAKE_CXX_FLAGS_OPTIMIZATION: %1") |     metadata.append(QString("    CMAKE_INSTALL_PREFIX: %1").arg(CMAKE_INSTALL_PREFIX)); | ||||||
|                         .arg(CMAKE_CXX_FLAGS_OPTIMIZATION)); |     metadata.append(QString("    CMAKE_MODULE_LINKER_FLAGS: %1").arg(CMAKE_MODULE_LINKER_FLAGS)); | ||||||
|     metadata.append( |     metadata.append(QString("    CMAKE_SHARED_LINKER_FLAGS: %1").arg(CMAKE_SHARED_LINKER_FLAGS)); | ||||||
|         QString("    CMAKE_DEFINITIONS: %1").arg(CMAKE_DEFINITIONS)); |  | ||||||
|     metadata.append( |  | ||||||
|         QString("    CMAKE_INSTALL_PREFIX: %1").arg(CMAKE_INSTALL_PREFIX)); |  | ||||||
|     metadata.append(QString("    CMAKE_MODULE_LINKER_FLAGS: %1") |  | ||||||
|                         .arg(CMAKE_MODULE_LINKER_FLAGS)); |  | ||||||
|     metadata.append(QString("    CMAKE_SHARED_LINKER_FLAGS: %1") |  | ||||||
|                         .arg(CMAKE_SHARED_LINKER_FLAGS)); |  | ||||||
|     // components |     // components | ||||||
|     metadata.append("Components data:"); |     metadata.append("Components data:"); | ||||||
|     metadata.append(QString("    BUILD_PLASMOIDS: %1").arg(BUILD_PLASMOIDS)); |     metadata.append(QString("    BUILD_PLASMOIDS: %1").arg(BUILD_PLASMOIDS)); | ||||||
|     metadata.append( |     metadata.append(QString("    BUILD_DEB_PACKAGE: %1").arg(BUILD_DEB_PACKAGE)); | ||||||
|         QString("    BUILD_DEB_PACKAGE: %1").arg(BUILD_DEB_PACKAGE)); |     metadata.append(QString("    BUILD_RPM_PACKAGE: %1").arg(BUILD_RPM_PACKAGE)); | ||||||
|     metadata.append( |     metadata.append(QString("    CLANGFORMAT_EXECUTABLE: %1").arg(CLANGFORMAT_EXECUTABLE)); | ||||||
|         QString("    BUILD_RPM_PACKAGE: %1").arg(BUILD_RPM_PACKAGE)); |  | ||||||
|     metadata.append( |  | ||||||
|         QString("    CLANGFORMAT_EXECUTABLE: %1").arg(CLANGFORMAT_EXECUTABLE)); |  | ||||||
|     metadata.append(QString("    COVERITY_COMMENT: %1").arg(COVERITY_COMMENT)); |     metadata.append(QString("    COVERITY_COMMENT: %1").arg(COVERITY_COMMENT)); | ||||||
|     metadata.append( |     metadata.append(QString("    COVERITY_DIRECTORY: %1").arg(COVERITY_DIRECTORY)); | ||||||
|         QString("    COVERITY_DIRECTORY: %1").arg(COVERITY_DIRECTORY)); |  | ||||||
|     metadata.append(QString("    COVERITY_EMAIL: %1").arg(COVERITY_EMAIL)); |     metadata.append(QString("    COVERITY_EMAIL: %1").arg(COVERITY_EMAIL)); | ||||||
|     metadata.append( |     metadata.append(QString("    COVERITY_EXECUTABLE: %1").arg(COVERITY_EXECUTABLE)); | ||||||
|         QString("    COVERITY_EXECUTABLE: %1").arg(COVERITY_EXECUTABLE)); |  | ||||||
|     metadata.append(QString("    COVERITY_URL: %1").arg(COVERITY_URL)); |     metadata.append(QString("    COVERITY_URL: %1").arg(COVERITY_URL)); | ||||||
|     metadata.append( |     metadata.append(QString("    CPPCHECK_EXECUTABLE: %1").arg(CPPCHECK_EXECUTABLE)); | ||||||
|         QString("    CPPCHECK_EXECUTABLE: %1").arg(CPPCHECK_EXECUTABLE)); |  | ||||||
|     // additional functions |     // additional functions | ||||||
|     metadata.append(QString("    PROP_FUTURE: %1").arg(PROP_FUTURE)); |     metadata.append(QString("    PROP_FUTURE: %1").arg(PROP_FUTURE)); | ||||||
|     metadata.append(QString("    PROP_LOAD: %1").arg(PROP_LOAD)); |     metadata.append(QString("    PROP_LOAD: %1").arg(PROP_LOAD)); | ||||||
|  | |||||||
| @ -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> | ||||||
|  |  | ||||||
| @ -33,7 +31,7 @@ const char LOG_FORMAT[] = "[%{time " | |||||||
|  |  | ||||||
| QString getAboutText(const QString &_type); | QString getAboutText(const QString &_type); | ||||||
| QStringList getBuildData(); | QStringList getBuildData(); | ||||||
| } | } // namespace AWDebug | ||||||
|  |  | ||||||
|  |  | ||||||
| Q_DECLARE_LOGGING_CATEGORY(LOG_AW) | Q_DECLARE_LOGGING_CATEGORY(LOG_AW) | ||||||
| @ -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 */ |  | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| set(SUBPROJECT plasma_applet_awesome-widget) | set(SUBPROJECT plasma_applet_awesome-widget) | ||||||
| message(STATUS "Subproject ${SUBPROJECT}") | message(STATUS "Subproject ${SUBPROJECT}") | ||||||
|  |  | ||||||
| configure_file(metadata.desktop ${CMAKE_CURRENT_SOURCE_DIR}/package/metadata.desktop) | configure_file(metadata.json ${CMAKE_CURRENT_SOURCE_DIR}/package/metadata.json) | ||||||
|  |  | ||||||
| add_subdirectory(plugin) | add_subdirectory(plugin) | ||||||
| plasma_install_package(package org.kde.plasma.awesomewidget) | plasma_install_package(package org.kde.plasma.awesomewidget) | ||||||
|  | |||||||
| @ -1,28 +0,0 @@ | |||||||
| [Desktop Entry] |  | ||||||
| Encoding=UTF-8 |  | ||||||
| Name=Awesome Widget |  | ||||||
| Comment=A minimalistic Plasmoid |  | ||||||
| Comment[en]=A minimalistic Plasmoid |  | ||||||
| Comment[es]=Un plasmoide minimalista |  | ||||||
| Comment[es]=Un script Plasmoïde minimaliste |  | ||||||
| Comment[pt_BR]=Um script Plasmoid |  | ||||||
| Comment[ru]=Минималистичный плазмоид |  | ||||||
| Comment[uk]=Мінімалістичний плазмоїд |  | ||||||
| X-KDE-ServiceTypes=Plasma/Applet |  | ||||||
| Type=Service |  | ||||||
| Icon=utilities-system-monitor |  | ||||||
|  |  | ||||||
| X-KDE-ServiceTypes=Plasma/Applet |  | ||||||
| X-Plasma-API=declarativeappletscript |  | ||||||
| X-Plasma-MainScript=ui/main.qml |  | ||||||
| X-Plasma-RemoteLocation= |  | ||||||
|  |  | ||||||
| X-KDE-PluginInfo-Author=Evgeniy Alekseev aka arcanis |  | ||||||
| X-KDE-PluginInfo-Email=esalexeev@gmail.com |  | ||||||
| X-KDE-PluginInfo-Name=org.kde.plasma.awesomewidget |  | ||||||
| X-KDE-PluginInfo-Version=@PROJECT_VERSION@ |  | ||||||
| X-KDE-PluginInfo-Website=https://arcanis.me/projects/awesome-widgets/ |  | ||||||
| X-KDE-PluginInfo-Category=System Information |  | ||||||
| X-KDE-PluginInfo-Depends= |  | ||||||
| X-KDE-PluginInfo-License=GPLv3 |  | ||||||
| X-KDE-PluginInfo-EnabledByDefault=true |  | ||||||
							
								
								
									
										26
									
								
								sources/awesome-widget/metadata.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								sources/awesome-widget/metadata.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | |||||||
|  | { | ||||||
|  |     "KPackageStructure": "Plasma/Applet", | ||||||
|  |     "KPlugin": { | ||||||
|  |         "Authors": [ | ||||||
|  |             { | ||||||
|  |                 "Email": "esalexeev@gmail.com", | ||||||
|  |                 "Name": "Evgeniy Alekseev aka arcanis" | ||||||
|  |             } | ||||||
|  |         ], | ||||||
|  |         "Category": "System Information", | ||||||
|  |         "Description": "A minimalistic Plasmoid", | ||||||
|  |         "Description[en]": "A minimalistic Plasmoid", | ||||||
|  |         "Description[es]": "Un script Plasmoïde minimaliste", | ||||||
|  |         "Description[pt_BR]": "Um script Plasmoid", | ||||||
|  |         "Description[ru]": "Минималистичный плазмоид", | ||||||
|  |         "Description[uk]": "Мінімалістичний плазмоїд", | ||||||
|  |         "EnabledByDefault": true, | ||||||
|  |         "Icon": "utilities-system-monitor", | ||||||
|  |         "Id": "org.kde.plasma.awesomewidget", | ||||||
|  |         "License": "GPLv3", | ||||||
|  |         "Name": "Awesome Widget", | ||||||
|  |         "Version": "@PROJECT_VERSION@", | ||||||
|  |         "Website": "https://arcanis.me/projects/awesome-widgets/" | ||||||
|  |     }, | ||||||
|  |     "X-Plasma-API-Minimum-Version": "6.0" | ||||||
|  | } | ||||||
| @ -15,7 +15,7 @@ | |||||||
|  *   along with awesome-widgets. If not, see http://www.gnu.org/licenses/  * |  *   along with awesome-widgets. If not, see http://www.gnu.org/licenses/  * | ||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.0 | import QtQuick 2.15 | ||||||
|  |  | ||||||
| import org.kde.plasma.configuration 2.0 | import org.kde.plasma.configuration 2.0 | ||||||
|  |  | ||||||
| @ -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" | ||||||
|  | |||||||
| @ -7,150 +7,141 @@ | |||||||
|  |  | ||||||
|     <group name="Widget"> |     <group name="Widget"> | ||||||
|         <!--   widget --> |         <!--   widget --> | ||||||
|         <entry name="text" type="string"> |         <entry name="text" type="String"> | ||||||
|             <default>[cpu: $cpu%] [mem: $mem%] [swap: $swap%] [$netdev: $down/$upKB/s]</default> |             <default>[cpu: $cpu%] [mem: $mem%] [swap: $swap%] [$netdev: $down/$upKB/s]</default> | ||||||
|         </entry> |         </entry> | ||||||
|     </group> |     </group> | ||||||
|  |  | ||||||
|     <group name="Advanced"> |     <group name="Advanced"> | ||||||
|         <!--   advanced --> |         <!--   advanced --> | ||||||
|         <entry name="background" type="bool"> |         <entry name="background" type="Bool"> | ||||||
|             <default>true</default> |             <default>true</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <entry name="translateStrings" type="bool"> |         <entry name="translateStrings" type="Bool"> | ||||||
|             <default>true</default> |             <default>true</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <entry name="wrapNewLines" type="bool"> |         <entry name="wrapNewLines" type="Bool"> | ||||||
|             <default>false</default> |             <default>false</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <entry name="wrapText" type="bool"> |         <entry name="wrapText" type="Bool"> | ||||||
|             <default>false</default> |             <default>false</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <entry name="notify" type="bool"> |         <entry name="notify" type="Bool"> | ||||||
|             <default>true</default> |             <default>true</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <entry name="checkUpdates" type="bool"> |         <entry name="checkUpdates" type="Bool"> | ||||||
|             <default>true</default> |             <default>true</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <entry name="optimize" type="bool"> |         <entry name="optimize" type="Bool"> | ||||||
|             <default>true</default> |             <default>true</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <entry name="height" type="int"> |         <entry name="height" type="Int"> | ||||||
|             <default>0</default> |             <default>0</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <entry name="width" type="int"> |         <entry name="width" type="Int"> | ||||||
|             <default>0</default> |             <default>0</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <entry name="interval" type="int"> |         <entry name="interval" type="Int"> | ||||||
|             <default>1000</default> |             <default>1000</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <entry name="queueLimit" type="int"> |         <entry name="tempUnits" type="String"> | ||||||
|             <default>0</default> |  | ||||||
|         </entry> |  | ||||||
|         <entry name="tempUnits" type="string"> |  | ||||||
|             <default>Celsius</default> |             <default>Celsius</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <entry name="customTime" type="string"> |         <entry name="customTime" type="String"> | ||||||
|             <default>$hh:$mm</default> |             <default>$hh:$mm</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <entry name="customUptime" type="string"> |         <entry name="customUptime" type="String"> | ||||||
|             <default>$dd,$hh,$mm</default> |             <default>$dd,$hh,$mm</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <entry name="acOnline" type="string"> |         <entry name="acOnline" type="String"> | ||||||
|             <default>(*)</default> |             <default>(*)</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <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"> | ||||||
|         <entry name="tooltipNumber" type="int"> |         <entry name="tooltipNumber" type="Int"> | ||||||
|             <default>100</default> |             <default>100</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <entry name="useTooltipBackground" type="bool"> |         <entry name="useTooltipBackground" type="Bool"> | ||||||
|             <default>true</default> |             <default>true</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <entry name="tooltipBackground" type="string"> |         <entry name="tooltipBackground" type="String"> | ||||||
|             <default>#ffffff</default> |             <default>#ffffff</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <entry name="cpuTooltip" type="bool"> |         <entry name="cpuTooltip" type="Bool"> | ||||||
|             <default>true</default> |             <default>true</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <entry name="cpuTooltipColor" type="string"> |         <entry name="cpuTooltipColor" type="String"> | ||||||
|             <default>#ff0000</default> |             <default>#ff0000</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <entry name="cpuclTooltip" type="bool"> |         <entry name="cpuclTooltip" type="Bool"> | ||||||
|             <default>true</default> |             <default>true</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <entry name="cpuclTooltipColor" type="string"> |         <entry name="cpuclTooltipColor" type="String"> | ||||||
|             <default>#00ff00</default> |             <default>#00ff00</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <entry name="memTooltip" type="bool"> |         <entry name="memTooltip" type="Bool"> | ||||||
|             <default>true</default> |             <default>true</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <entry name="memTooltipColor" type="string"> |         <entry name="memTooltipColor" type="String"> | ||||||
|             <default>#0000ff</default> |             <default>#0000ff</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <entry name="swapTooltip" type="bool"> |         <entry name="swapTooltip" type="Bool"> | ||||||
|             <default>true</default> |             <default>true</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <entry name="swapTooltipColor" type="string"> |         <entry name="swapTooltipColor" type="String"> | ||||||
|             <default>#ffff00</default> |             <default>#ffff00</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <entry name="downkbTooltip" type="bool"> |         <entry name="downkbTooltip" type="Bool"> | ||||||
|             <default>true</default> |             <default>true</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <entry name="downkbTooltipColor" type="string"> |         <entry name="downkbTooltipColor" type="String"> | ||||||
|             <default>#00ffff</default> |             <default>#00ffff</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <entry name="upkbTooltipColor" type="string"> |         <entry name="upkbTooltipColor" type="String"> | ||||||
|             <default>#ff00ff</default> |             <default>#ff00ff</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <entry name="batTooltip" type="bool"> |         <entry name="batTooltip" type="Bool"> | ||||||
|             <default>true</default> |             <default>true</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <entry name="batTooltipColor" type="string"> |         <entry name="batTooltipColor" type="String"> | ||||||
|             <default>#008800</default> |             <default>#008800</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <entry name="batInTooltipColor" type="string"> |         <entry name="batInTooltipColor" type="String"> | ||||||
|             <default>#880000</default> |             <default>#880000</default> | ||||||
|         </entry> |         </entry> | ||||||
|     </group> |     </group> | ||||||
|  |  | ||||||
|     <group name="Appearance"> |     <group name="Appearance"> | ||||||
|         <!--   appearance --> |         <!--   appearance --> | ||||||
|         <entry name="textAlign" type="string"> |         <entry name="textAlign" type="String"> | ||||||
|             <default>center</default> |             <default>center</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <entry name="fontFamily" type="string"> |         <entry name="fontFamily" type="String"> | ||||||
|             <default>Terminus</default> |             <default>Terminus</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <entry name="fontSize" type="int"> |         <entry name="fontSize" type="Int"> | ||||||
|             <default>12</default> |             <default>12</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <entry name="fontColor" type="string"> |         <entry name="fontColor" type="String"> | ||||||
|             <default>#000000</default> |             <default>#000000</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <entry name="fontWeight" type="string"> |         <entry name="fontWeight" type="String"> | ||||||
|             <default>normal</default> |             <default>normal</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <entry name="fontStyle" type="string"> |         <entry name="fontStyle" type="String"> | ||||||
|             <default>normal</default> |             <default>normal</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <entry name="textStyle" type="string"> |         <entry name="textStyle" type="String"> | ||||||
|             <default>normal</default> |             <default>normal</default> | ||||||
|         </entry> |         </entry> | ||||||
|         <entry name="textStyleColor" type="string"> |         <entry name="textStyleColor" type="String"> | ||||||
|             <default>#000000</default> |             <default>#000000</default> | ||||||
|         </entry> |         </entry> | ||||||
|     </group> |     </group> | ||||||
|  | |||||||
| @ -15,26 +15,22 @@ | |||||||
|  *   along with awesome-widgets. If not, see http://www.gnu.org/licenses/  * |  *   along with awesome-widgets. If not, see http://www.gnu.org/licenses/  * | ||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.0 | import QtQuick 2.15 | ||||||
|  | import org.kde.kcmutils as KCM | ||||||
|  |  | ||||||
| import org.kde.plasma.private.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 |  | ||||||
|  |  | ||||||
|     AboutTab { |     AboutTab { | ||||||
|         textProvider: awActions |         textProvider: awActions | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     Component.onCompleted: { |  | ||||||
|         if (debug) console.debug() |  | ||||||
|     } |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -15,26 +15,22 @@ | |||||||
|  *   along with awesome-widgets. If not, see http://www.gnu.org/licenses/  * |  *   along with awesome-widgets. If not, see http://www.gnu.org/licenses/  * | ||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.0 | import QtQuick 2.15 | ||||||
| import QtQuick.Controls 1.3 as QtControls | 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,50 +113,41 @@ 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") | ||||||
|             value: plasmoid.configuration.tempUnits |             value: plasmoid.configuration.tempUnits | ||||||
|             onValueEdited: cfg_tempUnits = newValue |             onValueEdited: newValue => cfg_tempUnits = newValue | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         LineSelector { |         LineSelector { | ||||||
| @ -192,18 +174,20 @@ Item { | |||||||
|             value: plasmoid.configuration.acOffline |             value: plasmoid.configuration.acOffline | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         QtControls.GroupBox { |         GroupBox { | ||||||
|             height: implicitHeight |  | ||||||
|             width: parent.width |             width: parent.width | ||||||
|  |             height: implicitHeight | ||||||
|             title: i18n("Actions") |             title: i18n("Actions") | ||||||
|  |  | ||||||
|             Column { |             Column { | ||||||
|                 height: implicitHeight |                 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 | ||||||
| @ -212,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] | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
| @ -226,37 +211,24 @@ Item { | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         QtControls.GroupBox { |         GroupBox { | ||||||
|             height: implicitHeight |             height: implicitHeight | ||||||
|             width: parent.width |             width: parent.width | ||||||
|             title: i18n("Telemetry") |             title: i18n("History") | ||||||
|  |  | ||||||
|             Column { |             Column { | ||||||
|                 height: implicitHeight |                 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() |  | ||||||
|     } |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -15,31 +15,22 @@ | |||||||
|  *   along with awesome-widgets. If not, see http://www.gnu.org/licenses/  * |  *   along with awesome-widgets. If not, see http://www.gnu.org/licenses/  * | ||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.0 | import QtQuick 2.15 | ||||||
|  | import org.kde.kcmutils as KCM | ||||||
|  |  | ||||||
| import org.kde.plasma.private.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 { | ||||||
| @ -75,7 +64,7 @@ Item { | |||||||
|             model: General.fontWeightModel |             model: General.fontWeightModel | ||||||
|             text: i18n("Font weight") |             text: i18n("Font weight") | ||||||
|             value: plasmoid.configuration.fontWeight |             value: plasmoid.configuration.fontWeight | ||||||
|             onValueEdited: cfg_fontWeight = newValue |             onValueEdited: newValue => cfg_fontWeight = newValue | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         ComboBoxSelector { |         ComboBoxSelector { | ||||||
| @ -83,7 +72,7 @@ Item { | |||||||
|             model: General.fontStyleModel |             model: General.fontStyleModel | ||||||
|             text: i18n("Font style") |             text: i18n("Font style") | ||||||
|             value: plasmoid.configuration.fontStyle |             value: plasmoid.configuration.fontStyle | ||||||
|             onValueEdited: cfg_fontStyle = newValue |             onValueEdited: newValue => cfg_fontStyle = newValue | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         ColorSelector { |         ColorSelector { | ||||||
| @ -97,7 +86,7 @@ Item { | |||||||
|             model: General.textStyleModel |             model: General.textStyleModel | ||||||
|             text: i18n("Style") |             text: i18n("Style") | ||||||
|             value: plasmoid.configuration.textStyle |             value: plasmoid.configuration.textStyle | ||||||
|             onValueEdited: cfg_textStyle = newValue |             onValueEdited: newValue => cfg_textStyle = newValue | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         ColorSelector { |         ColorSelector { | ||||||
| @ -106,9 +95,4 @@ Item { | |||||||
|             value: plasmoid.configuration.textStyleColor |             value: plasmoid.configuration.textStyleColor | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|     Component.onCompleted: { |  | ||||||
|         if (debug) console.debug() |  | ||||||
|     } |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -15,16 +15,19 @@ | |||||||
|  *   along with awesome-widgets. If not, see http://www.gnu.org/licenses/  * |  *   along with awesome-widgets. If not, see http://www.gnu.org/licenses/  * | ||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
| 
 | 
 | ||||||
| import QtQuick 2.0 | import QtQuick 2.15 | ||||||
| import QtQuick.Controls 1.3 as QtControls | import QtQuick.Controls | ||||||
| import QtQuick.Dialogs 1.2 as QtDialogs | import QtQuick.Dialogs | ||||||
| import QtQuick.Layouts 1.2 as QtLayouts | 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 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| QtDialogs.Dialog { | KCM.SimpleKCM { | ||||||
|     id: reportDialog |     id: bugPage | ||||||
|  | 
 | ||||||
|     AWActions { |     AWActions { | ||||||
|         id: awActions |         id: awActions | ||||||
|     } |     } | ||||||
| @ -32,129 +35,125 @@ QtDialogs.Dialog { | |||||||
|         id: awBugReporter |         id: awBugReporter | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     width: 640 |     ColumnLayout { | ||||||
|     height: 480 |  | ||||||
|     property bool debug: awActions.isDebugEnabled() |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     title: i18n("Report a bug") |  | ||||||
|     standardButtons: QtDialogs.StandardButton.Ok | QtDialogs.StandardButton.Cancel | QtDialogs.StandardButton.Reset |  | ||||||
| 
 |  | ||||||
|     QtLayouts.ColumnLayout { |  | ||||||
|         anchors.fill: parent |         anchors.fill: parent | ||||||
| 
 | 
 | ||||||
|         QtControls.TextField { |         TextField { | ||||||
|             id: title |             id: title | ||||||
|             anchors.left: parent.left |             Layout.fillWidth: true | ||||||
|             anchors.right: parent.right |  | ||||||
|             placeholderText: i18n("Report subject") |             placeholderText: i18n("Report subject") | ||||||
|         } |         } | ||||||
|         QtLayouts.ColumnLayout { |  | ||||||
|             anchors.left: parent.left |  | ||||||
|             anchors.right: parent.right |  | ||||||
| 
 | 
 | ||||||
|             QtControls.GroupBox { |         ColumnLayout { | ||||||
|                 anchors.left: parent.left |             Layout.fillWidth: true | ||||||
|                 anchors.right: parent.right | 
 | ||||||
|                 height: parent.height / 5 |             GroupBox { | ||||||
|  |                 Layout.fillWidth: true | ||||||
|                 title: i18n("Description") |                 title: i18n("Description") | ||||||
|                 QtControls.TextArea { | 
 | ||||||
|  |                 TextArea { | ||||||
|                     id: description |                     id: description | ||||||
|                     anchors.fill: parent |                     anchors.fill: parent | ||||||
|                     textFormat: TextEdit.PlainText |                     textFormat: TextEdit.PlainText | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             QtControls.GroupBox { | 
 | ||||||
|                 anchors.left: parent.left |             GroupBox { | ||||||
|                 anchors.right: parent.right |                 Layout.fillWidth: true | ||||||
|                 height: parent.height / 5 |  | ||||||
|                 title: i18n("Steps to reproduce") |                 title: i18n("Steps to reproduce") | ||||||
|                 QtControls.TextArea { | 
 | ||||||
|  |                 TextArea { | ||||||
|                     id: reproduce |                     id: reproduce | ||||||
|                     anchors.fill: parent |                     anchors.fill: parent | ||||||
|                     textFormat: TextEdit.PlainText |                     textFormat: TextEdit.PlainText | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             QtControls.GroupBox { | 
 | ||||||
|                 anchors.left: parent.left |             GroupBox { | ||||||
|                 anchors.right: parent.right |                 Layout.fillWidth: true | ||||||
|                 height: parent.height / 5 |  | ||||||
|                 title: i18n("Expected result") |                 title: i18n("Expected result") | ||||||
|                 QtControls.TextArea { | 
 | ||||||
|  |                 TextArea { | ||||||
|                     id: expected |                     id: expected | ||||||
|                     anchors.fill: parent |                     anchors.fill: parent | ||||||
|                     textFormat: TextEdit.PlainText |                     textFormat: TextEdit.PlainText | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             QtControls.GroupBox { | 
 | ||||||
|                 anchors.left: parent.left |             GroupBox { | ||||||
|                 anchors.right: parent.right |                 Layout.fillWidth: true | ||||||
|                 anchors.bottom: parent.bottom |                 Layout.alignment: Qt.AlignBottom | ||||||
|                 title: i18n("Logs") |                 title: i18n("Logs") | ||||||
|                 QtLayouts.ColumnLayout { | 
 | ||||||
|  |                 ColumnLayout { | ||||||
|                     anchors.fill: parent |                     anchors.fill: parent | ||||||
|  |                     Layout.fillWidth: true | ||||||
|  | 
 | ||||||
|                     Row { |                     Row { | ||||||
|                         anchors.left: parent.left |                         Layout.fillWidth: true | ||||||
|                         anchors.right: parent.right | 
 | ||||||
|                         QtControls.Label { |                         Label { | ||||||
|                             width: parent.width * 2 / 5 |                             width: parent.width * 2 / 5 | ||||||
|                             horizontalAlignment: Text.AlignJustify |                             horizontalAlignment: Text.AlignJustify | ||||||
|                             verticalAlignment: Text.AlignVCenter |                             verticalAlignment: Text.AlignVCenter | ||||||
|                             wrapMode: Text.WordWrap |                             wrapMode: Text.WordWrap | ||||||
|                             text: i18n("Use command") |                             text: i18n("Use command") | ||||||
|                         } |                         } | ||||||
|                         QtControls.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" | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|                     QtControls.Button { | 
 | ||||||
|                         anchors.left: parent.left |                     Button { | ||||||
|                         anchors.right: parent.right |                         Layout.fillWidth: true | ||||||
|                         text: i18n("Load log file") |                         text: i18n("Load log file") | ||||||
|                         onClicked: logPath.open() |                         onClicked: logPath.open() | ||||||
|                     } |                     } | ||||||
|                     QtControls.TextArea { | 
 | ||||||
|  |                     TextArea { | ||||||
|                         id: logBody |                         id: logBody | ||||||
|                         anchors.left: parent.left |                         Layout.fillWidth: true | ||||||
|                         anchors.right: parent.right |                         Layout.alignment: Qt.AlignBottom | ||||||
|                         anchors.bottom: parent.bottom |  | ||||||
|                         textFormat: TextEdit.PlainText |                         textFormat: TextEdit.PlainText | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|                 QtDialogs.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() | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 |  | ||||||
| @ -15,105 +15,46 @@ | |||||||
|  *   along with awesome-widgets. If not, see http://www.gnu.org/licenses/  * |  *   along with awesome-widgets. If not, see http://www.gnu.org/licenses/  * | ||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.0 | import QtQuick 2.15 | ||||||
| import QtQuick.Controls 1.3 as QtControls | import QtQuick.Controls | ||||||
| import QtQuick.Dialogs 1.1 as QtDialogs | 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 | ||||||
|         QtControls.GroupBox { |  | ||||||
|  |         GroupBox { | ||||||
|             height: implicitHeight |             height: implicitHeight | ||||||
|             width: parent.width |             width: parent.width | ||||||
|             title: i18n("ACPI") |             title: i18n("ACPI") | ||||||
|             LineSelector { |             LineSelector { | ||||||
|                 text: i18n("ACPI path") |                 text: i18n("ACPI path") | ||||||
|                 value: cfg_dataengine["ACPIPATH"] |                 value: cfg_dataengine["ACPIPATH"] | ||||||
|                 onValueEdited: cfg_dataengine["ACPIPATH"] = newValue |                 onValueEdited: newValue => cfg_dataengine["ACPIPATH"] = newValue | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         QtControls.GroupBox { |         GroupBox { | ||||||
|             height: implicitHeight |  | ||||||
|             width: parent.width |  | ||||||
|             title: i18n("GPU") |  | ||||||
|             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: cfg_dataengine["GPUDEV"] = newValue |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         QtControls.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: cfg_dataengine["HDDDEV"] = newValue |  | ||||||
|                 } |  | ||||||
|  |  | ||||||
|                 LineSelector { |  | ||||||
|                     text: i18n("hddtemp cmd") |  | ||||||
|                     value: cfg_dataengine["HDDTEMPCMD"] |  | ||||||
|                     onValueEdited: cfg_dataengine["HDDTEMPCMD"] = newValue |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         QtControls.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 | ||||||
| @ -123,27 +64,27 @@ Item { | |||||||
|                     stepSize: 1 |                     stepSize: 1 | ||||||
|                     text: i18n("Player data symbols") |                     text: i18n("Player data symbols") | ||||||
|                     value: cfg_dataengine["PLAYERSYMBOLS"] |                     value: cfg_dataengine["PLAYERSYMBOLS"] | ||||||
|                     onValueEdited: cfg_dataengine["PLAYERSYMBOLS"] = newValue |                     onValueEdited: newValue => cfg_dataengine["PLAYERSYMBOLS"] = newValue | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 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") | ||||||
|                     value: cfg_dataengine["PLAYER"] |                     value: cfg_dataengine["PLAYER"] | ||||||
|                     onValueEdited: cfg_dataengine["PLAYER"] = newValue |                     onValueEdited: newValue => cfg_dataengine["PLAYER"] = newValue | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 ComboBoxSelector { |                 ComboBoxSelector { | ||||||
| @ -151,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") | ||||||
| @ -194,7 +135,7 @@ Item { | |||||||
|                 LineSelector { |                 LineSelector { | ||||||
|                     text: i18n("MPD address") |                     text: i18n("MPD address") | ||||||
|                     value: cfg_dataengine["MPDADDRESS"] |                     value: cfg_dataengine["MPDADDRESS"] | ||||||
|                     onValueEdited: cfg_dataengine["MPDADDRESS"] = newValue |                     onValueEdited: newValue => cfg_dataengine["MPDADDRESS"] = newValue | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 IntegerSelector { |                 IntegerSelector { | ||||||
| @ -203,18 +144,20 @@ Item { | |||||||
|                     stepSize: 1 |                     stepSize: 1 | ||||||
|                     text: i18n("MPD port") |                     text: i18n("MPD port") | ||||||
|                     value: cfg_dataengine["MPDPORT"] |                     value: cfg_dataengine["MPDPORT"] | ||||||
|                     onValueEdited: cfg_dataengine["MPDPORT"] = newValue |                     onValueEdited: newValue => cfg_dataengine["MPDPORT"] = newValue | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         QtControls.GroupBox { |         GroupBox { | ||||||
|             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") | ||||||
| @ -245,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) | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -15,20 +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/  * | ||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.4 | import QtQuick 2.15 | ||||||
| import QtQuick.Controls 1.3 as QtControls | import QtQuick.Layouts | ||||||
| import QtQuick.Dialogs 1.2 as QtDialogs | import org.kde.plasma.core as PlasmaCore | ||||||
| import QtQuick.Layouts 1.1 |  | ||||||
| import org.kde.plasma.plasmoid 2.0 | import org.kde.plasma.plasmoid 2.0 | ||||||
| import org.kde.plasma.core 2.0 as PlasmaCore |  | ||||||
| import org.kde.plasma.components 2.0 as PlasmaComponents |  | ||||||
|  |  | ||||||
| import org.kde.plasma.private.awesomewidget 1.0 | import org.kde.plasma.awesomewidgets | ||||||
| import "." | import org.kde.plasma.private.awesomewidget | ||||||
|  |  | ||||||
|  |  | ||||||
| Item { | PlasmoidItem { | ||||||
|     id: main |     id: main | ||||||
|  |  | ||||||
|     // backend |     // backend | ||||||
|     AWKeys { |     AWKeys { | ||||||
|         id: awKeys |         id: awKeys | ||||||
| @ -39,11 +37,7 @@ Item { | |||||||
|     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, | ||||||
| @ -73,19 +67,12 @@ Item { | |||||||
|     signal needToolTipUpdate(string newText) |     signal needToolTipUpdate(string newText) | ||||||
|     signal sizeUpdate |     signal sizeUpdate | ||||||
|  |  | ||||||
|  |     Layout.fillWidth: PlasmoidItem.formFactor !== PlasmaCore.Planar | ||||||
|     // init |     Layout.fillHeight: PlasmoidItem.formFactor !== PlasmaCore.Planar | ||||||
|     Plasmoid.preferredRepresentation: Plasmoid.fullRepresentation |  | ||||||
|     Plasmoid.compactRepresentation: Plasmoid.fullRepresentation |  | ||||||
|  |  | ||||||
|     Layout.fillWidth: plasmoid.formFactor != PlasmaCore.Planar |  | ||||||
|     Layout.fillHeight: plasmoid.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" | ||||||
|     Plasmoid.associatedApplication: "ksysguard" |  | ||||||
|  |  | ||||||
|  |  | ||||||
|     // ui |     // ui | ||||||
|     Text { |     Text { | ||||||
| @ -100,7 +87,7 @@ Item { | |||||||
|  |  | ||||||
|         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] | ||||||
|  |  | ||||||
| @ -119,38 +106,26 @@ Item { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     QtDialogs.Dialog { |     Plasmoid.contextualActions: [ | ||||||
|         id: tagSelector |         PlasmaCore.Action { | ||||||
|         title: i18n("Select tag") |             text: i18n("Run monitor") | ||||||
|  |             icon.name: "utilities-system-monitor" | ||||||
|         QtControls.ComboBox { |             onTriggered: awActions.runCmd("plasma-systemmonitor", []) | ||||||
|             id: tagSelectorBox |         }, | ||||||
|             width: parent.width |         PlasmaCore.Action { | ||||||
|             editable: true |             text: i18n("Show README") | ||||||
|         } |             icon.name: "text-x-readme" | ||||||
|  |             onTriggered: awActions.showReadme() | ||||||
|         onAccepted: { |         }, | ||||||
|             var tag = tagSelectorBox.editText |         PlasmaCore.Action { | ||||||
|             var message = i18n("Tag: %1", tag) |             text: i18n("Check updates") | ||||||
|             message += "<br>" |             icon.name: "system-software-update" | ||||||
|             message += i18n("Value: %1", awKeys.valueByKey(tag)) |             onTriggered: awActions.checkUpdates(true) | ||||||
|             message += "<br>" |  | ||||||
|             message += i18n("Info: %1", awKeys.infoByKey(tag)) |  | ||||||
|             awActions.sendNotification("tag", message) |  | ||||||
|         } |  | ||||||
|         } |         } | ||||||
|  |     ] | ||||||
|  |  | ||||||
|  |  | ||||||
|     Component.onCompleted: { |     Component.onCompleted: { | ||||||
|         if (debug) console.debug() |  | ||||||
|  |  | ||||||
|         // actions |  | ||||||
|         // it makes no sense to use this field with optimization enable |  | ||||||
|         if (!plasmoid.configuration.optimize) |  | ||||||
|             plasmoid.setAction("requestKey", i18n("Request key"), "utilities-system-monitor") |  | ||||||
|         plasmoid.setAction("showReadme", i18n("Show README"), "text-x-readme") |  | ||||||
|         plasmoid.setAction("checkUpdates", i18n("Check updates"), "system-software-update") |  | ||||||
|         plasmoid.setAction("reportBug", i18n("Report bug"), "tools-report-bug") |  | ||||||
|         // init submodule |         // init submodule | ||||||
|         Plasmoid.userConfiguringChanged(false) |         Plasmoid.userConfiguringChanged(false) | ||||||
|         // connect data |         // connect data | ||||||
| @ -160,32 +135,26 @@ Item { | |||||||
|         if (plasmoid.configuration.checkUpdates) return awActions.checkUpdates(false) |         if (plasmoid.configuration.checkUpdates) return awActions.checkUpdates(false) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     onNeedTextUpdate: { |     onNeedTextUpdate: newText => { | ||||||
|         if (debug) console.debug() |  | ||||||
|  |  | ||||||
|         text.text = newText |         text.text = newText | ||||||
|         sizeUpdate() |         sizeUpdate() | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     onNeedToolTipUpdate: { |     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 { | ||||||
| @ -196,12 +165,10 @@ Item { | |||||||
|  |  | ||||||
|     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) | ||||||
| @ -210,49 +177,8 @@ Item { | |||||||
|         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); |  | ||||||
|         }); |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -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 |  | ||||||
| @ -15,25 +15,16 @@ | |||||||
|  *   along with awesome-widgets. If not, see http://www.gnu.org/licenses/  * |  *   along with awesome-widgets. If not, see http://www.gnu.org/licenses/  * | ||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.0 | import QtQuick 2.15 | ||||||
| import QtQuick.Controls 1.3 as QtControls | import QtQuick.Controls | ||||||
|  | import org.kde.kcmutils as KCM | ||||||
|  |  | ||||||
| import org.kde.plasma.private.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 | ||||||
| @ -46,18 +37,17 @@ Item { | |||||||
|     property alias cfg_memTooltipColor: memTooltipColor.value |     property alias cfg_memTooltipColor: memTooltipColor.value | ||||||
|     property alias cfg_swapTooltip: swapTooltip.checked |     property alias cfg_swapTooltip: swapTooltip.checked | ||||||
|     property alias cfg_swapTooltipColor: swapTooltipColor.value |     property alias cfg_swapTooltipColor: swapTooltipColor.value | ||||||
|     property alias cfg_downkbTooltip: downkbTooltip.checked |     property alias cfg_downkbTooltip: networkTooltip.checked | ||||||
|     property alias cfg_downkbTooltipColor: downkbTooltipColor.value |     property alias cfg_downkbTooltipColor: downkbTooltipColor.value | ||||||
|     property alias cfg_upkbTooltipColor: upkbTooltipColor.value |     property alias cfg_upkbTooltipColor: upkbTooltipColor.value | ||||||
|     property alias cfg_batTooltip: batTooltip.checked |     property alias cfg_batTooltip: batTooltip.checked | ||||||
|     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 | ||||||
|         QtControls.Label { |  | ||||||
|  |         Label { | ||||||
|           width: parent.width |           width: parent.width | ||||||
|           horizontalAlignment: Text.AlignHCenter |           horizontalAlignment: Text.AlignHCenter | ||||||
|           verticalAlignment: Text.AlignVCenter |           verticalAlignment: Text.AlignVCenter | ||||||
| @ -74,85 +64,116 @@ Item { | |||||||
|             value: plasmoid.configuration.tooltipNumber |             value: plasmoid.configuration.tooltipNumber | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         QtControls.GroupBox { |         GroupBox { | ||||||
|             id: useTooltipBackground |             id: useTooltipBackground | ||||||
|             height: implicitHeight |  | ||||||
|             width: parent.width |             width: parent.width | ||||||
|             checkable: true |  | ||||||
|             title: i18n("Background") |             property alias checked: useTooltipBackgroundLabel.checked | ||||||
|  |             label: CheckBox { | ||||||
|  |                 id: useTooltipBackgroundLabel | ||||||
|  |                 text: i18n("Background") | ||||||
|  |             } | ||||||
|  |  | ||||||
|             ColorSelector { |             ColorSelector { | ||||||
|                 id: tooltipBackground |                 id: tooltipBackground | ||||||
|  |                 enabled: useTooltipBackgroundLabel.checked | ||||||
|                 text: i18n("Background color") |                 text: i18n("Background color") | ||||||
|                 value: plasmoid.configuration.tooltipBackground |                 value: plasmoid.configuration.tooltipBackground | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         QtControls.GroupBox { |         GroupBox { | ||||||
|             id: cpuTooltip |             id: cpuTooltip | ||||||
|             height: implicitHeight |  | ||||||
|             width: parent.width |             width: parent.width | ||||||
|             checkable: true |  | ||||||
|             title: i18n("CPU") |             property alias checked: cpuTooltipLabel.checked | ||||||
|  |             label: CheckBox { | ||||||
|  |                 id: cpuTooltipLabel | ||||||
|  |                 text: i18n("CPU") | ||||||
|  |             } | ||||||
|  |  | ||||||
|             ColorSelector { |             ColorSelector { | ||||||
|                 id: cpuTooltipColor |                 id: cpuTooltipColor | ||||||
|  |                 enabled: cpuTooltipLabel.checked | ||||||
|                 text: i18n("CPU color") |                 text: i18n("CPU color") | ||||||
|                 value: plasmoid.configuration.cpuTooltipColor |                 value: plasmoid.configuration.cpuTooltipColor | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         QtControls.GroupBox { |         GroupBox { | ||||||
|             id: cpuclTooltip |             id: cpuclTooltip | ||||||
|             height: implicitHeight |  | ||||||
|             width: parent.width |             width: parent.width | ||||||
|             checkable: true |  | ||||||
|             title: i18n("CPU clock") |             property alias checked: cpuclTooltipLabel.checked | ||||||
|  |             label: CheckBox { | ||||||
|  |                 id: cpuclTooltipLabel | ||||||
|  |                 text: i18n("CPU clock") | ||||||
|  |             } | ||||||
|  |  | ||||||
|             ColorSelector { |             ColorSelector { | ||||||
|                 id: cpuclTooltipColor |                 id: cpuclTooltipColor | ||||||
|  |                 enabled: cpuclTooltipLabel.checked | ||||||
|                 text: i18n("CPU clock color") |                 text: i18n("CPU clock color") | ||||||
|                 value: plasmoid.configuration.cpuclTooltipColor |                 value: plasmoid.configuration.cpuclTooltipColor | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         QtControls.GroupBox { |         GroupBox { | ||||||
|             id: memTooltip |             id: memTooltip | ||||||
|             height: implicitHeight |  | ||||||
|             width: parent.width |             width: parent.width | ||||||
|             checkable: true |  | ||||||
|             title: i18n("Memory") |             property alias checked: memTooltipLabel.checked | ||||||
|  |             label: CheckBox { | ||||||
|  |                 id: memTooltipLabel | ||||||
|  |                 text: i18n("Memory") | ||||||
|  |             } | ||||||
|  |  | ||||||
|             ColorSelector { |             ColorSelector { | ||||||
|                 id: memTooltipColor |                 id: memTooltipColor | ||||||
|  |                 enabled: memTooltipLabel.checked | ||||||
|                 text: i18n("Memory color") |                 text: i18n("Memory color") | ||||||
|                 value: plasmoid.configuration.memTooltipColor |                 value: plasmoid.configuration.memTooltipColor | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         QtControls.GroupBox { |         GroupBox { | ||||||
|             id: swapTooltip |             id: swapTooltip | ||||||
|             height: implicitHeight |  | ||||||
|             width: parent.width |             width: parent.width | ||||||
|             checkable: true |  | ||||||
|             title: i18n("Swap") |             property alias checked: swapTooltipLabel.checked | ||||||
|  |             label: CheckBox { | ||||||
|  |                 id: swapTooltipLabel | ||||||
|  |                 text: i18n("Swap") | ||||||
|  |             } | ||||||
|  |  | ||||||
|             ColorSelector { |             ColorSelector { | ||||||
|                 id: swapTooltipColor |                 id: swapTooltipColor | ||||||
|  |                 enabled: swapTooltipLabel.checked | ||||||
|                 text: i18n("Swap color") |                 text: i18n("Swap color") | ||||||
|                 value: plasmoid.configuration.swapTooltipColor |                 value: plasmoid.configuration.swapTooltipColor | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         QtControls.GroupBox { |         GroupBox { | ||||||
|             id: downkbTooltip |             id: networkTooltip | ||||||
|             height: implicitHeight |  | ||||||
|             width: parent.width |             width: parent.width | ||||||
|             checkable: true |  | ||||||
|             title: i18n("Network") |             property alias checked: networkTooltipLabel.checked | ||||||
|  |             label: CheckBox { | ||||||
|  |                 id: networkTooltipLabel | ||||||
|  |                 text: i18n("Network") | ||||||
|  |             } | ||||||
|  |  | ||||||
|             Column { |             Column { | ||||||
|                 height: implicitHeight |  | ||||||
|                 width: parent.width |                 width: parent.width | ||||||
|  |                 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") | ||||||
| @ -161,20 +182,26 @@ Item { | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         QtControls.GroupBox { |         GroupBox { | ||||||
|             id: batTooltip |             id: batTooltip | ||||||
|             height: implicitHeight |  | ||||||
|             width: parent.width |             width: parent.width | ||||||
|             checkable: true |  | ||||||
|             title: i18n("Battery") |             property alias checked: batteryTooltipLabel.checked | ||||||
|  |             label: CheckBox { | ||||||
|  |                 id: batteryTooltipLabel | ||||||
|  |                 text: i18n("Battery") | ||||||
|  |             } | ||||||
|  |  | ||||||
|             Column { |             Column { | ||||||
|                 height: implicitHeight |  | ||||||
|                 width: parent.width |                 width: parent.width | ||||||
|  |                 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") | ||||||
| @ -183,9 +210,4 @@ Item { | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|     Component.onCompleted: { |  | ||||||
|         if (debug) console.debug() |  | ||||||
|     } |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -15,14 +15,17 @@ | |||||||
|  *   along with awesome-widgets. If not, see http://www.gnu.org/licenses/  * |  *   along with awesome-widgets. If not, see http://www.gnu.org/licenses/  * | ||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
|  |  | ||||||
| import QtQuick 2.2 | 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, | ||||||
| @ -90,9 +81,8 @@ Item { | |||||||
|         awKeys.setAggregatorProperty("translate", plasmoid.configuration.translateStrings) |         awKeys.setAggregatorProperty("translate", plasmoid.configuration.translateStrings) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     onNeedTextUpdate: { |     onNeedTextUpdate: newText => { | ||||||
|         if (lock) return |         if (lock) return | ||||||
|         if (debug) console.debug() |  | ||||||
|  |  | ||||||
|         extensions.showMessage(newText) |         extensions.showMessage(newText) | ||||||
|         lock = true |         lock = true | ||||||
|  | |||||||
| @ -1,28 +0,0 @@ | |||||||
| [Desktop Entry] |  | ||||||
| Encoding=UTF-8 |  | ||||||
| Name=Awesome Widget |  | ||||||
| Comment=A minimalistic Plasmoid |  | ||||||
| Comment[en]=A minimalistic Plasmoid |  | ||||||
| Comment[es]=Un plasmoide minimalista |  | ||||||
| Comment[es]=Un script Plasmoïde minimaliste |  | ||||||
| Comment[pt_BR]=Um script Plasmoid |  | ||||||
| Comment[ru]=Минималистичный плазмоид |  | ||||||
| Comment[uk]=Мінімалістичний плазмоїд |  | ||||||
| X-KDE-ServiceTypes=Plasma/Applet |  | ||||||
| Type=Service |  | ||||||
| Icon=utilities-system-monitor |  | ||||||
|  |  | ||||||
| X-KDE-ServiceTypes=Plasma/Applet |  | ||||||
| X-Plasma-API=declarativeappletscript |  | ||||||
| X-Plasma-MainScript=ui/main.qml |  | ||||||
| X-Plasma-RemoteLocation= |  | ||||||
|  |  | ||||||
| X-KDE-PluginInfo-Author=Evgeniy Alekseev aka arcanis |  | ||||||
| X-KDE-PluginInfo-Email=esalexeev@gmail.com |  | ||||||
| X-KDE-PluginInfo-Name=org.kde.plasma.awesomewidget |  | ||||||
| X-KDE-PluginInfo-Version=3.3.3 |  | ||||||
| X-KDE-PluginInfo-Website=https://arcanis.me/projects/awesome-widgets/ |  | ||||||
| X-KDE-PluginInfo-Category=System Information |  | ||||||
| X-KDE-PluginInfo-Depends= |  | ||||||
| X-KDE-PluginInfo-License=GPLv3 |  | ||||||
| X-KDE-PluginInfo-EnabledByDefault=true |  | ||||||
							
								
								
									
										26
									
								
								sources/awesome-widget/package/metadata.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								sources/awesome-widget/package/metadata.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | |||||||
|  | { | ||||||
|  |     "KPackageStructure": "Plasma/Applet", | ||||||
|  |     "KPlugin": { | ||||||
|  |         "Authors": [ | ||||||
|  |             { | ||||||
|  |                 "Email": "esalexeev@gmail.com", | ||||||
|  |                 "Name": "Evgeniy Alekseev aka arcanis" | ||||||
|  |             } | ||||||
|  |         ], | ||||||
|  |         "Category": "System Information", | ||||||
|  |         "Description": "A minimalistic Plasmoid", | ||||||
|  |         "Description[en]": "A minimalistic Plasmoid", | ||||||
|  |         "Description[es]": "Un script Plasmoïde minimaliste", | ||||||
|  |         "Description[pt_BR]": "Um script Plasmoid", | ||||||
|  |         "Description[ru]": "Минималистичный плазмоид", | ||||||
|  |         "Description[uk]": "Мінімалістичний плазмоїд", | ||||||
|  |         "EnabledByDefault": true, | ||||||
|  |         "Icon": "utilities-system-monitor", | ||||||
|  |         "Id": "org.kde.plasma.awesomewidget", | ||||||
|  |         "License": "GPLv3", | ||||||
|  |         "Name": "Awesome Widget", | ||||||
|  |         "Version": "4.0.0", | ||||||
|  |         "Website": "https://arcanis.me/projects/awesome-widgets/" | ||||||
|  |     }, | ||||||
|  |     "X-Plasma-API-Minimum-Version": "6.0" | ||||||
|  | } | ||||||
| @ -7,17 +7,17 @@ include_directories( | |||||||
|         ${CMAKE_CURRENT_SOURCE_DIR}/../../${PROJECT_LIBRARY}/ |         ${CMAKE_CURRENT_SOURCE_DIR}/../../${PROJECT_LIBRARY}/ | ||||||
|         ${PROJECT_TRDPARTY_DIR} |         ${PROJECT_TRDPARTY_DIR} | ||||||
|         ${Qt_INCLUDE} |         ${Qt_INCLUDE} | ||||||
|         ${Kf5_INCLUDE} |         ${Kf6_INCLUDE} | ||||||
| ) | ) | ||||||
|  |  | ||||||
| file(GLOB SUBPROJECT_SOURCE *.cpp ${PROJECT_TRDPARTY_DIR}/fontdialog/*.cpp ${CMAKE_SOURCE_DIR}/*.cpp) | file(GLOB SUBPROJECT_SOURCE *.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) | ||||||
|  |  | ||||||
| qt5_wrap_ui(SUBPROJECT_UI_HEADER ${SUBPROJECT_UI}) | qt6_wrap_ui(SUBPROJECT_UI_HEADER ${SUBPROJECT_UI}) | ||||||
| add_library(${PLUGIN_NAME} SHARED ${SUBPROJECT_SOURCE} ${SUBPROJECT_UI_HEADER}) | add_library(${PLUGIN_NAME} SHARED ${SUBPROJECT_SOURCE} ${SUBPROJECT_UI_HEADER}) | ||||||
| target_link_libraries(${PLUGIN_NAME} ${PROJECT_LIBRARY} ${Qt_LIBRARIES} ${Kf5_LIBRARIES}) | target_link_libraries(${PLUGIN_NAME} ${PROJECT_LIBRARY} ${Qt_LIBRARIES} ${Kf6_LIBRARIES}) | ||||||
|  |  | ||||||
| install(TARGETS ${PLUGIN_NAME} DESTINATION ${QML_INSTALL_DIR}/org/kde/plasma/private/awesomewidget) | install(TARGETS ${PLUGIN_NAME} DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/plasma/private/awesomewidget) | ||||||
| install(FILES qmldir DESTINATION ${QML_INSTALL_DIR}/org/kde/plasma/private/awesomewidget) | install(FILES qmldir DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/plasma/private/awesomewidget) | ||||||
| install(FILES ${SUBPROJECT_NOTIFY} DESTINATION ${KNOTIFYRC_INSTALL_DIR}) | install(FILES ${SUBPROJECT_NOTIFY} DESTINATION ${KDE_INSTALL_KNOTIFYRCDIR}) | ||||||
|  | |||||||
| @ -21,31 +21,29 @@ | |||||||
| #include <KI18n/KLocalizedString> | #include <KI18n/KLocalizedString> | ||||||
|  |  | ||||||
| #include <QPushButton> | #include <QPushButton> | ||||||
|  | #include <utility> | ||||||
|  |  | ||||||
| #include "awabstractselector.h" | #include "awabstractselector.h" | ||||||
| #include "awdebug.h" | #include "awdebug.h" | ||||||
|  |  | ||||||
|  |  | ||||||
| AWAbstractPairConfig::AWAbstractPairConfig(QWidget *_parent, | AWAbstractPairConfig::AWAbstractPairConfig(QWidget *_parent, const bool _hasEdit, QStringList _keys) | ||||||
|                                            const bool _hasEdit, |  | ||||||
|                                            const QStringList &_keys) |  | ||||||
|     : QDialog(_parent) |     : QDialog(_parent) | ||||||
|     , ui(new Ui::AWAbstractPairConfig) |     , ui(new Ui::AWAbstractPairConfig) | ||||||
|     , m_hasEdit(_hasEdit) |     , m_hasEdit(_hasEdit) | ||||||
|     , m_keys(_keys) |     , m_keys(std::move(_keys)) | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << __PRETTY_FUNCTION__; |     qCDebug(LOG_AW) << __PRETTY_FUNCTION__; | ||||||
|  |  | ||||||
|     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"), |         m_editButton = ui->buttonBox->addButton(i18n("Edit"), QDialogButtonBox::ActionRole); | ||||||
|                                                 QDialogButtonBox::ActionRole); |         connect(m_editButton, &QPushButton::clicked, [this]() { return edit(); }); | ||||||
|         connect(m_editButton, SIGNAL(clicked(bool)), this, SLOT(edit())); |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| @ -60,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 | ||||||
| @ -86,16 +90,14 @@ void AWAbstractPairConfig::edit() | |||||||
|  |  | ||||||
| void AWAbstractPairConfig::updateUi() | void AWAbstractPairConfig::updateUi() | ||||||
| { | { | ||||||
|     QPair<QString, QString> current |     auto current = dynamic_cast<AWAbstractSelector *>(sender())->current(); | ||||||
|         = static_cast<AWAbstractSelector *>(sender())->current(); |     auto index = m_selectors.indexOf(dynamic_cast<AWAbstractSelector *>(sender())); | ||||||
|     int index |  | ||||||
|         = m_selectors.indexOf(static_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 { | ||||||
| @ -108,27 +110,23 @@ void AWAbstractPairConfig::updateUi() | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void AWAbstractPairConfig::addSelector(const QStringList &_keys, | void AWAbstractPairConfig::addSelector(const QStringList &_keys, const QStringList &_values, | ||||||
|                                        const QStringList &_values, |  | ||||||
|                                        const QPair<QString, QString> &_current) |                                        const QPair<QString, QString> &_current) | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Add selector with keys" << _keys << "values" << _values |     qCDebug(LOG_AW) << "Add selector with keys" << _keys << "values" << _values << "and current ones" << _current; | ||||||
|                     << "and current ones" << _current; |  | ||||||
|  |  | ||||||
|     AWAbstractSelector *selector |     auto selector = new AWAbstractSelector(ui->scrollAreaWidgetContents, m_editable); | ||||||
|         = 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, |         disconnect(selector, &AWAbstractSelector::selectionChanged, this, &AWAbstractPairConfig::updateUi); | ||||||
|                    SLOT(updateUi())); |  | ||||||
|         ui->verticalLayout->removeWidget(selector); |         ui->verticalLayout->removeWidget(selector); | ||||||
|         selector->deleteLater(); |         selector->deleteLater(); | ||||||
|     } |     } | ||||||
| @ -138,25 +136,27 @@ 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; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // save configuration if required |     // save configuration if required | ||||||
|  |     auto status = true; | ||||||
|     switch (ret) { |     switch (ret) { | ||||||
|     case 0: |     case 0: | ||||||
|         break; |         break; | ||||||
|     case 1: |     case 1: | ||||||
|     default: |     default: | ||||||
|         m_helper->writeItems(data); |         status &= m_helper->writeItems(data); | ||||||
|         m_helper->removeUnusedKeys(data.keys()); |         status &= m_helper->removeUnusedKeys(data.keys()); | ||||||
|         break; |         break; | ||||||
|     } |     } | ||||||
|  |     qCDebug(LOG_AW) << "Configuration save status" << status; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -166,12 +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 |     right.append(m_helper->rightKeys().isEmpty() ? m_keys : m_helper->rightKeys()); | ||||||
|                                                  : m_helper->rightKeys()); |  | ||||||
|     right.sort(); |     right.sort(); | ||||||
|  |  | ||||||
|     return QPair<QStringList, QStringList>(left, right); |     return {left, right}; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -182,8 +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, |         addSelector(keys.first, keys.second, {key, pairs[key]}); | ||||||
|                     QPair<QString, QString>(key, m_helper->pairs()[key])); |  | ||||||
|     // empty one |     // empty one | ||||||
|     addSelector(keys.first, keys.second, QPair<QString, QString>()); |     addSelector(keys.first, keys.second, {}); | ||||||
| } | } | ||||||
|  | |||||||
| @ -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,19 +33,12 @@ class AWAbstractPairConfig : public QDialog | |||||||
|     Q_OBJECT |     Q_OBJECT | ||||||
|  |  | ||||||
| public: | public: | ||||||
|     explicit AWAbstractPairConfig(QWidget *_parent = nullptr, |     explicit AWAbstractPairConfig(QWidget *_parent = nullptr, bool _hasEdit = false, QStringList _keys = {}); | ||||||
|                                   const bool _hasEdit = false, |     ~AWAbstractPairConfig() override; | ||||||
|                                   const QStringList &_keys = QStringList()); |     void setHelper(std::unique_ptr<AWAbstractPairHelper> _helper); | ||||||
|     virtual ~AWAbstractPairConfig(); |  | ||||||
|     template <class T> void initHelper() |  | ||||||
|     { |  | ||||||
|         if (m_helper) |  | ||||||
|             delete m_helper; |  | ||||||
|         m_helper = new T(this); |  | ||||||
|     } |  | ||||||
|     void showDialog(); |     void showDialog(); | ||||||
|     // properties |     // properties | ||||||
|     void setEditable(const bool _first, const bool _second); |     void setEditable(bool _first, bool _second); | ||||||
|  |  | ||||||
| private slots: | private slots: | ||||||
|     void edit(); |     void edit(); | ||||||
| @ -56,20 +47,16 @@ 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}; | ||||||
|     bool m_hasEdit = false; |     bool m_hasEdit = false; | ||||||
|     QStringList m_keys; |     QStringList m_keys; | ||||||
|     // methods |     // methods | ||||||
|     void addSelector(const QStringList &_keys, const QStringList &_values, |     void addSelector(const QStringList &_keys, const QStringList &_values, const QPair<QString, QString> &_current); | ||||||
|                      const QPair<QString, QString> &_current); |  | ||||||
|     void clearSelectors(); |     void clearSelectors(); | ||||||
|     void execDialog(); |     void execDialog(); | ||||||
|     QPair<QStringList, QStringList> initKeys() const; |     [[nodiscard]] QPair<QStringList, QStringList> initKeys() const; | ||||||
|     void updateDialog(); |     void updateDialog(); | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif /* AWABSTRACTPAIRCONFIG_H */ |  | ||||||
|  | |||||||
| @ -19,24 +19,18 @@ | |||||||
|  |  | ||||||
| #include <QSettings> | #include <QSettings> | ||||||
| #include <QStandardPaths> | #include <QStandardPaths> | ||||||
|  | #include <utility> | ||||||
|  |  | ||||||
| #include "awdebug.h" | #include "awdebug.h" | ||||||
|  |  | ||||||
|  |  | ||||||
| AWAbstractPairHelper::AWAbstractPairHelper(const QString &_filePath, | AWAbstractPairHelper::AWAbstractPairHelper(QString _filePath, QString _section) | ||||||
|                                            const QString &_section) |     : m_filePath(std::move(_filePath)) | ||||||
|     : m_filePath(_filePath) |     , m_section(std::move(_section)) | ||||||
|     , m_section(_section) |  | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << __PRETTY_FUNCTION__; |     qCDebug(LOG_AW) << __PRETTY_FUNCTION__; | ||||||
|  |  | ||||||
|     initItems(); |     AWAbstractPairHelper::initItems(); | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| AWAbstractPairHelper::~AWAbstractPairHelper() |  | ||||||
| { |  | ||||||
|     qCDebug(LOG_AW) << __PRETTY_FUNCTION__; |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -58,23 +52,28 @@ QStringList AWAbstractPairHelper::values() const | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | QSet<QString> AWAbstractPairHelper::valuesSet() const | ||||||
|  | { | ||||||
|  |     auto values = m_pairs.values(); | ||||||
|  |     return {values.cbegin(), values.cend()}; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void AWAbstractPairHelper::initItems() | void AWAbstractPairHelper::initItems() | ||||||
| { | { | ||||||
|     m_pairs.clear(); |     m_pairs.clear(); | ||||||
|  |  | ||||||
|     QStringList configs = QStandardPaths::locateAll( |     auto configs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, m_filePath); | ||||||
|         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" |             qCInfo(LOG_AW) << "Found key" << key << "for value" << value << "in" << settings.fileName(); | ||||||
|                            << settings.fileName(); |  | ||||||
|             if (value.isEmpty()) { |             if (value.isEmpty()) { | ||||||
|                 qCInfo(LOG_AW) << "Skip empty value for" << key; |                 qCInfo(LOG_AW) << "Skip empty value for" << key; | ||||||
|                 continue; |                 continue; | ||||||
| @ -86,15 +85,12 @@ void AWAbstractPairHelper::initItems() | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| bool AWAbstractPairHelper::writeItems( | bool AWAbstractPairHelper::writeItems(const QHash<QString, QString> &_configuration) const | ||||||
|     const QHash<QString, QString> &_configuration) const |  | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Write configuration" << _configuration; |     qCDebug(LOG_AW) << "Write configuration" << _configuration; | ||||||
|  |  | ||||||
|     QString fileName = QString("%1/%2") |     auto fileName | ||||||
|                            .arg(QStandardPaths::writableLocation( |         = QString("%1/%2").arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation), m_filePath); | ||||||
|                                QStandardPaths::GenericDataLocation)) |  | ||||||
|                            .arg(m_filePath); |  | ||||||
|     QSettings settings(fileName, QSettings::IniFormat); |     QSettings settings(fileName, QSettings::IniFormat); | ||||||
|     qCInfo(LOG_AW) << "Configuration file" << fileName; |     qCInfo(LOG_AW) << "Configuration file" << fileName; | ||||||
|  |  | ||||||
| @ -105,7 +101,7 @@ bool AWAbstractPairHelper::writeItems( | |||||||
|  |  | ||||||
|     settings.sync(); |     settings.sync(); | ||||||
|  |  | ||||||
|     return (settings.status() == QSettings::NoError); |     return settings.status() == QSettings::NoError; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -113,16 +109,13 @@ bool AWAbstractPairHelper::removeUnusedKeys(const QStringList &_keys) const | |||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Remove keys" << _keys; |     qCDebug(LOG_AW) << "Remove keys" << _keys; | ||||||
|  |  | ||||||
|     QString fileName = QString("%1/%2") |     auto fileName | ||||||
|                            .arg(QStandardPaths::writableLocation( |         = QString("%1/%2").arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation), m_filePath); | ||||||
|                                QStandardPaths::GenericDataLocation)) |  | ||||||
|                            .arg(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; | ||||||
| } | } | ||||||
| @ -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> | ||||||
|  |  | ||||||
| @ -25,17 +23,16 @@ | |||||||
| class AWAbstractPairHelper | class AWAbstractPairHelper | ||||||
| { | { | ||||||
| public: | public: | ||||||
|     explicit AWAbstractPairHelper(const QString &_filePath = "", |     explicit AWAbstractPairHelper(QString _filePath = "", QString _section = ""); | ||||||
|                                   const QString &_section = ""); |     virtual ~AWAbstractPairHelper() = default; | ||||||
|     virtual ~AWAbstractPairHelper(); |     [[nodiscard]] QStringList keys() const; | ||||||
|     QStringList keys() const; |     [[nodiscard]] QHash<QString, QString> pairs() const; | ||||||
|     QHash<QString, QString> pairs() const; |     [[nodiscard]] QStringList values() const; | ||||||
|     QStringList values() const; |     [[nodiscard]] QSet<QString> valuesSet() const; | ||||||
|     // read-write methods |     // read-write methods | ||||||
|     virtual void initItems(); |     virtual void initItems(); | ||||||
|     virtual bool |     [[nodiscard]] virtual bool writeItems(const QHash<QString, QString> &_configuration) const; | ||||||
|     writeItems(const QHash<QString, QString> &_configuration) const; |     [[nodiscard]] virtual bool removeUnusedKeys(const QStringList &_keys) const; | ||||||
|     virtual bool removeUnusedKeys(const QStringList &_keys) const; |  | ||||||
|     // configuration related |     // configuration related | ||||||
|     virtual void editPairs() = 0; |     virtual void editPairs() = 0; | ||||||
|     virtual QStringList leftKeys() = 0; |     virtual QStringList leftKeys() = 0; | ||||||
| @ -47,6 +44,3 @@ private: | |||||||
|     QString m_filePath; |     QString m_filePath; | ||||||
|     QString m_section; |     QString m_section; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif /* AWABSTRACTPAIRHELPER_H */ |  | ||||||
|  | |||||||
| @ -21,8 +21,7 @@ | |||||||
| #include "awdebug.h" | #include "awdebug.h" | ||||||
|  |  | ||||||
|  |  | ||||||
| AWAbstractSelector::AWAbstractSelector(QWidget *_parent, | AWAbstractSelector::AWAbstractSelector(QWidget *_parent, const QPair<bool, bool> &_editable) | ||||||
|                                        const QPair<bool, bool> &_editable) |  | ||||||
|     : QWidget(_parent) |     : QWidget(_parent) | ||||||
|     , ui(new Ui::AWAbstractSelector) |     , ui(new Ui::AWAbstractSelector) | ||||||
| { | { | ||||||
| @ -32,10 +31,8 @@ AWAbstractSelector::AWAbstractSelector(QWidget *_parent, | |||||||
|     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, |     connect(ui->comboBox_key, &QComboBox::currentIndexChanged, this, &AWAbstractSelector::selectionChanged); | ||||||
|             SIGNAL(selectionChanged())); |     connect(ui->comboBox_value, &QComboBox::currentIndexChanged, this, &AWAbstractSelector::selectionChanged); | ||||||
|     connect(ui->comboBox_value, SIGNAL(currentIndexChanged(int)), this, |  | ||||||
|             SIGNAL(selectionChanged())); |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -49,25 +46,22 @@ 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}; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void AWAbstractSelector::init(const QStringList &_keys, | void AWAbstractSelector::init(const QStringList &_keys, const QStringList &_values, | ||||||
|                               const QStringList &_values, |  | ||||||
|                               const QPair<QString, QString> &_current) |                               const QPair<QString, QString> &_current) | ||||||
| { | { | ||||||
|     if ((!_keys.contains(_current.first)) |     if ((!_keys.contains(_current.first)) || (!_values.contains(_current.second))) { | ||||||
|         || (!_values.contains(_current.second))) { |         qCWarning(LOG_AW) << "Invalid current value" << _current << "not found in default ones"; | ||||||
|         qCWarning(LOG_AW) << "Invalid current value" << _current |  | ||||||
|                           << "not found in default ones"; |  | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|     qCDebug(LOG_AW) << "Init selector with keys" << _keys << "and values" |     qCDebug(LOG_AW) << "Init selector with keys" << _keys << "and values" << _values << "and current ones are" | ||||||
|                     << _values << "and current ones are" << _current; |                     << _current; | ||||||
|  |  | ||||||
|     // set data |     // set data | ||||||
|     ui->comboBox_key->clear(); |     ui->comboBox_key->clear(); | ||||||
|  | |||||||
| @ -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> | ||||||
|  |  | ||||||
| @ -32,13 +30,10 @@ class AWAbstractSelector : public QWidget | |||||||
|     Q_OBJECT |     Q_OBJECT | ||||||
|  |  | ||||||
| public: | public: | ||||||
|     explicit AWAbstractSelector(QWidget *_parent = nullptr, |     explicit AWAbstractSelector(QWidget *_parent = nullptr, const QPair<bool, bool> &_editable = {false, false}); | ||||||
|                                 const QPair<bool, bool> &_editable |     ~AWAbstractSelector() override; | ||||||
|                                 = {false, false}); |     [[nodiscard]] QPair<QString, QString> current() const; | ||||||
|     virtual ~AWAbstractSelector(); |     void init(const QStringList &_keys, const QStringList &_values, const QPair<QString, QString> &_current); | ||||||
|     QPair<QString, QString> current() const; |  | ||||||
|     void init(const QStringList &_keys, const QStringList &_values, |  | ||||||
|               const QPair<QString, QString> &_current); |  | ||||||
|  |  | ||||||
| signals: | signals: | ||||||
|     void selectionChanged(); |     void selectionChanged(); | ||||||
| @ -46,6 +41,3 @@ signals: | |||||||
| private: | private: | ||||||
|     Ui::AWAbstractSelector *ui = nullptr; |     Ui::AWAbstractSelector *ui = nullptr; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif /* AWABSTRACTSELECTOR_H */ |  | ||||||
|  | |||||||
| @ -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; | ||||||
| @ -55,64 +49,41 @@ void AWActions::checkUpdates(const bool _showAnyway) | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| QString AWActions::getFileContent(const QString &_path) const | QString AWActions::getFileContent(const QString &_path) | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Get content from file" << _path; |     qCDebug(LOG_AW) << "Get content from file" << _path; | ||||||
|  |  | ||||||
|     QFile inputFile(_path); |     QFile inputFile(_path); | ||||||
|     if (!inputFile.open(QIODevice::ReadOnly | QIODevice::Text)) { |     if (!inputFile.open(QIODevice::ReadOnly | QIODevice::Text)) { | ||||||
|         qCWarning(LOG_AW) << "Could not open file as text" |         qCWarning(LOG_AW) << "Could not open file as text" << inputFile.fileName(); | ||||||
|                           << inputFile.fileName(); |  | ||||||
|         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::runCmd(const QString &_cmd, const QStringList &_args) | ||||||
| bool AWActions::isDebugEnabled() const |  | ||||||
| { | { | ||||||
|     return LOG_AW().isDebugEnabled(); |     qCDebug(LOG_AW) << "Cmd" << _cmd << "args" << _args; | ||||||
| } |  | ||||||
|  |  | ||||||
|  |     sendNotification("system", i18n("Run %1", _cmd)); | ||||||
|  |  | ||||||
| bool AWActions::runCmd(const QString &_cmd) const |     return QProcess::startDetached(_cmd, _args); | ||||||
| { |  | ||||||
|     qCDebug(LOG_AW) << "Cmd" << _cmd; |  | ||||||
|  |  | ||||||
|     sendNotification(QString("Info"), i18n("Run %1", _cmd)); |  | ||||||
|  |  | ||||||
|     return QProcess::startDetached(_cmd); |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| // HACK: this method uses variable from version.h | // HACK: this method uses variable from version.h | ||||||
| void AWActions::showReadme() const | void AWActions::showReadme() | ||||||
| { | { | ||||||
|     QDesktopServices::openUrl(QUrl(HOMEPAGE)); |     QDesktopServices::openUrl(QUrl(HOMEPAGE)); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void AWActions::showLegacyInfo() const |  | ||||||
| { |  | ||||||
|     QMessageBox *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) const | QString AWActions::getAboutText(const QString &_type) | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Type" << _type; |     qCDebug(LOG_AW) << "Type" << _type; | ||||||
|  |  | ||||||
| @ -120,17 +91,15 @@ QString AWActions::getAboutText(const QString &_type) const | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| QVariantMap AWActions::getFont(const QVariantMap &_defaultFont) const | 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 |     auto defaultCFont = CFont(_defaultFont["family"].toString(), _defaultFont["size"].toInt(), 400, false, | ||||||
|         = CFont(_defaultFont["family"].toString(), _defaultFont["size"].toInt(), |                               _defaultFont["color"].toString()); | ||||||
|                 400, false, _defaultFont["color"].toString()); |     auto font = CFontDialog::getFont(i18n("Select font"), defaultCFont, false, false, &ret); | ||||||
|     CFont 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,13 +111,10 @@ QVariantMap AWActions::getFont(const QVariantMap &_defaultFont) const | |||||||
|  |  | ||||||
|  |  | ||||||
| // to avoid additional object definition this method is static | // to avoid additional object definition this method is static | ||||||
| void AWActions::sendNotification(const QString &_eventId, | void AWActions::sendNotification(const QString &_eventId, const QString &_message) | ||||||
|                                  const QString &_message) |  | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Event" << _eventId << "with message" << _message; |     qCDebug(LOG_AW) << "Event" << _eventId << "with message" << _message; | ||||||
|  |  | ||||||
|     KNotification *notification = KNotification::event( |     auto event = KNotification::event(_eventId, QString("Awesome Widget ::: %1").arg(_eventId), _message); | ||||||
|         _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"); |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -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,24 +29,18 @@ class AWActions : public QObject | |||||||
|  |  | ||||||
| public: | public: | ||||||
|     explicit AWActions(QObject *_parent = nullptr); |     explicit AWActions(QObject *_parent = nullptr); | ||||||
|     virtual ~AWActions(); |     ~AWActions() override = default; | ||||||
|     Q_INVOKABLE void checkUpdates(const bool _showAnyway = false); |     Q_INVOKABLE void checkUpdates(bool _showAnyway = false); | ||||||
|     Q_INVOKABLE QString getFileContent(const QString &_path) const; |     Q_INVOKABLE static QString getFileContent(const QString &_path); | ||||||
|     Q_INVOKABLE bool isDebugEnabled() const; |     Q_INVOKABLE static bool runCmd(const QString &_cmd, const QStringList &_args); | ||||||
|     Q_INVOKABLE bool runCmd(const QString &_cmd) const; |     Q_INVOKABLE static void showReadme(); | ||||||
|     Q_INVOKABLE void showLegacyInfo() const; |  | ||||||
|     Q_INVOKABLE void showReadme() const; |  | ||||||
|     // configuration slots |     // configuration slots | ||||||
|     Q_INVOKABLE QString getAboutText(const QString &_type) const; |     Q_INVOKABLE static QString getAboutText(const QString &_type); | ||||||
|     Q_INVOKABLE QVariantMap getFont(const QVariantMap &_defaultFont) const; |     Q_INVOKABLE static QVariantMap getFont(const QVariantMap &_defaultFont); | ||||||
|  |  | ||||||
| public slots: | public slots: | ||||||
|     Q_INVOKABLE static void sendNotification(const QString &_eventId, |     Q_INVOKABLE static void sendNotification(const QString &_eventId, const QString &_message); | ||||||
|                                              const QString &_message); |  | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     AWUpdateHelper *m_updateHelper = nullptr; |     AWUpdateHelper *m_updateHelper = nullptr; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif /* AWACTIONS_H */ |  | ||||||
|  | |||||||
| @ -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,39 +33,39 @@ 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, |     connect(this, &AWBugReporter::replyReceived, this, &AWBugReporter::showInformation); | ||||||
|             SLOT(showInformation(const int, const QString &))); |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| QString AWBugReporter::generateText(const QString &_description, | QString AWBugReporter::generateText(const QString &_description, const QString &_reproduce, const QString &_expected, | ||||||
|                                     const QString &_reproduce, |                                     const QString &_logs) | ||||||
|                                     const QString &_expected, |  | ||||||
|                                     const QString &_logs) const |  | ||||||
| { | { | ||||||
|     // do not log _logs here, it may have quite large size |     // do not log _logs here, it may have quite large size | ||||||
|     qCDebug(LOG_AW) << "Generate text with description" << _description |     qCDebug(LOG_AW) << "Generate text with description" << _description << "steps" << _reproduce | ||||||
|                     << "steps" << _reproduce << "and expected result" |                     << "and expected result" << _expected; | ||||||
|                     << _expected; |  | ||||||
|  |  | ||||||
|     QString output; |     QString output; | ||||||
|     output += QString("**Description**\n\n%1\n\n").arg(_description); |     output += QString("**Description**\n\n%1\n\n").arg(_description); | ||||||
|     output += QString("**Step to _reproduce**\n\n%1\n\n").arg(_reproduce); |     output += QString("**Step to _reproduce**\n\n%1\n\n").arg(_reproduce); | ||||||
|     output += QString("**Expected result**\n\n%1\n\n").arg(_expected); |     output += QString("**Expected result**\n\n%1\n\n").arg(_expected); | ||||||
|     output += QString("**Version**\n\n%1\n\n") |     output += QString("**Version**\n\n%1\n\n").arg(AWDebug::getBuildData().join(QString("\n"))); | ||||||
|                   .arg(AWDebug::getBuildData().join(QString("\n"))); |  | ||||||
|     // append _logs |     // append _logs | ||||||
|     output += QString("**Logs**\n\n%1").arg(_logs); |     output += QString("**Logs**\n\n%1").arg(_logs); | ||||||
|  |  | ||||||
| @ -74,41 +75,34 @@ QString AWBugReporter::generateText(const QString &_description, | |||||||
|  |  | ||||||
| void AWBugReporter::sendBugReport(const QString &_title, const QString &_body) | void AWBugReporter::sendBugReport(const QString &_title, const QString &_body) | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Send bug report with title" << _title << "and body" |     qCDebug(LOG_AW) << "Send bug report with title" << _title << "and body" << _body; | ||||||
|                     << _body; |  | ||||||
|  |  | ||||||
|     QNetworkAccessManager *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 |     auto data = QJsonDocument::fromVariant(payload).toJson(QJsonDocument::Compact); | ||||||
|         = 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() |         qCWarning(LOG_AW) << "An error occurs" << _reply->error() << "with message" << _reply->errorString(); | ||||||
|                           << "with message" << _reply->errorString(); |  | ||||||
|         return emit(replyReceived(0, "")); |         return emit(replyReceived(0, "")); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     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, "")); | ||||||
| @ -116,46 +110,30 @@ 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" |     qCDebug(LOG_AW) << "Created issue with number" << _number << "and url" << _url; | ||||||
|                     << _url; |  | ||||||
|  |  | ||||||
|     // cache url first |     // cache url first | ||||||
|     m_lastBugUrl = _url; |     m_lastBugUrl = _url; | ||||||
|  |  | ||||||
|     QMessageBox *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 |  | ||||||
|         = static_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; |  | ||||||
|     } |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -15,14 +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 AWBUGREPORTER_H |  | ||||||
| #define AWBUGREPORTER_H |  | ||||||
|  |  | ||||||
| #include <QObject> | #include <QObject> | ||||||
|  |  | ||||||
|  |  | ||||||
| class QAbstractButton; | class QNetworkAccessManager; | ||||||
| class QNetworkReply; | class QNetworkReply; | ||||||
|  |  | ||||||
| class AWBugReporter : public QObject | class AWBugReporter : public QObject | ||||||
| @ -31,25 +29,21 @@ class AWBugReporter : public QObject | |||||||
|  |  | ||||||
| public: | public: | ||||||
|     explicit AWBugReporter(QObject *_parent = nullptr); |     explicit AWBugReporter(QObject *_parent = nullptr); | ||||||
|     virtual ~AWBugReporter(); |     ~AWBugReporter() override; | ||||||
|     Q_INVOKABLE void doConnect(); |     Q_INVOKABLE void doConnect() const; | ||||||
|     Q_INVOKABLE QString generateText(const QString &_description, |     Q_INVOKABLE static QString generateText(const QString &_description, const QString &_reproduce, | ||||||
|                                      const QString &_reproduce, |                                             const QString &_expected, const QString &_logs); | ||||||
|                                      const QString &_expected, |  | ||||||
|                                      const QString &_logs) const; |  | ||||||
|     Q_INVOKABLE void sendBugReport(const QString &_title, const QString &_body); |     Q_INVOKABLE void sendBugReport(const QString &_title, const QString &_body); | ||||||
|  |  | ||||||
| signals: | signals: | ||||||
|     void replyReceived(const 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 showInformation(const int _number, const QString &_url); |     void openBugReport(); | ||||||
|     void userReplyOnBugReport(QAbstractButton *_button); |     void showInformation(int _number, const QString &_url); | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     QString m_lastBugUrl; |     QString m_lastBugUrl; | ||||||
|  |     QNetworkAccessManager *m_manager = nullptr; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif /* AWBUGREPORTER_H */ |  | ||||||
|  | |||||||
| @ -17,13 +17,10 @@ | |||||||
|  |  | ||||||
| #include "awconfighelper.h" | #include "awconfighelper.h" | ||||||
|  |  | ||||||
| #include <KI18n/KLocalizedString> |  | ||||||
|  |  | ||||||
| #include <QDir> | #include <QDir> | ||||||
| #include <QQmlPropertyMap> | #include <QQmlPropertyMap> | ||||||
| #include <QSettings> | #include <QSettings> | ||||||
| #include <QStandardPaths> | #include <QStandardPaths> | ||||||
| #include <QTextCodec> |  | ||||||
|  |  | ||||||
| #include "awdebug.h" | #include "awdebug.h" | ||||||
|  |  | ||||||
| @ -33,29 +30,19 @@ AWConfigHelper::AWConfigHelper(QObject *_parent) | |||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << __PRETTY_FUNCTION__; |     qCDebug(LOG_AW) << __PRETTY_FUNCTION__; | ||||||
|  |  | ||||||
|     m_baseDir = QString("%1/awesomewidgets") |     m_baseDir = QString("%1/awesomewidgets").arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)); | ||||||
|                     .arg(QStandardPaths::writableLocation( |  | ||||||
|                         QStandardPaths::GenericDataLocation)); |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| AWConfigHelper::~AWConfigHelper() | QString AWConfigHelper::configurationDirectory() | ||||||
| { |  | ||||||
|     qCDebug(LOG_AW) << __PRETTY_FUNCTION__; |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| QString AWConfigHelper::configurationDirectory() const |  | ||||||
| { | { | ||||||
|     // get readable directory |     // get readable directory | ||||||
|     QString localDir = QString("%1/awesomewidgets/configs") |     auto localDir = QString("%1/awesomewidgets/configs") | ||||||
|                            .arg(QStandardPaths::writableLocation( |                         .arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)); | ||||||
|                                QStandardPaths::GenericDataLocation)); |  | ||||||
|  |  | ||||||
|     // create directory and copy files from default settings |     // create directory and copy files from default settings | ||||||
|     QDir localDirectory; |     QDir localDirectory; | ||||||
|     if ((!localDirectory.exists(localDir)) |     if ((!localDirectory.exists(localDir)) && (localDirectory.mkpath(localDir))) { | ||||||
|         && (localDirectory.mkpath(localDir))) { |  | ||||||
|         qCInfo(LOG_AW) << "Created directory" << localDir; |         qCInfo(LOG_AW) << "Created directory" << localDir; | ||||||
|         copyConfigs(localDir); |         copyConfigs(localDir); | ||||||
|     } |     } | ||||||
| @ -64,28 +51,25 @@ QString AWConfigHelper::configurationDirectory() const | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| bool AWConfigHelper::dropCache() const | bool AWConfigHelper::dropCache() | ||||||
| { | { | ||||||
|     QString fileName = QString("%1/awesomewidgets.ndx") |     auto fileName | ||||||
|                            .arg(QStandardPaths::writableLocation( |         = QString("%1/awesomewidgets.ndx").arg(QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation)); | ||||||
|                                QStandardPaths::GenericCacheLocation)); |  | ||||||
|  |  | ||||||
|     return QFile(fileName).remove(); |     return QFile(fileName).remove(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| bool AWConfigHelper::exportConfiguration(QObject *_nativeConfig, | bool AWConfigHelper::exportConfiguration(QObject *_nativeConfig, const QString &_fileName) const | ||||||
|                                          const QString &_fileName) const |  | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Selected filename" << _fileName; |     qCDebug(LOG_AW) << "Selected filename" << _fileName; | ||||||
|  |  | ||||||
|     QSettings settings(_fileName, QSettings::IniFormat); |     QSettings settings(_fileName, QSettings::IniFormat); | ||||||
|     // plasmoid configuration |     // plasmoid configuration | ||||||
|     const QQmlPropertyMap *configuration |     auto configuration = dynamic_cast<const QQmlPropertyMap *>(_nativeConfig); | ||||||
|         = static_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); | ||||||
| @ -94,9 +78,7 @@ bool AWConfigHelper::exportConfiguration(QObject *_nativeConfig, | |||||||
|  |  | ||||||
|     // 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); | ||||||
| @ -106,19 +88,14 @@ bool AWConfigHelper::exportConfiguration(QObject *_nativeConfig, | |||||||
|     // additional files |     // additional files | ||||||
|     settings.beginGroup("json"); |     settings.beginGroup("json"); | ||||||
|     // script filters |     // script filters | ||||||
|     readFile(settings, "filters", |     readFile(settings, "filters", QString("%1/scripts/awesomewidgets-extscripts-filters.json").arg(m_baseDir)); | ||||||
|              QString("%1/scripts/awesomewidgets-extscripts-filters.json") |  | ||||||
|                  .arg(m_baseDir)); |  | ||||||
|     // weather icon settings |     // weather icon settings | ||||||
|     readFile(settings, "weathers", |     readFile(settings, "weathers", QString("%1/weather/awesomewidgets-extweather-ids.json").arg(m_baseDir)); | ||||||
|              QString("%1/weather/awesomewidgets-extweather-ids.json") |  | ||||||
|                  .arg(m_baseDir)); |  | ||||||
|     settings.endGroup(); |     settings.endGroup(); | ||||||
|  |  | ||||||
|     settings.beginGroup("ini"); |     settings.beginGroup("ini"); | ||||||
|     // formatter settings |     // formatter settings | ||||||
|     readFile(settings, "formatters", |     readFile(settings, "formatters", QString("%1/formatters/formatters.ini").arg(m_baseDir)); | ||||||
|              QString("%1/formatters/formatters.ini").arg(m_baseDir)); |  | ||||||
|     // custom keys settings |     // custom keys settings | ||||||
|     readFile(settings, "custom", QString("%1/custom.ini").arg(m_baseDir)); |     readFile(settings, "custom", QString("%1/custom.ini").arg(m_baseDir)); | ||||||
|     settings.endGroup(); |     settings.endGroup(); | ||||||
| @ -130,10 +107,8 @@ bool AWConfigHelper::exportConfiguration(QObject *_nativeConfig, | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| QVariantMap AWConfigHelper::importConfiguration(const QString &_fileName, | QVariantMap AWConfigHelper::importConfiguration(const QString &_fileName, const bool _importPlasmoid, | ||||||
|                                                 const bool _importPlasmoid, |                                                 const bool _importExtensions, const bool _importAdds) const | ||||||
|                                                 const bool _importExtensions, |  | ||||||
|                                                 const bool _importAdds) const |  | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Selected filename" << _fileName; |     qCDebug(LOG_AW) << "Selected filename" << _fileName; | ||||||
|  |  | ||||||
| @ -154,19 +129,14 @@ QVariantMap AWConfigHelper::importConfiguration(const QString &_fileName, | |||||||
|     if (_importAdds) { |     if (_importAdds) { | ||||||
|         settings.beginGroup("json"); |         settings.beginGroup("json"); | ||||||
|         // script filters |         // script filters | ||||||
|         writeFile(settings, "filters", |         writeFile(settings, "filters", QString("%1/scripts/awesomewidgets-extscripts-filters.json").arg(m_baseDir)); | ||||||
|                   QString("%1/scripts/awesomewidgets-extscripts-filters.json") |  | ||||||
|                       .arg(m_baseDir)); |  | ||||||
|         // weather icon settings |         // weather icon settings | ||||||
|         writeFile(settings, "weathers", |         writeFile(settings, "weathers", QString("%1/weather/awesomewidgets-extweather-ids.json").arg(m_baseDir)); | ||||||
|                   QString("%1/weather/awesomewidgets-extweather-ids.json") |  | ||||||
|                       .arg(m_baseDir)); |  | ||||||
|         settings.endGroup(); |         settings.endGroup(); | ||||||
|  |  | ||||||
|         settings.beginGroup("ini"); |         settings.beginGroup("ini"); | ||||||
|         // formatter settings |         // formatter settings | ||||||
|         writeFile(settings, "formatters", |         writeFile(settings, "formatters", QString("%1/formatters/formatters.ini").arg(m_baseDir)); | ||||||
|                   QString("%1/formatters/formatters.ini").arg(m_baseDir)); |  | ||||||
|         // custom keys settings |         // custom keys settings | ||||||
|         writeFile(settings, "custom", QString("%1/custom.ini").arg(m_baseDir)); |         writeFile(settings, "custom", QString("%1/custom.ini").arg(m_baseDir)); | ||||||
|         settings.endGroup(); |         settings.endGroup(); | ||||||
| @ -184,21 +154,15 @@ QVariantMap AWConfigHelper::importConfiguration(const QString &_fileName, | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| QVariantMap AWConfigHelper::readDataEngineConfiguration() const | QVariantMap AWConfigHelper::readDataEngineConfiguration() | ||||||
| { | { | ||||||
|     QString fileName = QStandardPaths::locate( |     auto fileName = QStandardPaths::locate(QStandardPaths::ConfigLocation, "plasma-dataengine-extsysmon.conf"); | ||||||
|         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"] |     configuration["ACPIPATH"] = settings.value("ACPIPATH", "/sys/class/power_supply/"); | ||||||
|         = 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"); | ||||||
| @ -212,22 +176,17 @@ QVariantMap AWConfigHelper::readDataEngineConfiguration() const | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| bool AWConfigHelper::writeDataEngineConfiguration( | bool AWConfigHelper::writeDataEngineConfiguration(const QVariantMap &_configuration) | ||||||
|     const QVariantMap &_configuration) const |  | ||||||
| { | { | ||||||
|     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( |                         .arg(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation)); | ||||||
|                                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"]); | ||||||
| @ -241,39 +200,32 @@ bool AWConfigHelper::writeDataEngineConfiguration( | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void AWConfigHelper::copyConfigs(const QString &_localDir) const | void AWConfigHelper::copyConfigs(const QString &_localDir) | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Local directory" << _localDir; |     qCDebug(LOG_AW) << "Local directory" << _localDir; | ||||||
|  |  | ||||||
|     QStringList dirs = QStandardPaths::locateAll( |     auto dirs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, "awesomewidgets/configs", | ||||||
|         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), |             auto status = QFile::copy(QString("%1/%2").arg(dir, source), destination); | ||||||
|                                       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; |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void AWConfigHelper::copyExtensions(const QString &_item, const QString &_type, | void AWConfigHelper::copyExtensions(const QString &_item, const QString &_type, QSettings &_settings, | ||||||
|                                     QSettings &_settings, |  | ||||||
|                                     const bool _inverse) const |                                     const bool _inverse) const | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Extension" << _item << "has type" << _type |     qCDebug(LOG_AW) << "Extension" << _item << "has type" << _type << "inverse copying" << _inverse; | ||||||
|                     << "inverse copying" << _inverse; |  | ||||||
|  |  | ||||||
|     _settings.beginGroup(_item); |     _settings.beginGroup(_item); | ||||||
|     QSettings itemSettings( |     QSettings itemSettings(QString("%1/%2/%3").arg(m_baseDir, _type, _item), QSettings::IniFormat); | ||||||
|         QString("%1/%2/%3").arg(m_baseDir).arg(_type).arg(_item), |  | ||||||
|         QSettings::IniFormat); |  | ||||||
|     itemSettings.beginGroup("Desktop Entry"); |     itemSettings.beginGroup("Desktop Entry"); | ||||||
|     if (_inverse) |     if (_inverse) | ||||||
|         copySettings(_settings, itemSettings); |         copySettings(_settings, itemSettings); | ||||||
| @ -287,21 +239,20 @@ void AWConfigHelper::copyExtensions(const QString &_item, const QString &_type, | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void AWConfigHelper::copySettings(QSettings &_from, QSettings &_to) const | void AWConfigHelper::copySettings(QSettings &_from, QSettings &_to) | ||||||
| { | { | ||||||
|     for (auto &key : _from.childKeys()) |     for (auto &key : _from.childKeys()) | ||||||
|         _to.setValue(key, _from.value(key)); |         _to.setValue(key, _from.value(key)); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void AWConfigHelper::readFile(QSettings &_settings, const QString &_key, | void AWConfigHelper::readFile(QSettings &_settings, const QString &_key, const QString &_fileName) | ||||||
|                               const QString &_fileName) const |  | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Key" << _key << "from file" << _fileName; |     qCDebug(LOG_AW) << "Key" << _key << "from file" << _fileName; | ||||||
|  |  | ||||||
|     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 { | ||||||
| @ -310,8 +261,7 @@ void AWConfigHelper::readFile(QSettings &_settings, const QString &_key, | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void AWConfigHelper::writeFile(QSettings &_settings, const QString &_key, | void AWConfigHelper::writeFile(QSettings &_settings, const QString &_key, const QString &_fileName) | ||||||
|                                const QString &_fileName) const |  | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Key" << _key << "to file" << _fileName; |     qCDebug(LOG_AW) << "Key" << _key << "to file" << _fileName; | ||||||
|  |  | ||||||
| @ -321,7 +271,6 @@ void AWConfigHelper::writeFile(QSettings &_settings, const QString &_key, | |||||||
|     QFile file(_fileName); |     QFile file(_fileName); | ||||||
|     if (file.open(QIODevice::WriteOnly | QIODevice::Text)) { |     if (file.open(QIODevice::WriteOnly | QIODevice::Text)) { | ||||||
|         QTextStream out(&file); |         QTextStream out(&file); | ||||||
|         out.setCodec("UTF-8"); |  | ||||||
|         out << _settings.value(_key).toString().toUtf8(); |         out << _settings.value(_key).toString().toUtf8(); | ||||||
|         out.flush(); |         out.flush(); | ||||||
|         file.close(); |         file.close(); | ||||||
|  | |||||||
| @ -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> | ||||||
| @ -31,35 +29,24 @@ class AWConfigHelper : public QObject | |||||||
|  |  | ||||||
| public: | public: | ||||||
|     explicit AWConfigHelper(QObject *_parent = nullptr); |     explicit AWConfigHelper(QObject *_parent = nullptr); | ||||||
|     virtual ~AWConfigHelper(); |     ~AWConfigHelper() override = default; | ||||||
|     Q_INVOKABLE QString configurationDirectory() const; |     Q_INVOKABLE [[nodiscard]] static QString configurationDirectory(); | ||||||
|     Q_INVOKABLE bool dropCache() const; |     Q_INVOKABLE static bool dropCache(); | ||||||
|     Q_INVOKABLE bool exportConfiguration(QObject *_nativeConfig, |     Q_INVOKABLE bool exportConfiguration(QObject *_nativeConfig, const QString &_fileName) const; | ||||||
|                                          const QString &_fileName) const; |     Q_INVOKABLE [[nodiscard]] QVariantMap importConfiguration(const QString &_fileName, bool _importPlasmoid, | ||||||
|     Q_INVOKABLE QVariantMap importConfiguration(const QString &_fileName, |                                                               bool _importExtensions, bool _importAdds) const; | ||||||
|                                                 const bool _importPlasmoid, |  | ||||||
|                                                 const bool _importExtensions, |  | ||||||
|                                                 const bool _importAdds) const; |  | ||||||
|     // dataengine |     // dataengine | ||||||
|     Q_INVOKABLE QVariantMap readDataEngineConfiguration() const; |     Q_INVOKABLE static QVariantMap readDataEngineConfiguration(); | ||||||
|     Q_INVOKABLE bool |     Q_INVOKABLE static bool writeDataEngineConfiguration(const QVariantMap &_configuration); | ||||||
|     writeDataEngineConfiguration(const QVariantMap &_configuration) const; |  | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     // methods |     // methods | ||||||
|     void copyConfigs(const QString &_localDir) const; |     static void copyConfigs(const QString &_localDir); | ||||||
|     void copyExtensions(const QString &_item, const QString &_type, |     void copyExtensions(const QString &_item, const QString &_type, QSettings &_settings, bool _inverse) const; | ||||||
|                         QSettings &_settings, const bool _inverse) const; |     static void copySettings(QSettings &_from, QSettings &_to); | ||||||
|     void copySettings(QSettings &_from, QSettings &_to) const; |     static void readFile(QSettings &_settings, const QString &_key, const QString &_fileName); | ||||||
|     void readFile(QSettings &_settings, const QString &_key, |     static void writeFile(QSettings &_settings, const QString &_key, const QString &_fileName); | ||||||
|                   const QString &_fileName) const; |  | ||||||
|     void writeFile(QSettings &_settings, const QString &_key, |  | ||||||
|                    const QString &_fileName) const; |  | ||||||
|     // properties |     // properties | ||||||
|     QString m_baseDir; |     QString m_baseDir; | ||||||
|     QStringList m_dirs |     QStringList m_dirs = {"desktops", "quotes", "scripts", "upgrade", "weather", "formatters"}; | ||||||
|         = {"desktops", "quotes", "scripts", "upgrade", "weather", "formatters"}; |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif /* AWCONFIGHELPER_H */ |  | ||||||
|  | |||||||
| @ -21,18 +21,11 @@ | |||||||
| #include "awdebug.h" | #include "awdebug.h" | ||||||
|  |  | ||||||
|  |  | ||||||
| AWCustomKeysConfig::AWCustomKeysConfig(QWidget *_parent, | AWCustomKeysConfig::AWCustomKeysConfig(QWidget *_parent, const QStringList &_keys) | ||||||
|                                        const QStringList &_keys) |  | ||||||
|     : AWAbstractPairConfig(_parent, false, _keys) |     : AWAbstractPairConfig(_parent, false, _keys) | ||||||
| { | { | ||||||
|     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__; |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -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" | ||||||
|  |  | ||||||
| @ -27,10 +25,6 @@ class AWCustomKeysConfig : public AWAbstractPairConfig | |||||||
|     Q_OBJECT |     Q_OBJECT | ||||||
|  |  | ||||||
| public: | public: | ||||||
|     explicit AWCustomKeysConfig(QWidget *_parent = nullptr, |     explicit AWCustomKeysConfig(QWidget *_parent = nullptr, const QStringList &_keys = QStringList()); | ||||||
|                                 const QStringList &_keys = QStringList()); |     ~AWCustomKeysConfig() override = default; | ||||||
|     virtual ~AWCustomKeysConfig(); |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif /* AWCUSTOMKEYSCONFIG_H */ |  | ||||||
|  | |||||||
| @ -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; | ||||||
| @ -46,13 +40,13 @@ QString AWCustomKeysHelper::source(const QString &_key) const | |||||||
|  |  | ||||||
| QStringList AWCustomKeysHelper::sources() const | QStringList AWCustomKeysHelper::sources() const | ||||||
| { | { | ||||||
|     return QSet<QString>::fromList(values()).toList(); |     return valuesSet().values(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| QStringList AWCustomKeysHelper::refinedSources() const | QStringList AWCustomKeysHelper::refinedSources() const | ||||||
| { | { | ||||||
|     auto allSources = QSet<QString>::fromList(pairs().values()); |     auto allSources = valuesSet(); | ||||||
|     QSet<QString> output; |     QSet<QString> output; | ||||||
|  |  | ||||||
|     while (output != allSources) { |     while (output != allSources) { | ||||||
| @ -62,7 +56,7 @@ QStringList AWCustomKeysHelper::refinedSources() const | |||||||
|         allSources = output; |         allSources = output; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     return output.toList(); |     return output.values(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -74,5 +68,5 @@ QStringList AWCustomKeysHelper::leftKeys() | |||||||
|  |  | ||||||
| QStringList AWCustomKeysHelper::rightKeys() | QStringList AWCustomKeysHelper::rightKeys() | ||||||
| { | { | ||||||
|     return QStringList(); |     return {}; | ||||||
| } | } | ||||||
|  | |||||||
| @ -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,18 +28,13 @@ class AWCustomKeysHelper : public QObject, public AWAbstractPairHelper | |||||||
|  |  | ||||||
| public: | public: | ||||||
|     explicit AWCustomKeysHelper(QObject *_parent = nullptr); |     explicit AWCustomKeysHelper(QObject *_parent = nullptr); | ||||||
|     virtual ~AWCustomKeysHelper(); |     ~AWCustomKeysHelper() override = default; | ||||||
|     // get |     // get | ||||||
|     QString source(const QString &_key) const; |     [[nodiscard]] QString source(const QString &_key) const; | ||||||
|     QStringList sources() const; |     [[nodiscard]] QStringList sources() const; | ||||||
|     QStringList refinedSources() const; |     [[nodiscard]] QStringList refinedSources() const; | ||||||
|     // configuration related |     // configuration related | ||||||
|     virtual void editPairs(){}; |     void editPairs() override{}; | ||||||
|     virtual QStringList leftKeys(); |     QStringList leftKeys() override; | ||||||
|     virtual QStringList rightKeys(); |     QStringList rightKeys() override; | ||||||
|  |  | ||||||
| private: |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif /* AWCUSTOMKEYSHELPER_H */ |  | ||||||
|  | |||||||
| @ -50,20 +50,19 @@ AWDataAggregator::~AWDataAggregator() | |||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << __PRETTY_FUNCTION__; |     qCDebug(LOG_AW) << __PRETTY_FUNCTION__; | ||||||
|  |  | ||||||
|     delete m_toolTipScene; |     m_toolTipView->deleteLater(); | ||||||
|  |     m_toolTipScene->deleteLater(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| QString AWDataAggregator::htmlImage(const QPixmap &_source) const | QString AWDataAggregator::htmlImage(const QPixmap &_source) | ||||||
| { | { | ||||||
|     QByteArray byteArray; |     QByteArray byteArray; | ||||||
|     QBuffer buffer(&byteArray); |     QBuffer buffer(&byteArray); | ||||||
|     _source.save(&buffer, "PNG"); |     _source.save(&buffer, "PNG"); | ||||||
|  |  | ||||||
|     return byteArray.isEmpty() |     return byteArray.isEmpty() ? "" | ||||||
|                ? "" |                                : QString("<img src=\"data:image/png;base64,%1\"/>").arg(QString(byteArray.toBase64())); | ||||||
|                : QString("<img src=\"data:image/png;base64,%1\"/>") |  | ||||||
|                      .arg(QString(byteArray.toBase64())); |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -86,27 +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_toolTipScene->setBackgroundBrush(m_configuration["useTooltipBackground"].toBool() | ||||||
|         m_configuration["useTooltipBackground"].toBool() |                                            ? QColor(m_configuration["tooltipBackground"].toString()) | ||||||
|             ? QBrush(QColor(m_configuration["tooltipBackground"].toString())) |                                            : Qt::NoBrush); | ||||||
|             : QBrush(Qt::NoBrush)); |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -115,37 +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 = 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( |             pen.setColor(m_configuration[QString("%1Color").arg(key)].toString()); | ||||||
|                 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( |                     pen.setColor(QColor(m_configuration["batTooltipColor"].toString())); | ||||||
|                         QColor(m_configuration["batTooltipColor"].toString())); |  | ||||||
|                 else |                 else | ||||||
|                     pen.setColor(QColor( |                     pen.setColor(QColor(m_configuration["batInTooltipColor"].toString())); | ||||||
|                         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(); | ||||||
| @ -160,36 +163,28 @@ void AWDataAggregator::dataUpdate(const QVariantHash &_values) | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void AWDataAggregator::checkValue(const QString &_source, const float _value, | void AWDataAggregator::checkValue(const QString &_source, const double _value, const double _extremum) const | ||||||
|                                   const float _extremum) const |  | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Notification source" << _source << "with value" |     qCDebug(LOG_AW) << "Notification source" << _source << "with value" << _value << "called with extremum" | ||||||
|                     << _value << "called with extremum" << _extremum; |                     << _extremum; | ||||||
|  |  | ||||||
|     if (_value >= 0.0) { |     if (_value >= 0.0) { | ||||||
|         if ((m_enablePopup) && (_value > _extremum) |         if ((m_enablePopup) && (_value > _extremum) && (m_values[_source].last() < _extremum)) | ||||||
|             && (m_values[_source].last() < _extremum)) |             return AWActions::sendNotification("event", notificationText(_source, _value)); | ||||||
|             return AWActions::sendNotification( |  | ||||||
|                 "event", notificationText(_source, _value)); |  | ||||||
|     } else { |     } else { | ||||||
|         if ((m_enablePopup) && (_value < _extremum) |         if ((m_enablePopup) && (_value < _extremum) && (m_values[_source].last() > _extremum)) | ||||||
|             && (m_values[_source].last() > _extremum)) |             return AWActions::sendNotification("event", notificationText(_source, _value)); | ||||||
|             return AWActions::sendNotification( |  | ||||||
|                 "event", notificationText(_source, _value)); |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void AWDataAggregator::checkValue(const QString &_source, | void AWDataAggregator::checkValue(const QString &_source, const QString &_current, const QString &_received) const | ||||||
|                                   const QString &_current, |  | ||||||
|                                   const QString &_received) const |  | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Notification source" << _source << "with current value" |     qCDebug(LOG_AW) << "Notification source" << _source << "with current value" << _current << "and received one" | ||||||
|                     << _current << "and received one" << _received; |                     << _received; | ||||||
|  |  | ||||||
|     if ((m_enablePopup) && (_current != _received) && (!_received.isEmpty())) |     if ((m_enablePopup) && (_current != _received) && (!_received.isEmpty())) | ||||||
|         return AWActions::sendNotification( |         return AWActions::sendNotification("event", notificationText(_source, _received)); | ||||||
|             "event", notificationText(_source, _received)); |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -205,11 +200,9 @@ void AWDataAggregator::initScene() | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| QString AWDataAggregator::notificationText(const QString &_source, | QString AWDataAggregator::notificationText(const QString &_source, const float _value) | ||||||
|                                            const float _value) const |  | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Notification source" << _source << "with value" |     qCDebug(LOG_AW) << "Notification source" << _source << "with value" << _value; | ||||||
|                     << _value; |  | ||||||
|  |  | ||||||
|     QString output; |     QString output; | ||||||
|     if (_source == "batTooltip") |     if (_source == "batTooltip") | ||||||
| @ -227,11 +220,9 @@ QString AWDataAggregator::notificationText(const QString &_source, | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| QString AWDataAggregator::notificationText(const QString &_source, | QString AWDataAggregator::notificationText(const QString &_source, const QString &_value) | ||||||
|                                            const QString &_value) const |  | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Notification source" << _source << "with value" |     qCDebug(LOG_AW) << "Notification source" << _source << "with value" << _value; | ||||||
|                     << _value; |  | ||||||
|  |  | ||||||
|     QString output; |     QString output; | ||||||
|     if (_source == "netdev") |     if (_source == "netdev") | ||||||
| @ -245,38 +236,33 @@ 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"], |     setData(_values["ac"].toString() == m_configuration["acOnline"], "batTooltip", _values["bat"].toDouble()); | ||||||
|             "batTooltip", _values["bat"].toFloat()); |  | ||||||
|     // 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", _values["gpu"].toDouble(), 90.0); | ||||||
|         checkValue("gpu", value, 90.0); |  | ||||||
|         m_currentGPULoad = value; |  | ||||||
|     }(_values["gpu"].toFloat()); |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void AWDataAggregator::setData(const QString &_source, float _value, | void AWDataAggregator::setData(const QString &_source, double _value, const double _extremum) | ||||||
|                                const float _extremum) |  | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Source" << _source << "to value" << _value |     qCDebug(LOG_AW) << "Source" << _source << "to value" << _value << "with extremum" << _extremum; | ||||||
|                     << "with extremum" << _extremum; |  | ||||||
|  |  | ||||||
|     if (m_values[_source].count() == 0) |     if (m_values[_source].count() == 0) | ||||||
|         m_values[_source].append(0.0); |         m_values[_source].append(0.0); | ||||||
|     else if (m_values[_source].count() |     else if (m_values[_source].count() > m_configuration["tooltipNumber"].toInt()) | ||||||
|              > m_configuration["tooltipNumber"].toInt()) |  | ||||||
|         m_values[_source].removeFirst(); |         m_values[_source].removeFirst(); | ||||||
|     if (std::isnan(_value)) |     if (std::isnan(_value)) | ||||||
|         _value = 0.0; |         _value = 0.0; | ||||||
| @ -286,22 +272,22 @@ void AWDataAggregator::setData(const QString &_source, float _value, | |||||||
|  |  | ||||||
|     m_values[_source].append(_value); |     m_values[_source].append(_value); | ||||||
|     if (_source == "downkbTooltip") { |     if (_source == "downkbTooltip") { | ||||||
|         QList<float> netValues |         // to avoid copying of objects to another list we find max elements in each sequence and compare them | ||||||
|             = m_values["downkbTooltip"] + m_values["upkbTooltip"]; |         auto downMax = m_values["downkbTooltip"].empty() | ||||||
|         // to avoid inf value of normY |                            ? 1.0 | ||||||
|         netValues << 1.0; |                            : *std::max_element(m_values["downkbTooltip"].cbegin(), m_values["downkbTooltip"].cend()); | ||||||
|         m_boundaries["downkbTooltip"] |         auto upMax = m_values["upkbTooltip"].empty() | ||||||
|             = 1.2f * *std::max_element(netValues.cbegin(), netValues.cend()); |                          ? 1.0 | ||||||
|         m_boundaries["upkbTooltip"] = m_boundaries["downkbTooltip"]; |                          : *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, | void AWDataAggregator::setData(const bool _dontInvert, const QString &_source, double _value) | ||||||
|                                float _value) |  | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Do not invert" << _dontInvert << "value" << _value |     qCDebug(LOG_AW) << "Do not invert" << _dontInvert << "value" << _value << "for source" << _source; | ||||||
|                     << "for source" << _source; |  | ||||||
|  |  | ||||||
|     // invert values for different battery colours |     // invert values for different battery colours | ||||||
|     _value = _dontInvert ? _value : -_value; |     _value = _dontInvert ? _value : -_value; | ||||||
|  | |||||||
| @ -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 AWTOOLTIP_H |  | ||||||
| #define AWTOOLTIP_H |  | ||||||
|  |  | ||||||
| #include <QObject> | #include <QObject> | ||||||
| #include <QVariant> | #include <QVariant> | ||||||
| @ -26,7 +24,6 @@ | |||||||
| class QGraphicsScene; | class QGraphicsScene; | ||||||
| class QGraphicsView; | class QGraphicsView; | ||||||
| class QPixmap; | class QPixmap; | ||||||
| class QThreadPool; |  | ||||||
|  |  | ||||||
| class AWDataAggregator : public QObject | class AWDataAggregator : public QObject | ||||||
| { | { | ||||||
| @ -34,8 +31,8 @@ class AWDataAggregator : public QObject | |||||||
|  |  | ||||||
| public: | public: | ||||||
|     explicit AWDataAggregator(QObject *_parent = nullptr); |     explicit AWDataAggregator(QObject *_parent = nullptr); | ||||||
|     virtual ~AWDataAggregator(); |     ~AWDataAggregator() override; | ||||||
|     QString htmlImage(const QPixmap &_source) const; |     static QString htmlImage(const QPixmap &_source); | ||||||
|     void setParameters(const QVariantMap &_settings); |     void setParameters(const QVariantMap &_settings); | ||||||
|     QPixmap tooltipImage(); |     QPixmap tooltipImage(); | ||||||
|  |  | ||||||
| @ -49,30 +46,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, const float _value, |     void checkValue(const QString &_source, double _value, double _extremum) const; | ||||||
|                     const float _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(); | ||||||
|     QString notificationText(const QString &_source, const float _value) const; |     static QString notificationText(const QString &_source, float _value); | ||||||
|     QString notificationText(const QString &_source, |     static QString notificationText(const QString &_source, const QString &_value); | ||||||
|                              const QString &_value) const; |  | ||||||
|     // main method |     // main method | ||||||
|     void setData(const QVariantHash &_values); |     void setData(const QVariantHash &_values); | ||||||
|     void setData(const QString &_source, float _value, |     void setData(const QString &_source, double _value, double _extremum = -1.0); | ||||||
|                  const float _extremum = -1.0f); |  | ||||||
|     // different signature for battery device |     // different signature for battery device | ||||||
|     void setData(const 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; | ||||||
|     float m_currentGPULoad = 0.0f; |  | ||||||
|     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 */ |  | ||||||
|  | |||||||
| @ -17,33 +17,35 @@ | |||||||
|  |  | ||||||
| #include "awdataengineaggregator.h" | #include "awdataengineaggregator.h" | ||||||
|  |  | ||||||
| #include <Plasma/DataContainer> | #include <ksysguard/formatter/Unit.h> | ||||||
|  | #include <ksysguard/systemstats/DBusInterface.h> | ||||||
|  |  | ||||||
|  | #include <QDBusConnection> | ||||||
|  |  | ||||||
| #include "awdebug.h" | #include "awdebug.h" | ||||||
| #include "awkeys.h" |  | ||||||
|  |  | ||||||
|  |  | ||||||
| AWDataEngineAggregator::AWDataEngineAggregator(QObject *_parent) | AWDataEngineAggregator::AWDataEngineAggregator(QObject *_parent) | ||||||
|     : QObject(_parent) |     : QObject(_parent) | ||||||
|  |     , m_interface(new KSysGuard::SystemStats::DBusInterface()) | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << __PRETTY_FUNCTION__; |     qCDebug(LOG_AW) << __PRETTY_FUNCTION__; | ||||||
|  |  | ||||||
|     m_consumer = new Plasma::DataEngineConsumer(); |     qDBusRegisterMetaType<KSysGuard::SensorData>(); | ||||||
|     m_dataEngines["systemmonitor"] = m_consumer->dataEngine("systemmonitor"); |     qDBusRegisterMetaType<KSysGuard::SensorInfo>(); | ||||||
|     m_dataEngines["extsysmon"] = m_consumer->dataEngine("extsysmon"); |     qDBusRegisterMetaType<KSysGuard::SensorDataList>(); | ||||||
|     m_dataEngines["time"] = m_consumer->dataEngine("time"); |     qDBusRegisterMetaType<QHash<QString, KSysGuard::SensorInfo>>(); | ||||||
|  |  | ||||||
|     // additional method required by systemmonitor structure |     connect(m_interface, &KSysGuard::SystemStats::DBusInterface::newSensorData, this, | ||||||
|     m_newSourceConnection = connect( |             &AWDataEngineAggregator::updateData); | ||||||
|         m_dataEngines["systemmonitor"], &Plasma::DataEngine::sourceAdded, |     connect(m_interface, &KSysGuard::SystemStats::DBusInterface::sensorMetaDataChanged, this, | ||||||
|         [this](const QString source) { |             &AWDataEngineAggregator::updateSensors); | ||||||
|             emit(deviceAdded(source)); |     connect(m_interface, &KSysGuard::SystemStats::DBusInterface::sensorAdded, this, | ||||||
|             m_dataEngines["systemmonitor"]->connectSource(source, parent(), |             &AWDataEngineAggregator::sensorAdded); | ||||||
|                                                           1000); |     connect(m_interface, &KSysGuard::SystemStats::DBusInterface::sensorRemoved, this, | ||||||
|         }); |             &AWDataEngineAggregator::sensorRemoved); | ||||||
|  |  | ||||||
|     // required to define Qt::QueuedConnection for signal-slot connection |     loadSources(); | ||||||
|     qRegisterMetaType<Plasma::DataEngine::Data>("Plasma::DataEngine::Data"); |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -52,77 +54,102 @@ AWDataEngineAggregator::~AWDataEngineAggregator() | |||||||
|     qCDebug(LOG_AW) << __PRETTY_FUNCTION__; |     qCDebug(LOG_AW) << __PRETTY_FUNCTION__; | ||||||
|  |  | ||||||
|     disconnectSources(); |     disconnectSources(); | ||||||
|  |     m_interface->deleteLater(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void AWDataEngineAggregator::connectSources() | ||||||
|  | { | ||||||
|  |     auto keys = m_sensors.keys(); | ||||||
|  |     auto newKeys = QSet(keys.cbegin(), keys.cend()) - m_subscribed; | ||||||
|  |  | ||||||
|  |     m_interface->subscribe(newKeys.values()).waitForFinished(); | ||||||
|  |     m_subscribed.unite(newKeys); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void AWDataEngineAggregator::disconnectSources() | void AWDataEngineAggregator::disconnectSources() | ||||||
| { | { | ||||||
|     for (auto dataengine : m_dataEngines.values()) |     m_interface->unsubscribe(m_subscribed.values()).waitForFinished(); | ||||||
|         for (auto &source : dataengine->sources()) |     m_subscribed.clear(); | ||||||
|             dataengine->disconnectSource(source, parent()); |  | ||||||
|     disconnect(m_newSourceConnection); |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void AWDataEngineAggregator::reconnectSources(const int _interval) | bool AWDataEngineAggregator::isValidSensor(const KSysGuard::SensorInfo &_sensor) | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Reconnect sources with interval" << _interval; |     return _sensor.unit != KSysGuard::UnitInvalid; | ||||||
|  | } | ||||||
|  |  | ||||||
|     disconnectSources(); |  | ||||||
|  |  | ||||||
|     m_dataEngines["systemmonitor"]->connectAllSources(parent(), _interval); | void AWDataEngineAggregator::loadSources() | ||||||
|     m_dataEngines["extsysmon"]->connectAllSources(parent(), _interval); | { | ||||||
|     m_dataEngines["time"]->connectSource("Local", parent(), 1000); |     auto response = m_interface->allSensors(); | ||||||
|  |     response.waitForFinished(); | ||||||
|  |  | ||||||
|     m_newSourceConnection = connect( |     auto sensors = response.value(); | ||||||
|         m_dataEngines["systemmonitor"], &Plasma::DataEngine::sourceAdded, |     updateSensors(sensors); | ||||||
|         [this, _interval](const QString source) { |     connectSources(); | ||||||
|             emit(deviceAdded(source)); |  | ||||||
|             m_dataEngines["systemmonitor"]->connectSource(source, parent(), |  | ||||||
|                                                           _interval); |  | ||||||
|         }); |  | ||||||
|  |  | ||||||
| #ifdef BUILD_FUTURE |     for (auto &sensor : m_sensors.keys()) | ||||||
|     createQueuedConnection(); |         emit(deviceAdded(sensor)); | ||||||
| #endif /* BUILD_FUTURE */ |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void AWDataEngineAggregator::dropSource(const QString &_source) | void AWDataEngineAggregator::dropSource(const QString &_source) | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Source" << _source; |     qCDebug(LOG_AW) << "Disconnect sensor" << _source; | ||||||
|  |  | ||||||
|     // HACK there is no possibility to check to which dataengine source |     if (m_subscribed.contains(_source)) { | ||||||
|     // connected we will try to disconnect it from all engines |         m_interface->unsubscribe({_source}).waitForFinished(); | ||||||
|     for (auto dataengine : m_dataEngines.values()) |         m_subscribed.remove(_source); | ||||||
|         dataengine->disconnectSource(_source, parent()); |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void AWDataEngineAggregator::createQueuedConnection() | void AWDataEngineAggregator::sensorAdded(const QString &_sensor) | ||||||
| { | { | ||||||
|     // HACK additional method which forces QueuedConnection instead of Auto one |     qCDebug(LOG_AW) << "New sensor added" << _sensor; | ||||||
|     // for more details refer to plasma-framework source code |  | ||||||
|     for (auto &dataEngine : m_dataEngines.keys()) { |     // check if sensor is actually valid | ||||||
|         // different source set for different engines |     auto response = m_interface->sensors({_sensor}); | ||||||
|         QStringList sources = dataEngine == "time" |     response.waitForFinished(); | ||||||
|                                   ? QStringList() << "Local" |  | ||||||
|                                   : m_dataEngines[dataEngine]->sources(); |     auto info = response.value().value(_sensor); | ||||||
|         // reconnect sources |     if (!isValidSensor(info)) | ||||||
|         for (auto &source : sources) { |         return; | ||||||
|             Plasma::DataContainer *container |  | ||||||
|                 = m_dataEngines[dataEngine]->containerForSource(source); |     m_sensors[_sensor] = info; | ||||||
|             // disconnect old connections first |     dropSource(_sensor); // force reconnect | ||||||
|             disconnect(container, |     if (!m_subscribed.contains(_sensor)) { | ||||||
|                        SIGNAL(dataUpdated(QString, Plasma::DataEngine::Data)), |         m_interface->subscribe({_sensor}).waitForFinished(); | ||||||
|                        parent(), |         m_subscribed.insert(_sensor); | ||||||
|                        SLOT(dataUpdated(QString, Plasma::DataEngine::Data))); |     } | ||||||
|             // and now reconnect with Qt::QueuedConnection type |  | ||||||
|             connect(container, |     // notify about new device | ||||||
|                     SIGNAL(dataUpdated(QString, Plasma::DataEngine::Data)), |     emit(deviceAdded(_sensor)); | ||||||
|                     parent(), | } | ||||||
|                     SLOT(dataUpdated(QString, Plasma::DataEngine::Data)), |  | ||||||
|                     Qt::QueuedConnection); |  | ||||||
|         } | void AWDataEngineAggregator::sensorRemoved(const QString &_sensor) | ||||||
|  | { | ||||||
|  |     qCDebug(LOG_AW) << "Sensor" << _sensor << "has been removed"; | ||||||
|  |  | ||||||
|  |     m_sensors.remove(_sensor); | ||||||
|  |     dropSource(_sensor); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void AWDataEngineAggregator::updateData(const KSysGuard::SensorDataList &_data) | ||||||
|  | { | ||||||
|  |     emit(dataUpdated(m_sensors, _data)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void AWDataEngineAggregator::updateSensors(const QHash<QString, KSysGuard::SensorInfo> &_sensors) | ||||||
|  | { | ||||||
|  |     for (auto [source, sensor] : _sensors.asKeyValueRange()) { | ||||||
|  |         if (!isValidSensor(sensor)) | ||||||
|  |             continue; | ||||||
|  |         m_sensors.insert(source, sensor); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -15,38 +15,45 @@ | |||||||
|  *   along with awesome-widgets. If not, see http://www.gnu.org/licenses/  * |  *   along with awesome-widgets. If not, see http://www.gnu.org/licenses/  * | ||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
| #ifndef AWDATAENGINEAGGREGATOR_H | #include <ksysguard/systemstats/SensorInfo.h> | ||||||
| #define AWDATAENGINEAGGREGATOR_H |  | ||||||
|  |  | ||||||
| #include <Plasma/DataEngine> |  | ||||||
| #include <Plasma/DataEngineConsumer> |  | ||||||
|  |  | ||||||
|  | #include <QHash> | ||||||
| #include <QObject> | #include <QObject> | ||||||
|  | #include <QSet> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace KSysGuard::SystemStats | ||||||
|  | { | ||||||
|  | class DBusInterface; | ||||||
|  | } | ||||||
|  |  | ||||||
| class AWDataEngineAggregator : public QObject | class AWDataEngineAggregator : public QObject | ||||||
| { | { | ||||||
|     Q_OBJECT |     Q_OBJECT | ||||||
|  |  | ||||||
| public: | public: | ||||||
|     explicit AWDataEngineAggregator(QObject *_parent = nullptr); |     explicit AWDataEngineAggregator(QObject *_parent = nullptr); | ||||||
|     virtual ~AWDataEngineAggregator(); |     ~AWDataEngineAggregator() override; | ||||||
|  |     void connectSources(); | ||||||
|     void disconnectSources(); |     void disconnectSources(); | ||||||
|     void reconnectSources(const int _interval); |     [[nodiscard]] static bool isValidSensor(const KSysGuard::SensorInfo &_sensor); | ||||||
|  |     void loadSources(); | ||||||
|  |  | ||||||
| signals: | signals: | ||||||
|  |     void dataUpdated(const QHash<QString, KSysGuard::SensorInfo> &_sensors, const KSysGuard::SensorDataList &_data); | ||||||
|     void deviceAdded(const QString &_source); |     void deviceAdded(const QString &_source); | ||||||
|  |  | ||||||
| public slots: | public slots: | ||||||
|     void dropSource(const QString &_source); |     void dropSource(const QString &_source); | ||||||
|  |     void sensorAdded(const QString &_sensor); | ||||||
|  |     void sensorRemoved(const QString &_sensor); | ||||||
|  |     void updateData(const KSysGuard::SensorDataList &_data); | ||||||
|  |     void updateSensors(const QHash<QString, KSysGuard::SensorInfo> &_sensors); | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     void createQueuedConnection(); |     KSysGuard::SystemStats::DBusInterface *m_interface = nullptr; | ||||||
|     Plasma::DataEngineConsumer *m_consumer = nullptr; |     QHash<QString, KSysGuard::SensorInfo> m_sensors; | ||||||
|     QHash<QString, Plasma::DataEngine *> m_dataEngines; |     QSet<QString> m_subscribed; | ||||||
|     QMetaObject::Connection m_newSourceConnection; |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif /* AWDATAENGINEAGGREGATOR_H */ |  | ||||||
|  | |||||||
| @ -17,14 +17,13 @@ | |||||||
|  |  | ||||||
| #include "awdataenginemapper.h" | #include "awdataenginemapper.h" | ||||||
|  |  | ||||||
| #include <QRegExp> | #include <QRegularExpression> | ||||||
|  |  | ||||||
| #include "awdebug.h" | #include "awdebug.h" | ||||||
| #include "awformatterhelper.h" | #include "awformatterhelper.h" | ||||||
|  |  | ||||||
|  |  | ||||||
| AWDataEngineMapper::AWDataEngineMapper(QObject *_parent, | AWDataEngineMapper::AWDataEngineMapper(QObject *_parent, AWFormatterHelper *_custom) | ||||||
|                                        AWFormatterHelper *_custom) |  | ||||||
|     : QObject(_parent) |     : QObject(_parent) | ||||||
|     , m_customFormatters(_custom) |     , m_customFormatters(_custom) | ||||||
| { | { | ||||||
| @ -53,14 +52,7 @@ AWDataEngineMapper::AWDataEngineMapper(QObject *_parent, | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| AWDataEngineMapper::~AWDataEngineMapper() | AWKeysAggregator::FormatterType 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; | ||||||
|  |  | ||||||
| @ -78,345 +70,357 @@ QStringList AWDataEngineMapper::keysFromSource(const QString &_source) const | |||||||
|  |  | ||||||
| // HACK units required to define should the value be calculated as temperature | // HACK units required to define should the value be calculated as temperature | ||||||
| // or fan data | // or fan data | ||||||
| QStringList AWDataEngineMapper::registerSource(const QString &_source, | QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSysGuard::Unit _units, | ||||||
|                                                const QString &_units, |  | ||||||
|                                                const QStringList &_keys) |                                                const QStringList &_keys) | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Source" << _source << "with units" << _units; |     qCDebug(LOG_AW) << "Source" << _source << "with units" << _units; | ||||||
|  |  | ||||||
|     // regular expressions |     // regular expressions | ||||||
|     QRegExp cpuRegExp = QRegExp("cpu/cpu.*/TotalLoad"); |     static auto cpuRegExp = QRegularExpression("^cpu/cpu.*/usage$"); | ||||||
|     QRegExp cpuclRegExp = QRegExp("cpu/cpu.*/clock"); |     static auto cpuclRegExp = QRegularExpression("^cpu/cpu.*/frequency$"); | ||||||
|     QRegExp hddrRegExp = QRegExp("disk/.*/Rate/rblk"); |     static auto cpuTempRegExp = QRegularExpression("^cpu/cpu.*/temperature$"); | ||||||
|     QRegExp hddwRegExp = QRegExp("disk/.*/Rate/wblk"); |     static auto gpuRegExp = QRegularExpression("^gpu/gpu.*/usage$"); | ||||||
|     QRegExp mountFillRegExp = QRegExp("partitions/.*/filllevel"); |     static auto gpuTempRegExp = QRegularExpression("^gpu/gpu.*/temperature$"); | ||||||
|     QRegExp mountFreeRegExp = QRegExp("partitions/.*/freespace"); |     static auto hddrRegExp = QRegularExpression("^disk/.*/read$"); | ||||||
|     QRegExp mountUsedRegExp = QRegExp("partitions/.*/usedspace"); |     static auto hddwRegExp = QRegularExpression("^disk/.*/write$"); | ||||||
|     QRegExp netRegExp |     static auto mountFillRegExp = QRegularExpression("^disk/.*/usedPercent$"); | ||||||
|         = QRegExp("network/interfaces/.*/(receiver|transmitter)/data$"); |     static auto mountFreeRegExp = QRegularExpression("^disk/.*/free$"); | ||||||
|     QRegExp netTotalRegExp |     static auto mountUsedRegExp = QRegularExpression("^disk/.*/used$"); | ||||||
|         = QRegExp("network/interfaces/.*/(receiver|transmitter)/dataTotal$"); |     static auto netRegExp = QRegularExpression("^network/.*/(download|upload)$"); | ||||||
|  |     static auto netTotalRegExp = QRegularExpression("^network/.*/(totalDownload|totalUpload)$"); | ||||||
|  |  | ||||||
|     if (_source == "battery/ac") { |     if (_source == "extsysmon/battery/ac") { | ||||||
|         // AC |         // AC | ||||||
|         m_map[_source] = "ac"; |         m_map.insert(_source, "ac"); | ||||||
|         m_formatter["ac"] = AWKeysAggregator::FormatterType::ACFormat; |         m_formatter["ac"] = AWKeysAggregator::FormatterType::ACFormat; | ||||||
|     } else if (_source.startsWith("battery/")) { |     } else if (_source.startsWith("extsysmon/battery/")) { | ||||||
|         // battery stats |         // battery stats | ||||||
|         QString key = _source; |         auto key = _source; | ||||||
|         key.remove("battery/"); |         key.remove("extsysmon/battery/"); | ||||||
|         m_map[_source] = key; |         m_map.insert(_source, key); | ||||||
|         m_formatter[key] = AWKeysAggregator::FormatterType::IntegerThree; |         m_formatter[key] = _source.contains("rate") ? AWKeysAggregator::FormatterType::Float | ||||||
|     } else if (_source == "cpu/system/TotalLoad") { |                                                     : AWKeysAggregator::FormatterType::IntegerThree; | ||||||
|  |     } else if (_source == "cpu/all/usage") { | ||||||
|         // cpu |         // cpu | ||||||
|         m_map[_source] = "cpu"; |         m_map.insert(_source, "cpu"); | ||||||
|         m_formatter["cpu"] = AWKeysAggregator::FormatterType::Float; |         m_formatter["cpu"] = AWKeysAggregator::FormatterType::Float; | ||||||
|     } else if (_source.contains(cpuRegExp)) { |     } else if (_source.contains(cpuRegExp)) { | ||||||
|         // cpus |         // cpus | ||||||
|         QString key = _source; |         auto key = _source; | ||||||
|         key.remove("cpu/").remove("/TotalLoad"); |         key.remove("cpu/").remove("/usage"); | ||||||
|         m_map[_source] = key; |         m_map.insert(_source, key); | ||||||
|         m_formatter[key] = AWKeysAggregator::FormatterType::Float; |         m_formatter[key] = AWKeysAggregator::FormatterType::Float; | ||||||
|     } else if (_source == "cpu/system/AverageClock") { |     } else if (_source == "cpu/all/averageFrequency") { | ||||||
|         // cpucl |         // cpucl | ||||||
|         m_map[_source] = "cpucl"; |         m_map.insert(_source, "cpucl"); | ||||||
|         m_formatter["cpucl"] = AWKeysAggregator::FormatterType::Integer; |         m_formatter["cpucl"] = AWKeysAggregator::FormatterType::Integer; | ||||||
|     } else if (_source.contains(cpuclRegExp)) { |     } else if (_source.contains(cpuclRegExp)) { | ||||||
|         // cpucls |         // cpucls | ||||||
|         QString key = _source; |         auto key = _source; | ||||||
|         key.remove("cpu/cpu").remove("/clock"); |         key.remove("cpu/cpu").remove("/frequency"); | ||||||
|         key = QString("cpucl%1").arg(key); |         key = QString("cpucl%1").arg(key); | ||||||
|         m_map[_source] = key; |         m_map.insert(_source, key); | ||||||
|         m_formatter[key] = AWKeysAggregator::FormatterType::Integer; |         m_formatter[key] = AWKeysAggregator::FormatterType::Integer; | ||||||
|     } else if (_source.startsWith("custom")) { |     } else if (_source.startsWith("extsysmon/custom")) { | ||||||
|         // custom |         // custom | ||||||
|         QString key = _source; |         auto key = _source; | ||||||
|         key.remove("custom/"); |         key.remove("extsysmon/custom/"); | ||||||
|         m_map[_source] = key; |         m_map.insert(_source, key); | ||||||
|         m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat; |         m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat; | ||||||
|     } else if (_source == "desktop/current/name") { |     } else if (_source == "extsysmon/desktop/name") { | ||||||
|         // current desktop name |         // current desktop name | ||||||
|         m_map[_source] = "desktop"; |         m_map.insert(_source, "desktop"); | ||||||
|         m_formatter["desktop"] = AWKeysAggregator::FormatterType::NoFormat; |         m_formatter["desktop"] = AWKeysAggregator::FormatterType::NoFormat; | ||||||
|     } else if (_source == "desktop/current/number") { |     } else if (_source == "extsysmon/desktop/number") { | ||||||
|         // current desktop number |         // current desktop number | ||||||
|         m_map[_source] = "ndesktop"; |         m_map.insert(_source, "ndesktop"); | ||||||
|         m_formatter["ndesktop"] = AWKeysAggregator::FormatterType::NoFormat; |         m_formatter["ndesktop"] = AWKeysAggregator::FormatterType::NoFormat; | ||||||
|     } else if (_source == "desktop/total/number") { |     } else if (_source == "extsysmon/desktop/count") { | ||||||
|         // desktop count |         // desktop count | ||||||
|         m_map[_source] = "tdesktops"; |         m_map.insert(_source, "tdesktops"); | ||||||
|         m_formatter["tdesktops"] = AWKeysAggregator::FormatterType::NoFormat; |         m_formatter["tdesktops"] = AWKeysAggregator::FormatterType::NoFormat; | ||||||
|     } else if (_source.contains(hddrRegExp)) { |     } else if (_source.contains(hddrRegExp)) { | ||||||
|         // read speed |         // read speed | ||||||
|         QString device = _source; |         auto device = _source; | ||||||
|         device.remove("/Rate/rblk"); |         device.remove("disk/").remove("/read"); | ||||||
|         int index = m_devices["disk"].indexOf(device); |         auto index = m_devices["disk"].indexOf(device); | ||||||
|         if (index > -1) { |         if (index > -1) { | ||||||
|             QString key = QString("hddr%1").arg(index); |             QString key = QString("hddr%1").arg(index); | ||||||
|             m_map[_source] = key; |             m_map.insert(_source, key); | ||||||
|             m_formatter[key] = AWKeysAggregator::FormatterType::Integer; |             m_formatter[key] = AWKeysAggregator::FormatterType::MemKBFormat; | ||||||
|         } |         } | ||||||
|     } else if (_source.contains(hddwRegExp)) { |     } else if (_source.contains(hddwRegExp)) { | ||||||
|         // write speed |         // write speed | ||||||
|         QString device = _source; |         auto device = _source; | ||||||
|         device.remove("/Rate/wblk"); |         device.remove("disk/").remove("/write"); | ||||||
|         int index = m_devices["disk"].indexOf(device); |         auto index = m_devices["disk"].indexOf(device); | ||||||
|         if (index > -1) { |         if (index > -1) { | ||||||
|             QString key = QString("hddw%1").arg(index); |             QString key = QString("hddw%1").arg(index); | ||||||
|             m_map[_source] = key; |             m_map.insert(_source, key); | ||||||
|             m_formatter[key] = AWKeysAggregator::FormatterType::Integer; |             m_formatter[key] = AWKeysAggregator::FormatterType::MemKBFormat; | ||||||
|         } |         } | ||||||
|     } else if (_source == "gpu/load") { |     } else if (_source == "gpu/all/usage") { | ||||||
|         // gpu load |         // gpu load | ||||||
|         m_map[_source] = "gpu"; |         m_map.insert(_source, "gpu"); | ||||||
|         m_formatter["gpu"] = AWKeysAggregator::FormatterType::Float; |         m_formatter["gpu"] = AWKeysAggregator::FormatterType::Float; | ||||||
|     } else if (_source == "gpu/temperature") { |     } else if (_source.contains(gpuRegExp)) { | ||||||
|         // gpu temperature |         // gpus | ||||||
|         m_map[_source] = "gputemp"; |         auto device = _source; | ||||||
|         m_formatter["gputemp"] = AWKeysAggregator::FormatterType::Temperature; |         device.remove("gpu/").remove("/usage"); | ||||||
|  |         auto index = m_devices["gpu"].indexOf(device); | ||||||
|  |         if (index > -1) { | ||||||
|  |             auto key = QString("gpu%1").arg(index); | ||||||
|  |             m_map.insert(_source, key); | ||||||
|  |             m_formatter[key] = AWKeysAggregator::FormatterType::Float; | ||||||
|  |         } | ||||||
|  |     } else if (_source.contains(gpuTempRegExp)) { | ||||||
|  |         // gpus temps | ||||||
|  |         auto device = _source; | ||||||
|  |         device.remove("gpu/").remove("/temperature"); | ||||||
|  |         auto index = m_devices["gpu"].indexOf(device); | ||||||
|  |         if (index > -1) { | ||||||
|  |             auto key = QString("gputemp%1").arg(index); | ||||||
|  |             m_map.insert(_source, key); | ||||||
|  |             m_formatter[key] = AWKeysAggregator::FormatterType::Temperature; | ||||||
|  |         } | ||||||
|     } else if (_source.contains(mountFillRegExp)) { |     } else if (_source.contains(mountFillRegExp)) { | ||||||
|         // fill level |         // fill level | ||||||
|         QString device = _source; |         auto device = _source; | ||||||
|         device.remove("partitions").remove("/filllevel"); |         device.remove("disk/").remove("/usedPercent"); | ||||||
|         int index = m_devices["mount"].indexOf(device); |         auto index = m_devices["mount"].indexOf(device); | ||||||
|         if (index > -1) { |         if (index > -1) { | ||||||
|             QString key = QString("hdd%1").arg(index); |             auto key = QString("hdd%1").arg(index); | ||||||
|             m_map[_source] = key; |             m_map.insert(_source, key); | ||||||
|             m_formatter[key] = AWKeysAggregator::FormatterType::Float; |             m_formatter[key] = AWKeysAggregator::FormatterType::Float; | ||||||
|             // additional keys |             // additional keys | ||||||
|             m_formatter[QString("hddtotmb%1").arg(index)] |             m_formatter[QString("hddtotmb%1").arg(index)] = AWKeysAggregator::FormatterType::MemMBFormat; | ||||||
|                 = AWKeysAggregator::FormatterType::MemMBFormat; |             m_formatter[QString("hddtotgb%1").arg(index)] = AWKeysAggregator::FormatterType::MemGBFormat; | ||||||
|             m_formatter[QString("hddtotgb%1").arg(index)] |  | ||||||
|                 = AWKeysAggregator::FormatterType::MemGBFormat; |  | ||||||
|         } |         } | ||||||
|     } else if (_source.contains(mountFreeRegExp)) { |     } else if (_source.contains(mountFreeRegExp)) { | ||||||
|         // free space |         // free space | ||||||
|         QString device = _source; |         auto device = _source; | ||||||
|         device.remove("partitions").remove("/freespace"); |         device.remove("disk/").remove("/free"); | ||||||
|         int index = m_devices["mount"].indexOf(device); |         auto index = m_devices["mount"].indexOf(device); | ||||||
|         if (index > -1) { |         if (index > -1) { | ||||||
|             // mb |             // mb | ||||||
|             QString key = QString("hddfreemb%1").arg(index); |             auto key = QString("hddfreemb%1").arg(index); | ||||||
|             m_map[_source] = key; |             m_map.insert(_source, key); | ||||||
|             m_formatter[key] = AWKeysAggregator::FormatterType::MemMBFormat; |             m_formatter[key] = AWKeysAggregator::FormatterType::MemMBFormat; | ||||||
|             // gb |             // gb | ||||||
|             key = QString("hddfreegb%1").arg(index); |             key = QString("hddfreegb%1").arg(index); | ||||||
|             m_map.insertMulti(_source, key); |             m_map.insert(_source, key); | ||||||
|             m_formatter[key] = AWKeysAggregator::FormatterType::MemGBFormat; |             m_formatter[key] = AWKeysAggregator::FormatterType::MemGBFormat; | ||||||
|         } |         } | ||||||
|     } else if (_source.contains(mountUsedRegExp)) { |     } else if (_source.contains(mountUsedRegExp)) { | ||||||
|         // used |         // used | ||||||
|         QString device = _source; |         auto device = _source; | ||||||
|         device.remove("partitions").remove("/usedspace"); |         device.remove("disk/").remove("/used"); | ||||||
|         int index = m_devices["mount"].indexOf(device); |         auto index = m_devices["mount"].indexOf(device); | ||||||
|         if (index > -1) { |         if (index > -1) { | ||||||
|             // mb |             // mb | ||||||
|             QString key = QString("hddmb%1").arg(index); |             auto key = QString("hddmb%1").arg(index); | ||||||
|             m_map[_source] = key; |             m_map.insert(_source, key); | ||||||
|             m_formatter[key] = AWKeysAggregator::FormatterType::MemMBFormat; |             m_formatter[key] = AWKeysAggregator::FormatterType::MemMBFormat; | ||||||
|             // gb |             // gb | ||||||
|             key = QString("hddgb%1").arg(index); |             key = QString("hddgb%1").arg(index); | ||||||
|             m_map.insertMulti(_source, key); |             m_map.insert(_source, key); | ||||||
|             m_formatter[key] = AWKeysAggregator::FormatterType::MemGBFormat; |             m_formatter[key] = AWKeysAggregator::FormatterType::MemGBFormat; | ||||||
|         } |         } | ||||||
|     } else if (_source.startsWith("hdd/temperature")) { |     } else if (_source.startsWith("cpu/loadaverages/loadaverage")) { | ||||||
|         // hdd temperature |  | ||||||
|         QString device = _source; |  | ||||||
|         device.remove("hdd/temperature"); |  | ||||||
|         int index = m_devices["hdd"].indexOf(device); |  | ||||||
|         if (index > -1) { |  | ||||||
|             QString key = QString("hddtemp%1").arg(index); |  | ||||||
|             m_map[_source] = key; |  | ||||||
|             m_formatter[key] = AWKeysAggregator::FormatterType::Temperature; |  | ||||||
|         } |  | ||||||
|     } else if (_source.startsWith("cpu/system/loadavg")) { |  | ||||||
|         // load average |         // load average | ||||||
|         QString time = _source; |         auto time = _source; | ||||||
|         time.remove("cpu/system/loadavg"); |         time.remove("cpu/loadaverages/loadaverage"); | ||||||
|         QString key = QString("la%1").arg(time); |         auto key = QString("la%1").arg(time); | ||||||
|         m_map[_source] = key; |         m_map.insert(_source, key); | ||||||
|         m_formatter[key] = AWKeysAggregator::FormatterType::FloatTwoSymbols; |         m_formatter[key] = AWKeysAggregator::FormatterType::FloatTwoSymbols; | ||||||
|     } else if (_source == "mem/physical/application") { |     } else if (_source == "memory/physical/application") { | ||||||
|         // app memory |         // app memory | ||||||
|         // mb |         // mb | ||||||
|         m_map[_source] = "memmb"; |         m_map.insert(_source, "memmb"); | ||||||
|         m_formatter["memmb"] = AWKeysAggregator::FormatterType::MemMBFormat; |         m_formatter["memmb"] = AWKeysAggregator::FormatterType::MemMBFormat; | ||||||
|         // gb |         // gb | ||||||
|         m_map.insertMulti(_source, "memgb"); |         m_map.insert(_source, "memgb"); | ||||||
|         m_formatter["memgb"] = AWKeysAggregator::FormatterType::MemGBFormat; |         m_formatter["memgb"] = AWKeysAggregator::FormatterType::MemGBFormat; | ||||||
|     } else if (_source == "mem/physical/free") { |     } else if (_source == "memory/physical/free") { | ||||||
|         // free memory |         // free memory | ||||||
|         // mb |         // mb | ||||||
|         m_map[_source] = "memfreemb"; |         m_map.insert(_source, "memfreemb"); | ||||||
|         m_formatter["memfreemb"] = AWKeysAggregator::FormatterType::MemMBFormat; |         m_formatter["memfreemb"] = AWKeysAggregator::FormatterType::MemMBFormat; | ||||||
|         // gb |         // gb | ||||||
|         m_map.insertMulti(_source, "memfreegb"); |         m_map.insert(_source, "memfreegb"); | ||||||
|         m_formatter["memfreegb"] = AWKeysAggregator::FormatterType::MemGBFormat; |         m_formatter["memfreegb"] = AWKeysAggregator::FormatterType::MemGBFormat; | ||||||
|     } else if (_source == "mem/physical/used") { |     } else if (_source == "memory/physical/used") { | ||||||
|         // used memory |         // used memory | ||||||
|         // mb |         // mb | ||||||
|         m_map[_source] = "memusedmb"; |         m_map.insert(_source, "memusedmb"); | ||||||
|         m_formatter["memusedmb"] = AWKeysAggregator::FormatterType::MemMBFormat; |         m_formatter["memusedmb"] = AWKeysAggregator::FormatterType::MemMBFormat; | ||||||
|         // gb |         // gb | ||||||
|         m_map.insertMulti(_source, "memusedgb"); |         m_map.insert(_source, "memusedgb"); | ||||||
|         m_formatter["memusedgb"] = AWKeysAggregator::FormatterType::MemGBFormat; |         m_formatter["memusedgb"] = AWKeysAggregator::FormatterType::MemGBFormat; | ||||||
|     } else if (_source == "network/current/name") { |     } else if (_source == "extsysmon/network/device") { | ||||||
|         // network device |         // network device | ||||||
|         m_map[_source] = "netdev"; |         m_map.insert(_source, "netdev"); | ||||||
|         m_formatter["netdev"] = AWKeysAggregator::FormatterType::NoFormat; |         m_formatter["netdev"] = AWKeysAggregator::FormatterType::NoFormat; | ||||||
|     } else if (_source.startsWith("network/response")) { |     } 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 |         // network response | ||||||
|         QString key = _source; |         auto key = _source; | ||||||
|         key.remove("network/"); |         key.remove("extsysmon/requests/"); | ||||||
|         m_map[_source] = key; |         m_map.insert(_source, key); | ||||||
|         m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat; |         m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat; | ||||||
|     } else if (_source.contains(netRegExp)) { |     } else if (_source.contains(netRegExp)) { | ||||||
|         // network speed |         // network speed | ||||||
|         QString type = _source.contains("receiver") ? "down" : "up"; |         auto type = _source.endsWith("download") ? "down" : "up"; | ||||||
|         int index = m_devices["net"].indexOf(_source.split('/')[2]); |         auto index = m_devices["net"].indexOf(_source.split('/')[1]); | ||||||
|         if (index > -1) { |         if (index > -1) { | ||||||
|             // kb |             // kb | ||||||
|             QString key = QString("%1kb%2").arg(type).arg(index); |             auto key = QString("%1kb%2").arg(type).arg(index); | ||||||
|             m_map[_source] = key; |             m_map.insert(_source, key); | ||||||
|             m_formatter[key] = AWKeysAggregator::FormatterType::Integer; |             m_formatter[key] = AWKeysAggregator::FormatterType::MemKBFormat; | ||||||
|             // smart |             // smart | ||||||
|             key = QString("%1%2").arg(type).arg(index); |             key = QString("%1%2").arg(type).arg(index); | ||||||
|             m_map.insertMulti(_source, key); |             m_map.insert(_source, key); | ||||||
|             m_formatter[key] = AWKeysAggregator::FormatterType::NetSmartFormat; |             m_formatter[key] = AWKeysAggregator::FormatterType::NetSmartFormat; | ||||||
|             // units |             // units | ||||||
|             key = QString("%1units%2").arg(type).arg(index); |             key = QString("%1units%2").arg(type).arg(index); | ||||||
|             m_map.insertMulti(_source, key); |             m_map.insert(_source, key); | ||||||
|             m_formatter[key] = AWKeysAggregator::FormatterType::NetSmartUnits; |             m_formatter[key] = AWKeysAggregator::FormatterType::NetSmartUnits; | ||||||
|         } |         } | ||||||
|     } else if (_source.contains(netTotalRegExp)) { |     } else if (_source.contains(netTotalRegExp)) { | ||||||
|         // network data total |         // network data total | ||||||
|         QString type = _source.contains("receiver") ? "down" : "up"; |         auto type = _source.endsWith("Download") ? "down" : "up"; | ||||||
|         int index = m_devices["net"].indexOf(_source.split('/')[2]); |         auto index = m_devices["net"].indexOf(_source.split('/')[1]); | ||||||
|         if (index > -1) { |         if (index > -1) { | ||||||
|             // kb |             // kb | ||||||
|             QString key = QString("%1totkb%2").arg(type).arg(index); |             auto key = QString("%1totkb%2").arg(type).arg(index); | ||||||
|             m_map[_source] = key; |             m_map.insert(_source, key); | ||||||
|             m_formatter[key] = AWKeysAggregator::FormatterType::Integer; |             m_formatter[key] = AWKeysAggregator::FormatterType::MemKBFormat; | ||||||
|             // mb |             // mb | ||||||
|             key = QString("%1tot%2").arg(type).arg(index); |             key = QString("%1tot%2").arg(type).arg(index); | ||||||
|             m_map.insertMulti(_source, key); |             m_map.insert(_source, key); | ||||||
|             m_formatter[key] = AWKeysAggregator::FormatterType::MemMBFormat; |             m_formatter[key] = AWKeysAggregator::FormatterType::MemMBFormat; | ||||||
|         } |         } | ||||||
|     } else if (_source.startsWith("upgrade")) { |     } else if (_source.startsWith("extsysmon/upgrade")) { | ||||||
|         // package manager |         // package manager | ||||||
|         QString key = _source; |         auto key = _source; | ||||||
|         key.remove("upgrade/"); |         key.remove("extsysmon/upgrade/"); | ||||||
|         m_map[_source] = key; |         m_map.insert(_source, key); | ||||||
|         m_formatter[key] = AWKeysAggregator::FormatterType::IntegerThree; |         m_formatter[key] = AWKeysAggregator::FormatterType::IntegerThree; | ||||||
|     } else if (_source.startsWith("player")) { |     } else if (_source.startsWith("extsysmon/player")) { | ||||||
|         // player |         // player | ||||||
|         QString key = _source; |         auto key = _source; | ||||||
|         key.remove("player/"); |         key.remove("extsysmon/player/"); | ||||||
|         m_map[_source] = key; |         m_map.insert(_source, key); | ||||||
|         m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat; |         m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat; | ||||||
|     } else if (_source == "ps/running/count") { |     } else if (_source == "extsysmon/ps/running") { | ||||||
|         // running processes count |         // running processes count | ||||||
|         m_map[_source] = "pscount"; |         m_map.insert(_source, "pscount"); | ||||||
|         m_formatter["pscount"] = AWKeysAggregator::FormatterType::NoFormat; |         m_formatter["pscount"] = AWKeysAggregator::FormatterType::NoFormat; | ||||||
|     } else if (_source == "ps/running/list") { |     } else if (_source == "extsysmon/ps/list") { | ||||||
|         // list of running processes |         // list of running processes | ||||||
|         m_map[_source] = "ps"; |         m_map.insert(_source, "ps"); | ||||||
|         m_formatter["ps"] = AWKeysAggregator::FormatterType::List; |         m_formatter["ps"] = AWKeysAggregator::FormatterType::List; | ||||||
|     } else if (_source == "ps/total/count") { |     } else if (_source == "extsysmon/ps/count") { | ||||||
|         // total processes count |         // total processes count | ||||||
|         m_map[_source] = "pstot"; |         m_map.insert(_source, "pstot"); | ||||||
|         m_formatter["pstot"] = AWKeysAggregator::FormatterType::NoFormat; |         m_formatter["pstot"] = AWKeysAggregator::FormatterType::NoFormat; | ||||||
|     } else if (_source.startsWith("quotes")) { |     } else if (_source.startsWith("extsysmon/quotes")) { | ||||||
|         // quotes |         // quotes | ||||||
|         QString key = _source; |         auto key = _source; | ||||||
|         key.remove("quotes/"); |         key.remove("extsysmon/quotes/"); | ||||||
|         m_map[_source] = key; |         m_map.insert(_source, key); | ||||||
|         m_formatter[key] = AWKeysAggregator::FormatterType::Quotes; |         m_formatter[key] = AWKeysAggregator::FormatterType::Quotes; | ||||||
|     } else if (_source == "mem/swap/free") { |     } else if (_source == "memory/swap/free") { | ||||||
|         // free swap |         // free swap | ||||||
|         // mb |         // mb | ||||||
|         m_map[_source] = "swapfreemb"; |         m_map.insert(_source, "swapfreemb"); | ||||||
|         m_formatter["swapfreemb"] |         m_formatter["swapfreemb"] = AWKeysAggregator::FormatterType::MemMBFormat; | ||||||
|             = AWKeysAggregator::FormatterType::MemMBFormat; |  | ||||||
|         // gb |         // gb | ||||||
|         m_map.insertMulti(_source, "swapfreegb"); |         m_map.insert(_source, "swapfreegb"); | ||||||
|         m_formatter["swapfreegb"] |         m_formatter["swapfreegb"] = AWKeysAggregator::FormatterType::MemGBFormat; | ||||||
|             = AWKeysAggregator::FormatterType::MemGBFormat; |     } else if (_source == "memory/swap/used") { | ||||||
|     } else if (_source == "mem/swap/used") { |  | ||||||
|         // used swap |         // used swap | ||||||
|         // mb |         // mb | ||||||
|         m_map[_source] = "swapmb"; |         m_map.insert(_source, "swapmb"); | ||||||
|         m_formatter["swapmb"] = AWKeysAggregator::FormatterType::MemMBFormat; |         m_formatter["swapmb"] = AWKeysAggregator::FormatterType::MemMBFormat; | ||||||
|         // gb |         // gb | ||||||
|         m_map.insertMulti(_source, "swapgb"); |         m_map.insert(_source, "swapgb"); | ||||||
|         m_formatter["swapgb"] = AWKeysAggregator::FormatterType::MemGBFormat; |         m_formatter["swapgb"] = AWKeysAggregator::FormatterType::MemGBFormat; | ||||||
|     } else if (_source.startsWith("lmsensors/")) { |     } else if (_source.startsWith("lmsensors/") || _source.contains(cpuTempRegExp) | ||||||
|  |                || _source == "cpu/all/averageTemperature") { | ||||||
|         // temperature |         // temperature | ||||||
|         int index = m_devices["temp"].indexOf(_source); |         auto index = m_devices["temp"].indexOf(_source); | ||||||
|         // HACK on DE initialization there are no units key |         // HACK on DE initialization there are no units key | ||||||
|         if (_units.isEmpty()) |         if (_units == KSysGuard::UnitInvalid) | ||||||
|             return QStringList({QString("temp%1").arg(index)}); |             return QStringList({QString("temp%1").arg(index)}); | ||||||
|         if (index > -1) { |         if (index > -1) { | ||||||
|             QString key = QString("temp%1").arg(index); |             auto key = QString("temp%1").arg(index); | ||||||
|             m_map[_source] = key; |             m_map.insert(_source, key); | ||||||
|             m_formatter[key] |             m_formatter[key] = _units == KSysGuard::UnitCelsius ? AWKeysAggregator::FormatterType::Temperature | ||||||
|                 = _units == "°C" ? AWKeysAggregator::FormatterType::Temperature |  | ||||||
|                                                                 : AWKeysAggregator::FormatterType::Integer; |                                                                 : AWKeysAggregator::FormatterType::Integer; | ||||||
|         } |         } | ||||||
|     } else if (_source == "Local") { |     } else if (_source == "extsysmon/time/now") { | ||||||
|         // time |         // time | ||||||
|         m_map[_source] = "time"; |         m_map.insert(_source, "time"); | ||||||
|         m_formatter["time"] = AWKeysAggregator::FormatterType::Time; |         m_formatter["time"] = AWKeysAggregator::FormatterType::Time; | ||||||
|         // custom time |         // custom time | ||||||
|         m_map.insertMulti(_source, "ctime"); |         m_map.insert(_source, "ctime"); | ||||||
|         m_formatter["ctime"] = AWKeysAggregator::FormatterType::TimeCustom; |         m_formatter["ctime"] = AWKeysAggregator::FormatterType::TimeCustom; | ||||||
|         // ISO time |         // ISO time | ||||||
|         m_map.insertMulti(_source, "isotime"); |         m_map.insert(_source, "isotime"); | ||||||
|         m_formatter["isotime"] = AWKeysAggregator::FormatterType::TimeISO; |         m_formatter["isotime"] = AWKeysAggregator::FormatterType::TimeISO; | ||||||
|         // long time |         // long time | ||||||
|         m_map.insertMulti(_source, "longtime"); |         m_map.insert(_source, "longtime"); | ||||||
|         m_formatter["longtime"] = AWKeysAggregator::FormatterType::TimeLong; |         m_formatter["longtime"] = AWKeysAggregator::FormatterType::TimeLong; | ||||||
|         // short time |         // short time | ||||||
|         m_map.insertMulti(_source, "shorttime"); |         m_map.insert(_source, "shorttime"); | ||||||
|         m_formatter["shorttime"] = AWKeysAggregator::FormatterType::TimeShort; |         m_formatter["shorttime"] = AWKeysAggregator::FormatterType::TimeShort; | ||||||
|         // timestamp |         // timestamp | ||||||
|         m_map.insertMulti(_source, "tstime"); |         m_map.insert(_source, "tstime"); | ||||||
|         m_formatter["tstime"] = AWKeysAggregator::FormatterType::Timestamp; |         m_formatter["tstime"] = AWKeysAggregator::FormatterType::Timestamp; | ||||||
|     } else if (_source == "system/uptime") { |     } 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 |         // uptime | ||||||
|         m_map[_source] = "uptime"; |         m_map.insert(_source, "uptime"); | ||||||
|         m_formatter["uptime"] = AWKeysAggregator::FormatterType::Uptime; |         m_formatter["uptime"] = AWKeysAggregator::FormatterType::Uptime; | ||||||
|         // custom uptime |         // custom uptime | ||||||
|         m_map.insertMulti(_source, "cuptime"); |         m_map.insert(_source, "cuptime"); | ||||||
|         m_formatter["cuptime"] = AWKeysAggregator::FormatterType::UptimeCustom; |         m_formatter["cuptime"] = AWKeysAggregator::FormatterType::UptimeCustom; | ||||||
|     } else if (_source.startsWith("weather/temperature")) { |     } else if (_source.startsWith("extsysmon/weather/temperature")) { | ||||||
|         // temperature |         // temperature | ||||||
|         QString key = _source; |         auto key = _source; | ||||||
|         key.remove("weather/"); |         key.remove("extsysmon/weather/"); | ||||||
|         m_map[_source] = key; |         m_map.insert(_source, key); | ||||||
|         m_formatter[key] = AWKeysAggregator::FormatterType::Temperature; |         m_formatter[key] = AWKeysAggregator::FormatterType::Temperature; | ||||||
|     } else if (_source.startsWith("weather/")) { |     } else if (_source.startsWith("extsysmon/weather/")) { | ||||||
|         // other weather |         // other weather | ||||||
|         QString key = _source; |         auto key = _source; | ||||||
|         key.remove("weather/"); |         key.remove("extsysmon/weather/"); | ||||||
|         m_map[_source] = key; |         m_map.insert(_source, key); | ||||||
|         m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat; |         m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat; | ||||||
|     } else if (_source.startsWith("load/load")) { |     } else if (_source.startsWith("extsysmon/load/load")) { | ||||||
|         // load source |         // load source | ||||||
|         QString key = _source; |         auto key = _source; | ||||||
|         key.remove("load/"); |         key.remove("extsysmon/load/"); | ||||||
|         m_map[_source] = key; |         m_map.insert(_source, key); | ||||||
|         m_formatter[key] = AWKeysAggregator::FormatterType::Temperature; |         m_formatter[key] = AWKeysAggregator::FormatterType::Temperature; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     QStringList foundKeys = keysFromSource(_source); |     auto foundKeys = keysFromSource(_source); | ||||||
|  |  | ||||||
|     // rewrite formatters for custom ones |     // rewrite formatters for custom ones | ||||||
|     QStringList customFormattersKeys; |     QStringList customFormattersKeys; | ||||||
|     if (m_customFormatters) |     if (m_customFormatters) | ||||||
|         customFormattersKeys = m_customFormatters->definedFormatters(); |         customFormattersKeys = m_customFormatters->definedFormatters(); | ||||||
|     qCInfo(LOG_AW) << "Looking for formatters" << foundKeys << "in" |     qCInfo(LOG_AW) << "Looking for formatters" << foundKeys << "in" << customFormattersKeys; | ||||||
|                    << customFormattersKeys; |  | ||||||
|     for (auto &key : foundKeys) { |     for (auto &key : foundKeys) { | ||||||
|         if (!customFormattersKeys.contains(key)) |         if (!customFormattersKeys.contains(key)) | ||||||
|             continue; |             continue; | ||||||
| @ -425,9 +429,7 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, | |||||||
|  |  | ||||||
|     // drop key from dictionary if no one user requested key required it |     // drop key from dictionary if no one user requested key required it | ||||||
|     qCInfo(LOG_AW) << "Looking for keys" << foundKeys << "in" << _keys; |     qCInfo(LOG_AW) << "Looking for keys" << foundKeys << "in" << _keys; | ||||||
|     bool required |     auto required = _keys.isEmpty() || std::any_of(foundKeys.cbegin(), foundKeys.cend(), [&_keys](auto &key) { | ||||||
|         = _keys.isEmpty() || std::any_of(foundKeys.cbegin(), foundKeys.cend(), |  | ||||||
|                                          [&_keys](const QString &key) { |  | ||||||
|                         return _keys.contains(key); |                         return _keys.contains(key); | ||||||
|                     }); |                     }); | ||||||
|     if (!required) { |     if (!required) { | ||||||
|  | |||||||
| @ -15,11 +15,11 @@ | |||||||
|  *   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 | #include <ksysguard/formatter/Unit.h> | ||||||
| #define AWDATAENGINEMAPPER_H |  | ||||||
|  |  | ||||||
| #include <QHash> | #include <QMultiHash> | ||||||
| #include <QObject> | #include <QObject> | ||||||
|  |  | ||||||
| #include "awkeysaggregator.h" | #include "awkeysaggregator.h" | ||||||
| @ -32,15 +32,13 @@ class AWDataEngineMapper : public QObject | |||||||
|     Q_OBJECT |     Q_OBJECT | ||||||
|  |  | ||||||
| public: | public: | ||||||
|     explicit AWDataEngineMapper(QObject *_parent = nullptr, |     explicit AWDataEngineMapper(QObject *_parent = nullptr, AWFormatterHelper *_custom = nullptr); | ||||||
|                                 AWFormatterHelper *_custom = nullptr); |     ~AWDataEngineMapper() override = default; | ||||||
|     virtual ~AWDataEngineMapper(); |  | ||||||
|     // get methods |     // get methods | ||||||
|     AWKeysAggregator::FormatterType formatter(const QString &_key) const; |     [[nodiscard]] AWKeysAggregator::FormatterType formatter(const QString &_key) const; | ||||||
|     QStringList keysFromSource(const QString &_source) const; |     [[nodiscard]] QStringList keysFromSource(const QString &_source) const; | ||||||
|     // set methods |     // set methods | ||||||
|     QStringList registerSource(const QString &_source, const QString &_units, |     QStringList registerSource(const QString &_source, KSysGuard::Unit _units, const QStringList &_keys); | ||||||
|                                const QStringList &_keys); |  | ||||||
|     void setDevices(const QHash<QString, QStringList> &_devices); |     void setDevices(const QHash<QString, QStringList> &_devices); | ||||||
|  |  | ||||||
| private: | private: | ||||||
| @ -48,8 +46,5 @@ private: | |||||||
|     // variables |     // variables | ||||||
|     QHash<QString, QStringList> m_devices; |     QHash<QString, QStringList> m_devices; | ||||||
|     QHash<QString, AWKeysAggregator::FormatterType> m_formatter; |     QHash<QString, AWKeysAggregator::FormatterType> m_formatter; | ||||||
|     QHash<QString, QString> m_map; |     QMultiHash<QString, QString> m_map; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif /* AWDATAENGINEMAPPER_H */ |  | ||||||
|  | |||||||
| @ -32,24 +32,16 @@ AWDBusAdaptor::AWDBusAdaptor(AWKeys *_parent) | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| AWDBusAdaptor::~AWDBusAdaptor() | QStringList AWDBusAdaptor::ActiveServices() | ||||||
| { | { | ||||||
|     qCDebug(LOG_DBUS) << __PRETTY_FUNCTION__; |     auto listServices = QDBusConnection::sessionBus().interface()->call(QDBus::BlockWithGui, "ListNames"); | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| QStringList AWDBusAdaptor::ActiveServices() const |  | ||||||
| { |  | ||||||
|     QDBusMessage 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, QString service) { |  | ||||||
|         if (service.startsWith(AWDBUS_SERVICE)) |         if (service.startsWith(AWDBUS_SERVICE)) | ||||||
|             source.append(service); |             source.append(service); | ||||||
|         return source; |         return source; | ||||||
| @ -86,8 +78,7 @@ void AWDBusAdaptor::SetLogLevel(const QString &what, const int level) | |||||||
|     qCDebug(LOG_DBUS) << "Set log level" << level << "for" << what; |     qCDebug(LOG_DBUS) << "Set log level" << level << "for" << what; | ||||||
|  |  | ||||||
|     if (level >= m_logLevels.count()) { |     if (level >= m_logLevels.count()) { | ||||||
|         qCDebug(LOG_DBUS) << "Invalid logging level" << level |         qCDebug(LOG_DBUS) << "Invalid logging level" << level << "should be less than" << m_logLevels.count(); | ||||||
|                           << "should be less than" << m_logLevels.count(); |  | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @ -96,19 +87,15 @@ void AWDBusAdaptor::SetLogLevel(const QString &what, const int level) | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void AWDBusAdaptor::SetLogLevel(const QString &what, const QString &level, | void AWDBusAdaptor::SetLogLevel(const QString &what, const QString &level, const bool enabled) | ||||||
|                                 const bool enabled) |  | ||||||
| { | { | ||||||
|     qCDebug(LOG_DBUS) << "Set log level" << level << "enabled" << enabled |     qCDebug(LOG_DBUS) << "Set log level" << level << "enabled" << enabled << "for" << what; | ||||||
|                       << "for" << what; |  | ||||||
|  |  | ||||||
|     if (!m_logLevels.contains(level)) { |     if (!m_logLevels.contains(level)) { | ||||||
|         qCDebug(LOG_DBUS) << "Invalid logging level" << level << "should be in" |         qCDebug(LOG_DBUS) << "Invalid logging level" << level << "should be in" << m_logLevels; | ||||||
|                           << m_logLevels; |  | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     QString state = enabled ? "true" : "false"; |     auto state = enabled ? "true" : "false"; | ||||||
|     QLoggingCategory::setFilterRules( |     QLoggingCategory::setFilterRules(QString("%1.%2=%3").arg(what, level, state)); | ||||||
|         QString("%1.%2=%3").arg(what).arg(level).arg(state)); |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -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,24 +31,20 @@ class AWDBusAdaptor : public QDBusAbstractAdaptor | |||||||
|  |  | ||||||
| public: | public: | ||||||
|     explicit AWDBusAdaptor(AWKeys *_parent = nullptr); |     explicit AWDBusAdaptor(AWKeys *_parent = nullptr); | ||||||
|     virtual ~AWDBusAdaptor(); |     ~AWDBusAdaptor() override = default; | ||||||
|  |  | ||||||
| public slots: | public slots: | ||||||
|     // get methods |     // get methods | ||||||
|     QStringList ActiveServices() const; |     [[nodiscard]] static QStringList ActiveServices(); | ||||||
|     QString Info(const QString &key) const; |     [[nodiscard]] QString Info(const QString &key) const; | ||||||
|     QStringList Keys(const QString ®exp) const; |     [[nodiscard]] QStringList Keys(const QString ®exp) const; | ||||||
|     QString Value(const QString &key) const; |     [[nodiscard]] QString Value(const QString &key) const; | ||||||
|     qlonglong WhoAmI() const; |     [[nodiscard]] qlonglong WhoAmI() const; | ||||||
|     // set methods |     // set methods | ||||||
|     void SetLogLevel(const QString &what, const int level); |     void SetLogLevel(const QString &what, int level); | ||||||
|     void SetLogLevel(const QString &what, const QString &level, |     void SetLogLevel(const QString &what, const QString &level, bool enabled); | ||||||
|                      const bool enabled); |  | ||||||
|  |  | ||||||
| private: | 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 */ |  | ||||||
|  | |||||||
| @ -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> | ||||||
|  |  | ||||||
| @ -28,8 +26,5 @@ class AWPlugin : public QQmlExtensionPlugin | |||||||
|     Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface") |     Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface") | ||||||
|  |  | ||||||
| public: | public: | ||||||
|     void registerTypes(const char *uri); |     void registerTypes(const char *uri) override; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif /* AWPLUGIN_H */ |  | ||||||
|  | |||||||
| @ -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__; |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -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" | ||||||
|  |  | ||||||
| @ -27,10 +25,6 @@ class AWFormatterConfig : public AWAbstractPairConfig | |||||||
|     Q_OBJECT |     Q_OBJECT | ||||||
|  |  | ||||||
| public: | public: | ||||||
|     explicit AWFormatterConfig(QWidget *_parent = nullptr, |     explicit AWFormatterConfig(QWidget *_parent = nullptr, const QStringList &_keys = QStringList()); | ||||||
|                                const QStringList &_keys = QStringList()); |     ~AWFormatterConfig() override = default; | ||||||
|     virtual ~AWFormatterConfig(); |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif /* AWFORMATTERCONFIG_H */ |  | ||||||
|  | |||||||
| @ -33,14 +33,13 @@ | |||||||
| #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", |     , AWAbstractPairHelper("awesomewidgets/formatters/formatters.ini", "Formatters") | ||||||
|                            "Formatters") |  | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << __PRETTY_FUNCTION__; |     qCDebug(LOG_AW) << __PRETTY_FUNCTION__; | ||||||
|  |  | ||||||
|     initItems(); |     AWFormatterHelper::initItems(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -56,15 +55,12 @@ AWFormatterHelper::~AWFormatterHelper() | |||||||
| void AWFormatterHelper::initItems() | void AWFormatterHelper::initItems() | ||||||
| { | { | ||||||
|     initFormatters(); |     initFormatters(); | ||||||
|     AWAbstractPairHelper::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) |             qCWarning(LOG_AW) << "Invalid formatter" << name << "found in" << key; | ||||||
|                 << "Invalid formatter" << name << "found in" << key; |  | ||||||
|             continue; |             continue; | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @ -73,13 +69,11 @@ void AWFormatterHelper::initItems() | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| QString AWFormatterHelper::convert(const QVariant &_value, | QString AWFormatterHelper::convert(const QVariant &_value, const QString &_name) const | ||||||
|                                    const QString &_name) const |  | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Convert value" << _value << "for" << _name; |     qCDebug(LOG_AW) << "Convert value" << _value << "for" << _name; | ||||||
|  |  | ||||||
|     return m_formatters.contains(_name) ? m_formatters[_name]->convert(_value) |     return m_formatters.contains(_name) ? m_formatters[_name]->convert(_value) : _value.toString(); | ||||||
|                                         : _value.toString(); |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -92,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; | ||||||
| @ -107,7 +101,7 @@ void AWFormatterHelper::editPairs() | |||||||
|  |  | ||||||
| QStringList AWFormatterHelper::leftKeys() | QStringList AWFormatterHelper::leftKeys() | ||||||
| { | { | ||||||
|     return QStringList(); |     return {}; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -119,19 +113,16 @@ QStringList AWFormatterHelper::rightKeys() | |||||||
|  |  | ||||||
| void AWFormatterHelper::editItems() | void AWFormatterHelper::editItems() | ||||||
| { | { | ||||||
|     repaintList(); |     auto ret = exec(); | ||||||
|     int ret = exec(); |  | ||||||
|     qCInfo(LOG_AW) << "Dialog returns" << ret; |     qCInfo(LOG_AW) << "Dialog returns" << ret; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| AWAbstractFormatter::FormatterClass | AWAbstractFormatter::FormatterClass AWFormatterHelper::defineFormatterClass(const QString &_stringType) | ||||||
| AWFormatterHelper::defineFormatterClass(const QString &_stringType) const |  | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Define formatter class for" << _stringType; |     qCDebug(LOG_AW) << "Define formatter class for" << _stringType; | ||||||
|  |  | ||||||
|     AWAbstractFormatter::FormatterClass formatter |     auto formatter = AWAbstractFormatter::FormatterClass::NoFormat; | ||||||
|         = 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") | ||||||
| @ -159,50 +150,41 @@ 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) { |                             [&filePath](auto item) { return (item->filePath() == filePath); })) | ||||||
|                                 return (item->fileName() == filePath); |  | ||||||
|                             })) |  | ||||||
|                 continue; |                 continue; | ||||||
|  |  | ||||||
|             auto metadata = readMetadata(filePath); |             auto metadata = readMetadata(filePath); | ||||||
|             switch (metadata.second) { |             switch (metadata.second) { | ||||||
|             case AWAbstractFormatter::FormatterClass::DateTime: |             case AWAbstractFormatter::FormatterClass::DateTime: | ||||||
|                 m_formattersClasses[metadata.first] |                 m_formattersClasses[metadata.first] = new AWDateTimeFormatter(this, filePath); | ||||||
|                     = new AWDateTimeFormatter(this, filePath); |  | ||||||
|                 break; |                 break; | ||||||
|             case AWAbstractFormatter::FormatterClass::Float: |             case AWAbstractFormatter::FormatterClass::Float: | ||||||
|                 m_formattersClasses[metadata.first] |                 m_formattersClasses[metadata.first] = new AWFloatFormatter(this, filePath); | ||||||
|                     = new AWFloatFormatter(this, filePath); |  | ||||||
|                 break; |                 break; | ||||||
|             case AWAbstractFormatter::FormatterClass::List: |             case AWAbstractFormatter::FormatterClass::List: | ||||||
|                 m_formattersClasses[metadata.first] |                 m_formattersClasses[metadata.first] = new AWListFormatter(this, filePath); | ||||||
|                     = new AWListFormatter(this, filePath); |  | ||||||
|                 break; |                 break; | ||||||
|             case AWAbstractFormatter::FormatterClass::Script: |             case AWAbstractFormatter::FormatterClass::Script: | ||||||
|                 m_formattersClasses[metadata.first] |                 m_formattersClasses[metadata.first] = new AWScriptFormatter(this, filePath); | ||||||
|                     = new AWScriptFormatter(this, filePath); |  | ||||||
|                 break; |                 break; | ||||||
|             case AWAbstractFormatter::FormatterClass::String: |             case AWAbstractFormatter::FormatterClass::String: | ||||||
|                 m_formattersClasses[metadata.first] |                 m_formattersClasses[metadata.first] = new AWStringFormatter(this, filePath); | ||||||
|                     = new AWStringFormatter(this, filePath); |  | ||||||
|                 break; |                 break; | ||||||
|             case AWAbstractFormatter::FormatterClass::Json: |             case AWAbstractFormatter::FormatterClass::Json: | ||||||
|                 m_formattersClasses[metadata.first] |                 m_formattersClasses[metadata.first] = new AWJsonFormatter(this, filePath); | ||||||
|                     = new AWJsonFormatter(this, filePath); |  | ||||||
|                 break; |                 break; | ||||||
|             case AWAbstractFormatter::FormatterClass::NoFormat: |             case AWAbstractFormatter::FormatterClass::NoFormat: | ||||||
|                 m_formattersClasses[metadata.first] |                 m_formattersClasses[metadata.first] = new AWNoFormatter(this, filePath); | ||||||
|                     = new AWNoFormatter(this, filePath); |  | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @ -210,51 +192,48 @@ void AWFormatterHelper::initFormatters() | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| QPair<QString, AWAbstractFormatter::FormatterClass> | QPair<QString, AWAbstractFormatter::FormatterClass> AWFormatterHelper::readMetadata(const QString &_filePath) | ||||||
| AWFormatterHelper::readMetadata(const QString &_filePath) const |  | ||||||
| { | { | ||||||
|     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"); | ||||||
|     QString name = settings.value("Name", _filePath).toString(); |     auto name = settings.value("Name", _filePath).toString(); | ||||||
|     QString type = settings.value("X-AW-Type", "NoFormat").toString(); |     auto type = settings.value("X-AW-Type", "NoFormat").toString(); | ||||||
|     AWAbstractFormatter::FormatterClass formatter = defineFormatterClass(type); |     auto formatter = defineFormatterClass(type); | ||||||
|     settings.endGroup(); |     settings.endGroup(); | ||||||
|  |  | ||||||
|     return QPair<QString, AWAbstractFormatter::FormatterClass>(name, formatter); |     return {name, formatter}; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void AWFormatterHelper::doCreateItem() | void AWFormatterHelper::doCreateItem(QListWidget *_widget) | ||||||
| { | { | ||||||
|     QStringList selection |     QStringList selection = {"NoFormat", "DateTime", "Float", "List", "Script", "String", "Json"}; | ||||||
|         = {"NoFormat", "DateTime", "Float", "List", "Script", "String", "Json"}; |  | ||||||
|     bool ok; |     bool ok; | ||||||
|     QString select = QInputDialog::getItem( |     auto select = QInputDialog::getItem(nullptr, i18n("Select type"), i18n("Type:"), selection, 0, false, &ok); | ||||||
|         this, i18n("Select type"), i18n("Type:"), selection, 0, false, &ok); |  | ||||||
|     if (!ok) { |     if (!ok) { | ||||||
|         qCWarning(LOG_AW) << "No type selected"; |         qCWarning(LOG_AW) << "No type selected"; | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     qCInfo(LOG_AW) << "Selected type" << select; |     qCInfo(LOG_AW) << "Selected type" << select; | ||||||
|     AWAbstractFormatter::FormatterClass formatter |     auto formatter = defineFormatterClass(select); | ||||||
|         = defineFormatterClass(select); |  | ||||||
|     switch (formatter) { |     switch (formatter) { | ||||||
|     case AWAbstractFormatter::FormatterClass::DateTime: |     case AWAbstractFormatter::FormatterClass::DateTime: | ||||||
|         return createItem<AWDateTimeFormatter>(); |         return createItem<AWDateTimeFormatter>(_widget); | ||||||
|     case AWAbstractFormatter::FormatterClass::Float: |     case AWAbstractFormatter::FormatterClass::Float: | ||||||
|         return createItem<AWFloatFormatter>(); |         return createItem<AWFloatFormatter>(_widget); | ||||||
|     case AWAbstractFormatter::FormatterClass::List: |     case AWAbstractFormatter::FormatterClass::List: | ||||||
|         return createItem<AWListFormatter>(); |         return createItem<AWListFormatter>(_widget); | ||||||
|     case AWAbstractFormatter::FormatterClass::Script: |     case AWAbstractFormatter::FormatterClass::Script: | ||||||
|         return createItem<AWScriptFormatter>(); |         return createItem<AWScriptFormatter>(_widget); | ||||||
|     case AWAbstractFormatter::FormatterClass::String: |     case AWAbstractFormatter::FormatterClass::String: | ||||||
|         return createItem<AWStringFormatter>(); |         return createItem<AWStringFormatter>(_widget); | ||||||
|     case AWAbstractFormatter::FormatterClass::Json: |     case AWAbstractFormatter::FormatterClass::Json: | ||||||
|         return createItem<AWJsonFormatter>(); |         return createItem<AWJsonFormatter>(_widget); | ||||||
|     case AWAbstractFormatter::FormatterClass::NoFormat: |     case AWAbstractFormatter::FormatterClass::NoFormat: | ||||||
|         return createItem<AWNoFormatter>(); |         return createItem<AWNoFormatter>(_widget); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -15,50 +15,42 @@ | |||||||
|  *   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" | ||||||
| #include "awabstractpairhelper.h" | #include "awabstractpairhelper.h" | ||||||
|  |  | ||||||
|  |  | ||||||
| class AWFormatterHelper : public AbstractExtItemAggregator, | class AWFormatterHelper : public AbstractExtItemAggregator, public AWAbstractPairHelper | ||||||
|                           public AWAbstractPairHelper |  | ||||||
| { | { | ||||||
|     Q_OBJECT |     Q_OBJECT | ||||||
|  |  | ||||||
| public: | public: | ||||||
|     explicit AWFormatterHelper(QWidget *_parent = nullptr); |     explicit AWFormatterHelper(QObject *_parent = nullptr); | ||||||
|     virtual ~AWFormatterHelper(); |     ~AWFormatterHelper() override; | ||||||
|     // read-write methods |     // read-write methods | ||||||
|     void initItems(); |     void initItems() override; | ||||||
|     // methods |     // methods | ||||||
|     QString convert(const QVariant &_value, const QString &_name) const; |     [[nodiscard]] QString convert(const QVariant &_value, const QString &_name) const; | ||||||
|     QStringList definedFormatters() const; |     [[nodiscard]] QStringList definedFormatters() const; | ||||||
|     QList<AbstractExtItem *> items() const; |     [[nodiscard]] QList<AbstractExtItem *> items() const override; | ||||||
|     // configuration related |     // configuration related | ||||||
|     virtual void editPairs(); |     void editPairs() override; | ||||||
|     virtual QStringList leftKeys(); |     QStringList leftKeys() override; | ||||||
|     virtual QStringList rightKeys(); |     QStringList rightKeys() override; | ||||||
|  |  | ||||||
| public slots: | public slots: | ||||||
|     void editItems(); |     void editItems(); | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     // methods |     // methods | ||||||
|     AWAbstractFormatter::FormatterClass |     static AWAbstractFormatter::FormatterClass defineFormatterClass(const QString &_stringType); | ||||||
|     defineFormatterClass(const QString &_stringType) const; |  | ||||||
|     void initFormatters(); |     void initFormatters(); | ||||||
|     QPair<QString, AWAbstractFormatter::FormatterClass> |     [[nodiscard]] static QPair<QString, AWAbstractFormatter::FormatterClass> readMetadata(const QString &_filePath); | ||||||
|     readMetadata(const QString &_filePath) const; |  | ||||||
|     // parent methods |     // parent methods | ||||||
|     void doCreateItem(); |     void doCreateItem(QListWidget *_widget) override; | ||||||
|     // properties |     // properties | ||||||
|     QHash<QString, AWAbstractFormatter *> m_formatters; |     QHash<QString, AWAbstractFormatter *> m_formatters; | ||||||
|     QHash<QString, AWAbstractFormatter *> m_formattersClasses; |     QHash<QString, AWAbstractFormatter *> m_formattersClasses; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif /* AWFORMATTERHELPER_H */ |  | ||||||
|  | |||||||
| @ -15,10 +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/  * | ||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
|  |  | ||||||
|  |  | ||||||
| #include "awkeycache.h" | #include "awkeycache.h" | ||||||
|  |  | ||||||
| #include <QDir> | #include <QDir> | ||||||
| #include <QNetworkInterface> | #include <QNetworkInterface> | ||||||
|  | #include <QRegularExpression> | ||||||
| #include <QSettings> | #include <QSettings> | ||||||
| #include <QStandardPaths> | #include <QStandardPaths> | ||||||
|  |  | ||||||
| @ -29,9 +31,8 @@ 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 = QString("%1/awesomewidgets.ndx") |     auto fileName | ||||||
|                            .arg(QStandardPaths::writableLocation( |         = QString("%1/awesomewidgets.ndx").arg(QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation)); | ||||||
|                                QStandardPaths::GenericCacheLocation)); |  | ||||||
|     qCInfo(LOG_AW) << "Cache file" << fileName; |     qCInfo(LOG_AW) << "Cache file" << fileName; | ||||||
|     QSettings cache(fileName, QSettings::IniFormat); |     QSettings cache(fileName, QSettings::IniFormat); | ||||||
|  |  | ||||||
| @ -40,40 +41,21 @@ 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 |         auto rawInterfaceList = QNetworkInterface::allInterfaces(); | ||||||
|             = QDir("/dev").entryList(QDir::System, QDir::Name); |  | ||||||
|         QStringList devices = allDevices.filter(QRegExp("^[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; | ||||||
|             cachedValues.append(device); |             cachedValues.append(device); | ||||||
|             cache.setValue( |             cache.setValue(QString("%1").arg(cache.allKeys().count(), 3, 10, QChar('0')), device); | ||||||
|                 QString("%1").arg(cache.allKeys().count(), 3, 10, QChar('0')), |  | ||||||
|                 device); |  | ||||||
|         } |         } | ||||||
|     } else { |     } else { | ||||||
|         if (cachedValues.contains(_key)) |         if (cachedValues.contains(_key)) | ||||||
|             return false; |             return false; | ||||||
|         qCInfo(LOG_AW) << "Found new key" << _key << "for type" << _type; |         qCInfo(LOG_AW) << "Found new key" << _key << "for type" << _type; | ||||||
|         cache.setValue( |         cache.setValue(QString("%1").arg(cache.allKeys().count(), 3, 10, QChar('0')), _key); | ||||||
|             QString("%1").arg(cache.allKeys().count(), 3, 10, QChar('0')), |  | ||||||
|             _key); |  | ||||||
|     } |     } | ||||||
|     cache.endGroup(); |     cache.endGroup(); | ||||||
|  |  | ||||||
| @ -82,45 +64,40 @@ bool AWKeyCache::addKeyToCache(const QString &_type, const QString &_key) | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, | QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, const QStringList &_bars, const QVariantMap &_tooltip, | ||||||
|                                         const QStringList &_bars, |                                         const QStringList &_userKeys, const QStringList &_allKeys) | ||||||
|                                         const QVariantMap &_tooltip, |  | ||||||
|                                         const QStringList &_userKeys, |  | ||||||
|                                         const QStringList &_allKeys) |  | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Looking for required keys in" << _keys << _bars |     qCDebug(LOG_AW) << "Looking for required keys in" << _keys << _bars << "using tooltip settings" << _tooltip; | ||||||
|                     << "using tooltip settings" << _tooltip; |  | ||||||
|  |  | ||||||
|     // initial copy |     // initial copy | ||||||
|     QSet<QString> used = QSet<QString>::fromList(_keys); |     QSet<QString> used(_keys.cbegin(), _keys.cend()); | ||||||
|     used.unite(QSet<QString>::fromList(_bars)); |     used.unite(QSet(_bars.cbegin(), _bars.cend())); | ||||||
|     used.unite(QSet<QString>::fromList(_userKeys)); |     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 depending keys, refer to AWKeys::calculateValues() | ||||||
|     // hddtotmb* |     // hddtotmb* | ||||||
|     for (auto &key : _allKeys.filter(QRegExp("^hddtotmb"))) { |     for (auto &key : _allKeys.filter(QRegularExpression("^hddtotmb"))) { | ||||||
|         if (!used.contains(key)) |         if (!used.contains(key)) | ||||||
|             continue; |             continue; | ||||||
|         key.remove("hddtotmb"); |         key.remove("hddtotmb"); | ||||||
|         int index = key.toInt(); |         auto index = key.toInt(); | ||||||
|         used << QString("hddfreemb%1").arg(index) |         used << QString("hddfreemb%1").arg(index) << QString("hddmb%1").arg(index); | ||||||
|              << QString("hddmb%1").arg(index); |  | ||||||
|     } |     } | ||||||
|     // hddtotgb* |     // hddtotgb* | ||||||
|     for (auto &key : _allKeys.filter(QRegExp("^hddtotgb"))) { |     for (auto &key : _allKeys.filter(QRegularExpression("^hddtotgb"))) { | ||||||
|         if (!used.contains(key)) |         if (!used.contains(key)) | ||||||
|             continue; |             continue; | ||||||
|         key.remove("hddtotgb"); |         key.remove("hddtotgb"); | ||||||
|         int index = key.toInt(); |         auto index = key.toInt(); | ||||||
|         used << QString("hddfreegb%1").arg(index) |         used << QString("hddfreegb%1").arg(index) << QString("hddgb%1").arg(index); | ||||||
|              << QString("hddgb%1").arg(index); |  | ||||||
|     } |     } | ||||||
|     // mem |     // mem | ||||||
|     if (used.contains("mem")) |     if (used.contains("mem")) | ||||||
| @ -147,19 +124,17 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, | |||||||
|         used << "swapgb" |         used << "swapgb" | ||||||
|              << "swapfreegb"; |              << "swapfreegb"; | ||||||
|     // network keys |     // network keys | ||||||
|     QStringList netKeys({"up", "upkb", "uptot", "uptotkb", "upunits", "down", |     QStringList netKeys( | ||||||
|                          "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 |         auto filt = _allKeys.filter(QRegularExpression(QString("^%1[0-9]{1,}").arg(key))); | ||||||
|             = _allKeys.filter(QRegExp(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(), |     if (std::any_of(netKeys.cbegin(), netKeys.cend(), [&used](auto &key) { return used.contains(key); })) | ||||||
|                     [&used](const QString &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 | ||||||
| @ -167,15 +142,14 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, | |||||||
|     if (used.isEmpty()) |     if (used.isEmpty()) | ||||||
|         used << "dummy"; |         used << "dummy"; | ||||||
|  |  | ||||||
|     return used.toList(); |     return used.values(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| QHash<QString, QStringList> AWKeyCache::loadKeysFromCache() | QHash<QString, QStringList> AWKeyCache::loadKeysFromCache() | ||||||
| { | { | ||||||
|     QString fileName = QString("%1/awesomewidgets.ndx") |     auto fileName | ||||||
|                            .arg(QStandardPaths::writableLocation( |         = QString("%1/awesomewidgets.ndx").arg(QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation)); | ||||||
|                                QStandardPaths::GenericCacheLocation)); |  | ||||||
|     qCInfo(LOG_AW) << "Cache file" << fileName; |     qCInfo(LOG_AW) << "Cache file" << fileName; | ||||||
|     QSettings cache(fileName, QSettings::IniFormat); |     QSettings cache(fileName, QSettings::IniFormat); | ||||||
|  |  | ||||||
|  | |||||||
| @ -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 AWKEYCACHE_H |  | ||||||
| #define AWKEYCACHE_H |  | ||||||
|  |  | ||||||
| #include <QHash> | #include <QHash> | ||||||
| #include <QString> | #include <QString> | ||||||
| @ -27,12 +25,7 @@ | |||||||
| 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, | QStringList getRequiredKeys(const QStringList &_keys, const QStringList &_bars, const QVariantMap &_tooltip, | ||||||
|                             const QVariantMap &_tooltip, |                             const QStringList &_userKeys, const QStringList &_allKeys); | ||||||
|                             const QStringList &_userKeys, |  | ||||||
|                             const QStringList &_allKeys); |  | ||||||
| QHash<QString, QStringList> loadKeysFromCache(); | QHash<QString, QStringList> loadKeysFromCache(); | ||||||
| }; | } // namespace AWKeyCache | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif /* AWKEYCACHE_H */ |  | ||||||
|  | |||||||
| @ -18,8 +18,7 @@ | |||||||
| #include "awkeyoperations.h" | #include "awkeyoperations.h" | ||||||
|  |  | ||||||
| #include <QDir> | #include <QDir> | ||||||
| #include <QJSEngine> | #include <QRegularExpression> | ||||||
| #include <QRegExp> |  | ||||||
| #include <QThread> | #include <QThread> | ||||||
|  |  | ||||||
| #include "awcustomkeyshelper.h" | #include "awcustomkeyshelper.h" | ||||||
| @ -41,20 +40,12 @@ 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 |     m_graphicalItems = new ExtItemAggregator<GraphicalItem>(this, "desktops"); | ||||||
|         = new ExtItemAggregator<GraphicalItem>(nullptr, "desktops"); |     m_extNetRequest = new ExtItemAggregator<ExtNetworkRequest>(this, "requests"); | ||||||
|     m_extNetRequest |     m_extQuotes = new ExtItemAggregator<ExtQuotes>(this, "quotes"); | ||||||
|         = new ExtItemAggregator<ExtNetworkRequest>(nullptr, "requests"); |     m_extScripts = new ExtItemAggregator<ExtScript>(this, "scripts"); | ||||||
|     m_extQuotes = new ExtItemAggregator<ExtQuotes>(nullptr, "quotes"); |     m_extUpgrade = new ExtItemAggregator<ExtUpgrade>(this, "upgrade"); | ||||||
|     m_extScripts = new ExtItemAggregator<ExtScript>(nullptr, "scripts"); |     m_extWeather = new ExtItemAggregator<ExtWeather>(this, "weather"); | ||||||
|     m_extUpgrade = new ExtItemAggregator<ExtUpgrade>(nullptr, "upgrade"); |  | ||||||
|     m_extWeather = new ExtItemAggregator<ExtWeather>(nullptr, "weather"); |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| AWKeyOperations::~AWKeyOperations() |  | ||||||
| { |  | ||||||
|     qCDebug(LOG_AW) << __PRETTY_FUNCTION__; |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -75,7 +66,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"); | ||||||
| } | } | ||||||
|  |  | ||||||
| @ -84,7 +74,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")); | ||||||
| @ -93,15 +83,20 @@ QStringList AWKeyOperations::dictKeys() const | |||||||
|         allKeys.append(item->tag("timestamp")); |         allKeys.append(item->tag("timestamp")); | ||||||
|     } |     } | ||||||
|     // cpuclock & cpu |     // cpuclock & cpu | ||||||
|     for (int i = 0; i < QThread::idealThreadCount(); i++) { |     for (auto i = 0; i < QThread::idealThreadCount(); ++i) { | ||||||
|         allKeys.append(QString("cpucl%1").arg(i)); |         allKeys.append(QString("cpucl%1").arg(i)); | ||||||
|         allKeys.append(QString("cpu%1").arg(i)); |         allKeys.append(QString("cpu%1").arg(i)); | ||||||
|     } |     } | ||||||
|     // temperature |     // temperature | ||||||
|     for (int i = 0; i < m_devices["temp"].count(); i++) |     for (auto i = 0; i < m_devices["temp"].count(); ++i) | ||||||
|         allKeys.append(QString("temp%1").arg(i)); |         allKeys.append(QString("temp%1").arg(i)); | ||||||
|  |     // gpu | ||||||
|  |     for (auto i = 0; i < m_devices["gpu"].count(); ++i) { | ||||||
|  |         allKeys.append(QString("gpu%1").arg(i)); | ||||||
|  |         allKeys.append(QString("gputemp%1").arg(i)); | ||||||
|  |     } | ||||||
|     // hdd |     // hdd | ||||||
|     for (int i = 0; i < m_devices["mount"].count(); i++) { |     for (auto i = 0; i < m_devices["mount"].count(); ++i) { | ||||||
|         allKeys.append(QString("hddmb%1").arg(i)); |         allKeys.append(QString("hddmb%1").arg(i)); | ||||||
|         allKeys.append(QString("hddgb%1").arg(i)); |         allKeys.append(QString("hddgb%1").arg(i)); | ||||||
|         allKeys.append(QString("hddfreemb%1").arg(i)); |         allKeys.append(QString("hddfreemb%1").arg(i)); | ||||||
| @ -111,15 +106,12 @@ QStringList AWKeyOperations::dictKeys() const | |||||||
|         allKeys.append(QString("hdd%1").arg(i)); |         allKeys.append(QString("hdd%1").arg(i)); | ||||||
|     } |     } | ||||||
|     // hdd speed |     // hdd speed | ||||||
|     for (int i = 0; i < m_devices["disk"].count(); i++) { |     for (auto i = 0; i < m_devices["disk"].count(); ++i) { | ||||||
|         allKeys.append(QString("hddr%1").arg(i)); |         allKeys.append(QString("hddr%1").arg(i)); | ||||||
|         allKeys.append(QString("hddw%1").arg(i)); |         allKeys.append(QString("hddw%1").arg(i)); | ||||||
|     } |     } | ||||||
|     // hdd temp |  | ||||||
|     for (int i = 0; i < m_devices["hdd"].count(); i++) |  | ||||||
|         allKeys.append(QString("hddtemp%1").arg(i)); |  | ||||||
|     // network |     // network | ||||||
|     for (int i = 0; i < m_devices["net"].count(); i++) { |     for (auto i = 0; i < m_devices["net"].count(); ++i) { | ||||||
|         allKeys.append(QString("downunits%1").arg(i)); |         allKeys.append(QString("downunits%1").arg(i)); | ||||||
|         allKeys.append(QString("upunits%1").arg(i)); |         allKeys.append(QString("upunits%1").arg(i)); | ||||||
|         allKeys.append(QString("downtotkb%1").arg(i)); |         allKeys.append(QString("downtotkb%1").arg(i)); | ||||||
| @ -132,35 +124,35 @@ 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*"}), |     for (int i = 0; i < allBatteryDevices.count(); ++i) { | ||||||
|                          QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name); |  | ||||||
|     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("batnow%1").arg(i)); | ||||||
|  |         allKeys.append(QString("batrate%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("ask")); |  | ||||||
|         allKeys.append(item->tag("askchg")); |  | ||||||
|         allKeys.append(item->tag("percaskchg")); |  | ||||||
|         allKeys.append(item->tag("bid")); |  | ||||||
|         allKeys.append(item->tag("bidchg")); |  | ||||||
|         allKeys.append(item->tag("percbidchg")); |  | ||||||
|         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")); | ||||||
|  |         allKeys.append(item->tag("volume")); | ||||||
|  |         allKeys.append(item->tag("volumechg")); | ||||||
|  |         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()); | ||||||
| @ -207,54 +199,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(QRegExp("\\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(QRegExp("^hdd[rw]"))) { |     } else if (_key.contains(hddrwRegExp)) { | ||||||
|         QString index = _key; |         auto index = _key; | ||||||
|         index.remove(QRegExp("hdd[rw]")); |         index.remove(hddrwRegExp); | ||||||
|         output = m_devices["disk"][index.toInt()]; |         output = m_devices["disk"][index.toInt()]; | ||||||
|     } else if (_key.contains( |     } else if (_key.contains(hddMatchRegExp)) { | ||||||
|                    QRegExp("^hdd([0-9]|mb|gb|freemb|freegb|totmb|totgb)"))) { |         auto index = _key; | ||||||
|         QString index = _key; |         index.remove(hddRegExp); | ||||||
|         index.remove(QRegExp("^hdd(|mb|gb|freemb|freegb|totmb|totgb)")); |  | ||||||
|         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()]; |  | ||||||
|     } else if (_key.contains(QRegExp("^(down|up)[0-9]"))) { |  | ||||||
|         QString index = _key; |  | ||||||
|         index.remove(QRegExp("^(down|up)")); |  | ||||||
|         output = m_devices["net"][index.toInt()]; |         output = m_devices["net"][index.toInt()]; | ||||||
|     } else if (_key.startsWith("pkgcount")) { |     } else if (_key.startsWith("pkgcount")) { | ||||||
|         AbstractExtItem *item = m_extUpgrade->itemByTag(_key, stripped); |         auto item = m_extUpgrade->itemByTag(_key, stripped); | ||||||
|         if (item) |         if (item) | ||||||
|             output = item->uniq(); |             output = item->uniq(); | ||||||
|     } else if (_key.contains(QRegExp("(^|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(QRegExp( |     } else if (_key.contains(weatherRegExp)) { | ||||||
|                    "(weather|weatherId|humidity|pressure|temperature)"))) { |         auto item = m_extWeather->itemByTag(_key, stripped); | ||||||
|         AbstractExtItem *item = m_extWeather->itemByTag(_key, stripped); |  | ||||||
|         if (item) |         if (item) | ||||||
|             output = item->uniq(); |             output = item->uniq(); | ||||||
|     } else if (_key.startsWith("temp")) { |     } else if (_key.startsWith("temp")) { | ||||||
|         QString index = _key; |         auto index = _key; | ||||||
|         index.remove("temp"); |         index.remove("temp"); | ||||||
|         output = m_devices["temp"][index.toInt()]; |         output = m_devices["temp"][index.toInt()]; | ||||||
|     } else if (_key.startsWith("response")) { |     } else if (_key.startsWith("response")) { | ||||||
|         AbstractExtItem *item = m_extNetRequest->itemByTag(_key, stripped); |         auto item = m_extNetRequest->itemByTag(_key, stripped); | ||||||
|         if (item) |         if (item) | ||||||
|             output = item->uniq(); |             output = item->uniq(); | ||||||
|     } else { |     } else { | ||||||
| @ -283,9 +279,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( |         auto keys = dictKeys().filter(supportsGraphicalRegExp); | ||||||
|             QRegExp("^(cpu(?!cl).*|gpu$|mem$|swap$|hdd[0-9].*|bat.*)")); |  | ||||||
|         keys.sort(); |         keys.sort(); | ||||||
|         m_graphicalItems->setConfigArgs(keys); |         m_graphicalItems->setConfigArgs(keys); | ||||||
|         return m_graphicalItems->editItems(); |         return m_graphicalItems->editItems(); | ||||||
| @ -307,19 +304,26 @@ void AWKeyOperations::addDevice(const QString &_source) | |||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Source" << _source; |     qCDebug(LOG_AW) << "Source" << _source; | ||||||
|  |  | ||||||
|     QRegExp diskRegexp = QRegExp("disk/(?:md|sd|hd)[a-z|0-9]_.*/Rate/(?:rblk)"); |     static auto diskRegexp = QRegularExpression("^disk/.*/read$"); | ||||||
|     QRegExp mountRegexp = QRegExp("partitions/.*/filllevel"); |     static auto mountRegexp = QRegularExpression("^disk/.*/usedPercent$"); | ||||||
|  |     static auto cpuTempRegExp = QRegularExpression("^cpu/cpu.*/temperature$"); | ||||||
|  |     static auto gpuRegExp = QRegularExpression("^gpu/gpu.*/usage$"); | ||||||
|  |  | ||||||
|     if (_source.contains(diskRegexp)) { |     if (_source.contains(diskRegexp)) { | ||||||
|         QString device = _source; |         auto device = _source; | ||||||
|         device.remove("/Rate/rblk"); |         device.remove("disk/").remove("/read"); | ||||||
|         addKeyToCache("disk", device); |         addKeyToCache("disk", device); | ||||||
|     } else if (_source.contains(mountRegexp)) { |     } else if (_source.contains(mountRegexp)) { | ||||||
|         QString device = _source; |         auto device = _source; | ||||||
|         device.remove("partitions").remove("/filllevel"); |         device.remove("disk/").remove("/usedPercent"); | ||||||
|         addKeyToCache("mount", device); |         addKeyToCache("mount", device); | ||||||
|     } else if (_source.startsWith("lmsensors")) { |     } else if (_source.startsWith("lmsensors") || _source.contains(cpuTempRegExp) | ||||||
|  |                || _source == "cpu/all/averageTemperature") { | ||||||
|         addKeyToCache("temp", _source); |         addKeyToCache("temp", _source); | ||||||
|  |     } else if (_source.contains(gpuRegExp)) { | ||||||
|  |         auto device = _source; | ||||||
|  |         device.remove("gpu/").remove("/usage"); | ||||||
|  |         addKeyToCache("gpu", device); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| @ -346,7 +350,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); | ||||||
|  | |||||||
| @ -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 AWKEYOPERATIONS_H |  | ||||||
| #define AWKEYOPERATIONS_H |  | ||||||
|  |  | ||||||
| #include <QObject> | #include <QObject> | ||||||
|  |  | ||||||
| @ -39,19 +37,19 @@ class AWKeyOperations : public QObject | |||||||
|  |  | ||||||
| public: | public: | ||||||
|     explicit AWKeyOperations(QObject *_parent = nullptr); |     explicit AWKeyOperations(QObject *_parent = nullptr); | ||||||
|     virtual ~AWKeyOperations(); |     ~AWKeyOperations() override = default; | ||||||
|     QStringList devices(const QString &_type) const; |     [[nodiscard]] QStringList devices(const QString &_type) const; | ||||||
|     QHash<QString, QStringList> devices() const; |     [[nodiscard]] QHash<QString, QStringList> devices() const; | ||||||
|     void updateCache(); |     void updateCache(); | ||||||
|     // keys |     // keys | ||||||
|     QStringList dictKeys() const; |     [[nodiscard]] QStringList dictKeys() const; | ||||||
|     GraphicalItem *giByKey(const QString &_key) const; |     [[nodiscard]] GraphicalItem *giByKey(const QString &_key) const; | ||||||
|     QStringList requiredUserKeys() const; |     [[nodiscard]] QStringList requiredUserKeys() const; | ||||||
|     QStringList userKeys() const; |     [[nodiscard]] QStringList userKeys() const; | ||||||
|     QString userKeySource(const QString &_key) const; |     [[nodiscard]] QString userKeySource(const QString &_key) const; | ||||||
|     // values |     // values | ||||||
|     QString infoByKey(const QString &_key) const; |     [[nodiscard]] QString infoByKey(const QString &_key) const; | ||||||
|     QString pattern() const; |     [[nodiscard]] QString pattern() const; | ||||||
|     void setPattern(const QString &_currentPattern); |     void setPattern(const QString &_currentPattern); | ||||||
|     // configuration |     // configuration | ||||||
|     void editItem(const QString &_type); |     void editItem(const QString &_type); | ||||||
| @ -78,6 +76,3 @@ private: | |||||||
|     QHash<QString, QStringList> m_devices; |     QHash<QString, QStringList> m_devices; | ||||||
|     QString m_pattern; |     QString m_pattern; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif /* AWKEYOPERATIONS_H */ |  | ||||||
|  | |||||||
| @ -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); | ||||||
| @ -56,17 +52,17 @@ AWKeys::AWKeys(QObject *_parent) | |||||||
|     createDBusInterface(); |     createDBusInterface(); | ||||||
|  |  | ||||||
|     // update key data if required |     // update key data if required | ||||||
|     connect(m_keyOperator, SIGNAL(updateKeys(const QStringList &)), this, |     connect(m_keyOperator, &AWKeyOperations::updateKeys, this, &AWKeys::reinitKeys); | ||||||
|             SLOT(reinitKeys(const QStringList &))); |     connect(m_timer, &QTimer::timeout, this, &AWKeys::updateTextData); | ||||||
|     connect(m_timer, SIGNAL(timeout()), this, SLOT(updateTextData())); |  | ||||||
|     // transfer signal from AWDataAggregator object to QML ui |     // transfer signal from AWDataAggregator object to QML ui | ||||||
|     connect(m_dataAggregator, SIGNAL(toolTipPainted(const QString &)), this, |     connect(m_dataAggregator, &AWDataAggregator::toolTipPainted, | ||||||
|             SIGNAL(needToolTipToBeUpdated(const QString &))); |             [this](const QString &_tooltip) { emit(needToolTipToBeUpdated(_tooltip)); }); | ||||||
|     connect(this, SIGNAL(dropSourceFromDataengine(const QString &)), |  | ||||||
|             m_dataEngineAggregator, SLOT(dropSource(const QString &))); |     connect(this, &AWKeys::dropSourceFromDataengine, m_dataEngineAggregator, &AWDataEngineAggregator::dropSource); | ||||||
|  |     connect(m_dataEngineAggregator, &AWDataEngineAggregator::dataUpdated, this, &AWKeys::dataUpdated); | ||||||
|     // transfer signal from dataengine to update source list |     // transfer signal from dataengine to update source list | ||||||
|     connect(m_dataEngineAggregator, SIGNAL(deviceAdded(const QString &)), |     connect(m_dataEngineAggregator, &AWDataEngineAggregator::deviceAdded, m_keyOperator, &AWKeyOperations::addDevice); | ||||||
|             m_keyOperator, SLOT(addDevice(const QString &))); |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -76,7 +72,7 @@ AWKeys::~AWKeys() | |||||||
|  |  | ||||||
|     m_timer->stop(); |     m_timer->stop(); | ||||||
|     // delete dbus session |     // delete dbus session | ||||||
|     qlonglong id = reinterpret_cast<qlonglong>(this); |     auto id = reinterpret_cast<qlonglong>(this); | ||||||
|     QDBusConnection::sessionBus().unregisterObject(QString("/%1").arg(id)); |     QDBusConnection::sessionBus().unregisterObject(QString("/%1").arg(id)); | ||||||
| } | } | ||||||
|  |  | ||||||
| @ -91,22 +87,17 @@ void AWKeys::initDataAggregator(const QVariantMap &_tooltipParams) | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void AWKeys::initKeys(const QString &_currentPattern, const int _interval, | void AWKeys::initKeys(const QString &_currentPattern, const int _interval, const bool _optimize) | ||||||
|                       const int _limit, const bool _optimize) |  | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Pattern" << _currentPattern << "with interval" |     qCDebug(LOG_AW) << "Pattern" << _currentPattern << "with interval" << _interval << "with optimization" << _optimize; | ||||||
|                     << _interval << "and queue limit" << _limit |  | ||||||
|                     << "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->reconnectSources(_interval); |     m_dataEngineAggregator->loadSources(); | ||||||
|  |  | ||||||
|     // timer |     // timer | ||||||
|     m_timer->setInterval(_interval); |     m_timer->setInterval(_interval); | ||||||
| @ -138,8 +129,7 @@ void AWKeys::updateCache() | |||||||
|  |  | ||||||
| QStringList AWKeys::dictKeys(const bool _sorted, const QString &_regexp) const | QStringList AWKeys::dictKeys(const bool _sorted, const QString &_regexp) const | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Should be sorted" << _sorted << "and filter applied" |     qCDebug(LOG_AW) << "Should be sorted" << _sorted << "and filter applied" << _regexp; | ||||||
|                     << _regexp; |  | ||||||
|  |  | ||||||
|     // check if functions asked |     // check if functions asked | ||||||
|     if (_regexp == "functions") |     if (_regexp == "functions") | ||||||
| @ -153,27 +143,7 @@ QStringList AWKeys::dictKeys(const bool _sorted, const QString &_regexp) const | |||||||
|     if (_sorted) |     if (_sorted) | ||||||
|         allKeys.sort(); |         allKeys.sort(); | ||||||
|  |  | ||||||
|     return allKeys.filter(QRegExp(_regexp)); |     return allKeys.filter(QRegularExpression(_regexp)); | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| 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; |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -190,10 +160,9 @@ QString AWKeys::valueByKey(const QString &_key) const | |||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Requested value for key" << _key; |     qCDebug(LOG_AW) << "Requested value for key" << _key; | ||||||
|  |  | ||||||
|     QString trueKey |     auto realKey = _key.startsWith("bar") ? m_keyOperator->infoByKey(_key) : _key; | ||||||
|         = _key.startsWith("bar") ? m_keyOperator->infoByKey(_key) : _key; |  | ||||||
|  |  | ||||||
|     return m_aggregator->formatter(m_values[trueKey], trueKey); |     return m_aggregator->formatter(m_values[realKey], realKey, true); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -205,12 +174,16 @@ void AWKeys::editItem(const QString &_type) | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void AWKeys::dataUpdated(const QString &_sourceName, | void AWKeys::dataUpdated(const QHash<QString, KSysGuard::SensorInfo> &_sensors, const KSysGuard::SensorDataList &_data) | ||||||
|                          const Plasma::DataEngine::Data &_data) |  | ||||||
| { | { | ||||||
|     // run concurrent data update |     qCDebug(LOG_AW) << "Update data for" << _data.count() << "items"; | ||||||
|     QtConcurrent::run(m_threadPool, this, &AWKeys::setDataBySource, _sourceName, |  | ||||||
|                       _data); |     for (auto &data : _data) { | ||||||
|  |         if (!_sensors.contains(data.sensorProperty)) | ||||||
|  |             continue; | ||||||
|  |         auto sensor = _sensors[data.sensorProperty]; | ||||||
|  |         setDataBySource(data.sensorProperty, sensor, data.payload); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -219,26 +192,21 @@ void AWKeys::reinitKeys(const QStringList &_currentKeys) | |||||||
|     qCDebug(LOG_AW) << "Update found keys by using list" << _currentKeys; |     qCDebug(LOG_AW) << "Update found keys by using list" << _currentKeys; | ||||||
|  |  | ||||||
|     // append lists |     // append lists | ||||||
|     m_foundBars = AWPatternFunctions::findKeys(m_keyOperator->pattern(), |     m_foundBars = AWPatternFunctions::findKeys(m_keyOperator->pattern(), _currentKeys, true); | ||||||
|                                                _currentKeys, true); |     m_foundKeys = AWPatternFunctions::findKeys(m_keyOperator->pattern(), _currentKeys, false); | ||||||
|     m_foundKeys = AWPatternFunctions::findKeys(m_keyOperator->pattern(), |  | ||||||
|                                                _currentKeys, false); |  | ||||||
|     m_foundLambdas = AWPatternFunctions::findLambdas(m_keyOperator->pattern()); |     m_foundLambdas = AWPatternFunctions::findLambdas(m_keyOperator->pattern()); | ||||||
|     // 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( |             item->setUsedKeys(AWPatternFunctions::findKeys(item->bar(), _currentKeys, false)); | ||||||
|                 AWPatternFunctions::findKeys(item->bar(), _currentKeys, false)); |  | ||||||
|         else |         else | ||||||
|             item->setUsedKeys(QStringList() << item->bar()); |             item->setUsedKeys(QStringList() << item->bar()); | ||||||
|         barKeys.append(item->usedKeys()); |         barKeys.append(item->usedKeys()); | ||||||
|     } |     } | ||||||
|     // get required keys |     // get required keys | ||||||
|     m_requiredKeys = m_optimize |     m_requiredKeys = m_optimize ? AWKeyCache::getRequiredKeys(m_foundKeys, barKeys, m_tooltipParams, | ||||||
|                          ? AWKeyCache::getRequiredKeys( |  | ||||||
|                                m_foundKeys, barKeys, m_tooltipParams, |  | ||||||
|                                                               m_keyOperator->requiredUserKeys(), _currentKeys) |                                                               m_keyOperator->requiredUserKeys(), _currentKeys) | ||||||
|                                 : QStringList(); |                                 : QStringList(); | ||||||
|  |  | ||||||
| @ -250,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(); | ||||||
|     QString 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)); | ||||||
| } | } | ||||||
| @ -266,29 +232,23 @@ void AWKeys::updateTextData() | |||||||
| void AWKeys::calculateValues() | void AWKeys::calculateValues() | ||||||
| { | { | ||||||
|     // hddtot* |     // hddtot* | ||||||
|     QStringList mountDevices = m_keyOperator->devices("mount"); |     auto mountDevices = m_keyOperator->devices("mount"); | ||||||
|     for (auto &device : mountDevices) { |     for (auto &device : mountDevices) { | ||||||
|         int index = mountDevices.indexOf(device); |         auto index = mountDevices.indexOf(device); | ||||||
|         m_values[QString("hddtotmb%1").arg(index)] |         m_values[QString("hddtotmb%1").arg(index)] = m_values[QString("hddfreemb%1").arg(index)].toDouble() | ||||||
|             = m_values[QString("hddfreemb%1").arg(index)].toFloat() |                                                      + m_values[QString("hddmb%1").arg(index)].toDouble(); | ||||||
|               + m_values[QString("hddmb%1").arg(index)].toFloat(); |         m_values[QString("hddtotgb%1").arg(index)] = m_values[QString("hddfreegb%1").arg(index)].toDouble() | ||||||
|         m_values[QString("hddtotgb%1").arg(index)] |                                                      + m_values[QString("hddgb%1").arg(index)].toDouble(); | ||||||
|             = m_values[QString("hddfreegb%1").arg(index)].toFloat() |  | ||||||
|               + m_values[QString("hddgb%1").arg(index)].toFloat(); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // memtot* |     // memtot* | ||||||
|     m_values["memtotmb"] |     m_values["memtotmb"] = m_values["memusedmb"].toLongLong() + m_values["memfreemb"].toLongLong(); | ||||||
|         = m_values["memusedmb"].toInt() + m_values["memfreemb"].toInt(); |     m_values["memtotgb"] = m_values["memusedgb"].toDouble() + m_values["memfreegb"].toDouble(); | ||||||
|     m_values["memtotgb"] |  | ||||||
|         = m_values["memusedgb"].toFloat() + m_values["memfreegb"].toFloat(); |  | ||||||
|     // mem |     // mem | ||||||
|     m_values["mem"] |     m_values["mem"] = 100.0 * m_values["memmb"].toDouble() / m_values["memtotmb"].toDouble(); | ||||||
|         = 100.0f * m_values["memmb"].toFloat() / m_values["memtotmb"].toFloat(); |  | ||||||
|  |  | ||||||
|     // up, down, upkb, downkb, upunits, downunits |     // up, down, upkb, downkb, upunits, downunits | ||||||
|     int netIndex |     auto netIndex = m_keyOperator->devices("net").indexOf(m_values["netdev"].toString()); | ||||||
|         = m_keyOperator->devices("net").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)]; | ||||||
| @ -301,13 +261,10 @@ void AWKeys::calculateValues() | |||||||
|     m_values["upunits"] = m_values[QString("upunits%1").arg(netIndex)]; |     m_values["upunits"] = m_values[QString("upunits%1").arg(netIndex)]; | ||||||
|  |  | ||||||
|     // swaptot* |     // swaptot* | ||||||
|     m_values["swaptotmb"] |     m_values["swaptotmb"] = m_values["swapmb"].toLongLong() + m_values["swapfreemb"].toLongLong(); | ||||||
|         = m_values["swapmb"].toInt() + m_values["swapfreemb"].toInt(); |     m_values["swaptotgb"] = m_values["swapgb"].toDouble() + m_values["swapfreegb"].toDouble(); | ||||||
|     m_values["swaptotgb"] |  | ||||||
|         = m_values["swapgb"].toFloat() + m_values["swapfreegb"].toFloat(); |  | ||||||
|     // swap |     // swap | ||||||
|     m_values["swap"] = 100.0f * m_values["swapmb"].toFloat() |     m_values["swap"] = 100.0 * m_values["swapmb"].toDouble() / m_values["swaptotmb"].toDouble(); | ||||||
|                        / m_values["swaptotmb"].toFloat(); |  | ||||||
|  |  | ||||||
|     // user defined keys |     // user defined keys | ||||||
|     for (auto &key : m_keyOperator->userKeys()) |     for (auto &key : m_keyOperator->userKeys()) | ||||||
| @ -315,43 +272,37 @@ void AWKeys::calculateValues() | |||||||
|  |  | ||||||
|     // lambdas |     // lambdas | ||||||
|     for (auto &key : m_foundLambdas) |     for (auto &key : m_foundLambdas) | ||||||
|         m_values[key] = AWPatternFunctions::expandLambdas( |         m_values[key] = AWPatternFunctions::expandLambdas(key, m_aggregator, m_values, m_foundKeys); | ||||||
|             key, m_aggregator, m_values, m_foundKeys); |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void AWKeys::createDBusInterface() | void AWKeys::createDBusInterface() | ||||||
| { | { | ||||||
|     // get this object id |     // get this object id | ||||||
|     qlonglong 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( |     if (instanceBus.registerService(QString("%1.i%2").arg(AWDBUS_SERVICE).arg(id))) { | ||||||
|             QString("%1.i%2").arg(AWDBUS_SERVICE).arg(id))) { |         if (!instanceBus.registerObject(AWDBUS_PATH, new AWDBusAdaptor(this), QDBusConnection::ExportAllContents)) | ||||||
|         if (!instanceBus.registerObject(AWDBUS_PATH, new AWDBusAdaptor(this), |             qCWarning(LOG_AW) << "Could not register DBus object, last error" << instanceBus.lastError().message(); | ||||||
|                                         QDBusConnection::ExportAllContents)) |  | ||||||
|             qCWarning(LOG_AW) << "Could not register DBus object, last error" |  | ||||||
|                               << instanceBus.lastError().message(); |  | ||||||
|     } else { |     } else { | ||||||
|         qCWarning(LOG_AW) << "Could not register DBus service, last error" |         qCWarning(LOG_AW) << "Could not register DBus service, last error" << instanceBus.lastError().message(); | ||||||
|                           << instanceBus.lastError().message(); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // 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), |         commonBus.registerObject(AWDBUS_PATH, new AWDBusAdaptor(this), QDBusConnection::ExportAllContents); | ||||||
|                                  QDBusConnection::ExportAllContents); |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| QString AWKeys::parsePattern(QString _pattern) const | QString AWKeys::parsePattern(QString _pattern) const | ||||||
| { | { | ||||||
|     // screen sign |     // screen sign | ||||||
|     _pattern.replace("$$", QString(0x1d)); |     _pattern.replace("$$", QChar(0x1d)); | ||||||
|  |  | ||||||
|     // lambdas |     // lambdas | ||||||
|     for (auto &key : m_foundLambdas) |     for (auto &key : m_foundLambdas) | ||||||
| @ -359,22 +310,19 @@ QString AWKeys::parsePattern(QString _pattern) const | |||||||
|  |  | ||||||
|     // main keys |     // main keys | ||||||
|     for (auto &key : m_foundKeys) |     for (auto &key : m_foundKeys) | ||||||
|         _pattern.replace(QString("$%1").arg(key), |         _pattern.replace(QString("$%1").arg(key), m_aggregator->formatter(m_values[key], key, true)); | ||||||
|                          m_aggregator->formatter(m_values[key], key)); |  | ||||||
|  |  | ||||||
|     // 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 |         auto image = item->isCustom() ? item->image( | ||||||
|             = item->isCustom() |                          AWPatternFunctions::expandLambdas(item->bar(), m_aggregator, m_values, item->usedKeys())) | ||||||
|                   ? item->image(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); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // prepare strings |     // prepare strings | ||||||
|     _pattern.replace(QString(0x1d), "$"); |     _pattern.replace(QChar(0x1d), "$"); | ||||||
|     if (m_wrapNewLines) |     if (m_wrapNewLines) | ||||||
|         _pattern.replace("\n", "<br>"); |         _pattern.replace("\n", "<br>"); | ||||||
|  |  | ||||||
| @ -382,29 +330,20 @@ QString AWKeys::parsePattern(QString _pattern) const | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void AWKeys::setDataBySource(const QString &_sourceName, | void AWKeys::setDataBySource(const QString &_source, const KSysGuard::SensorInfo &_sensor, const QVariant &_value) | ||||||
|                              const QVariantMap &_data) |  | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Source" << _sourceName << "with data" << _data; |     qCDebug(LOG_AW) << "Source" << _source << _sensor.name << "with data" << _value; | ||||||
|  |  | ||||||
|     // first list init |     // first list init | ||||||
|     QStringList tags = m_aggregator->keysFromSource(_sourceName); |     auto tags = m_aggregator->keysFromSource(_source); | ||||||
|     if (tags.isEmpty()) |     if (tags.isEmpty()) | ||||||
|         tags = m_aggregator->registerSource( |         tags = m_aggregator->registerSource(_source, _sensor.unit, m_requiredKeys); | ||||||
|             _sourceName, _data["units"].toString(), m_requiredKeys); |  | ||||||
|  |  | ||||||
|     // update data or drop source if there are no matches and exit |     // update data or drop source if there are no matches and exit | ||||||
|     if (tags.isEmpty()) { |     if (tags.isEmpty()) { | ||||||
|         qCInfo(LOG_AW) << "Source" << _sourceName << "not found"; |         qCInfo(LOG_AW) << "Sensor" << _source << "not found"; | ||||||
|         return emit(dropSourceFromDataengine(_sourceName)); |         return emit(dropSourceFromDataengine(_source)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     m_mutex.lock(); |     std::for_each(tags.cbegin(), tags.cend(), [this, _value](const QString &tag) { m_values[tag] = _value; }); | ||||||
|     // HACK workaround for time values which are stored in the different path |  | ||||||
|     std::for_each(tags.cbegin(), tags.cend(), |  | ||||||
|                   [this, &_data, &_sourceName](const QString &tag) { |  | ||||||
|                       m_values[tag] = _sourceName == "Local" ? _data["DateTime"] |  | ||||||
|                                                              : _data["value"]; |  | ||||||
|                   }); |  | ||||||
|     m_mutex.unlock(); |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -15,21 +15,17 @@ | |||||||
|  *   along with awesome-widgets. If not, see http://www.gnu.org/licenses/  * |  *   along with awesome-widgets. If not, see http://www.gnu.org/licenses/  * | ||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
| #ifndef AWKEYS_H |  | ||||||
| #define AWKEYS_H |  | ||||||
|  |  | ||||||
| #include <Plasma/DataEngine> |  | ||||||
|  |  | ||||||
| #include <QMutex> |  | ||||||
| #include <QObject> | #include <QObject> | ||||||
|  |  | ||||||
|  | #include <ksysguard/systemstats/SensorInfo.h> | ||||||
|  |  | ||||||
|  |  | ||||||
| class AWDataAggregator; | 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 AWKeys : public QObject | ||||||
| @ -38,39 +34,29 @@ class AWKeys : public QObject | |||||||
|  |  | ||||||
| public: | public: | ||||||
|     explicit AWKeys(QObject *_parent = nullptr); |     explicit AWKeys(QObject *_parent = nullptr); | ||||||
|     virtual ~AWKeys(); |     ~AWKeys() override; | ||||||
|     Q_INVOKABLE void initDataAggregator(const QVariantMap &_tooltipParams); |     Q_INVOKABLE void initDataAggregator(const QVariantMap &_tooltipParams); | ||||||
|     Q_INVOKABLE void initKeys(const QString &_currentPattern, |     Q_INVOKABLE void initKeys(const QString &_currentPattern, int _interval, bool _optimize); | ||||||
|                               const int _interval, const int _limit, |     Q_INVOKABLE void setAggregatorProperty(const QString &_key, const QVariant &_value); | ||||||
|                               const bool _optimize); |     Q_INVOKABLE void setWrapNewLines(bool _wrap); | ||||||
|     Q_INVOKABLE void setAggregatorProperty(const QString &_key, |  | ||||||
|                                            const QVariant &_value); |  | ||||||
|     Q_INVOKABLE void setWrapNewLines(const 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 | ||||||
|     // configuration pages |     // configuration pages | ||||||
|     Q_INVOKABLE void updateCache(); |     Q_INVOKABLE void updateCache(); | ||||||
|     // keys |     // keys | ||||||
|     Q_INVOKABLE QStringList dictKeys(const bool _sorted = false, |     Q_INVOKABLE [[nodiscard]] QStringList dictKeys(bool _sorted = false, const QString &_regexp = "") const; | ||||||
|                                      const QString &_regexp = "") const; |  | ||||||
|     Q_INVOKABLE QVariantList getHddDevices() const; |  | ||||||
|     // values |     // values | ||||||
|     Q_INVOKABLE QString infoByKey(const QString &_key) const; |     Q_INVOKABLE [[nodiscard]] QString infoByKey(const QString &_key) const; | ||||||
|     Q_INVOKABLE 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 QString &_sourceName, |  | ||||||
|                      const Plasma::DataEngine::Data &_data); |  | ||||||
|     // dummy method required by DataEngine connections |  | ||||||
|     void modelChanged(QString, QAbstractItemModel *){}; |  | ||||||
|  |  | ||||||
| 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(); | ||||||
|  |  | ||||||
| @ -78,8 +64,8 @@ private: | |||||||
|     // methods |     // methods | ||||||
|     void calculateValues(); |     void calculateValues(); | ||||||
|     void createDBusInterface(); |     void createDBusInterface(); | ||||||
|     QString parsePattern(QString _pattern) const; |     [[nodiscard]] QString parsePattern(QString _pattern) const; | ||||||
|     void setDataBySource(const QString &_sourceName, const QVariantMap &_data); |     void setDataBySource(const QString &_source, const KSysGuard::SensorInfo &_sensor, const QVariant &_value); | ||||||
|     // objects |     // objects | ||||||
|     AWDataAggregator *m_dataAggregator = nullptr; |     AWDataAggregator *m_dataAggregator = nullptr; | ||||||
|     AWDataEngineAggregator *m_dataEngineAggregator = nullptr; |     AWDataEngineAggregator *m_dataEngineAggregator = nullptr; | ||||||
| @ -92,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 */ |  | ||||||
|  | |||||||
| @ -33,7 +33,7 @@ AWKeysAggregator::AWKeysAggregator(QObject *_parent) | |||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << __PRETTY_FUNCTION__; |     qCDebug(LOG_AW) << __PRETTY_FUNCTION__; | ||||||
|  |  | ||||||
|     m_customFormatters = new AWFormatterHelper(nullptr); |     m_customFormatters = new AWFormatterHelper(this); | ||||||
|     m_mapper = new AWDataEngineMapper(this, m_customFormatters); |     m_mapper = new AWDataEngineMapper(this, m_customFormatters); | ||||||
|  |  | ||||||
|     // sort time keys |     // sort time keys | ||||||
| @ -43,20 +43,13 @@ AWKeysAggregator::AWKeysAggregator(QObject *_parent) | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| AWKeysAggregator::~AWKeysAggregator() |  | ||||||
| { |  | ||||||
|     qCDebug(LOG_AW) << __PRETTY_FUNCTION__; |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| void AWKeysAggregator::initFormatters() | void AWKeysAggregator::initFormatters() | ||||||
| { | { | ||||||
|     m_customFormatters->initItems(); |     m_customFormatters->initItems(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| QString AWKeysAggregator::formatter(const QVariant &_data, | QString AWKeysAggregator::formatter(const QVariant &_data, const QString &_key, bool replaceSpace) const | ||||||
|                                     const QString &_key) const |  | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Data" << _data << "for key" << _key; |     qCDebug(LOG_AW) << "Data" << _data << "for key" << _key; | ||||||
|  |  | ||||||
| @ -65,19 +58,19 @@ QString AWKeysAggregator::formatter(const QVariant &_data, | |||||||
|     // case block |     // case block | ||||||
|     switch (m_mapper->formatter(_key)) { |     switch (m_mapper->formatter(_key)) { | ||||||
|     case FormatterType::Float: |     case FormatterType::Float: | ||||||
|         output = QString("%1").arg(_data.toFloat(), 5, 'f', 1); |         output = QString("%1").arg(_data.toDouble(), 5, 'f', 1); | ||||||
|         break; |         break; | ||||||
|     case FormatterType::FloatTwoSymbols: |     case FormatterType::FloatTwoSymbols: | ||||||
|         output = QString("%1").arg(_data.toFloat(), 5, 'f', 2); |         output = QString("%1").arg(_data.toDouble(), 5, 'f', 2); | ||||||
|         break; |         break; | ||||||
|     case FormatterType::Integer: |     case FormatterType::Integer: | ||||||
|         output = QString("%1").arg(_data.toFloat(), 4, 'f', 0); |         output = QString("%1").arg(_data.toDouble(), 4, 'f', 0); | ||||||
|         break; |         break; | ||||||
|     case FormatterType::IntegerFive: |     case FormatterType::IntegerFive: | ||||||
|         output = QString("%1").arg(_data.toFloat(), 5, 'f', 0); |         output = QString("%1").arg(_data.toDouble(), 5, 'f', 0); | ||||||
|         break; |         break; | ||||||
|     case FormatterType::IntegerThree: |     case FormatterType::IntegerThree: | ||||||
|         output = QString("%1").arg(_data.toFloat(), 3, 'f', 0); |         output = QString("%1").arg(_data.toDouble(), 3, 'f', 0); | ||||||
|         break; |         break; | ||||||
|     case FormatterType::List: |     case FormatterType::List: | ||||||
|         output = _data.toStringList().join(','); |         output = _data.toStringList().join(','); | ||||||
| @ -86,22 +79,24 @@ QString AWKeysAggregator::formatter(const QVariant &_data, | |||||||
|         output = _data.toBool() ? m_acOnline : m_acOffline; |         output = _data.toBool() ? m_acOnline : m_acOffline; | ||||||
|         break; |         break; | ||||||
|     case FormatterType::MemGBFormat: |     case FormatterType::MemGBFormat: | ||||||
|         output |         output = QString("%1").arg(_data.toDouble() / GBinBytes, 5, 'f', 1); | ||||||
|             = QString("%1").arg(_data.toFloat() / (1024.0 * 1024.0), 5, 'f', 1); |  | ||||||
|         break; |         break; | ||||||
|     case FormatterType::MemMBFormat: |     case FormatterType::MemMBFormat: | ||||||
|         output = QString("%1").arg(_data.toFloat() / 1024.0, 5, 'f', 0); |         output = QString("%1").arg(_data.toDouble() / MBinBytes, 5, 'f', 0); | ||||||
|  |         break; | ||||||
|  |     case FormatterType::MemKBFormat: | ||||||
|  |         output = QString("%1").arg(_data.toDouble() / KBinBytes, 5, 'f', 0); | ||||||
|         break; |         break; | ||||||
|     case FormatterType::NetSmartFormat: |     case FormatterType::NetSmartFormat: | ||||||
|         output = [](const float value) { |         output = [](const double value) { | ||||||
|             if (value > 1024.0) |             if (value > MBinBytes) | ||||||
|                 return QString("%1").arg(value / 1024.0, 4, 'f', 1); |                 return QString("%1").arg(value / MBinBytes, 4, 'f', 1); | ||||||
|             else |             else | ||||||
|                 return QString("%1").arg(value, 4, 'f', 0); |                 return QString("%1").arg(value / KBinBytes, 4, 'f', 0); | ||||||
|         }(_data.toFloat()); |         }(_data.toDouble()); | ||||||
|         break; |         break; | ||||||
|     case FormatterType::NetSmartUnits: |     case FormatterType::NetSmartUnits: | ||||||
|         if (_data.toFloat() > 1024.0) |         if (_data.toDouble() > MBinBytes) | ||||||
|             output = m_translate ? i18n("MB/s") : "MB/s"; |             output = m_translate ? i18n("MB/s") : "MB/s"; | ||||||
|         else |         else | ||||||
|             output = m_translate ? i18n("KB/s") : "KB/s"; |             output = m_translate ? i18n("KB/s") : "KB/s"; | ||||||
| @ -112,53 +107,49 @@ QString AWKeysAggregator::formatter(const QVariant &_data, | |||||||
|         output = output.rightJustified(8, QLatin1Char(' '), true); |         output = output.rightJustified(8, QLatin1Char(' '), true); | ||||||
|         break; |         break; | ||||||
|     case FormatterType::Temperature: |     case FormatterType::Temperature: | ||||||
|         output = QString("%1").arg(temperature(_data.toFloat()), 5, 'f', 1); |         output = QString("%1").arg(temperature(_data.toDouble()), 5, 'f', 1); | ||||||
|         break; |         break; | ||||||
|     case FormatterType::Time: |     case FormatterType::Time: | ||||||
|         output = _data.toDateTime().toString(); |         output = QDateTime::fromSecsSinceEpoch(_data.toLongLong()).toString(); | ||||||
|         break; |         break; | ||||||
|     case FormatterType::TimeCustom: |     case FormatterType::TimeCustom: | ||||||
|         output = m_customTime; |         output = m_customTime; | ||||||
|         [&output, loc, this](const QDateTime dt) { |         [&output, loc, this](const QDateTime &dt) { | ||||||
|             for (auto &key : m_timeKeys) |             for (auto &key : m_timeKeys) | ||||||
|                 output.replace(QString("$%1").arg(key), loc.toString(dt, key)); |                 output.replace(QString("$%1").arg(key), loc.toString(dt, key)); | ||||||
|         }(_data.toDateTime()); |         }(QDateTime::fromSecsSinceEpoch(_data.toLongLong())); | ||||||
|         break; |         break; | ||||||
|     case FormatterType::TimeISO: |     case FormatterType::TimeISO: | ||||||
|         output = _data.toDateTime().toString(Qt::ISODate); |         output = QDateTime::fromSecsSinceEpoch(_data.toLongLong()).toString(Qt::ISODate); | ||||||
|         break; |         break; | ||||||
|     case FormatterType::TimeLong: |     case FormatterType::TimeLong: | ||||||
|         output = loc.toString(_data.toDateTime(), QLocale::LongFormat); |         output = loc.toString(QDateTime::fromSecsSinceEpoch(_data.toLongLong()), QLocale::LongFormat); | ||||||
|         break; |         break; | ||||||
|     case FormatterType::TimeShort: |     case FormatterType::TimeShort: | ||||||
|         output = loc.toString(_data.toDateTime(), QLocale::ShortFormat); |         output = loc.toString(QDateTime::fromSecsSinceEpoch(_data.toLongLong()), QLocale::ShortFormat); | ||||||
|         break; |         break; | ||||||
|     case FormatterType::Timestamp: |     case FormatterType::Timestamp: | ||||||
|         output = QString("%1").arg( |         output = _data.toString(); | ||||||
|             _data.toDateTime().toMSecsSinceEpoch() / 1000.0, 10, 'f', 0); |  | ||||||
|         break; |         break; | ||||||
|     case FormatterType::Uptime: |     case FormatterType::Uptime: | ||||||
|     case FormatterType::UptimeCustom: |     case FormatterType::UptimeCustom: | ||||||
|         output = |         output = | ||||||
|             [](QString source, const int uptime) { |             [](auto source, auto uptime) { | ||||||
|                 int seconds = uptime - uptime % 60; |                 auto seconds = uptime - uptime % 60; | ||||||
|                 int minutes = seconds / 60 % 60; |                 auto minutes = seconds / 60 % 60; | ||||||
|                 int hours = ((seconds / 60) - minutes) / 60 % 24; |                 auto hours = ((seconds / 60) - minutes) / 60 % 24; | ||||||
|                 int days = (((seconds / 60) - minutes) / 60 - hours) / 24; |                 auto days = (((seconds / 60) - minutes) / 60 - hours) / 24; | ||||||
|                 source.replace("$dd", |  | ||||||
|                                QString("%1").arg(days, 3, 10, QChar('0'))); |                 source.replace("$dd", QString("%1").arg(days, 3, 10, QChar('0'))); | ||||||
|                 source.replace("$d", QString("%1").arg(days)); |                 source.replace("$d", QString("%1").arg(days)); | ||||||
|                 source.replace("$hh", |                 source.replace("$hh", QString("%1").arg(hours, 2, 10, QChar('0'))); | ||||||
|                                QString("%1").arg(hours, 2, 10, QChar('0'))); |  | ||||||
|                 source.replace("$h", QString("%1").arg(hours)); |                 source.replace("$h", QString("%1").arg(hours)); | ||||||
|                 source.replace("$mm", |                 source.replace("$mm", QString("%1").arg(minutes, 2, 10, QChar('0'))); | ||||||
|                                QString("%1").arg(minutes, 2, 10, QChar('0'))); |  | ||||||
|                 source.replace("$m", QString("%1").arg(minutes)); |                 source.replace("$m", QString("%1").arg(minutes)); | ||||||
|  |  | ||||||
|                 return source; |                 return source; | ||||||
|             }(m_mapper->formatter(_key) == FormatterType::Uptime |             }(m_mapper->formatter(_key) == FormatterType::Uptime ? "$ddd$hhh$mmm" : m_customUptime, | ||||||
|                   ? "$ddd$hhh$mmm" |               static_cast<int>(_data.toDouble())); | ||||||
|                   : m_customUptime, |  | ||||||
|               static_cast<int>(_data.toFloat())); |  | ||||||
|         break; |         break; | ||||||
|     case FormatterType::NoFormat: |     case FormatterType::NoFormat: | ||||||
|         output = _data.toString(); |         output = _data.toString(); | ||||||
| @ -170,7 +161,8 @@ QString AWKeysAggregator::formatter(const QVariant &_data, | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     // replace spaces to non-breakable ones |     // replace spaces to non-breakable ones | ||||||
|     if (!_key.startsWith("custom") && (!_key.startsWith("weather"))) |     replaceSpace &= (!_key.startsWith("custom") && (!_key.startsWith("weather"))); | ||||||
|  |     if (replaceSpace) | ||||||
|         output.replace(" ", " "); |         output.replace(" ", " "); | ||||||
|  |  | ||||||
|     return output; |     return output; | ||||||
| @ -241,8 +233,7 @@ void AWKeysAggregator::setTranslate(const bool _translate) | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| QStringList AWKeysAggregator::registerSource(const QString &_source, | QStringList AWKeysAggregator::registerSource(const QString &_source, const KSysGuard::Unit _units, | ||||||
|                                              const QString &_units, |  | ||||||
|                                              const QStringList &_keys) |                                              const QStringList &_keys) | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Source" << _source << "with units" << _units; |     qCDebug(LOG_AW) << "Source" << _source << "with units" << _units; | ||||||
| @ -251,24 +242,24 @@ QStringList AWKeysAggregator::registerSource(const QString &_source, | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| float AWKeysAggregator::temperature(const float temp) const | double AWKeysAggregator::temperature(const double temp) const | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Temperature value" << temp; |     qCDebug(LOG_AW) << "Temperature value" << temp; | ||||||
|  |  | ||||||
|     float converted = temp; |     auto converted = temp; | ||||||
|     if (m_tempUnits == "Celsius") { |     if (m_tempUnits == "Celsius") { | ||||||
|     } else if (m_tempUnits == "Fahrenheit") { |     } else if (m_tempUnits == "Fahrenheit") { | ||||||
|         converted = temp * 9.0f / 5.0f + 32.0f; |         converted = temp * 9.0f / 5.0 + 32.0; | ||||||
|     } else if (m_tempUnits == "Kelvin") { |     } else if (m_tempUnits == "Kelvin") { | ||||||
|         converted = temp + 273.15f; |         converted = temp + 273.15; | ||||||
|     } else if (m_tempUnits == "Reaumur") { |     } else if (m_tempUnits == "Reaumur") { | ||||||
|         converted = temp * 0.8f; |         converted = temp * 0.8; | ||||||
|     } else if (m_tempUnits == "cm^-1") { |     } else if (m_tempUnits == "cm^-1") { | ||||||
|         converted = (temp + 273.15f) * 0.695f; |         converted = (temp + 273.15) * 0.695; | ||||||
|     } else if (m_tempUnits == "kJ/mol") { |     } else if (m_tempUnits == "kJ/mol") { | ||||||
|         converted = (temp + 273.15f) * 8.31f; |         converted = (temp + 273.15) * 8.31; | ||||||
|     } else if (m_tempUnits == "kcal/mol") { |     } else if (m_tempUnits == "kcal/mol") { | ||||||
|         converted = (temp + 273.15f) * 1.98f; |         converted = (temp + 273.15) * 1.98; | ||||||
|     } else { |     } else { | ||||||
|         qCWarning(LOG_AW) << "Invalid units" << m_tempUnits; |         qCWarning(LOG_AW) << "Invalid units" << m_tempUnits; | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -15,9 +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/  * | ||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
| #ifndef AWKEYSAGGREGATOR_H | #include <ksysguard/formatter/Unit.h> | ||||||
| #define AWKEYSAGGREGATOR_H |  | ||||||
|  |  | ||||||
| #include <QHash> | #include <QHash> | ||||||
| #include <QObject> | #include <QObject> | ||||||
| @ -32,8 +32,7 @@ class AWKeysAggregator : public QObject | |||||||
|     Q_PROPERTY(QString acOffline MEMBER m_acOffline WRITE setAcOffline); |     Q_PROPERTY(QString acOffline MEMBER m_acOffline WRITE setAcOffline); | ||||||
|     Q_PROPERTY(QString acOnline MEMBER m_acOnline WRITE setAcOnline); |     Q_PROPERTY(QString acOnline MEMBER m_acOnline WRITE setAcOnline); | ||||||
|     Q_PROPERTY(QString customTime MEMBER m_customTime WRITE setCustomTime); |     Q_PROPERTY(QString customTime MEMBER m_customTime WRITE setCustomTime); | ||||||
|     Q_PROPERTY( |     Q_PROPERTY(QString customUptime MEMBER m_customUptime WRITE setCustomUptime); | ||||||
|         QString customUptime MEMBER m_customUptime WRITE setCustomUptime); |  | ||||||
|     Q_PROPERTY(QString tempUnits MEMBER m_tempUnits WRITE setTempUnits); |     Q_PROPERTY(QString tempUnits MEMBER m_tempUnits WRITE setTempUnits); | ||||||
|     Q_PROPERTY(bool translate MEMBER m_translate WRITE setTranslate); |     Q_PROPERTY(bool translate MEMBER m_translate WRITE setTranslate); | ||||||
|  |  | ||||||
| @ -52,6 +51,7 @@ public: | |||||||
|         ACFormat, |         ACFormat, | ||||||
|         MemGBFormat, |         MemGBFormat, | ||||||
|         MemMBFormat, |         MemMBFormat, | ||||||
|  |         MemKBFormat, | ||||||
|         NetSmartFormat, |         NetSmartFormat, | ||||||
|         NetSmartUnits, |         NetSmartUnits, | ||||||
|         Quotes, |         Quotes, | ||||||
| @ -66,12 +66,16 @@ public: | |||||||
|         UptimeCustom |         UptimeCustom | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|  |     static constexpr double KBinBytes = 1024.0; | ||||||
|  |     static constexpr double MBinBytes = 1024.0 * KBinBytes; | ||||||
|  |     static constexpr double GBinBytes = 1024.0 * MBinBytes; | ||||||
|  |  | ||||||
|     explicit AWKeysAggregator(QObject *_parent = nullptr); |     explicit AWKeysAggregator(QObject *_parent = nullptr); | ||||||
|     virtual ~AWKeysAggregator(); |     ~AWKeysAggregator() override = default; | ||||||
|     void initFormatters(); |     void initFormatters(); | ||||||
|     // get methods |     // get methods | ||||||
|     QString formatter(const QVariant &_data, const QString &_key) const; |     [[nodiscard]] QString formatter(const QVariant &_data, const QString &_key, bool replaceSpace) const; | ||||||
|     QStringList keysFromSource(const QString &_source) const; |     [[nodiscard]] QStringList keysFromSource(const QString &_source) 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); | ||||||
| @ -79,14 +83,13 @@ public: | |||||||
|     void setCustomUptime(const QString &_customUptime); |     void setCustomUptime(const QString &_customUptime); | ||||||
|     void setDevices(const QHash<QString, QStringList> &_devices); |     void setDevices(const QHash<QString, QStringList> &_devices); | ||||||
|     void setTempUnits(const QString &_units); |     void setTempUnits(const QString &_units); | ||||||
|     void setTranslate(const bool _translate); |     void setTranslate(bool _translate); | ||||||
|  |  | ||||||
| public slots: | public slots: | ||||||
|     QStringList registerSource(const QString &_source, const QString &_units, |     QStringList registerSource(const QString &_source, KSysGuard::Unit _units, const QStringList &_keys); | ||||||
|                                const QStringList &_keys); |  | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     float temperature(const float temp) const; |     [[nodiscard]] double temperature(double temp) const; | ||||||
|     AWFormatterHelper *m_customFormatters = nullptr; |     AWFormatterHelper *m_customFormatters = nullptr; | ||||||
|     AWDataEngineMapper *m_mapper = nullptr; |     AWDataEngineMapper *m_mapper = nullptr; | ||||||
|     QStringList m_timeKeys; |     QStringList m_timeKeys; | ||||||
| @ -98,6 +101,3 @@ private: | |||||||
|     QString m_tempUnits; |     QString m_tempUnits; | ||||||
|     bool m_translate = false; |     bool m_translate = false; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif /* AWKEYSAGGREGATOR_H */ |  | ||||||
|  | |||||||
| @ -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) | ||||||
| { | { | ||||||
|     AWFormatterConfig *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) | ||||||
| { | { | ||||||
|     AWCustomKeysConfig *config = new AWCustomKeysConfig(nullptr, _keys); |     auto config = new AWCustomKeysConfig(nullptr, _keys); | ||||||
|     config->showDialog(); |     config->showDialog(); | ||||||
|     config->deleteLater(); |     config->deleteLater(); | ||||||
| } | } | ||||||
|  | |||||||
| @ -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,9 @@ class AWPairConfigFactory : public QObject | |||||||
|  |  | ||||||
| public: | public: | ||||||
|     explicit AWPairConfigFactory(QObject *_parent = nullptr); |     explicit AWPairConfigFactory(QObject *_parent = nullptr); | ||||||
|     virtual ~AWPairConfigFactory(); |     ~AWPairConfigFactory() override = default; | ||||||
|     Q_INVOKABLE void showFormatterDialog(const QStringList &_keys); |     Q_INVOKABLE static void showFormatterDialog(const QStringList &_keys); | ||||||
|     Q_INVOKABLE void showKeysDialog(const QStringList &_keys); |     Q_INVOKABLE static void showKeysDialog(const QStringList &_keys); | ||||||
|  |  | ||||||
| private: | private: | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif /* AWPAIRCONFIGFACTORY_H */ |  | ||||||
|  | |||||||
| @ -24,25 +24,21 @@ | |||||||
| #include "awkeysaggregator.h" | #include "awkeysaggregator.h" | ||||||
|  |  | ||||||
|  |  | ||||||
| QString AWPatternFunctions::expandLambdas(QString _code, | QString AWPatternFunctions::expandLambdas(QString _code, AWKeysAggregator *_aggregator, const QVariantHash &_metadata, | ||||||
|                                           AWKeysAggregator *_aggregator, |  | ||||||
|                                           const QVariantHash &_metadata, |  | ||||||
|                                           const QStringList &_usedKeys) |                                           const QStringList &_usedKeys) | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Expand lamdas in" << _code; |     qCDebug(LOG_AW) << "Expand lambdas in" << _code; | ||||||
|  |  | ||||||
|     QJSEngine engine; |     QJSEngine engine; | ||||||
|     // apply $this values |     // apply $this values | ||||||
|     _code.replace("$this", _metadata[_code].toString()); |     _code.replace("$this", _metadata[_code].toString()); | ||||||
|     // parsed values |     // parsed values | ||||||
|     for (auto &lambdaKey : _usedKeys) |     for (auto &lambdaKey : _usedKeys) | ||||||
|         _code.replace(QString("$%1").arg(lambdaKey), |         _code.replace(QString("$%1").arg(lambdaKey), _aggregator->formatter(_metadata[lambdaKey], lambdaKey, false)); | ||||||
|                       _aggregator->formatter(_metadata[lambdaKey], lambdaKey)); |  | ||||||
|     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" |         qCWarning(LOG_AW) << "Uncaught exception at line" << result.property("lineNumber").toInt() << ":" | ||||||
|                           << result.property("lineNumber").toInt() << ":" |  | ||||||
|                           << result.toString(); |                           << result.toString(); | ||||||
|         return ""; |         return ""; | ||||||
|     } else { |     } else { | ||||||
| @ -56,22 +52,20 @@ 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("\\$template\\{\\{(?<body>.*?)\\}\\}"); |     static QRegularExpression templatesRegexp(R"(\$template\{\{(?<body>.*?)\}\})"); | ||||||
|     templatesRegexp.setPatternOptions( |     templatesRegexp.setPatternOptions(QRegularExpression::DotMatchesEverythingOption); | ||||||
|         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" |             qCWarning(LOG_AW) << "Uncaught exception at line" << result.property("lineNumber").toInt() << ":" | ||||||
|                               << result.property("lineNumber").toInt() << ":" |  | ||||||
|                               << result.toString(); |                               << result.toString(); | ||||||
|         } else { |         } else { | ||||||
|             templateResult = result.toString(); |             templateResult = result.toString(); | ||||||
| @ -85,8 +79,7 @@ QString AWPatternFunctions::expandTemplates(QString _code) | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| QList<AWPatternFunctions::AWFunction> | QList<AWPatternFunctions::AWFunction> AWPatternFunctions::findFunctionCalls(const QString &_function, | ||||||
| AWPatternFunctions::findFunctionCalls(const QString &_function, |  | ||||||
|                                                                             const QString &_code) |                                                                             const QString &_code) | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Looking for function" << _function << "in" << _code; |     qCDebug(LOG_AW) << "Looking for function" << _function << "in" << _code; | ||||||
| @ -97,28 +90,24 @@ AWPatternFunctions::findFunctionCalls(const QString &_function, | |||||||
|     // in this field if they are not screened by $, i.e. '$,' |     // in this field if they are not screened by $, i.e. '$,' | ||||||
|     // * body depends on the function name, double brackets should be screened |     // * body depends on the function name, double brackets should be screened | ||||||
|     // by using $, e.g. ${ |     // by using $, e.g. ${ | ||||||
|     QRegularExpression regex( |     QRegularExpression regex(QString(R"(\$%1\<(?<args>.*?)\>\{\{(?<body>.*?)\}\})").arg(_function)); | ||||||
|         QString("\\$%1\\<(?<args>.*?)\\>\\{\\{(?<body>.*?)\\}\\}") |  | ||||||
|             .arg(_function)); |  | ||||||
|     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("$,", QString(0x1d)); |             argsString.replace("$,", QChar(0x1d)); | ||||||
|             QStringList args = argsString.split(','); |             auto args = argsString.split(','); | ||||||
|             std::for_each(args.begin(), args.end(), [](QString &arg) { |             std::for_each(args.begin(), args.end(), [](auto &arg) { arg.replace(QChar(0x1d), ","); }); | ||||||
|                 arg.replace(QString(0x1d), ","); |  | ||||||
|             }); |  | ||||||
|             metadata.args = args; |             metadata.args = args; | ||||||
|         } |         } | ||||||
|         // other variables |         // other variables | ||||||
| @ -134,20 +123,15 @@ AWPatternFunctions::findFunctionCalls(const QString &_function, | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| QString AWPatternFunctions::insertAllKeys(QString _code, | QString AWPatternFunctions::insertAllKeys(QString _code, const QStringList &_keys) | ||||||
|                                           const QStringList &_keys) |  | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Looking for keys in code" << _code << "using list" |     qCDebug(LOG_AW) << "Looking for keys in code" << _code << "using list" << _keys; | ||||||
|                     << _keys; |  | ||||||
|  |  | ||||||
|     QList<AWPatternFunctions::AWFunction> found |     auto found = AWPatternFunctions::findFunctionCalls("aw_all", _code); | ||||||
|         = 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(QRegExp(function.body)); |         auto required = _keys.filter(QRegularExpression(function.body)); | ||||||
|         std::for_each(required.begin(), required.end(), [](QString &value) { |         std::for_each(required.begin(), required.end(), [](auto &value) { value = QString("%1: $%1").arg(value); }); | ||||||
|             value = QString("%1: $%1").arg(value); |  | ||||||
|         }); |  | ||||||
|  |  | ||||||
|         _code.replace(function.what, required.join(separator)); |         _code.replace(function.what, required.join(separator)); | ||||||
|     } |     } | ||||||
| @ -156,16 +140,13 @@ QString AWPatternFunctions::insertAllKeys(QString _code, | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| QString AWPatternFunctions::insertKeyCount(QString _code, | QString AWPatternFunctions::insertKeyCount(QString _code, const QStringList &_keys) | ||||||
|                                            const QStringList &_keys) |  | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Looking for count in code" << _code << "using list" |     qCDebug(LOG_AW) << "Looking for count in code" << _code << "using list" << _keys; | ||||||
|                     << _keys; |  | ||||||
|  |  | ||||||
|     QList<AWPatternFunctions::AWFunction> found |     auto found = AWPatternFunctions::findFunctionCalls("aw_count", _code); | ||||||
|         = AWPatternFunctions::findFunctionCalls("aw_count", _code); |  | ||||||
|     for (auto &function : found) { |     for (auto &function : found) { | ||||||
|         int count = _keys.filter(QRegExp(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)); | ||||||
|     } |     } | ||||||
| @ -174,17 +155,14 @@ QString AWPatternFunctions::insertKeyCount(QString _code, | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| QString AWPatternFunctions::insertKeyNames(QString _code, | QString AWPatternFunctions::insertKeyNames(QString _code, const QStringList &_keys) | ||||||
|                                            const QStringList &_keys) |  | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Looking for key names in code" << _code << "using list" |     qCDebug(LOG_AW) << "Looking for key names in code" << _code << "using list" << _keys; | ||||||
|                     << _keys; |  | ||||||
|  |  | ||||||
|     QList<AWPatternFunctions::AWFunction> found |     auto found = AWPatternFunctions::findFunctionCalls("aw_names", _code); | ||||||
|         = 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(QRegExp(function.body)); |         auto required = _keys.filter(QRegularExpression(function.body)); | ||||||
|  |  | ||||||
|         _code.replace(function.what, required.join(separator)); |         _code.replace(function.what, required.join(separator)); | ||||||
|     } |     } | ||||||
| @ -195,17 +173,13 @@ QString AWPatternFunctions::insertKeyNames(QString _code, | |||||||
|  |  | ||||||
| QString AWPatternFunctions::insertKeys(QString _code, const QStringList &_keys) | QString AWPatternFunctions::insertKeys(QString _code, const QStringList &_keys) | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Looking for keys in code" << _code << "using list" |     qCDebug(LOG_AW) << "Looking for keys in code" << _code << "using list" << _keys; | ||||||
|                     << _keys; |  | ||||||
|  |  | ||||||
|     QList<AWPatternFunctions::AWFunction> found |     auto found = AWPatternFunctions::findFunctionCalls("aw_keys", _code); | ||||||
|         = 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(QRegExp(function.body)); |         auto required = _keys.filter(QRegularExpression(function.body)); | ||||||
|         std::for_each(required.begin(), required.end(), [](QString &value) { |         std::for_each(required.begin(), required.end(), [](auto &value) { value = QString("$%1").arg(value); }); | ||||||
|             value = QString("$%1").arg(value); |  | ||||||
|         }); |  | ||||||
|  |  | ||||||
|         _code.replace(function.what, required.join(separator)); |         _code.replace(function.what, required.join(separator)); | ||||||
|     } |     } | ||||||
| @ -218,33 +192,26 @@ 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 |     auto found = AWPatternFunctions::findFunctionCalls("aw_macro", _code); | ||||||
|         = AWPatternFunctions::findFunctionCalls("aw_macro", _code); |  | ||||||
|     for (auto ¯o : found) { |     for (auto ¯o : 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) |                 qCWarning(LOG_AW) << "Invalid args count found for call" << function.what << "with macro" << macro.what; | ||||||
|                     << "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(), |             std::for_each(macro.args.cbegin(), macro.args.cend(), [&result, macro, function](auto &arg) { | ||||||
|                           [&result, macro, function](const QString &arg) { |                 auto index = macro.args.indexOf(arg); | ||||||
|                               int 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 | ||||||
|             _code.replace(function.what, result); |             _code.replace(function.what, result); | ||||||
| @ -258,20 +225,15 @@ QString AWPatternFunctions::insertMacros(QString _code) | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| QStringList AWPatternFunctions::findKeys(const QString &_code, | QStringList AWPatternFunctions::findKeys(const QString &_code, const QStringList &_keys, const bool _isBars) | ||||||
|                                          const QStringList &_keys, |  | ||||||
|                                          const bool _isBars) |  | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Looking for keys in code" << _code << "using list" |     qCDebug(LOG_AW) << "Looking for keys in code" << _code << "using list" << _keys; | ||||||
|                     << _keys; |  | ||||||
|  |  | ||||||
|     QStringList selectedKeys; |     QStringList selectedKeys; | ||||||
|     QString replacedCode = _code; |     auto replacedCode = _code; | ||||||
|     for (auto &key : _keys) |     for (auto &key : _keys) | ||||||
|         if ((key.startsWith("bar") == _isBars) |         if ((key.startsWith("bar") == _isBars) && (replacedCode.contains(QString("$%1").arg(key)))) { | ||||||
|             && (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; |  | ||||||
|             selectedKeys.append(key); |             selectedKeys.append(key); | ||||||
|             replacedCode.replace(QString("$%1").arg(key), ""); |             replacedCode.replace(QString("$%1").arg(key), ""); | ||||||
|         } |         } | ||||||
| @ -288,14 +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("\\$\\{\\{(?<body>.*?)\\}\\}"); |     static QRegularExpression lambdaRegexp(R"(\$\{\{(?<body>.*?)\}\})"); | ||||||
|     lambdaRegexp.setPatternOptions( |     lambdaRegexp.setPatternOptions(QRegularExpression::DotMatchesEverythingOption); | ||||||
|         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; | ||||||
|  | |||||||
| @ -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> | ||||||
| @ -34,22 +32,16 @@ typedef struct { | |||||||
| } AWFunction; | } AWFunction; | ||||||
|  |  | ||||||
| // insert methods | // insert methods | ||||||
| QString expandLambdas(QString _code, AWKeysAggregator *_aggregator, | QString expandLambdas(QString _code, AWKeysAggregator *_aggregator, const QVariantHash &_metadata, | ||||||
|                       const QVariantHash &_metadata, |  | ||||||
|                       const QStringList &_usedKeys); |                       const QStringList &_usedKeys); | ||||||
| QString expandTemplates(QString _code); | QString expandTemplates(QString _code); | ||||||
| QList<AWFunction> findFunctionCalls(const QString &_function, | QList<AWFunction> findFunctionCalls(const QString &_function, const QString &_code); | ||||||
|                                     const QString &_code); |  | ||||||
| QString insertAllKeys(QString _code, const QStringList &_keys); | QString insertAllKeys(QString _code, const QStringList &_keys); | ||||||
| QString insertKeyCount(QString _code, const QStringList &_keys); | QString insertKeyCount(QString _code, const QStringList &_keys); | ||||||
| QString insertKeyNames(QString _code, const QStringList &_keys); | QString insertKeyNames(QString _code, const QStringList &_keys); | ||||||
| QString insertKeys(QString _code, const QStringList &_keys); | QString insertKeys(QString _code, const QStringList &_keys); | ||||||
| QString insertMacros(QString _code); | QString insertMacros(QString _code); | ||||||
| // find methods | // find methods | ||||||
| QStringList findKeys(const QString &_code, const QStringList &_keys, | QStringList findKeys(const QString &_code, const QStringList &_keys, bool _isBars); | ||||||
|                      const bool _isBars); |  | ||||||
| QStringList findLambdas(const QString &_code); | QStringList findLambdas(const QString &_code); | ||||||
| }; | } // namespace AWPatternFunctions | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif /* AWPATTERNFUNCTIONS_H */ |  | ||||||
|  | |||||||
| @ -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,25 +25,13 @@ | |||||||
| #include "awdebug.h" | #include "awdebug.h" | ||||||
|  |  | ||||||
|  |  | ||||||
| AWTelemetryHandler::AWTelemetryHandler(QObject *_parent, | AWTelemetryHandler::AWTelemetryHandler(QObject *_parent) | ||||||
|                                        const QString &_clientId) |  | ||||||
|     : 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( |                       .arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)); | ||||||
|                           QStandardPaths::GenericDataLocation)); |  | ||||||
|  |  | ||||||
|     // override client id if any |  | ||||||
|     if (!_clientId.isEmpty()) |  | ||||||
|         m_clientId = _clientId; |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| AWTelemetryHandler::~AWTelemetryHandler() |  | ||||||
| { |  | ||||||
|     qCDebug(LOG_AW) << __PRETTY_FUNCTION__; |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -73,22 +59,17 @@ QString AWTelemetryHandler::getLast(const QString &_group) const | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void AWTelemetryHandler::init(const int _count, const bool _enableRemote, | void AWTelemetryHandler::init(const int _count) | ||||||
|                               const QString &_clientId) |  | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Init telemetry with count" << _count << "enable remote" |     qCDebug(LOG_AW) << "Init telemetry with count" << _count; | ||||||
|                     << _enableRemote << "client ID" << _clientId; |  | ||||||
|  |  | ||||||
|     m_storeCount = _count; |     m_storeCount = _count; | ||||||
|     m_uploadEnabled = _enableRemote; |  | ||||||
|     m_clientId = _clientId; |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| bool AWTelemetryHandler::put(const QString &_group, const QString &_value) const | bool AWTelemetryHandler::put(const QString &_group, const QString &_value) const | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Store data with group" << _group << "and value" |     qCDebug(LOG_AW) << "Store data with group" << _group << "and value" << _value; | ||||||
|                     << _value; |  | ||||||
|  |  | ||||||
|     QSettings settings(m_localFile, QSettings::IniFormat); |     QSettings settings(m_localFile, QSettings::IniFormat); | ||||||
|     settings.beginGroup(_group); |     settings.beginGroup(_group); | ||||||
| @ -99,8 +80,7 @@ bool AWTelemetryHandler::put(const QString &_group, const QString &_value) const | |||||||
|         saved.append(settings.value(key).toString()); |         saved.append(settings.value(key).toString()); | ||||||
|     // check if this value is already saved |     // check if this value is already saved | ||||||
|     if (saved.contains(_value)) { |     if (saved.contains(_value)) { | ||||||
|         qCInfo(LOG_AW) << "Configuration" << _value << "for group" << _group |         qCInfo(LOG_AW) << "Configuration" << _value << "for group" << _group << "is already saved"; | ||||||
|                        << "is already saved"; |  | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|     saved.append(_value); |     saved.append(_value); | ||||||
| @ -111,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); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @ -123,66 +103,7 @@ bool AWTelemetryHandler::put(const QString &_group, const QString &_value) const | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void AWTelemetryHandler::uploadTelemetry(const QString &_group, | QString AWTelemetryHandler::getKey(const int _count) | ||||||
|                                          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; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     QNetworkAccessManager *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) const |  | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Get key for keys count" << _count; |     qCDebug(LOG_AW) << "Get key for keys count" << _count; | ||||||
|  |  | ||||||
|  | |||||||
| @ -15,46 +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 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, |     Q_INVOKABLE [[nodiscard]] QStringList get(const QString &_group) const; | ||||||
|                                 const QString &_clientId = ""); |     Q_INVOKABLE [[nodiscard]] QString getLast(const QString &_group) const; | ||||||
|     virtual ~AWTelemetryHandler(); |     Q_INVOKABLE void init(int _count); | ||||||
|     Q_INVOKABLE QStringList get(const QString &_group) const; |     Q_INVOKABLE [[nodiscard]] bool put(const QString &_group, const QString &_value) const; | ||||||
|     Q_INVOKABLE QString getLast(const QString &_group) const; |  | ||||||
|     Q_INVOKABLE void init(const int _count, const bool _enableRemote, |  | ||||||
|                           const QString &_clientId); |  | ||||||
|     Q_INVOKABLE 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: | ||||||
|     QString getKey(const int _count) const; |     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 */ |  | ||||||
|  | |||||||
| @ -18,12 +18,14 @@ | |||||||
| #include "awupdatehelper.h" | #include "awupdatehelper.h" | ||||||
|  |  | ||||||
| #include <KI18n/KLocalizedString> | #include <KI18n/KLocalizedString> | ||||||
|  | #include <KNotifications/KNotification> | ||||||
|  |  | ||||||
| #include <QDesktopServices> | #include <QDesktopServices> | ||||||
| #include <QJsonDocument> | #include <QJsonDocument> | ||||||
| #include <QNetworkAccessManager> | #include <QNetworkAccessManager> | ||||||
| #include <QNetworkReply> | #include <QNetworkReply> | ||||||
| #include <QSettings> | #include <QSettings> | ||||||
|  | #include <QStandardPaths> | ||||||
|  |  | ||||||
| #include "awdebug.h" | #include "awdebug.h" | ||||||
|  |  | ||||||
| @ -35,14 +37,7 @@ AWUpdateHelper::AWUpdateHelper(QObject *_parent) | |||||||
|  |  | ||||||
|     m_foundVersion = QVersionNumber::fromString(VERSION); |     m_foundVersion = QVersionNumber::fromString(VERSION); | ||||||
|     m_genericConfig = QString("%1/awesomewidgets/general.ini") |     m_genericConfig = QString("%1/awesomewidgets/general.ini") | ||||||
|                           .arg(QStandardPaths::writableLocation( |                           .arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)); | ||||||
|                               QStandardPaths::GenericDataLocation)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| AWUpdateHelper::~AWUpdateHelper() |  | ||||||
| { |  | ||||||
|     qCDebug(LOG_AW) << __PRETTY_FUNCTION__; |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -50,13 +45,11 @@ 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 | ||||||
|     QNetworkAccessManager *manager = new QNetworkAccessManager(nullptr); |     auto manager = new QNetworkAccessManager(nullptr); | ||||||
|     connect(manager, &QNetworkAccessManager::finished, |     connect(manager, &QNetworkAccessManager::finished, | ||||||
|             [_showAnyway, this](QNetworkReply *reply) { |             [_showAnyway, this](QNetworkReply *reply) { return versionReplyReceived(reply, _showAnyway); }); | ||||||
|                 return versionReplyRecieved(reply, _showAnyway); |  | ||||||
|             }); |  | ||||||
|  |  | ||||||
|     manager->get(QNetworkRequest(QUrl(VERSION_API))); |     manager->get(QNetworkRequest(QUrl(VERSION_API))); | ||||||
| } | } | ||||||
| @ -65,18 +58,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( |     auto version = QVersionNumber::fromString(settings.value("Version", QString(VERSION)).toString()); | ||||||
|         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" |     qCInfo(LOG_AW) << "Found version" << version << "actual one is" << m_foundVersion; | ||||||
|                    << m_foundVersion; |  | ||||||
|  |  | ||||||
|     if ((version != m_foundVersion) && (!QString(CHANGELOG).isEmpty())) { |     if ((version != m_foundVersion) && (!QString(CHANGELOG).isEmpty())) { | ||||||
|         genMessageBox(i18n("Changelog of %1", VERSION), |         sendNotification(i18n("Changelog of %1", VERSION), QString(CHANGELOG).replace('@', '\n')); | ||||||
|                       QString(CHANGELOG).replace('@', '\n'), QMessageBox::Ok) |  | ||||||
|             ->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"; | ||||||
| @ -89,81 +78,64 @@ 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 |     auto text = i18n("You are using the actual version %1", _version.toString()); | ||||||
|         = 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) |     sendNotification(i18n("No new version found"), text); | ||||||
|         ->open(); |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| 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 += i18n("Current version : %1", VERSION); |     text += i18n("Current version : %1", VERSION); | ||||||
|     text += QString(COMMIT_SHA).isEmpty() |     text += QString(COMMIT_SHA).isEmpty() ? "\n" : QString(" (%1)\n").arg(QString(COMMIT_SHA)); | ||||||
|                 ? "\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, |     auto event = sendNotification(i18n("There are updates"), text); | ||||||
|                   QMessageBox::Ok | QMessageBox::Cancel) |     auto action = event->addAction(i18n("Details")); | ||||||
|         ->open(this, SLOT(userReplyOnUpdates(QAbstractButton *))); |     connect(action, &KNotificationAction::activated, this, &AWUpdateHelper::openReleasesPage); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void AWUpdateHelper::userReplyOnUpdates(QAbstractButton *_button) | void AWUpdateHelper::versionReplyReceived(QNetworkReply *_reply, const bool _showAnyway) | ||||||
| { |  | ||||||
|     QMessageBox::ButtonRole ret |  | ||||||
|         = static_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) { | ||||||
|         qCWarning(LOG_AW) << "An error occurs" << _reply->error() |         qCWarning(LOG_AW) << "An error occurs" << _reply->error() << "with message" << _reply->errorString(); | ||||||
|                           << "with message" << _reply->errorString(); |  | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     QJsonParseError error; |     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) | ||||||
| @ -172,20 +144,12 @@ void AWUpdateHelper::versionReplyRecieved(QNetworkReply *_reply, | |||||||
|  |  | ||||||
|  |  | ||||||
| // 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 * | KNotification *AWUpdateHelper::sendNotification(const QString &_title, const QString &_body) | ||||||
| AWUpdateHelper::genMessageBox(const QString &_title, const QString &_body, |  | ||||||
|                               const QMessageBox::StandardButtons _buttons) |  | ||||||
| { | { | ||||||
|     qCDebug(LOG_AW) << "Construct message box with title" << _title |     qCDebug(LOG_AW) << "Construct message box with title" << _title << "and body" << _body; | ||||||
|                     << "and body" << _body; |  | ||||||
|  |  | ||||||
|     QMessageBox *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; | ||||||
| } | } | ||||||
|  | |||||||
| @ -15,15 +15,13 @@ | |||||||
|  *   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 AWUpdateHelper : public QObject | ||||||
| @ -32,22 +30,18 @@ class AWUpdateHelper : public QObject | |||||||
|  |  | ||||||
| public: | public: | ||||||
|     explicit AWUpdateHelper(QObject *_parent = nullptr); |     explicit AWUpdateHelper(QObject *_parent = nullptr); | ||||||
|     virtual ~AWUpdateHelper(); |     ~AWUpdateHelper() override = default; | ||||||
|     void checkUpdates(const bool _showAnyway = false); |     void checkUpdates(bool _showAnyway = false); | ||||||
|     bool checkVersion(); |     bool checkVersion(); | ||||||
|  |  | ||||||
| private slots: | private slots: | ||||||
|     void showInfo(const QVersionNumber &_version); |     void openReleasesPage(); | ||||||
|     void showUpdates(const QVersionNumber &_version); |     static void showInfo(const QVersionNumber &_version); | ||||||
|     void userReplyOnUpdates(QAbstractButton *_button); |     void showUpdates(const QVersionNumber &_version) const; | ||||||
|     void versionReplyRecieved(QNetworkReply *_reply, const bool _showAnyway); |     void versionReplyReceived(QNetworkReply *_reply, bool _showAnyway); | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     QMessageBox *genMessageBox(const QString &_title, const QString &_body, |     static KNotification *sendNotification(const QString &_title, const QString &_body); | ||||||
|                                const QMessageBox::StandardButtons _buttons); |  | ||||||
|     QVersionNumber m_foundVersion; |     QVersionNumber m_foundVersion; | ||||||
|     QString m_genericConfig; |     QString m_genericConfig; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif /* AWUPDATEHELPER_H */ |  | ||||||
|  | |||||||
| @ -7,7 +7,7 @@ include_directories( | |||||||
|         ${CMAKE_BINARY_DIR} |         ${CMAKE_BINARY_DIR} | ||||||
|         ${PROJECT_TRDPARTY_DIR} |         ${PROJECT_TRDPARTY_DIR} | ||||||
|         ${Qt_INCLUDE} |         ${Qt_INCLUDE} | ||||||
|         ${Kf5_INCLUDE} |         ${Kf6_INCLUDE} | ||||||
| ) | ) | ||||||
|  |  | ||||||
| file(GLOB SUBPROJECT_SOURCE *.cpp ${PROJECT_TRDPARTY_DIR}/qreplytimeout/*.cpp ${CMAKE_SOURCE_DIR}/*.cpp) | file(GLOB SUBPROJECT_SOURCE *.cpp ${PROJECT_TRDPARTY_DIR}/qreplytimeout/*.cpp ${CMAKE_SOURCE_DIR}/*.cpp) | ||||||
| @ -28,18 +28,18 @@ file(RELATIVE_PATH SUBPROJECT_WEATHER_JSON ${CMAKE_SOURCE_DIR} ${SUBPROJECT_WEAT | |||||||
| # prepare | # prepare | ||||||
| configure_file(${SUBPROJECT_WEATHER_JSON_IN} ${CMAKE_CURRENT_BINARY_DIR}/${SUBPROJECT_WEATHER_JSON}) | configure_file(${SUBPROJECT_WEATHER_JSON_IN} ${CMAKE_CURRENT_BINARY_DIR}/${SUBPROJECT_WEATHER_JSON}) | ||||||
|  |  | ||||||
| qt5_wrap_ui(SUBPROJECT_UI_HEADER ${SUBPROJECT_UI}) | qt6_wrap_ui(SUBPROJECT_UI_HEADER ${SUBPROJECT_UI}) | ||||||
| add_library(${SUBPROJECT} STATIC ${SUBPROJECT_SOURCE} ${SUBPROJECT_HEADER} ${SUBPROJECT_UI_HEADER}) | add_library(${SUBPROJECT} STATIC ${SUBPROJECT_SOURCE} ${SUBPROJECT_HEADER} ${SUBPROJECT_UI_HEADER}) | ||||||
| target_link_libraries(${SUBPROJECT} ${Qt_LIBRARIES} ${Kf5_LIBRARIES}) | target_link_libraries(${SUBPROJECT} ${Qt_LIBRARIES} ${Kf6_LIBRARIES}) | ||||||
|  |  | ||||||
| # install | # install | ||||||
| install(DIRECTORY ${SUBPROJECT_CONFIGS} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME}) | install(DIRECTORY ${SUBPROJECT_CONFIGS} DESTINATION ${KDE_INSTALL_DATADIR}/${PROJECT_NAME}) | ||||||
| install(DIRECTORY ${SUBPROJECT_FORMATTERS} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME}) | install(DIRECTORY ${SUBPROJECT_FORMATTERS} DESTINATION ${KDE_INSTALL_DATADIR}/${PROJECT_NAME}) | ||||||
| install(DIRECTORY ${SUBPROJECT_GRAPHITEMS} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME}) | install(DIRECTORY ${SUBPROJECT_GRAPHITEMS} DESTINATION ${KDE_INSTALL_DATADIR}/${PROJECT_NAME}) | ||||||
| install(DIRECTORY ${SUBPROJECT_QUOTES} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME}) | install(DIRECTORY ${SUBPROJECT_QUOTES} DESTINATION ${KDE_INSTALL_DATADIR}/${PROJECT_NAME}) | ||||||
| install(DIRECTORY ${SUBPROJECT_SCRIPTS} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME}) | install(DIRECTORY ${SUBPROJECT_SCRIPTS} DESTINATION ${KDE_INSTALL_DATADIR}/${PROJECT_NAME}) | ||||||
| install(DIRECTORY ${SUBPROJECT_REQUESTS} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME}) | install(DIRECTORY ${SUBPROJECT_REQUESTS} DESTINATION ${KDE_INSTALL_DATADIR}/${PROJECT_NAME}) | ||||||
| install(DIRECTORY ${SUBPROJECT_UPGRADE} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME}) | install(DIRECTORY ${SUBPROJECT_UPGRADE} DESTINATION ${KDE_INSTALL_DATADIR}/${PROJECT_NAME}) | ||||||
| install(DIRECTORY ${SUBPROJECT_WEATHER} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME}) | install(DIRECTORY ${SUBPROJECT_WEATHER} DESTINATION ${KDE_INSTALL_DATADIR}/${PROJECT_NAME}) | ||||||
| install(FILES ${SUBPROJECT_INI} DESTINATION ${CONFIG_INSTALL_DIR}) | install(FILES ${SUBPROJECT_INI} DESTINATION /${KDE_INSTALL_CONFDIR}) | ||||||
| install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${SUBPROJECT_WEATHER_JSON} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME}/weather) | install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${SUBPROJECT_WEATHER_JSON} DESTINATION ${KDE_INSTALL_DATADIR}/${PROJECT_NAME}/weather) | ||||||
|  | |||||||
| @ -19,23 +19,29 @@ | |||||||
|  |  | ||||||
| #include <QDir> | #include <QDir> | ||||||
| #include <QLocalServer> | #include <QLocalServer> | ||||||
|  | #include <QRandomGenerator> | ||||||
| #include <QSettings> | #include <QSettings> | ||||||
| #include <QStandardPaths> | #include <QStandardPaths> | ||||||
| #include <QTime> |  | ||||||
|  |  | ||||||
| #include "abstractextitemaggregator.h" | #include "abstractextitemaggregator.h" | ||||||
| #include "qcronscheduler.h" | #include "qcronscheduler.h" | ||||||
|  |  | ||||||
|  |  | ||||||
| AbstractExtItem::AbstractExtItem(QWidget *_parent, const QString &_filePath) | AbstractExtItem::AbstractExtItem(QObject *_parent, const QString &_filePath) | ||||||
|     : QDialog(_parent) |     : QObject(_parent) | ||||||
|     , m_fileName(_filePath) |     , m_filePath(_filePath) | ||||||
| { | { | ||||||
|     qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; |     qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; | ||||||
|  |  | ||||||
|     qCDebug(LOG_LIB) << "Desktop name" << _filePath; |     qCDebug(LOG_LIB) << "Desktop name" << _filePath; | ||||||
|  |  | ||||||
|     m_name = m_fileName; |     m_name = m_filePath; | ||||||
|  |  | ||||||
|  |     m_scheduler = new QCronScheduler(this); | ||||||
|  |     connect(m_scheduler, &QCronScheduler::activated, this, &AbstractExtItem::requestDataUpdate); | ||||||
|  |  | ||||||
|  |     m_socket = new QLocalServer(this); | ||||||
|  |     connect(m_socket, &QLocalServer::newConnection, this, &AbstractExtItem::requestDataUpdate); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -43,12 +49,12 @@ AbstractExtItem::~AbstractExtItem() | |||||||
| { | { | ||||||
|     qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; |     qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; | ||||||
|  |  | ||||||
|     if (m_socket) { |     m_scheduler->stop(); | ||||||
|  |     m_scheduler->deleteLater(); | ||||||
|  |  | ||||||
|     m_socket->close(); |     m_socket->close(); | ||||||
|         m_socket->removeServer(socket()); |  | ||||||
|     m_socket->deleteLater(); |     m_socket->deleteLater(); | ||||||
| } | } | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| void AbstractExtItem::bumpApi(const int _newVer) | void AbstractExtItem::bumpApi(const int _newVer) | ||||||
| @ -57,8 +63,7 @@ void AbstractExtItem::bumpApi(const int _newVer) | |||||||
|  |  | ||||||
|     // update for current API |     // update for current API | ||||||
|     if ((apiVersion() > 0) && (apiVersion() < _newVer)) { |     if ((apiVersion() > 0) && (apiVersion() < _newVer)) { | ||||||
|         qCWarning(LOG_LIB) << "Bump API version from" << apiVersion() << "to" |         qCWarning(LOG_LIB) << "Bump API version from" << apiVersion() << "to" << _newVer; | ||||||
|                            << _newVer; |  | ||||||
|         setApiVersion(_newVer); |         setApiVersion(_newVer); | ||||||
|         writeConfiguration(); |         writeConfiguration(); | ||||||
|     } |     } | ||||||
| @ -96,18 +101,16 @@ void AbstractExtItem::startTimer() | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| QString AbstractExtItem::writtableConfig() const | QString AbstractExtItem::writableConfig() const | ||||||
| { | { | ||||||
|     QString path = m_fileName; |     auto path = m_filePath; | ||||||
|     QString name = QFileInfo(path).fileName(); |     auto name = fileName(); | ||||||
|     path.remove(path.count() - name.count() - 1, name.count() + 1); |     // extract subdirectory | ||||||
|     QString dir = QFileInfo(path).fileName(); |     path.remove(path.length() - name.length() - 1, name.length() + 1); | ||||||
|  |     auto dir = QFileInfo(path).fileName(); | ||||||
|  |  | ||||||
|     return QString("%1/awesomewidgets/%2/%3") |     return QString("%1/awesomewidgets/%2/%3") | ||||||
|         .arg(QStandardPaths::writableLocation( |         .arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation), dir, name); | ||||||
|             QStandardPaths::GenericDataLocation)) |  | ||||||
|         .arg(dir) |  | ||||||
|         .arg(name); |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -131,7 +134,13 @@ QString AbstractExtItem::cron() const | |||||||
|  |  | ||||||
| QString AbstractExtItem::fileName() const | QString AbstractExtItem::fileName() const | ||||||
| { | { | ||||||
|     return m_fileName; |     return QFileInfo(filePath()).fileName(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | QString AbstractExtItem::filePath() const | ||||||
|  | { | ||||||
|  |     return m_filePath; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -200,22 +209,14 @@ void AbstractExtItem::setComment(const QString &_comment) | |||||||
| void AbstractExtItem::setCron(const QString &_cron) | void AbstractExtItem::setCron(const QString &_cron) | ||||||
| { | { | ||||||
|     qCDebug(LOG_LIB) << "Cron string" << _cron; |     qCDebug(LOG_LIB) << "Cron string" << _cron; | ||||||
|     // deinit module first |  | ||||||
|     if (m_scheduler) { |  | ||||||
|         disconnect(m_scheduler, SIGNAL(activated()), this, |  | ||||||
|                    SIGNAL(requestDataUpdate())); |  | ||||||
|         delete m_scheduler; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     m_cron = _cron; |     m_cron = _cron; | ||||||
|     if (cron().isEmpty()) |     if (m_cron.isEmpty()) { // disable cron timer | ||||||
|         return; |         m_scheduler->stop(); | ||||||
|  |     } else { | ||||||
|     // init scheduler |         m_scheduler->parse(m_cron); | ||||||
|     m_scheduler = new QCronScheduler(this); |         m_scheduler->start(); | ||||||
|     m_scheduler->parse(cron()); |     } | ||||||
|     connect(m_scheduler, SIGNAL(activated()), this, |  | ||||||
|             SIGNAL(requestDataUpdate())); |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -240,13 +241,11 @@ void AbstractExtItem::setName(const QString &_name) | |||||||
| void AbstractExtItem::setNumber(int _number) | void AbstractExtItem::setNumber(int _number) | ||||||
| { | { | ||||||
|     qCDebug(LOG_LIB) << "Number" << _number; |     qCDebug(LOG_LIB) << "Number" << _number; | ||||||
|     bool generateNumber = (_number == -1); |     auto generateNumber = (_number == -1); | ||||||
|     if (generateNumber) { |     if (generateNumber) { | ||||||
|         _number = []() { |         _number = []() { | ||||||
|             qCWarning(LOG_LIB) << "Number is empty, generate new one"; |             qCWarning(LOG_LIB) << "Number is empty, generate new one"; | ||||||
|             // we suppose that currentTIme().msec() is always valid time |             auto n = QRandomGenerator::global()->bounded(1000); | ||||||
|             qsrand(static_cast<uint>(QTime::currentTime().msec())); |  | ||||||
|             int n = qrand() % 1000; |  | ||||||
|             qCInfo(LOG_LIB) << "Generated number is" << n; |             qCInfo(LOG_LIB) << "Generated number is" << n; | ||||||
|             return n; |             return n; | ||||||
|         }(); |         }(); | ||||||
| @ -261,42 +260,24 @@ void AbstractExtItem::setNumber(int _number) | |||||||
| void AbstractExtItem::setSocket(const QString &_socket) | void AbstractExtItem::setSocket(const QString &_socket) | ||||||
| { | { | ||||||
|     qCDebug(LOG_LIB) << "Socket" << _socket; |     qCDebug(LOG_LIB) << "Socket" << _socket; | ||||||
|     // remove old socket first |  | ||||||
|     deinitSocket(); |  | ||||||
|  |  | ||||||
|     m_socketFile = _socket; |     m_socketFile = _socket; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void AbstractExtItem::deinitSocket() |  | ||||||
| { |  | ||||||
|     if (!m_socket) |  | ||||||
|         return; |  | ||||||
|  |  | ||||||
|     m_socket->close(); |  | ||||||
|     m_socket->removeServer(socket()); |  | ||||||
|     delete m_socket; |  | ||||||
|     disconnect(m_socket, SIGNAL(newConnection()), this, |  | ||||||
|                SLOT(newConnectionReceived())); |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| void AbstractExtItem::initSocket() | void AbstractExtItem::initSocket() | ||||||
| { | { | ||||||
|     // remove old socket first |     // reload local socket | ||||||
|     deinitSocket(); |     m_socket->close(); | ||||||
|  |  | ||||||
|     m_socket = new QLocalServer(this); |     auto listening = m_socket->listen(m_socketFile); | ||||||
|     bool listening = m_socket->listen(socket()); |     qCInfo(LOG_LIB) << "Server listening on" << m_socketFile << listening; | ||||||
|     qCInfo(LOG_LIB) << "Server listening on" << socket() << listening; |  | ||||||
|     connect(m_socket, SIGNAL(newConnection()), this, |  | ||||||
|             SLOT(newConnectionReceived())); |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void AbstractExtItem::readConfiguration() | void AbstractExtItem::readConfiguration() | ||||||
| { | { | ||||||
|     QSettings settings(m_fileName, QSettings::IniFormat); |     QSettings settings(m_filePath, QSettings::IniFormat); | ||||||
|  |  | ||||||
|     settings.beginGroup("Desktop Entry"); |     settings.beginGroup("Desktop Entry"); | ||||||
|     setName(settings.value("Name", name()).toString()); |     setName(settings.value("Name", name()).toString()); | ||||||
| @ -313,8 +294,8 @@ void AbstractExtItem::readConfiguration() | |||||||
|  |  | ||||||
| bool AbstractExtItem::tryDelete() const | bool AbstractExtItem::tryDelete() const | ||||||
| { | { | ||||||
|     bool status = QFile::remove(m_fileName); |     auto status = QFile::remove(m_filePath); | ||||||
|     qCInfo(LOG_LIB) << "Remove file" << m_fileName << status; |     qCInfo(LOG_LIB) << "Remove file" << m_filePath << status; | ||||||
|  |  | ||||||
|     return status; |     return status; | ||||||
| } | } | ||||||
| @ -322,7 +303,7 @@ bool AbstractExtItem::tryDelete() const | |||||||
|  |  | ||||||
| void AbstractExtItem::writeConfiguration() const | void AbstractExtItem::writeConfiguration() const | ||||||
| { | { | ||||||
|     QSettings settings(writtableConfig(), QSettings::IniFormat); |     QSettings settings(writableConfig(), QSettings::IniFormat); | ||||||
|     qCInfo(LOG_LIB) << "Configuration file" << settings.fileName(); |     qCInfo(LOG_LIB) << "Configuration file" << settings.fileName(); | ||||||
|  |  | ||||||
|     settings.beginGroup("Desktop Entry"); |     settings.beginGroup("Desktop Entry"); | ||||||
| @ -339,9 +320,3 @@ void AbstractExtItem::writeConfiguration() const | |||||||
|  |  | ||||||
|     settings.sync(); |     settings.sync(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void AbstractExtItem::newConnectionReceived() |  | ||||||
| { |  | ||||||
|     emit(requestDataUpdate()); |  | ||||||
| } |  | ||||||
|  | |||||||
| @ -15,17 +15,16 @@ | |||||||
|  *   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 ABSTRACTEXTITEM_H | #pragma once | ||||||
| #define ABSTRACTEXTITEM_H |  | ||||||
|  |  | ||||||
| #include <QDialog> |  | ||||||
| #include <QVariant> | #include <QVariant> | ||||||
|  |  | ||||||
|  |  | ||||||
| class QCronScheduler; | class QCronScheduler; | ||||||
| class QLocalServer; | class QLocalServer; | ||||||
|  | class QWidget; | ||||||
|  |  | ||||||
| class AbstractExtItem : public QDialog | class AbstractExtItem : public QObject | ||||||
| { | { | ||||||
|     Q_OBJECT |     Q_OBJECT | ||||||
|     Q_PROPERTY(bool active READ isActive WRITE setActive) |     Q_PROPERTY(bool active READ isActive WRITE setActive) | ||||||
| @ -33,6 +32,7 @@ class AbstractExtItem : public QDialog | |||||||
|     Q_PROPERTY(QString comment READ comment WRITE setComment) |     Q_PROPERTY(QString comment READ comment WRITE setComment) | ||||||
|     Q_PROPERTY(QString cron READ cron WRITE setCron) |     Q_PROPERTY(QString cron READ cron WRITE setCron) | ||||||
|     Q_PROPERTY(QString fileName READ fileName) |     Q_PROPERTY(QString fileName READ fileName) | ||||||
|  |     Q_PROPERTY(QString filePath READ filePath) | ||||||
|     Q_PROPERTY(int interval READ interval WRITE setInterval) |     Q_PROPERTY(int interval READ interval WRITE setInterval) | ||||||
|     Q_PROPERTY(QString name READ name WRITE setName) |     Q_PROPERTY(QString name READ name WRITE setName) | ||||||
|     Q_PROPERTY(int number READ number WRITE setNumber) |     Q_PROPERTY(int number READ number WRITE setNumber) | ||||||
| @ -40,33 +40,32 @@ class AbstractExtItem : public QDialog | |||||||
|     Q_PROPERTY(QString uniq READ uniq) |     Q_PROPERTY(QString uniq READ uniq) | ||||||
|  |  | ||||||
| public: | public: | ||||||
|     explicit AbstractExtItem(QWidget *_parent = nullptr, |     explicit AbstractExtItem(QObject *_parent = nullptr, const QString &_filePath = ""); | ||||||
|                              const QString &_filePath = ""); |     ~AbstractExtItem() override; | ||||||
|     virtual ~AbstractExtItem(); |     virtual void bumpApi(int _newVer); | ||||||
|     virtual void bumpApi(const int _newVer); |     virtual AbstractExtItem *copy(const QString &_fileName, int _number) = 0; | ||||||
|     virtual AbstractExtItem *copy(const QString &_fileName, const int _number) |  | ||||||
|         = 0; |  | ||||||
|     virtual void copyDefaults(AbstractExtItem *_other) const; |     virtual void copyDefaults(AbstractExtItem *_other) const; | ||||||
|     virtual void startTimer(); |     virtual void startTimer(); | ||||||
|     QString writtableConfig() const; |     [[nodiscard]] QString writableConfig() const; | ||||||
|     // get methods |     // get methods | ||||||
|     int apiVersion() const; |     [[nodiscard]] int apiVersion() const; | ||||||
|     QString comment() const; |     [[nodiscard]] QString comment() const; | ||||||
|     QString cron() const; |     [[nodiscard]] QString cron() const; | ||||||
|     QString fileName() const; |     [[nodiscard]] QString fileName() const; | ||||||
|     int interval() const; |     [[nodiscard]] QString filePath() const; | ||||||
|     bool isActive() const; |     [[nodiscard]] int interval() const; | ||||||
|     QString name() const; |     [[nodiscard]] bool isActive() const; | ||||||
|     int number() const; |     [[nodiscard]] QString name() const; | ||||||
|     QString socket() const; |     [[nodiscard]] int number() const; | ||||||
|     QString tag(const QString &_type) const; |     [[nodiscard]] QString socket() const; | ||||||
|     virtual QString uniq() const = 0; |     [[nodiscard]] QString tag(const QString &_type) const; | ||||||
|  |     [[nodiscard]] virtual QString uniq() const = 0; | ||||||
|     // set methods |     // set methods | ||||||
|     void setApiVersion(const int _apiVersion); |     void setApiVersion(int _apiVersion); | ||||||
|     void setActive(const bool _state); |     void setActive(bool _state); | ||||||
|     void setComment(const QString &_comment); |     void setComment(const QString &_comment); | ||||||
|     void setCron(const QString &_cron); |     void setCron(const QString &_cron); | ||||||
|     void setInterval(const int _interval); |     void setInterval(int _interval); | ||||||
|     void setName(const QString &_name); |     void setName(const QString &_name); | ||||||
|     void setNumber(int _number); |     void setNumber(int _number); | ||||||
|     void setSocket(const QString &_socket); |     void setSocket(const QString &_socket); | ||||||
| @ -76,22 +75,19 @@ signals: | |||||||
|     void requestDataUpdate(); |     void requestDataUpdate(); | ||||||
|  |  | ||||||
| public slots: | public slots: | ||||||
|     virtual void deinitSocket(); |  | ||||||
|     virtual void initSocket(); |     virtual void initSocket(); | ||||||
|     virtual void readConfiguration(); |     virtual void readConfiguration(); | ||||||
|     virtual QVariantHash run() = 0; |     virtual QVariantHash run() = 0; | ||||||
|     virtual int showConfiguration(const QVariant &_args) = 0; |     virtual int showConfiguration(QWidget *_parent, const QVariant &_args) = 0; | ||||||
|     virtual bool tryDelete() const; |     [[nodiscard]] virtual bool tryDelete() const; | ||||||
|     virtual void writeConfiguration() const; |     virtual void writeConfiguration() const; | ||||||
|  |  | ||||||
| private slots: |  | ||||||
|     void newConnectionReceived(); |  | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     QCronScheduler *m_scheduler = nullptr; |     QCronScheduler *m_scheduler = nullptr; | ||||||
|     QString m_fileName = "/dev/null"; |     QString m_filePath = ""; | ||||||
|     int m_times = 0; |     int m_times = 0; | ||||||
|     virtual void translate() = 0; |     // FIXME find a better way to do it | ||||||
|  |     virtual void translate(void *_ui) = 0; | ||||||
|     // properties |     // properties | ||||||
|     int m_apiVersion = 0; |     int m_apiVersion = 0; | ||||||
|     bool m_active = true; |     bool m_active = true; | ||||||
| @ -103,6 +99,3 @@ private: | |||||||
|     QLocalServer *m_socket = nullptr; |     QLocalServer *m_socket = nullptr; | ||||||
|     QString m_socketFile = ""; |     QString m_socketFile = ""; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif /* ABSTRACTEXTITEM_H */ |  | ||||||
|  | |||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user
	