Compare commits

..

174 Commits

Author SHA1 Message Date
1a7530a847 commit metadata files too 2017-06-02 17:46:37 +03:00
1702045550 update changelog 2017-06-02 17:38:27 +03:00
fe88c72498 release 3.3.2 2017-06-02 17:35:35 +03:00
737759d03f Bug fixing
* fix bug with invalid applet and configuration load with newest qt
* fix bug with invalid DP configuration
* fix bug with invalid HTML tags operations
2017-06-02 17:34:27 +03:00
934e30819c rename deadbeef defaults 2017-05-21 23:07:12 +03:00
a4d3a09f26 add patch for mpris 2017-05-17 17:47:34 +03:00
acc4df92bc fix invalid mpris parser
In some cases it causes the error like:

Error message "Интерфейс «(null)» для пути /org/mpris/MediaPlayer2 объекта не найден"

(for example deadbeef was affected). Suggested patch should fix this
issue and seems to be working with at least deadbeef and qmmp mpris
engines.
2017-05-17 17:43:18 +03:00
0a723aef82 release 3.3.1
* bump api versions
* update changelog
2017-05-15 20:15:05 +03:00
271b8d55cf release 3.3.0 2017-05-15 17:06:03 +03:00
1afc33abef qml UI fixes 2017-05-15 17:05:22 +03:00
6b8244f3c4 fix comparison 2017-05-10 15:26:25 +03:00
ff2032cca1 update patches
Since now Qt5.4 version support is officially dropped. It means that
widgets now require

ubuntu>=16.04
debian>8
opensuse>=42.1
2017-05-10 15:01:01 +03:00
05aafc43e7 translation update 2017-05-05 18:20:50 +03:00
d0c96ce829 massive refactoring 2017-05-05 17:55:52 +03:00
6e62ceaac7 massive changes inside
* use pass by ref instead of by value if possible
* use reference in interation over collections
* fix no tag inserting
2017-05-04 15:00:50 +03:00
6e99e262d4 add configuration for cron 2017-05-03 00:27:09 +03:00
1b4d1d6944 implement qcronscheduler, tests update 2017-04-28 01:47:42 +03:00
8be4cc6e82 Add tests and UI fields for #118 2017-04-20 00:21:34 +03:00
99c750fd0b fix build again 2017-04-20 03:31:00 +03:00
fca8019972 fix ci build (3) 2017-03-08 16:56:20 +03:00
8d3dd0ed96 one more fix for travis, drop build directory from search 2017-03-08 06:55:00 +03:00
4974948151 add new deps to travis -_- 2017-03-08 06:44:02 +03:00
9e50ade6a5 add cppchec and clangformat to travis build 2017-03-08 06:33:55 +03:00
801eea9a8b add flag to cmake build 2017-03-08 06:22:58 +03:00
1841fb5ed2 extquotes test improvement 2017-02-15 00:43:21 +03:00
9c8dbdcb41 fix kwin definition again 2017-02-14 05:11:00 +03:00
53afc07457 tests cleanup 2017-02-14 04:47:24 +03:00
1caecb427b fix test library building 2017-02-14 04:35:24 +03:00
ea10d526d5 fix test library building 2017-02-14 04:32:17 +03:00
b818586a23 another iteration with fix travis tests 2017-02-14 04:26:59 +03:00
a30e6ba21b fix stupid errors (2) 2017-02-14 04:01:33 +03:00
fe38d9133b fix stupid errors 2017-02-14 03:53:33 +03:00
38c5589c10 one more iteration to try to fix tests on travis 2017-02-14 03:48:11 +03:00
ce09ab753b add temporary || true to tests to get output 2017-02-13 21:12:36 +03:00
10f556e41b Try to fix test for automatic run with travis
* Additionally calculate valid pressure
2017-02-13 21:04:03 +03:00
d097e154ff try to use virtual fb x-server to run tests 2017-02-12 20:58:14 +03:00
8979ddf52b add submodule init 2017-02-12 20:26:09 +03:00
d3dd9b3390 add python to makedeps array 2017-02-12 20:22:31 +03:00
5615fd3ff9 more correct using of arch script (2) 2017-02-12 20:19:51 +03:00
cbb8415a95 more correct using of arch script 2017-02-12 20:16:03 +03:00
8dcdae9611 another iteration with travis ci 2017-02-12 20:11:11 +03:00
bfdaadfc8b add socket activation for extensions (#118)
Option `X-AW-Socket` is used. Any message received by this socket will
trigger extension update. If the option is set, `X-AW-Interval` will be
ignored
2017-02-06 12:16:16 +03:00
9543122816 cosmetic changes caused by site moving 2017-02-02 23:12:19 +03:00
6a24fc3f63 more pretty about text
Use generic text generation for all plasmoids
2016-11-06 22:12:03 +03:00
73d1b0a69f bump formatter api version 2016-11-05 00:01:50 +03:00
06f4882a2d add network request source 2016-11-04 01:12:25 +03:00
7565ea2e82 add test case for jsonformatter
Change array indexes from "[num]" to ".num." in path
2016-11-03 00:23:10 +03:00
004a97800c add json formatter 2016-11-02 23:23:30 +03:00
8dfb6b609f better tooltip class 2016-11-01 00:02:13 +03:00
f893b34e19 run clangformat 2016-10-31 08:12:15 +03:00
a189e1af38 use default widget configuration to configure telemetry 2016-10-30 09:04:08 +03:00
0332c59daf add copyright string 2016-10-29 12:21:13 +03:00
26b375254a add telemetry configuration 2016-10-28 23:21:37 +03:00
89cb4b74fd add background color to textarea 2016-10-27 00:00:18 +03:00
ea1d5fca86 drop C-like fabs function 2016-10-26 01:02:17 +03:00
c3c46ff1b1 improve tag completion
allow to select item from tooltip by mouse and insert it to text edtior
2016-10-25 10:23:05 +03:00
87406f70c4 add initial support of tag suggestion 2016-10-24 08:12:14 +03:00
d520f55afc add test for dbus connection 2016-10-23 01:32:07 +03:00
77a94aa0c1 add methods to dbus interface 2016-10-22 00:43:16 +03:00
c103986f37 add dbus session prototype 2016-10-21 08:10:29 +03:00
7568ae2a3b move textarea to own class as well 2016-10-20 09:23:18 +03:00
2ea5824fd7 add test case for new method 2016-10-19 00:01:09 +03:00
47439ef151 update desktop panel configuration to new one 2016-10-18 00:12:25 +03:00
63d19f038c move info label to own class, move dialog to own class as well 2016-10-17 23:12:03 +03:00
9d5864aa62 move extensions to own bar 2016-10-16 12:23:23 +03:00
d74cd645fd qml improvements
* move functions to plugin part
* move model to general.qml
2016-10-15 00:01:10 +03:00
80767c9dbf update qmldir to new ui element 2016-10-14 01:10:10 +03:00
57ad8a0a2b add tag selector row 2016-10-13 00:12:46 +03:00
eea636c6f1 add html bar 2016-10-12 10:23:20 +03:00
65141ff528 add comment lines to qmldir.in file 2016-10-11 00:00:07 +03:00
f882756fad update desktoppanel qml part 2016-10-10 20:43:07 +03:00
335fbb137e move general singleton to shared part, update part of desktop-panel ui 2016-10-09 21:23:27 +03:00
fcb698e7fc use shared About tab 2016-10-08 00:54:29 +03:00
f1b5208bb2 use shared qml files 2016-10-07 22:13:41 +03:00
c9f5be6a60 use model list defined in general.qml for font configuration 2016-10-03 23:54:07 +03:00
f7094ca187 add font dialog, some color dialog improvements 2016-10-02 01:43:12 +03:00
a326ebdabf replace buttons in dataengine page 2016-10-01 12:42:05 +03:00
3ee1d4c30e Add import and export dialogs 2016-09-30 10:22:10 +03:00
31c129163b Create dialogs for button and color button 2016-09-29 10:24:03 +03:00
80c994bce0 massive qml controls replacement (#114) 2016-09-28 13:50:57 +03:00
8aa6d0c626 change opensuse url 2016-09-27 12:17:13 +03:00
33623fe75e use own control for checkbox 2016-09-25 12:41:22 +03:00
ecf4be8d9c Add support of text styling for desktop panel 2016-09-24 15:24:24 +03:00
7f6a2d8100 Add ability to change text style inside general widget (see #112) 2016-09-23 01:12:34 +03:00
086870e9c2 drop custom keys engine
With current implementation it has no sense to add this support. It
requies some architectures changes inside.
2016-09-22 02:34:20 +03:00
1c52cf72be initial import of custom keys support (#101)
It will use the configuration file `$AWHOME/custom.ini`, group `[Custom]`. One
custom key per string, key is custom key, value is any of available
standard data.

Formatters will be defined by using standard way.
2016-09-21 01:02:21 +03:00
8e598bbd13 allow editable selectors 2016-09-20 02:42:10 +03:00
877f58784b small refactoring
* change `writeFormatters` method to more intuitive
`removeUnusedFormatters`
* use class property as filename
2016-09-19 23:49:11 +03:00
ee6cf60aa4 change constants from #define to const var val
Update contributing.md accordingly
2016-09-18 00:59:23 +03:00
6449465be2 add test for telemetryhandler class 2016-09-17 23:19:06 +03:00
3403d1de50 add local history suggestion to configuration window 2016-09-16 16:03:11 +03:00
f9ddf690c7 drop semicolon from qml files, update CONTRIBUTING guide accordingly 2016-09-15 07:26:00 +03:00
87652eb774 add ability to upload telemetry to a server 2016-09-14 11:32:40 +03:00
a9924a1432 fix conditional error 2016-09-08 19:36:26 +03:00
c5cb5cb359 initial import of telemetry handler 2016-09-07 10:23:05 +03:00
65c8f552de run clangformat 2016-09-05 17:04:16 +03:00
486267256c Add patch for bug reporting 2016-09-01 15:56:56 +03:00
94e87ee570 Add legacy message 2016-08-31 20:49:31 +03:00
b17aeb88e3 drop some legacy code 2016-08-29 15:02:34 +03:00
7d8036b0e1 update russian translation 2016-08-28 16:34:13 +03:00
4d1c05d737 translation update 2016-08-27 02:54:59 +03:00
95ede170d9 use more obvious way to sort keys
Some bugs in past were related to invalid keys sorting. Automatic keys
sorting should prevent such bugs in the future
2016-08-26 23:01:16 +03:00
80d926290c finally implement bug reporting (#104) 2016-08-25 13:33:08 +03:00
5b9984d950 add frontend for bug reporting (#104) 2016-08-23 12:30:11 +03:00
e5b1102abf some changes inside bug reportin backend 2016-08-22 19:10:37 +03:00
f3f9239984 more correct error checking 2016-08-21 19:24:16 +03:00
18c993c0d5 add github issue reporing backend (#104) 2016-08-20 12:14:22 +03:00
a9e3e3f087 Possible one more performance increasing
Lets try to use own QueuedConnection type instead of default
AutoConnection. To implement it we need to disconnect all default slots
and reconnect them with specified connection type
2016-08-18 20:16:05 +03:00
8f6d9e7ab5 release 3.2.1 2016-08-11 15:05:53 +03:00
22dcebe647 update uk translation 2016-08-10 14:08:48 +03:00
6e087f418f update es translation 2016-08-07 03:19:02 +03:00
b76cbb8ce3 update nl translation
fix invalid string in DateTime formatter
2016-08-04 14:29:39 +03:00
24ad32b6ca fix missing Api version for formatters 2016-08-02 20:50:16 +03:00
51b7d3aa09 fix invalid float formatter saving
fix library formatters too
2016-08-01 19:46:28 +03:00
3674fba669 bump forgotten cmakelists 2016-07-31 13:49:11 +03:00
f1116d1f83 add some default formatters 2016-07-30 17:41:33 +03:00
bcf757477b use constat string to request mpd data 2016-07-29 13:50:03 +03:00
1864dc71d5 use sockets from MPD instead of running curl 2016-07-28 15:34:52 +03:00
90c33ab24d use m_ prefix for all internal variables, update CONTRIBUTING.md
accordingly
2016-07-27 20:40:17 +03:00
052d8a034c add formatters reinit (fix #102) 2016-07-26 15:11:52 +03:00
064cd7e44f add ability do not translate strings in DateTime formatter
option X-AW-Translate, ApiVer 2
2016-07-23 19:49:34 +03:00
9e59b22c32 add formatters to configuration functions 2016-07-21 12:20:55 +03:00
89f6661fa5 update Dutch translation 2016-07-16 22:23:20 +03:00
7836fbf77f add macro to combobox 2016-07-14 13:23:49 +03:00
d90d9e2c6f bump desktop versions in the repo 2016-07-12 12:25:29 +03:00
927e93b7fc Release 3.2.0 patches update 2016-07-10 00:09:08 +03:00
fbf89f61b4 Release 3.2.0 2016-07-09 17:01:56 +03:00
4adf457ada translation update 2016-07-08 13:51:29 +03:00
0d4211b2c4 add string formatter 2016-07-07 13:36:30 +03:00
085eec7a3d some fixes inside extensions
* do not use private variables if there are special methods
* change macro call from `aw_*` to `aw_macro_*`
* add forgotten configuration reading/writting for list formatter
2016-07-06 14:23:01 +03:00
baf5085506 prerelease translation update 2016-07-04 16:24:12 +03:00
17a0c61b4a add list formatter 2016-07-03 04:10:04 +03:00
3497922928 function improvements
* use $ for args inside macros
* allow to use screened brackets inside functions
2016-07-02 04:07:43 +03:00
2f88c7ae60 add macros support
Macros should be declared as `aw_macro<name,arg1,arg2,...>{{macro body}}` and then
they may be used as `aw_name<arg1,arg2,...>{{}}`. It just puts `macro
body` to pattern and replaces arguments to provided ones according to
macro call. E.g.:
```
$aw_macro<test,phrase>{{phrase}}$aw_test<hello world>{{}}
```
will transform into
```
hello world
```
2016-07-01 02:21:48 +03:00
8e8ac2f3c7 some refactoring
* fix undefinded behaviour
* drop dbus timout, use generic timeout insead
* drop load source to own cmake key
* update contributing.md
2016-06-30 01:59:06 +03:00
5cd5272f10 add tests for awkeys 2016-06-28 11:19:33 +03:00
bee8e2f180 add more tests for confighelper 2016-06-27 16:58:45 +03:00
bf16e72e1e add configuration tests 2016-06-26 01:52:15 +03:00
faf259e339 add tests for pattern functions some simplifications 2016-06-25 03:11:21 +03:00
f6a6704fd2 add test for awupdatehelper and template for awkeycache 2016-06-23 10:56:55 +03:00
4a0da3f978 add dpplugin tests 2016-06-22 01:04:57 +03:00
71ae832bcd add last sources test for playersource 2016-06-18 05:08:14 +03:00
0f1763cb81 add one more workaround for possible freezes (#96)
First of all it seems that freezes were caused by stuck dbus calls. I've
enabled dbus call timeout (build-configured, default to 3000 msec). And
moreover I've added one more thread lock for dbus calls.
2016-06-17 15:19:00 +03:00
b20a96d32f add fix for possible race condition (#96) 2016-06-16 15:17:58 +03:00
75d101cc8b add tests for dekstop, network and processes sources 2016-06-15 15:10:41 +03:00
5d9d551afe some fixes inside sources 2016-06-13 05:15:08 +03:00
78b7a87c29 add tests for battery and gpuload sources
+ some tests refactoring
2016-06-09 12:45:21 +03:00
bc2071a493 add gputemperature tests 2016-06-08 12:33:55 +03:00
5a0541d06d Add test for hddsource, move sources to own library 2016-06-07 14:16:48 +03:00
18789f78b3 add small test for aggregators 2016-06-05 03:57:08 +03:00
ab01c9fa08 Some test improvements 2016-06-03 01:37:23 +03:00
620c4bd1e3 Return to owm weather provider
Since yahoo support already exists, so I've added new option
X-AW-Provider (apiver 3). Added tests for these cases
2016-06-02 11:09:02 +03:00
4337379177 add tests for abstract formatter 2016-06-01 10:55:51 +03:00
69c09d9ff8 more tests for formatters 2016-05-30 01:47:06 +03:00
cae9e0d2e3 add test library for random values generation 2016-05-29 03:33:41 +03:00
7b154af1b3 add test cases for float and no formatters 2016-05-29 02:45:57 +03:00
fd3ed61191 add test for abstractextitem 2016-05-28 00:30:02 +03:00
2a257de1e6 add tests for extweather 2016-05-27 15:53:12 +03:00
6f09737f0f add test for extquotes
* change url generation in extquotes
* fix bug with missing derivate values
2016-05-26 16:10:23 +03:00
b73fb19409 add tests for extupgrade 2016-05-25 12:35:34 +03:00
c57a92b687 more consistent tests for extscripts
(fix missed filters copying found by tests btw)
2016-05-24 11:53:00 +03:00
72f0d4587b more correct test class for extscripts 2016-05-23 11:04:12 +03:00
ea7c15d865 initial commit with test modules 2016-05-22 15:14:56 +03:00
2dccc92933 fix error in extscript and extupgrade with invalid updates interval if X-AW-Interval=1 2016-05-21 14:36:24 +03:00
e71da9bdfb use overloaded constructors to create tests 2016-05-19 16:28:19 +03:00
f717c984b7 add formatters configuration to ui 2016-05-18 12:46:50 +03:00
906ad56c46 Rename some properties in GI.
Actually properties height and width are QDialog ones, just rename them
to ones with `item` prefix. No configuration keys were changed.

Update translations as well.
2016-05-17 14:22:12 +03:00
301a908aed add formatter configuration to ui 2016-05-15 01:18:18 +03:00
6bd7788aa9 More consistent formatters 2016-05-14 04:08:22 +03:00
51c7299ad0 changes in Extensions ABI
* rewrite aggregator to normal qt ui
* use X-AW prefix for formatters options
* fix logging
* use nullptr in headers
2016-05-13 13:23:25 +03:00
326c65528d rewrite formatters to ext classes 2016-05-12 20:51:21 +03:00
14aab3b758 rewrite extensions to new model 2016-05-11 14:02:15 +03:00
7c37134aab rewrite formatters according to rfc #91 2016-05-10 02:16:24 +03:00
734cbe2f4c upload vertical alignment patch, fix code (#94) 2016-05-09 04:07:58 +03:00
306 changed files with 21829 additions and 9846 deletions

28
.travis.yml Normal file
View File

@ -0,0 +1,28 @@
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"

View File

@ -1,3 +1,49 @@
Ver.3.3.2:
- fix bug with invalid DP colour configuration
- fix bug with invalid HTML tags operation
* update to newest Qt and plasma
Ver.3.3.1:
+ add ability to direct issue report (#104)
+ add key completion (#105)
+ add ability to load historical configuration (#106)
+ add ability to upload configuration to remote server (#106)
+ add stylish (#112)
+ add DBus intergration (#115)
+ add cron-like extenstion triggers (`X-AW-Socket` option) (#117)
+ add ability to trigger extensions by calling socket (`X-AW-Schedule` option) (#118)
+ add source for network requests
+ add Json formatter
- drop patches provided support for Qt 5.4
* use custom signal slot connection for dataengine (`BUILD_FUTURE` flag required)
* update UI
* refactoring
Ver.3.2.1:
+ add X-AW-Translate option to DateTime formatter
+ add formatters to configuration export and import
+ add macro fuction to selector
+ add default formatters
- add translation reinit (fix #102)
- fix invalid float formatter saving
- fix missing ApiVersion for formatters
* use sockets for MPD data
* translation update
Ver.3.2.0:
+ custom formatters (#91)
+ add backend tests (#95)
+ add OWM weather provider for ExtWeather. It can be switched by using X-AW-Provider (ApiVer 3)
+ add DBus timeout for calls (#96)
+ add macros support (`$aw_macro` and `$aw_macro_*` for calls)
- fix vertical alignment (#94)
- fix bug with invalid updates on `X-AW-Interval=1` for ExtScript and ExtUpgrade
- fix bug with missing derivate vaules in ExtQuotes
- fix possible plasma crash (#96)
- fix possible undefined behaviour if no extensions was found by name
* split dataengine sources to own library
* allow to use screened double brakets inside functions
Ver.3.1.2: Ver.3.1.2:
+ add standalone widget configuration example + add standalone widget configuration example
+ new tag tstime + new tag tstime

View File

@ -6,8 +6,8 @@ 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.
* It is highly recommended to name private variables with `m_` prefix (`m_foo`). * Any private variable should start with `m_` prefix (`m_foo`). The only one
There is no exceptions for properties. 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. * If some method is called only once, it is recommended to use lambda functions.
Exception is `Q_INVOKABLE` methods. Exception is `Q_INVOKABLE` methods.
@ -37,24 +37,17 @@ 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++11**. * 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 * C-like casts, use `const_cast`, `static_cast`, `dymanic_Cast` instead. Using
of `reinterpret_cast` is not recommended. It is highly recommended to use of `reinterpret_cast` is not recommended. It is highly recommended to use
`dynamic_cast` with the exception catching. It is also possible to use `dynamic_cast` with the exception catching. It is also possible to use
`qvariant_cast` if required. Exception is class constructors, e.g.: `qvariant_cast` if required.
```
char c = 'c';
std::string s = "string";
qDebug() << QString("some string") << QChar(c) << QString(s);
```
* C-like `NULL`, use `nullptr` instead. * C-like `NULL`, use `nullptr` instead.
* It is highly recommended to avoid implicit casts. * C-like constant definition, use `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.
@ -84,6 +77,8 @@ for more details. To avoid manual labor there is automatic cmake target named
* '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 assign 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.
* Any method argument including class constructors should start with `_`.
Comments Comments
-------- --------
@ -169,8 +164,7 @@ Testing
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`.
* It is recommended to create addition test if possible. * Additional test functions should be declated and used only inside `BUILD_TESTING`
* Addition test functions should be declated and used only inside `BUILD_TESTING`
definition. definition.
Tools Tools
@ -201,9 +195,9 @@ Tools
* Recommended class constructor for QObject based classes: * Recommended class constructor for QObject based classes:
``` ```
FooClass::FooClass(QObject *parent, const QVariant var) FooClass::FooClass(QObject *_parent, const QVariant _var)
: QObject(parent) : QObject(_parent)
, m_var(var) , m_var(_var)
{ {
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
// some code below if any // some code below if any

View File

@ -2,7 +2,7 @@
pkgname=plasma5-applet-awesome-widgets pkgname=plasma5-applet-awesome-widgets
_pkgname=awesome-widgets _pkgname=awesome-widgets
pkgver=3.1.2 pkgver=3.3.2
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=('i686' 'x86_64')
@ -17,7 +17,7 @@ optdepends=("catalyst: 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/V.${pkgver}/${_pkgname}-${pkgver}-src.tar.xz)
install=${pkgname}.install install=${pkgname}.install
md5sums=('99514bf6d1a5ca8660dd0210ee58af28') md5sums=('490c62c8085e532f9428f7534eff5ddd')
backup=('etc/xdg/plasma-dataengine-extsysmon.conf') backup=('etc/xdg/plasma-dataengine-extsysmon.conf')
prepare() { prepare() {

View File

@ -0,0 +1,25 @@
diff --git a/sources/extsysmonsources/playersource.cpp b/sources/extsysmonsources/playersource.cpp
index b8a0ec1..17d90bc 100644
--- a/sources/extsysmonsources/playersource.cpp
+++ b/sources/extsysmonsources/playersource.cpp
@@ -73,8 +73,10 @@ QString PlayerSource::getAutoMpris() const
{
QDBusMessage listServices = QDBusConnection::sessionBus().interface()->call(
QDBus::BlockWithGui, "ListNames");
- if (listServices.arguments().isEmpty())
+ if (listServices.arguments().isEmpty()) {
+ qCWarning(LOG_ESS) << "Could not find any DBus service";
return "";
+ }
QStringList arguments = listServices.arguments().first().toStringList();
for (auto &arg : arguments) {
@@ -353,7 +355,7 @@ QVariantHash PlayerSource::getPlayerMprisInfo(const QString &_mpris) const
= QVariantList({"org.mpris.MediaPlayer2.Player", "Metadata"});
QDBusMessage request = QDBusMessage::createMethodCall(
QString("org.mpris.MediaPlayer2.%1").arg(_mpris),
- "/org/mpris/MediaPlayer2", "", "Get");
+ "/org/mpris/MediaPlayer2", "org.freedesktop.DBus.Properties", "Get");
request.setArguments(args);
QDBusMessage response
= bus.call(request, QDBus::BlockWithGui, REQUEST_TIMEOUT);

View File

@ -1,399 +0,0 @@
diff --git a/sources/awesome-widget/package/contents/ui/advanced.qml b/sources/awesome-widget/package/contents/ui/advanced.qml
index 01bcd58..1ec7ba6 100644
--- a/sources/awesome-widget/package/contents/ui/advanced.qml
+++ b/sources/awesome-widget/package/contents/ui/advanced.qml
@@ -17,7 +17,6 @@
import QtQuick 2.0
import QtQuick.Controls 1.3 as QtControls
-import QtQuick.Dialogs 1.2 as QtDialogs
import org.kde.plasma.private.awesomewidget 1.0
@@ -372,32 +371,7 @@ Item {
QtControls.Button {
width: parent.width * 3 / 5
text: i18n("Export configuration")
- onClicked: saveConfigAs.open()
- }
-
- QtDialogs.FileDialog {
- id: saveConfigAs
- selectExisting: false
- title: i18n("Export")
- folder: awConfig.configurationDirectory()
- onAccepted: {
- var status = awConfig.exportConfiguration(
- plasmoid.configuration,
- saveConfigAs.fileUrl.toString().replace("file://", ""))
- if (status) {
- messageDialog.title = i18n("Success")
- messageDialog.text = i18n("Please note that binary files were not copied")
- } else {
- messageDialog.title = i18n("Ooops...")
- messageDialog.text = i18n("Could not save configuration file")
- }
- messageDialog.open()
- }
- }
-
- QtDialogs.MessageDialog {
- id: messageDialog
- standardButtons: QtDialogs.StandardButton.Ok
+ onClicked: awConfig.exportConfiguration(plasmoid.configuration)
}
}
@@ -410,42 +385,9 @@ Item {
QtControls.Button {
width: parent.width * 3 / 5
text: i18n("Import configuration")
- onClicked: openConfig.open()
- }
-
- QtDialogs.FileDialog {
- id: openConfig
- title: i18n("Import")
- folder: awConfig.configurationDirectory()
- onAccepted: importSelection.open()
- }
-
- QtDialogs.Dialog {
- id: importSelection
-
- Column {
- QtControls.CheckBox {
- id: importPlasmoid
- text: i18n("Import plasmoid settings")
- }
-
- QtControls.CheckBox {
- id: importExtensions
- text: i18n("Import extensions")
- }
-
- QtControls.CheckBox {
- id: importAdds
- text: i18n("Import additional files")
- }
- }
-
- onAccepted: {
+ onClicked: {
if (debug) console.debug()
- var importConfig = awConfig.importConfiguration(
- openConfig.fileUrl.toString().replace("file://", ""),
- importPlasmoid.checked, importExtensions.checked,
- importAdds.checked)
+ var importConfig = awConfig.importConfiguration()
for (var key in importConfig)
plasmoid.configuration[key] = importConfig[key]
}
diff --git a/sources/awesome-widget/package/contents/ui/main.qml b/sources/awesome-widget/package/contents/ui/main.qml
index 23e9690..ec83b91 100644
--- a/sources/awesome-widget/package/contents/ui/main.qml
+++ b/sources/awesome-widget/package/contents/ui/main.qml
@@ -17,7 +17,6 @@
import QtQuick 2.4
import QtQuick.Controls 1.3 as QtControls
-import QtQuick.Dialogs 1.2 as QtDialogs
import QtQuick.Layouts 1.1
import org.kde.plasma.plasmoid 2.0
import org.kde.plasma.core 2.0 as PlasmaCore
@@ -110,27 +109,6 @@ Item {
}
}
- QtDialogs.Dialog {
- id: tagSelector
- title: i18n("Select tag")
-
- QtControls.ComboBox {
- id: tagSelectorBox
- width: parent.width
- editable: true
- }
-
- onAccepted: {
- var tag = tagSelectorBox.editText
- var message = i18n("Tag: %1", tag)
- message += "<br>"
- message += i18n("Value: %1", awKeys.valueByKey(tag))
- message += "<br>"
- message += i18n("Info: %1", awKeys.infoByKey(tag))
- awActions.sendNotification("tag", message)
- }
- }
-
Component.onCompleted: {
if (debug) console.debug()
@@ -216,7 +194,12 @@ Item {
function action_requestKey() {
if (debug) console.debug()
- tagSelectorBox.model = awKeys.dictKeys(true)
- return tagSelector.open()
+ var tag = awKeys.graphicalKey()
+ var message = i18n("Tag: %1", tag)
+ message += "<br>"
+ message += i18n("Value: %1", awKeys.valueByKey(tag))
+ message += "<br>"
+ message += i18n("Info: %1", awKeys.infoByKey(tag))
+ awActions.sendNotification("tag", message)
}
}
diff --git a/sources/awesome-widget/plugin/awconfighelper.cpp b/sources/awesome-widget/plugin/awconfighelper.cpp
index 6263b30..5f61d2a 100644
--- a/sources/awesome-widget/plugin/awconfighelper.cpp
+++ b/sources/awesome-widget/plugin/awconfighelper.cpp
@@ -19,10 +19,15 @@
#include <KI18n/KLocalizedString>
+#include <QCheckBox>
+#include <QDialogButtonBox>
#include <QDir>
+#include <QFileDialog>
+#include <QMessageBox>
#include <QQmlPropertyMap>
#include <QSettings>
#include <QTextCodec>
+#include <QVBoxLayout>
#include "awdebug.h"
@@ -50,11 +55,13 @@ bool AWConfigHelper::dropCache() const
}
-bool AWConfigHelper::exportConfiguration(QObject *nativeConfig,
- const QString fileName) const
+void AWConfigHelper::exportConfiguration(QObject *nativeConfig) const
{
- qCDebug(LOG_AW) << "Selected filename" << fileName;
-
+ // get file path and init settings object
+ QString fileName = QFileDialog::getSaveFileName(nullptr, i18n("Export"));
+ if (fileName.isEmpty())
+ return;
+ qCInfo(LOG_AW) << "Selected filename" << fileName;
QSettings settings(fileName, QSettings::IniFormat);
// plasmoid configuration
@@ -96,22 +103,33 @@ bool AWConfigHelper::exportConfiguration(QObject *nativeConfig,
// sync settings
settings.sync();
// show additional message
- return settings.status() == QSettings::NoError;
+ switch (settings.status()) {
+ case QSettings::NoError:
+ QMessageBox::information(
+ nullptr, i18n("Success"),
+ i18n("Please note that binary files were not copied"));
+ break;
+ default:
+ QMessageBox::critical(nullptr, i18n("Ooops..."),
+ i18n("Could not save configuration file"));
+ break;
+ }
}
-QVariantMap AWConfigHelper::importConfiguration(const QString fileName,
- const bool importPlasmoid,
- const bool importExtensions,
- const bool importAdds) const
+QVariantMap AWConfigHelper::importConfiguration() const
{
- qCDebug(LOG_AW) << "Selected filename" << fileName;
-
QVariantMap configuration;
+ // get file path and init settings object
+ QString fileName = QFileDialog::getOpenFileName(nullptr, i18n("Import"));
+ if (fileName.isEmpty())
+ return configuration;
+ qCInfo(LOG_AW) << "Selected filename" << fileName;
QSettings settings(fileName, QSettings::IniFormat);
+ QHash<QString, bool> selection = selectImport();
// extensions
- if (importExtensions) {
+ if (selection[QString("extensions")]) {
for (auto item : m_dirs) {
settings.beginGroup(item);
for (auto it : settings.childGroups())
@@ -121,7 +139,7 @@ QVariantMap AWConfigHelper::importConfiguration(const QString fileName,
}
// additional files
- if (importAdds) {
+ if (selection[QString("adds")]) {
settings.beginGroup(QString("json"));
// script filters
writeFile(settings, QString("filters"),
@@ -135,7 +153,7 @@ QVariantMap AWConfigHelper::importConfiguration(const QString fileName,
}
// plasmoid configuration
- if (importPlasmoid) {
+ if (selection[QString("plasmoid")]) {
settings.beginGroup(QString("plasmoid"));
for (auto key : settings.childKeys())
configuration[key] = settings.value(key);
@@ -261,6 +279,50 @@ void AWConfigHelper::readFile(QSettings &settings, const QString key,
}
+QHash<QString, bool> AWConfigHelper::selectImport() const
+{
+ QDialog *dialog = new QDialog(nullptr);
+ QCheckBox *importPlasmoidSettings
+ = new QCheckBox(i18n("Import plasmoid settings"), dialog);
+ importPlasmoidSettings->setChecked(true);
+ QCheckBox *importExtensionsSettings
+ = new QCheckBox(i18n("Import extensions"), dialog);
+ importExtensionsSettings->setChecked(true);
+ QCheckBox *importAddsSettings
+ = new QCheckBox(i18n("Import additional files"), dialog);
+ importAddsSettings->setChecked(true);
+ QDialogButtonBox *dialogButtons
+ = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel,
+ Qt::Horizontal, dialog);
+ QVBoxLayout *layout = new QVBoxLayout(dialog);
+ layout->addWidget(importPlasmoidSettings);
+ layout->addWidget(importExtensionsSettings);
+ layout->addWidget(importAddsSettings);
+ layout->addWidget(dialogButtons);
+ connect(dialogButtons, SIGNAL(accepted()), dialog, SLOT(accept()));
+ connect(dialogButtons, SIGNAL(rejected()), dialog, SLOT(reject()));
+
+ // get parameters
+ QHash<QString, bool> import;
+ import[QString("plasmoid")] = false;
+ import[QString("extensions")] = false;
+ import[QString("adds")] = false;
+ switch (dialog->exec()) {
+ case QDialog::Accepted:
+ import[QString("plasmoid")] = importPlasmoidSettings->isChecked();
+ import[QString("extensions")] = importExtensionsSettings->isChecked();
+ import[QString("adds")] = importAddsSettings->isChecked();
+ break;
+ case QDialog::Rejected:
+ default:
+ break;
+ }
+ dialog->deleteLater();
+
+ return import;
+}
+
+
void AWConfigHelper::writeFile(QSettings &settings, const QString key,
const QString fileName) const
{
diff --git a/sources/awesome-widget/plugin/awconfighelper.h b/sources/awesome-widget/plugin/awconfighelper.h
index 912ac3d..dc51dfb 100644
--- a/sources/awesome-widget/plugin/awconfighelper.h
+++ b/sources/awesome-widget/plugin/awconfighelper.h
@@ -33,13 +33,9 @@ public:
explicit AWConfigHelper(QObject *parent = nullptr);
virtual ~AWConfigHelper();
Q_INVOKABLE QString configurationDirectory() const;
Q_INVOKABLE bool dropCache() const;
- Q_INVOKABLE bool exportConfiguration(QObject *nativeConfig,
- const QString fileName) const;
- Q_INVOKABLE QVariantMap importConfiguration(const QString fileName,
- const bool importPlasmoid,
- const bool importExtensions,
- const bool importAdds) const;
+ Q_INVOKABLE void exportConfiguration(QObject *nativeConfig) const;
+ Q_INVOKABLE QVariantMap importConfiguration() const;
// dataengine
Q_INVOKABLE QVariantMap readDataEngineConfiguration() const;
Q_INVOKABLE void
@@ -51,6 +47,7 @@ private:
void copySettings(QSettings &from, QSettings &to) const;
void readFile(QSettings &settings, const QString key,
const QString fileName) const;
+ QHash<QString, bool> selectImport() const;
void writeFile(QSettings &settings, const QString key,
const QString fileName) const;
// properties
diff --git a/sources/awesome-widget/plugin/awkeys.cpp b/sources/awesome-widget/plugin/awkeys.cpp
index e5b9861..039d24e 100644
--- a/sources/awesome-widget/plugin/awkeys.cpp
+++ b/sources/awesome-widget/plugin/awkeys.cpp
@@ -324,6 +324,14 @@ QStringList AWKeys::getHddDevices() const
}
+#include <QInputDialog>
+QString AWKeys::graphicalKey() const
+{
+ return QInputDialog::getItem(nullptr, i18n("Select tag"), QString(),
+ dictKeys(true), 0, true);
+}
+
+
QString AWKeys::infoByKey(QString key) const
{
qCDebug(LOG_AW) << "Requested info for key" << key;
diff --git a/sources/awesome-widget/plugin/awkeys.h b/sources/awesome-widget/plugin/awkeys.h
index a8300f1..8edc3bd 100644
--- a/sources/awesome-widget/plugin/awkeys.h
+++ b/sources/awesome-widget/plugin/awkeys.h
@@ -55,6 +55,7 @@ public:
Q_INVOKABLE QStringList dictKeys(const bool sorted = false,
const QString regexp = QString()) const;
Q_INVOKABLE QStringList getHddDevices() const;
+ Q_INVOKABLE QString graphicalKey() const;
// values
Q_INVOKABLE QString infoByKey(QString key) const;
Q_INVOKABLE QString valueByKey(QString key) const;
diff --git a/sources/awdebug.cpp b/sources/awdebug.cpp
index eee61e1..9da8dad 100644
--- a/sources/awdebug.cpp
+++ b/sources/awdebug.cpp
@@ -20,13 +20,10 @@
#include "awdebug.h"
-Q_LOGGING_CATEGORY(LOG_AW, "org.kde.plasma.awesomewidget",
- QtMsgType::QtWarningMsg)
-Q_LOGGING_CATEGORY(LOG_DP, "org.kde.plasma.desktoppanel",
- QtMsgType::QtWarningMsg)
-Q_LOGGING_CATEGORY(LOG_ESM, "org.kde.plasma.extsysmon", QtMsgType::QtWarningMsg)
-Q_LOGGING_CATEGORY(LOG_LIB, "org.kde.plasma.awesomewidgets",
- QtMsgType::QtWarningMsg)
+Q_LOGGING_CATEGORY(LOG_AW, "org.kde.plasma.awesomewidget")
+Q_LOGGING_CATEGORY(LOG_DP, "org.kde.plasma.desktoppanel")
+Q_LOGGING_CATEGORY(LOG_ESM, "org.kde.plasma.extsysmon")
+Q_LOGGING_CATEGORY(LOG_LIB, "org.kde.plasma.awesomewidgets")
const QStringList getBuildData()
diff --git a/sources/awesome-widget/plugin/awkeys.cpp b/sources/awesome-widget/plugin/awkeys.cpp
index e5b9861..eb73073 100644
--- a/sources/awesome-widget/plugin/awkeys.cpp
+++ b/sources/awesome-widget/plugin/awkeys.cpp
@@ -439,4 +439,4 @@ void AWKeys::dataUpdated(const QString &sourceName,
{
// run concurrent data update
- QtConcurrent::run(m_threadPool, this, &AWKeys::setDataBySource, sourceName,
+ QtConcurrent::run(this, &AWKeys::setDataBySource, sourceName,
data);
diff --git a/sources/libraries.cmake b/sources/libraries.cmake
index 33192f7..46e2b1e 100644
--- a/sources/libraries.cmake
+++ b/sources/libraries.cmake
@@ -2,7 +2,7 @@
find_package(Gettext REQUIRED)
# main qt libraries
-find_package(Qt5 5.4.0 REQUIRED COMPONENTS Core DBus Network Qml Widgets)
+find_package(Qt5 5.3.0 REQUIRED COMPONENTS Core DBus Network Qml Widgets)
add_definitions(
${Qt5Core_DEFINITIONS} ${Qt5DBus_DEFINITIONS} ${Qt5Network_DEFINITIONS}
${Qt5Qml_DEFINITIONS} ${Qt5Widgets_DEFINITIONS}

View File

@ -1,5 +1,25 @@
diff --git a/sources/awdebug.h b/sources/awdebug.h
index 8447c65..9f8e298 100644
--- a/sources/awdebug.h
+++ b/sources/awdebug.h
@@ -23,10 +23,14 @@
#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 diff --git a/sources/awesome-widget/plugin/awkeysaggregator.h b/sources/awesome-widget/plugin/awkeysaggregator.h
index f808d03..a056b3f 100644 index d29672e..f15a729 100644
--- a/sources/awesome-widget/plugin/awkeysaggregator.h --- a/sources/awesome-widget/plugin/awkeysaggregator.h
+++ b/sources/awesome-widget/plugin/awkeysaggregator.h +++ b/sources/awesome-widget/plugin/awkeysaggregator.h
@@ -21,6 +21,7 @@ @@ -21,6 +21,7 @@
@ -10,22 +30,3 @@ index f808d03..a056b3f 100644
#include "version.h" #include "version.h"
diff --git a/sources/awdebug.h b/sources/awdebug.h
index 43944ce..c679281 100644
--- a/sources/awdebug.h
+++ b/sources/awdebug.h
@@ -21,9 +21,13 @@
#include "version.h"
+#ifndef qCInfo
+#define qCInfo qCDebug
+#endif
+
#ifndef LOG_FORMAT
#define LOG_FORMAT \
- "[%{time process}][%{if-debug}DD%{endif}%{if-info}II%{endif}%{if-" \
+ "[%{time process}][%{if-debug}DD%{endif}%{if-" \
"warning}WW%{endif}%{if-critical}CC%{endif}%{if-fatal}FF%{endif}][%{" \
"category}][%{function}] %{message}"
#endif /* LOG_FORMAT */

View File

@ -1,69 +1,60 @@
diff --git a/sources/awesome-widget/plugin/awupdatehelper.cpp b/sources/awesome-widget/plugin/awupdatehelper.cpp diff --git a/sources/awesome-widget/plugin/awupdatehelper.cpp b/sources/awesome-widget/plugin/awupdatehelper.cpp
index 3698602..42871c8 100644 index f6b5338..b5a3163 100644
--- a/sources/awesome-widget/plugin/awupdatehelper.cpp --- a/sources/awesome-widget/plugin/awupdatehelper.cpp
+++ b/sources/awesome-widget/plugin/awupdatehelper.cpp +++ b/sources/awesome-widget/plugin/awupdatehelper.cpp
@@ -37,7 +37,7 @@ AWUpdateHelper::AWUpdateHelper(QObject *parent) @@ -35,7 +35,7 @@ AWUpdateHelper::AWUpdateHelper(QObject *_parent)
{ {
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
- m_foundVersion = QVersionNumber::fromString(VERSION); - m_foundVersion = QVersionNumber::fromString(VERSION);
+ m_foundVersion = QString(VERSION); + m_foundVersion = 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));
@@ -69,15 +69,15 @@ void AWUpdateHelper::checkUpdates(const bool showAnyway) @@ -67,8 +67,7 @@ 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( - QVersionNumber version = QVersionNumber::fromString(
- settings.value(QString("Version"), QString(VERSION)).toString()); - settings.value("Version", QString(VERSION)).toString());
+ QString version + QString version = settings.value("Version", VERSION).toString();
+ = settings.value(QString("Version"), QString(VERSION)).toString();
// update version // update version
settings.setValue(QString("Version"), QString(VERSION)); settings.setValue("Version", QString(VERSION));
settings.sync(); settings.sync();
qCInfo(LOG_AW) << "Found version" << version << "actual one is" @@ -91,12 +90,11 @@ bool AWUpdateHelper::checkVersion()
<< m_foundVersion;
- if ((version != m_foundVersion) && (!QString(CHANGELOG).isEmpty())) {
+ if ((version != QString(VERSION)) && (!QString(CHANGELOG).isEmpty())) {
genMessageBox(i18n("Changelog of %1", QString(VERSION)),
QString(CHANGELOG).replace(QChar('@'), QChar('\n')),
QMessageBox::Ok)
@@ -90,12 +90,11 @@ bool AWUpdateHelper::checkVersion()
} }
-void AWUpdateHelper::showInfo(const QVersionNumber version) -void AWUpdateHelper::showInfo(const QVersionNumber &_version)
+void AWUpdateHelper::showInfo(const QString version) +void AWUpdateHelper::showInfo(const QString &_version)
{ {
qCDebug(LOG_AW) << "Version" << version; qCDebug(LOG_AW) << "Version" << _version;
- QString text - QString text
- = i18n("You are using the actual version %1", version.toString()); - = i18n("You are using the actual version %1", _version.toString());
+ QString text = i18n("You are using the actual version %1", version); + QString text = i18n("You are using the actual version %1", _version);
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) return genMessageBox(i18n("No new version found"), text, QMessageBox::Ok)
@@ -103,7 +102,7 @@ void AWUpdateHelper::showInfo(const QVersionNumber version) @@ -104,7 +102,7 @@ void AWUpdateHelper::showInfo(const QVersionNumber &_version)
} }
-void AWUpdateHelper::showUpdates(const QVersionNumber version) -void AWUpdateHelper::showUpdates(const QVersionNumber &_version)
+void AWUpdateHelper::showUpdates(const QString version) +void AWUpdateHelper::showUpdates(const QString &_version)
{ {
qCDebug(LOG_AW) << "Version" << version; qCDebug(LOG_AW) << "Version" << _version;
@@ -112,7 +111,7 @@ void AWUpdateHelper::showUpdates(const QVersionNumber version) @@ -113,7 +111,7 @@ void AWUpdateHelper::showUpdates(const QVersionNumber &_version)
text += QString(COMMIT_SHA).isEmpty() text += QString(COMMIT_SHA).isEmpty()
? QString("\n") ? "\n"
: QString(" (%1)\n").arg(QString(COMMIT_SHA)); : QString(" (%1)\n").arg(QString(COMMIT_SHA));
- text += i18n("New version : %1", version.toString()) + QString("\n\n"); - text += i18n("New version : %1", _version.toString()) + "\n\n";
+ text += i18n("New version : %1", version) + QString("\n\n"); + text += i18n("New version : %1", _version) + "\n\n";
text += i18n("Click \"Ok\" to download"); text += i18n("Click \"Ok\" to download");
genMessageBox(i18n("There are updates"), text, genMessageBox(i18n("There are updates"), text,
@@ -128,8 +127,7 @@ void AWUpdateHelper::userReplyOnUpdates(QAbstractButton *button) @@ -130,8 +128,7 @@ void AWUpdateHelper::userReplyOnUpdates(QAbstractButton *_button)
switch (ret) { switch (ret) {
case QMessageBox::AcceptRole: case QMessageBox::AcceptRole:
@ -73,10 +64,10 @@ index 3698602..42871c8 100644
break; break;
case QMessageBox::RejectRole: case QMessageBox::RejectRole:
default: default:
@@ -157,14 +155,23 @@ void AWUpdateHelper::versionReplyRecieved(QNetworkReply *reply, @@ -162,14 +159,23 @@ void AWUpdateHelper::versionReplyRecieved(QNetworkReply *_reply,
QVariantMap firstRelease = jsonDoc.toVariant().toList().first().toMap(); QVariantMap firstRelease = jsonDoc.toVariant().toList().first().toMap();
QString version = firstRelease[QString("tag_name")].toString(); QString version = firstRelease["tag_name"].toString();
version.remove(QString("V.")); version.remove("V.");
- m_foundVersion = QVersionNumber::fromString(version); - m_foundVersion = QVersionNumber::fromString(version);
+ m_foundVersion = version; + m_foundVersion = version;
qCInfo(LOG_AW) << "Update found version to" << m_foundVersion; qCInfo(LOG_AW) << "Update found version to" << m_foundVersion;
@ -96,14 +87,14 @@ index 3698602..42871c8 100644
+ || ((old_major == new_major) && (old_minor == new_minor) + || ((old_major == new_major) && (old_minor == new_minor)
+ && (old_patch < new_patch))) + && (old_patch < new_patch)))
+ return showUpdates(version); + return showUpdates(version);
else if (showAnyway) else if (_showAnyway)
- return showInfo(m_foundVersion); - return showInfo(m_foundVersion);
+ return showInfo(version); + return showInfo(version);
} }
diff --git a/sources/awesome-widget/plugin/awupdatehelper.h b/sources/awesome-widget/plugin/awupdatehelper.h diff --git a/sources/awesome-widget/plugin/awupdatehelper.h b/sources/awesome-widget/plugin/awupdatehelper.h
index 359cdb2..9c6a42d 100644 index cfd26e7..b311be2 100644
--- a/sources/awesome-widget/plugin/awupdatehelper.h --- a/sources/awesome-widget/plugin/awupdatehelper.h
+++ b/sources/awesome-widget/plugin/awupdatehelper.h +++ b/sources/awesome-widget/plugin/awupdatehelper.h
@@ -21,7 +21,6 @@ @@ -21,7 +21,6 @@
@ -118,31 +109,31 @@ index 359cdb2..9c6a42d 100644
bool checkVersion(); bool checkVersion();
private slots: private slots:
- void showInfo(const QVersionNumber version); - void showInfo(const QVersionNumber &_version);
- void showUpdates(const QVersionNumber version); - void showUpdates(const QVersionNumber &_version);
+ void showInfo(const QString version); + void showInfo(const QString &_version);
+ void showUpdates(const QString version); + void showUpdates(const QString &_version);
void userReplyOnUpdates(QAbstractButton *button); void userReplyOnUpdates(QAbstractButton *_button);
void versionReplyRecieved(QNetworkReply *reply, const bool showAnyway); void versionReplyRecieved(QNetworkReply *_reply, const bool _showAnyway);
private: private:
QMessageBox *genMessageBox(const QString title, const QString body, QMessageBox *genMessageBox(const QString &_title, const QString &_body,
const QMessageBox::StandardButtons buttons); const QMessageBox::StandardButtons _buttons);
- QVersionNumber m_foundVersion; - QVersionNumber m_foundVersion;
+ QString m_foundVersion; + QString m_foundVersion;
QString m_genericConfig; QString m_genericConfig;
}; };
diff --git a/sources/libraries.cmake b/sources/libraries.cmake diff --git a/sources/libraries.cmake b/sources/libraries.cmake
index 33192f7..339bb58 100644 index 6f171a6..004b39f 100644
--- a/sources/libraries.cmake --- a/sources/libraries.cmake
+++ b/sources/libraries.cmake +++ b/sources/libraries.cmake
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
find_package(Gettext REQUIRED) find_package(Gettext REQUIRED)
# main qt libraries # main qt libraries
-find_package(Qt5 5.6.0 REQUIRED COMPONENTS Core DBus Network Qml Widgets) -find_package(Qt5 5.6.0 REQUIRED COMPONENTS Core DBus Network Qml Test Widgets)
+find_package(Qt5 5.4.0 REQUIRED COMPONENTS Core DBus Network Qml Widgets) +find_package(Qt5 5.5.0 REQUIRED COMPONENTS Core DBus Network Qml Test Widgets)
add_definitions( add_definitions(
${Qt5Core_DEFINITIONS} ${Qt5DBus_DEFINITIONS} ${Qt5Network_DEFINITIONS} ${Qt5Core_DEFINITIONS} ${Qt5DBus_DEFINITIONS} ${Qt5Network_DEFINITIONS}
${Qt5Qml_DEFINITIONS} ${Qt5Widgets_DEFINITIONS} ${Qt5Qml_DEFINITIONS} ${Qt5Widgets_DEFINITIONS}

View File

@ -14,7 +14,7 @@ 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 "3")
set(PROJECT_VERSION_MINOR "1") set(PROJECT_VERSION_MINOR "3")
set(PROJECT_VERSION_PATCH "2") set(PROJECT_VERSION_PATCH "2")
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
@ -34,6 +34,7 @@ option(BUILD_DEB_PACKAGE "Build deb package" OFF)
option(BUILD_RPM_PACKAGE "Build rpm package" OFF) option(BUILD_RPM_PACKAGE "Build rpm package" OFF)
# build details # build details
option(BUILD_FUTURE "Build with the features which will be marked as stable later" OFF) option(BUILD_FUTURE "Build with the features which will be marked as stable later" OFF)
option(BUILD_LOAD "Build with additional load" OFF)
option(BUILD_TESTING "Build with additional test abilities" OFF) option(BUILD_TESTING "Build with additional test abilities" OFF)
# generate changelog # generate changelog
@ -49,14 +50,11 @@ if (CMAKE_COMPILER_IS_GNUCXX)
# avoid newer gcc warnings # avoid newer gcc warnings
add_definitions(-D_DEFAULT_SOURCE) add_definitions(-D_DEFAULT_SOURCE)
elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang") elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
set(CMAKE_CXX_FLAGS "-Wall -std=c++11 -stdlib=libc++") set(CMAKE_CXX_FLAGS "-Wall -std=c++11")
set(CMAKE_CXX_FLAGS_DEBUG "-g -O0") set(CMAKE_CXX_FLAGS_DEBUG "-g -O0")
set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG") set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG")
set(CMAKE_CXX_FLAGS_OPTIMIZATION "-Ofast -DNDEBUG") set(CMAKE_CXX_FLAGS_OPTIMIZATION "-Ofast -DNDEBUG")
# linker flags # linker flags
set(CMAKE_EXE_LINKER_FLAGS "-lc++abi")
set(CMAKE_MODULE_LINKER_FLAGS "-lc++abi")
set(CMAKE_SHARED_LINKER_FLAGS "-lc++abi")
else () else ()
message(FATAL_ERROR "Unknown compiler") message(FATAL_ERROR "Unknown compiler")
endif () endif ()
@ -64,8 +62,12 @@ if (CMAKE_BUILD_TYPE MATCHES Debug)
set(CMAKE_VERBOSE_MAKEFILE ON) set(CMAKE_VERBOSE_MAKEFILE ON)
endif () 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)
include(libraries.cmake) include(libraries.cmake)
include(clang-format.cmake) include(clang-format.cmake)
include(cppcheck.cmake) include(cppcheck.cmake)
@ -74,11 +76,18 @@ include(coverity.cmake)
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)
add_subdirectory(awesomewidgets) add_subdirectory(awesomewidgets)
add_subdirectory(extsysmonsources)
add_subdirectory(extsysmon) add_subdirectory(extsysmon)
if (BUILD_PLASMOIDS) if (BUILD_PLASMOIDS)
add_subdirectory(qml)
add_subdirectory(awesome-widget) add_subdirectory(awesome-widget)
add_subdirectory(desktop-panel) add_subdirectory(desktop-panel)
add_subdirectory(translations) add_subdirectory(translations)
endif () endif ()
if (BUILD_TESTING)
enable_testing()
add_subdirectory(test)
endif ()
include(packages-recipe.cmake) include(packages-recipe.cmake)

View File

@ -16,38 +16,117 @@
***************************************************************************/ ***************************************************************************/
#include <KI18n/KLocalizedString>
#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_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",
QtMsgType::QtWarningMsg)
Q_LOGGING_CATEGORY(LOG_LIB, "org.kde.plasma.awesomewidgets", Q_LOGGING_CATEGORY(LOG_LIB, "org.kde.plasma.awesomewidgets",
QtMsgType::QtWarningMsg) QtMsgType::QtWarningMsg)
const QStringList getBuildData() QString AWDebug::getAboutText(const QString &_type)
{
QString text;
if (_type == "header") {
text = NAME;
} else if (_type == "version") {
text = i18n("Version %1 (build date %2)", VERSION, BUILD_DATE);
if (!QString(COMMIT_SHA).isEmpty())
text += QString(" (%1)").arg(COMMIT_SHA);
} else if (_type == "description") {
text = i18n("A set of minimalistic plasmoid widgets");
} else if (_type == "links") {
text = i18n("Links:") + "<ul>"
+ QString("<li><a href=\"%1\">%2</a></li>")
.arg(HOMEPAGE)
.arg(i18n("Homepage"))
+ QString("<li><a href=\"%1\">%2</a></li>")
.arg(REPOSITORY)
.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") {
text = QString("<small>&copy; %1 <a href=\"mailto:%2\">%3</a><br>")
.arg(DATE)
.arg(EMAIL)
.arg(AUTHOR)
+ i18n("This software is licensed under %1", LICENSE)
+ "</small>";
} else if (_type == "translators") {
QStringList translatorList = QString(TRANSLATORS).split(',');
for (auto &translator : translatorList)
translator = QString("<li>%1</li>").arg(translator);
text
= i18n("Translators:") + "<ul>" + translatorList.join("") + "</ul>";
} else if (_type == "3rdparty") {
QStringList trdPartyList
= QString(TRDPARTY_LICENSE).split(';', QString::SkipEmptyParts);
for (int i = 0; i < trdPartyList.count(); i++)
trdPartyList[i]
= QString("<li><a href=\"%3\">%1</a> (%2 license)</li>")
.arg(trdPartyList.at(i).split(',')[0])
.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") {
QStringList thanks
= QString(SPECIAL_THANKS).split(';', QString::SkipEmptyParts);
for (int i = 0; i < thanks.count(); i++)
thanks[i] = QString("<li><a href=\"%2\">%1</a></li>")
.arg(thanks.at(i).split(',')[0])
.arg(thanks.at(i).split(',')[1]);
text = i18n("Special thanks to:") + "<ul>" + thanks.join("") + "</ul>";
}
return text;
}
QStringList AWDebug::getBuildData()
{ {
QStringList metadata; QStringList metadata;
metadata.append(QString("=== Awesome Widgets configuration details ===")); metadata.append("=== Awesome Widgets configuration details ===");
// build information // build information
metadata.append(QString("Build details:")); metadata.append("Build details:");
metadata.append(QString(" VERSION: %1").arg(VERSION)); metadata.append(QString(" VERSION: %1").arg(VERSION));
metadata.append(QString(" COMMIT_SHA: %1").arg(COMMIT_SHA)); metadata.append(QString(" COMMIT_SHA: %1").arg(COMMIT_SHA));
metadata.append(QString(" BUILD_DATE: %1").arg(BUILD_DATE)); metadata.append(QString(" BUILD_DATE: %1").arg(BUILD_DATE));
// configuration // configuration
metadata.append(QString("API details:")); metadata.append("API details:");
metadata.append(QString(" AWGIAPI: %1").arg(AWGIAPI)); metadata.append(QString(" AW_GRAPHITEM_API: %1").arg(AW_GRAPHITEM_API));
metadata.append(QString(" AWEQAPI: %1").arg(AWEQAPI)); metadata.append(QString(" AW_EXTQUOTES_API: %1").arg(AW_EXTQUOTES_API));
metadata.append(QString(" AWESAPI: %1").arg(AWESAPI)); metadata.append(QString(" AW_EXTSCRIPT_API: %1").arg(AW_EXTSCRIPT_API));
metadata.append(QString(" AWEUAPI: %1").arg(AWEUAPI)); metadata.append(
metadata.append(QString(" AWEWAPI: %1").arg(AWEWAPI)); QString(" AW_EXTUPGRADE_API: %1").arg(AW_EXTUPGRADE_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(" REQUEST_TIMEOUT: %1").arg(REQUEST_TIMEOUT));
metadata.append(QString(" TIME_KEYS: %1").arg(TIME_KEYS)); metadata.append(QString(" TIME_KEYS: %1").arg(TIME_KEYS));
metadata.append(QString(" STATIC_KEYS: %1").arg(STATIC_KEYS)); metadata.append(QString(" STATIC_KEYS: %1").arg(STATIC_KEYS));
// cmake properties // cmake properties
metadata.append(QString("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));
@ -67,8 +146,7 @@ const QStringList getBuildData()
metadata.append(QString(" CMAKE_SHARED_LINKER_FLAGS: %1") metadata.append(QString(" CMAKE_SHARED_LINKER_FLAGS: %1")
.arg(CMAKE_SHARED_LINKER_FLAGS)); .arg(CMAKE_SHARED_LINKER_FLAGS));
// components // components
metadata.append(QString("Components data:")); metadata.append("Components data:");
metadata.append(QString(" BUILD_COVERAGE: %1").arg(BUILD_COVERAGE));
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));
@ -87,6 +165,7 @@ const QStringList getBuildData()
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_TEST: %1").arg(PROP_TEST)); metadata.append(QString(" PROP_TEST: %1").arg(PROP_TEST));
return metadata; return metadata;

View File

@ -23,20 +23,25 @@
#include "version.h" #include "version.h"
#ifndef LOG_FORMAT namespace AWDebug
#define LOG_FORMAT \ {
"[%{time process}][%{if-debug}DD%{endif}%{if-info}II%{endif}%{if-" \ const char LOG_FORMAT[] = "[%{time "
"warning}WW%{endif}%{if-critical}CC%{endif}%{if-fatal}FF%{endif}][%{" \ "process}][%{if-debug}DD%{endif}%{if-info}II%{endif}%"
"category}][%{function}] %{message}" "{if-warning}WW%{endif}%{if-critical}CC%{endif}%{if-"
#endif /* LOG_FORMAT */ "fatal}FF%{endif}][%{category}][%{function}] "
"%{message}";
QString getAboutText(const QString &_type);
QStringList getBuildData();
}
Q_DECLARE_LOGGING_CATEGORY(LOG_AW) Q_DECLARE_LOGGING_CATEGORY(LOG_AW)
Q_DECLARE_LOGGING_CATEGORY(LOG_DBUS)
Q_DECLARE_LOGGING_CATEGORY(LOG_DP) 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_LIB) Q_DECLARE_LOGGING_CATEGORY(LOG_LIB)
const QStringList getBuildData();
#endif /* AWDEBUG_H */ #endif /* AWDEBUG_H */

View File

@ -62,6 +62,15 @@
<entry name="acOffline" type="string"> <entry name="acOffline" type="string">
<default>( )</default> <default>( )</default>
</entry> </entry>
<entry name="telemetryCount" type="int">
<default>100</default>
</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">
@ -138,6 +147,12 @@
<entry name="fontStyle" type="string"> <entry name="fontStyle" type="string">
<default>normal</default> <default>normal</default>
</entry> </entry>
<entry name="textStyle" type="string">
<default>normal</default>
</entry>
<entry name="textStyleColor" type="string">
<default>#000000</default>
</entry>
</group> </group>
</kcfg> </kcfg>

View File

@ -16,112 +16,24 @@
***************************************************************************/ ***************************************************************************/
import QtQuick 2.0 import QtQuick 2.0
import QtQuick.Controls 1.3 as QtControls
import QtQuick.Layouts 1.0 as QtLayouts
import org.kde.plasma.private.awesomewidget 1.0 import org.kde.plasma.private.awesomewidget 1.0
Item { Item {
id: aboutPage id: aboutPage
// backend
AWActions { AWActions {
id: awActions id: awActions
} }
width: childrenRect.width width: childrenRect.width
height: childrenRect.height height: childrenRect.height
implicitWidth: pageColumn.implicitWidth
implicitHeight: pageColumn.implicitHeight
property bool debug: awActions.isDebugEnabled() AboutTab {
textProvider: awActions
Column {
id: pageColumn
anchors.fill: parent
QtControls.TabView {
height: parent.height
width: parent.width
QtControls.Tab {
anchors.margins: 10.0
title: i18n("About")
QtLayouts.ColumnLayout {
QtControls.Label {
QtLayouts.Layout.fillWidth: true
horizontalAlignment: Text.AlignHCenter
text: awActions.getAboutText("header")
}
QtControls.Label {
QtLayouts.Layout.fillWidth: true
horizontalAlignment: Text.AlignHCenter
text: awActions.getAboutText("version")
}
QtControls.Label {
QtLayouts.Layout.fillWidth: true
horizontalAlignment: Text.AlignJustify
text: awActions.getAboutText("description")
}
QtControls.Label {
QtLayouts.Layout.fillWidth: true
horizontalAlignment: Text.AlignLeft
textFormat: Text.RichText
text: awActions.getAboutText("links")
onLinkActivated: Qt.openUrlExternally(link);
}
QtControls.Label {
QtLayouts.Layout.fillHeight: true
QtLayouts.Layout.fillWidth: true
font.capitalization: Font.SmallCaps
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignBottom
textFormat: Text.RichText
text: awActions.getAboutText("copy")
}
}
}
QtControls.Tab {
anchors.margins: 10.0
title: i18n("Acknowledgment")
QtLayouts.ColumnLayout {
QtControls.Label {
QtLayouts.Layout.fillWidth: true
wrapMode: Text.WordWrap
horizontalAlignment: Text.AlignJustify
text: awActions.getAboutText("translators")
}
QtControls.Label {
QtLayouts.Layout.fillWidth: true
wrapMode: Text.WordWrap
horizontalAlignment: Text.AlignJustify
textFormat: Text.RichText
text: awActions.getAboutText("3rdparty")
onLinkActivated: Qt.openUrlExternally(link);
}
QtControls.Label {
QtLayouts.Layout.fillHeight: true
QtLayouts.Layout.fillWidth: true
wrapMode: Text.WordWrap
horizontalAlignment: Text.AlignJustify
verticalAlignment: Text.AlignTop
textFormat: Text.RichText
text: awActions.getAboutText("thanks")
onLinkActivated: Qt.openUrlExternally(link);
}
}
}
}
} }
Component.onCompleted: { Component.onCompleted: {
if (debug) console.debug() if (debug) console.debug()
} }

View File

@ -17,7 +17,6 @@
import QtQuick 2.0 import QtQuick 2.0
import QtQuick.Controls 1.3 as QtControls import QtQuick.Controls 1.3 as QtControls
import QtQuick.Dialogs 1.2 as QtDialogs
import org.kde.plasma.private.awesomewidget 1.0 import org.kde.plasma.private.awesomewidget 1.0
@ -28,9 +27,6 @@ Item {
AWActions { AWActions {
id: awActions id: awActions
} }
AWConfigHelper {
id: awConfig
}
width: childrenRect.width width: childrenRect.width
height: childrenRect.height height: childrenRect.height
@ -50,420 +46,210 @@ Item {
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 alias cfg_queueLimit: queueLimit.value
property string cfg_tempUnits: tempUnits.currentText property string cfg_tempUnits: tempUnits.value
property alias cfg_customTime: customTime.text property alias cfg_customTime: customTime.value
property alias cfg_customUptime: customUptime.text property alias cfg_customUptime: customUptime.value
property alias cfg_acOnline: acOnline.text property alias cfg_acOnline: acOnline.value
property alias cfg_acOffline: acOffline.text property alias cfg_acOffline: acOffline.value
property alias cfg_telemetryCount: telemetryCount.value
property alias cfg_telemetryRemote: telemetryRemote.checked
property alias cfg_telemetryId: telemetryId.value
Column { Column {
id: pageColumn id: pageColumn
anchors.fill: parent anchors.fill: parent
Row {
height: implicitHeight CheckBoxSelector {
width: parent.width id: background
QtControls.Label { text: i18n("Enable background")
height: parent.heigth
width: parent.width * 2 / 5
}
QtControls.CheckBox {
id: background
width: parent.width * 3 / 5
text: i18n("Enable background")
}
} }
Row { CheckBoxSelector {
height: implicitHeight id: translate
width: parent.width text: i18n("Translate strings")
QtControls.Label {
height: parent.heigth
width: parent.width * 2 / 5
}
QtControls.CheckBox {
id: translate
width: parent.width * 3 / 5
text: i18n("Translate strings")
}
} }
Row { CheckBoxSelector {
height: implicitHeight id: wrapNewLines
width: parent.width text: i18n("Wrap new lines")
QtControls.Label {
height: parent.heigth
width: parent.width * 2 / 5
}
QtControls.CheckBox {
id: wrapNewLines
width: parent.width * 3 / 5
text: i18n("Wrap new lines")
}
} }
Row { CheckBoxSelector {
height: implicitHeight id: wordWrap
width: parent.width text: i18n("Enable word wrap")
QtControls.Label {
height: parent.heigth
width: parent.width * 2 / 5
}
QtControls.CheckBox {
id: wordWrap
width: parent.width * 3 / 5
text: i18n("Enable word wrap")
}
} }
Row { CheckBoxSelector {
height: implicitHeight id: notify
width: parent.width text: i18n("Enable notifications")
QtControls.Label {
height: parent.heigth
width: parent.width * 2 / 5
}
QtControls.CheckBox {
id: notify
width: parent.width * 3 / 5
text: i18n("Enable notifications")
}
} }
Row { CheckBoxSelector {
height: implicitHeight id: updates
width: parent.width text: i18n("Check updates on startup")
QtControls.Label {
height: parent.heigth
width: parent.width * 2 / 5
}
QtControls.CheckBox {
id: updates
width: parent.width * 3 / 5
text: i18n("Check updates on startup")
}
} }
Row { CheckBoxSelector {
height: implicitHeight id: optimize
width: parent.width text: i18n("Optimize subscription")
QtControls.Label {
height: parent.heigth
width: parent.width * 2 / 5
}
QtControls.CheckBox {
id: optimize
width: parent.width * 3 / 5
text: i18n("Optimize subscription")
}
} }
Row { IntegerSelector {
height: implicitHeight id: widgetHeight
width: parent.width maximumValue: 4096
QtControls.Label { minimumValue: 0
height: parent.height stepSize: 50
width: parent.width * 2 / 5 text: i18n("Widget height, px")
horizontalAlignment: Text.AlignRight value: plasmoid.configuration.height
verticalAlignment: Text.AlignVCenter
text: i18n("Widget height, px")
}
QtControls.SpinBox {
id: widgetHeight
width: parent.width * 3 / 5
minimumValue: 0
maximumValue: 4096
stepSize: 50
value: plasmoid.configuration.height
}
} }
Row { IntegerSelector {
height: implicitHeight id: widgetWidth
width: parent.width maximumValue: 4096
QtControls.Label { minimumValue: 0
height: parent.height stepSize: 50
width: parent.width * 2 / 5 text: i18n("Widget width, px")
horizontalAlignment: Text.AlignRight value: plasmoid.configuration.width
verticalAlignment: Text.AlignVCenter
text: i18n("Widget width, px")
}
QtControls.SpinBox {
id: widgetWidth
width: parent.width * 3 / 5
minimumValue: 0
maximumValue: 4096
stepSize: 50
value: plasmoid.configuration.width
}
} }
Row { IntegerSelector {
height: implicitHeight id: update
width: parent.width maximumValue: 10000
QtControls.Label { minimumValue: 1000
height: parent.height stepSize: 500
width: parent.width * 2 / 5 text: i18n("Time interval")
horizontalAlignment: Text.AlignRight value: plasmoid.configuration.interval
verticalAlignment: Text.AlignVCenter
text: i18n("Time interval")
}
QtControls.SpinBox {
id: update
width: parent.width * 3 / 5
minimumValue: 1000
maximumValue: 10000
stepSize: 500
value: plasmoid.configuration.interval
}
} }
Row { IntegerSelector {
height: implicitHeight id: queueLimit
width: parent.width maximumValue: 99
QtControls.Label { minimumValue: 0
height: parent.height stepSize: 1
width: parent.width * 2 / 5 text: i18n("Messages queue limit")
horizontalAlignment: Text.AlignRight value: plasmoid.configuration.queueLimit
verticalAlignment: Text.AlignVCenter
text: i18n("Messages queue limit")
}
QtControls.SpinBox {
id: queueLimit
width: parent.width * 3 / 5
minimumValue: 0
maximumValue: 99
stepSize: 1
value: plasmoid.configuration.queueLimit
}
} }
Row { ComboBoxSelector {
id: tempUnits
model: [
{
'label': i18n("Celsius"),
'name': "Celsius"
},
{
'label': i18n("Fahrenheit"),
'name': "Fahrenheit"
},
{
'label': i18n("Kelvin"),
'name': "Kelvin"
},
{
'label': i18n("Reaumur"),
'name': "Reaumur"
},
{
'label': i18n("cm^-1"),
'name': "cm^-1"
},
{
'label': i18n("kJ/mol"),
'name': "kJ/mol"
},
{
'label': i18n("kcal/mol"),
'name': "kcal/mol"
}
]
text: i18n("Temperature units")
value: plasmoid.configuration.tempUnits
onValueEdited: cfg_tempUnits = newValue
}
LineSelector {
id: customTime
text: i18n("Custom time format")
value: plasmoid.configuration.customTime
}
LineSelector {
id: customUptime
text: i18n("Custom uptime format")
value: plasmoid.configuration.customUptime
}
LineSelector {
id: acOnline
text: i18n("AC online tag")
value: plasmoid.configuration.acOnline
}
LineSelector {
id: acOffline
text: i18n("AC offline tag")
value: plasmoid.configuration.acOffline
}
QtControls.GroupBox {
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
QtControls.Label { title: i18n("Actions")
height: parent.height
width: parent.width * 2 / 5 Column {
horizontalAlignment: Text.AlignRight height: implicitHeight
verticalAlignment: Text.AlignVCenter width: parent.width
text: i18n("Temperature units") ButtonSelector {
} value: i18n("Drop key cache")
QtControls.ComboBox { onButtonActivated: awActions.dropCache()
id: tempUnits }
width: parent.width * 3 / 5 ButtonSelector {
textRole: "label" ExportDialog {
model: [ id: saveConfigAs
{ configuration: plasmoid.configuration
'label': i18n("Celsius"),
'name': "Celsius"
},
{
'label': i18n("Fahrenheit"),
'name': "Fahrenheit"
},
{
'label': i18n("Kelvin"),
'name': "Kelvin"
},
{
'label': i18n("Reaumur"),
'name': "Reaumur"
},
{
'label': i18n("cm^-1"),
'name': "cm^-1"
},
{
'label': i18n("kJ/mol"),
'name': "kJ/mol"
},
{
'label': i18n("kcal/mol"),
'name': "kcal/mol"
} }
] value: i18n("Export configuration")
onCurrentIndexChanged: cfg_tempUnits = model[currentIndex]["name"] onButtonActivated: saveConfigAs.open()
Component.onCompleted: { }
if (debug) console.debug() ButtonSelector {
for (var i = 0; i < model.length; i++) { ImportDialog {
if (model[i]["name"] == plasmoid.configuration.tempUnits) { id: loadConfigFrom
if (debug) console.info("Found", model[i]["name"], "on", i) onConfigurationReceived: {
tempUnits.currentIndex = i; for (var key in configuration)
plasmoid.configuration[key] = configuration[key]
} }
} }
value: i18n("Import configuration")
onButtonActivated: loadConfigFrom.open()
} }
} }
} }
Row { QtControls.GroupBox {
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
QtControls.Label { title: i18n("Telemetry")
height: parent.height
width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("Custom time format")
}
QtControls.TextField {
id: customTime
width: parent.width * 3 / 5
text: plasmoid.configuration.customTime
}
}
Row { Column {
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
QtControls.Label { CheckBoxSelector {
height: parent.height id: telemetryRemote
width: parent.width * 2 / 5 text: i18n("Enable remote telemetry")
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("Custom uptime format")
}
QtControls.TextField {
id: customUptime
width: parent.width * 3 / 5
text: plasmoid.configuration.customUptime
}
}
Row {
height: implicitHeight
width: parent.width
QtControls.Label {
height: parent.height
width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("AC online tag")
}
QtControls.TextField {
id: acOnline
width: parent.width * 3 / 5
text: plasmoid.configuration.acOnline
}
}
Row {
height: implicitHeight
width: parent.width
QtControls.Label {
height: parent.height
width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("AC offline tag")
}
QtControls.TextField {
id: acOffline
width: parent.width * 3 / 5
text: plasmoid.configuration.acOffline
}
}
Row {
height: implicitHeight
width: parent.width
QtControls.Label {
height: parent.height
width: parent.width * 2 / 5
}
QtControls.Button {
width: parent.width * 3 / 5
text: i18n("Drop key cache")
onClicked: awActions.dropCache()
}
}
Row {
height: implicitHeight
width: parent.width
QtControls.Label {
height: parent.height
width: parent.width * 2 / 5
}
QtControls.Button {
width: parent.width * 3 / 5
text: i18n("Export configuration")
onClicked: saveConfigAs.open()
}
QtDialogs.FileDialog {
id: saveConfigAs
selectExisting: false
title: i18n("Export")
folder: awConfig.configurationDirectory()
onAccepted: {
var status = awConfig.exportConfiguration(
plasmoid.configuration,
saveConfigAs.fileUrl.toString().replace("file://", ""))
if (status) {
messageDialog.title = i18n("Success")
messageDialog.text = i18n("Please note that binary files were not copied")
} else {
messageDialog.title = i18n("Ooops...")
messageDialog.text = i18n("Could not save configuration file")
}
messageDialog.open()
} }
} IntegerSelector {
id: telemetryCount
QtDialogs.MessageDialog { maximumValue: 10000
id: messageDialog minimumValue: 0
standardButtons: QtDialogs.StandardButton.Ok stepSize: 50
} text: i18n("History count")
} value: plasmoid.configuration.telemetryCount
Row {
height: implicitHeight
width: parent.width
QtControls.Label {
height: parent.height
width: parent.width * 2 / 5
}
QtControls.Button {
width: parent.width * 3 / 5
text: i18n("Import configuration")
onClicked: openConfig.open()
}
QtDialogs.FileDialog {
id: openConfig
title: i18n("Import")
folder: awConfig.configurationDirectory()
onAccepted: importSelection.open()
}
QtDialogs.Dialog {
id: importSelection
Column {
QtControls.CheckBox {
id: importPlasmoid
text: i18n("Import plasmoid settings")
}
QtControls.CheckBox {
id: importExtensions
text: i18n("Import extensions")
}
QtControls.CheckBox {
id: importAdds
text: i18n("Import additional files")
}
} }
LineSelector {
onAccepted: { id: telemetryId
if (debug) console.debug() text: i18n("Telemetry ID")
var importConfig = awConfig.importConfiguration( value: plasmoid.configuration.telemetryId
openConfig.fileUrl.toString().replace("file://", ""),
importPlasmoid.checked, importExtensions.checked,
importAdds.checked)
for (var key in importConfig)
plasmoid.configuration[key] = importConfig[key]
} }
} }
} }

View File

@ -16,11 +16,9 @@
***************************************************************************/ ***************************************************************************/
import QtQuick 2.0 import QtQuick 2.0
import QtQuick.Controls 1.3 as QtControls
import QtQuick.Controls.Styles 1.3 as QtStyles
import QtQuick.Dialogs 1.1 as QtDialogs
import org.kde.plasma.private.awesomewidget 1.0 import org.kde.plasma.private.awesomewidget 1.0
import "."
Item { Item {
@ -44,195 +42,68 @@ Item {
87: 5 87: 5
} }
property alias cfg_fontFamily: selectFont.text property alias cfg_fontFamily: font.value
property alias cfg_fontSize: fontSize.value property alias cfg_fontSize: fontSize.value
property string cfg_fontWeight: fontWeight.currentText property string cfg_fontWeight: fontWeight.value
property string cfg_fontStyle: fontStyle.currentText property string cfg_fontStyle: fontStyle.value
property alias cfg_fontColor: selectColor.text property alias cfg_fontColor: selectColor.value
property alias cfg_textStyleColor: selectStyleColor.value
property string cfg_textStyle: textStyle.value
Column { Column {
id: pageColumn id: pageColumn
anchors.fill: parent anchors.fill: parent
Row {
height: implicitHeight FontSelector {
width: parent.width id: font
QtControls.Label { text: i18n("Font")
height: parent.height value: plasmoid.configuration.fontFamily
width: parent.width / 3
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("Font")
}
QtControls.Button {
id: selectFont
width: parent.width * 2 / 3
text: plasmoid.configuration.fontFamily
onClicked: {
if (debug) console.debug()
fontDialog.setFont()
fontDialog.visible = true
}
}
} }
Row { IntegerSelector {
height: implicitHeight id: fontSize
width: parent.width maximumValue: 32
QtControls.Label { minimumValue: 8
height: parent.height stepSize: 1
width: parent.width / 3 text: i18n("Font size")
horizontalAlignment: Text.AlignRight value: plasmoid.configuration.fontSize
verticalAlignment: Text.AlignVCenter
text: i18n("Font size")
}
QtControls.SpinBox {
id: fontSize
width: parent.width * 2 / 3
minimumValue: 8
maximumValue: 32
stepSize: 1
value: plasmoid.configuration.fontSize
}
} }
Row { ComboBoxSelector {
height: implicitHeight id: fontWeight
width: parent.width model: General.fontWeightModel
QtControls.Label { text: i18n("Font weight")
height: parent.height value: plasmoid.configuration.fontWeight
width: parent.width / 3 onValueEdited: cfg_fontWeight = newValue
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("Font weight")
}
QtControls.ComboBox {
id: fontWeight
width: parent.width * 2 / 3
textRole: "label"
model: [
{
'label': i18n("light"),
'name': "light"
},
{
'label': i18n("normal"),
'name': "normal"
},
{
'label': i18n("demi bold"),
'name': "demibold"
},
{
'label': i18n("bold"),
'name': "bold"
},
{
'label': i18n("black"),
'name': "black"
}
]
onCurrentIndexChanged: cfg_fontWeight = model[currentIndex]["name"]
Component.onCompleted: {
if (debug) console.debug()
for (var i = 0; i < model.length; i++) {
if (model[i]["name"] == plasmoid.configuration.fontWeight) {
if (debug) console.info("Found", model[i]["name"], "on", i)
fontWeight.currentIndex = i;
}
}
}
}
} }
Row { ComboBoxSelector {
height: implicitHeight id: fontStyle
width: parent.width model: General.fontStyleModel
QtControls.Label { text: i18n("Font style")
height: parent.height value: plasmoid.configuration.fontStyle
width: parent.width / 3 onValueEdited: cfg_fontStyle = newValue
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("Font style")
}
QtControls.ComboBox {
id: fontStyle
width: parent.width * 2 / 3
textRole: "label"
model: [
{
'label': i18n("normal"),
'name': "normal"
},
{
'label': i18n("italic"),
'name': "italic"
}
]
onCurrentIndexChanged: cfg_fontStyle = model[currentIndex]["name"]
Component.onCompleted: {
if (debug) console.debug()
for (var i = 0; i < model.length; i++) {
if (model[i]["name"] == plasmoid.configuration.fontStyle) {
if (debug) console.info("Found", model[i]["name"], "on", i)
fontStyle.currentIndex = i;
}
}
}
}
} }
Row { ColorSelector {
height: implicitHeight id: selectColor
width: parent.width text: i18n("Font color")
QtControls.Label { value: plasmoid.configuration.fontColor
height: parent.height
width: parent.width / 3
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("Font color")
}
QtControls.Button {
id: selectColor
width: parent.width * 2 / 3
style: QtStyles.ButtonStyle {
background: Rectangle {
color: plasmoid.configuration.fontColor
}
}
text: plasmoid.configuration.fontColor
onClicked: colorDialog.visible = true
}
} }
}
QtDialogs.ColorDialog { ComboBoxSelector {
id: colorDialog id: textStyle
title: i18n("Select a color") model: General.textStyleModel
color: selectColor.text text: i18n("Style")
onAccepted: selectColor.text = colorDialog.color value: plasmoid.configuration.textStyle
} onValueEdited: cfg_textStyle = newValue
QtDialogs.FontDialog {
id: fontDialog
title: i18n("Select a font")
signal setFont
onAccepted: {
if (debug) console.debug()
selectFont.text = fontDialog.font.family
fontSize.value = fontDialog.font.pointSize
fontStyle.currentIndex = fontDialog.font.italic ? 1 : 0
fontWeight.currentIndex = weight[fontDialog.font.weight]
} }
onSetFont: {
if (debug) console.debug() ColorSelector {
fontDialog.font = Qt.font({ id: selectStyleColor
family: selectFont.text, text: i18n("Style color")
pointSize: fontSize.value > 0 ? fontSize.value : 12, value: plasmoid.configuration.textStyleColor
italic: fontStyle.currentIndex == 1,
weight: Font.Normal,
})
} }
} }

View File

@ -52,21 +52,10 @@ Item {
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
title: i18n("ACPI") title: i18n("ACPI")
Row { LineSelector {
height: implicitHeight text: i18n("ACPI path")
width: parent.width value: cfg_dataengine["ACPIPATH"]
QtControls.Label { onValueEdited: cfg_dataengine["ACPIPATH"] = newValue
height: parent.height
width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("ACPI path")
}
QtControls.TextField {
width: parent.width * 3 / 5
text: cfg_dataengine["ACPIPATH"]
onEditingFinished: cfg_dataengine["ACPIPATH"] = text
}
} }
} }
@ -74,30 +63,28 @@ Item {
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
title: i18n("GPU") title: i18n("GPU")
Row { ComboBoxSelector {
height: implicitHeight model: [
width: parent.width {
QtControls.Label { 'label': "auto",
height: parent.height 'name': "auto"
width: parent.width * 2 / 5 },
horizontalAlignment: Text.AlignRight {
verticalAlignment: Text.AlignVCenter 'label': "disable",
text: i18n("GPU device") 'name': "disable"
} },
QtControls.ComboBox { {
id: gpuDev 'label': "ati",
width: parent.width * 3 / 5 'name': "ati"
model: ["auto", "disable", "ati", "nvidia"] },
Component.onCompleted: { {
if (debug) console.debug() 'label': "nvidia",
for (var i=0; i<model.length; i++) { 'name': "nvidia"
if (model[i] == cfg_dataengine["GPUDEV"]) {
if (debug) console.info("Found", model[i], "on", i)
currentIndex = i;
}
}
} }
} ]
text: i18n("GPU device")
value: cfg_dataengine["GPUDEV"]
onValueEdited: cfg_dataengine["GPUDEV"] = newValue
} }
} }
@ -108,37 +95,17 @@ Item {
Column { Column {
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
Row { ComboBoxSelector {
height: implicitHeight id: hdd
width: parent.width text: i18n("HDD")
QtControls.Label { value: cfg_dataengine["HDDDEV"]
height: parent.height onValueEdited: cfg_dataengine["HDDDEV"] = newValue
width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("HDD")
}
QtControls.ComboBox {
id: hdd
width: parent.width * 3 / 5
}
} }
Row { LineSelector {
height: implicitHeight text: i18n("hddtemp cmd")
width: parent.width value: cfg_dataengine["HDDTEMPCMD"]
QtControls.Label { onValueEdited: cfg_dataengine["HDDTEMPCMD"] = newValue
height: parent.height
width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("hddtemp cmd")
}
QtControls.TextField {
width: parent.width * 3 / 5
text: cfg_dataengine["HDDTEMPCMD"]
onEditingFinished: cfg_dataengine["HDDTEMPCMD"] = text
}
} }
} }
} }
@ -150,107 +117,93 @@ Item {
Column { Column {
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
Row { IntegerSelector {
height: implicitHeight maximumValue: 100
width: parent.width minimumValue: 1
QtControls.Label { stepSize: 1
height: parent.height text: i18n("Player data symbols")
width: parent.width * 2 / 5 value: cfg_dataengine["PLAYERSYMBOLS"]
horizontalAlignment: Text.AlignRight onValueEdited: cfg_dataengine["PLAYERSYMBOLS"] = newValue
verticalAlignment: Text.AlignVCenter
text: i18n("Player data symbols")
}
QtControls.SpinBox {
width: parent.width * 3 / 5
minimumValue: 1
maximumValue: 100
stepSize: 1
value: cfg_dataengine["PLAYERSYMBOLS"]
onEditingFinished: cfg_dataengine["PLAYERSYMBOLS"] = value
}
} }
Row { ComboBoxSelector {
height: implicitHeight model: [
width: parent.width {
QtControls.Label { 'label': "disable",
height: parent.height 'name': "disable"
width: parent.width * 2 / 5 },
horizontalAlignment: Text.AlignRight {
verticalAlignment: Text.AlignVCenter 'label': "mpris",
text: i18n("Music player") 'name': "mpris"
} },
QtControls.ComboBox { {
id: player 'label': "mpd",
width: parent.width * 3 / 5 'name': "mpd"
model: ["disable", "mpris", "mpd"]
Component.onCompleted: {
if (debug) console.debug()
for (var i=0; i<model.length; i++) {
if (model[i] == cfg_dataengine["PLAYER"]) {
if (debug) console.info("Found", model[i], "on", i)
player.currentIndex = i;
}
}
} }
} ]
text: i18n("Music player")
value: cfg_dataengine["PLAYER"]
onValueEdited: cfg_dataengine["PLAYER"] = newValue
} }
Row { ComboBoxSelector {
height: implicitHeight id: mpris
width: parent.width editable: true
QtControls.Label { model: [
height: parent.height {
width: parent.width * 2 / 5 'label': 'auto',
horizontalAlignment: Text.AlignRight 'name': 'auto'
verticalAlignment: Text.AlignVCenter },
text: i18n("MPRIS player name") {
} 'label': 'amarok',
QtControls.ComboBox { 'name': 'amarok'
id: mpris },
width: parent.width * 3 / 5 {
editable: true 'label': 'audacious',
model: ["auto", "amarok", "audacious", "clementine", "deadbeef", 'name': 'audacious'
"vlc", "qmmp", "xmms2", cfg_dataengine["MPRIS"]] },
currentIndex: model.length - 1 {
} 'label': 'clementine',
'name': 'clementine'
},
{
'label': 'DeaDBeeF',
'name': 'DeaDBeeF'
},
{
'label': 'vlc',
'name': 'vlc'
},
{
'label': 'qmmp',
'name': 'qmmp'
},
{
'label': 'xmms2',
'name': 'xmms2'
},
{
'label': cfg_dataengine["MPRIS"],
'name': cfg_dataengine["MPRIS"]
}
]
text: i18n("MPRIS player name")
currentIndex: model.length - 1
} }
Row { LineSelector {
height: implicitHeight text: i18n("MPD address")
width: parent.width value: cfg_dataengine["MPDADDRESS"]
QtControls.Label { onValueEdited: cfg_dataengine["MPDADDRESS"] = newValue
height: parent.height
width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("MPD address")
}
QtControls.TextField {
width: parent.width * 3 / 5
text: cfg_dataengine["MPDADDRESS"]
onEditingFinished: cfg_dataengine["MPDADDRESS"] = text
}
} }
Row { IntegerSelector {
height: implicitHeight maximumValue: 65535
width: parent.width minimumValue: 1000
QtControls.Label { stepSize: 1
height: parent.height text: i18n("MPD port")
width: parent.width * 2 / 5 value: cfg_dataengine["MPDPORT"]
horizontalAlignment: Text.AlignRight onValueEdited: cfg_dataengine["MPDPORT"] = newValue
verticalAlignment: Text.AlignVCenter
text: i18n("MPD port")
}
QtControls.SpinBox {
width: parent.width * 3 / 5
minimumValue: 1000
maximumValue: 65535
stepSize: 1
value: cfg_dataengine["MPDPORT"]
onEditingFinished: cfg_dataengine["MPDPORT"] = value
}
} }
} }
} }
@ -262,72 +215,29 @@ Item {
Column { Column {
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
Row { ButtonSelector {
height: implicitHeight value: i18n("Custom scripts")
width: parent.width onButtonActivated: awKeys.editItem("extscript")
QtControls.Label {
height: parent.height
width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("Custom scripts")
}
QtControls.Button {
width: parent.width * 3 / 5
text: i18n("Edit scripts")
onClicked: awKeys.editItem("extscript")
}
} }
Row { ButtonSelector {
height: implicitHeight value: i18n("Network requests")
width: parent.width onButtonActivated: awKeys.editItem("extnetworkrequest")
QtControls.Label {
height: parent.height
width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("Quotes monitor")
}
QtControls.Button {
width: parent.width * 3 / 5
text: i18n("Edit tickers")
onClicked: awKeys.editItem("extquotes")
}
} }
Row { ButtonSelector {
height: implicitHeight value: i18n("Package manager")
width: parent.width onButtonActivated: awKeys.editItem("extupgrade")
QtControls.Label {
height: parent.height
width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("Package manager")
}
QtControls.Button {
width: parent.width * 3 / 5
text: i18n("Edit command")
onClicked: awKeys.editItem("extupgrade")
}
} }
Row { ButtonSelector {
height: implicitHeight value: i18n("Quotes monitor")
width: parent.width onButtonActivated: awKeys.editItem("extquotes")
QtControls.Label { }
height: parent.height
width: parent.width * 2 / 5 ButtonSelector {
horizontalAlignment: Text.AlignRight value: i18n("Weather")
verticalAlignment: Text.AlignVCenter onButtonActivated: awKeys.editItem("extweather")
text: i18n("Weather")
}
QtControls.Button {
width: parent.width * 3 / 5
text: i18n("Edit weather")
onClicked: awKeys.editItem("extweather")
}
} }
} }
} }
@ -342,21 +252,13 @@ Item {
// update hdd model // update hdd model
hdd.model = awKeys.getHddDevices() hdd.model = awKeys.getHddDevices()
for (var i=0; i<hdd.model.length; i++) { hdd.onCompleted
if (hdd.model[i] == cfg_dataengine["HDDDEV"]) {
if (debug) console.info("Found", hdd.model[i], "on", i)
hdd.currentIndex = i;
}
}
} }
Component.onDestruction: { Component.onDestruction: {
if (debug) console.debug() if (debug) console.debug()
cfg_dataengine["GPUDEV"] = gpuDev.currentText cfg_dataengine["MPRIS"] = mpris.editText
cfg_dataengine["HDDDEV"] = hdd.currentText
cfg_dataengine["PLAYER"] = player.currentText
cfg_dataengine["MPRIS"] = mpris.currentText
awConfig.writeDataEngineConfiguration(cfg_dataengine) awConfig.writeDataEngineConfiguration(cfg_dataengine)
} }
} }

View File

@ -36,6 +36,12 @@ Item {
AWActions { AWActions {
id: awActions id: awActions
} }
AWTelemetryHandler {
id: awTelemetryHandler
}
BugReport {
id: bugReport
}
property bool debug: awActions.isDebugEnabled() property bool debug: awActions.isDebugEnabled()
property variant tooltipSettings: { property variant tooltipSettings: {
@ -84,19 +90,22 @@ Item {
// ui // ui
Text { Text {
id: text id: text
anchors.fill: Plasmoid.Layout anchors.fill: parent
renderType: Text.NativeRendering renderType: Text.NativeRendering
textFormat: Text.RichText textFormat: Text.RichText
wrapMode: plasmoid.configuration.wrapText ? Text.WordWrap : Text.NoWrap wrapMode: plasmoid.configuration.wrapText ? Text.WordWrap : Text.NoWrap
horizontalAlignment: general.align[plasmoid.configuration.textAlign] horizontalAlignment: General.align[plasmoid.configuration.textAlign]
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
color: plasmoid.configuration.fontColor color: plasmoid.configuration.fontColor
font.family: plasmoid.configuration.fontFamily font.family: plasmoid.configuration.fontFamily
font.italic: plasmoid.configuration.fontStyle == "italic" ? true : false font.italic: plasmoid.configuration.fontStyle == "italic" ? true : false
font.pointSize: plasmoid.configuration.fontSize font.pointSize: plasmoid.configuration.fontSize
font.weight: general.fontWeight[plasmoid.configuration.fontWeight] font.weight: General.fontWeight[plasmoid.configuration.fontWeight]
style: General.textStyle[plasmoid.configuration.textStyle]
styleColor: plasmoid.configuration.textStyleColor
PlasmaCore.ToolTipArea { PlasmaCore.ToolTipArea {
height: tooltip.height height: tooltip.height
@ -141,6 +150,7 @@ Item {
plasmoid.setAction("requestKey", i18n("Request key"), "utilities-system-monitor") plasmoid.setAction("requestKey", i18n("Request key"), "utilities-system-monitor")
plasmoid.setAction("showReadme", i18n("Show README"), "text-x-readme") plasmoid.setAction("showReadme", i18n("Show README"), "text-x-readme")
plasmoid.setAction("checkUpdates", i18n("Check updates"), "system-software-update") 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
@ -200,6 +210,15 @@ 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
awTelemetryHandler.init(plasmoid.configuration.telemetryCount,
plasmoid.configuration.telemetryRemote,
plasmoid.configuration.telemetryId)
if (awTelemetryHandler.put("awwidgetconfig", plasmoid.configuration.text))
awTelemetryHandler.uploadTelemetry("awwidgetconfig", plasmoid.configuration.text)
} }
@ -215,10 +234,25 @@ Item {
return awActions.showReadme() return awActions.showReadme()
} }
function action_reportBug() {
if (debug) console.debug()
bugReport.reset()
bugReport.open()
}
function action_requestKey() { function action_requestKey() {
if (debug) console.debug() if (debug) console.debug()
tagSelectorBox.model = awKeys.dictKeys(true) tagSelectorBox.model = awKeys.dictKeys(true)
return tagSelector.open() return tagSelector.open()
} }
// code from http://stackoverflow.com/questions/105034/create-guid-uuid-in-javascript
function generateUuid() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
} }

View File

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

View File

@ -17,8 +17,6 @@
import QtQuick 2.0 import QtQuick 2.0
import QtQuick.Controls 1.3 as QtControls import QtQuick.Controls 1.3 as QtControls
import QtQuick.Controls.Styles 1.3 as QtStyles
import QtQuick.Dialogs 1.1 as QtDialogs
import org.kde.plasma.private.awesomewidget 1.0 import org.kde.plasma.private.awesomewidget 1.0
@ -39,21 +37,21 @@ Item {
property alias cfg_tooltipNumber: tooltipNumber.value property alias cfg_tooltipNumber: tooltipNumber.value
property alias cfg_useTooltipBackground: useTooltipBackground.checked property alias cfg_useTooltipBackground: useTooltipBackground.checked
property alias cfg_tooltipBackground: tooltipBackground.text property alias cfg_tooltipBackground: tooltipBackground.value
property alias cfg_cpuTooltip: cpuTooltip.checked property alias cfg_cpuTooltip: cpuTooltip.checked
property alias cfg_cpuTooltipColor: cpuTooltipColor.text property alias cfg_cpuTooltipColor: cpuTooltipColor.value
property alias cfg_cpuclTooltip: cpuclTooltip.checked property alias cfg_cpuclTooltip: cpuclTooltip.checked
property alias cfg_cpuclTooltipColor: cpuclTooltipColor.text property alias cfg_cpuclTooltipColor: cpuclTooltipColor.value
property alias cfg_memTooltip: memTooltip.checked property alias cfg_memTooltip: memTooltip.checked
property alias cfg_memTooltipColor: memTooltipColor.text property alias cfg_memTooltipColor: memTooltipColor.value
property alias cfg_swapTooltip: swapTooltip.checked property alias cfg_swapTooltip: swapTooltip.checked
property alias cfg_swapTooltipColor: swapTooltipColor.text property alias cfg_swapTooltipColor: swapTooltipColor.value
property alias cfg_downkbTooltip: downkbTooltip.checked property alias cfg_downkbTooltip: downkbTooltip.checked
property alias cfg_downkbTooltipColor: downkbTooltipColor.text property alias cfg_downkbTooltipColor: downkbTooltipColor.value
property alias cfg_upkbTooltipColor: upkbTooltipColor.text property alias cfg_upkbTooltipColor: upkbTooltipColor.value
property alias cfg_batTooltip: batTooltip.checked property alias cfg_batTooltip: batTooltip.checked
property alias cfg_batTooltipColor: batTooltipColor.text property alias cfg_batTooltipColor: batTooltipColor.value
property alias cfg_batInTooltipColor: batInTooltipColor.text property alias cfg_batInTooltipColor: batInTooltipColor.value
Column { Column {
@ -67,24 +65,13 @@ Item {
text: i18n("CPU, CPU clock, memory, swap and network labels support graphical tooltip. To enable them just make needed checkbox checked.") text: i18n("CPU, CPU clock, memory, swap and network labels support graphical tooltip. To enable them just make needed checkbox checked.")
} }
Row { IntegerSelector {
height: implicitHeight id: tooltipNumber
width: parent.width maximumValue: 1000
QtControls.Label { minimumValue: 50
height: parent.height stepSize: 25
width: parent.width * 2 / 5 text: i18n("Number of values for tooltips")
horizontalAlignment: Text.AlignRight value: plasmoid.configuration.tooltipNumber
verticalAlignment: Text.AlignVCenter
text: i18n("Number of values for tooltips")
}
QtControls.SpinBox {
id: tooltipNumber
width: parent.width * 3 / 5
minimumValue: 50
maximumValue: 1000
stepSize: 25
value: plasmoid.configuration.tooltipNumber
}
} }
QtControls.GroupBox { QtControls.GroupBox {
@ -93,34 +80,10 @@ Item {
width: parent.width width: parent.width
checkable: true checkable: true
title: i18n("Background") title: i18n("Background")
Row { ColorSelector {
height: implicitHeight id: tooltipBackground
width: parent.width text: i18n("Background color")
QtControls.Label { value: plasmoid.configuration.tooltipBackground
height: parent.height
width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("Background color")
}
QtControls.Button {
id: tooltipBackground
width: parent.width * 3 / 5
style: QtStyles.ButtonStyle {
background: Rectangle {
color: plasmoid.configuration.tooltipBackground
}
}
text: plasmoid.configuration.tooltipBackground
onClicked: tooltipBackgroundDialog.visible = true
}
QtDialogs.ColorDialog {
id: tooltipBackgroundDialog
title: i18n("Select a color")
color: tooltipBackground.text
onAccepted: tooltipBackground.text = tooltipBackgroundDialog.color
}
} }
} }
@ -130,34 +93,10 @@ Item {
width: parent.width width: parent.width
checkable: true checkable: true
title: i18n("CPU") title: i18n("CPU")
Row { ColorSelector {
height: implicitHeight id: cpuTooltipColor
width: parent.width text: i18n("CPU color")
QtControls.Label { value: plasmoid.configuration.cpuTooltipColor
height: parent.height
width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("CPU color")
}
QtControls.Button {
id: cpuTooltipColor
width: parent.width * 3 / 5
style: QtStyles.ButtonStyle {
background: Rectangle {
color: plasmoid.configuration.cpuTooltipColor
}
}
text: plasmoid.configuration.cpuTooltipColor
onClicked: cpuTooltipColorDialog.visible = true
}
QtDialogs.ColorDialog {
id: cpuTooltipColorDialog
title: i18n("Select a color")
color: cpuTooltipColor.text
onAccepted: cpuTooltipColor.text = cpuTooltipColorDialog.color
}
} }
} }
@ -167,34 +106,10 @@ Item {
width: parent.width width: parent.width
checkable: true checkable: true
title: i18n("CPU clock") title: i18n("CPU clock")
Row { ColorSelector {
height: implicitHeight id: cpuclTooltipColor
width: parent.width text: i18n("CPU clock color")
QtControls.Label { value: plasmoid.configuration.cpuclTooltipColor
height: parent.height
width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("CPU clock color")
}
QtControls.Button {
id: cpuclTooltipColor
width: parent.width * 3 / 5
style: QtStyles.ButtonStyle {
background: Rectangle {
color: plasmoid.configuration.cpuclTooltipColor
}
}
text: plasmoid.configuration.cpuclTooltipColor
onClicked: cpuclTooltipColorDialog.visible = true
}
QtDialogs.ColorDialog {
id: cpuclTooltipColorDialog
title: i18n("Select a color")
color: cpuclTooltipColor.text
onAccepted: cpuclTooltipColor.text = cpuclTooltipColorDialog.color
}
} }
} }
@ -204,34 +119,10 @@ Item {
width: parent.width width: parent.width
checkable: true checkable: true
title: i18n("Memory") title: i18n("Memory")
Row { ColorSelector {
height: implicitHeight id: memTooltipColor
width: parent.width text: i18n("Memory color")
QtControls.Label { value: plasmoid.configuration.memTooltipColor
height: parent.height
width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("Memory color")
}
QtControls.Button {
id: memTooltipColor
width: parent.width * 3 / 5
style: QtStyles.ButtonStyle {
background: Rectangle {
color: plasmoid.configuration.memTooltipColor
}
}
text: plasmoid.configuration.memTooltipColor
onClicked: memTooltipColorDialog.visible = true
}
QtDialogs.ColorDialog {
id: memTooltipColorDialog
title: i18n("Select a color")
color: memTooltipColor.text
onAccepted: memTooltipColor.text = memTooltipColorDialog.color
}
} }
} }
@ -241,34 +132,10 @@ Item {
width: parent.width width: parent.width
checkable: true checkable: true
title: i18n("Swap") title: i18n("Swap")
Row { ColorSelector {
height: implicitHeight id: swapTooltipColor
width: parent.width text: i18n("Swap color")
QtControls.Label { value: plasmoid.configuration.swapTooltipColor
height: parent.height
width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("Swap color")
}
QtControls.Button {
id: swapTooltipColor
width: parent.width * 3 / 5
style: QtStyles.ButtonStyle {
background: Rectangle {
color: plasmoid.configuration.swapTooltipColor
}
}
text: plasmoid.configuration.swapTooltipColor
onClicked: swapTooltipColorDialog.visible = true
}
QtDialogs.ColorDialog {
id: swapTooltipColorDialog
title: i18n("Select a color")
color: swapTooltipColor.text
onAccepted: swapTooltipColor.text = swapTooltipColorDialog.color
}
} }
} }
@ -281,63 +148,15 @@ Item {
Column { Column {
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
Row { ColorSelector {
height: implicitHeight id: downkbTooltipColor
width: parent.width text: i18n("Download speed color")
QtControls.Label { value: plasmoid.configuration.downkbTooltipColor
height: parent.height
width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("Download speed color")
}
QtControls.Button {
id: downkbTooltipColor
width: parent.width * 3 / 5
style: QtStyles.ButtonStyle {
background: Rectangle {
color: plasmoid.configuration.downkbTooltipColor
}
}
text: plasmoid.configuration.downkbTooltipColor
onClicked: downkbTooltipColorDialog.visible = true
}
QtDialogs.ColorDialog {
id: downkbTooltipColorDialog
title: i18n("Select a color")
color: downkbTooltipColor.text
onAccepted: downkbTooltipColor.text = downkbTooltipColorDialog.color
}
} }
Row { ColorSelector {
height: implicitHeight id: upkbTooltipColor
width: parent.width text: i18n("Upload speed color")
QtControls.Label { value: plasmoid.configuration.upkbTooltipColor
height: parent.height
width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("Upload speed color")
}
QtControls.Button {
id: upkbTooltipColor
width: parent.width * 3 / 5
style: QtStyles.ButtonStyle {
background: Rectangle {
color: plasmoid.configuration.upkbTooltipColor
}
}
text: plasmoid.configuration.upkbTooltipColor
onClicked: upkbTooltipColorDialog.visible = true
}
QtDialogs.ColorDialog {
id: upkbTooltipColorDialog
title: i18n("Select a color")
color: upkbTooltipColor.text
onAccepted: upkbTooltipColor.text = upkbTooltipColorDialog.color
}
} }
} }
} }
@ -351,63 +170,15 @@ Item {
Column { Column {
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
Row { ColorSelector {
height: implicitHeight id: batTooltipColor
width: parent.width text: i18n("Battery active color")
QtControls.Label { value: plasmoid.configuration.batTooltipColor
height: parent.height
width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("Battery active color")
}
QtControls.Button {
id: batTooltipColor
width: parent.width * 3 / 5
style: QtStyles.ButtonStyle {
background: Rectangle {
color: plasmoid.configuration.batTooltipColor
}
}
text: plasmoid.configuration.batTooltipColor
onClicked: batTooltipColorDialog.visible = true
}
QtDialogs.ColorDialog {
id: batTooltipColorDialog
title: i18n("Select a color")
color: batTooltipColor.text
onAccepted: batTooltipColor.text = batTooltipColorDialog.color
}
} }
Row { ColorSelector {
height: implicitHeight id: batInTooltipColor
width: parent.width text: i18n("Battery inactive color")
QtControls.Label { value: plasmoid.configuration.batInTooltipColor
height: parent.height
width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("Battery inactive color")
}
QtControls.Button {
id: batInTooltipColor
width: parent.width * 3 / 5
style: QtStyles.ButtonStyle {
background: Rectangle {
color: plasmoid.configuration.batInTooltipColor
}
}
text: plasmoid.configuration.batInTooltipColor
onClicked: batInTooltipColorDialog.visible = true
}
QtDialogs.ColorDialog {
id: batInTooltipColorDialog
title: i18n("Select a color")
color: batInTooltipColor.text
onAccepted: batInTooltipColor.text = batInTooltipColorDialog.color
}
} }
} }
} }

View File

@ -15,11 +15,10 @@
* 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.2
import QtQuick.Controls 1.3 as QtControls
import QtQuick.Dialogs 1.2 as QtDialogs
import org.kde.plasma.private.awesomewidget 1.0 import org.kde.plasma.private.awesomewidget 1.0
import "."
Item { Item {
@ -48,308 +47,33 @@ Item {
Column { Column {
id: pageColumn id: pageColumn
anchors.fill: parent anchors.fill: parent
QtControls.Label {
width: parent.width AWInfoLabel {}
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter HtmlDefaultFunctionsBar {
wrapMode: Text.WordWrap textArea: textPattern
text: i18n("Detailed information may be found on <a href=\"https://arcanis.me/projects/awesome-widgets/\">project homepage</a>")
onLinkActivated: Qt.openUrlExternally(link);
} }
Row { AWTagSelector {
height: implicitHeight backend: awKeys
width: parent.width notifyBackend: awActions
QtControls.Button { textArea: textPattern
width: parent.width * 3 / 15 groups: General.awTagRegexp
text: i18n("Bgcolor")
onClicked: backgroundDialog.visible = true
QtDialogs.ColorDialog {
id: backgroundDialog
title: i18n("Select a color")
onAccepted: {
var text = textPattern.text
textPattern.text = "<body bgcolor=\"" +
backgroundDialog.color + "\">" +
text + "</body>"
}
}
}
QtControls.Button {
width: parent.width * 3 / 15
text: i18n("Font")
iconName: "font"
onClicked: {
if (debug) console.debug("Font button")
var defaultFont = {
"color": plasmoid.configuration.fontColor,
"family": plasmoid.configuration.fontFamily,
"size": plasmoid.configuration.fontSize
}
var font = awActions.getFont(defaultFont)
if (font.applied != 1) {
if (debug) console.debug("No font selected")
return
}
var selected = textPattern.selectedText
textPattern.remove(textPattern.selectionStart, textPattern.selectionEnd)
textPattern.insert(textPattern.cursorPosition,
"<span style=\"color:" + font.color +
"; font-family:'" + font.family +
"'; font-size:" + font.size + "pt;\">" +
selected + "</span>")
}
}
QtControls.Button {
width: parent.width / 15
iconName: "format-indent-more"
onClicked: {
if (debug) console.debug("Indent button")
var selected = textPattern.selectedText
textPattern.remove(textPattern.selectionStart, textPattern.selectionEnd)
textPattern.insert(textPattern.cursorPosition, selected + "<br>\n")
}
}
QtControls.Button {
width: parent.width / 15
iconName: "format-text-bold"
onClicked: {
if (debug) console.debug("Bold button")
var selected = textPattern.selectedText
textPattern.remove(textPattern.selectionStart, textPattern.selectionEnd)
textPattern.insert(textPattern.cursorPosition, "<b>" + selected + "</b>")
}
}
QtControls.Button {
width: parent.width / 15
iconName: "format-text-italic"
onClicked: {
if (debug) console.debug("Italic button")
var selected = textPattern.selectedText
textPattern.remove(textPattern.selectionStart, textPattern.selectionEnd)
textPattern.insert(textPattern.cursorPosition, "<i>" + selected + "</i>")
}
}
QtControls.Button {
width: parent.width / 15
iconName: "format-text-underline"
onClicked: {
if (debug) console.debug("Underline button")
var selected = textPattern.selectedText
textPattern.remove(textPattern.selectionStart, textPattern.selectionEnd)
textPattern.insert(textPattern.cursorPosition, "<u>" + selected + "</u>")
}
}
QtControls.Button {
width: parent.width / 15
iconName: "format-text-strikethrough"
onClicked: {
if (debug) console.debug("Strike button")
var selected = textPattern.selectedText
textPattern.remove(textPattern.selectionStart, textPattern.selectionEnd)
textPattern.insert(textPattern.cursorPosition, "<s>" + selected + "</s>")
}
}
QtControls.Button {
width: parent.width / 15
iconName: "format-justify-left"
onClicked: {
if (debug) console.debug("Left button")
var selected = textPattern.selectedText
textPattern.remove(textPattern.selectionStart, textPattern.selectionEnd)
textPattern.insert(textPattern.cursorPosition, "<p align=\"left\">" + selected + "</p>")
}
}
QtControls.Button {
width: parent.width / 15
iconName: "format-justify-center"
onClicked: {
if (debug) console.debug("Center button")
var selected = textPattern.selectedText
textPattern.remove(textPattern.selectionStart, textPattern.selectionEnd)
textPattern.insert(textPattern.cursorPosition, "<p align=\"center\">" + selected + "</p>")
}
}
QtControls.Button {
width: parent.width / 15
iconName: "format-justify-right"
onClicked: {
if (debug) console.debug("Right button")
var selected = textPattern.selectedText
textPattern.remove(textPattern.selectionStart, textPattern.selectionEnd)
textPattern.insert(textPattern.cursorPosition, "<p align=\"right\">" + selected + "</p>")
}
}
QtControls.Button {
width: parent.width / 15
iconName: "format-justify-fill"
onClicked: {
if (debug) console.debug("Justify button")
var selected = textPattern.selectedText
textPattern.remove(textPattern.selectionStart, textPattern.selectionEnd)
textPattern.insert(textPattern.cursorPosition, "<p align=\"justify\">" + selected + "</p>")
}
}
} }
Row { AWExtensions {
height: implicitHeight id: extensions
width: parent.width backend: awKeys
QtControls.ComboBox { textArea: textPattern
width: parent.width * 2 / 5 onUnlock: lock = false
textRole: "label"
model: [
{
'label': i18n("AC"),
'regexp': "^(ac|bat).*"
},
{
'label': i18n("Bars"),
'regexp': "^bar.*"
},
{
'label': i18n("CPU"),
'regexp': "^(cpu|gpu|la|ps|temp(?!erature)).*"
},
{
'label': i18n("Desktops"),
'regexp': "^(n|t)?desktop(s)?"
},
{
'label': i18n("HDD"),
'regexp': "^hdd.*"
},
{
'label': i18n("Memory"),
'regexp': "^(mem|swap).*"
},
{
'label': i18n("Network"),
'regexp': "^(netdev|(down|up(?!time)).*)"
},
{
'label': i18n("Music player"),
'regexp': "(^|d|s)(album|artist|duration|progress|title)"
},
{
'label': i18n("Scripts"),
'regexp': "^custom.*"
},
{
'label': i18n("Time"),
'regexp': ".*time$"
},
{
'label': i18n("Quotes"),
'regexp': "^(perc)?(ask|bid|price)(chg)?.*"
},
{
'label': i18n("Upgrades"),
'regexp': "^pkgcount.*"
},
{
'label': i18n("Weathers"),
'regexp': "^(weather(Id)?|humidity|pressure|temperature|timestamp)"
},
{
'label': i18n("Functions"),
'regexp': "functions"
}
]
onCurrentIndexChanged: {
if (debug) console.debug()
if (model[currentIndex]["regexp"] == "functions")
tags.model = ["{{\n\n}}", "template{{\n\n}}",
"aw_all<>{{}}", "aw_count<>{{}}", "aw_keys<>{{}}",
"aw_names<>{{}}"]
else
tags.model = awKeys.dictKeys(true, model[currentIndex]["regexp"])
if (debug) console.info("Init model", tags.model, "for", model[currentIndex]["label"])
tags.currentIndex = -1
}
}
QtControls.ComboBox {
id: tags
width: parent.width * 1 / 5
}
QtControls.Button {
width: parent.width * 1 / 5
text: i18n("Add")
onClicked: {
if (!tags.currentText) return
if (debug) console.debug("Add tag button")
var selected = textPattern.selectedText
textPattern.remove(textPattern.selectionStart, textPattern.selectionEnd)
textPattern.insert(textPattern.cursorPosition, selected + "$" + tags.currentText)
}
}
QtControls.Button {
width: parent.width * 1 / 5
text: i18n("Show value")
onClicked: {
if (!tags.currentText) return
if (debug) console.debug("Show tag button")
var message = i18n("Tag: %1", tags.currentText)
message += "<br>"
message += i18n("Value: %1", awKeys.valueByKey(tags.currentText))
message += "<br>"
message += i18n("Info: %1", awKeys.infoByKey(tags.currentText))
awActions.sendNotification("tag", message)
}
}
} }
Row { AWTextEditor {
height: implicitHeight
width: parent.width
QtControls.Button {
width: parent.width * 3 / 5
text: i18n("Edit bars")
onClicked: awKeys.editItem("graphicalitem")
}
QtControls.Button {
width: parent.width * 2 / 5
text: i18n("Preview")
onClicked: {
lock = false
awKeys.initKeys(textPattern.text, plasmoid.configuration.interval,
plasmoid.configuration.queueLimit, false)
}
}
}
QtControls.TextArea {
id: textPattern id: textPattern
width: parent.width backend: awKeys
height: parent.height * 4 / 5
textFormat: TextEdit.PlainText
text: plasmoid.configuration.text
} }
} }
QtDialogs.MessageDialog {
id: compiledText
modality: Qt.NonModal
title: i18n("Preview")
}
Component.onCompleted: { Component.onCompleted: {
if (debug) console.debug() if (debug) console.debug()
@ -370,8 +94,7 @@ Item {
if (lock) return if (lock) return
if (debug) console.debug() if (debug) console.debug()
compiledText.text = newText.replace(/&nbsp;/g, " ") extensions.showMessage(newText)
compiledText.open() lock = true
lock = true;
} }
} }

View File

@ -20,7 +20,7 @@ X-Plasma-RemoteLocation=
X-KDE-PluginInfo-Author=Evgeniy Alekseev aka arcanis X-KDE-PluginInfo-Author=Evgeniy Alekseev aka arcanis
X-KDE-PluginInfo-Email=esalexeev@gmail.com X-KDE-PluginInfo-Email=esalexeev@gmail.com
X-KDE-PluginInfo-Name=org.kde.plasma.awesomewidget X-KDE-PluginInfo-Name=org.kde.plasma.awesomewidget
X-KDE-PluginInfo-Version=3.1.2 X-KDE-PluginInfo-Version=3.3.2
X-KDE-PluginInfo-Website=https://arcanis.me/projects/awesome-widgets/ X-KDE-PluginInfo-Website=https://arcanis.me/projects/awesome-widgets/
X-KDE-PluginInfo-Category=System Information X-KDE-PluginInfo-Category=System Information
X-KDE-PluginInfo-Depends= X-KDE-PluginInfo-Depends=

View File

@ -11,9 +11,11 @@ include_directories(
) )
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_NOTIFY *.notifyrc) file(GLOB SUBPROJECT_NOTIFY *.notifyrc)
add_library(${PLUGIN_NAME} SHARED ${SUBPROJECT_SOURCE}) qt5_wrap_ui(SUBPROJECT_UI_HEADER ${SUBPROJECT_UI})
add_library(${PLUGIN_NAME} SHARED ${SUBPROJECT_SOURCE} ${SUBPROJECT_UI_HEADER})
target_link_libraries(${PLUGIN_NAME} ${PROJECT_LIBRARY} ${Qt_LIBRARIES} ${Kf5_LIBRARIES}) target_link_libraries(${PLUGIN_NAME} ${PROJECT_LIBRARY} ${Qt_LIBRARIES} ${Kf5_LIBRARIES})
install(TARGETS ${PLUGIN_NAME} DESTINATION ${QML_INSTALL_DIR}/org/kde/plasma/private/awesomewidget) install(TARGETS ${PLUGIN_NAME} DESTINATION ${QML_INSTALL_DIR}/org/kde/plasma/private/awesomewidget)

View File

@ -0,0 +1,81 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awabstractselector.h"
#include "ui_awabstractselector.h"
#include "awdebug.h"
AWAbstractSelector::AWAbstractSelector(QWidget *_parent,
const QPair<bool, bool> &_editable)
: QWidget(_parent)
, ui(new Ui::AWAbstractSelector)
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
ui->setupUi(this);
ui->comboBox_key->setEditable(_editable.first);
ui->comboBox_value->setEditable(_editable.second);
connect(ui->comboBox_key, SIGNAL(currentIndexChanged(int)), this,
SIGNAL(selectionChanged()));
connect(ui->comboBox_value, SIGNAL(currentIndexChanged(int)), this,
SIGNAL(selectionChanged()));
}
AWAbstractSelector::~AWAbstractSelector()
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
delete ui;
}
QPair<QString, QString> AWAbstractSelector::current() const
{
QString key = ui->comboBox_key->currentText();
QString value = ui->comboBox_value->currentText();
return QPair<QString, QString>(key, value);
}
void AWAbstractSelector::init(const QStringList &_keys,
const QStringList &_values,
const QPair<QString, QString> &_current)
{
if ((!_keys.contains(_current.first))
|| (!_values.contains(_current.second))) {
qCWarning(LOG_AW) << "Invalid current value" << _current
<< "not found in default ones";
return;
}
qCDebug(LOG_AW) << "Init selector with keys" << _keys << "and values"
<< _values << "and current ones are" << _current;
// set data
ui->comboBox_key->clear();
ui->comboBox_key->addItems(_keys);
ui->comboBox_value->clear();
ui->comboBox_value->addItems(_values);
// set current values
ui->comboBox_key->setCurrentText(_current.first);
ui->comboBox_value->setCurrentText(_current.second);
}

View File

@ -0,0 +1,51 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#ifndef AWABSTRACTSELECTOR_H
#define AWABSTRACTSELECTOR_H
#include <QWidget>
namespace Ui
{
class AWAbstractSelector;
}
class AWAbstractSelector : public QWidget
{
Q_OBJECT
public:
explicit AWAbstractSelector(QWidget *_parent = nullptr,
const QPair<bool, bool> &_editable
= {false, false});
virtual ~AWAbstractSelector();
QPair<QString, QString> current() const;
void init(const QStringList &_keys, const QStringList &_values,
const QPair<QString, QString> &_current);
signals:
void selectionChanged();
private:
Ui::AWAbstractSelector *ui = nullptr;
};
#endif /* AWABSTRACTSELECTOR_H */

View File

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>AWAbstractSelector</class>
<widget class="QWidget" name="AWAbstractSelector">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>25</height>
</rect>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QComboBox" name="comboBox_key"/>
</item>
<item>
<widget class="QComboBox" name="comboBox_value"/>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -21,6 +21,7 @@
#include <KNotifications/KNotification> #include <KNotifications/KNotification>
#include <QDesktopServices> #include <QDesktopServices>
#include <QFile>
#include <QProcess> #include <QProcess>
#include <QUrl> #include <QUrl>
@ -30,8 +31,8 @@
#include "awupdatehelper.h" #include "awupdatehelper.h"
AWActions::AWActions(QObject *parent) AWActions::AWActions(QObject *_parent)
: QObject(parent) : QObject(_parent)
{ {
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
@ -47,12 +48,29 @@ AWActions::~AWActions()
} }
void AWActions::checkUpdates(const bool showAnyway) void AWActions::checkUpdates(const bool _showAnyway)
{ {
qCDebug(LOG_AW) << "Show anyway" << showAnyway; qCDebug(LOG_AW) << "Show anyway" << _showAnyway;
if (!m_updateHelper->checkVersion()) if (!m_updateHelper->checkVersion())
m_updateHelper->checkUpdates(showAnyway); m_updateHelper->checkUpdates(_showAnyway);
}
QString AWActions::getFileContent(const QString &_path) const
{
qCDebug(LOG_AW) << "Get content from file" << _path;
QFile inputFile(_path);
if (!inputFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
qCWarning(LOG_AW) << "Could not open file as text"
<< inputFile.fileName();
return "";
}
QString output = inputFile.readAll();
inputFile.close();
return output;
} }
@ -63,13 +81,13 @@ bool AWActions::isDebugEnabled() const
} }
bool AWActions::runCmd(const QString cmd) const bool AWActions::runCmd(const QString &_cmd) const
{ {
qCDebug(LOG_AW) << "Cmd" << cmd; qCDebug(LOG_AW) << "Cmd" << _cmd;
sendNotification(QString("Info"), i18n("Run %1", cmd)); sendNotification(QString("Info"), i18n("Run %1", _cmd));
return QProcess::startDetached(cmd); return QProcess::startDetached(_cmd);
} }
@ -80,102 +98,59 @@ void AWActions::showReadme() const
} }
// HACK: this method uses variables from version.h void AWActions::showLegacyInfo() const
QString AWActions::getAboutText(const QString type) const
{ {
qCDebug(LOG_AW) << "Type" << type; 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);
QString text; msgBox->open();
if (type == QString("header")) {
text = QString(NAME);
} else if (type == QString("version")) {
text = i18n("Version %1 (build date %2)", QString(VERSION),
QString(BUILD_DATE));
if (!QString(COMMIT_SHA).isEmpty())
text += QString(" (%1)").arg(QString(COMMIT_SHA));
} else if (type == QString("description")) {
text = i18n("A set of minimalistic plasmoid widgets");
} else if (type == QString("links")) {
text = i18n("Links:") + QString("<br>")
+ QString("<a href=\"%1\">%2</a><br>")
.arg(QString(HOMEPAGE))
.arg(i18n("Homepage"))
+ QString("<a href=\"%1\">%2</a><br>")
.arg(QString(REPOSITORY))
.arg(i18n("Repository"))
+ QString("<a href=\"%1\">%2</a><br>")
.arg(QString(BUGTRACKER))
.arg(i18n("Bugtracker"))
+ QString("<a href=\"%1\">%2</a><br>")
.arg(QString(TRANSLATION))
.arg(i18n("Translation issue"))
+ QString("<a href=\"%1\">%2</a><br>")
.arg(QString(AUR_PACKAGES))
.arg(i18n("AUR packages"))
+ QString("<a href=\"%1\">%2</a>")
.arg(QString(OPENSUSE_PACKAGES))
.arg(i18n("openSUSE packages"));
} else if (type == QString("copy")) {
text = QString("<small>&copy; %1 <a href=\"mailto:%2\">%3</a><br>")
.arg(QString(DATE))
.arg(QString(EMAIL))
.arg(QString(AUTHOR))
+ i18n("This software is licensed under %1", QString(LICENSE))
+ QString("</small>");
} else if (type == QString("translators")) {
text = i18n("Translators: %1", QString(TRANSLATORS));
} else if (type == QString("3rdparty")) {
QStringList trdPartyList
= QString(TRDPARTY_LICENSE)
.split(QChar(';'), QString::SkipEmptyParts);
for (int i = 0; i < trdPartyList.count(); i++)
trdPartyList[i] = QString("<a href=\"%3\">%1</a> (%2 license)")
.arg(trdPartyList.at(i).split(QChar(','))[0])
.arg(trdPartyList.at(i).split(QChar(','))[1])
.arg(trdPartyList.at(i).split(QChar(','))[2]);
text = i18n("This software uses: %1", trdPartyList.join(QString(", ")));
} else if (type == QString("thanks")) {
QStringList thanks = QString(SPECIAL_THANKS)
.split(QChar(';'), QString::SkipEmptyParts);
for (int i = 0; i < thanks.count(); i++)
thanks[i] = QString("<a href=\"%2\">%1</a>")
.arg(thanks.at(i).split(QChar(','))[0])
.arg(thanks.at(i).split(QChar(','))[1]);
text = i18n("Special thanks to %1", thanks.join(QString(", ")));
}
return text;
} }
QVariantMap AWActions::getFont(const QVariantMap defaultFont) const // HACK: this method uses variables from version.h
QString AWActions::getAboutText(const QString &_type) const
{ {
qCDebug(LOG_AW) << "Default font is" << defaultFont; qCDebug(LOG_AW) << "Type" << _type;
return AWDebug::getAboutText(_type);
}
QVariantMap AWActions::getFont(const QVariantMap &_defaultFont) const
{
qCDebug(LOG_AW) << "Default font is" << _defaultFont;
QVariantMap fontMap; QVariantMap fontMap;
int ret = 0; int ret = 0;
CFont defaultCFont = CFont(defaultFont[QString("family")].toString(), CFont defaultCFont
defaultFont[QString("size")].toInt(), 400, false, = CFont(_defaultFont["family"].toString(), _defaultFont["size"].toInt(),
defaultFont[QString("color")].toString()); 400, false, _defaultFont["color"].toString());
CFont font = CFontDialog::getFont(i18n("Select font"), defaultCFont, false, CFont font = CFontDialog::getFont(i18n("Select font"), defaultCFont, false,
false, &ret); false, &ret);
fontMap[QString("applied")] = ret; fontMap["applied"] = ret;
fontMap[QString("color")] = font.color().name(); fontMap["color"] = font.color().name();
fontMap[QString("family")] = font.family(); fontMap["family"] = font.family();
fontMap[QString("size")] = font.pointSize(); fontMap["size"] = font.pointSize();
return fontMap; return fontMap;
} }
// to avoid additional object definition this method is static // to avoid additional object definition this method is static
void AWActions::sendNotification(const QString eventId, const QString message) void AWActions::sendNotification(const QString &_eventId,
const QString &_message)
{ {
qCDebug(LOG_AW) << "Event" << eventId << "with message" << message; qCDebug(LOG_AW) << "Event" << _eventId << "with message" << _message;
KNotification *notification = KNotification::event( KNotification *notification = KNotification::event(
eventId, QString("Awesome Widget ::: %1").arg(eventId), message); _eventId, QString("Awesome Widget ::: %1").arg(_eventId), _message);
notification->setComponentName( notification->setComponentName(
QString("plasma-applet-org.kde.plasma.awesome-widget")); "plasma-applet-org.kde.plasma.awesome-widget");
} }

View File

@ -19,6 +19,7 @@
#ifndef AWACTIONS_H #ifndef AWACTIONS_H
#define AWACTIONS_H #define AWACTIONS_H
#include <QMap>
#include <QObject> #include <QObject>
@ -29,20 +30,21 @@ class AWActions : public QObject
Q_OBJECT Q_OBJECT
public: public:
explicit AWActions(QObject *parent = nullptr); explicit AWActions(QObject *_parent = nullptr);
virtual ~AWActions(); virtual ~AWActions();
Q_INVOKABLE void checkUpdates(const bool showAnyway = false); Q_INVOKABLE void checkUpdates(const bool _showAnyway = false);
Q_INVOKABLE QString getFileContent(const QString &_path) const;
Q_INVOKABLE bool isDebugEnabled() const; Q_INVOKABLE bool isDebugEnabled() const;
Q_INVOKABLE bool runCmd(const QString cmd = QString("/usr/bin/true")) const; Q_INVOKABLE bool runCmd(const QString &_cmd) const;
Q_INVOKABLE void showLegacyInfo() const;
Q_INVOKABLE void showReadme() const; Q_INVOKABLE void showReadme() const;
// configuration slots // configuration slots
Q_INVOKABLE QString getAboutText(const QString type Q_INVOKABLE QString getAboutText(const QString &_type) const;
= QString("header")) const; Q_INVOKABLE QVariantMap getFont(const QVariantMap &_defaultFont) const;
Q_INVOKABLE QVariantMap getFont(const QVariantMap defaultFont) const;
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;

View File

@ -0,0 +1,163 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awbugreporter.h"
#include <KI18n/KLocalizedString>
#include <QDesktopServices>
#include <QJsonDocument>
#include <QJsonParseError>
#include <QMessageBox>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include "awdebug.h"
AWBugReporter::AWBugReporter(QObject *_parent)
: QObject(_parent)
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
}
AWBugReporter::~AWBugReporter()
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
}
void AWBugReporter::doConnect()
{
// additional method for testing needs
connect(this, SIGNAL(replyReceived(const int, const QString &)), this,
SLOT(showInformation(const int, const QString &)));
}
QString AWBugReporter::generateText(const QString &_description,
const QString &_reproduce,
const QString &_expected,
const QString &_logs) const
{
// do not log _logs here, it may have quite large size
qCDebug(LOG_AW) << "Generate text with description" << _description
<< "steps" << _reproduce << "and expected result"
<< _expected;
QString output;
output += QString("**Description**\n\n%1\n\n").arg(_description);
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("**Version**\n\n%1\n\n")
.arg(AWDebug::getBuildData().join(QString("\n")));
// append _logs
output += QString("**Logs**\n\n%1").arg(_logs);
return output;
}
void AWBugReporter::sendBugReport(const QString &_title, const QString &_body)
{
qCDebug(LOG_AW) << "Send bug report with title" << _title << "and body"
<< _body;
QNetworkAccessManager *manager = new QNetworkAccessManager(nullptr);
connect(manager, SIGNAL(finished(QNetworkReply *)), this,
SLOT(issueReplyRecieved(QNetworkReply *)));
QNetworkRequest request = QNetworkRequest(QUrl(BUGTRACKER_API));
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
// generate payload
QVariantMap payload;
payload["title"] = _title;
payload["body"] = _body;
payload["labels"] = QStringList() << "from application";
// 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 AWBugReporter::issueReplyRecieved(QNetworkReply *_reply)
{
if (_reply->error() != QNetworkReply::NoError) {
qCWarning(LOG_AW) << "An error occurs" << _reply->error()
<< "with message" << _reply->errorString();
return emit(replyReceived(0, ""));
}
QJsonParseError error;
QJsonDocument jsonDoc = QJsonDocument::fromJson(_reply->readAll(), &error);
if (error.error != QJsonParseError::NoError) {
qCWarning(LOG_AW) << "Parse error" << error.errorString();
return emit(replyReceived(0, ""));
}
_reply->deleteLater();
// convert to map
QVariantMap response = jsonDoc.toVariant().toMap();
QString url = response["html_url"].toString();
int number = response["number"].toInt();
return emit(replyReceived(number, url));
}
void AWBugReporter::showInformation(const int _number, const QString &_url)
{
qCDebug(LOG_AW) << "Created issue with number" << _number << "and url"
<< _url;
// cache url first
m_lastBugUrl = _url;
QMessageBox *msgBox = new QMessageBox(nullptr);
msgBox->setAttribute(Qt::WA_DeleteOnClose);
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 *)));
}
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;
}
}

View File

@ -0,0 +1,55 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#ifndef AWBUGREPORTER_H
#define AWBUGREPORTER_H
#include <QObject>
class QAbstractButton;
class QNetworkReply;
class AWBugReporter : public QObject
{
Q_OBJECT
public:
explicit AWBugReporter(QObject *_parent = nullptr);
virtual ~AWBugReporter();
Q_INVOKABLE void doConnect();
Q_INVOKABLE QString generateText(const QString &_description,
const QString &_reproduce,
const QString &_expected,
const QString &_logs) const;
Q_INVOKABLE void sendBugReport(const QString &_title, const QString &_body);
signals:
void replyReceived(const int _number, const QString &_url);
private slots:
void issueReplyRecieved(QNetworkReply *_reply);
void showInformation(const int _number, const QString &_url);
void userReplyOnBugReport(QAbstractButton *_button);
private:
QString m_lastBugUrl;
};
#endif /* AWBUGREPORTER_H */

View File

@ -27,8 +27,8 @@
#include "awdebug.h" #include "awdebug.h"
AWConfigHelper::AWConfigHelper(QObject *parent) AWConfigHelper::AWConfigHelper(QObject *_parent)
: QObject(parent) : QObject(_parent)
{ {
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
} }
@ -69,18 +69,17 @@ bool AWConfigHelper::dropCache() const
} }
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
QQmlPropertyMap *configuration const QQmlPropertyMap *configuration
= static_cast<QQmlPropertyMap *>(nativeConfig); = static_cast<const QQmlPropertyMap *>(_nativeConfig);
settings.beginGroup(QString("plasmoid")); settings.beginGroup("plasmoid");
for (auto key : configuration->keys()) { for (auto &key : configuration->keys()) {
QVariant value = configuration->value(key); QVariant value = configuration->value(key);
if (!value.isValid()) if (!value.isValid())
continue; continue;
@ -89,27 +88,29 @@ bool AWConfigHelper::exportConfiguration(QObject *nativeConfig,
settings.endGroup(); settings.endGroup();
// extensions // extensions
for (auto item : m_dirs) { for (auto &item : m_dirs) {
QStringList items QStringList items
= QDir(QString("%1/%2").arg(m_baseDir).arg(item)) = QDir(QString("%1/%2").arg(m_baseDir).arg(item))
.entryList(QStringList() << QString("*.desktop"), .entryList(QStringList() << "*.desktop", QDir::Files);
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);
settings.endGroup(); settings.endGroup();
} }
// additional files // additional files
settings.beginGroup(QString("json")); settings.beginGroup("json");
// script filters // script filters
readFile(settings, QString("filters"), readFile(settings, "filters",
QString("%1/scripts/awesomewidgets-extscripts-filters.json") QString("%1/scripts/awesomewidgets-extscripts-filters.json")
.arg(m_baseDir)); .arg(m_baseDir));
// weather icon settings // weather icon settings
readFile(settings, QString("weathers"), readFile(settings, "weathers",
QString("%1/weather/awesomewidgets-extweather-ids.json") QString("%1/weather/awesomewidgets-extweather-ids.json")
.arg(m_baseDir)); .arg(m_baseDir));
// formatter settings
readFile(settings, "formatters",
QString("%1/formatters/formatters.ini").arg(m_baseDir));
settings.endGroup(); settings.endGroup();
// sync settings // sync settings
@ -119,44 +120,47 @@ 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 _importExtensions,
const bool importAdds) const const bool _importAdds) const
{ {
qCDebug(LOG_AW) << "Selected filename" << fileName; qCDebug(LOG_AW) << "Selected filename" << _fileName;
QVariantMap configuration; QVariantMap configuration;
QSettings settings(fileName, QSettings::IniFormat); QSettings settings(_fileName, QSettings::IniFormat);
// extensions // extensions
if (importExtensions) { if (_importExtensions) {
for (auto item : m_dirs) { for (auto &item : m_dirs) {
settings.beginGroup(item); settings.beginGroup(item);
for (auto it : settings.childGroups()) for (auto &it : settings.childGroups())
copyExtensions(it, item, settings, true); copyExtensions(it, item, settings, true);
settings.endGroup(); settings.endGroup();
} }
} }
// additional files // additional files
if (importAdds) { if (_importAdds) {
settings.beginGroup(QString("json")); settings.beginGroup("json");
// script filters // script filters
writeFile(settings, QString("filters"), writeFile(settings, "filters",
QString("%1/scripts/awesomewidgets-extscripts-filters.json") QString("%1/scripts/awesomewidgets-extscripts-filters.json")
.arg(m_baseDir)); .arg(m_baseDir));
// weather icon settings // weather icon settings
writeFile(settings, QString("weathers"), writeFile(settings, "weathers",
QString("%1/weather/awesomewidgets-extweather-ids.json") QString("%1/weather/awesomewidgets-extweather-ids.json")
.arg(m_baseDir)); .arg(m_baseDir));
// formatter settings
writeFile(settings, "formatters",
QString("%1/formatters/formatters.ini").arg(m_baseDir));
settings.endGroup(); settings.endGroup();
} }
// plasmoid configuration // plasmoid configuration
if (importPlasmoid) { if (_importPlasmoid) {
settings.beginGroup(QString("plasmoid")); settings.beginGroup("plasmoid");
for (auto key : settings.childKeys()) for (auto &key : settings.childKeys())
configuration[key] = settings.value(key); configuration[key] = settings.value(key);
settings.endGroup(); settings.endGroup();
} }
@ -167,32 +171,24 @@ QVariantMap AWConfigHelper::importConfiguration(const QString fileName,
QVariantMap AWConfigHelper::readDataEngineConfiguration() const QVariantMap AWConfigHelper::readDataEngineConfiguration() const
{ {
QString fileName QString fileName = QStandardPaths::locate(
= QStandardPaths::locate(QStandardPaths::ConfigLocation, QStandardPaths::ConfigLocation, "plasma-dataengine-extsysmon.conf");
QString("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(QString("Configuration")); settings.beginGroup("Configuration");
configuration[QString("ACPIPATH")] = settings.value( configuration["ACPIPATH"]
QString("ACPIPATH"), QString("/sys/class/power_supply/")); = settings.value("ACPIPATH", "/sys/class/power_supply/");
configuration[QString("GPUDEV")] configuration["GPUDEV"] = settings.value("GPUDEV", "auto");
= settings.value(QString("GPUDEV"), QString("auto")); configuration["HDDDEV"] = settings.value("HDDDEV", "all");
configuration[QString("HDDDEV")] configuration["HDDTEMPCMD"]
= settings.value(QString("HDDDEV"), QString("all")); = settings.value("HDDTEMPCMD", "sudo smartctl -a");
configuration[QString("HDDTEMPCMD")] configuration["MPDADDRESS"] = settings.value("MPDADDRESS", "localhost");
= settings.value(QString("HDDTEMPCMD"), QString("sudo smartctl -a")); configuration["MPDPORT"] = settings.value("MPDPORT", "6600");
configuration[QString("MPDADDRESS")] configuration["MPRIS"] = settings.value("MPRIS", "auto");
= settings.value(QString("MPDADDRESS"), QString("localhost")); configuration["PLAYER"] = settings.value("PLAYER", "mpris");
configuration[QString("MPDPORT")] configuration["PLAYERSYMBOLS"] = settings.value("PLAYERSYMBOLS", "10");
= settings.value(QString("MPDPORT"), QString("6600"));
configuration[QString("MPRIS")]
= settings.value(QString("MPRIS"), QString("auto"));
configuration[QString("PLAYER")]
= settings.value(QString("PLAYER"), QString("mpris"));
configuration[QString("PLAYERSYMBOLS")]
= settings.value(QString("PLAYERSYMBOLS"), QString("10"));
settings.endGroup(); settings.endGroup();
qCInfo(LOG_AW) << "Configuration" << configuration; qCInfo(LOG_AW) << "Configuration" << configuration;
@ -201,49 +197,48 @@ QVariantMap AWConfigHelper::readDataEngineConfiguration() const
} }
void AWConfigHelper::writeDataEngineConfiguration( bool AWConfigHelper::writeDataEngineConfiguration(
const QVariantMap configuration) const const QVariantMap &_configuration) const
{ {
qCDebug(LOG_AW) << "Configuration" << configuration; qCDebug(LOG_AW) << "Configuration" << _configuration;
QString fileName QString fileName = QString("%1/plasma-dataengine-extsysmon.conf")
= QStandardPaths::writableLocation(QStandardPaths::ConfigLocation) .arg(QStandardPaths::writableLocation(
+ QString("/plasma-dataengine-extsysmon.conf"); 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(QString("Configuration")); settings.beginGroup("Configuration");
settings.setValue(QString("ACPIPATH"), configuration[QString("ACPIPATH")]); settings.setValue("ACPIPATH", _configuration["ACPIPATH"]);
settings.setValue(QString("GPUDEV"), configuration[QString("GPUDEV")]); settings.setValue("GPUDEV", _configuration["GPUDEV"]);
settings.setValue(QString("HDDDEV"), configuration[QString("HDDDEV")]); settings.setValue("HDDDEV", _configuration["HDDDEV"]);
settings.setValue(QString("HDDTEMPCMD"), settings.setValue("HDDTEMPCMD", _configuration["HDDTEMPCMD"]);
configuration[QString("HDDTEMPCMD")]); settings.setValue("MPDADDRESS", _configuration["MPDADDRESS"]);
settings.setValue(QString("MPDADDRESS"), settings.setValue("MPDPORT", _configuration["MPDPORT"]);
configuration[QString("MPDADDRESS")]); settings.setValue("MPRIS", _configuration["MPRIS"]);
settings.setValue(QString("MPDPORT"), configuration[QString("MPDPORT")]); settings.setValue("PLAYER", _configuration["PLAYER"]);
settings.setValue(QString("MPRIS"), configuration[QString("MPRIS")]); settings.setValue("PLAYERSYMBOLS", _configuration["PLAYERSYMBOLS"]);
settings.setValue(QString("PLAYER"), configuration[QString("PLAYER")]);
settings.setValue(QString("PLAYERSYMBOLS"),
configuration[QString("PLAYERSYMBOLS")]);
settings.endGroup(); settings.endGroup();
settings.sync(); settings.sync();
return (settings.status() == QSettings::NoError);
} }
void AWConfigHelper::copyConfigs(const QString localDir) const void AWConfigHelper::copyConfigs(const QString &_localDir) const
{ {
qCDebug(LOG_AW) << "Local directory" << localDir; qCDebug(LOG_AW) << "Local directory" << _localDir;
QStringList dirs = QStandardPaths::locateAll( QStringList dirs = QStandardPaths::locateAll(
QStandardPaths::GenericDataLocation, QString("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); QStringList files = QDir(dir).entryList(QDir::Files);
for (auto source : files) { for (auto &source : files) {
QString destination = QString("%1/%2").arg(localDir).arg(source); QString destination = QString("%1/%2").arg(_localDir).arg(source);
bool status = QFile::copy(QString("%1/%2").arg(dir).arg(source), bool status = QFile::copy(QString("%1/%2").arg(dir).arg(source),
destination); destination);
qCInfo(LOG_AW) << "File" << source << "has been copied to" qCInfo(LOG_AW) << "File" << source << "has been copied to"
@ -253,69 +248,69 @@ void AWConfigHelper::copyConfigs(const QString localDir) const
} }
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).arg(type).arg(item), QString("%1/%2/%3").arg(m_baseDir).arg(_type).arg(_item),
QSettings::IniFormat); QSettings::IniFormat);
itemSettings.beginGroup(QString("Desktop Entry")); itemSettings.beginGroup("Desktop Entry");
if (inverse) if (_inverse)
copySettings(settings, itemSettings); copySettings(_settings, itemSettings);
else else
copySettings(itemSettings, settings); copySettings(itemSettings, _settings);
itemSettings.endGroup(); itemSettings.endGroup();
settings.endGroup(); _settings.endGroup();
if (inverse) if (_inverse)
itemSettings.sync(); itemSettings.sync();
} }
void AWConfigHelper::copySettings(QSettings &from, QSettings &to) const void AWConfigHelper::copySettings(QSettings &_from, QSettings &_to) const
{ {
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 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()); QString text = QString::fromUtf8(file.readAll());
file.close(); file.close();
settings.setValue(key, text); _settings.setValue(_key, text);
} else { } else {
qCWarning(LOG_LIB) << "Could not open" << file.fileName(); qCWarning(LOG_AW) << "Could not open" << file.fileName();
} }
} }
void AWConfigHelper::writeFile(QSettings &settings, const QString key, void AWConfigHelper::writeFile(QSettings &_settings, const QString &_key,
const QString fileName) const const QString &_fileName) const
{ {
qCDebug(LOG_AW) << "Key" << key << "to file" << fileName; qCDebug(LOG_AW) << "Key" << _key << "to file" << _fileName;
if (!settings.contains(key)) if (!_settings.contains(_key))
return; return;
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.setCodec("UTF-8");
out << settings.value(key).toString().toUtf8(); out << _settings.value(_key).toString().toUtf8();
out.flush(); out.flush();
file.close(); file.close();
} else { } else {
qCWarning(LOG_LIB) << "Could not open" << file.fileName(); qCWarning(LOG_AW) << "Could not open" << file.fileName();
} }
} }

View File

@ -21,6 +21,7 @@
#include <QObject> #include <QObject>
#include <QStandardPaths> #include <QStandardPaths>
#include <QVariant>
class QSettings; class QSettings;
@ -30,39 +31,41 @@ class AWConfigHelper : public QObject
Q_OBJECT Q_OBJECT
public: public:
explicit AWConfigHelper(QObject *parent = nullptr); explicit AWConfigHelper(QObject *_parent = nullptr);
virtual ~AWConfigHelper(); virtual ~AWConfigHelper();
Q_INVOKABLE QString configurationDirectory() const; Q_INVOKABLE QString configurationDirectory() const;
Q_INVOKABLE bool dropCache() const; Q_INVOKABLE bool dropCache() const;
Q_INVOKABLE bool exportConfiguration(QObject *nativeConfig, Q_INVOKABLE bool exportConfiguration(QObject *_nativeConfig,
const QString fileName) const; const QString &_fileName) const;
Q_INVOKABLE QVariantMap importConfiguration(const QString fileName, Q_INVOKABLE QVariantMap importConfiguration(const QString &_fileName,
const bool importPlasmoid, const bool _importPlasmoid,
const bool importExtensions, const bool _importExtensions,
const bool importAdds) const; const bool _importAdds) const;
// dataengine // dataengine
Q_INVOKABLE QVariantMap readDataEngineConfiguration() const; Q_INVOKABLE QVariantMap readDataEngineConfiguration() const;
Q_INVOKABLE void Q_INVOKABLE bool
writeDataEngineConfiguration(const QVariantMap configuration) const; writeDataEngineConfiguration(const QVariantMap &_configuration) const;
private: private:
// methods // methods
void copyConfigs(const QString localDir) const; void copyConfigs(const QString &_localDir) const;
void copyExtensions(const QString item, const QString type, void copyExtensions(const QString &_item, const QString &_type,
QSettings &settings, const bool inverse) const; QSettings &_settings, const bool _inverse) const;
void copySettings(QSettings &from, QSettings &to) const; void copySettings(QSettings &_from, QSettings &_to) const;
void readFile(QSettings &settings, const QString key, void readFile(QSettings &_settings, const QString &_key,
const QString fileName) const; const QString &_fileName) const;
void writeFile(QSettings &settings, const QString key, void writeFile(QSettings &_settings, const QString &_key,
const QString fileName) const; const QString &_fileName) const;
// properties // properties
QString m_baseDir = QString("%1/awesomewidgets") QString m_baseDir = QString("%1/awesomewidgets")
.arg(QStandardPaths::writableLocation( .arg(QStandardPaths::writableLocation(
QStandardPaths::GenericDataLocation)); QStandardPaths::GenericDataLocation));
QStringList m_dirs = QStringList() QStringList m_dirs = QStringList() << "desktops"
<< QString("desktops") << QString("quotes") << "quotes"
<< QString("scripts") << QString("upgrade") << "scripts"
<< QString("weather"); << "upgrade"
<< "weather"
<< "formatters";
}; };

View File

@ -19,7 +19,6 @@
#include <KI18n/KLocalizedString> #include <KI18n/KLocalizedString>
#include <QtConcurrent/QtConcurrent>
#include <QBuffer> #include <QBuffer>
#include <QGraphicsScene> #include <QGraphicsScene>
#include <QGraphicsView> #include <QGraphicsView>
@ -31,18 +30,18 @@
#include "awdebug.h" #include "awdebug.h"
AWDataAggregator::AWDataAggregator(QObject *parent) AWDataAggregator::AWDataAggregator(QObject *_parent)
: QObject(parent) : QObject(_parent)
{ {
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
boundaries[QString("cpuTooltip")] = 100.0; m_boundaries["cpuTooltip"] = 100.0;
boundaries[QString("cpuclTooltip")] = 4000.0; m_boundaries["cpuclTooltip"] = 4000.0;
boundaries[QString("memTooltip")] = 100.0; m_boundaries["memTooltip"] = 100.0;
boundaries[QString("swapTooltip")] = 100.0; m_boundaries["swapTooltip"] = 100.0;
boundaries[QString("downkbTooltip")] = 1.0; m_boundaries["downkbTooltip"] = 1.0;
boundaries[QString("upkbTooltip")] = 1.0; m_boundaries["upkbTooltip"] = 1.0;
boundaries[QString("batTooltip")] = 100.0; m_boundaries["batTooltip"] = 100.0;
initScene(); initScene();
connect(this, SIGNAL(updateData(const QVariantHash &)), this, connect(this, SIGNAL(updateData(const QVariantHash &)), this,
@ -54,71 +53,70 @@ AWDataAggregator::~AWDataAggregator()
{ {
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
delete toolTipScene; delete m_toolTipScene;
} }
QList<float> AWDataAggregator::getData(const QString key) const QList<float> AWDataAggregator::getData(const QString &_key) const
{ {
qCDebug(LOG_AW) << "Key" << key; qCDebug(LOG_AW) << "Key" << _key;
return data[QString("%1Tooltip").arg(key)]; return m_values[QString("%1Tooltip").arg(_key)];
} }
QString AWDataAggregator::htmlImage(const QPixmap &source) const QString AWDataAggregator::htmlImage(const QPixmap &_source) const
{ {
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() ? ""
: QString("<img src=\"data:image/png;base64,%1\"/>") : QString("<img src=\"data:image/png;base64,%1\"/>")
.arg(QString(byteArray.toBase64())); .arg(QString(byteArray.toBase64()));
} }
void AWDataAggregator::setParameters(QVariantMap settings) void AWDataAggregator::setParameters(const QVariantMap &_settings)
{ {
qCDebug(LOG_AW) << "Settings" << settings; qCDebug(LOG_AW) << "Settings" << _settings;
// cast from QVariantMap to QVariantHash without data lost // cast from QVariantMap to QVariantHash without data lost
configuration = qvariant_cast<QVariantHash>(settings); m_configuration = qvariant_cast<QVariantHash>(_settings);
m_enablePopup = configuration[QString("notify")].toBool(); m_enablePopup = m_configuration["notify"].toBool();
counts = 0; m_counts = 0;
counts += configuration[QString("cpuTooltip")].toInt(); m_counts += m_configuration["cpuTooltip"].toInt();
counts += configuration[QString("cpuclTooltip")].toInt(); m_counts += m_configuration["cpuclTooltip"].toInt();
counts += configuration[QString("memTooltip")].toInt(); m_counts += m_configuration["memTooltip"].toInt();
counts += configuration[QString("swapTooltip")].toInt(); m_counts += m_configuration["swapTooltip"].toInt();
counts += configuration[QString("downkbTooltip")].toInt(); m_counts += m_configuration["downkbTooltip"].toInt();
counts += configuration[QString("batTooltip")].toInt(); m_counts += m_configuration["batTooltip"].toInt();
// resize tooltip image // resize tooltip image
toolTipView->resize(100 * counts, 105); m_toolTipView->resize(100 * m_counts, 105);
requiredKeys.clear(); requiredKeys.clear();
if (configuration[QString("cpuTooltip")].toBool()) if (m_configuration["cpuTooltip"].toBool())
requiredKeys.append(QString("cpuTooltip")); requiredKeys.append("cpuTooltip");
if (configuration[QString("cpuclTooltip")].toBool()) if (m_configuration["cpuclTooltip"].toBool())
requiredKeys.append(QString("cpuclTooltip")); requiredKeys.append("cpuclTooltip");
if (configuration[QString("memTooltip")].toBool()) if (m_configuration["memTooltip"].toBool())
requiredKeys.append(QString("memTooltip")); requiredKeys.append("memTooltip");
if (configuration[QString("swapTooltip")].toBool()) if (m_configuration["swapTooltip"].toBool())
requiredKeys.append(QString("swapTooltip")); requiredKeys.append("swapTooltip");
if (configuration[QString("downkbTooltip")].toBool()) if (m_configuration["downkbTooltip"].toBool())
requiredKeys.append(QString("downkbTooltip")); requiredKeys.append("downkbTooltip");
if (configuration[QString("upkbTooltip")].toBool()) if (m_configuration["upkbTooltip"].toBool())
requiredKeys.append(QString("upkbTooltip")); requiredKeys.append("upkbTooltip");
if (configuration[QString("batTooltip")].toBool()) if (m_configuration["batTooltip"].toBool())
requiredKeys.append(QString("batTooltip")); requiredKeys.append("batTooltip");
// background // background
toolTipScene->setBackgroundBrush( m_toolTipScene->setBackgroundBrush(
configuration[QString("useTooltipBackground")].toBool() m_configuration["useTooltipBackground"].toBool()
? QBrush(QColor( ? QBrush(QColor(m_configuration["tooltipBackground"].toString()))
configuration[QString("tooltipBackground")].toString()))
: QBrush(Qt::NoBrush)); : QBrush(Qt::NoBrush));
} }
@ -126,197 +124,197 @@ void AWDataAggregator::setParameters(QVariantMap settings)
QPixmap AWDataAggregator::tooltipImage() QPixmap AWDataAggregator::tooltipImage()
{ {
// create image // create image
toolTipScene->clear(); m_toolTipScene->clear();
QPen pen; QPen pen;
bool down = false; bool down = false;
for (auto key : requiredKeys) { for (auto &key : requiredKeys) {
// create frame // create frame
float normX = 100.0f / static_cast<float>(data[key].count()); float normX = 100.0f / static_cast<float>(m_values[key].count());
float normY = 100.0f / (1.5f * boundaries[key]); float normY = 100.0f / (1.5f * m_boundaries[key]);
float shift = requiredKeys.indexOf(key) * 100.0f; float shift = requiredKeys.indexOf(key) * 100.0f;
if (down) if (down)
shift -= 100.0; shift -= 100.0;
// apply pen color // apply pen color
if (key != QString("batTooltip")) if (key != "batTooltip")
pen.setColor( pen.setColor(QColor(
QColor(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 < data[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; float x1 = j * normX + shift;
float y1 = -fabs(data[key].at(j)) * normY + 5.0f; float y1 = -std::fabs(m_values[key].at(j)) * normY + 5.0f;
float x2 = (j + 1) * normX + shift; float x2 = (j + 1) * normX + shift;
float y2 = -fabs(data[key].at(j + 1)) * normY + 5.0f; float y2 = -std::fabs(m_values[key].at(j + 1)) * normY + 5.0f;
if (key == QString("batTooltip")) { if (key == "batTooltip") {
if (data[key].at(j + 1) > 0) if (m_values[key].at(j + 1) > 0)
pen.setColor(QColor(
configuration[QString("batTooltipColor")].toString()));
else
pen.setColor( pen.setColor(
QColor(configuration[QString("batInTooltipColor")] QColor(m_configuration["batTooltipColor"].toString()));
.toString())); else
pen.setColor(QColor(
m_configuration["batInTooltipColor"].toString()));
} }
toolTipScene->addLine(x1, y1, x2, y2, pen); m_toolTipScene->addLine(x1, y1, x2, y2, pen);
} }
if (key == QString("downkbTooltip")) if (key == "downkbTooltip")
down = true; down = true;
} }
return toolTipView->grab(); return m_toolTipView->grab();
} }
void AWDataAggregator::dataUpdate(const QVariantHash &values) void AWDataAggregator::dataUpdate(const QVariantHash &_values)
{ {
// do not log these arguments // do not log these arguments
setData(values); setData(_values);
emit(toolTipPainted(htmlImage(tooltipImage()))); emit(toolTipPainted(htmlImage(tooltipImage())));
} }
void AWDataAggregator::checkValue(const QString source, const float value, void AWDataAggregator::checkValue(const QString &_source, const float _value,
const float extremum) const const float _extremum) const
{ {
qCDebug(LOG_AW) << "Notification source" << source << "with value" << value qCDebug(LOG_AW) << "Notification source" << _source << "with value"
<< "called with extremum" << extremum; << _value << "called with extremum" << _extremum;
if (value >= 0.0) { if (_value >= 0.0) {
if ((m_enablePopup) && (value > extremum) if ((m_enablePopup) && (_value > _extremum)
&& (data[source].last() < extremum)) && (m_values[_source].last() < _extremum))
return AWActions::sendNotification(QString("event"), return AWActions::sendNotification(
notificationText(source, value)); "event", notificationText(_source, _value));
} else { } else {
if ((m_enablePopup) && (value < extremum) if ((m_enablePopup) && (_value < _extremum)
&& (data[source].last() > extremum)) && (m_values[_source].last() > _extremum))
return AWActions::sendNotification(QString("event"), return AWActions::sendNotification(
notificationText(source, value)); "event", notificationText(_source, _value));
} }
} }
void AWDataAggregator::checkValue(const QString source, const QString current, void AWDataAggregator::checkValue(const QString &_source,
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" << received; << _current << "and received one" << _received;
if ((m_enablePopup) && (current != received) && (!received.isEmpty())) if ((m_enablePopup) && (_current != _received) && (!_received.isEmpty()))
return AWActions::sendNotification(QString("event"), return AWActions::sendNotification(
notificationText(source, received)); "event", notificationText(_source, _received));
} }
void AWDataAggregator::initScene() void AWDataAggregator::initScene()
{ {
toolTipScene = new QGraphicsScene(nullptr); m_toolTipScene = new QGraphicsScene(nullptr);
toolTipView = new QGraphicsView(toolTipScene); m_toolTipView = new QGraphicsView(m_toolTipScene);
toolTipView->setStyleSheet(QString("background: transparent")); m_toolTipView->setStyleSheet("background: transparent");
toolTipView->setContentsMargins(0, 0, 0, 0); m_toolTipView->setContentsMargins(0, 0, 0, 0);
toolTipView->setFrameShape(QFrame::NoFrame); m_toolTipView->setFrameShape(QFrame::NoFrame);
toolTipView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_toolTipView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
toolTipView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_toolTipView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
} }
QString AWDataAggregator::notificationText(const QString source, QString AWDataAggregator::notificationText(const QString &_source,
const float value) const const float _value) const
{ {
qCDebug(LOG_AW) << "Notification source" << source << "with value" << value; qCDebug(LOG_AW) << "Notification source" << _source << "with value"
<< _value;
QString output; QString output;
if (source == QString("batTooltip")) if (_source == "batTooltip")
output = value > 0.0 ? i18n("AC online") : i18n("AC offline"); output = _value > 0.0 ? i18n("AC online") : i18n("AC offline");
else if (source == QString("cpuTooltip")) else if (_source == "cpuTooltip")
output = i18n("High CPU load"); output = i18n("High CPU load");
else if (source == QString("memTooltip")) else if (_source == "memTooltip")
output = i18n("High memory usage"); output = i18n("High memory usage");
else if (source == QString("swapTooltip")) else if (_source == "swapTooltip")
output = i18n("Swap is used"); output = i18n("Swap is used");
else if (source == QString("gpu")) else if (_source == "gpu")
output = i18n("High GPU load"); output = i18n("High GPU load");
return output; return output;
} }
QString AWDataAggregator::notificationText(const QString source, QString AWDataAggregator::notificationText(const QString &_source,
const QString value) const const QString &_value) const
{ {
qCDebug(LOG_AW) << "Notification source" << source << "with value" << value; qCDebug(LOG_AW) << "Notification source" << _source << "with value"
<< _value;
QString output; QString output;
if (source == QString("netdev")) if (_source == "netdev")
output = i18n("Network device has been changed to %1", value); output = i18n("Network device has been changed to %1", _value);
return output; return output;
} }
void AWDataAggregator::setData(const QVariantHash &values) 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[QString("ac")].toString() setData(_values["ac"].toString() == m_configuration["acOnline"],
== configuration[QString("acOnline")], "batTooltip", _values["bat"].toFloat());
QString("batTooltip"), values[QString("bat")].toFloat());
// usual case // usual case
setData(QString("cpuTooltip"), values[QString("cpu")].toFloat(), 90.0); setData("cpuTooltip", _values["cpu"].toFloat(), 90.0);
setData(QString("cpuclTooltip"), values[QString("cpucl")].toFloat()); setData("cpuclTooltip", _values["cpucl"].toFloat());
setData(QString("memTooltip"), values[QString("mem")].toFloat(), 80.0); setData("memTooltip", _values["mem"].toFloat(), 80.0);
setData(QString("swapTooltip"), values[QString("swap")].toFloat(), 0.0); setData("swapTooltip", _values["swap"].toFloat(), 0.0);
setData(QString("downkbTooltip"), values[QString("downkb")].toFloat()); setData("downkbTooltip", _values["downkb"].toFloat());
setData(QString("upkbTooltip"), values[QString("upkb")].toFloat()); setData("upkbTooltip", _values["upkb"].toFloat());
// additional check for network device // additional check for network device
[this](const QString value) { [this](const QString &value) {
checkValue(QString("netdev"), currentNetworkDevice, value); checkValue("netdev", m_currentNetworkDevice, value);
currentNetworkDevice = value; m_currentNetworkDevice = value;
}(values[QString("netdev")].toString()); }(_values["netdev"].toString());
// additional check for GPU load // additional check for GPU load
[this](const float value) { [this](const float value) {
checkValue(QString("gpu"), value, 90.0); checkValue("gpu", value, 90.0);
currentGPULoad = value; m_currentGPULoad = value;
}(values[QString("gpu")].toFloat()); }(_values["gpu"].toFloat());
} }
void AWDataAggregator::setData(const QString &source, float value, void AWDataAggregator::setData(const QString &_source, float _value,
const float 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 (data[source].count() == 0) if (m_values[_source].count() == 0)
data[source].append(0.0); m_values[_source].append(0.0);
else if (data[source].count() else if (m_values[_source].count()
> configuration[QString("tooltipNumber")].toInt()) > m_configuration["tooltipNumber"].toInt())
data[source].removeFirst(); m_values[_source].removeFirst();
if (std::isnan(value)) if (std::isnan(_value))
value = 0.0; _value = 0.0;
// notifications // notifications
checkValue(source, value, extremum); checkValue(_source, _value, _extremum);
data[source].append(value); m_values[_source].append(_value);
if (source == QString("downkbTooltip")) { if (_source == "downkbTooltip") {
QList<float> netValues QList<float> netValues
= data[QString("downkbTooltip")] + data[QString("upkbTooltip")]; = m_values["downkbTooltip"] + m_values["upkbTooltip"];
// to avoid inf value of normY // to avoid inf value of normY
netValues << 1.0; netValues << 1.0;
boundaries[QString("downkbTooltip")] m_boundaries["downkbTooltip"]
= 1.2f * *std::max_element(netValues.cbegin(), netValues.cend()); = 1.2f * *std::max_element(netValues.cbegin(), netValues.cend());
boundaries[QString("upkbTooltip")] m_boundaries["upkbTooltip"] = m_boundaries["downkbTooltip"];
= boundaries[QString("downkbTooltip")];
} }
} }
void AWDataAggregator::setData(const bool dontInvert, const QString &source, void AWDataAggregator::setData(const bool _dontInvert, const QString &_source,
float 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;
return setData(source, value, 0.0); return setData(_source, _value, 0.0);
} }

View File

@ -33,44 +33,45 @@ class AWDataAggregator : public QObject
Q_OBJECT Q_OBJECT
public: public:
explicit AWDataAggregator(QObject *parent = nullptr); explicit AWDataAggregator(QObject *_parent = nullptr);
virtual ~AWDataAggregator(); virtual ~AWDataAggregator();
QList<float> getData(const QString key) const; QList<float> getData(const QString &_key) const;
QString htmlImage(const QPixmap &source) const; QString htmlImage(const QPixmap &_source) const;
void setParameters(QVariantMap settings); void setParameters(const QVariantMap &_settings);
QPixmap tooltipImage(); QPixmap tooltipImage();
signals: signals:
void updateData(const QVariantHash &values); void updateData(const QVariantHash &_values);
void toolTipPainted(const QString image) const; void toolTipPainted(const QString &_image) const;
private slots: private slots:
void dataUpdate(const QVariantHash &values); void dataUpdate(const QVariantHash &_values);
private: private:
// ui // ui
QGraphicsScene *toolTipScene = nullptr; QGraphicsScene *m_toolTipScene = nullptr;
QGraphicsView *toolTipView = nullptr; QGraphicsView *m_toolTipView = nullptr;
void checkValue(const QString source, const float value, void checkValue(const QString &_source, const float _value,
const float extremum) const; const float _extremum) const;
void checkValue(const QString source, const QString current, void checkValue(const QString &_source, const QString &_current,
const QString received) const; const QString &_received) const;
void initScene(); void initScene();
QString notificationText(const QString source, const float value) const; QString notificationText(const QString &_source, const float _value) const;
QString notificationText(const QString source, const QString value) const; QString notificationText(const QString &_source,
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, float _value,
const float extremum = -1.0f); 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(const bool _dontInvert, const QString &_source, float _value);
// variables // variables
int counts = 0; int m_counts = 0;
QVariantHash configuration; QVariantHash m_configuration;
float currentGPULoad = 0.0; float m_currentGPULoad = 0.0f;
QString currentNetworkDevice = QString("lo"); QString m_currentNetworkDevice = "lo";
QHash<QString, float> boundaries; QHash<QString, float> m_boundaries;
QHash<QString, QList<float>> data; QHash<QString, QList<float>> m_values;
bool m_enablePopup = false; bool m_enablePopup = false;
QStringList requiredKeys; QStringList requiredKeys;
}; };

View File

@ -17,14 +17,19 @@
#include "awdataengineaggregator.h" #include "awdataengineaggregator.h"
#include <Plasma/DataContainer>
#include "awdebug.h" #include "awdebug.h"
#include "awkeys.h" #include "awkeys.h"
AWDataEngineAggregator::AWDataEngineAggregator(QObject *parent) AWDataEngineAggregator::AWDataEngineAggregator(QObject *_parent)
: QObject(parent) : QObject(_parent)
{ {
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
// required to define Qt::QueuedConnection for signal-slot connection
qRegisterMetaType<Plasma::DataEngine::Data>("Plasma::DataEngine::Data");
} }
@ -42,61 +47,87 @@ void AWDataEngineAggregator::clear()
disconnectSources(); disconnectSources();
m_dataEngines.clear(); m_dataEngines.clear();
delete m_consumer; delete m_consumer;
m_consumer = nullptr;
} }
void AWDataEngineAggregator::disconnectSources() void AWDataEngineAggregator::disconnectSources()
{ {
for (auto dataengine : m_dataEngines.values()) for (auto dataengine : m_dataEngines.values())
for (auto source : dataengine->sources()) for (auto &source : dataengine->sources())
dataengine->disconnectSource(source, parent()); dataengine->disconnectSource(source, parent());
} }
void AWDataEngineAggregator::initDataEngines(const int interval) void AWDataEngineAggregator::initDataEngines(const int _interval)
{ {
qCDebug(LOG_AW) << "Init dataengines with interval" << interval; qCDebug(LOG_AW) << "Init dataengines with interval" << _interval;
m_consumer = new Plasma::DataEngineConsumer(); m_consumer = new Plasma::DataEngineConsumer();
m_dataEngines[QString("systemmonitor")] m_dataEngines["systemmonitor"] = m_consumer->dataEngine("systemmonitor");
= m_consumer->dataEngine(QString("systemmonitor")); m_dataEngines["extsysmon"] = m_consumer->dataEngine("extsysmon");
m_dataEngines[QString("extsysmon")] m_dataEngines["time"] = m_consumer->dataEngine("time");
= m_consumer->dataEngine(QString("extsysmon"));
m_dataEngines[QString("time")] = m_consumer->dataEngine(QString("time"));
// additional method required by systemmonitor structure // additional method required by systemmonitor structure
connect(m_dataEngines[QString("systemmonitor")], connect(m_dataEngines["systemmonitor"], &Plasma::DataEngine::sourceAdded,
&Plasma::DataEngine::sourceAdded, [this, _interval](const QString source) {
[this, interval](const QString source) {
emit(deviceAdded(source)); emit(deviceAdded(source));
m_dataEngines[QString("systemmonitor")]->connectSource( m_dataEngines["systemmonitor"]->connectSource(source, parent(),
source, parent(), interval); _interval);
}); });
return reconnectSources(interval); return reconnectSources(_interval);
} }
void AWDataEngineAggregator::dropSource(const QString source) void AWDataEngineAggregator::dropSource(const QString &_source)
{ {
qCDebug(LOG_AW) << "Source" << source; qCDebug(LOG_AW) << "Source" << _source;
// FIXME there is no possibility to check to which dataengine source // HACK there is no possibility to check to which dataengine source
// connected we will try to disconnect it from systemmonitor and extsysmon // connected we will try to disconnect it from systemmonitor and extsysmon
m_dataEngines[QString("systemmonitor")]->disconnectSource(source, parent()); for (auto dataengine : m_dataEngines.values())
m_dataEngines[QString("extsysmon")]->disconnectSource(source, parent()); dataengine->disconnectSource(_source, parent());
m_dataEngines[QString("time")]->disconnectSource(source, parent());
} }
void AWDataEngineAggregator::reconnectSources(const int interval) void AWDataEngineAggregator::reconnectSources(const int _interval)
{ {
qCDebug(LOG_AW) << "Reconnect sources with interval" << interval; qCDebug(LOG_AW) << "Reconnect sources with interval" << _interval;
m_dataEngines[QString("systemmonitor")]->connectAllSources(parent(), m_dataEngines["systemmonitor"]->connectAllSources(parent(), _interval);
interval); m_dataEngines["extsysmon"]->connectAllSources(parent(), _interval);
m_dataEngines[QString("extsysmon")]->connectAllSources(parent(), interval); m_dataEngines["time"]->connectSource("Local", parent(), 1000);
m_dataEngines[QString("time")]->connectSource(QString("Local"), parent(),
1000); #ifdef BUILD_FUTURE
createQueuedConnection();
#endif /* BUILD_FUTURE */
}
void AWDataEngineAggregator::createQueuedConnection()
{
// HACK additional method which forces QueuedConnection instead of Auto one
// for more details refer to plasma-framework source code
for (auto &dataEngine : m_dataEngines.keys()) {
// different source set for different engines
QStringList sources = dataEngine == "time"
? QStringList() << "Local"
: m_dataEngines[dataEngine]->sources();
// reconnect sources
for (auto &source : sources) {
Plasma::DataContainer *container
= m_dataEngines[dataEngine]->containerForSource(source);
// disconnect old connections first
disconnect(container,
SIGNAL(dataUpdated(QString, Plasma::DataEngine::Data)),
parent(),
SLOT(dataUpdated(QString, Plasma::DataEngine::Data)));
// and now reconnect with Qt::QueuedConnection type
connect(container,
SIGNAL(dataUpdated(QString, Plasma::DataEngine::Data)),
parent(),
SLOT(dataUpdated(QString, Plasma::DataEngine::Data)),
Qt::QueuedConnection);
}
}
} }

View File

@ -30,20 +30,21 @@ class AWDataEngineAggregator : public QObject
Q_OBJECT Q_OBJECT
public: public:
explicit AWDataEngineAggregator(QObject *parent = nullptr); explicit AWDataEngineAggregator(QObject *_parent = nullptr);
virtual ~AWDataEngineAggregator(); virtual ~AWDataEngineAggregator();
void clear(); void clear();
void disconnectSources(); void disconnectSources();
void initDataEngines(const int interval); void initDataEngines(const int _interval);
signals: signals:
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 reconnectSources(const int interval); void reconnectSources(const int _interval);
private: private:
void createQueuedConnection();
Plasma::DataEngineConsumer *m_consumer = nullptr; Plasma::DataEngineConsumer *m_consumer = nullptr;
QHash<QString, Plasma::DataEngine *> m_dataEngines; QHash<QString, Plasma::DataEngine *> m_dataEngines;
}; };

View File

@ -1,84 +0,0 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awdatetimeformatter.h"
#include <QDateTime>
#include <QSettings>
#include "awdebug.h"
AWDateTimeFormatter::AWDateTimeFormatter(QObject *parent,
const QString filename,
const QString section)
: AWAbstractFormatter(parent, filename, section)
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
init(filename, section);
}
AWDateTimeFormatter::AWDateTimeFormatter(QObject *parent, const QString format)
: AWAbstractFormatter(parent)
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
setFormat(format);
}
AWDateTimeFormatter::~AWDateTimeFormatter()
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
}
QString AWDateTimeFormatter::convert(const QVariant &value) const
{
qCDebug(LOG_AW) << "Convert value" << value;
return value.toDateTime().toString(m_format);
}
QString AWDateTimeFormatter::format() const
{
return m_format;
}
void AWDateTimeFormatter::setFormat(const QString _format)
{
qCDebug(LOG_AW) << "Set format" << _format;
m_format = _format;
}
void AWDateTimeFormatter::init(const QString filename, const QString section)
{
qCDebug(LOG_AW) << "Looking for section" << section << "in" << filename;
QSettings settings(filename, QSettings::IniFormat);
settings.beginGroup(section);
setFormat(settings.value(QString("Format"), QString()).toString());
settings.endGroup();
}

View File

@ -0,0 +1,92 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awdbusadaptor.h"
#include "awdebug.h"
#include "awkeys.h"
AWDBusAdaptor::AWDBusAdaptor(AWKeys *_parent)
: QDBusAbstractAdaptor(_parent)
, m_plugin(_parent)
{
qCDebug(LOG_DBUS) << __PRETTY_FUNCTION__;
}
AWDBusAdaptor::~AWDBusAdaptor()
{
qCDebug(LOG_DBUS) << __PRETTY_FUNCTION__;
}
QString AWDBusAdaptor::Info(const QString &key) const
{
return m_plugin->infoByKey(key);
}
QStringList AWDBusAdaptor::Keys(const QString &regexp) const
{
return m_plugin->dictKeys(true, regexp);
}
QString AWDBusAdaptor::Value(const QString &key) const
{
return m_plugin->valueByKey(key);
}
qlonglong AWDBusAdaptor::WhoAmI() const
{
return reinterpret_cast<qlonglong>(m_plugin);
}
void AWDBusAdaptor::SetLogLevel(const QString &what, const int level)
{
qCDebug(LOG_DBUS) << "Set log level" << level << "for" << what;
if (level >= m_logLevels.count()) {
qCDebug(LOG_DBUS) << "Invalid logging level" << level
<< "should be less than" << m_logLevels.count();
return;
}
for (auto &lev : m_logLevels)
SetLogLevel(what, lev, m_logLevels.indexOf(lev) >= level);
}
void AWDBusAdaptor::SetLogLevel(const QString &what, const QString &level,
const bool enabled)
{
qCDebug(LOG_DBUS) << "Set log level" << level << "enabled" << enabled
<< "for" << what;
if (!m_logLevels.contains(level)) {
qCDebug(LOG_DBUS) << "Invalid logging level" << level << "should be in"
<< m_logLevels;
return;
}
QString state = enabled ? "true" : "false";
QLoggingCategory::setFilterRules(
QString("%1.%2=%3").arg(what).arg(level).arg(state));
}

View File

@ -0,0 +1,58 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#ifndef AWDBUSADAPTOR_H
#define AWDBUSADAPTOR_H
#include <QDBusAbstractAdaptor>
#include "version.h"
class AWKeys;
class AWDBusAdaptor : public QDBusAbstractAdaptor
{
Q_OBJECT
Q_CLASSINFO("D-Bus Interface", AWDBUS_SERVICE_NAME)
public:
explicit AWDBusAdaptor(AWKeys *_parent = nullptr);
virtual ~AWDBusAdaptor();
public slots:
// get methods
QString Info(const QString &key) const;
QStringList Keys(const QString &regexp) const;
QString Value(const QString &key) const;
qlonglong WhoAmI() const;
// set methods
void SetLogLevel(const QString &what, const int level);
void SetLogLevel(const QString &what, const QString &level,
const bool enabled);
private:
AWKeys *m_plugin = nullptr;
QStringList m_logLevels = QStringList() << "debug"
<< "info"
<< "warning"
<< "critical";
};
#endif /* AWDBUSADAPTOR_H */

View File

@ -20,9 +20,11 @@
#include <QtQml> #include <QtQml>
#include "awactions.h" #include "awactions.h"
#include "awbugreporter.h"
#include "awconfighelper.h" #include "awconfighelper.h"
#include "awdataengineaggregator.h" #include "awformatterconfigfactory.h"
#include "awkeys.h" #include "awkeys.h"
#include "awtelemetryhandler.h"
void AWPlugin::registerTypes(const char *uri) void AWPlugin::registerTypes(const char *uri)
@ -30,6 +32,10 @@ void AWPlugin::registerTypes(const char *uri)
Q_ASSERT(uri == QLatin1String("org.kde.plasma.private.awesomewidget")); Q_ASSERT(uri == QLatin1String("org.kde.plasma.private.awesomewidget"));
qmlRegisterType<AWActions>(uri, 1, 0, "AWActions"); qmlRegisterType<AWActions>(uri, 1, 0, "AWActions");
qmlRegisterType<AWBugReporter>(uri, 1, 0, "AWBugReporter");
qmlRegisterType<AWConfigHelper>(uri, 1, 0, "AWConfigHelper"); qmlRegisterType<AWConfigHelper>(uri, 1, 0, "AWConfigHelper");
qmlRegisterType<AWFormatterConfigFactory>(uri, 1, 0,
"AWFormatterConfigFactory");
qmlRegisterType<AWKeys>(uri, 1, 0, "AWKeys"); qmlRegisterType<AWKeys>(uri, 1, 0, "AWKeys");
qmlRegisterType<AWTelemetryHandler>(uri, 1, 0, "AWTelemetryHandler");
} }

View File

@ -1,176 +0,0 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awfloatformatter.h"
#include <QSettings>
#include "awdebug.h"
AWFloatFormatter::AWFloatFormatter(QObject *parent, const QString filename,
const QString section)
: AWAbstractFormatter(parent, filename, section)
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
init(filename, section);
}
AWFloatFormatter::AWFloatFormatter(QObject *parent, const QChar fillChar,
const char format, const double multiplier,
const int precision, const double summand,
const int width)
: AWAbstractFormatter(parent)
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
setFillChar(fillChar);
setFormat(format);
setMultiplier(multiplier);
setPrecision(precision);
setSummand(summand);
setWidth(width);
}
AWFloatFormatter::~AWFloatFormatter()
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
}
QString AWFloatFormatter::convert(const QVariant &value) const
{
qCDebug(LOG_AW) << "Convert value" << value;
return QString("%1").arg(value.toDouble() * m_multiplier + m_summand,
m_width, m_format, m_precision, m_fillChar);
}
QChar AWFloatFormatter::fillChar() const
{
return m_fillChar;
}
char AWFloatFormatter::format() const
{
return m_format;
}
double AWFloatFormatter::multiplier() const
{
return m_multiplier;
}
int AWFloatFormatter::precision() const
{
return m_precision;
}
double AWFloatFormatter::summand() const
{
return m_summand;
}
int AWFloatFormatter::width() const
{
return m_width;
}
void AWFloatFormatter::setFillChar(const QChar _fillChar)
{
qCDebug(LOG_AW) << "Set char" << _fillChar;
m_fillChar = _fillChar;
}
void AWFloatFormatter::setFormat(char _format)
{
qCDebug(LOG_AW) << "Set format" << _format;
// http://doc.qt.io/qt-5/qstring.html#argument-formats
if ((_format != 'e') && (_format != 'E') && (_format != 'f')
&& (_format != 'g') && (_format != 'G')) {
qCWarning(LOG_AW) << "Invalid format" << _format;
_format = 'f';
}
m_format = _format;
}
void AWFloatFormatter::setMultiplier(const double _multiplier)
{
qCDebug(LOG_AW) << "Set multiplier" << _multiplier;
m_multiplier = _multiplier;
}
void AWFloatFormatter::setPrecision(const int _precision)
{
qCDebug(LOG_AW) << "Set precision" << _precision;
m_precision = _precision;
}
void AWFloatFormatter::setSummand(const double _summand)
{
qCDebug(LOG_AW) << "Set summand" << _summand;
m_summand = _summand;
}
void AWFloatFormatter::setWidth(const int _width)
{
qCDebug(LOG_AW) << "Set width" << _width;
m_width = _width;
}
void AWFloatFormatter::init(const QString filename, const QString section)
{
qCDebug(LOG_AW) << "Looking for section" << section << "in" << filename;
QSettings settings(filename, QSettings::IniFormat);
settings.beginGroup(section);
setFillChar(
settings.value(QString("FillChar"), QString()).toString().at(0));
setFormat(settings.value(QString("Format"), QString("f"))
.toString()
.at(0)
.toLatin1());
setMultiplier(settings.value(QString("Multiplier"), 1.0).toDouble());
setPrecision(settings.value(QString("Precision"), -1).toInt());
setSummand(settings.value(QString("Summand"), 0.0).toDouble());
setWidth(settings.value(QString("Width"), 0).toInt());
settings.endGroup();
}

View File

@ -0,0 +1,183 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awformatterconfig.h"
#include "ui_awformatterconfig.h"
#include <KI18n/KLocalizedString>
#include <QPushButton>
#include "awabstractselector.h"
#include "awdebug.h"
#include "awformatterhelper.h"
AWFormatterConfig::AWFormatterConfig(QWidget *_parent, const QStringList &_keys)
: QDialog(_parent)
, ui(new Ui::AWFormatterConfig)
, m_keys(_keys)
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
ui->setupUi(this);
m_editButton
= ui->buttonBox->addButton(i18n("Edit"), QDialogButtonBox::ActionRole);
init();
connect(ui->buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
connect(ui->buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
connect(m_editButton, SIGNAL(clicked(bool)), this, SLOT(editFormatters()));
}
AWFormatterConfig::~AWFormatterConfig()
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
clearSelectors();
delete m_helper;
delete ui;
}
void AWFormatterConfig::showDialog()
{
// update dialog
updateDialog();
// exec dialog
return execDialog();
}
void AWFormatterConfig::editFormatters()
{
m_helper->editItems();
updateDialog();
}
void AWFormatterConfig::updateUi()
{
QPair<QString, QString> current
= static_cast<AWAbstractSelector *>(sender())->current();
int index
= m_selectors.indexOf(static_cast<AWAbstractSelector *>(sender()));
if ((current.first.isEmpty()) && (current.second.isEmpty())) {
// remove current selector if it is empty and does not last
if (sender() == m_selectors.last())
return;
AWAbstractSelector *selector = m_selectors.takeAt(index);
ui->verticalLayout->removeWidget(selector);
selector->deleteLater();
} else {
// add new selector if something changed
if (sender() != m_selectors.last())
return;
auto keys = initKeys();
addSelector(keys.first, keys.second, QPair<QString, QString>());
}
}
void AWFormatterConfig::addSelector(const QStringList &_keys,
const QStringList &_values,
const QPair<QString, QString> &_current)
{
qCDebug(LOG_AW) << "Add selector with keys" << _keys << "values" << _values
<< "and current ones" << _current;
AWAbstractSelector *selector
= new AWAbstractSelector(ui->scrollAreaWidgetContents);
selector->init(_keys, _values, _current);
ui->verticalLayout->insertWidget(ui->verticalLayout->count() - 1, selector);
connect(selector, SIGNAL(selectionChanged()), this, SLOT(updateUi()));
m_selectors.append(selector);
}
void AWFormatterConfig::clearSelectors()
{
for (auto &selector : m_selectors) {
disconnect(selector, SIGNAL(selectionChanged()), this,
SLOT(updateUi()));
ui->verticalLayout->removeWidget(selector);
selector->deleteLater();
}
m_selectors.clear();
}
void AWFormatterConfig::execDialog()
{
int ret = exec();
QHash<QString, QString> data;
for (auto &selector : m_selectors) {
QPair<QString, QString> select = selector->current();
if (select.first.isEmpty())
continue;
data[select.first] = select.second;
}
// save configuration if required
switch (ret) {
case 0:
break;
case 1:
default:
m_helper->writeFormatters(data);
m_helper->removeUnusedFormatters(data.keys());
break;
}
}
void AWFormatterConfig::init()
{
delete m_helper;
m_helper = new AWFormatterHelper(this);
}
QPair<QStringList, QStringList> AWFormatterConfig::initKeys() const
{
// we are adding empty string at the start
QStringList keys = QStringList() << "";
keys.append(m_keys);
keys.sort();
QStringList knownFormatters = QStringList() << "";
knownFormatters.append(m_helper->knownFormatters());
knownFormatters.sort();
return QPair<QStringList, QStringList>(keys, knownFormatters);
}
void AWFormatterConfig::updateDialog()
{
clearSelectors();
QHash<QString, QString> appliedFormatters = m_helper->getFormatters();
auto keys = initKeys();
for (auto &key : appliedFormatters.keys())
addSelector(keys.first, keys.second,
QPair<QString, QString>(key, appliedFormatters[key]));
// empty one
addSelector(keys.first, keys.second, QPair<QString, QString>());
}

View File

@ -0,0 +1,64 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#ifndef AWFORMATTERCONFIG_H
#define AWFORMATTERCONFIG_H
#include <QDialog>
class AWAbstractSelector;
class AWFormatterHelper;
namespace Ui
{
class AWFormatterConfig;
}
class AWFormatterConfig : public QDialog
{
Q_OBJECT
public:
explicit AWFormatterConfig(QWidget *_parent = nullptr,
const QStringList &_keys = QStringList());
virtual ~AWFormatterConfig();
Q_INVOKABLE void showDialog();
private slots:
void editFormatters();
void updateUi();
private:
QPushButton *m_editButton = nullptr;
Ui::AWFormatterConfig *ui = nullptr;
AWFormatterHelper *m_helper = nullptr;
QList<AWAbstractSelector *> m_selectors;
// properties
QStringList m_keys;
// methods
void addSelector(const QStringList &_keys, const QStringList &_values,
const QPair<QString, QString> &_current);
void clearSelectors();
void execDialog();
void init();
QPair<QStringList, QStringList> initKeys() const;
void updateDialog();
};
#endif /* AWFORMATTERCONFIG_H */

View File

@ -0,0 +1,93 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>AWFormatterConfig</class>
<widget class="QDialog" name="AWFormatterConfig">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QScrollArea" name="scrollArea">
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>384</width>
<height>249</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Close|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>AWFormatterConfig</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>AWFormatterConfig</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -15,45 +15,28 @@
* 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 "awformatterconfigfactory.h"
#include "awnoformatter.h"
#include "awdebug.h" #include "awdebug.h"
#include "awformatterconfig.h"
AWNoFormatter::AWNoFormatter(QObject *parent, const QString filename, AWFormatterConfigFactory::AWFormatterConfigFactory(QObject *_parent)
const QString section) : QObject(_parent)
: AWAbstractFormatter(parent, filename, section)
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
init(filename, section);
}
AWNoFormatter::AWNoFormatter(QObject *parent)
: AWAbstractFormatter(parent)
{ {
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
} }
AWNoFormatter::~AWNoFormatter() AWFormatterConfigFactory::~AWFormatterConfigFactory()
{ {
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
} }
QString AWNoFormatter::convert(const QVariant &value) const void AWFormatterConfigFactory::showDialog(const QStringList &_keys)
{ {
qCDebug(LOG_AW) << "Convert value" << value; AWFormatterConfig *config = new AWFormatterConfig(nullptr, _keys);
config->showDialog();
return value.toString(); config->deleteLater();
}
void AWNoFormatter::init(const QString filename, const QString section)
{
qCDebug(LOG_AW) << "Looking for section" << section << "in" << filename;
// dummy method for future references
} }

View File

@ -15,23 +15,24 @@
* 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 AWABSTRACTFORMATTER_H
#define AWABSTRACTFORMATTER_H #ifndef AWFORMATTERCONFIGFACTORY_H
#define AWFORMATTERCONFIGFACTORY_H
#include <QObject> #include <QObject>
#include <QVariant>
class AWAbstractFormatter : public QObject class AWFormatterConfigFactory : public QObject
{ {
Q_OBJECT
public: public:
explicit AWAbstractFormatter(QObject *parent, const QString, const QString) explicit AWFormatterConfigFactory(QObject *_parent = nullptr);
: QObject(parent){}; virtual ~AWFormatterConfigFactory();
explicit AWAbstractFormatter(QObject *parent) Q_INVOKABLE void showDialog(const QStringList &_keys);
: QObject(parent){};
virtual ~AWAbstractFormatter(){}; private:
virtual QString convert(const QVariant &value) const = 0;
}; };
#endif /* AWABSTRACTFORMATTER_H */ #endif /* AWFORMATTERCONFIGFACTORY_H */

View File

@ -17,27 +17,29 @@
#include "awformatterhelper.h" #include "awformatterhelper.h"
#include <QSettings> #include <KI18n/KLocalizedString>
#include <QStandardPaths>
#include <QDir>
#include <QInputDialog>
#include <QSettings>
#include "awdebug.h"
#include "awdatetimeformatter.h" #include "awdatetimeformatter.h"
#include "awdebug.h"
#include "awfloatformatter.h" #include "awfloatformatter.h"
#include "awjsonformatter.h"
#include "awlistformatter.h"
#include "awnoformatter.h" #include "awnoformatter.h"
#include "awscriptformatter.h" #include "awscriptformatter.h"
#include "awstringformatter.h"
AWFormatterHelper::AWFormatterHelper(QObject *parent) AWFormatterHelper::AWFormatterHelper(QWidget *_parent)
: QObject(parent) : AbstractExtItemAggregator(_parent, "formatters")
{ {
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
m_genericConfig = QString("%1/awesomewidgets/general.ini") m_filePath = "awesomewidgets/formatters/formatters.ini";
.arg(QStandardPaths::writableLocation( initItems();
QStandardPaths::GenericDataLocation));
#ifdef BUILD_FUTURE
init();
#endif /* BUILD_FUTURE */
} }
@ -46,16 +48,17 @@ AWFormatterHelper::~AWFormatterHelper()
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
m_formatters.clear(); m_formatters.clear();
m_formattersClasses.clear();
} }
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();
} }
@ -65,61 +68,276 @@ QStringList AWFormatterHelper::definedFormatters() const
} }
AWFormatterHelper::FormatterClass QHash<QString, QString> AWFormatterHelper::getFormatters() const
AWFormatterHelper::defineFormatterClass(const QString name) const
{ {
qCDebug(LOG_AW) << "Define formatter class for" << name; QHash<QString, QString> map;
for (auto &tag : m_formatters.keys())
map[tag] = m_formatters[tag]->name();
QSettings settings(m_genericConfig, QSettings::IniFormat); return map;
}
settings.beginGroup(name);
QString stringType QList<AbstractExtItem *> AWFormatterHelper::items() const
= settings.value(QString("Type"), QString("NoFormat")).toString(); {
QList<AbstractExtItem *> converted;
for (auto &item : m_formattersClasses.values())
converted.append(item);
return converted;
}
QStringList AWFormatterHelper::knownFormatters() const
{
return m_formattersClasses.keys();
}
bool AWFormatterHelper::removeUnusedFormatters(const QStringList &_keys) const
{
qCDebug(LOG_AW) << "Remove formatters" << _keys;
QString fileName = QString("%1/%2")
.arg(QStandardPaths::writableLocation(
QStandardPaths::GenericDataLocation))
.arg(m_filePath);
QSettings settings(fileName, QSettings::IniFormat);
qCInfo(LOG_AW) << "Configuration file" << fileName;
settings.beginGroup("Formatters");
QStringList foundKeys = settings.childKeys();
for (auto &key : foundKeys) {
if (_keys.contains(key))
continue;
settings.remove(key);
}
settings.endGroup(); settings.endGroup();
FormatterClass formatter = FormatterClass::NoFormat; settings.sync();
if (stringType == QString("DateTime"))
formatter = FormatterClass::DateTime; return (settings.status() == QSettings::NoError);
else if (stringType == QString("Float")) }
formatter = FormatterClass::Float;
else if (stringType == QString("Script"))
formatter = FormatterClass::Script; bool AWFormatterHelper::writeFormatters(
const QHash<QString, QString> &_configuration) const
{
qCDebug(LOG_AW) << "Write configuration" << _configuration;
QString fileName = QString("%1/%2")
.arg(QStandardPaths::writableLocation(
QStandardPaths::GenericDataLocation))
.arg(m_filePath);
QSettings settings(fileName, QSettings::IniFormat);
qCInfo(LOG_AW) << "Configuration file" << fileName;
settings.beginGroup("Formatters");
for (auto &key : _configuration.keys())
settings.setValue(key, _configuration[key]);
settings.endGroup();
settings.sync();
return (settings.status() == QSettings::NoError);
}
void AWFormatterHelper::editItems()
{
repaintList();
int ret = exec();
qCInfo(LOG_AW) << "Dialog returns" << ret;
}
AWAbstractFormatter::FormatterClass
AWFormatterHelper::defineFormatterClass(const QString &_stringType) const
{
qCDebug(LOG_AW) << "Define formatter class for" << _stringType;
AWAbstractFormatter::FormatterClass formatter
= AWAbstractFormatter::FormatterClass::NoFormat;
if (_stringType == "DateTime")
formatter = AWAbstractFormatter::FormatterClass::DateTime;
else if (_stringType == "Float")
formatter = AWAbstractFormatter::FormatterClass::Float;
else if (_stringType == "List")
formatter = AWAbstractFormatter::FormatterClass::List;
else if (_stringType == "NoFormat")
;
else if (_stringType == "Script")
formatter = AWAbstractFormatter::FormatterClass::Script;
else if (_stringType == "String")
formatter = AWAbstractFormatter::FormatterClass::String;
else if (_stringType == "Json")
formatter = AWAbstractFormatter::FormatterClass::Json;
else else
qCWarning(LOG_AW) << "Unknown formatter" << stringType; qCWarning(LOG_AW) << "Unknown formatter" << _stringType;
return formatter; return formatter;
} }
void AWFormatterHelper::init() void AWFormatterHelper::initFormatters()
{ {
QSettings settings(m_genericConfig, QSettings::IniFormat); m_formattersClasses.clear();
settings.beginGroup(QString("Formatters")); for (int i = m_directories.count() - 1; i >= 0; i--) {
QStringList keys = settings.childKeys(); QStringList files
for (auto key : keys) { = QDir(m_directories.at(i)).entryList(QDir::Files, QDir::Name);
QString name = settings.value(key).toString(); for (auto &file : files) {
FormatterClass formatter = defineFormatterClass(name); if (!file.endsWith(".desktop"))
qCInfo(LOG_AW) << "Found formatter" << name << "for key" << key continue;
<< "defined as" << static_cast<int>(formatter); qCInfo(LOG_AW) << "Found file" << file << "in"
<< m_directories.at(i);
QString filePath
= QString("%1/%2").arg(m_directories.at(i)).arg(file);
auto metadata = readMetadata(filePath);
QString name = metadata.first;
if (m_formattersClasses.contains(name))
continue;
switch (formatter) {
case FormatterClass::DateTime: switch (metadata.second) {
m_formatters[key] case AWAbstractFormatter::FormatterClass::DateTime:
= new AWDateTimeFormatter(this, m_genericConfig, name); m_formattersClasses[name]
break; = new AWDateTimeFormatter(this, filePath);
case FormatterClass::Float: break;
m_formatters[key] case AWAbstractFormatter::FormatterClass::Float:
= new AWFloatFormatter(this, m_genericConfig, name); m_formattersClasses[name]
break; = new AWFloatFormatter(this, filePath);
case FormatterClass::Script: break;
m_formatters[key] case AWAbstractFormatter::FormatterClass::List:
= new AWScriptFormatter(this, m_genericConfig, name); m_formattersClasses[name] = new AWListFormatter(this, filePath);
break; break;
case FormatterClass::NoFormat: case AWAbstractFormatter::FormatterClass::Script:
m_formatters[key] = new AWNoFormatter(this, m_genericConfig, name); m_formattersClasses[name]
break; = new AWScriptFormatter(this, filePath);
break;
case AWAbstractFormatter::FormatterClass::String:
m_formattersClasses[name]
= new AWStringFormatter(this, filePath);
break;
case AWAbstractFormatter::FormatterClass::Json:
m_formattersClasses[name] = new AWJsonFormatter(this, filePath);
break;
case AWAbstractFormatter::FormatterClass::NoFormat:
m_formattersClasses[name] = new AWNoFormatter(this, filePath);
break;
}
} }
} }
settings.endGroup(); }
void AWFormatterHelper::initKeys()
{
m_formatters.clear();
QStringList configs = QStandardPaths::locateAll(
QStandardPaths::GenericDataLocation, m_filePath);
for (auto &fileName : configs) {
QSettings settings(fileName, QSettings::IniFormat);
qCInfo(LOG_AW) << "Configuration file" << settings.fileName();
settings.beginGroup("Formatters");
QStringList keys = settings.childKeys();
for (auto &key : keys) {
QString name = settings.value(key).toString();
qCInfo(LOG_AW) << "Found formatter" << name << "for key" << key
<< "in" << settings.fileName();
if (name.isEmpty()) {
qCInfo(LOG_AW) << "Skip empty formatter for" << key;
continue;
}
if (!m_formattersClasses.contains(name)) {
qCWarning(LOG_AW)
<< "Invalid formatter" << name << "found in" << key;
continue;
}
m_formatters[key] = m_formattersClasses[name];
}
settings.endGroup();
}
}
void AWFormatterHelper::installDirectories()
{
// create directory at $HOME
QString localDir = QString("%1/awesomewidgets/formatters")
.arg(QStandardPaths::writableLocation(
QStandardPaths::GenericDataLocation));
QDir localDirectory;
if (localDirectory.mkpath(localDir))
qCInfo(LOG_AW) << "Created directory" << localDir;
m_directories = QStandardPaths::locateAll(
QStandardPaths::GenericDataLocation, "awesomewidgets/formatters",
QStandardPaths::LocateDirectory);
}
QPair<QString, AWAbstractFormatter::FormatterClass>
AWFormatterHelper::readMetadata(const QString &_filePath) const
{
qCDebug(LOG_AW) << "Read initial parameters from" << _filePath;
QSettings settings(_filePath, QSettings::IniFormat);
settings.beginGroup("Desktop Entry");
QString name = settings.value("Name", _filePath).toString();
QString type = settings.value("X-AW-Type", "NoFormat").toString();
AWAbstractFormatter::FormatterClass formatter = defineFormatterClass(type);
settings.endGroup();
return QPair<QString, AWAbstractFormatter::FormatterClass>(name, formatter);
}
void AWFormatterHelper::doCreateItem()
{
QStringList selection = QStringList() << "NoFormat"
<< "DateTime"
<< "Float"
<< "List"
<< "Script"
<< "String"
<< "Json";
bool ok;
QString select = QInputDialog::getItem(
this, i18n("Select type"), i18n("Type:"), selection, 0, false, &ok);
if (!ok) {
qCWarning(LOG_AW) << "No type selected";
return;
}
qCInfo(LOG_AW) << "Selected type" << select;
AWAbstractFormatter::FormatterClass formatter
= defineFormatterClass(select);
switch (formatter) {
case AWAbstractFormatter::FormatterClass::DateTime:
return createItem<AWDateTimeFormatter>();
case AWAbstractFormatter::FormatterClass::Float:
return createItem<AWFloatFormatter>();
case AWAbstractFormatter::FormatterClass::List:
return createItem<AWListFormatter>();
case AWAbstractFormatter::FormatterClass::Script:
return createItem<AWScriptFormatter>();
case AWAbstractFormatter::FormatterClass::String:
return createItem<AWStringFormatter>();
case AWAbstractFormatter::FormatterClass::Json:
return createItem<AWJsonFormatter>();
case AWAbstractFormatter::FormatterClass::NoFormat:
return createItem<AWNoFormatter>();
}
}
void AWFormatterHelper::initItems()
{
installDirectories();
initFormatters();
initKeys();
} }

View File

@ -19,30 +19,48 @@
#ifndef AWFORMATTERHELPER_H #ifndef AWFORMATTERHELPER_H
#define AWFORMATTERHELPER_H #define AWFORMATTERHELPER_H
#include <QObject> #include "abstractextitemaggregator.h"
#include "awabstractformatter.h" #include "awabstractformatter.h"
class AWFormatterHelper : public QObject class AWAbstractFormatter;
class AWFormatterHelper : public AbstractExtItemAggregator
{ {
Q_OBJECT Q_OBJECT
public: public:
enum class FormatterClass { DateTime, Float, Script, NoFormat }; explicit AWFormatterHelper(QWidget *_parent = nullptr);
explicit AWFormatterHelper(QObject *parent = nullptr);
virtual ~AWFormatterHelper(); virtual ~AWFormatterHelper();
QString convert(const QVariant &value, const QString name) const; QString convert(const QVariant &_value, const QString &_name) const;
QStringList definedFormatters() const; QStringList definedFormatters() const;
QHash<QString, QString> getFormatters() const;
QList<AbstractExtItem *> items() const;
QStringList knownFormatters() const;
bool removeUnusedFormatters(const QStringList &_keys) const;
bool writeFormatters(const QHash<QString, QString> &_configuration) const;
public slots:
void editItems();
private: private:
AWFormatterHelper::FormatterClass // methods
defineFormatterClass(const QString name) const; AWAbstractFormatter::FormatterClass
void init(); defineFormatterClass(const QString &_stringType) const;
void initFormatters();
void initKeys();
void installDirectories();
QPair<QString, AWAbstractFormatter::FormatterClass>
readMetadata(const QString &_filePath) const;
// parent methods
void doCreateItem();
void initItems();
// properties // properties
QString m_genericConfig; QStringList m_directories;
QString m_filePath;
QHash<QString, AWAbstractFormatter *> m_formatters; QHash<QString, AWAbstractFormatter *> m_formatters;
QHash<QString, AWAbstractFormatter *> m_formattersClasses;
}; };

View File

@ -26,9 +26,9 @@
#include "awdebug.h" #include "awdebug.h"
bool AWKeyCache::addKeyToCache(const QString type, const QString key) 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") QString fileName = QString("%1/awesomewidgets.ndx")
.arg(QStandardPaths::writableLocation( .arg(QStandardPaths::writableLocation(
@ -36,43 +36,45 @@ bool AWKeyCache::addKeyToCache(const QString type, const QString key)
qCInfo(LOG_AW) << "Cache file" << fileName; qCInfo(LOG_AW) << "Cache file" << fileName;
QSettings cache(fileName, QSettings::IniFormat); QSettings cache(fileName, QSettings::IniFormat);
cache.beginGroup(type); cache.beginGroup(_type);
QStringList cachedValues; QStringList cachedValues;
for (auto key : cache.allKeys()) for (auto &number : cache.allKeys())
cachedValues.append(cache.value(key).toString()); cachedValues.append(cache.value(number).toString());
if (type == QString("hdd")) { if (_type == "hdd") {
QStringList allDevices QStringList allDevices
= QDir(QString("/dev")).entryList(QDir::System, QDir::Name); = QDir("/dev").entryList(QDir::System, QDir::Name);
QStringList devices QStringList devices = allDevices.filter(QRegExp("^[hms]d[a-z]$"));
= allDevices.filter(QRegExp(QString("^[hms]d[a-z]$"))); for (auto &dev : devices) {
for (auto dev : devices) {
QString device = QString("/dev/%1").arg(dev); QString device = QString("/dev/%1").arg(dev);
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);
cache.setValue( cache.setValue(
QString("%1").arg(cache.allKeys().count(), 3, 10, QChar('0')), QString("%1").arg(cache.allKeys().count(), 3, 10, QChar('0')),
device); device);
} }
} else if (type == QString("net")) { } else if (_type == "net") {
QList<QNetworkInterface> rawInterfaceList QList<QNetworkInterface> rawInterfaceList
= QNetworkInterface::allInterfaces(); = QNetworkInterface::allInterfaces();
for (auto interface : rawInterfaceList) { for (auto &interface : rawInterfaceList) {
QString device = interface.name(); QString device = interface.name();
if (cachedValues.contains(device)) if (cachedValues.contains(device))
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);
cache.setValue( cache.setValue(
QString("%1").arg(cache.allKeys().count(), 3, 10, QChar('0')), QString("%1").arg(cache.allKeys().count(), 3, 10, QChar('0')),
device); 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();
@ -81,86 +83,89 @@ 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 QStringList &_bars,
const QVariantMap &tooltip, const QVariantMap &_tooltip,
const QStringList &allKeys) 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 = QSet<QString>::fromList(_keys);
used.unite(QSet<QString>::fromList(bars)); used.unite(QSet<QString>::fromList(_bars));
// insert keys from tooltip // insert keys from tooltip
for (auto key : tooltip.keys()) { for (auto &key : _tooltip.keys()) {
if ((key.endsWith(QString("Tooltip"))) && (tooltip[key].toBool())) { if ((key.endsWith("Tooltip")) && (_tooltip[key].toBool())) {
key.remove(QString("Tooltip")); key.remove("Tooltip");
used << key; used << key;
} }
} }
// insert depending keys, refer to AWKeys::calculateValues() // insert depending keys, refer to AWKeys::calculateValues()
// hddtotmb* // hddtotmb*
for (auto key : allKeys.filter(QRegExp(QString("^hddtotmb")))) { for (auto &key : _allKeys.filter(QRegExp("^hddtotmb"))) {
if (!used.contains(key)) if (!used.contains(key))
continue; continue;
key.remove(QString("hddtotmb")); key.remove("hddtotmb");
int index = key.toInt(); int 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(QString("^hddtotgb")))) { for (auto &key : _allKeys.filter(QRegExp("^hddtotgb"))) {
if (!used.contains(key)) if (!used.contains(key))
continue; continue;
key.remove(QString("hddtotgb")); key.remove("hddtotgb");
int index = key.toInt(); int 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(QString("mem"))) if (used.contains("mem"))
used << QString("memmb") << QString("memtotmb"); used << "memmb"
<< "memtotmb";
// memtotmb // memtotmb
if (used.contains(QString("memtotmb"))) if (used.contains("memtotmb"))
used << QString("memusedmb") << QString("memfreemb"); used << "memusedmb"
<< "memfreemb";
// memtotgb // memtotgb
if (used.contains(QString("memtotgb"))) if (used.contains("memtotgb"))
used << QString("memusedgb") << QString("memfreegb"); used << "memusedgb"
<< "memfreegb";
// swap // swap
if (used.contains(QString("swap"))) if (used.contains("swap"))
used << QString("swapmb") << QString("swaptotmb"); used << "swapmb"
<< "swaptotmb";
// swaptotmb // swaptotmb
if (used.contains(QString("swaptotmb"))) if (used.contains("swaptotmb"))
used << QString("swapmb") << QString("swapfreemb"); used << "swapmb"
<< "swapfreemb";
// memtotgb // memtotgb
if (used.contains(QString("swaptotgb"))) if (used.contains("swaptotgb"))
used << QString("swapgb") << QString("swapfreegb"); used << "swapgb"
<< "swapfreegb";
// network keys // network keys
QStringList netKeys(QStringList() QStringList netKeys({"up", "upkb", "uptotal", "uptotalkb", "upunits",
<< QString("up") << QString("upkb") "down", "downkb", "downtotal", "downtotalkb",
<< QString("uptotal") << QString("uptotalkb") "downunits"});
<< QString("upunits") << QString("down") for (auto &key : netKeys) {
<< QString("downkb") << QString("downtotal")
<< QString("downtotalkb") << QString("downunits"));
for (auto key : netKeys) {
if (!used.contains(key)) if (!used.contains(key))
continue; continue;
QStringList filt QStringList filt
= allKeys.filter(QRegExp(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](const QString &key) { return used.contains(key); })) [&used](const QString &key) { return used.contains(key); }))
used << QString("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
// because empty list leads to the same behaviour as skip checking // because empty list leads to the same behaviour as skip checking
if (used.isEmpty()) if (used.isEmpty())
used << QString("dummy"); used << "dummy";
return used.toList(); return used.toList();
} }
@ -175,9 +180,9 @@ QHash<QString, QStringList> AWKeyCache::loadKeysFromCache()
QSettings cache(fileName, QSettings::IniFormat); QSettings cache(fileName, QSettings::IniFormat);
QHash<QString, QStringList> devices; QHash<QString, QStringList> devices;
for (auto group : cache.childGroups()) { for (auto &group : cache.childGroups()) {
cache.beginGroup(group); cache.beginGroup(group);
for (auto key : cache.allKeys()) for (auto &key : cache.allKeys())
devices[group].append(cache.value(key).toString()); devices[group].append(cache.value(key).toString());
cache.endGroup(); cache.endGroup();
} }

View File

@ -26,10 +26,10 @@
namespace AWKeyCache namespace AWKeyCache
{ {
bool addKeyToCache(const QString type, const QString key = QString("")); 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 &allKeys); const QStringList &_allKeys);
QHash<QString, QStringList> loadKeysFromCache(); QHash<QString, QStringList> loadKeysFromCache();
}; };

View File

@ -26,6 +26,7 @@
#include "awkeycache.h" #include "awkeycache.h"
#include "awpatternfunctions.h" #include "awpatternfunctions.h"
// extensions // extensions
#include "extnetworkrequest.h"
#include "extquotes.h" #include "extquotes.h"
#include "extscript.h" #include "extscript.h"
#include "extupgrade.h" #include "extupgrade.h"
@ -33,8 +34,8 @@
#include "graphicalitem.h" #include "graphicalitem.h"
AWKeyOperations::AWKeyOperations(QObject *parent) AWKeyOperations::AWKeyOperations(QObject *_parent)
: QObject(parent) : QObject(_parent)
{ {
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
} }
@ -45,19 +46,20 @@ AWKeyOperations::~AWKeyOperations()
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
// extensions // extensions
delete graphicalItems; delete m_graphicalItems;
delete extQuotes; delete m_extNetRequest;
delete extScripts; delete m_extQuotes;
delete extUpgrade; delete m_extScripts;
delete extWeather; delete m_extUpgrade;
delete m_extWeather;
} }
QStringList AWKeyOperations::devices(const QString type) const QStringList AWKeyOperations::devices(const QString &_type) const
{ {
qCDebug(LOG_AW) << "Looking for type" << type; qCDebug(LOG_AW) << "Looking for type" << _type;
return m_devices[type]; return m_devices[_type];
} }
@ -70,8 +72,8 @@ QHash<QString, QStringList> AWKeyOperations::devices() const
void AWKeyOperations::updateCache() void AWKeyOperations::updateCache()
{ {
// update network and hdd list // update network and hdd list
addKeyToCache(QString("hdd")); addKeyToCache("hdd");
addKeyToCache(QString("net")); addKeyToCache("net");
} }
@ -79,30 +81,24 @@ QStringList AWKeyOperations::dictKeys() const
{ {
QStringList allKeys; QStringList allKeys;
// weather // weather
for (int i = extWeather->activeItems().count() - 1; i >= 0; i--) { for (auto &item : m_extWeather->activeItems()) {
allKeys.append( allKeys.append(item->tag("weatherId"));
extWeather->activeItems().at(i)->tag(QString("weatherId"))); allKeys.append(item->tag("weather"));
allKeys.append( allKeys.append(item->tag("humidity"));
extWeather->activeItems().at(i)->tag(QString("weather"))); allKeys.append(item->tag("pressure"));
allKeys.append( allKeys.append(item->tag("temperature"));
extWeather->activeItems().at(i)->tag(QString("humidity"))); allKeys.append(item->tag("timestamp"));
allKeys.append(
extWeather->activeItems().at(i)->tag(QString("pressure")));
allKeys.append(
extWeather->activeItems().at(i)->tag(QString("temperature")));
allKeys.append(
extWeather->activeItems().at(i)->tag(QString("timestamp")));
} }
// cpuclock & cpu // cpuclock & cpu
for (int i = QThread::idealThreadCount() - 1; i >= 0; i--) { for (int 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 = m_devices[QString("temp")].count() - 1; i >= 0; i--) for (int i = 0; i < m_devices["temp"].count(); i++)
allKeys.append(QString("temp%1").arg(i)); allKeys.append(QString("temp%1").arg(i));
// hdd // hdd
for (int i = m_devices[QString("mount")].count() - 1; i >= 0; i--) { for (int 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));
@ -112,15 +108,15 @@ 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 = m_devices[QString("disk")].count() - 1; i >= 0; i--) { for (int 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 // hdd temp
for (int i = m_devices[QString("hdd")].count() - 1; i >= 0; i--) for (int i = 0; i < m_devices["hdd"].count(); i++)
allKeys.append(QString("hddtemp%1").arg(i)); allKeys.append(QString("hddtemp%1").arg(i));
// network // network
for (int i = m_devices[QString("net")].count() - 1; i >= 0; i--) { for (int 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("downtotalkb%1").arg(i)); allKeys.append(QString("downtotalkb%1").arg(i));
@ -134,42 +130,41 @@ QStringList AWKeyOperations::dictKeys() const
} }
// battery // battery
QStringList allBatteryDevices QStringList allBatteryDevices
= QDir(QString("/sys/class/power_supply")) = QDir("/sys/class/power_supply")
.entryList(QStringList() << QString("BAT*"), .entryList(QStringList({"BAT*"}),
QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name); QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name);
for (int i = allBatteryDevices.count() - 1; i >= 0; i--) for (int i = 0; i < allBatteryDevices.count(); i++)
allKeys.append(QString("bat%1").arg(i)); allKeys.append(QString("bat%1").arg(i));
// package manager // package manager
for (int i = extUpgrade->activeItems().count() - 1; i >= 0; i--) for (auto &item : m_extUpgrade->activeItems())
allKeys.append( allKeys.append(item->tag("pkgcount"));
extUpgrade->activeItems().at(i)->tag(QString("pkgcount")));
// quotes // quotes
for (int i = extQuotes->activeItems().count() - 1; i >= 0; i--) { for (auto &item : m_extQuotes->activeItems()) {
allKeys.append(extQuotes->activeItems().at(i)->tag(QString("ask"))); allKeys.append(item->tag("ask"));
allKeys.append(extQuotes->activeItems().at(i)->tag(QString("askchg"))); allKeys.append(item->tag("askchg"));
allKeys.append( allKeys.append(item->tag("percaskchg"));
extQuotes->activeItems().at(i)->tag(QString("percaskchg"))); allKeys.append(item->tag("bid"));
allKeys.append(extQuotes->activeItems().at(i)->tag(QString("bid"))); allKeys.append(item->tag("bidchg"));
allKeys.append(extQuotes->activeItems().at(i)->tag(QString("bidchg"))); allKeys.append(item->tag("percbidchg"));
allKeys.append( allKeys.append(item->tag("price"));
extQuotes->activeItems().at(i)->tag(QString("percbidchg"))); allKeys.append(item->tag("pricechg"));
allKeys.append(extQuotes->activeItems().at(i)->tag(QString("price"))); allKeys.append(item->tag("percpricechg"));
allKeys.append(
extQuotes->activeItems().at(i)->tag(QString("pricechg")));
allKeys.append(
extQuotes->activeItems().at(i)->tag(QString("percpricechg")));
} }
// custom // custom
for (int i = extScripts->activeItems().count() - 1; i >= 0; i--) for (auto &item : m_extScripts->activeItems())
allKeys.append(extScripts->activeItems().at(i)->tag(QString("custom"))); allKeys.append(item->tag("custom"));
// network requests
for (auto &item : m_extNetRequest->activeItems())
allKeys.append(item->tag("response"));
// bars // bars
for (int i = graphicalItems->activeItems().count() - 1; i >= 0; i--) for (auto &item : m_graphicalItems->activeItems())
allKeys.append( allKeys.append(item->tag("bar"));
graphicalItems->activeItems().at(i)->tag(QString("bar")));
// static keys // static keys
QStringList staticKeys = QString(STATIC_KEYS).split(QChar(',')); allKeys.append(QString(STATIC_KEYS).split(','));
std::for_each(staticKeys.cbegin(), staticKeys.cend(),
[&allKeys](const QString &key) { allKeys.append(key); }); // sort in valid order
allKeys.sort();
std::reverse(allKeys.begin(), allKeys.end());
return allKeys; return allKeys;
} }
@ -177,50 +172,73 @@ QStringList AWKeyOperations::dictKeys() const
// this method is required to provide GraphicalItem functions (e.g. paint()) to // this method is required to provide GraphicalItem functions (e.g. paint()) to
// parent classes // parent classes
GraphicalItem *AWKeyOperations::giByKey(const QString key) const GraphicalItem *AWKeyOperations::giByKey(const QString &_key) const
{ {
qCDebug(LOG_AW) << "Looking for item" << key; qCDebug(LOG_AW) << "Looking for item" << _key;
return graphicalItems->itemByTag(key, QString("bar")); return m_graphicalItems->itemByTag(_key, "bar");
} }
QString AWKeyOperations::infoByKey(QString key) const QString AWKeyOperations::infoByKey(const QString &_key) const
{ {
qCDebug(LOG_AW) << "Requested key" << key; qCDebug(LOG_AW) << "Requested key" << _key;
if (key.startsWith(QString("bar"))) QString stripped = _key;
return graphicalItems->itemByTag(key, QString("bar"))->uniq(); stripped.remove(QRegExp("\\d+"));
else if (key.startsWith(QString("custom"))) QString output;
return extScripts->itemByTag(key, QString("custom"))->uniq();
else if (key.contains(QRegExp(QString("^hdd[rw]"))))
return QString("%1").arg(m_devices[QString(
"disk")][key.remove(QRegExp(QString("hdd[rw]"))).toInt()]);
else if (key.contains(QRegExp(
QString("^hdd([0-9]|mb|gb|freemb|freegb|totmb|totgb)"))))
return QString("%1").arg(m_devices[QString(
"mount")][key
.remove(QRegExp(QString(
"^hdd([0-9]|mb|gb|freemb|freegb|totmb|totgb)")))
.toInt()]);
else if (key.startsWith(QString("hddtemp")))
return QString("%1").arg(
m_devices[QString("hdd")][key.remove(QString("hddtemp")).toInt()]);
else if (key.contains(QRegExp(QString("^(down|up)[0-9]"))))
return QString("%1").arg(m_devices[QString(
"net")][key.remove(QRegExp(QString("^(down|up)"))).toInt()]);
else if (key.startsWith(QString("pkgcount")))
return extUpgrade->itemByTag(key, QString("pkgcount"))->uniq();
else if (key.contains(QRegExp(QString("(^|perc)(ask|bid|price)(chg|)"))))
return extQuotes->itemByTag(key, QString("ask"))->uniq();
else if (key.contains(QRegExp(
QString("(weather|weatherId|humidity|pressure|temperature)"))))
return extWeather->itemByTag(key, QString("weather"))->uniq();
else if (key.startsWith(QString("temp")))
return QString("%1").arg(
m_devices[QString("temp")][key.remove(QString("temp")).toInt()]);
return QString("(none)"); if (_key.startsWith("bar")) {
AbstractExtItem *item = m_graphicalItems->itemByTag(_key, stripped);
if (item)
output = item->uniq();
} else if (_key.startsWith("custom")) {
AbstractExtItem *item = m_extScripts->itemByTag(_key, stripped);
if (item)
output = item->uniq();
} else if (_key.contains(QRegExp("^hdd[rw]"))) {
QString index = _key;
index.remove(QRegExp("hdd[rw]"));
output = m_devices["disk"][index.toInt()];
} else if (_key.contains(
QRegExp("^hdd([0-9]|mb|gb|freemb|freegb|totmb|totgb)"))) {
QString index = _key;
index.remove(QRegExp("^hdd(|mb|gb|freemb|freegb|totmb|totgb)"));
output = m_devices["mount"][index.toInt()];
} else if (_key.startsWith("hddtemp")) {
QString index = _key;
index.remove("hddtemp");
output = m_devices["hdd"][index.toInt()];
} else if (_key.contains(QRegExp("^(down|up)[0-9]"))) {
QString index = _key;
index.remove(QRegExp("^(down|up)"));
output = m_devices["net"][index.toInt()];
} else if (_key.startsWith("pkgcount")) {
AbstractExtItem *item = m_extUpgrade->itemByTag(_key, stripped);
if (item)
output = item->uniq();
} else if (_key.contains(QRegExp("(^|perc)(ask|bid|price)(chg|)"))) {
AbstractExtItem *item = m_extQuotes->itemByTag(_key, stripped);
if (item)
output = item->uniq();
} else if (_key.contains(QRegExp(
"(weather|weatherId|humidity|pressure|temperature)"))) {
AbstractExtItem *item = m_extWeather->itemByTag(_key, stripped);
if (item)
output = item->uniq();
} else if (_key.startsWith("temp")) {
QString index = _key;
index.remove("temp");
output = m_devices["temp"][index.toInt()];
} else if (_key.startsWith("response")) {
AbstractExtItem *item = m_extNetRequest->itemByTag(_key, stripped);
if (item)
output = item->uniq();
} else {
output = "(none)";
}
return output;
} }
@ -230,63 +248,64 @@ QString AWKeyOperations::pattern() const
} }
void AWKeyOperations::setPattern(const QString currentPattern) void AWKeyOperations::setPattern(const QString &_currentPattern)
{ {
qCDebug(LOG_AW) << "Set pattern" << currentPattern; qCDebug(LOG_AW) << "Set pattern" << _currentPattern;
m_pattern = currentPattern; m_pattern = _currentPattern;
} }
void AWKeyOperations::editItem(const QString type) void AWKeyOperations::editItem(const QString &_type)
{ {
qCDebug(LOG_AW) << "Item type" << type; qCDebug(LOG_AW) << "Item type" << _type;
if (type == QString("graphicalitem")) { if (_type == "graphicalitem") {
QStringList keys = dictKeys().filter(QRegExp( QStringList keys = dictKeys().filter(
QString("^(cpu(?!cl).*|gpu$|mem$|swap$|hdd[0-9].*|bat.*)"))); QRegExp("^(cpu(?!cl).*|gpu$|mem$|swap$|hdd[0-9].*|bat.*)"));
keys.sort(); keys.sort();
graphicalItems->setConfigArgs(keys); m_graphicalItems->setConfigArgs(keys);
return graphicalItems->editItems(); return m_graphicalItems->editItems();
} else if (type == QString("extquotes")) { } else if (_type == "extnetworkrequest") {
return extQuotes->editItems(); return m_extNetRequest->editItems();
} else if (type == QString("extscript")) { } else if (_type == "extquotes") {
return extScripts->editItems(); return m_extQuotes->editItems();
} else if (type == QString("extupgrade")) { } else if (_type == "extscript") {
return extUpgrade->editItems(); return m_extScripts->editItems();
} else if (type == QString("extweather")) { } else if (_type == "extupgrade") {
return extWeather->editItems(); return m_extUpgrade->editItems();
} else if (_type == "extweather") {
return m_extWeather->editItems();
} }
} }
void AWKeyOperations::addDevice(const QString &source) void AWKeyOperations::addDevice(const QString &_source)
{ {
qCDebug(LOG_AW) << "Source" << source; qCDebug(LOG_AW) << "Source" << _source;
QRegExp diskRegexp QRegExp diskRegexp = QRegExp("disk/(?:md|sd|hd)[a-z|0-9]_.*/Rate/(?:rblk)");
= QRegExp(QString("disk/(?:md|sd|hd)[a-z|0-9]_.*/Rate/(?:rblk)")); QRegExp mountRegexp = QRegExp("partitions/.*/filllevel");
QRegExp mountRegexp = QRegExp(QString("partitions/.*/filllevel"));
if (source.contains(diskRegexp)) { if (_source.contains(diskRegexp)) {
QString device = source; QString device = _source;
device.remove(QString("/Rate/rblk")); device.remove("/Rate/rblk");
addKeyToCache(QString("disk"), device); addKeyToCache("disk", device);
} else if (source.contains(mountRegexp)) { } else if (_source.contains(mountRegexp)) {
QString device = source; QString device = _source;
device.remove(QString("partitions")).remove(QString("/filllevel")); device.remove("partitions").remove("/filllevel");
addKeyToCache(QString("mount"), device); addKeyToCache("mount", device);
} else if (source.startsWith(QString("lmsensors"))) { } else if (_source.startsWith("lmsensors")) {
addKeyToCache(QString("temp"), source); addKeyToCache("temp", _source);
} }
} }
void AWKeyOperations::addKeyToCache(const QString type, const QString key) void AWKeyOperations::addKeyToCache(const QString &_type, const QString &_key)
{ {
qCDebug(LOG_AW) << "Key" << key << "with type" << type; qCDebug(LOG_AW) << "Key" << _key << "with type" << _type;
if (AWKeyCache::addKeyToCache(type, key)) { if (AWKeyCache::addKeyToCache(_type, _key)) {
m_devices = AWKeyCache::loadKeysFromCache(); m_devices = AWKeyCache::loadKeysFromCache();
reinitKeys(); reinitKeys();
} }
@ -297,23 +316,27 @@ void AWKeyOperations::reinitKeys()
{ {
// renew extensions // renew extensions
// delete them if any // delete them if any
delete graphicalItems; delete m_graphicalItems;
graphicalItems = nullptr; m_graphicalItems = nullptr;
delete extQuotes; delete m_extNetRequest;
extQuotes = nullptr; m_extNetRequest = nullptr;
delete extScripts; delete m_extQuotes;
extScripts = nullptr; m_extQuotes = nullptr;
delete extUpgrade; delete m_extScripts;
extUpgrade = nullptr; m_extScripts = nullptr;
delete extWeather; delete m_extUpgrade;
extWeather = nullptr; m_extUpgrade = nullptr;
delete m_extWeather;
m_extWeather = nullptr;
// create // create
graphicalItems m_graphicalItems
= new ExtItemAggregator<GraphicalItem>(nullptr, QString("desktops")); = new ExtItemAggregator<GraphicalItem>(nullptr, "desktops");
extQuotes = new ExtItemAggregator<ExtQuotes>(nullptr, QString("quotes")); m_extNetRequest
extScripts = new ExtItemAggregator<ExtScript>(nullptr, QString("scripts")); = new ExtItemAggregator<ExtNetworkRequest>(nullptr, "requests");
extUpgrade = new ExtItemAggregator<ExtUpgrade>(nullptr, QString("upgrade")); m_extQuotes = new ExtItemAggregator<ExtQuotes>(nullptr, "quotes");
extWeather = new ExtItemAggregator<ExtWeather>(nullptr, QString("weather")); m_extScripts = new ExtItemAggregator<ExtScript>(nullptr, "scripts");
m_extUpgrade = new ExtItemAggregator<ExtUpgrade>(nullptr, "upgrade");
m_extWeather = new ExtItemAggregator<ExtWeather>(nullptr, "weather");
// init // init
QStringList allKeys = dictKeys(); QStringList allKeys = dictKeys();
@ -323,6 +346,7 @@ void AWKeyOperations::reinitKeys()
m_pattern = AWPatternFunctions::insertKeyCount(m_pattern, allKeys); m_pattern = AWPatternFunctions::insertKeyCount(m_pattern, allKeys);
m_pattern = AWPatternFunctions::insertKeyNames(m_pattern, allKeys); m_pattern = AWPatternFunctions::insertKeyNames(m_pattern, allKeys);
m_pattern = AWPatternFunctions::insertKeys(m_pattern, allKeys); m_pattern = AWPatternFunctions::insertKeys(m_pattern, allKeys);
m_pattern = AWPatternFunctions::insertMacros(m_pattern);
// wrap templates // wrap templates
m_pattern = AWPatternFunctions::expandTemplates(m_pattern); m_pattern = AWPatternFunctions::expandTemplates(m_pattern);

View File

@ -30,6 +30,7 @@
class AWDataAggregator; class AWDataAggregator;
class AWDataEngineAggregator; class AWDataEngineAggregator;
class AWKeysAggregator; class AWKeysAggregator;
class ExtNetworkRequest;
class ExtQuotes; class ExtQuotes;
class ExtScript; class ExtScript;
class ExtUpgrade; class ExtUpgrade;
@ -43,37 +44,38 @@ class AWKeyOperations : public QObject
Q_PROPERTY(QString pattern READ pattern WRITE setPattern) Q_PROPERTY(QString pattern READ pattern WRITE setPattern)
public: public:
explicit AWKeyOperations(QObject *parent = nullptr); explicit AWKeyOperations(QObject *_parent = nullptr);
virtual ~AWKeyOperations(); virtual ~AWKeyOperations();
QStringList devices(const QString type) const; QStringList devices(const QString &_type) const;
QHash<QString, QStringList> devices() const; QHash<QString, QStringList> devices() const;
void updateCache(); void updateCache();
// keys // keys
QStringList dictKeys() const; QStringList dictKeys() const;
GraphicalItem *giByKey(const QString key) const; GraphicalItem *giByKey(const QString &_key) const;
// values // values
QString infoByKey(QString key) const; QString infoByKey(const QString &_key) const;
QString pattern() const; 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);
signals: signals:
void updateKeys(const QStringList currentKeys); void updateKeys(const QStringList &_currentKeys);
public slots: public slots:
void addDevice(const QString &source); void addDevice(const QString &_source);
private: private:
// methods // methods
void addKeyToCache(const QString type, const QString key = QString("")); void addKeyToCache(const QString &_type, const QString &_key = "");
void reinitKeys(); void reinitKeys();
// objects // objects
ExtItemAggregator<GraphicalItem> *graphicalItems = nullptr; ExtItemAggregator<GraphicalItem> *m_graphicalItems = nullptr;
ExtItemAggregator<ExtQuotes> *extQuotes = nullptr; ExtItemAggregator<ExtNetworkRequest> *m_extNetRequest = nullptr;
ExtItemAggregator<ExtScript> *extScripts = nullptr; ExtItemAggregator<ExtQuotes> *m_extQuotes = nullptr;
ExtItemAggregator<ExtUpgrade> *extUpgrade = nullptr; ExtItemAggregator<ExtScript> *m_extScripts = nullptr;
ExtItemAggregator<ExtWeather> *extWeather = nullptr; ExtItemAggregator<ExtUpgrade> *m_extUpgrade = nullptr;
ExtItemAggregator<ExtWeather> *m_extWeather = nullptr;
// variables // variables
QHash<QString, QStringList> m_devices; QHash<QString, QStringList> m_devices;
QString m_pattern; QString m_pattern;

View File

@ -17,14 +17,16 @@
#include "awkeys.h" #include "awkeys.h"
#include <QtConcurrent/QtConcurrent> #include <QDBusConnection>
#include <QJSEngine> #include <QDBusError>
#include <QRegExp> #include <QRegExp>
#include <QThread> #include <QThread>
#include <QTimer> #include <QTimer>
#include <QtConcurrent/QtConcurrent>
#include "awdataaggregator.h" #include "awdataaggregator.h"
#include "awdataengineaggregator.h" #include "awdataengineaggregator.h"
#include "awdbusadaptor.h"
#include "awdebug.h" #include "awdebug.h"
#include "awkeycache.h" #include "awkeycache.h"
#include "awkeyoperations.h" #include "awkeyoperations.h"
@ -33,37 +35,39 @@
#include "graphicalitem.h" #include "graphicalitem.h"
AWKeys::AWKeys(QObject *parent) AWKeys::AWKeys(QObject *_parent)
: QObject(parent) : QObject(_parent)
{ {
qSetMessagePattern(LOG_FORMAT); qSetMessagePattern(AWDebug::LOG_FORMAT);
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
for (auto metadata : getBuildData()) for (auto &metadata : AWDebug::getBuildData())
qCDebug(LOG_AW) << metadata; qCDebug(LOG_AW) << metadata;
// thread pool // thread pool
m_threadPool = new QThreadPool(this); m_threadPool = new QThreadPool(this);
aggregator = new AWKeysAggregator(this); m_aggregator = new AWKeysAggregator(this);
dataAggregator = new AWDataAggregator(this); m_dataAggregator = new AWDataAggregator(this);
dataEngineAggregator = new AWDataEngineAggregator(this); m_dataEngineAggregator = new AWDataEngineAggregator(this);
keyOperator = new AWKeyOperations(this); m_keyOperator = new AWKeyOperations(this);
m_timer = new QTimer(this); m_timer = new QTimer(this);
m_timer->setSingleShot(false); m_timer->setSingleShot(false);
createDBusInterface();
// update key data if required // update key data if required
connect(keyOperator, SIGNAL(updateKeys(QStringList)), this, connect(m_keyOperator, SIGNAL(updateKeys(const QStringList &)), this,
SLOT(reinitKeys(QStringList))); SLOT(reinitKeys(const QStringList &)));
connect(m_timer, SIGNAL(timeout()), this, SLOT(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(dataAggregator, SIGNAL(toolTipPainted(const QString)), this, connect(m_dataAggregator, SIGNAL(toolTipPainted(const QString &)), this,
SIGNAL(needToolTipToBeUpdated(const QString))); SIGNAL(needToolTipToBeUpdated(const QString &)));
connect(this, SIGNAL(dropSourceFromDataengine(QString)), connect(this, SIGNAL(dropSourceFromDataengine(const QString &)),
dataEngineAggregator, SLOT(dropSource(QString))); m_dataEngineAggregator, SLOT(dropSource(const QString &)));
// transfer signal from dataengine to update source list // transfer signal from dataengine to update source list
connect(dataEngineAggregator, SIGNAL(deviceAdded(const QString &)), connect(m_dataEngineAggregator, SIGNAL(deviceAdded(const QString &)),
keyOperator, SLOT(addDevice(const QString &))); m_keyOperator, SLOT(addDevice(const QString &)));
} }
@ -74,171 +78,198 @@ AWKeys::~AWKeys()
m_timer->stop(); m_timer->stop();
delete m_timer; delete m_timer;
// delete dbus session
qlonglong id = reinterpret_cast<qlonglong>(this);
QDBusConnection::sessionBus().unregisterObject(QString("/%1").arg(id));
// core // core
delete dataEngineAggregator; delete m_dataEngineAggregator;
delete m_threadPool; delete m_threadPool;
delete aggregator; delete m_aggregator;
delete dataAggregator; delete m_dataAggregator;
delete keyOperator; delete m_keyOperator;
} }
void AWKeys::initDataAggregator(const QVariantMap tooltipParams) bool AWKeys::isDBusActive() const
{ {
qCDebug(LOG_AW) << "Tooltip parameters" << tooltipParams; return m_dbusActive;
}
void AWKeys::initDataAggregator(const QVariantMap &_tooltipParams)
{
qCDebug(LOG_AW) << "Tooltip parameters" << _tooltipParams;
// store parameters to generate m_requiredKeys // store parameters to generate m_requiredKeys
m_tooltipParams = tooltipParams; m_tooltipParams = _tooltipParams;
dataAggregator->setParameters(m_tooltipParams); m_dataAggregator->setParameters(m_tooltipParams);
} }
void AWKeys::initKeys(const QString currentPattern, const int interval, void AWKeys::initKeys(const QString &_currentPattern, const int _interval,
const int limit, const bool optimize) const int _limit, const bool _optimize)
{ {
qCDebug(LOG_AW) << "Pattern" << currentPattern << "with interval" qCDebug(LOG_AW) << "Pattern" << _currentPattern << "with interval"
<< interval << "and queue limit" << limit << _interval << "and queue limit" << _limit
<< "with optimization" << optimize; << "with optimization" << _optimize;
// init // init
m_optimize = optimize; m_optimize = _optimize;
m_threadPool->setMaxThreadCount(limit == 0 ? QThread::idealThreadCount() m_threadPool->setMaxThreadCount(_limit == 0 ? QThread::idealThreadCount()
: limit); : _limit);
// child objects // child objects
keyOperator->setPattern(currentPattern); m_aggregator->initFormatters();
keyOperator->updateCache(); m_keyOperator->setPattern(_currentPattern);
dataEngineAggregator->clear(); m_keyOperator->updateCache();
m_dataEngineAggregator->clear();
dataEngineAggregator->initDataEngines(interval); m_dataEngineAggregator->initDataEngines(_interval);
// timer // timer
m_timer->setInterval(interval); m_timer->setInterval(_interval);
m_timer->start(); m_timer->start();
} }
void AWKeys::setAggregatorProperty(const QString key, const QVariant value) void AWKeys::setAggregatorProperty(const QString &_key, const QVariant &_value)
{ {
qCDebug(LOG_AW) << "Key" << key << "with value" << value; qCDebug(LOG_AW) << "Key" << _key << "with value" << _value;
aggregator->setProperty(key.toUtf8().constData(), value); m_aggregator->setProperty(_key.toUtf8().constData(), _value);
} }
void AWKeys::setWrapNewLines(const bool wrap) void AWKeys::setWrapNewLines(const bool _wrap)
{ {
qCDebug(LOG_AW) << "Is wrapping enabled" << wrap; qCDebug(LOG_AW) << "Is wrapping enabled" << _wrap;
m_wrapNewLines = wrap; m_wrapNewLines = _wrap;
} }
void AWKeys::updateCache() void AWKeys::updateCache()
{ {
return keyOperator->updateCache(); return m_keyOperator->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;
QStringList allKeys = keyOperator->dictKeys(); // check if functions asked
if (_regexp == "functions")
return QString(STATIC_FUNCTIONS).split(',');
QStringList allKeys = m_keyOperator->dictKeys();
// sort if required // sort if required
if (sorted) if (_sorted)
allKeys.sort(); allKeys.sort();
return allKeys.filter(QRegExp(regexp)); return allKeys.filter(QRegExp(_regexp));
} }
QStringList AWKeys::getHddDevices() const QVariantList AWKeys::getHddDevices() const
{ {
QStringList devices = keyOperator->devices(QString("hdd")); QStringList hddDevices = m_keyOperator->devices("hdd");
// required by selector in the UI // required by selector in the UI
devices.insert(0, QString("disable")); hddDevices.insert(0, "disable");
devices.insert(0, QString("auto")); 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; return devices;
} }
QString AWKeys::infoByKey(QString key) const QString AWKeys::infoByKey(const QString &_key) const
{ {
qCDebug(LOG_AW) << "Requested info for key" << key; qCDebug(LOG_AW) << "Requested info for key" << _key;
return keyOperator->infoByKey(key); return m_keyOperator->infoByKey(_key);
} }
// HACK this method requires to define tag value from bar from UI interface // HACK this method requires to define tag value from bar from UI interface
QString AWKeys::valueByKey(QString key) const QString AWKeys::valueByKey(const QString &_key) const
{ {
qCDebug(LOG_AW) << "Requested value for key" << key; qCDebug(LOG_AW) << "Requested value for key" << _key;
key.remove(QRegExp(QString("^bar[0-9]{1,}"))); QString trueKey
return aggregator->formatter(values[key], key); = _key.startsWith("bar") ? m_keyOperator->infoByKey(_key) : _key;
return m_aggregator->formatter(m_values[trueKey], trueKey);
} }
void AWKeys::editItem(const QString type) void AWKeys::editItem(const QString &_type)
{ {
qCDebug(LOG_AW) << "Item type" << type; qCDebug(LOG_AW) << "Item type" << _type;
return keyOperator->editItem(type); return m_keyOperator->editItem(_type);
} }
void AWKeys::dataUpdated(const QString &sourceName, void AWKeys::dataUpdated(const QString &_sourceName,
const Plasma::DataEngine::Data &data) const Plasma::DataEngine::Data &_data)
{ {
// run concurrent data update // run concurrent data update
QtConcurrent::run(m_threadPool, this, &AWKeys::setDataBySource, sourceName, QtConcurrent::run(m_threadPool, this, &AWKeys::setDataBySource, _sourceName,
data); _data);
} }
void AWKeys::reinitKeys(const QStringList currentKeys) 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 m_foundBars = AWPatternFunctions::findKeys(m_keyOperator->pattern(),
= AWPatternFunctions::findBars(keyOperator->pattern(), currentKeys); _currentKeys, true);
m_foundKeys m_foundKeys = AWPatternFunctions::findKeys(m_keyOperator->pattern(),
= AWPatternFunctions::findKeys(keyOperator->pattern(), currentKeys); _currentKeys, false);
m_foundLambdas = AWPatternFunctions::findLambdas(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 = keyOperator->giByKey(bar); GraphicalItem *item = m_keyOperator->giByKey(bar);
if (item->isCustom()) if (item->isCustom())
item->setUsedKeys( item->setUsedKeys(
AWPatternFunctions::findKeys(item->bar(), currentKeys)); 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_requiredKeys
= m_optimize ? AWKeyCache::getRequiredKeys(m_foundKeys, barKeys, = m_optimize ? AWKeyCache::getRequiredKeys(
m_tooltipParams, currentKeys) m_foundKeys, barKeys, m_tooltipParams, _currentKeys)
: QStringList(); : QStringList();
// set key data to aggregator // set key data to m_aggregator
aggregator->setDevices(keyOperator->devices()); m_aggregator->setDevices(m_keyOperator->devices());
} }
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(keyOperator->pattern()); QString text = parsePattern(m_keyOperator->pattern());
m_mutex.unlock();
emit(needTextToBeUpdated(text)); emit(needTextToBeUpdated(text));
emit(dataAggregator->updateData(values)); emit(m_dataAggregator->updateData(m_values));
} }
@ -247,120 +278,140 @@ void AWKeys::updateTextData()
void AWKeys::calculateValues() void AWKeys::calculateValues()
{ {
// hddtot* // hddtot*
QStringList mountDevices = keyOperator->devices(QString("mount")); QStringList mountDevices = m_keyOperator->devices("mount");
for (auto device : mountDevices) { for (auto &device : mountDevices) {
int index = mountDevices.indexOf(device); int index = mountDevices.indexOf(device);
values[QString("hddtotmb%1").arg(index)] m_values[QString("hddtotmb%1").arg(index)]
= values[QString("hddfreemb%1").arg(index)].toFloat() = m_values[QString("hddfreemb%1").arg(index)].toFloat()
+ values[QString("hddmb%1").arg(index)].toFloat(); + m_values[QString("hddmb%1").arg(index)].toFloat();
values[QString("hddtotgb%1").arg(index)] m_values[QString("hddtotgb%1").arg(index)]
= values[QString("hddfreegb%1").arg(index)].toFloat() = m_values[QString("hddfreegb%1").arg(index)].toFloat()
+ values[QString("hddgb%1").arg(index)].toFloat(); + m_values[QString("hddgb%1").arg(index)].toFloat();
} }
// memtot* // memtot*
values[QString("memtotmb")] = values[QString("memusedmb")].toInt() m_values["memtotmb"]
+ values[QString("memfreemb")].toInt(); = m_values["memusedmb"].toInt() + m_values["memfreemb"].toInt();
values[QString("memtotgb")] = values[QString("memusedgb")].toFloat() m_values["memtotgb"]
+ values[QString("memfreegb")].toFloat(); = m_values["memusedgb"].toFloat() + m_values["memfreegb"].toFloat();
// mem // mem
values[QString("mem")] = 100.0f * values[QString("memmb")].toFloat() m_values["mem"]
/ values[QString("memtotmb")].toFloat(); = 100.0f * m_values["memmb"].toFloat() / m_values["memtotmb"].toFloat();
// up, down, upkb, downkb, upunits, downunits // up, down, upkb, downkb, upunits, downunits
int netIndex = keyOperator->devices(QString("net")) int netIndex
.indexOf(values[QString("netdev")].toString()); = m_keyOperator->devices("net").indexOf(m_values["netdev"].toString());
values[QString("down")] = values[QString("down%1").arg(netIndex)]; m_values["down"] = m_values[QString("down%1").arg(netIndex)];
values[QString("downkb")] = values[QString("downkb%1").arg(netIndex)]; m_values["downkb"] = m_values[QString("downkb%1").arg(netIndex)];
values[QString("downtotal")] = values[QString("downtotal%1").arg(netIndex)]; m_values["downtotal"] = m_values[QString("downtotal%1").arg(netIndex)];
values[QString("downtotalkb")] m_values["downtotalkb"] = m_values[QString("downtotalkb%1").arg(netIndex)];
= values[QString("downtotalkb%1").arg(netIndex)]; m_values["downunits"] = m_values[QString("downunits%1").arg(netIndex)];
values[QString("downunits")] = values[QString("downunits%1").arg(netIndex)]; m_values["up"] = m_values[QString("up%1").arg(netIndex)];
values[QString("up")] = values[QString("up%1").arg(netIndex)]; m_values["upkb"] = m_values[QString("upkb%1").arg(netIndex)];
values[QString("upkb")] = values[QString("upkb%1").arg(netIndex)]; m_values["uptotal"] = m_values[QString("uptotal%1").arg(netIndex)];
values[QString("uptotal")] = values[QString("uptotal%1").arg(netIndex)]; m_values["uptotalkb"] = m_values[QString("uptotalkb%1").arg(netIndex)];
values[QString("uptotalkb")] = values[QString("uptotalkb%1").arg(netIndex)]; m_values["upunits"] = m_values[QString("upunits%1").arg(netIndex)];
values[QString("upunits")] = values[QString("upunits%1").arg(netIndex)];
// swaptot* // swaptot*
values[QString("swaptotmb")] = values[QString("swapmb")].toInt() m_values["swaptotmb"]
+ values[QString("swapfreemb")].toInt(); = m_values["swapmb"].toInt() + m_values["swapfreemb"].toInt();
values[QString("swaptotgb")] = values[QString("swapgb")].toFloat() m_values["swaptotgb"]
+ values[QString("swapfreegb")].toFloat(); = m_values["swapgb"].toFloat() + m_values["swapfreegb"].toFloat();
// swap // swap
values[QString("swap")] = 100.0f * values[QString("swapmb")].toFloat() m_values["swap"] = 100.0f * m_values["swapmb"].toFloat()
/ values[QString("swaptotmb")].toFloat(); / m_values["swaptotmb"].toFloat();
// lambdas // lambdas
for (auto key : m_foundLambdas) for (auto &key : m_foundLambdas)
values[key] = AWPatternFunctions::expandLambdas(key, aggregator, values, m_values[key] = AWPatternFunctions::expandLambdas(
m_foundKeys); key, m_aggregator, m_values, m_foundKeys);
} }
QString AWKeys::parsePattern(QString pattern) const void AWKeys::createDBusInterface()
{
// get this object id
qlonglong id = reinterpret_cast<qlonglong>(this);
// create session
QDBusConnection bus = QDBusConnection::sessionBus();
if (!bus.registerService(AWDBUS_SERVICE))
qCWarning(LOG_AW) << "Could not register DBus service, last error"
<< bus.lastError().message();
if (!bus.registerObject(QString("/%1").arg(id), new AWDBusAdaptor(this),
QDBusConnection::ExportAllContents)) {
qCWarning(LOG_AW) << "Could not register DBus object, last error"
<< bus.lastError().message();
m_dbusActive = false;
} else {
m_dbusActive = true;
}
}
QString AWKeys::parsePattern(QString _pattern) const
{ {
// screen sign // screen sign
pattern.replace(QString("$$"), QString(0x1d)); _pattern.replace("$$", QString(0x1d));
// lambdas // lambdas
for (auto key : m_foundLambdas) for (auto &key : m_foundLambdas)
pattern.replace(QString("${{%1}}").arg(key), values[key].toString()); _pattern.replace(QString("${{%1}}").arg(key), m_values[key].toString());
// main keys // main keys
for (auto key : m_foundKeys) for (auto &key : m_foundKeys)
pattern.replace(QString("$%1").arg(key), [this](const QString &tag, _pattern.replace(
const QVariant &value) { QString("$%1").arg(key),
QString strValue = aggregator->formatter(value, tag); [this](const QString &tag, const QVariant &value) {
if ((!tag.startsWith(QString("custom"))) QString strValue = m_aggregator->formatter(value, tag);
&& (!tag.startsWith(QString("weather")))) if ((!tag.startsWith("custom")) && (!tag.startsWith("weather")))
strValue.replace(QString(" "), QString("&nbsp;")); strValue.replace(" ", "&nbsp;");
return strValue; return strValue;
}(key, values[key])); }(key, m_values[key]));
// bars // bars
for (auto bar : m_foundBars) { for (auto &bar : m_foundBars) {
GraphicalItem *item = keyOperator->giByKey(bar); GraphicalItem *item = m_keyOperator->giByKey(bar);
QString image QString image
= item->isCustom() = item->isCustom()
? item->image(AWPatternFunctions::expandLambdas( ? item->image(AWPatternFunctions::expandLambdas(
item->bar(), aggregator, values, item->usedKeys())) item->bar(), m_aggregator, m_values, item->usedKeys()))
: item->image(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), QString("$")); _pattern.replace(QString(0x1d), "$");
if (m_wrapNewLines) if (m_wrapNewLines)
pattern.replace(QString("\n"), QString("<br>")); _pattern.replace("\n", "<br>");
return pattern; return _pattern;
} }
void AWKeys::setDataBySource(const QString &sourceName, const QVariantMap &data) void AWKeys::setDataBySource(const QString &_sourceName,
const QVariantMap &_data)
{ {
qCDebug(LOG_AW) << "Source" << sourceName << "with data" << data; qCDebug(LOG_AW) << "Source" << _sourceName << "with data" << _data;
// first list init // first list init
QStringList tags = aggregator->keysFromSource(sourceName); QStringList tags = m_aggregator->keysFromSource(_sourceName);
if (tags.isEmpty()) if (tags.isEmpty())
tags = aggregator->registerSource( tags = m_aggregator->registerSource(
sourceName, data[QString("units")].toString(), 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) << "Source" << _sourceName << "not found";
return emit(dropSourceFromDataengine(sourceName)); return emit(dropSourceFromDataengine(_sourceName));
} }
m_mutex.lock(); m_mutex.lock();
// HACK workaround for time values which are stored in the different path // HACK workaround for time values which are stored in the different path
std::for_each(tags.cbegin(), tags.cend(), std::for_each(tags.cbegin(), tags.cend(),
[this, &data, &sourceName](const QString &tag) { [this, &_data, &_sourceName](const QString &tag) {
values[tag] = sourceName == QString("Local") m_values[tag] = _sourceName == "Local" ? _data["DateTime"]
? data[QString("DateTime")] : _data["value"];
: data[QString("value")];
}); });
m_mutex.unlock(); m_mutex.unlock();
} }

View File

@ -37,57 +37,61 @@ class AWKeys : public QObject
Q_OBJECT Q_OBJECT
public: public:
explicit AWKeys(QObject *parent = nullptr); explicit AWKeys(QObject *_parent = nullptr);
virtual ~AWKeys(); virtual ~AWKeys();
Q_INVOKABLE void initDataAggregator(const QVariantMap tooltipParams); bool isDBusActive() const;
Q_INVOKABLE void initKeys(const QString currentPattern, const int interval, Q_INVOKABLE void initDataAggregator(const QVariantMap &_tooltipParams);
const int limit, const bool optimize); Q_INVOKABLE void initKeys(const QString &_currentPattern,
Q_INVOKABLE void setAggregatorProperty(const QString key, const int _interval, const int _limit,
const QVariant value); const bool _optimize);
Q_INVOKABLE void setWrapNewLines(const bool wrap = false); Q_INVOKABLE void setAggregatorProperty(const QString &_key,
const QVariant &_value);
Q_INVOKABLE void setWrapNewLines(const bool _wrap = false);
// 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 QStringList dictKeys(const bool _sorted = false,
const QString regexp = QString()) const; const QString &_regexp = "") const;
Q_INVOKABLE QStringList getHddDevices() const; Q_INVOKABLE QVariantList getHddDevices() const;
// values // values
Q_INVOKABLE QString infoByKey(QString key) const; Q_INVOKABLE QString infoByKey(const QString &_key) const;
Q_INVOKABLE QString valueByKey(QString key) const; Q_INVOKABLE QString valueByKey(const QString &_key) const;
// configuration // configuration
Q_INVOKABLE void editItem(const QString type); Q_INVOKABLE void editItem(const QString &_type);
public slots: public slots:
void dataUpdated(const QString &sourceName, void dataUpdated(const QString &_sourceName,
const Plasma::DataEngine::Data &data); const Plasma::DataEngine::Data &_data);
// dummy method required by DataEngine connections // dummy method required by DataEngine connections
void modelChanged(QString, QAbstractItemModel *){}; 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 reinitKeys(const QStringList currentKeys); void reinitKeys(const QStringList &_currentKeys);
void updateTextData(); void updateTextData();
private: private:
// methods // methods
void calculateValues(); void calculateValues();
QString parsePattern(QString pattern) const; void createDBusInterface();
void setDataBySource(const QString &sourceName, const QVariantMap &data); QString parsePattern(QString _pattern) const;
void setDataBySource(const QString &_sourceName, const QVariantMap &_data);
// objects // objects
AWDataAggregator *dataAggregator = nullptr; AWDataAggregator *m_dataAggregator = nullptr;
AWDataEngineAggregator *dataEngineAggregator = nullptr; AWDataEngineAggregator *m_dataEngineAggregator = nullptr;
AWKeysAggregator *aggregator = nullptr; AWKeysAggregator *m_aggregator = nullptr;
AWKeyOperations *keyOperator = nullptr; AWKeyOperations *m_keyOperator = nullptr;
QTimer *m_timer = nullptr; QTimer *m_timer = nullptr;
// variables // variables
bool m_dbusActive = false;
QVariantMap m_tooltipParams; QVariantMap m_tooltipParams;
QStringList m_foundBars, m_foundKeys, m_foundLambdas, m_requiredKeys; QStringList m_foundBars, m_foundKeys, m_foundLambdas, m_requiredKeys;
QVariantHash values; QVariantHash m_values;
bool m_optimize = false; bool m_optimize = false;
bool m_wrapNewLines = false; bool m_wrapNewLines = false;
// multithread features // multithread features

View File

@ -27,29 +27,31 @@
#include "awformatterhelper.h" #include "awformatterhelper.h"
AWKeysAggregator::AWKeysAggregator(QObject *parent) AWKeysAggregator::AWKeysAggregator(QObject *_parent)
: QObject(parent) : QObject(_parent)
{ {
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
// sort time keys
m_timeKeys.sort();
std::reverse(m_timeKeys.begin(), m_timeKeys.end());
// default formatters // default formatters
// memory // memory
m_formatter[QString("mem")] = FormatterType::Float; m_formatter["mem"] = FormatterType::Float;
m_formatter[QString("memtotmb")] = FormatterType::MemMBFormat; m_formatter["memtotmb"] = FormatterType::MemMBFormat;
m_formatter[QString("memtotgb")] = FormatterType::MemGBFormat; m_formatter["memtotgb"] = FormatterType::MemGBFormat;
// network // network
m_formatter[QString("down")] = FormatterType::NetSmartFormat; m_formatter["down"] = FormatterType::NetSmartFormat;
m_formatter[QString("downkb")] = FormatterType::Integer; m_formatter["downkb"] = FormatterType::Integer;
m_formatter[QString("downunits")] = FormatterType::NetSmartUnits; m_formatter["downunits"] = FormatterType::NetSmartUnits;
m_formatter[QString("up")] = FormatterType::NetSmartFormat; m_formatter["up"] = FormatterType::NetSmartFormat;
m_formatter[QString("upkb")] = FormatterType::Integer; m_formatter["upkb"] = FormatterType::Integer;
m_formatter[QString("upunits")] = FormatterType::NetSmartUnits; m_formatter["upunits"] = FormatterType::NetSmartUnits;
// swap // swap
m_formatter[QString("swap")] = FormatterType::Float; m_formatter["swap"] = FormatterType::Float;
m_formatter[QString("swaptotmb")] = FormatterType::MemMBFormat; m_formatter["swaptotmb"] = FormatterType::MemMBFormat;
m_formatter[QString("swaptotgb")] = FormatterType::MemGBFormat; m_formatter["swaptotgb"] = FormatterType::MemGBFormat;
m_customFormatters = new AWFormatterHelper(this);
} }
@ -61,42 +63,50 @@ AWKeysAggregator::~AWKeysAggregator()
} }
QString AWKeysAggregator::formatter(const QVariant &data, void AWKeysAggregator::initFormatters()
const QString &key) const
{ {
qCDebug(LOG_AW) << "Data" << data << "for key" << key; if (m_customFormatters)
delete m_customFormatters;
m_customFormatters = new AWFormatterHelper(nullptr);
}
QString AWKeysAggregator::formatter(const QVariant &_data,
const QString &_key) const
{
qCDebug(LOG_AW) << "Data" << _data << "for key" << _key;
QString output; QString output;
QLocale loc = m_translate ? QLocale::system() : QLocale::c(); QLocale loc = m_translate ? QLocale::system() : QLocale::c();
// case block // case block
switch (m_formatter[key]) { switch (m_formatter[_key]) {
case FormatterType::Float: case FormatterType::Float:
output = QString("%1").arg(data.toFloat(), 5, 'f', 1); output = QString("%1").arg(_data.toFloat(), 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.toFloat(), 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.toFloat(), 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.toFloat(), 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.toFloat(), 3, 'f', 0);
break; break;
case FormatterType::List: case FormatterType::List:
output = data.toStringList().join(QChar(',')); output = _data.toStringList().join(',');
break; break;
case FormatterType::ACFormat: case FormatterType::ACFormat:
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.toFloat() / (1024.0 * 1024.0), 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.toFloat() / 1024.0, 5, 'f', 0);
break; break;
case FormatterType::NetSmartFormat: case FormatterType::NetSmartFormat:
output = [](const float value) { output = [](const float value) {
@ -104,44 +114,44 @@ QString AWKeysAggregator::formatter(const QVariant &data,
return QString("%1").arg(value / 1024.0, 4, 'f', 1); return QString("%1").arg(value / 1024.0, 4, 'f', 1);
else else
return QString("%1").arg(value, 4, 'f', 0); return QString("%1").arg(value, 4, 'f', 0);
}(data.toFloat()); }(_data.toFloat());
break; break;
case FormatterType::NetSmartUnits: case FormatterType::NetSmartUnits:
if (data.toFloat() > 1024.0) if (_data.toFloat() > 1024.0)
output = m_translate ? i18n("MB/s") : QString("MB/s"); output = m_translate ? i18n("MB/s") : "MB/s";
else else
output = m_translate ? i18n("KB/s") : QString("KB/s"); output = m_translate ? i18n("KB/s") : "KB/s";
break; break;
case FormatterType::Quotes: case FormatterType::Quotes:
// first cast // first cast
output = QString("%1").arg(data.toDouble(), 0, 'f'); output = QString("%1").arg(_data.toDouble(), 0, 'f');
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.toFloat()), 5, 'f', 1);
break; break;
case FormatterType::Time: case FormatterType::Time:
output = data.toDateTime().toString(); output = _data.toDateTime().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 : 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()); }(_data.toDateTime());
break; break;
case FormatterType::TimeISO: case FormatterType::TimeISO:
output = data.toDateTime().toString(Qt::ISODate); output = _data.toDateTime().toString(Qt::ISODate);
break; break;
case FormatterType::TimeLong: case FormatterType::TimeLong:
output = loc.toString(data.toDateTime(), QLocale::LongFormat); output = loc.toString(_data.toDateTime(), QLocale::LongFormat);
break; break;
case FormatterType::TimeShort: case FormatterType::TimeShort:
output = loc.toString(data.toDateTime(), QLocale::ShortFormat); output = loc.toString(_data.toDateTime(), QLocale::ShortFormat);
break; break;
case FormatterType::Timestamp: case FormatterType::Timestamp:
output = QString("%1").arg( output = QString("%1").arg(
data.toDateTime().toMSecsSinceEpoch() / 1000.0, 10, 'f', 0); _data.toDateTime().toMSecsSinceEpoch() / 1000.0, 10, 'f', 0);
break; break;
case FormatterType::Uptime: case FormatterType::Uptime:
case FormatterType::UptimeCustom: case FormatterType::UptimeCustom:
@ -151,26 +161,26 @@ QString AWKeysAggregator::formatter(const QVariant &data,
int minutes = seconds / 60 % 60; int minutes = seconds / 60 % 60;
int hours = ((seconds / 60) - minutes) / 60 % 24; int hours = ((seconds / 60) - minutes) / 60 % 24;
int days = (((seconds / 60) - minutes) / 60 - hours) / 24; int days = (((seconds / 60) - minutes) / 60 - hours) / 24;
source.replace(QString("$dd"), source.replace("$dd",
QString("%1").arg(days, 3, 10, QChar('0'))); QString("%1").arg(days, 3, 10, QChar('0')));
source.replace(QString("$d"), QString("%1").arg(days)); source.replace("$d", QString("%1").arg(days));
source.replace(QString("$hh"), source.replace("$hh",
QString("%1").arg(hours, 2, 10, QChar('0'))); QString("%1").arg(hours, 2, 10, QChar('0')));
source.replace(QString("$h"), QString("%1").arg(hours)); source.replace("$h", QString("%1").arg(hours));
source.replace(QString("$mm"), source.replace("$mm",
QString("%1").arg(minutes, 2, 10, QChar('0'))); QString("%1").arg(minutes, 2, 10, QChar('0')));
source.replace(QString("$m"), QString("%1").arg(minutes)); source.replace("$m", QString("%1").arg(minutes));
return source; return source;
}(m_formatter[key] == FormatterType::Uptime }(m_formatter[_key] == FormatterType::Uptime ? "$ddd$hhh$mmm"
? QString("$ddd$hhh$mmm") : m_customUptime,
: m_customUptime, static_cast<int>(_data.toFloat()));
static_cast<int>(data.toFloat()));
break; break;
case FormatterType::NoFormat: case FormatterType::NoFormat:
output = data.toString(); output = _data.toString();
break; break;
case FormatterType::Custom: case FormatterType::Custom:
output = m_customFormatters->convert(data, key); if (m_customFormatters)
output = m_customFormatters->convert(_data, _key);
break; break;
} }
@ -178,176 +188,176 @@ QString AWKeysAggregator::formatter(const QVariant &data,
} }
QStringList AWKeysAggregator::keysFromSource(const QString &source) const QStringList AWKeysAggregator::keysFromSource(const QString &_source) const
{ {
qCDebug(LOG_AW) << "Search for source" << source; qCDebug(LOG_AW) << "Search for source" << _source;
return m_map.values(source); return m_map.values(_source);
} }
void AWKeysAggregator::setAcOffline(const QString inactive) void AWKeysAggregator::setAcOffline(const QString &_inactive)
{ {
qCDebug(LOG_AW) << "Inactive AC string" << inactive; qCDebug(LOG_AW) << "Inactive AC string" << _inactive;
m_acOffline = inactive; m_acOffline = _inactive;
} }
void AWKeysAggregator::setAcOnline(const QString active) void AWKeysAggregator::setAcOnline(const QString &_active)
{ {
qCDebug(LOG_AW) << "Active AC string" << active; qCDebug(LOG_AW) << "Active AC string" << _active;
m_acOnline = active; m_acOnline = _active;
} }
void AWKeysAggregator::setCustomTime(const QString customTime) void AWKeysAggregator::setCustomTime(const QString &_customTime)
{ {
qCDebug(LOG_AW) << "Format" << customTime; qCDebug(LOG_AW) << "Format" << _customTime;
m_customTime = customTime; m_customTime = _customTime;
} }
void AWKeysAggregator::setCustomUptime(const QString customUptime) void AWKeysAggregator::setCustomUptime(const QString &_customUptime)
{ {
qCDebug(LOG_AW) << "Format" << customUptime; qCDebug(LOG_AW) << "Format" << _customUptime;
m_customUptime = customUptime; m_customUptime = _customUptime;
} }
void AWKeysAggregator::setDevices(const QHash<QString, QStringList> devices) void AWKeysAggregator::setDevices(const QHash<QString, QStringList> &_devices)
{ {
qCDebug(LOG_AW) << "Devices" << devices; qCDebug(LOG_AW) << "Devices" << _devices;
m_devices = devices; m_devices = _devices;
} }
void AWKeysAggregator::setTempUnits(const QString units) void AWKeysAggregator::setTempUnits(const QString &_units)
{ {
qCDebug(LOG_AW) << "Units" << units; qCDebug(LOG_AW) << "Units" << _units;
m_tempUnits = units; m_tempUnits = _units;
} }
void AWKeysAggregator::setTranslate(const bool translate) void AWKeysAggregator::setTranslate(const bool _translate)
{ {
qCDebug(LOG_AW) << "Translate" << translate; qCDebug(LOG_AW) << "Translate" << _translate;
m_translate = translate; m_translate = _translate;
} }
// 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 AWKeysAggregator::registerSource(const QString &source, QStringList AWKeysAggregator::registerSource(const QString &_source,
const QString &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(QString("cpu/cpu.*/TotalLoad")); QRegExp cpuRegExp = QRegExp("cpu/cpu.*/TotalLoad");
QRegExp cpuclRegExp = QRegExp(QString("cpu/cpu.*/clock")); QRegExp cpuclRegExp = QRegExp("cpu/cpu.*/clock");
QRegExp hddrRegExp = QRegExp(QString("disk/.*/Rate/rblk")); QRegExp hddrRegExp = QRegExp("disk/.*/Rate/rblk");
QRegExp hddwRegExp = QRegExp(QString("disk/.*/Rate/wblk")); QRegExp hddwRegExp = QRegExp("disk/.*/Rate/wblk");
QRegExp mountFillRegExp = QRegExp(QString("partitions/.*/filllevel")); QRegExp mountFillRegExp = QRegExp("partitions/.*/filllevel");
QRegExp mountFreeRegExp = QRegExp(QString("partitions/.*/freespace")); QRegExp mountFreeRegExp = QRegExp("partitions/.*/freespace");
QRegExp mountUsedRegExp = QRegExp(QString("partitions/.*/usedspace")); QRegExp mountUsedRegExp = QRegExp("partitions/.*/usedspace");
QRegExp netRegExp = QRegExp( QRegExp netRegExp
QString("network/interfaces/.*/(receiver|transmitter)/data$")); = QRegExp("network/interfaces/.*/(receiver|transmitter)/data$");
QRegExp netTotalRegExp = QRegExp( QRegExp netTotalRegExp
QString("network/interfaces/.*/(receiver|transmitter)/dataTotal$")); = QRegExp("network/interfaces/.*/(receiver|transmitter)/dataTotal$");
if (source == QString("battery/ac")) { if (_source == "battery/ac") {
// AC // AC
m_map[source] = QString("ac"); m_map[_source] = "ac";
m_formatter[QString("ac")] = FormatterType::ACFormat; m_formatter["ac"] = FormatterType::ACFormat;
} else if (source.startsWith(QString("battery/"))) { } else if (_source.startsWith("battery/")) {
// battery stats // battery stats
QString key = source; QString key = _source;
key.remove(QString("battery/")); key.remove("battery/");
m_map[source] = key; m_map[_source] = key;
m_formatter[key] = FormatterType::IntegerThree; m_formatter[key] = FormatterType::IntegerThree;
} else if (source == QString("cpu/system/TotalLoad")) { } else if (_source == "cpu/system/TotalLoad") {
// cpu // cpu
m_map[source] = QString("cpu"); m_map[_source] = "cpu";
m_formatter[QString("cpu")] = FormatterType::Float; m_formatter["cpu"] = FormatterType::Float;
} else if (source.contains(cpuRegExp)) { } else if (_source.contains(cpuRegExp)) {
// cpus // cpus
QString key = source; QString key = _source;
key.remove(QString("cpu/")).remove(QString("/TotalLoad")); key.remove("cpu/").remove("/TotalLoad");
m_map[source] = key; m_map[_source] = key;
m_formatter[key] = FormatterType::Float; m_formatter[key] = FormatterType::Float;
} else if (source == QString("cpu/system/AverageClock")) { } else if (_source == "cpu/system/AverageClock") {
// cpucl // cpucl
m_map[source] = QString("cpucl"); m_map[_source] = "cpucl";
m_formatter[QString("cpucl")] = FormatterType::Integer; m_formatter["cpucl"] = FormatterType::Integer;
} else if (source.contains(cpuclRegExp)) { } else if (_source.contains(cpuclRegExp)) {
// cpucls // cpucls
QString key = source; QString key = _source;
key.remove(QString("cpu/cpu")).remove(QString("/clock")); key.remove("cpu/cpu").remove("/clock");
key = QString("cpucl%1").arg(key); key = QString("cpucl%1").arg(key);
m_map[source] = key; m_map[_source] = key;
m_formatter[key] = FormatterType::Integer; m_formatter[key] = FormatterType::Integer;
} else if (source.startsWith(QString("custom"))) { } else if (_source.startsWith("custom")) {
// custom // custom
QString key = source; QString key = _source;
key.remove(QString("custom/")); key.remove("custom/");
m_map[source] = key; m_map[_source] = key;
m_formatter[key] = FormatterType::NoFormat; m_formatter[key] = FormatterType::NoFormat;
} else if (source == QString("desktop/current/name")) { } else if (_source == "desktop/current/name") {
// current desktop name // current desktop name
m_map[source] = QString("desktop"); m_map[_source] = "desktop";
m_formatter[QString("desktop")] = FormatterType::NoFormat; m_formatter["desktop"] = FormatterType::NoFormat;
} else if (source == QString("desktop/current/number")) { } else if (_source == "desktop/current/number") {
// current desktop number // current desktop number
m_map[source] = QString("ndesktop"); m_map[_source] = "ndesktop";
m_formatter[QString("ndesktop")] = FormatterType::NoFormat; m_formatter["ndesktop"] = FormatterType::NoFormat;
} else if (source == QString("desktop/total/number")) { } else if (_source == "desktop/total/number") {
// desktop count // desktop count
m_map[source] = QString("tdesktops"); m_map[_source] = "tdesktops";
m_formatter[QString("tdesktops")] = FormatterType::NoFormat; m_formatter["tdesktops"] = FormatterType::NoFormat;
} else if (source.contains(hddrRegExp)) { } else if (_source.contains(hddrRegExp)) {
// read speed // read speed
QString device = source; QString device = _source;
device.remove(QString("/Rate/rblk")); device.remove("/Rate/rblk");
int index = m_devices[QString("disk")].indexOf(device); int 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[_source] = key;
m_formatter[key] = FormatterType::Integer; m_formatter[key] = FormatterType::Integer;
} }
} else if (source.contains(hddwRegExp)) { } else if (_source.contains(hddwRegExp)) {
// write speed // write speed
QString device = source; QString device = _source;
device.remove(QString("/Rate/wblk")); device.remove("/Rate/wblk");
int index = m_devices[QString("disk")].indexOf(device); int 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[_source] = key;
m_formatter[key] = FormatterType::Integer; m_formatter[key] = FormatterType::Integer;
} }
} else if (source == QString("gpu/load")) { } else if (_source == "gpu/load") {
// gpu load // gpu load
m_map[source] = QString("gpu"); m_map[_source] = "gpu";
m_formatter[QString("gpu")] = FormatterType::Float; m_formatter["gpu"] = FormatterType::Float;
} else if (source == QString("gpu/temperature")) { } else if (_source == "gpu/temperature") {
// gpu temperature // gpu temperature
m_map[source] = QString("gputemp"); m_map[_source] = "gputemp";
m_formatter[QString("gputemp")] = FormatterType::Temperature; m_formatter["gputemp"] = FormatterType::Temperature;
} else if (source.contains(mountFillRegExp)) { } else if (_source.contains(mountFillRegExp)) {
// fill level // fill level
QString device = source; QString device = _source;
device.remove(QString("partitions")).remove(QString("/filllevel")); device.remove("partitions").remove("/filllevel");
int index = m_devices[QString("mount")].indexOf(device); int index = m_devices["mount"].indexOf(device);
if (index > -1) { if (index > -1) {
QString key = QString("hdd%1").arg(index); QString key = QString("hdd%1").arg(index);
m_map[source] = key; m_map[_source] = key;
m_formatter[key] = FormatterType::Float; m_formatter[key] = FormatterType::Float;
// additional keys // additional keys
m_formatter[QString("hddtotmb%1").arg(index)] m_formatter[QString("hddtotmb%1").arg(index)]
@ -355,248 +365,251 @@ QStringList AWKeysAggregator::registerSource(const QString &source,
m_formatter[QString("hddtotgb%1").arg(index)] m_formatter[QString("hddtotgb%1").arg(index)]
= FormatterType::MemGBFormat; = FormatterType::MemGBFormat;
} }
} else if (source.contains(mountFreeRegExp)) { } else if (_source.contains(mountFreeRegExp)) {
// free space // free space
QString device = source; QString device = _source;
device.remove(QString("partitions")).remove(QString("/freespace")); device.remove("partitions").remove("/freespace");
int index = m_devices[QString("mount")].indexOf(device); int index = m_devices["mount"].indexOf(device);
if (index > -1) { if (index > -1) {
// mb // mb
QString key = QString("hddfreemb%1").arg(index); QString key = QString("hddfreemb%1").arg(index);
m_map[source] = key; m_map[_source] = key;
m_formatter[key] = FormatterType::MemMBFormat; m_formatter[key] = FormatterType::MemMBFormat;
// gb // gb
key = QString("hddfreegb%1").arg(index); key = QString("hddfreegb%1").arg(index);
m_map.insertMulti(source, key); m_map.insertMulti(_source, key);
m_formatter[key] = FormatterType::MemGBFormat; m_formatter[key] = FormatterType::MemGBFormat;
} }
} else if (source.contains(mountUsedRegExp)) { } else if (_source.contains(mountUsedRegExp)) {
// used // used
QString device = source; QString device = _source;
device.remove(QString("partitions")).remove(QString("/usedspace")); device.remove("partitions").remove("/usedspace");
int index = m_devices[QString("mount")].indexOf(device); int index = m_devices["mount"].indexOf(device);
if (index > -1) { if (index > -1) {
// mb // mb
QString key = QString("hddmb%1").arg(index); QString key = QString("hddmb%1").arg(index);
m_map[source] = key; m_map[_source] = key;
m_formatter[key] = FormatterType::MemMBFormat; m_formatter[key] = FormatterType::MemMBFormat;
// gb // gb
key = QString("hddgb%1").arg(index); key = QString("hddgb%1").arg(index);
m_map.insertMulti(source, key); m_map.insertMulti(_source, key);
m_formatter[key] = FormatterType::MemGBFormat; m_formatter[key] = FormatterType::MemGBFormat;
} }
} else if (source.startsWith(QString("hdd/temperature"))) { } else if (_source.startsWith("hdd/temperature")) {
// hdd temperature // hdd temperature
QString device = source; QString device = _source;
device.remove(QString("hdd/temperature")); device.remove("hdd/temperature");
int index = m_devices[QString("hdd")].indexOf(device); int index = m_devices["hdd"].indexOf(device);
if (index > -1) { if (index > -1) {
QString key = QString("hddtemp%1").arg(index); QString key = QString("hddtemp%1").arg(index);
m_map[source] = key; m_map[_source] = key;
m_formatter[key] = FormatterType::Temperature; m_formatter[key] = FormatterType::Temperature;
} }
} else if (source.startsWith(QString("cpu/system/loadavg"))) { } else if (_source.startsWith("cpu/system/loadavg")) {
// load average // load average
QString time = source; QString time = _source;
time.remove(QString("cpu/system/loadavg")); time.remove("cpu/system/loadavg");
QString key = QString("la%1").arg(time); QString key = QString("la%1").arg(time);
m_map[source] = key; m_map[_source] = key;
m_formatter[key] = FormatterType::FloatTwoSymbols; m_formatter[key] = FormatterType::FloatTwoSymbols;
} else if (source == QString("mem/physical/application")) { } else if (_source == "mem/physical/application") {
// app memory // app memory
// mb // mb
m_map[source] = QString("memmb"); m_map[_source] = "memmb";
m_formatter[QString("memmb")] = FormatterType::MemMBFormat; m_formatter["memmb"] = FormatterType::MemMBFormat;
// gb // gb
m_map.insertMulti(source, QString("memgb")); m_map.insertMulti(_source, "memgb");
m_formatter[QString("memgb")] = FormatterType::MemGBFormat; m_formatter["memgb"] = FormatterType::MemGBFormat;
} else if (source == QString("mem/physical/free")) { } else if (_source == "mem/physical/free") {
// free memory // free memory
// mb // mb
m_map[source] = QString("memfreemb"); m_map[_source] = "memfreemb";
m_formatter[QString("memfreemb")] = FormatterType::MemMBFormat; m_formatter["memfreemb"] = FormatterType::MemMBFormat;
// gb // gb
m_map.insertMulti(source, QString("memfreegb")); m_map.insertMulti(_source, "memfreegb");
m_formatter[QString("memfreegb")] = FormatterType::MemGBFormat; m_formatter["memfreegb"] = FormatterType::MemGBFormat;
} else if (source == QString("mem/physical/used")) { } else if (_source == "mem/physical/used") {
// used memory // used memory
// mb // mb
m_map[source] = QString("memusedmb"); m_map[_source] = "memusedmb";
m_formatter[QString("memusedmb")] = FormatterType::MemMBFormat; m_formatter["memusedmb"] = FormatterType::MemMBFormat;
// gb // gb
m_map.insertMulti(source, QString("memusedgb")); m_map.insertMulti(_source, "memusedgb");
m_formatter[QString("memusedgb")] = FormatterType::MemGBFormat; m_formatter["memusedgb"] = FormatterType::MemGBFormat;
} else if (source == QString("network/current/name")) { } else if (_source == "network/current/name") {
// network device // network device
m_map[source] = QString("netdev"); m_map[_source] = "netdev";
m_formatter[QString("netdev")] = FormatterType::NoFormat; m_formatter["netdev"] = FormatterType::NoFormat;
} else if (source.contains(netRegExp)) { } else if (_source.startsWith("network/response")) {
// network response
QString key = _source;
key.remove("network/");
m_map[_source] = key;
m_formatter[key] = FormatterType::NoFormat;
} else if (_source.contains(netRegExp)) {
// network speed // network speed
QString type = source.contains(QString("receiver")) ? QString("down") QString type = _source.contains("receiver") ? "down" : "up";
: QString("up"); int index = m_devices["net"].indexOf(_source.split('/')[2]);
int index
= m_devices[QString("net")].indexOf(source.split(QChar('/'))[2]);
if (index > -1) { if (index > -1) {
// kb // kb
QString key = QString("%1kb%2").arg(type).arg(index); QString key = QString("%1kb%2").arg(type).arg(index);
m_map[source] = key; m_map[_source] = key;
m_formatter[key] = FormatterType::Integer; m_formatter[key] = FormatterType::Integer;
// 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.insertMulti(_source, key);
m_formatter[key] = FormatterType::NetSmartFormat; m_formatter[key] = 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.insertMulti(_source, key);
m_formatter[key] = FormatterType::NetSmartUnits; m_formatter[key] = FormatterType::NetSmartUnits;
} }
} else if (source.contains(netTotalRegExp)) { } else if (_source.contains(netTotalRegExp)) {
// network data total // network data total
QString type = source.contains(QString("receiver")) ? QString("down") QString type = _source.contains("receiver") ? "down" : "up";
: QString("up"); int index = m_devices["net"].indexOf(_source.split('/')[2]);
int index
= m_devices[QString("net")].indexOf(source.split(QChar('/'))[2]);
if (index > -1) { if (index > -1) {
// kb // kb
QString key = QString("%1totalkb%2").arg(type).arg(index); QString key = QString("%1totalkb%2").arg(type).arg(index);
m_map[source] = key; m_map[_source] = key;
m_formatter[key] = FormatterType::Integer; m_formatter[key] = FormatterType::Integer;
// mb // mb
key = QString("%1total%2").arg(type).arg(index); key = QString("%1total%2").arg(type).arg(index);
m_map.insertMulti(source, key); m_map.insertMulti(_source, key);
m_formatter[key] = FormatterType::MemMBFormat; m_formatter[key] = FormatterType::MemMBFormat;
} }
} else if (source.startsWith(QString("upgrade"))) { } else if (_source.startsWith("upgrade")) {
// package manager // package manager
QString key = source; QString key = _source;
key.remove(QString("upgrade/")); key.remove("upgrade/");
m_map[source] = key; m_map[_source] = key;
m_formatter[key] = FormatterType::IntegerThree; m_formatter[key] = FormatterType::IntegerThree;
} else if (source.startsWith(QString("player"))) { } else if (_source.startsWith("player")) {
// player // player
QString key = source; QString key = _source;
key.remove(QString("player/")); key.remove("player/");
m_map[source] = key; m_map[_source] = key;
m_formatter[key] = FormatterType::NoFormat; m_formatter[key] = FormatterType::NoFormat;
} else if (source == QString("ps/running/count")) { } else if (_source == "ps/running/count") {
// running processes count // running processes count
m_map[source] = QString("pscount"); m_map[_source] = "pscount";
m_formatter[QString("pscount")] = FormatterType::NoFormat; m_formatter["pscount"] = FormatterType::NoFormat;
} else if (source == QString("ps/running/list")) { } else if (_source == "ps/running/list") {
// list of running processes // list of running processes
m_map[source] = QString("ps"); m_map[_source] = "ps";
m_formatter[QString("ps")] = FormatterType::List; m_formatter["ps"] = FormatterType::List;
} else if (source == QString("ps/total/count")) { } else if (_source == "ps/total/count") {
// total processes count // total processes count
m_map[source] = QString("pstotal"); m_map[_source] = "pstotal";
m_formatter[QString("pstotal")] = FormatterType::NoFormat; m_formatter["pstotal"] = FormatterType::NoFormat;
} else if (source.startsWith(QString("quotes"))) { } else if (_source.startsWith("quotes")) {
// quotes // quotes
QString key = source; QString key = _source;
key.remove(QString("quotes/")); key.remove("quotes/");
m_map[source] = key; m_map[_source] = key;
m_formatter[key] = FormatterType::Quotes; m_formatter[key] = FormatterType::Quotes;
} else if (source == QString("mem/swap/free")) { } else if (_source == "mem/swap/free") {
// free swap // free swap
// mb // mb
m_map[source] = QString("swapfreemb"); m_map[_source] = "swapfreemb";
m_formatter[QString("swapfreemb")] = FormatterType::MemMBFormat; m_formatter["swapfreemb"] = FormatterType::MemMBFormat;
// gb // gb
m_map.insertMulti(source, QString("swapfreegb")); m_map.insertMulti(_source, "swapfreegb");
m_formatter[QString("swapfreegb")] = FormatterType::MemGBFormat; m_formatter["swapfreegb"] = FormatterType::MemGBFormat;
} else if (source == QString("mem/swap/used")) { } else if (_source == "mem/swap/used") {
// used swap // used swap
// mb // mb
m_map[source] = QString("swapmb"); m_map[_source] = "swapmb";
m_formatter[QString("swapmb")] = FormatterType::MemMBFormat; m_formatter["swapmb"] = FormatterType::MemMBFormat;
// gb // gb
m_map.insertMulti(source, QString("swapgb")); m_map.insertMulti(_source, "swapgb");
m_formatter[QString("swapgb")] = FormatterType::MemGBFormat; m_formatter["swapgb"] = FormatterType::MemGBFormat;
} else if (source.startsWith(QString("lmsensors/"))) { } else if (_source.startsWith("lmsensors/")) {
// temperature // temperature
int index = m_devices[QString("temp")].indexOf(source); int index = m_devices["temp"].indexOf(_source);
// FIXME on DE initialization there are no units key // HACK on DE initialization there are no units key
if (units.isEmpty()) if (_units.isEmpty())
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); QString key = QString("temp%1").arg(index);
m_map[source] = key; m_map[_source] = key;
m_formatter[key] = units == QString("°C") m_formatter[key] = _units == "°C" ? FormatterType::Temperature
? FormatterType::Temperature : FormatterType::Integer;
: FormatterType::Integer;
} }
} else if (source == QString("Local")) { } else if (_source == "Local") {
// time // time
m_map[source] = QString("time"); m_map[_source] = "time";
m_formatter[QString("time")] = FormatterType::Time; m_formatter["time"] = FormatterType::Time;
// custom time // custom time
m_map.insertMulti(source, QString("ctime")); m_map.insertMulti(_source, "ctime");
m_formatter[QString("ctime")] = FormatterType::TimeCustom; m_formatter["ctime"] = FormatterType::TimeCustom;
// ISO time // ISO time
m_map.insertMulti(source, QString("isotime")); m_map.insertMulti(_source, "isotime");
m_formatter[QString("isotime")] = FormatterType::TimeISO; m_formatter["isotime"] = FormatterType::TimeISO;
// long time // long time
m_map.insertMulti(source, QString("longtime")); m_map.insertMulti(_source, "longtime");
m_formatter[QString("longtime")] = FormatterType::TimeLong; m_formatter["longtime"] = FormatterType::TimeLong;
// short time // short time
m_map.insertMulti(source, QString("shorttime")); m_map.insertMulti(_source, "shorttime");
m_formatter[QString("shorttime")] = FormatterType::TimeShort; m_formatter["shorttime"] = FormatterType::TimeShort;
// timestamp // timestamp
m_map.insertMulti(source, QString("tstime")); m_map.insertMulti(_source, "tstime");
m_formatter[QString("tstime")] = FormatterType::Timestamp; m_formatter["tstime"] = FormatterType::Timestamp;
} else if (source == QString("system/uptime")) { } else if (_source == "system/uptime") {
// uptime // uptime
m_map[source] = QString("uptime"); m_map[_source] = "uptime";
m_formatter[QString("uptime")] = FormatterType::Uptime; m_formatter["uptime"] = FormatterType::Uptime;
// custom uptime // custom uptime
m_map.insertMulti(source, QString("cuptime")); m_map.insertMulti(_source, "cuptime");
m_formatter[QString("cuptime")] = FormatterType::UptimeCustom; m_formatter["cuptime"] = FormatterType::UptimeCustom;
} else if (source.startsWith(QString("weather/temperature"))) { } else if (_source.startsWith("weather/temperature")) {
// temperature // temperature
QString key = source; QString key = _source;
key.remove(QString("weather/")); key.remove("weather/");
m_map[source] = key; m_map[_source] = key;
m_formatter[key] = FormatterType::Temperature; m_formatter[key] = FormatterType::Temperature;
} else if (source.startsWith(QString("weather/"))) { } else if (_source.startsWith("weather/")) {
// other weather // other weather
QString key = source; QString key = _source;
key.remove(QString("weather/")); key.remove("weather/");
m_map[source] = key; m_map[_source] = key;
m_formatter[key] = FormatterType::NoFormat; m_formatter[key] = FormatterType::NoFormat;
} else if (source.startsWith(QString("load/load"))) { } else if (_source.startsWith("load/load")) {
// load source // load source
QString key = source; QString key = _source;
key.remove(QString("load/")); key.remove("load/");
m_map[source] = key; m_map[_source] = key;
m_formatter[key] = FormatterType::Temperature; m_formatter[key] = FormatterType::Temperature;
} }
QStringList foundKeys = keysFromSource(source); QStringList foundKeys = keysFromSource(_source);
// rewrite formatters for custom ones // rewrite formatters for custom ones
QStringList customFormattersKeys = m_customFormatters->definedFormatters(); QStringList customFormattersKeys;
if (m_customFormatters)
customFormattersKeys = m_customFormatters->definedFormatters();
qCInfo(LOG_AW) << "Looking for fprmatters" << foundKeys << "in" qCInfo(LOG_AW) << "Looking for fprmatters" << foundKeys << "in"
<< customFormattersKeys; << customFormattersKeys;
for (auto key : foundKeys) { for (auto &key : foundKeys) {
if (!customFormattersKeys.contains(key)) if (!customFormattersKeys.contains(key))
continue; continue;
m_formatter[key] = FormatterType::Custom; m_formatter[key] = FormatterType::Custom;
} }
// 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 bool required
= keys.isEmpty() || std::any_of(foundKeys.cbegin(), foundKeys.cend(), = _keys.isEmpty() || std::any_of(foundKeys.cbegin(), foundKeys.cend(),
[&keys](const QString &key) { [&_keys](const QString &key) {
return keys.contains(key); return _keys.contains(key);
}); });
if (!required) { if (!required) {
m_map.remove(source); m_map.remove(_source);
for (auto key : foundKeys) for (auto &key : foundKeys)
m_formatter.remove(key); m_formatter.remove(key);
} }
return keysFromSource(source); return keysFromSource(_source);
} }
@ -605,18 +618,18 @@ float AWKeysAggregator::temperature(const float temp) const
qCDebug(LOG_AW) << "Temperature value" << temp; qCDebug(LOG_AW) << "Temperature value" << temp;
float converted = temp; float converted = temp;
if (m_tempUnits == QString("Celsius")) { if (m_tempUnits == "Celsius") {
} else if (m_tempUnits == QString("Fahrenheit")) { } else if (m_tempUnits == "Fahrenheit") {
converted = temp * 9.0f / 5.0f + 32.0f; converted = temp * 9.0f / 5.0f + 32.0f;
} else if (m_tempUnits == QString("Kelvin")) { } else if (m_tempUnits == "Kelvin") {
converted = temp + 273.15f; converted = temp + 273.15f;
} else if (m_tempUnits == QString("Reaumur")) { } else if (m_tempUnits == "Reaumur") {
converted = temp * 0.8f; converted = temp * 0.8f;
} else if (m_tempUnits == QString("cm^-1")) { } else if (m_tempUnits == "cm^-1") {
converted = (temp + 273.15f) * 0.695f; converted = (temp + 273.15f) * 0.695f;
} else if (m_tempUnits == QString("kJ/mol")) { } else if (m_tempUnits == "kJ/mol") {
converted = (temp + 273.15f) * 8.31f; converted = (temp + 273.15f) * 8.31f;
} else if (m_tempUnits == QString("kcal/mol")) { } else if (m_tempUnits == "kcal/mol") {
converted = (temp + 273.15f) * 1.98f; converted = (temp + 273.15f) * 1.98f;
} else { } else {
qCWarning(LOG_AW) << "Invalid units" << m_tempUnits; qCWarning(LOG_AW) << "Invalid units" << m_tempUnits;

View File

@ -67,28 +67,29 @@ class AWKeysAggregator : public QObject
}; };
public: public:
explicit AWKeysAggregator(QObject *parent = nullptr); explicit AWKeysAggregator(QObject *_parent = nullptr);
virtual ~AWKeysAggregator(); virtual ~AWKeysAggregator();
void initFormatters();
// get methods // get methods
QString formatter(const QVariant &data, const QString &key) const; QString formatter(const QVariant &_data, const QString &_key) const;
QStringList keysFromSource(const QString &source) const; 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);
void setCustomTime(const QString customTime); void setCustomTime(const QString &_customTime);
void setCustomUptime(const QString customUptime); void setCustomUptime(const QString &_customUptime);
void setDevices(const QHash<QString, QStringList> devices); void setDevices(const QHash<QString, QStringList> &_devices);
void setTempUnits(const QString units); void setTempUnits(const QString &_units);
void setTranslate(const bool translate); void setTranslate(const bool _translate);
public slots: public slots:
QStringList registerSource(const QString &source, const QString &units, QStringList registerSource(const QString &_source, const QString &_units,
const QStringList &keys); const QStringList &_keys);
private: private:
float temperature(const float temp) const; float temperature(const float temp) const;
AWFormatterHelper *m_customFormatters = nullptr; AWFormatterHelper *m_customFormatters = nullptr;
QStringList timeKeys = QString(TIME_KEYS).split(QChar(',')); QStringList m_timeKeys = QString(TIME_KEYS).split(',');
// variables // variables
QString m_acOffline; QString m_acOffline;
QString m_acOnline; QString m_acOnline;

View File

@ -24,52 +24,51 @@
#include "awkeysaggregator.h" #include "awkeysaggregator.h"
QString AWPatternFunctions::expandLambdas(QString code, QString AWPatternFunctions::expandLambdas(QString _code,
AWKeysAggregator *aggregator, AWKeysAggregator *_aggregator,
const QVariantHash &metadata, const QVariantHash &_metadata,
const QStringList &usedKeys) const QStringList &_usedKeys)
{ {
qCDebug(LOG_AW) << "Expand lamdas in" << code; qCDebug(LOG_AW) << "Expand lamdas in" << _code;
QJSEngine engine; QJSEngine engine;
// apply $this values // apply $this values
code.replace(QString("$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)); _aggregator->formatter(_metadata[lambdaKey], lambdaKey));
qCInfo(LOG_AW) << "Expression" << code; qCInfo(LOG_AW) << "Expression" << _code;
QJSValue result = engine.evaluate(code); QJSValue 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 QString(); return "";
} else { } else {
return result.toString(); return result.toString();
} }
} }
QString AWPatternFunctions::expandTemplates(QString code) 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( QRegularExpression templatesRegexp("\\$template\\{\\{(?<body>.*?)\\}\\}");
QString("\\$template\\{\\{(?<body>.*?)\\}\\}"));
templatesRegexp.setPatternOptions( templatesRegexp.setPatternOptions(
QRegularExpression::DotMatchesEverythingOption); QRegularExpression::DotMatchesEverythingOption);
QRegularExpressionMatchIterator it = templatesRegexp.globalMatch(code); QRegularExpressionMatchIterator it = templatesRegexp.globalMatch(_code);
while (it.hasNext()) { while (it.hasNext()) {
QRegularExpressionMatch match = it.next(); QRegularExpressionMatch match = it.next();
QString body = match.captured(QString("body")); QString body = match.captured("body");
QJSEngine engine; QJSEngine engine;
qCInfo(LOG_AW) << "Expression" << body; qCInfo(LOG_AW) << "Expression" << body;
QJSValue result = engine.evaluate(body); QJSValue result = engine.evaluate(body);
QString templateResult = QString(""); 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() << ":"
@ -79,51 +78,55 @@ QString AWPatternFunctions::expandTemplates(QString code)
} }
// replace template // replace template
code.replace(match.captured(), templateResult); _code.replace(match.captured(), templateResult);
} }
return code; return _code;
} }
QVariantList AWPatternFunctions::findFunctionCalls(const QString function, QList<AWPatternFunctions::AWFunction>
const QString code) AWPatternFunctions::findFunctionCalls(const QString &_function,
const QString &_code)
{ {
qCDebug(LOG_AW) << "Looking for function" << function << "in" << code; qCDebug(LOG_AW) << "Looking for function" << _function << "in" << _code;
// I suggest the following regex for the internal functions // I suggest the following regex for the internal functions
// $aw_function_name<some args here if any>{{function body}} // $aw_function_name<some args here if any>{{function body}}
// * args should be always comma separated (e.g. commas are not supported // * args should be always comma separated (e.g. commas are not supported
// 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 (i.e. {{ or }}) are // * body depends on the function name, double brackets should be screened
// not supported // by using $, e.g. ${
QRegularExpression regex( QRegularExpression regex(
QString("\\$%1\\<(?<args>.*?)\\>\\{\\{(?<body>.*?)\\}\\}") QString("\\$%1\\<(?<args>.*?)\\>\\{\\{(?<body>.*?)\\}\\}")
.arg(function)); .arg(_function));
regex.setPatternOptions(QRegularExpression::DotMatchesEverythingOption); regex.setPatternOptions(QRegularExpression::DotMatchesEverythingOption);
QVariantList foundFunctions; QList<AWPatternFunctions::AWFunction> foundFunctions;
QRegularExpressionMatchIterator it = regex.globalMatch(code); QRegularExpressionMatchIterator it = regex.globalMatch(_code);
while (it.hasNext()) { while (it.hasNext()) {
QRegularExpressionMatch match = it.next(); QRegularExpressionMatch match = it.next();
QVariantHash metadata; AWPatternFunctions::AWFunction metadata;
// work with args // work with args
QString argsString = match.captured(QString("args")); QString argsString = match.captured("args");
if (argsString.isEmpty()) { if (argsString.isEmpty()) {
metadata[QString("args")] = QStringList(); metadata.args = QStringList();
} else { } else {
// replace '$,' to 0x1d // replace '$,' to 0x1d
argsString.replace(QString("$,"), QString(0x1d)); argsString.replace("$,", QString(0x1d));
QStringList args = argsString.split(QChar(',')); QStringList args = argsString.split(',');
std::for_each(args.begin(), args.end(), [](QString &arg) { std::for_each(args.begin(), args.end(), [](QString &arg) {
arg.replace(QString(0x1d), QString(",")); arg.replace(QString(0x1d), ",");
}); });
metadata[QString("args")] = args; metadata.args = args;
} }
// other variables // other variables
metadata[QString("body")] = match.captured(QString("body")); metadata.body = match.captured("body");
metadata[QString("what")] = match.captured(); metadata.what = match.captured();
// replace brackets
metadata.body.replace("${", "{");
metadata.body.replace("$}", "}");
foundFunctions.append(metadata); foundFunctions.append(metadata);
} }
@ -131,136 +134,146 @@ QVariantList AWPatternFunctions::findFunctionCalls(const QString function,
} }
QString AWPatternFunctions::insertAllKeys(QString code, const QStringList keys) QString AWPatternFunctions::insertAllKeys(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;
QVariantList found QList<AWPatternFunctions::AWFunction> found
= AWPatternFunctions::findFunctionCalls(QString("aw_all"), code); = AWPatternFunctions::findFunctionCalls("aw_all", _code);
for (auto function : found) { for (auto &function : found) {
QVariantHash metadata = function.toHash(); QString separator = function.args.isEmpty() ? "," : function.args.at(0);
QString separator QStringList required = _keys.filter(QRegExp(function.body));
= metadata[QString("args")].toStringList().isEmpty()
? QString(",")
: metadata[QString("args")].toStringList().at(0);
QStringList required
= keys.filter(QRegExp(metadata[QString("body")].toString()));
std::for_each(required.begin(), required.end(), [](QString &value) { std::for_each(required.begin(), required.end(), [](QString &value) {
value = QString("%1: $%1").arg(value); value = QString("%1: $%1").arg(value);
}); });
code.replace(metadata[QString("what")].toString(), _code.replace(function.what, required.join(separator));
required.join(separator));
} }
return code; return _code;
} }
QString AWPatternFunctions::insertKeyCount(QString code, const QStringList keys) QString AWPatternFunctions::insertKeyCount(QString _code,
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;
QVariantList found QList<AWPatternFunctions::AWFunction> found
= AWPatternFunctions::findFunctionCalls(QString("aw_count"), code); = AWPatternFunctions::findFunctionCalls("aw_count", _code);
for (auto function : found) { for (auto &function : found) {
QVariantHash metadata = function.toHash(); int count = _keys.filter(QRegExp(function.body)).count();
int count = keys.filter(QRegExp(metadata[QString("body")].toString()))
.count();
code.replace(metadata[QString("what")].toString(), _code.replace(function.what, QString::number(count));
QString::number(count));
} }
return code; return _code;
} }
QString AWPatternFunctions::insertKeyNames(QString code, const QStringList keys) QString AWPatternFunctions::insertKeyNames(QString _code,
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;
QVariantList found QList<AWPatternFunctions::AWFunction> found
= AWPatternFunctions::findFunctionCalls(QString("aw_names"), code); = AWPatternFunctions::findFunctionCalls("aw_names", _code);
for (auto function : found) { for (auto &function : found) {
QVariantHash metadata = function.toHash(); QString separator = function.args.isEmpty() ? "," : function.args.at(0);
QString separator QStringList required = _keys.filter(QRegExp(function.body));
= metadata[QString("args")].toStringList().isEmpty()
? QString(",")
: metadata[QString("args")].toStringList().at(0);
QStringList required
= keys.filter(QRegExp(metadata[QString("body")].toString()));
code.replace(metadata[QString("what")].toString(), _code.replace(function.what, required.join(separator));
required.join(separator));
} }
return code; return _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;
QVariantList found QList<AWPatternFunctions::AWFunction> found
= AWPatternFunctions::findFunctionCalls(QString("aw_keys"), code); = AWPatternFunctions::findFunctionCalls("aw_keys", _code);
for (auto function : found) { for (auto &function : found) {
QVariantHash metadata = function.toHash(); QString separator = function.args.isEmpty() ? "," : function.args.at(0);
QString separator QStringList required = _keys.filter(QRegExp(function.body));
= metadata[QString("args")].toStringList().isEmpty()
? QString(",")
: metadata[QString("args")].toStringList().at(0);
QStringList required
= keys.filter(QRegExp(metadata[QString("body")].toString()));
std::for_each(required.begin(), required.end(), [](QString &value) { std::for_each(required.begin(), required.end(), [](QString &value) {
value = QString("$%1").arg(value); value = QString("$%1").arg(value);
}); });
code.replace(metadata[QString("what")].toString(), _code.replace(function.what, required.join(separator));
required.join(separator));
} }
return code; return _code;
} }
QStringList AWPatternFunctions::findBars(const QString code, QString AWPatternFunctions::insertMacros(QString _code)
const QStringList keys)
{ {
qCDebug(LOG_AW) << "Looking for bars in code" << code << "using list" qCDebug(LOG_AW) << "Looking for macros in code" << _code;
<< keys;
QStringList selectedKeys; QList<AWPatternFunctions::AWFunction> found
for (auto key : keys) = AWPatternFunctions::findFunctionCalls("aw_macro", _code);
if ((key.startsWith(QString("bar"))) for (auto &macro : found) {
&& (code.contains(QString("$%1").arg(key)))) { // get macro params
qCInfo(LOG_AW) << "Found bar" << key; if (macro.args.isEmpty()) {
selectedKeys.append(key); qCWarning(LOG_AW) << "No macro name found for" << macro.what;
continue;
}
QString name = macro.args.takeFirst();
// find macro usage
QList<AWPatternFunctions::AWFunction> macroUsage
= AWPatternFunctions::findFunctionCalls(
QString("aw_macro_%1").arg(name), _code);
for (auto &function : macroUsage) {
if (function.args.count() != macro.args.count()) {
qCWarning(LOG_AW)
<< "Invalid args count found for call" << function.what
<< "with macro" << macro.what;
continue;
}
// generate body to replace
QString result = macro.body;
std::for_each(macro.args.cbegin(), macro.args.cend(),
[&result, macro, function](const QString &arg) {
int index = macro.args.indexOf(arg);
result.replace(QString("$%1").arg(arg),
function.args.at(index));
});
// do replace
_code.replace(function.what, result);
} }
if (selectedKeys.isEmpty())
qCWarning(LOG_AW) << "No bars found";
return selectedKeys; // remove macro from source pattern
_code.remove(macro.what);
}
return _code;
} }
QStringList AWPatternFunctions::findKeys(const QString code, QStringList AWPatternFunctions::findKeys(const QString &_code,
const QStringList keys) 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;
for (auto key : keys) QString replacedCode = _code;
if ((!key.startsWith(QString("bar"))) for (auto &key : _keys)
&& (code.contains(QString("$%1").arg(key)))) { if ((key.startsWith("bar") == _isBars)
qCInfo(LOG_AW) << "Found key" << key; && (replacedCode.contains(QString("$%1").arg(key)))) {
qCInfo(LOG_AW) << "Found key" << key << "with bar enabled"
<< _isBars;
selectedKeys.append(key); selectedKeys.append(key);
replacedCode.replace(QString("$%1").arg(key), "");
} }
if (selectedKeys.isEmpty()) if (selectedKeys.isEmpty())
qCWarning(LOG_AW) << "No keys found"; qCWarning(LOG_AW) << "No keys found";
@ -269,20 +282,20 @@ QStringList AWPatternFunctions::findKeys(const QString code,
} }
QStringList AWPatternFunctions::findLambdas(const QString code) QStringList AWPatternFunctions::findLambdas(const QString &_code)
{ {
qCDebug(LOG_AW) << "Looking for lambdas in code" << code; qCDebug(LOG_AW) << "Looking for lambdas in code" << _code;
QStringList selectedKeys; QStringList selectedKeys;
// match the following construction ${{some code here}} // match the following construction ${{some code here}}
QRegularExpression lambdaRegexp(QString("\\$\\{\\{(?<body>.*?)\\}\\}")); QRegularExpression lambdaRegexp("\\$\\{\\{(?<body>.*?)\\}\\}");
lambdaRegexp.setPatternOptions( lambdaRegexp.setPatternOptions(
QRegularExpression::DotMatchesEverythingOption); QRegularExpression::DotMatchesEverythingOption);
QRegularExpressionMatchIterator it = lambdaRegexp.globalMatch(code); QRegularExpressionMatchIterator it = lambdaRegexp.globalMatch(_code);
while (it.hasNext()) { while (it.hasNext()) {
QRegularExpressionMatch match = it.next(); QRegularExpressionMatch match = it.next();
QString lambda = match.captured(QString("body")); QString lambda = match.captured("body");
// append // append
qCInfo(LOG_AW) << "Found lambda" << lambda; qCInfo(LOG_AW) << "Found lambda" << lambda;

View File

@ -27,20 +27,28 @@ class AWKeysAggregator;
namespace AWPatternFunctions namespace AWPatternFunctions
{ {
typedef struct {
QStringList args;
QString body;
QString what;
} 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);
QVariantList findFunctionCalls(const QString function, const QString code); QList<AWFunction> findFunctionCalls(const QString &_function,
QString insertAllKeys(QString code, const QStringList keys); const QString &_code);
QString insertKeyCount(QString code, const QStringList keys); QString insertAllKeys(QString _code, const QStringList &_keys);
QString insertKeyNames(QString code, const QStringList keys); QString insertKeyCount(QString _code, const QStringList &_keys);
QString insertKeys(QString code, const QStringList keys); QString insertKeyNames(QString _code, const QStringList &_keys);
QString insertKeys(QString _code, const QStringList &_keys);
QString insertMacros(QString _code);
// find methods // find methods
QStringList findBars(const QString code, const QStringList keys); QStringList findKeys(const QString &_code, const QStringList &_keys,
QStringList findKeys(const QString code, const QStringList keys); const bool _isBars);
QStringList findLambdas(const QString code); QStringList findLambdas(const QString &_code);
}; };

View File

@ -1,151 +0,0 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awscriptformatter.h"
#include <QJSEngine>
#include <QSettings>
#include "awdebug.h"
AWScriptFormatter::AWScriptFormatter(QObject *parent, const QString filename,
const QString section)
: AWAbstractFormatter(parent, filename, section)
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
init(filename, section);
initProgram();
}
AWScriptFormatter::AWScriptFormatter(QObject *parent, const bool appendCode,
const QString code, const bool hasReturn)
: AWAbstractFormatter(parent)
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
setAppendCode(appendCode);
setCode(code);
setHasReturn(hasReturn);
initProgram();
}
AWScriptFormatter::~AWScriptFormatter()
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
}
QString AWScriptFormatter::convert(const QVariant &value) const
{
qCDebug(LOG_AW) << "Convert value" << value;
// init engine
QJSEngine engine;
QJSValue fn = engine.evaluate(m_program);
QJSValueList args = QJSValueList() << value.toString();
QJSValue result = fn.call(args);
if (result.isError()) {
qCWarning(LOG_AW) << "Uncaught exception at line"
<< result.property("lineNumber").toInt() << ":"
<< result.toString();
return QString();
} else {
return result.toString();
}
}
bool AWScriptFormatter::appendCode() const
{
return m_appendCode;
}
QString AWScriptFormatter::code() const
{
return m_code;
}
bool AWScriptFormatter::hasReturn() const
{
return m_hasReturn;
}
QString AWScriptFormatter::program() const
{
return m_program;
}
void AWScriptFormatter::setAppendCode(const bool _appendCode)
{
qCDebug(LOG_AW) << "Set append code" << _appendCode;
m_appendCode = _appendCode;
}
void AWScriptFormatter::setCode(const QString _code)
{
qCDebug(LOG_AW) << "Set code" << _code;
m_code = _code;
}
void AWScriptFormatter::setHasReturn(const bool _hasReturn)
{
qCDebug(LOG_AW) << "Set has return" << _hasReturn;
m_hasReturn = _hasReturn;
}
void AWScriptFormatter::init(const QString filename, const QString section)
{
qCDebug(LOG_AW) << "Looking for section" << section << "in" << filename;
QSettings settings(filename, QSettings::IniFormat);
settings.beginGroup(section);
setAppendCode(settings.value(QString("AppendCode"), true).toBool());
setCode(settings.value(QString("Code"), QString()).toString());
setHasReturn(settings.value(QString("HasReturn"), false).toBool());
settings.endGroup();
}
void AWScriptFormatter::initProgram()
{
if (m_appendCode)
m_program
= QString("(function(value) { %1%2 })")
.arg(m_code)
.arg(m_hasReturn ? QString("") : QString("; return output;"));
else
m_program = m_code;
qCInfo(LOG_AW) << "Create JS engine with code" << m_program;
}

View File

@ -0,0 +1,192 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awtelemetryhandler.h"
#include <QJsonDocument>
#include <QJsonParseError>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QSettings>
#include <QStandardPaths>
#include <QUuid>
#include "awdebug.h"
AWTelemetryHandler::AWTelemetryHandler(QObject *_parent,
const QString &_clientId)
: QObject(_parent)
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
m_localFile = QString("%1/awesomewidgets/telemetry.ini")
.arg(QStandardPaths::writableLocation(
QStandardPaths::GenericDataLocation));
// override client id if any
if (!_clientId.isEmpty())
m_clientId = _clientId;
}
AWTelemetryHandler::~AWTelemetryHandler()
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
}
QStringList AWTelemetryHandler::get(const QString &_group) const
{
qCDebug(LOG_AW) << "Get stored data for group" << _group;
QStringList values;
QSettings settings(m_localFile, QSettings::IniFormat);
settings.beginGroup(_group);
for (auto &key : settings.childKeys())
values.append(settings.value(key).toString());
settings.endGroup();
return values;
}
QString AWTelemetryHandler::getLast(const QString &_group) const
{
qCDebug(LOG_AW) << "Get last stored data for group" << _group;
return get(_group).last();
}
void AWTelemetryHandler::init(const int _count, const bool _enableRemote,
const QString &_clientId)
{
qCDebug(LOG_AW) << "Init telemetry with count" << _count << "enable remote"
<< _enableRemote << "client ID" << _clientId;
m_storeCount = _count;
m_uploadEnabled = _enableRemote;
m_clientId = _clientId;
}
bool AWTelemetryHandler::put(const QString &_group, const QString &_value) const
{
qCDebug(LOG_AW) << "Store data with group" << _group << "and value"
<< _value;
QSettings settings(m_localFile, QSettings::IniFormat);
settings.beginGroup(_group);
// values will be stored as num=value inside specified group
// load all values to memory
QStringList saved;
for (auto &key : settings.childKeys())
saved.append(settings.value(key).toString());
// check if this value is already saved
if (saved.contains(_value)) {
qCInfo(LOG_AW) << "Configuration" << _value << "for group" << _group
<< "is already saved";
return false;
}
saved.append(_value);
// remove old ones
while (saved.count() > m_storeCount)
saved.takeFirst();
// clear group
settings.remove("");
// and save now
for (auto &val : saved) {
QString key = getKey(settings.childKeys().count());
settings.setValue(key, val);
}
// sync settings
settings.endGroup();
settings.sync();
// return status
return (settings.status() == QSettings::NoError);
}
void AWTelemetryHandler::uploadTelemetry(const QString &_group,
const QString &_value)
{
qCDebug(LOG_AW) << "Upload data with group" << _group << "and value"
<< _value;
if (!m_uploadEnabled) {
qCInfo(LOG_AW) << "Upload disabled by configuration";
return;
}
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;
return QString("%1").arg(_count, 3, 10, QChar('0'));
}

View File

@ -0,0 +1,62 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#ifndef AWTELEMETRYHANDLER_H
#define AWTELEMETRYHANDLER_H
#include <QObject>
#include <QtCore/QVariant>
class QAbstractButton;
class QNetworkReply;
class AWTelemetryHandler : public QObject
{
Q_OBJECT
public:
const char *REMOTE_TELEMETRY_URL = "https://arcanis.me/telemetry";
explicit AWTelemetryHandler(QObject *_parent = nullptr,
const QString &_clientId = "");
virtual ~AWTelemetryHandler();
Q_INVOKABLE QStringList get(const QString &_group) 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:
QString getKey(const int _count) const;
QString m_clientId;
QString m_localFile;
int m_storeCount = 0;
bool m_uploadEnabled = false;
};
#endif /* AWTELEMETRYHANDLER_H */

View File

@ -19,20 +19,19 @@
#include <KI18n/KLocalizedString> #include <KI18n/KLocalizedString>
#include <QtConcurrent/QtConcurrent>
#include <QDesktopServices> #include <QDesktopServices>
#include <QJsonDocument> #include <QJsonDocument>
#include <QJsonParseError> #include <QJsonParseError>
#include <QNetworkAccessManager> #include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply> #include <QNetworkReply>
#include <QNetworkRequest>
#include <QSettings> #include <QSettings>
#include "awdebug.h" #include "awdebug.h"
AWUpdateHelper::AWUpdateHelper(QObject *parent) AWUpdateHelper::AWUpdateHelper(QObject *_parent)
: QObject(parent) : QObject(_parent)
{ {
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
@ -49,16 +48,16 @@ AWUpdateHelper::~AWUpdateHelper()
} }
void AWUpdateHelper::checkUpdates(const bool showAnyway) void AWUpdateHelper::checkUpdates(const bool _showAnyway)
{ {
qCDebug(LOG_AW) << "Show anyway" << showAnyway; qCDebug(LOG_AW) << "Show anyway" << _showAnyway;
// showAnyway options requires to show message if no updates found on direct // showAnyway options requires 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); QNetworkAccessManager *manager = new QNetworkAccessManager(nullptr);
connect(manager, &QNetworkAccessManager::finished, connect(manager, &QNetworkAccessManager::finished,
[showAnyway, this](QNetworkReply *reply) { [_showAnyway, this](QNetworkReply *reply) {
return versionReplyRecieved(reply, showAnyway); return versionReplyRecieved(reply, _showAnyway);
}); });
manager->get(QNetworkRequest(QUrl(VERSION_API))); manager->get(QNetworkRequest(QUrl(VERSION_API)));
@ -69,17 +68,16 @@ bool AWUpdateHelper::checkVersion()
{ {
QSettings settings(m_genericConfig, QSettings::IniFormat); QSettings settings(m_genericConfig, QSettings::IniFormat);
QVersionNumber version = QVersionNumber::fromString( QVersionNumber version = QVersionNumber::fromString(
settings.value(QString("Version"), QString(VERSION)).toString()); settings.value("Version", QString(VERSION)).toString());
// update version // update version
settings.setValue(QString("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", QString(VERSION)), genMessageBox(i18n("Changelog of %1", VERSION),
QString(CHANGELOG).replace(QChar('@'), QChar('\n')), QString(CHANGELOG).replace('@', '\n'), QMessageBox::Ok)
QMessageBox::Ok)
->open(); ->open();
return true; return true;
} else if (version != m_foundVersion) { } else if (version != m_foundVersion) {
@ -93,12 +91,12 @@ bool AWUpdateHelper::checkVersion()
} }
void AWUpdateHelper::showInfo(const QVersionNumber version) void AWUpdateHelper::showInfo(const QVersionNumber &_version)
{ {
qCDebug(LOG_AW) << "Version" << version; qCDebug(LOG_AW) << "Version" << _version;
QString text QString 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) return genMessageBox(i18n("No new version found"), text, QMessageBox::Ok)
@ -106,16 +104,16 @@ void AWUpdateHelper::showInfo(const QVersionNumber version)
} }
void AWUpdateHelper::showUpdates(const QVersionNumber version) void AWUpdateHelper::showUpdates(const QVersionNumber &_version)
{ {
qCDebug(LOG_AW) << "Version" << version; qCDebug(LOG_AW) << "Version" << _version;
QString text; QString text;
text += i18n("Current version : %1", QString(VERSION)); text += i18n("Current version : %1", VERSION);
text += QString(COMMIT_SHA).isEmpty() text += QString(COMMIT_SHA).isEmpty()
? QString("\n") ? "\n"
: QString(" (%1)\n").arg(QString(COMMIT_SHA)); : QString(" (%1)\n").arg(QString(COMMIT_SHA));
text += i18n("New version : %1", version.toString()) + QString("\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, genMessageBox(i18n("There are updates"), text,
@ -124,10 +122,10 @@ void AWUpdateHelper::showUpdates(const QVersionNumber version)
} }
void AWUpdateHelper::userReplyOnUpdates(QAbstractButton *button) void AWUpdateHelper::userReplyOnUpdates(QAbstractButton *_button)
{ {
QMessageBox::ButtonRole ret QMessageBox::ButtonRole ret
= static_cast<QMessageBox *>(sender())->buttonRole(button); = static_cast<QMessageBox *>(sender())->buttonRole(_button);
qCInfo(LOG_AW) << "User select" << ret; qCInfo(LOG_AW) << "User select" << ret;
switch (ret) { switch (ret) {
@ -142,50 +140,53 @@ void AWUpdateHelper::userReplyOnUpdates(QAbstractButton *button)
} }
void AWUpdateHelper::versionReplyRecieved(QNetworkReply *reply, void AWUpdateHelper::versionReplyRecieved(QNetworkReply *_reply,
const bool showAnyway) const bool _showAnyway)
{ {
qCDebug(LOG_AW) << "Return code" << reply->error() << "with message" qCDebug(LOG_AW) << "Show message anyway" << _showAnyway;
<< reply->errorString() << "and show anyway" << showAnyway; if (_reply->error() != QNetworkReply::NoError) {
qCWarning(LOG_AW) << "An error occurs" << _reply->error()
<< "with message" << _reply->errorString();
return;
}
QJsonParseError error; QJsonParseError error;
QJsonDocument jsonDoc = QJsonDocument::fromJson(reply->readAll(), &error); QJsonDocument jsonDoc = QJsonDocument::fromJson(_reply->readAll(), &error);
if ((reply->error() != QNetworkReply::NoError) if (error.error != QJsonParseError::NoError) {
|| (error.error != QJsonParseError::NoError)) {
qCWarning(LOG_AW) << "Parse error" << error.errorString(); qCWarning(LOG_AW) << "Parse error" << error.errorString();
return; return;
} }
reply->deleteLater(); _reply->deleteLater();
// convert to map // convert to map
QVariantMap firstRelease = jsonDoc.toVariant().toList().first().toMap(); QVariantMap firstRelease = jsonDoc.toVariant().toList().first().toMap();
QString version = firstRelease[QString("tag_name")].toString(); QString version = firstRelease["tag_name"].toString();
version.remove(QString("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); QVersionNumber 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)
return showInfo(m_foundVersion); return showInfo(m_foundVersion);
} }
// 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 * QMessageBox *
AWUpdateHelper::genMessageBox(const QString title, const QString body, AWUpdateHelper::genMessageBox(const QString &_title, const QString &_body,
const QMessageBox::StandardButtons buttons) const QMessageBox::StandardButtons _buttons)
{ {
qCDebug(LOG_AW) << "Construct message box with title" << title << "and body" qCDebug(LOG_AW) << "Construct message box with title" << _title
<< body; << "and body" << _body;
QMessageBox *msgBox = new QMessageBox(nullptr); QMessageBox *msgBox = new QMessageBox(nullptr);
msgBox->setAttribute(Qt::WA_DeleteOnClose); msgBox->setAttribute(Qt::WA_DeleteOnClose);
msgBox->setModal(false); msgBox->setModal(false);
msgBox->setWindowTitle(title); msgBox->setWindowTitle(_title);
msgBox->setText(body); msgBox->setText(_body);
msgBox->setStandardButtons(buttons); msgBox->setStandardButtons(_buttons);
msgBox->setIcon(QMessageBox::Information); msgBox->setIcon(QMessageBox::Information);
return msgBox; return msgBox;

View File

@ -31,20 +31,20 @@ class AWUpdateHelper : public QObject
Q_OBJECT Q_OBJECT
public: public:
explicit AWUpdateHelper(QObject *parent = nullptr); explicit AWUpdateHelper(QObject *_parent = nullptr);
virtual ~AWUpdateHelper(); virtual ~AWUpdateHelper();
void checkUpdates(const bool showAnyway = false); void checkUpdates(const bool _showAnyway = false);
bool checkVersion(); bool checkVersion();
private slots: private slots:
void showInfo(const QVersionNumber version); void showInfo(const QVersionNumber &_version);
void showUpdates(const QVersionNumber version); void showUpdates(const QVersionNumber &_version);
void userReplyOnUpdates(QAbstractButton *button); void userReplyOnUpdates(QAbstractButton *_button);
void versionReplyRecieved(QNetworkReply *reply, const bool showAnyway); void versionReplyRecieved(QNetworkReply *_reply, const bool _showAnyway);
private: private:
QMessageBox *genMessageBox(const QString title, const QString body, QMessageBox *genMessageBox(const QString &_title, const QString &_body,
const QMessageBox::StandardButtons buttons); const QMessageBox::StandardButtons _buttons);
QVersionNumber m_foundVersion; QVersionNumber m_foundVersion;
QString m_genericConfig; QString m_genericConfig;
}; };

View File

@ -15,9 +15,11 @@ file(GLOB SUBPROJECT_HEADER *.h ${PROJECT_TRDPARTY_DIR}/qreplytimeout/*.h)
file(GLOB SUBPROJECT_UI *.ui) file(GLOB SUBPROJECT_UI *.ui)
file(GLOB SUBPROJECT_INI *.ini) file(GLOB SUBPROJECT_INI *.ini)
set(SUBPROJECT_CONFIGS ${CMAKE_CURRENT_SOURCE_DIR}/configs) set(SUBPROJECT_CONFIGS ${CMAKE_CURRENT_SOURCE_DIR}/configs)
set(SUBPROJECT_FORMATTERS ${CMAKE_CURRENT_SOURCE_DIR}/formatters)
set(SUBPROJECT_GRAPHITEMS ${CMAKE_CURRENT_SOURCE_DIR}/desktops) set(SUBPROJECT_GRAPHITEMS ${CMAKE_CURRENT_SOURCE_DIR}/desktops)
set(SUBPROJECT_QUOTES ${CMAKE_CURRENT_SOURCE_DIR}/quotes) set(SUBPROJECT_QUOTES ${CMAKE_CURRENT_SOURCE_DIR}/quotes)
set(SUBPROJECT_SCRIPTS ${CMAKE_CURRENT_SOURCE_DIR}/scripts) set(SUBPROJECT_SCRIPTS ${CMAKE_CURRENT_SOURCE_DIR}/scripts)
set(SUBPROJECT_REQUESTS ${CMAKE_CURRENT_SOURCE_DIR}/requests)
set(SUBPROJECT_UPGRADE ${CMAKE_CURRENT_SOURCE_DIR}/upgrade) set(SUBPROJECT_UPGRADE ${CMAKE_CURRENT_SOURCE_DIR}/upgrade)
set(SUBPROJECT_WEATHER ${CMAKE_CURRENT_SOURCE_DIR}/weather) set(SUBPROJECT_WEATHER ${CMAKE_CURRENT_SOURCE_DIR}/weather)
file(GLOB SUBPROJECT_WEATHER_JSON_IN *.json) file(GLOB SUBPROJECT_WEATHER_JSON_IN *.json)
@ -32,9 +34,11 @@ target_link_libraries(${SUBPROJECT} ${Qt_LIBRARIES} ${Kf5_LIBRARIES})
# install # install
install(DIRECTORY ${SUBPROJECT_CONFIGS} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME}) install(DIRECTORY ${SUBPROJECT_CONFIGS} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_FORMATTERS} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_GRAPHITEMS} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME}) install(DIRECTORY ${SUBPROJECT_GRAPHITEMS} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_QUOTES} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME}) install(DIRECTORY ${SUBPROJECT_QUOTES} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_SCRIPTS} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME}) install(DIRECTORY ${SUBPROJECT_SCRIPTS} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_REQUESTS} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_UPGRADE} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME}) install(DIRECTORY ${SUBPROJECT_UPGRADE} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_WEATHER} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME}) install(DIRECTORY ${SUBPROJECT_WEATHER} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME})
install(FILES ${SUBPROJECT_INI} DESTINATION ${CONFIG_INSTALL_DIR}) install(FILES ${SUBPROJECT_INI} DESTINATION ${CONFIG_INSTALL_DIR})

View File

@ -18,24 +18,23 @@
#include "abstractextitem.h" #include "abstractextitem.h"
#include <QDir> #include <QDir>
#include <QLocalServer>
#include <QSettings> #include <QSettings>
#include <QStandardPaths> #include <QStandardPaths>
#include <QTime> #include <QTime>
#include "awdebug.h"
#include "abstractextitemaggregator.h" #include "abstractextitemaggregator.h"
#include "awdebug.h"
#include "qcronscheduler.h"
AbstractExtItem::AbstractExtItem(QWidget *parent, const QString desktopName, AbstractExtItem::AbstractExtItem(QWidget *_parent, const QString &_filePath)
const QStringList directories) : QDialog(_parent)
: QDialog(parent) , m_fileName(_filePath)
, m_fileName(desktopName)
, m_dirs(directories)
{ {
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
qCDebug(LOG_LIB) << "Desktop name" << desktopName << "directories" qCDebug(LOG_LIB) << "Desktop name" << _filePath;
<< directories;
m_name = m_fileName; m_name = m_fileName;
} }
@ -44,16 +43,72 @@ AbstractExtItem::AbstractExtItem(QWidget *parent, const QString desktopName,
AbstractExtItem::~AbstractExtItem() AbstractExtItem::~AbstractExtItem()
{ {
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (m_socket) {
m_socket->close();
m_socket->removeServer(socket());
delete m_socket;
}
}
void AbstractExtItem::bumpApi(const int _newVer)
{
qCDebug(LOG_LIB) << "Bump API using new version" << _newVer;
// update for current API
if ((apiVersion() > 0) && (apiVersion() < _newVer)) {
qCWarning(LOG_LIB) << "Bump API version from" << apiVersion() << "to"
<< _newVer;
setApiVersion(_newVer);
writeConfiguration();
}
} }
void AbstractExtItem::copyDefaults(AbstractExtItem *_other) const void AbstractExtItem::copyDefaults(AbstractExtItem *_other) const
{ {
_other->setActive(m_active); _other->setActive(isActive());
_other->setApiVersion(m_apiVersion); _other->setApiVersion(apiVersion());
_other->setComment(m_comment); _other->setComment(comment());
_other->setInterval(m_interval); _other->setCron(cron());
_other->setName(m_name); _other->setInterval(interval());
_other->setName(name());
_other->setSocket(socket());
}
void AbstractExtItem::startTimer()
{
if (!socket().isEmpty())
// check if there is active socket setup
return;
else if (!cron().isEmpty())
// check if there is active scheduler
return;
else if (m_times == 1)
// check if it is time to update
emit(requestDataUpdate());
// update counter value
if (m_times >= interval())
m_times = 0;
m_times++;
}
QString AbstractExtItem::writtableConfig() const
{
QString path = m_fileName;
QString name = QFileInfo(path).fileName();
path.remove(path.count() - name.count() - 1, name.count() + 1);
QString dir = QFileInfo(path).fileName();
return QString("%1/awesomewidgets/%2/%3")
.arg(QStandardPaths::writableLocation(
QStandardPaths::GenericDataLocation))
.arg(dir)
.arg(name);
} }
@ -69,9 +124,9 @@ QString AbstractExtItem::comment() const
} }
QStringList AbstractExtItem::directories() const QString AbstractExtItem::cron() const
{ {
return m_dirs; return m_cron;
} }
@ -105,11 +160,17 @@ int AbstractExtItem::number() const
} }
QString AbstractExtItem::tag(const QString _type) const QString AbstractExtItem::socket() const
{
return m_socketFile;
}
QString AbstractExtItem::tag(const QString &_type) const
{ {
qCDebug(LOG_LIB) << "Tag type" << _type; qCDebug(LOG_LIB) << "Tag type" << _type;
return QString("%1%2").arg(_type).arg(m_number); return QString("%1%2").arg(_type).arg(number());
} }
@ -129,7 +190,7 @@ void AbstractExtItem::setActive(const bool _state)
} }
void AbstractExtItem::setComment(const QString _comment) void AbstractExtItem::setComment(const QString &_comment)
{ {
qCDebug(LOG_LIB) << "Comment" << _comment; qCDebug(LOG_LIB) << "Comment" << _comment;
@ -137,6 +198,28 @@ void AbstractExtItem::setComment(const QString _comment)
} }
void AbstractExtItem::setCron(const QString &_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;
if (cron().isEmpty())
return;
// init scheduler
m_scheduler = new QCronScheduler(this);
m_scheduler->parse(cron());
connect(m_scheduler, SIGNAL(activated()), this,
SIGNAL(requestDataUpdate()));
}
void AbstractExtItem::setInterval(const int _interval) void AbstractExtItem::setInterval(const int _interval)
{ {
qCDebug(LOG_LIB) << "Interval" << _interval; qCDebug(LOG_LIB) << "Interval" << _interval;
@ -147,7 +230,7 @@ void AbstractExtItem::setInterval(const int _interval)
} }
void AbstractExtItem::setName(const QString _name) void AbstractExtItem::setName(const QString &_name)
{ {
qCDebug(LOG_LIB) << "Name" << _name; qCDebug(LOG_LIB) << "Name" << _name;
@ -158,74 +241,108 @@ 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;
if (_number == -1) bool generateNumber = (_number == -1);
if (generateNumber) {
_number = []() { _number = []() {
qCWarning(LOG_LIB) << "Number is empty, generate new one"; qCWarning(LOG_LIB) << "Number is empty, generate new one";
qsrand(QTime::currentTime().msec()); // we suppose that currentTIme().msec() is always valid time
qsrand(static_cast<uint>(QTime::currentTime().msec()));
int n = qrand() % 1000; int n = qrand() % 1000;
qCInfo(LOG_LIB) << "Generated number is" << n; qCInfo(LOG_LIB) << "Generated number is" << n;
return n; return n;
}(); }();
}
m_number = _number; m_number = _number;
if (generateNumber)
writeConfiguration();
}
void AbstractExtItem::setSocket(const QString &_socket)
{
qCDebug(LOG_LIB) << "Socket" << _socket;
// remove old socket first
deinitSocket();
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()
{
// remove old socket first
deinitSocket();
m_socket = new QLocalServer(this);
bool listening = m_socket->listen(socket());
qCInfo(LOG_LIB) << "Server listening on" << socket() << listening;
connect(m_socket, SIGNAL(newConnection()), this,
SLOT(newConnectionReceived()));
} }
void AbstractExtItem::readConfiguration() void AbstractExtItem::readConfiguration()
{ {
for (int i = m_dirs.count() - 1; i >= 0; i--) { QSettings settings(m_fileName, QSettings::IniFormat);
if (!QDir(m_dirs.at(i)).entryList(QDir::Files).contains(m_fileName))
continue;
QSettings settings(QString("%1/%2").arg(m_dirs.at(i)).arg(m_fileName),
QSettings::IniFormat);
settings.beginGroup(QString("Desktop Entry")); settings.beginGroup("Desktop Entry");
setName(settings.value(QString("Name"), m_name).toString()); setName(settings.value("Name", name()).toString());
setComment(settings.value(QString("Comment"), m_comment).toString()); setComment(settings.value("Comment", comment()).toString());
setApiVersion( setApiVersion(settings.value("X-AW-ApiVersion", apiVersion()).toInt());
settings.value(QString("X-AW-ApiVersion"), m_apiVersion).toInt()); setActive(settings.value("X-AW-Active", isActive()).toBool());
setActive(settings.value(QString("X-AW-Active"), QVariant(m_active)) setInterval(settings.value("X-AW-Interval", interval()).toInt());
.toString() setNumber(settings.value("X-AW-Number", number()).toInt());
== QString("true")); setCron(settings.value("X-AW-Schedule", cron()).toString());
setInterval( setSocket(settings.value("X-AW-Socket", socket()).toString());
settings.value(QString("X-AW-Interval"), m_interval).toInt()); settings.endGroup();
setNumber(settings.value(QString("X-AW-Number"), m_number).toInt());
settings.endGroup();
}
} }
bool AbstractExtItem::tryDelete() const bool AbstractExtItem::tryDelete() const
{ {
for (auto dir : m_dirs) { bool status = QFile::remove(m_fileName);
bool status = QFile::remove(QString("%1/%2").arg(dir).arg(m_fileName)); qCInfo(LOG_LIB) << "Remove file" << m_fileName << status;
qCInfo(LOG_LIB) << "Remove file"
<< QString("%1/%2").arg(dir).arg(m_fileName) << status;
}
// check if exists return status;
for (auto dir : m_dirs)
if (QFile::exists(QString("%1/%2").arg(dir).arg(m_fileName)))
return false;
return true;
} }
void AbstractExtItem::writeConfiguration() const void AbstractExtItem::writeConfiguration() const
{ {
QSettings settings(QString("%1/%2").arg(m_dirs.first()).arg(m_fileName), QSettings settings(writtableConfig(), QSettings::IniFormat);
QSettings::IniFormat);
qCInfo(LOG_LIB) << "Configuration file" << settings.fileName(); qCInfo(LOG_LIB) << "Configuration file" << settings.fileName();
settings.beginGroup(QString("Desktop Entry")); settings.beginGroup("Desktop Entry");
settings.setValue(QString("Encoding"), QString("UTF-8")); settings.setValue("Encoding", "UTF-8");
settings.setValue(QString("Name"), m_name); settings.setValue("Name", name());
settings.setValue(QString("Comment"), m_comment); settings.setValue("Comment", comment());
settings.setValue(QString("X-AW-ApiVersion"), m_apiVersion); settings.setValue("X-AW-ApiVersion", apiVersion());
settings.setValue(QString("X-AW-Active"), QVariant(m_active).toString()); settings.setValue("X-AW-Active", isActive());
settings.setValue(QString("X-AW-Interval"), m_interval); settings.setValue("X-AW-Interval", interval());
settings.setValue(QString("X-AW-Number"), m_number); settings.setValue("X-AW-Number", number());
settings.setValue("X-AW-Schedule", cron());
settings.setValue("X-AW-Socket", socket());
settings.endGroup(); settings.endGroup();
settings.sync(); settings.sync();
} }
void AbstractExtItem::newConnectionReceived()
{
emit(requestDataUpdate());
}

View File

@ -22,64 +22,86 @@
#include <QVariant> #include <QVariant>
class QCronScheduler;
class QLocalServer;
class AbstractExtItem : public QDialog class AbstractExtItem : public QDialog
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY(bool active READ isActive WRITE setActive) Q_PROPERTY(bool active READ isActive WRITE setActive)
Q_PROPERTY(int apiVersion READ apiVersion WRITE setApiVersion) Q_PROPERTY(int apiVersion READ apiVersion WRITE setApiVersion)
Q_PROPERTY(QString comment READ comment WRITE setComment) Q_PROPERTY(QString comment READ comment WRITE setComment)
Q_PROPERTY(QStringList directories READ directories) Q_PROPERTY(QString cron READ cron WRITE setCron)
Q_PROPERTY(QString fileName READ fileName) Q_PROPERTY(QString fileName READ fileName)
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)
Q_PROPERTY(QString socket READ socket WRITE setSocket)
Q_PROPERTY(QString uniq READ uniq) Q_PROPERTY(QString uniq READ uniq)
public: public:
explicit AbstractExtItem(QWidget *parent = nullptr, explicit AbstractExtItem(QWidget *_parent = nullptr,
const QString desktopName = QString(), const QString &_filePath = "");
const QStringList directories = QStringList());
virtual ~AbstractExtItem(); virtual ~AbstractExtItem();
virtual AbstractExtItem *copy(const QString _fileName, const int _number) virtual void bumpApi(const int _newVer);
virtual AbstractExtItem *copy(const QString &_fileName, const int _number)
= 0; = 0;
void copyDefaults(AbstractExtItem *_other) const; virtual void copyDefaults(AbstractExtItem *_other) const;
virtual void startTimer();
QString writtableConfig() const;
// get methods // get methods
int apiVersion() const; int apiVersion() const;
QString comment() const; QString comment() const;
QStringList directories() const; QString cron() const;
QString fileName() const; QString fileName() const;
int interval() const; int interval() const;
bool isActive() const; bool isActive() const;
QString name() const; QString name() const;
int number() const; int number() const;
QString tag(const QString _type) const; QString socket() const;
QString tag(const QString &_type) const;
virtual QString uniq() const = 0; virtual QString uniq() const = 0;
// set methods // set methods
void setApiVersion(const int _apiVersion = 0); void setApiVersion(const int _apiVersion);
void setActive(const bool _state = true); void setActive(const bool _state);
void setComment(const QString _comment = QString("empty")); void setComment(const QString &_comment);
void setInterval(const int _interval = 1); void setCron(const QString &_cron);
void setName(const QString _name = QString("none")); void setInterval(const int _interval);
void setNumber(int _number = -1); void setName(const QString &_name);
void setNumber(int _number);
void setSocket(const QString &_socket);
signals:
void dataReceived(const QVariantHash &_data);
void requestDataUpdate();
public slots: public slots:
virtual void deinitSocket();
virtual void initSocket();
virtual void readConfiguration(); virtual void readConfiguration();
virtual QVariantHash run() = 0; virtual QVariantHash run() = 0;
virtual int showConfiguration(const QVariant args = QVariant()) = 0; virtual int showConfiguration(const QVariant &_args) = 0;
bool tryDelete() const; virtual bool tryDelete() const;
virtual void writeConfiguration() const; virtual void writeConfiguration() const;
private slots:
void newConnectionReceived();
private: private:
QString m_fileName; QCronScheduler *m_scheduler = nullptr;
QStringList m_dirs; QString m_fileName = "/dev/null";
int m_times = 0;
virtual void translate() = 0; virtual void translate() = 0;
// properties // properties
int m_apiVersion = 0; int m_apiVersion = 0;
bool m_active = true; bool m_active = true;
QString m_comment = QString("empty"); QString m_comment = "empty";
QString m_cron = "";
int m_interval = 1; int m_interval = 1;
QString m_name = QString("none"); QString m_name = "none";
int m_number = -1; int m_number = -1;
QLocalServer *m_socket = nullptr;
QString m_socketFile = "";
}; };

View File

@ -16,40 +16,35 @@
***************************************************************************/ ***************************************************************************/
#include "abstractextitemaggregator.h" #include "abstractextitemaggregator.h"
#include "ui_abstractextitemaggregator.h"
#include <KI18n/KLocalizedString> #include <KI18n/KLocalizedString>
#include <QHBoxLayout> #include <QFileInfo>
#include <QInputDialog> #include <QInputDialog>
#include <QLineEdit> #include <QPushButton>
#include "awdebug.h"
AbstractExtItemAggregator::AbstractExtItemAggregator(QWidget *parent) AbstractExtItemAggregator::AbstractExtItemAggregator(QWidget *_parent,
: QWidget(parent) const QString &_type)
: QDialog(_parent)
, ui(new Ui::AbstractExtItemAggregator)
, m_type(_type)
{ {
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
dialog = new QDialog(this); ui->setupUi(this);
widgetDialog = new QListWidget(dialog);
dialogButtons = new QDialogButtonBox(
QDialogButtonBox::Open | QDialogButtonBox::Close, Qt::Vertical, dialog);
copyButton copyButton
= dialogButtons->addButton(i18n("Copy"), QDialogButtonBox::ActionRole); = ui->buttonBox->addButton(i18n("Copy"), QDialogButtonBox::ActionRole);
createButton = dialogButtons->addButton(i18n("Create"), createButton = ui->buttonBox->addButton(i18n("Create"),
QDialogButtonBox::ActionRole); QDialogButtonBox::ActionRole);
deleteButton = dialogButtons->addButton(i18n("Remove"), deleteButton = ui->buttonBox->addButton(i18n("Remove"),
QDialogButtonBox::ActionRole); QDialogButtonBox::ActionRole);
QHBoxLayout *layout = new QHBoxLayout(dialog);
layout->addWidget(widgetDialog);
layout->addWidget(dialogButtons);
dialog->setLayout(layout);
connect(dialogButtons, SIGNAL(clicked(QAbstractButton *)), this, connect(ui->buttonBox, SIGNAL(clicked(QAbstractButton *)), this,
SLOT(editItemButtonPressed(QAbstractButton *))); SLOT(editItemButtonPressed(QAbstractButton *)));
connect(dialogButtons, SIGNAL(rejected()), dialog, SLOT(reject())); connect(ui->buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
connect(widgetDialog, SIGNAL(itemActivated(QListWidgetItem *)), this, connect(ui->listWidget, SIGNAL(itemActivated(QListWidgetItem *)), this,
SLOT(editItemActivated(QListWidgetItem *))); SLOT(editItemActivated(QListWidgetItem *)));
} }
@ -58,32 +53,142 @@ AbstractExtItemAggregator::~AbstractExtItemAggregator()
{ {
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
delete dialog; delete ui;
}
void AbstractExtItemAggregator::copyItem()
{
AbstractExtItem *source = itemFromWidget();
QString fileName = getName();
int number = uniqNumber();
QString dir = QString("%1/awesomewidgets/%2")
.arg(QStandardPaths::writableLocation(
QStandardPaths::GenericDataLocation))
.arg(m_type);
if ((!source) || (fileName.isEmpty())) {
qCWarning(LOG_LIB) << "Nothing to copy";
return;
}
QString filePath = QString("%1/%2").arg(dir).arg(fileName);
AbstractExtItem *newItem = source->copy(filePath, number);
if (newItem->showConfiguration(configArgs()) == 1) {
initItems();
repaintList();
}
}
void AbstractExtItemAggregator::deleteItem()
{
AbstractExtItem *source = itemFromWidget();
if (!source) {
qCWarning(LOG_LIB) << "Nothing to delete";
return;
};
if (source->tryDelete()) {
initItems();
repaintList();
}
}
void AbstractExtItemAggregator::editItem()
{
AbstractExtItem *source = itemFromWidget();
if (!source) {
qCWarning(LOG_LIB) << "Nothing to edit";
return;
};
if (source->showConfiguration(configArgs()) == 1) {
initItems();
repaintList();
}
} }
QString AbstractExtItemAggregator::getName() QString AbstractExtItemAggregator::getName()
{ {
bool ok; bool ok;
QString name = QInputDialog::getText(this, i18n("Enter file name"), QString name
i18n("File name"), QLineEdit::Normal, = QInputDialog::getText(this, i18n("Enter file name"),
QString(""), &ok); i18n("File name"), QLineEdit::Normal, "", &ok);
if ((!ok) || (name.isEmpty())) if ((!ok) || (name.isEmpty()))
return QString(""); return "";
if (!name.endsWith(QString(".desktop"))) if (!name.endsWith(".desktop"))
name += QString(".desktop"); name += ".desktop";
return name; return name;
} }
AbstractExtItem *AbstractExtItemAggregator::itemFromWidget()
{
QListWidgetItem *widgetItem = ui->listWidget->currentItem();
if (!widgetItem)
return nullptr;
AbstractExtItem *found = nullptr;
for (auto &item : items()) {
QString fileName = QFileInfo(item->fileName()).fileName();
if (fileName != widgetItem->text())
continue;
found = item;
break;
}
if (!found)
qCWarning(LOG_LIB) << "Could not find item by name"
<< widgetItem->text();
return found;
}
void AbstractExtItemAggregator::repaintList()
{
ui->listWidget->clear();
for (auto &_item : items()) {
QString fileName = QFileInfo(_item->fileName()).fileName();
QListWidgetItem *item = new QListWidgetItem(fileName, ui->listWidget);
QStringList tooltip;
tooltip.append(i18n("Name: %1", _item->name()));
tooltip.append(i18n("Comment: %1", _item->comment()));
tooltip.append(i18n("Identity: %1", _item->uniq()));
item->setToolTip(tooltip.join('\n'));
ui->listWidget->addItem(item);
}
}
int AbstractExtItemAggregator::uniqNumber() const
{
QList<int> tagList;
for (auto &item : items())
tagList.append(item->number());
int number = 0;
while (tagList.contains(number))
number++;
return number;
}
QVariant AbstractExtItemAggregator::configArgs() const QVariant AbstractExtItemAggregator::configArgs() const
{ {
return m_configArgs; return m_configArgs;
} }
void AbstractExtItemAggregator::setConfigArgs(const QVariant _configArgs) QString AbstractExtItemAggregator::type() const
{
return m_type;
}
void AbstractExtItemAggregator::setConfigArgs(const QVariant &_configArgs)
{ {
qCDebug(LOG_LIB) << "Configuration arguments" << _configArgs; qCDebug(LOG_LIB) << "Configuration arguments" << _configArgs;
@ -97,14 +202,14 @@ void AbstractExtItemAggregator::editItemActivated(QListWidgetItem *)
} }
void AbstractExtItemAggregator::editItemButtonPressed(QAbstractButton *button) void AbstractExtItemAggregator::editItemButtonPressed(QAbstractButton *_button)
{ {
if (static_cast<QPushButton *>(button) == copyButton) if (static_cast<QPushButton *>(_button) == copyButton)
return copyItem(); return copyItem();
else if (static_cast<QPushButton *>(button) == createButton) else if (static_cast<QPushButton *>(_button) == createButton)
return createItem(); return doCreateItem();
else if (static_cast<QPushButton *>(button) == deleteButton) else if (static_cast<QPushButton *>(_button) == deleteButton)
return deleteItem(); return deleteItem();
else if (dialogButtons->buttonRole(button) == QDialogButtonBox::AcceptRole) else if (ui->buttonBox->buttonRole(_button) == QDialogButtonBox::AcceptRole)
return editItem(); return editItem();
} }

View File

@ -19,45 +19,80 @@
#define ABSTRACTEXTITEMAGGREGATOR_H #define ABSTRACTEXTITEMAGGREGATOR_H
#include <QDialog> #include <QDialog>
#include <QDialogButtonBox> #include <QStandardPaths>
#include <QListWidget>
#include <QPushButton> #include "abstractextitem.h"
#include <QWidget> #include "awdebug.h"
// additional class since QObject macro does not allow class templates class QAbstractButton;
class AbstractExtItemAggregator : public QWidget class QListWidgetItem;
namespace Ui
{
class AbstractExtItemAggregator;
}
class AbstractExtItemAggregator : public QDialog
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY(QVariant configArgs READ configArgs WRITE setConfigArgs) Q_PROPERTY(QVariant configArgs READ configArgs WRITE setConfigArgs)
Q_PROPERTY(QVariant type READ type)
public: public:
explicit AbstractExtItemAggregator(QWidget *parent = nullptr); explicit AbstractExtItemAggregator(QWidget *_parent, const QString &_type);
virtual ~AbstractExtItemAggregator(); virtual ~AbstractExtItemAggregator();
// methods
void copyItem();
template <class T> void createItem()
{
QString fileName = getName();
int number = uniqNumber();
QString dir = QString("%1/awesomewidgets/%2")
.arg(QStandardPaths::writableLocation(
QStandardPaths::GenericDataLocation))
.arg(m_type);
if (fileName.isEmpty()) {
qCWarning(LOG_LIB) << "Nothing to create";
return;
};
QString filePath = QString("%1/%2").arg(dir).arg(fileName);
T *newItem = new T(this, filePath);
newItem->setNumber(number);
if (newItem->showConfiguration(configArgs()) == 1) {
initItems();
repaintList();
};
};
void deleteItem();
void editItem();
QString getName(); QString getName();
// ui AbstractExtItem *itemFromWidget();
QDialog *dialog = nullptr; void repaintList();
QListWidget *widgetDialog = nullptr; int uniqNumber() const;
QDialogButtonBox *dialogButtons = nullptr;
QPushButton *copyButton = nullptr;
QPushButton *createButton = nullptr;
QPushButton *deleteButton = nullptr;
// get methods // get methods
QVariant configArgs() const; QVariant configArgs() const;
virtual QList<AbstractExtItem *> items() const = 0;
QString type() const;
// set methods // set methods
void setConfigArgs(const QVariant _configArgs); void setConfigArgs(const QVariant &_configArgs);
private slots: private slots:
void editItemActivated(QListWidgetItem *); void editItemActivated(QListWidgetItem *);
void editItemButtonPressed(QAbstractButton *button); void editItemButtonPressed(QAbstractButton *_button);
private: private:
// ui
Ui::AbstractExtItemAggregator *ui = nullptr;
QPushButton *copyButton = nullptr;
QPushButton *createButton = nullptr;
QPushButton *deleteButton = nullptr;
// properties
QVariant m_configArgs; QVariant m_configArgs;
// methods QString m_type;
virtual void copyItem() = 0; // ui methods
virtual void createItem() = 0; virtual void doCreateItem() = 0;
virtual void deleteItem() = 0; virtual void initItems() = 0;
virtual void editItem() = 0;
}; };

View File

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>AbstractExtItemAggregator</class>
<widget class="QDialog" name="AbstractExtItemAggregator">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QListWidget" name="listWidget"/>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Close|QDialogButtonBox::Open</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>AbstractExtItemAggregator</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>AbstractExtItemAggregator</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -0,0 +1,47 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#ifndef ABSTRACTWEATHERPROVIDER_H
#define ABSTRACTWEATHERPROVIDER_H
#include <QObject>
#include <QUrl>
class AbstractWeatherProvider : public QObject
{
Q_OBJECT
Q_PROPERTY(int number READ number)
public:
explicit AbstractWeatherProvider(QObject *_parent, const int _number)
: QObject(_parent)
, m_number(_number){};
virtual ~AbstractWeatherProvider(){};
virtual void initUrl(const QString &_city, const QString &_country,
const int _ts)
= 0;
virtual QVariantHash parse(const QVariantMap &_json) const = 0;
virtual QUrl url() const = 0;
int number() const { return m_number; };
private:
int m_number;
};
#endif /* ABSTRACTWEATHERPROVIDER_H */

View File

@ -0,0 +1,144 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awabstractformatter.h"
#include <QSettings>
#include "awdebug.h"
AWAbstractFormatter::AWAbstractFormatter(QWidget *_parent,
const QString &_filePath)
: AbstractExtItem(_parent, _filePath)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
}
AWAbstractFormatter::~AWAbstractFormatter()
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
}
void AWAbstractFormatter::copyDefaults(AbstractExtItem *_other) const
{
AbstractExtItem::copyDefaults(_other);
static_cast<AWAbstractFormatter *>(_other)->setType(type());
}
QString AWAbstractFormatter::uniq() const
{
return QString("%1(%2)").arg(name()).arg(strType());
}
QString AWAbstractFormatter::strType() const
{
QString value;
switch (m_type) {
case FormatterClass::DateTime:
value = "DateTime";
break;
case FormatterClass::Float:
value = "Float";
break;
case FormatterClass::List:
value = "List";
break;
case FormatterClass::Script:
value = "Script";
break;
case FormatterClass::String:
value = "String";
break;
case FormatterClass::Json:
value = "Json";
break;
case FormatterClass::NoFormat:
value = "NoFormat";
break;
}
return value;
}
AWAbstractFormatter::FormatterClass AWAbstractFormatter::type() const
{
return m_type;
}
void AWAbstractFormatter::setStrType(const QString &_type)
{
qCDebug(LOG_LIB) << "Type" << _type;
if (_type == "DateTime")
m_type = FormatterClass::DateTime;
else if (_type == "Float")
m_type = FormatterClass::Float;
else if (_type == "List")
m_type = FormatterClass::List;
else if (_type == "Script")
m_type = FormatterClass::Script;
else if (_type == "String")
m_type = FormatterClass::String;
else if (_type == "Json")
m_type = FormatterClass::Json;
else
m_type = FormatterClass::NoFormat;
}
void AWAbstractFormatter::setType(
const AWAbstractFormatter::FormatterClass _type)
{
qCDebug(LOG_LIB) << "Type" << static_cast<int>(_type);
m_type = _type;
}
void AWAbstractFormatter::readConfiguration()
{
AbstractExtItem::readConfiguration();
QSettings settings(fileName(), QSettings::IniFormat);
settings.beginGroup("Desktop Entry");
setStrType(settings.value("X-AW-Type", strType()).toString());
settings.endGroup();
}
void AWAbstractFormatter::writeConfiguration() const
{
AbstractExtItem::writeConfiguration();
QSettings settings(writtableConfig(), QSettings::IniFormat);
qCInfo(LOG_LIB) << "Configuration file" << settings.fileName();
settings.beginGroup("Desktop Entry");
settings.setValue("X-AW-Type", strType());
settings.endGroup();
settings.sync();
}

View File

@ -0,0 +1,64 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#ifndef AWABSTRACTFORMATTER_H
#define AWABSTRACTFORMATTER_H
#include "abstractextitem.h"
class AWAbstractFormatter : public AbstractExtItem
{
Q_OBJECT
Q_PROPERTY(FormatterClass type READ type WRITE setType)
Q_PROPERTY(QString strType READ strType WRITE setStrType)
public:
enum class FormatterClass {
DateTime,
Float,
List,
Script,
String,
NoFormat,
Json
};
explicit AWAbstractFormatter(QWidget *_parent = nullptr,
const QString &_filePath = "");
virtual ~AWAbstractFormatter();
virtual QString convert(const QVariant &_value) const = 0;
void copyDefaults(AbstractExtItem *_other) const;
QString uniq() const;
// properties
QString strType() const;
FormatterClass type() const;
void setStrType(const QString &_type);
void setType(const FormatterClass _type);
public slots:
virtual void readConfiguration();
QVariantHash run() { return QVariantHash(); };
virtual void writeConfiguration() const;
private:
// properties
FormatterClass m_type = FormatterClass::NoFormat;
};
#endif /* AWABSTRACTFORMATTER_H */

View File

@ -0,0 +1,177 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awdatetimeformatter.h"
#include "ui_awdatetimeformatter.h"
#include <KI18n/KLocalizedString>
#include <QDateTime>
#include <QDir>
#include <QSettings>
#include "awdebug.h"
AWDateTimeFormatter::AWDateTimeFormatter(QWidget *_parent,
const QString &_filePath)
: AWAbstractFormatter(_parent, _filePath)
, ui(new Ui::AWDateTimeFormatter)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty())
readConfiguration();
ui->setupUi(this);
translate();
}
AWDateTimeFormatter::~AWDateTimeFormatter()
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
delete ui;
}
QString AWDateTimeFormatter::convert(const QVariant &_value) const
{
qCDebug(LOG_LIB) << "Convert value" << _value;
return m_locale.toString(_value.toDateTime(), m_format);
}
AWDateTimeFormatter *AWDateTimeFormatter::copy(const QString &_fileName,
const int _number)
{
qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
AWDateTimeFormatter *item
= new AWDateTimeFormatter(static_cast<QWidget *>(parent()), _fileName);
AWAbstractFormatter::copyDefaults(item);
item->setFormat(format());
item->setTranslateString(translateString());
item->setNumber(_number);
return item;
}
QString AWDateTimeFormatter::format() const
{
return m_format;
}
bool AWDateTimeFormatter::translateString() const
{
return m_translate;
}
void AWDateTimeFormatter::setFormat(const QString &_format)
{
qCDebug(LOG_LIB) << "Set format" << _format;
m_format = _format;
}
void AWDateTimeFormatter::setTranslateString(const bool _translate)
{
qCDebug(LOG_LIB) << "Set translate string" << _translate;
m_translate = _translate;
initLocale();
}
void AWDateTimeFormatter::readConfiguration()
{
AWAbstractFormatter::readConfiguration();
QSettings settings(fileName(), QSettings::IniFormat);
settings.beginGroup("Desktop Entry");
setFormat(settings.value("X-AW-Format", format()).toString());
setTranslateString(
settings.value("X-AW-Translate", translateString()).toBool());
settings.endGroup();
bumpApi(AW_FORMATTER_API);
}
int AWDateTimeFormatter::showConfiguration(const QVariant &_args)
{
Q_UNUSED(_args)
ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment());
ui->label_typeValue->setText("DateTime");
ui->lineEdit_format->setText(format());
ui->checkBox_translate->setCheckState(translateString() ? Qt::Checked
: Qt::Unchecked);
int ret = exec();
if (ret != 1)
return ret;
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text());
setFormat(ui->lineEdit_format->text());
setTranslateString(ui->checkBox_translate->checkState() == Qt::Checked);
writeConfiguration();
return ret;
}
void AWDateTimeFormatter::writeConfiguration() const
{
AWAbstractFormatter::writeConfiguration();
QSettings settings(writtableConfig(), QSettings::IniFormat);
qCInfo(LOG_LIB) << "Configuration file" << settings.fileName();
settings.beginGroup("Desktop Entry");
settings.setValue("X-AW-Format", format());
settings.setValue("X-AW-Translate", translateString());
settings.endGroup();
settings.sync();
}
void AWDateTimeFormatter::initLocale()
{
m_locale = m_translate ? QLocale::system() : QLocale::c();
}
void AWDateTimeFormatter::translate()
{
ui->label_name->setText(i18n("Name"));
ui->label_comment->setText(i18n("Comment"));
ui->label_type->setText(i18n("Type"));
ui->label_format->setText(i18n("Format"));
ui->checkBox_translate->setText(i18n("Translate strings"));
}

View File

@ -19,27 +19,46 @@
#define AWDATETIMEFORMATTER_H #define AWDATETIMEFORMATTER_H
#include "awabstractformatter.h" #include "awabstractformatter.h"
#include <QLocale>
namespace Ui
{
class AWDateTimeFormatter;
}
class AWDateTimeFormatter : public AWAbstractFormatter class AWDateTimeFormatter : public AWAbstractFormatter
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY(QString format READ format WRITE setFormat) Q_PROPERTY(QString format READ format WRITE setFormat)
Q_PROPERTY(
bool translateString READ translateString WRITE setTranslateString)
public: public:
explicit AWDateTimeFormatter(QObject *parent, const QString filename, explicit AWDateTimeFormatter(QWidget *_parent = nullptr,
const QString section); const QString &_filePath = "");
explicit AWDateTimeFormatter(QObject *parent, const QString format);
virtual ~AWDateTimeFormatter(); virtual ~AWDateTimeFormatter();
QString convert(const QVariant &value) const; QString convert(const QVariant &_value) const;
AWDateTimeFormatter *copy(const QString &_fileName, const int _number);
// properties // properties
QString format() const; QString format() const;
void setFormat(const QString _format); bool translateString() const;
void setFormat(const QString &_format);
void setTranslateString(const bool _translate);
public slots:
void readConfiguration();
int showConfiguration(const QVariant &_args);
void writeConfiguration() const;
private: private:
void init(const QString filename, const QString section); Ui::AWDateTimeFormatter *ui = nullptr;
void initLocale();
void translate();
// properties // properties
QString m_format; QLocale m_locale;
QString m_format = "";
bool m_translate = true;
}; };

View File

@ -0,0 +1,197 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>AWDateTimeFormatter</class>
<widget class="QDialog" name="AWDateTimeFormatter">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>420</width>
<height>185</height>
</rect>
</property>
<property name="windowTitle">
<string>Configuration</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="layout_name">
<item>
<widget class="QLabel" name="label_name">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Name</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_name"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_comment">
<item>
<widget class="QLabel" name="label_comment">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Comment</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_comment"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_type">
<item>
<widget class="QLabel" name="label_type">
<property name="text">
<string>Type</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_typeValue">
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_format">
<item>
<widget class="QLabel" name="label_format">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Format</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_format"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_translate">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="checkBox_translate">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Translate strings</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>AWDateTimeFormatter</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>AWDateTimeFormatter</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -1,11 +1,75 @@
{ {
"__url": "https://developer.yahoo.com/weather/documentation.html", "__url-yahoo": "https://developer.yahoo.com/weather/documentation.html",
"__url-owm": "http://openweathermap.org/weather-conditions",
"image": { "image": {
"__comment": "should be described as html image with full path inside", "__comment": "should be described as html image with full path inside",
"default": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/3200.gif\">", "default": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/3200.gif\">",
"800": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/01d.png\">",
"801": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/02d.png\">",
"802": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/03d.png\">",
"803": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/03d.png\">",
"804": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/04d.png\">",
"300": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">",
"301": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">",
"302": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">",
"310": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">",
"311": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">",
"312": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">",
"313": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">",
"314": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">",
"321": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">",
"520": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">",
"521": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">",
"522": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">",
"531": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">",
"500": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/10d.png\">",
"501": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/10d.png\">",
"502": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/10d.png\">",
"503": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/10d.png\">",
"504": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/10d.png\">",
"200": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/11d.png\">",
"201": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/11d.png\">",
"202": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/11d.png\">",
"210": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/11d.png\">",
"211": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/11d.png\">",
"212": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/11d.png\">",
"221": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/11d.png\">",
"230": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/11d.png\">",
"231": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/11d.png\">",
"232": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/11d.png\">",
"511": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/13d.png\">",
"600": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/13d.png\">",
"601": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/13d.png\">",
"602": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/13d.png\">",
"611": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/13d.png\">",
"612": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/13d.png\">",
"615": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/13d.png\">",
"616": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/13d.png\">",
"620": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/13d.png\">",
"621": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/13d.png\">",
"622": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/13d.png\">",
"701": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/50d.png\">",
"711": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/50d.png\">",
"721": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/50d.png\">",
"731": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/50d.png\">",
"741": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/50d.png\">",
"751": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/50d.png\">",
"761": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/50d.png\">",
"762": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/50d.png\">",
"771": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/50d.png\">",
"781": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/50d.png\">",
"0": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/0.gif\">", "0": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/0.gif\">",
"1": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/1.gif\">", "1": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/1.gif\">",
"2": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/2.gif\">", "2": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/2.gif\">",
@ -59,8 +123,71 @@
"text": { "text": {
"default": "\u2604", "default": "\u2604",
"3200": "\u2604",
"800": "\u2600",
"801": "\u26C5",
"802": "\u2601",
"803": "\u2601",
"804": "\u2601",
"300": "\u2602",
"301": "\u2602",
"302": "\u2602",
"310": "\u2602",
"311": "\u2602",
"312": "\u2602",
"313": "\u2602",
"314": "\u2602",
"321": "\u2602",
"520": "\u2602",
"521": "\u2602",
"522": "\u2602",
"531": "\u2602",
"500": "\u2614",
"501": "\u2614",
"502": "\u2614",
"503": "\u2614",
"504": "\u2614",
"200": "\u2608",
"201": "\u2608",
"202": "\u2608",
"210": "\u2608",
"211": "\u2608",
"212": "\u2608",
"221": "\u2608",
"230": "\u2608",
"231": "\u2608",
"232": "\u2608",
"511": "\u2603",
"600": "\u2603",
"601": "\u2603",
"602": "\u2603",
"611": "\u2603",
"612": "\u2603",
"615": "\u2603",
"616": "\u2603",
"620": "\u2603",
"621": "\u2603",
"622": "\u2603",
"701": "\u26C5",
"711": "\u26C5",
"721": "\u26C5",
"731": "\u26C5",
"741": "\u26C5",
"751": "\u26C5",
"761": "\u26C5",
"762": "\u26C5",
"771": "\u26C5",
"781": "\u26C5",
"3200": "\u2604",
"0": "\u2604", "0": "\u2604",
"1": "\u2604", "1": "\u2604",
"2": "\u2604", "2": "\u2604",

View File

@ -0,0 +1,283 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awfloatformatter.h"
#include "ui_awfloatformatter.h"
#include <KI18n/KLocalizedString>
#include <QDir>
#include <QSettings>
#include "awdebug.h"
AWFloatFormatter::AWFloatFormatter(QWidget *_parent, const QString &_filePath)
: AWAbstractFormatter(_parent, _filePath)
, ui(new Ui::AWFloatFormatter)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty())
readConfiguration();
ui->setupUi(this);
translate();
}
AWFloatFormatter::~AWFloatFormatter()
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
delete ui;
}
QString AWFloatFormatter::convert(const QVariant &_value) const
{
qCDebug(LOG_LIB) << "Convert value" << _value;
QString output
= QString("%1").arg(_value.toDouble() * multiplier() + summand(),
count(), format(), precision(), fillChar());
if (forceWidth())
output = output.left(count());
return output;
}
AWFloatFormatter *AWFloatFormatter::copy(const QString &_fileName,
const int _number)
{
qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
AWFloatFormatter *item
= new AWFloatFormatter(static_cast<QWidget *>(parent()), _fileName);
AWAbstractFormatter::copyDefaults(item);
item->setCount(count());
item->setFormat(format());
item->setFillChar(fillChar());
item->setForceWidth(forceWidth());
item->setMultiplier(multiplier());
item->setNumber(_number);
item->setPrecision(precision());
item->setSummand(summand());
return item;
}
int AWFloatFormatter::count() const
{
return m_count;
}
QChar AWFloatFormatter::fillChar() const
{
return m_fillChar;
}
bool AWFloatFormatter::forceWidth() const
{
return m_forceWidth;
}
char AWFloatFormatter::format() const
{
return m_format;
}
double AWFloatFormatter::multiplier() const
{
return m_multiplier;
}
int AWFloatFormatter::precision() const
{
return m_precision;
}
double AWFloatFormatter::summand() const
{
return m_summand;
}
void AWFloatFormatter::setCount(const int _count)
{
qCDebug(LOG_LIB) << "Set width" << _count;
m_count = _count;
}
void AWFloatFormatter::setFillChar(const QChar &_fillChar)
{
qCDebug(LOG_LIB) << "Set char" << _fillChar;
m_fillChar = _fillChar;
}
void AWFloatFormatter::setForceWidth(const bool _forceWidth)
{
qCDebug(LOG_LIB) << "Set force strip" << _forceWidth;
m_forceWidth = _forceWidth;
}
void AWFloatFormatter::setFormat(char _format)
{
qCDebug(LOG_LIB) << "Set format" << _format;
// http://doc.qt.io/qt-5/qstring.html#argument-formats
if ((_format != 'e') && (_format != 'E') && (_format != 'f')
&& (_format != 'g') && (_format != 'G')) {
qCWarning(LOG_LIB) << "Invalid format" << _format;
_format = 'f';
}
m_format = _format;
}
void AWFloatFormatter::setMultiplier(const double _multiplier)
{
qCDebug(LOG_LIB) << "Set multiplier" << _multiplier;
m_multiplier = _multiplier;
}
void AWFloatFormatter::setPrecision(const int _precision)
{
qCDebug(LOG_LIB) << "Set precision" << _precision;
m_precision = _precision;
}
void AWFloatFormatter::setSummand(const double _summand)
{
qCDebug(LOG_LIB) << "Set summand" << _summand;
m_summand = _summand;
}
void AWFloatFormatter::readConfiguration()
{
AWAbstractFormatter::readConfiguration();
QSettings settings(fileName(), QSettings::IniFormat);
settings.beginGroup("Desktop Entry");
setCount(settings.value("X-AW-Width", count()).toInt());
setFillChar(settings.value("X-AW-FillChar", fillChar()).toString().at(0));
setForceWidth(settings.value("X-AW-ForceWidth", forceWidth()).toBool());
setFormat(settings.value("X-AW-Format", QString(format()))
.toString()
.at(0)
.toLatin1());
setMultiplier(settings.value("X-AW-Multiplier", multiplier()).toDouble());
setPrecision(settings.value("X-AW-Precision", precision()).toInt());
setSummand(settings.value("X-AW-Summand", summand()).toDouble());
settings.endGroup();
bumpApi(AW_FORMATTER_API);
}
int AWFloatFormatter::showConfiguration(const QVariant &_args)
{
Q_UNUSED(_args)
ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment());
ui->label_typeValue->setText("Float");
ui->comboBox_format->setCurrentIndex(
ui->comboBox_format->findText(QString(format())));
ui->spinBox_precision->setValue(precision());
ui->spinBox_width->setValue(count());
ui->lineEdit_fill->setText(QString(fillChar()));
ui->checkBox_forceWidth->setCheckState(forceWidth() ? Qt::Checked
: Qt::Unchecked);
ui->doubleSpinBox_multiplier->setValue(multiplier());
ui->doubleSpinBox_summand->setValue(summand());
int ret = exec();
if (ret != 1)
return ret;
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text());
setFormat(ui->comboBox_format->currentText().at(0).toLatin1());
setPrecision(ui->spinBox_precision->value());
setCount(ui->spinBox_width->value());
setFillChar(ui->lineEdit_fill->text().at(0));
setForceWidth(ui->checkBox_forceWidth->checkState() == Qt::Checked);
setMultiplier(ui->doubleSpinBox_multiplier->value());
setSummand(ui->doubleSpinBox_summand->value());
writeConfiguration();
return ret;
}
void AWFloatFormatter::writeConfiguration() const
{
AWAbstractFormatter::writeConfiguration();
QSettings settings(writtableConfig(), QSettings::IniFormat);
qCInfo(LOG_LIB) << "Configuration file" << settings.fileName();
settings.beginGroup("Desktop Entry");
settings.setValue("X-AW-Width", count());
settings.setValue("X-AW-FillChar", fillChar());
settings.setValue("X-AW-Format", QString(format()));
settings.setValue("X-AW-ForceWidth", forceWidth());
settings.setValue("X-AW-Multiplier", multiplier());
settings.setValue("X-AW-Precision", precision());
settings.setValue("X-AW-Summand", summand());
settings.endGroup();
settings.sync();
}
void AWFloatFormatter::translate()
{
ui->label_name->setText(i18n("Name"));
ui->label_comment->setText(i18n("Comment"));
ui->label_type->setText(i18n("Type"));
ui->label_format->setText(i18n("Format"));
ui->label_precision->setText(i18n("Precision"));
ui->label_width->setText(i18n("Width"));
ui->label_fill->setText(i18n("Fill char"));
ui->checkBox_forceWidth->setText(i18n("Force width"));
ui->label_multiplier->setText(i18n("Multiplier"));
ui->label_summand->setText(i18n("Summand"));
}

View File

@ -21,48 +21,60 @@
#include "awabstractformatter.h" #include "awabstractformatter.h"
namespace Ui
{
class AWFloatFormatter;
}
class AWFloatFormatter : public AWAbstractFormatter class AWFloatFormatter : public AWAbstractFormatter
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY(int count READ count WRITE setCount)
Q_PROPERTY(QChar fillChar READ fillChar WRITE setFillChar) Q_PROPERTY(QChar fillChar READ fillChar WRITE setFillChar)
Q_PROPERTY(bool forceWidth READ forceWidth WRITE setForceWidth)
Q_PROPERTY(char format READ format WRITE setFormat) Q_PROPERTY(char format READ format WRITE setFormat)
Q_PROPERTY(double multiplier READ multiplier WRITE setMultiplier) Q_PROPERTY(double multiplier READ multiplier WRITE setMultiplier)
Q_PROPERTY(int precision READ precision WRITE setPrecision) Q_PROPERTY(int precision READ precision WRITE setPrecision)
Q_PROPERTY(double summand READ summand WRITE setSummand) Q_PROPERTY(double summand READ summand WRITE setSummand)
Q_PROPERTY(int width READ width WRITE setWidth)
public: public:
explicit AWFloatFormatter(QObject *parent, const QString filename, explicit AWFloatFormatter(QWidget *_parent = nullptr,
const QString section); const QString &_filePath = "");
explicit AWFloatFormatter(QObject *parent, const QChar fillChar,
const char format, const double multiplier,
const int precision, const double summand,
const int width);
virtual ~AWFloatFormatter(); virtual ~AWFloatFormatter();
QString convert(const QVariant &value) const; QString convert(const QVariant &_value) const;
AWFloatFormatter *copy(const QString &_fileName, const int _number);
// properties // properties
int count() const;
QChar fillChar() const; QChar fillChar() const;
bool forceWidth() const;
char format() const; char format() const;
double multiplier() const; double multiplier() const;
int precision() const; int precision() const;
double summand() const; double summand() const;
int width() const; void setCount(const int _count);
void setFillChar(const QChar _fillChar); void setFillChar(const QChar &_fillChar);
void setForceWidth(const bool _forceWidth);
void setFormat(char _format); void setFormat(char _format);
void setMultiplier(const double _multiplier); void setMultiplier(const double _multiplier);
void setPrecision(const int _precision); void setPrecision(const int _precision);
void setSummand(const double _summand); void setSummand(const double _summand);
void setWidth(const int _width);
public slots:
void readConfiguration();
int showConfiguration(const QVariant &_args);
void writeConfiguration() const;
private: private:
void init(const QString filename, const QString section); Ui::AWFloatFormatter *ui = nullptr;
void translate();
// properties // properties
QChar m_fillChar; int m_count = 0;
char m_format; QChar m_fillChar = QChar();
double m_multiplier; bool m_forceWidth = false;
int m_precision; char m_format = 'f';
double m_summand; double m_multiplier = 1.0;
int m_width; int m_precision = -1;
double m_summand = 0.0;
}; };

View File

@ -0,0 +1,347 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>AWFloatFormatter</class>
<widget class="QDialog" name="AWFloatFormatter">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>420</width>
<height>362</height>
</rect>
</property>
<property name="windowTitle">
<string>Configuration</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="layout_name">
<item>
<widget class="QLabel" name="label_name">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Name</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_name"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_comment">
<item>
<widget class="QLabel" name="label_comment">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Comment</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_comment"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_type">
<item>
<widget class="QLabel" name="label_type">
<property name="text">
<string>Type</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_typeValue">
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_format">
<item>
<widget class="QLabel" name="label_format">
<property name="text">
<string>Format</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="comboBox_format">
<item>
<property name="text">
<string notr="true">e</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">E</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">f</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">g</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">G</string>
</property>
</item>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_precision">
<item>
<widget class="QLabel" name="label_precision">
<property name="text">
<string>Precision</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="spinBox_precision">
<property name="minimum">
<number>-1</number>
</property>
<property name="maximum">
<number>10000</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_width">
<item>
<widget class="QLabel" name="label_width">
<property name="text">
<string>Width</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="spinBox_width">
<property name="minimum">
<number>-10000</number>
</property>
<property name="maximum">
<number>10000</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_fill">
<item>
<widget class="QLabel" name="label_fill">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Fill char</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_fill">
<property name="maxLength">
<number>1</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_forceWIdth">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="checkBox_forceWidth">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Force width</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="layout_multiplier">
<item>
<widget class="QLabel" name="label_multiplier">
<property name="text">
<string>Multiplier</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QDoubleSpinBox" name="doubleSpinBox_multiplier">
<property name="minimum">
<double>-1000000000.000000000000000</double>
</property>
<property name="maximum">
<double>1000000000.000000000000000</double>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_summand">
<item>
<widget class="QLabel" name="label_summand">
<property name="text">
<string>Summand</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QDoubleSpinBox" name="doubleSpinBox_summand">
<property name="minimum">
<double>-1000000000.000000000000000</double>
</property>
<property name="maximum">
<double>1000000000.000000000000000</double>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>AWFloatFormatter</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>AWFloatFormatter</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -0,0 +1,203 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awjsonformatter.h"
#include "ui_awjsonformatter.h"
#include <KI18n/KLocalizedString>
#include <QJsonDocument>
#include <QSettings>
#include "awdebug.h"
AWJsonFormatter::AWJsonFormatter(QWidget *_parent, const QString &_filePath)
: AWAbstractFormatter(_parent, _filePath)
, ui(new Ui::AWJsonFormatter)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty())
readConfiguration();
ui->setupUi(this);
translate();
}
AWJsonFormatter::~AWJsonFormatter()
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
delete ui;
}
QString AWJsonFormatter::convert(const QVariant &_value) const
{
qCDebug(LOG_LIB) << "Convert value" << _value;
// check if _value is string and parse first if required
QJsonDocument json
= _value.type() == QVariant::String
? QJsonDocument::fromJson(_value.toString().toUtf8())
: QJsonDocument::fromVariant(_value);
QVariant converted = json.toVariant();
for (auto &element : m_splittedPath)
converted = getFromJson(converted, element);
return converted.toString();
}
AWJsonFormatter *AWJsonFormatter::copy(const QString &_fileName,
const int _number)
{
qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
AWJsonFormatter *item
= new AWJsonFormatter(static_cast<QWidget *>(parent()), _fileName);
AWAbstractFormatter::copyDefaults(item);
item->setNumber(_number);
item->setPath(path());
return item;
}
QString AWJsonFormatter::path() const
{
return m_path;
}
void AWJsonFormatter::setPath(const QString &_path)
{
qCDebug(LOG_LIB) << "Path" << _path;
m_path = _path;
initPath();
}
void AWJsonFormatter::readConfiguration()
{
AWAbstractFormatter::readConfiguration();
QSettings settings(fileName(), QSettings::IniFormat);
settings.beginGroup("Desktop Entry");
setPath(settings.value("X-AW-Path", path()).toString());
settings.endGroup();
bumpApi(AW_FORMATTER_API);
}
int AWJsonFormatter::showConfiguration(const QVariant &args)
{
Q_UNUSED(args)
ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment());
ui->label_typeValue->setText("Json");
ui->lineEdit_path->setText(path());
int ret = exec();
if (ret != 1)
return ret;
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text());
setPath(ui->lineEdit_path->text());
writeConfiguration();
return ret;
}
void AWJsonFormatter::writeConfiguration() const
{
AWAbstractFormatter::writeConfiguration();
QSettings settings(writtableConfig(), QSettings::IniFormat);
qCInfo(LOG_LIB) << "Configuration file" << settings.fileName();
settings.beginGroup("Desktop Entry");
settings.setValue("X-AW-Path", path());
settings.endGroup();
settings.sync();
}
QVariant AWJsonFormatter::getFromJson(const QVariant &_value,
const QVariant &_element) const
{
qCDebug(LOG_LIB) << "Looking for element" << _element << "in" << _value;
if (_element.type() == QVariant::String) {
return getFromMap(_value, _element.toString());
} else if (_element.type() == QVariant::Int) {
return getFromList(_value, _element.toInt());
} else {
qCWarning(LOG_LIB) << "Unknown type" << _element.typeName();
return _value;
}
}
QVariant AWJsonFormatter::getFromList(const QVariant &_value,
const int _index) const
{
qCDebug(LOG_LIB) << "Looking for index" << _index << "in" << _value;
return _value.toList()[_index];
}
QVariant AWJsonFormatter::getFromMap(const QVariant &_value,
const QString &_key) const
{
qCDebug(LOG_LIB) << "Looking for key" << _key << "in" << _value;
return _value.toMap()[_key];
}
void AWJsonFormatter::initPath()
{
m_splittedPath.clear();
QStringList splittedByDot = m_path.split('.', QString::SkipEmptyParts);
for (auto &element : splittedByDot) {
bool ok;
int number = element.toInt(&ok);
m_splittedPath.append(ok ? QVariant(number) : QVariant(element));
}
}
void AWJsonFormatter::translate()
{
ui->label_name->setText(i18n("Name"));
ui->label_comment->setText(i18n("Comment"));
ui->label_type->setText(i18n("Type"));
ui->label_path->setText(i18n("Path"));
}

View File

@ -0,0 +1,63 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#ifndef AWJSONFORMATTER_H
#define AWJSONFORMATTER_H
#include "awabstractformatter.h"
namespace Ui
{
class AWJsonFormatter;
}
class AWJsonFormatter : public AWAbstractFormatter
{
Q_OBJECT
Q_PROPERTY(QString path READ path WRITE setPath)
public:
explicit AWJsonFormatter(QWidget *_parent = nullptr,
const QString &_filePath = "");
virtual ~AWJsonFormatter();
QString convert(const QVariant &_value) const;
AWJsonFormatter *copy(const QString &_fileName, const int _number);
// properties
QString path() const;
void setPath(const QString &_path);
public slots:
void readConfiguration();
int showConfiguration(const QVariant &_args);
void writeConfiguration() const;
private:
Ui::AWJsonFormatter *ui = nullptr;
QVariant getFromJson(const QVariant &_value,
const QVariant &_element) const;
QVariant getFromList(const QVariant &_value, const int _index) const;
QVariant getFromMap(const QVariant &_value, const QString &_key) const;
void initPath();
void translate();
// properties
QString m_path;
QVariantList m_splittedPath;
};
#endif /* AWJSONFORMATTER_H */

View File

@ -0,0 +1,167 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>AWJsonFormatter</class>
<widget class="QDialog" name="AWJsonFormatter">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>420</width>
<height>128</height>
</rect>
</property>
<property name="windowTitle">
<string>Configuration</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="layout_name">
<item>
<widget class="QLabel" name="label_name">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Name</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_name"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_comment">
<item>
<widget class="QLabel" name="label_comment">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Comment</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_comment"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_type">
<item>
<widget class="QLabel" name="label_type">
<property name="text">
<string>Type</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_typeValue">
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_path">
<item>
<widget class="QLabel" name="label_path">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Path</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_path"/>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>AWJsonFormatter</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>AWJsonFormatter</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -0,0 +1,191 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awlistformatter.h"
#include "ui_awlistformatter.h"
#include <KI18n/KLocalizedString>
#include <QSettings>
#include "awdebug.h"
AWListFormatter::AWListFormatter(QWidget *_parent, const QString &_filePath)
: AWAbstractFormatter(_parent, _filePath)
, ui(new Ui::AWListFormatter)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty())
readConfiguration();
ui->setupUi(this);
translate();
}
AWListFormatter::~AWListFormatter()
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
delete ui;
}
QString AWListFormatter::convert(const QVariant &_value) const
{
qCDebug(LOG_LIB) << "Convert value" << _value;
QStringList output = _value.toStringList();
if (isSorted())
output.sort();
return output.filter(m_regex).join(separator());
}
AWListFormatter *AWListFormatter::copy(const QString &_fileName,
const int _number)
{
qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
AWListFormatter *item
= new AWListFormatter(static_cast<QWidget *>(parent()), _fileName);
AWAbstractFormatter::copyDefaults(item);
item->setFilter(filter());
item->setSeparator(separator());
item->setSorted(isSorted());
item->setNumber(_number);
return item;
}
QString AWListFormatter::filter() const
{
return m_filter;
}
bool AWListFormatter::isSorted() const
{
return m_sorted;
}
QString AWListFormatter::separator() const
{
return m_separator;
}
void AWListFormatter::setFilter(const QString &_filter)
{
qCDebug(LOG_LIB) << "Filter" << _filter;
m_filter = _filter;
m_regex = QRegExp(m_filter);
}
void AWListFormatter::setSeparator(const QString &_separator)
{
qCDebug(LOG_LIB) << "Separtor" << _separator;
m_separator = _separator;
}
void AWListFormatter::setSorted(const bool _sorted)
{
qCDebug(LOG_LIB) << "Sorting" << _sorted;
m_sorted = _sorted;
}
void AWListFormatter::readConfiguration()
{
AWAbstractFormatter::readConfiguration();
QSettings settings(fileName(), QSettings::IniFormat);
settings.beginGroup("Desktop Entry");
setFilter(settings.value("X-AW-Filter", filter()).toString());
setSeparator(settings.value("X-AW-Separator", separator()).toString());
setSorted(settings.value("X-AW-Sort", isSorted()).toBool());
settings.endGroup();
bumpApi(AW_FORMATTER_API);
}
int AWListFormatter::showConfiguration(const QVariant &_args)
{
Q_UNUSED(_args)
ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment());
ui->label_typeValue->setText("List");
ui->lineEdit_filter->setText(filter());
ui->lineEdit_separator->setText(separator());
ui->checkBox_sorted->setCheckState(isSorted() ? Qt::Checked
: Qt::Unchecked);
int ret = exec();
if (ret != 1)
return ret;
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text());
setFilter(ui->lineEdit_filter->text());
setSeparator(ui->lineEdit_separator->text());
setSorted(ui->checkBox_sorted->checkState() == Qt::Checked);
writeConfiguration();
return ret;
}
void AWListFormatter::writeConfiguration() const
{
AWAbstractFormatter::writeConfiguration();
QSettings settings(writtableConfig(), QSettings::IniFormat);
qCInfo(LOG_LIB) << "Configuration file" << settings.fileName();
settings.beginGroup("Desktop Entry");
settings.setValue("X-AW-Filter", filter());
settings.setValue("X-AW-Separator", separator());
settings.setValue("X-AW-Sort", isSorted());
settings.endGroup();
settings.sync();
}
void AWListFormatter::translate()
{
ui->label_name->setText(i18n("Name"));
ui->label_comment->setText(i18n("Comment"));
ui->label_type->setText(i18n("Type"));
ui->label_filter->setText(i18n("Filter"));
ui->label_separator->setText(i18n("Separator"));
ui->checkBox_sorted->setText(i18n("Sort"));
}

View File

@ -0,0 +1,66 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#ifndef AWLISTFORMATTER_H
#define AWLISTFORMATTER_H
#include "awabstractformatter.h"
namespace Ui
{
class AWListFormatter;
}
class AWListFormatter : public AWAbstractFormatter
{
Q_OBJECT
Q_PROPERTY(QString filter READ filter WRITE setFilter)
Q_PROPERTY(QString separator READ separator WRITE setSeparator)
Q_PROPERTY(bool sorted READ isSorted WRITE setSorted)
public:
explicit AWListFormatter(QWidget *_parent = nullptr,
const QString &_filePath = "");
virtual ~AWListFormatter();
QString convert(const QVariant &_value) const;
AWListFormatter *copy(const QString &_fileName, const int _number);
// properties
QString filter() const;
bool isSorted() const;
QString separator() const;
void setFilter(const QString &_filter);
void setSeparator(const QString &_separator);
void setSorted(const bool _sorted);
public slots:
void readConfiguration();
int showConfiguration(const QVariant &_args);
void writeConfiguration() const;
private:
Ui::AWListFormatter *ui = nullptr;
void translate();
// properties
QString m_filter = "";
QString m_separator = "";
bool m_sorted = false;
QRegExp m_regex;
};
#endif /* AWLISTFORMATTER_H */

View File

@ -0,0 +1,220 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>AWListFormatter</class>
<widget class="QDialog" name="AWListFormatter">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>420</width>
<height>225</height>
</rect>
</property>
<property name="windowTitle">
<string>Configuration</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="layout_name">
<item>
<widget class="QLabel" name="label_name">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Name</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_name"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_comment">
<item>
<widget class="QLabel" name="label_comment">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Comment</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_comment"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_type">
<item>
<widget class="QLabel" name="label_type">
<property name="text">
<string>Type</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_typeValue">
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_filter">
<item>
<widget class="QLabel" name="label_filter">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Filter</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_filter"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_separator">
<item>
<widget class="QLabel" name="label_separator">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Separator</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_separator"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_sorted">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="checkBox_sorted">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Sort</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>AWListFormatter</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>AWListFormatter</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -0,0 +1,95 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awnoformatter.h"
#include "ui_awnoformatter.h"
#include <KI18n/KLocalizedString>
#include "awdebug.h"
AWNoFormatter::AWNoFormatter(QWidget *_parent, const QString &_filePath)
: AWAbstractFormatter(_parent, _filePath)
, ui(new Ui::AWNoFormatter)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty())
readConfiguration();
ui->setupUi(this);
translate();
}
AWNoFormatter::~AWNoFormatter()
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
delete ui;
}
QString AWNoFormatter::convert(const QVariant &_value) const
{
qCDebug(LOG_LIB) << "Convert value" << _value;
return _value.toString();
}
AWNoFormatter *AWNoFormatter::copy(const QString &_fileName, const int _number)
{
qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
AWNoFormatter *item
= new AWNoFormatter(static_cast<QWidget *>(parent()), _fileName);
AWAbstractFormatter::copyDefaults(item);
item->setNumber(_number);
return item;
}
int AWNoFormatter::showConfiguration(const QVariant &_args)
{
Q_UNUSED(_args)
ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment());
ui->label_typeValue->setText("NoFormat");
int ret = exec();
if (ret != 1)
return ret;
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text());
writeConfiguration();
return ret;
}
void AWNoFormatter::translate()
{
ui->label_name->setText(i18n("Name"));
ui->label_comment->setText(i18n("Comment"));
ui->label_type->setText(i18n("Type"));
}

View File

@ -21,19 +21,28 @@
#include "awabstractformatter.h" #include "awabstractformatter.h"
namespace Ui
{
class AWNoFormatter;
}
class AWNoFormatter : public AWAbstractFormatter class AWNoFormatter : public AWAbstractFormatter
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit AWNoFormatter(QObject *parent, const QString filename, explicit AWNoFormatter(QWidget *_parent = nullptr,
const QString section); const QString &_filePath = "");
explicit AWNoFormatter(QObject *parent);
virtual ~AWNoFormatter(); virtual ~AWNoFormatter();
QString convert(const QVariant &value) const; QString convert(const QVariant &_value) const;
AWNoFormatter *copy(const QString &_fileName, const int _number);
public slots:
int showConfiguration(const QVariant &_args);
private: private:
void init(const QString filename, const QString section); Ui::AWNoFormatter *ui = nullptr;
void translate();
// properties // properties
}; };

View File

@ -0,0 +1,144 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>AWNoFormatter</class>
<widget class="QDialog" name="AWNoFormatter">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>420</width>
<height>128</height>
</rect>
</property>
<property name="windowTitle">
<string>Configuration</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="layout_name">
<item>
<widget class="QLabel" name="label_name">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Name</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_name"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_comment">
<item>
<widget class="QLabel" name="label_comment">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Comment</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_comment"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_type">
<item>
<widget class="QLabel" name="label_type">
<property name="text">
<string>Type</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_typeValue">
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>AWNoFormatter</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>AWNoFormatter</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -0,0 +1,226 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awscriptformatter.h"
#include "ui_awscriptformatter.h"
#include <KI18n/KLocalizedString>
#include <QDir>
#include <QJSEngine>
#include <QSettings>
#include "awdebug.h"
AWScriptFormatter::AWScriptFormatter(QWidget *_parent, const QString &_filePath)
: AWAbstractFormatter(_parent, _filePath)
, ui(new Ui::AWScriptFormatter)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty())
readConfiguration();
ui->setupUi(this);
translate();
}
AWScriptFormatter::~AWScriptFormatter()
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
delete ui;
}
QString AWScriptFormatter::convert(const QVariant &_value) const
{
qCDebug(LOG_LIB) << "Convert value" << _value;
// init engine
QJSEngine engine;
QJSValue fn = engine.evaluate(m_program);
QJSValueList args = QJSValueList() << _value.toString();
QJSValue result = fn.call(args);
if (result.isError()) {
qCWarning(LOG_LIB) << "Uncaught exception at line"
<< result.property("lineNumber").toInt() << ":"
<< result.toString();
return "";
} else {
return result.toString();
}
}
AWScriptFormatter *AWScriptFormatter::copy(const QString &_fileName,
const int _number)
{
qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
AWScriptFormatter *item
= new AWScriptFormatter(static_cast<QWidget *>(parent()), _fileName);
AWAbstractFormatter::copyDefaults(item);
item->setAppendCode(appendCode());
item->setCode(code());
item->setHasReturn(hasReturn());
item->setNumber(_number);
return item;
}
bool AWScriptFormatter::appendCode() const
{
return m_appendCode;
}
QString AWScriptFormatter::code() const
{
return m_code;
}
bool AWScriptFormatter::hasReturn() const
{
return m_hasReturn;
}
QString AWScriptFormatter::program() const
{
return m_program;
}
void AWScriptFormatter::setAppendCode(const bool _appendCode)
{
qCDebug(LOG_LIB) << "Set append code" << _appendCode;
m_appendCode = _appendCode;
initProgram();
}
void AWScriptFormatter::setCode(const QString &_code)
{
qCDebug(LOG_LIB) << "Set code" << _code;
m_code = _code;
initProgram();
}
void AWScriptFormatter::setHasReturn(const bool _hasReturn)
{
qCDebug(LOG_LIB) << "Set has return" << _hasReturn;
m_hasReturn = _hasReturn;
initProgram();
}
void AWScriptFormatter::readConfiguration()
{
AWAbstractFormatter::readConfiguration();
QSettings settings(fileName(), QSettings::IniFormat);
settings.beginGroup("Desktop Entry");
setAppendCode(settings.value("X-AW-AppendCode", appendCode()).toBool());
setCode(settings.value("X-AW-Code", code()).toString());
setHasReturn(settings.value("X-AW-HasReturn", hasReturn()).toBool());
settings.endGroup();
bumpApi(AW_FORMATTER_API);
}
int AWScriptFormatter::showConfiguration(const QVariant &_args)
{
Q_UNUSED(_args)
ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment());
ui->label_typeValue->setText("Script");
ui->checkBox_appendCode->setCheckState(appendCode() ? Qt::Checked
: Qt::Unchecked);
ui->checkBox_hasReturn->setCheckState(hasReturn() ? Qt::Checked
: Qt::Unchecked);
ui->textEdit_code->setPlainText(code());
int ret = exec();
if (ret != 1)
return ret;
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text());
setAppendCode(ui->checkBox_appendCode->checkState() == Qt::Checked);
setHasReturn(ui->checkBox_hasReturn->checkState() == Qt::Checked);
setCode(ui->textEdit_code->toPlainText());
initProgram();
writeConfiguration();
return ret;
}
void AWScriptFormatter::writeConfiguration() const
{
AWAbstractFormatter::writeConfiguration();
QSettings settings(writtableConfig(), QSettings::IniFormat);
qCInfo(LOG_LIB) << "Configuration file" << settings.fileName();
settings.beginGroup("Desktop Entry");
settings.setValue("X-AW-AppendCode", appendCode());
settings.setValue("X-AW-Code", code());
settings.setValue("X-AW-HasReturn", hasReturn());
settings.endGroup();
settings.sync();
}
void AWScriptFormatter::initProgram()
{
// init JS code
if (appendCode())
m_program = QString("(function(value) { %1%2 })")
.arg(code())
.arg(hasReturn() ? "" : "; return output;");
else
m_program = code();
qCInfo(LOG_LIB) << "Create JS engine with code" << m_program;
}
void AWScriptFormatter::translate()
{
ui->label_name->setText(i18n("Name"));
ui->label_comment->setText(i18n("Comment"));
ui->label_type->setText(i18n("Type"));
ui->checkBox_appendCode->setText(i18n("Append code"));
ui->checkBox_hasReturn->setText(i18n("Has return"));
ui->label_code->setText(i18n("Code"));
}

View File

@ -21,6 +21,11 @@
#include "awabstractformatter.h" #include "awabstractformatter.h"
namespace Ui
{
class AWScriptFormatter;
}
class AWScriptFormatter : public AWAbstractFormatter class AWScriptFormatter : public AWAbstractFormatter
{ {
Q_OBJECT Q_OBJECT
@ -30,28 +35,33 @@ class AWScriptFormatter : public AWAbstractFormatter
Q_PROPERTY(QString program READ program) Q_PROPERTY(QString program READ program)
public: public:
explicit AWScriptFormatter(QObject *parent, const QString filename, explicit AWScriptFormatter(QWidget *_parent = nullptr,
const QString section); const QString &_filePath = "");
explicit AWScriptFormatter(QObject *parent, const bool appendCode,
const QString code, const bool hasReturn);
virtual ~AWScriptFormatter(); virtual ~AWScriptFormatter();
QString convert(const QVariant &value) const; QString convert(const QVariant &_value) const;
AWScriptFormatter *copy(const QString &_fileName, const int _number);
// properties // properties
bool appendCode() const; bool appendCode() const;
QString code() const; QString code() const;
bool hasReturn() const; bool hasReturn() const;
QString program() const; QString program() const;
void setAppendCode(const bool _appendCode); void setAppendCode(const bool _appendCode);
void setCode(const QString _code); void setCode(const QString &_code);
void setHasReturn(const bool _hasReturn); void setHasReturn(const bool _hasReturn);
public slots:
void readConfiguration();
int showConfiguration(const QVariant &_args);
void writeConfiguration() const;
private: private:
void init(const QString filename, const QString section); Ui::AWScriptFormatter *ui = nullptr;
void initProgram(); void initProgram();
void translate();
// properties // properties
bool m_appendCode; bool m_appendCode = true;
QString m_code; QString m_code = "";
bool m_hasReturn; bool m_hasReturn = false;
QString m_program; QString m_program;
}; };

View File

@ -0,0 +1,212 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>AWScriptFormatter</class>
<widget class="QDialog" name="AWScriptFormatter">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>420</width>
<height>315</height>
</rect>
</property>
<property name="windowTitle">
<string>Configuration</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="layout_name">
<item>
<widget class="QLabel" name="label_name">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Name</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_name"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_comment">
<item>
<widget class="QLabel" name="label_comment">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Comment</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_comment"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_type">
<item>
<widget class="QLabel" name="label_type">
<property name="text">
<string>Type</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_typeValue">
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_appendCode">
<item>
<spacer name="spacer_appendCode">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="checkBox_appendCode">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Append code</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_hasReturn">
<item>
<spacer name="spacer_hasReturn">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="checkBox_hasReturn">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Has return</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<layout class="QVBoxLayout" name="layout_code">
<item>
<widget class="QLabel" name="label_code">
<property name="text">
<string>Code</string>
</property>
</widget>
</item>
<item>
<widget class="QTextEdit" name="textEdit_code"/>
</item>
</layout>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>AWScriptFormatter</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>AWScriptFormatter</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -0,0 +1,191 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awstringformatter.h"
#include "ui_awstringformatter.h"
#include <KI18n/KLocalizedString>
#include <QDir>
#include <QSettings>
#include "awdebug.h"
AWStringFormatter::AWStringFormatter(QWidget *_parent, const QString &_filePath)
: AWAbstractFormatter(_parent, _filePath)
, ui(new Ui::AWStringFormatter)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty())
readConfiguration();
ui->setupUi(this);
translate();
}
AWStringFormatter::~AWStringFormatter()
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
delete ui;
}
QString AWStringFormatter::convert(const QVariant &_value) const
{
qCDebug(LOG_LIB) << "Convert value" << _value;
QString output = QString("%1").arg(_value.toString(), count(), fillChar());
if (forceWidth())
output = output.left(count());
return output;
}
AWStringFormatter *AWStringFormatter::copy(const QString &_fileName,
const int _number)
{
qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
AWStringFormatter *item
= new AWStringFormatter(static_cast<QWidget *>(parent()), _fileName);
AWAbstractFormatter::copyDefaults(item);
item->setCount(count());
item->setFillChar(fillChar());
item->setForceWidth(forceWidth());
item->setNumber(_number);
return item;
}
int AWStringFormatter::count() const
{
return m_count;
}
QChar AWStringFormatter::fillChar() const
{
return m_fillChar;
}
bool AWStringFormatter::forceWidth() const
{
return m_forceWidth;
}
void AWStringFormatter::setCount(const int _count)
{
qCDebug(LOG_LIB) << "Set width" << _count;
m_count = _count;
}
void AWStringFormatter::setFillChar(const QChar &_fillChar)
{
qCDebug(LOG_LIB) << "Set char" << _fillChar;
m_fillChar = _fillChar;
}
void AWStringFormatter::setForceWidth(const bool _forceWidth)
{
qCDebug(LOG_LIB) << "Set force strip" << _forceWidth;
m_forceWidth = _forceWidth;
}
void AWStringFormatter::readConfiguration()
{
AWAbstractFormatter::readConfiguration();
QSettings settings(fileName(), QSettings::IniFormat);
settings.beginGroup("Desktop Entry");
setCount(settings.value("X-AW-Width", count()).toInt());
setFillChar(settings.value("X-AW-FillChar", fillChar()).toString().at(0));
setForceWidth(settings.value("X-AW-ForceWidth", forceWidth()).toBool());
settings.endGroup();
bumpApi(AW_FORMATTER_API);
}
int AWStringFormatter::showConfiguration(const QVariant &_args)
{
Q_UNUSED(_args)
ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment());
ui->label_typeValue->setText("String");
ui->spinBox_width->setValue(count());
ui->lineEdit_fill->setText(QString(fillChar()));
ui->checkBox_forceWidth->setCheckState(forceWidth() ? Qt::Checked
: Qt::Unchecked);
int ret = exec();
if (ret != 1)
return ret;
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text());
setCount(ui->spinBox_width->value());
setFillChar(ui->lineEdit_fill->text().at(0));
setForceWidth(ui->checkBox_forceWidth->checkState() == Qt::Checked);
writeConfiguration();
return ret;
}
void AWStringFormatter::writeConfiguration() const
{
AWAbstractFormatter::writeConfiguration();
QSettings settings(writtableConfig(), QSettings::IniFormat);
qCInfo(LOG_LIB) << "Configuration file" << settings.fileName();
settings.beginGroup("Desktop Entry");
settings.setValue("X-AW-Width", count());
settings.setValue("X-AW-FillChar", fillChar());
settings.setValue("X-AW-ForceWidth", forceWidth());
settings.endGroup();
settings.sync();
}
void AWStringFormatter::translate()
{
ui->label_name->setText(i18n("Name"));
ui->label_comment->setText(i18n("Comment"));
ui->label_type->setText(i18n("Type"));
ui->label_width->setText(i18n("Width"));
ui->label_fill->setText(i18n("Fill char"));
ui->checkBox_forceWidth->setText(i18n("Force width"));
}

View File

@ -0,0 +1,65 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#ifndef AWSTRINGFORMATTER_H
#define AWSTRINGFORMATTER_H
#include "awabstractformatter.h"
namespace Ui
{
class AWStringFormatter;
}
class AWStringFormatter : public AWAbstractFormatter
{
Q_OBJECT
Q_PROPERTY(int count READ count WRITE setCount)
Q_PROPERTY(QChar fillChar READ fillChar WRITE setFillChar)
Q_PROPERTY(bool forceWidth READ forceWidth WRITE setForceWidth)
public:
explicit AWStringFormatter(QWidget *_parent = nullptr,
const QString &_filePath = "");
virtual ~AWStringFormatter();
QString convert(const QVariant &_value) const;
AWStringFormatter *copy(const QString &_fileName, const int _number);
// properties
int count() const;
QChar fillChar() const;
bool forceWidth() const;
void setCount(const int _count);
void setFillChar(const QChar &_fillChar);
void setForceWidth(const bool _forceWidth);
public slots:
void readConfiguration();
int showConfiguration(const QVariant &_args);
void writeConfiguration() const;
private:
Ui::AWStringFormatter *ui = nullptr;
void translate();
// properties
int m_count = 0;
QChar m_fillChar = QChar();
bool m_forceWidth = false;
};
#endif /* AWSTRINGFORMATTER_H */

View File

@ -0,0 +1,225 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>AWStringFormatter</class>
<widget class="QDialog" name="AWStringFormatter">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>420</width>
<height>225</height>
</rect>
</property>
<property name="windowTitle">
<string>Configuration</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="layout_name">
<item>
<widget class="QLabel" name="label_name">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Name</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_name"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_comment">
<item>
<widget class="QLabel" name="label_comment">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Comment</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_comment"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_type">
<item>
<widget class="QLabel" name="label_type">
<property name="text">
<string>Type</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_typeValue">
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_width">
<item>
<widget class="QLabel" name="label_width">
<property name="text">
<string>Width</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="spinBox_width">
<property name="minimum">
<number>-10000</number>
</property>
<property name="maximum">
<number>10000</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_fill">
<item>
<widget class="QLabel" name="label_fill">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Fill char</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_fill">
<property name="maxLength">
<number>1</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_forceWIdth">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="checkBox_forceWidth">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Force width</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>AWStringFormatter</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>AWStringFormatter</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -12,5 +12,5 @@ X-AW-Type=Horizontal
X-AW-Direction=LeftToRight X-AW-Direction=LeftToRight
X-AW-Height=25 X-AW-Height=25
X-AW-Width=100 X-AW-Width=100
X-AW-ApiVersion=5 X-AW-ApiVersion=6
X-AW-Number=3 X-AW-Number=3

View File

@ -12,5 +12,5 @@ X-AW-Type=Horizontal
X-AW-Direction=LeftToRight X-AW-Direction=LeftToRight
X-AW-Height=25 X-AW-Height=25
X-AW-Width=100 X-AW-Width=100
X-AW-ApiVersion=5 X-AW-ApiVersion=6
X-AW-Number=0 X-AW-Number=0

View File

@ -12,5 +12,5 @@ X-AW-Type=Horizontal
X-AW-Direction=LeftToRight X-AW-Direction=LeftToRight
X-AW-Height=25 X-AW-Height=25
X-AW-Width=100 X-AW-Width=100
X-AW-ApiVersion=5 X-AW-ApiVersion=6
X-AW-Number=1 X-AW-Number=1

View File

@ -12,5 +12,5 @@ X-AW-Type=Horizontal
X-AW-Direction=LeftToRight X-AW-Direction=LeftToRight
X-AW-Height=25 X-AW-Height=25
X-AW-Width=100 X-AW-Width=100
X-AW-ApiVersion=5 X-AW-ApiVersion=6
X-AW-Number=2 X-AW-Number=2

View File

@ -31,16 +31,15 @@
template <class T> class ExtItemAggregator : public AbstractExtItemAggregator template <class T> class ExtItemAggregator : public AbstractExtItemAggregator
{ {
public: public:
explicit ExtItemAggregator(QWidget *parent, const QString type) explicit ExtItemAggregator(QWidget *_parent, const QString &_type)
: AbstractExtItemAggregator(parent) : AbstractExtItemAggregator(_parent, _type)
, m_type(type)
{ {
qSetMessagePattern(LOG_FORMAT); qSetMessagePattern(AWDebug::LOG_FORMAT);
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
for (auto metadata : getBuildData()) for (auto &metadata : AWDebug::getBuildData())
qCDebug(LOG_LIB) << metadata; qCDebug(LOG_LIB) << metadata;
qCDebug(LOG_LIB) << "Type" << type; qCDebug(LOG_LIB) << "Type" << _type;
initItems(); initItems();
}; };
@ -57,20 +56,29 @@ public:
void editItems() void editItems()
{ {
repaint(); repaintList();
int ret = dialog->exec(); int ret = exec();
qCInfo(LOG_LIB) << "Dialog returns" << ret; qCInfo(LOG_LIB) << "Dialog returns" << ret;
}; };
T *itemByTag(const QString _tag, const QString _type) const void initSockets()
{
// HACK as soon as per one widget instance we have two objects each of
// them will try to control socket, whereas actually only one of them
// should be owner of the socket
for (auto &item : m_items)
item->initSocket();
}
T *itemByTag(const QString &_tag, const QString &_type) const
{ {
qCDebug(LOG_LIB) << "Tag" << _tag << "with used type" << _type; qCDebug(LOG_LIB) << "Tag" << _tag << "with used type" << _type;
T *found = nullptr; T *found = nullptr;
for (auto item : m_items) { for (auto &item : m_items) {
if (item->tag(_type) != _tag) if (item->tag(_type) != _tag)
continue; continue;
found = item; found = static_cast<T *>(item);
break; break;
} }
if (found == nullptr) if (found == nullptr)
@ -84,10 +92,10 @@ public:
qCDebug(LOG_LIB) << "Number" << _number; qCDebug(LOG_LIB) << "Number" << _number;
T *found = nullptr; T *found = nullptr;
for (auto item : m_items) { for (auto &item : m_items) {
if (item->number() != _number) if (item->number() != _number)
continue; continue;
found = item; found = static_cast<T *>(item);
break; break;
} }
if (found == nullptr) if (found == nullptr)
@ -96,79 +104,48 @@ public:
return found; return found;
}; };
T *itemFromWidget() const QList<AbstractExtItem *> items() const { return m_items; };
{
QListWidgetItem *widgetItem = widgetDialog->currentItem();
if (widgetItem == nullptr)
return nullptr;
T *found = nullptr;
for (auto item : m_items) {
if (item->fileName() != widgetItem->text())
continue;
found = item;
break;
}
if (found == nullptr)
qCWarning(LOG_LIB) << "Could not find item by name"
<< widgetItem->text();
return found;
};
QList<T *> items() const { return m_items; };
int uniqNumber() const
{
QList<int> tagList;
for (auto item : m_items)
tagList.append(item->number());
int number = 0;
while (tagList.contains(number))
number++;
return number;
};
private: private:
QList<T *> m_items; QList<AbstractExtItem *> m_items;
QList<T *> m_activeItems; QList<T *> m_activeItems;
QString m_type;
// init method void doCreateItem() { return createItem<T>(); }
QList<T *> getItems()
QList<AbstractExtItem *> getItems()
{ {
// create directory at $HOME // create directory at $HOME
QString localDir = QString("%1/awesomewidgets/%2") QString localDir = QString("%1/awesomewidgets/%2")
.arg(QStandardPaths::writableLocation( .arg(QStandardPaths::writableLocation(
QStandardPaths::GenericDataLocation)) QStandardPaths::GenericDataLocation))
.arg(m_type); .arg(type());
QDir localDirectory; QDir localDirectory;
if (localDirectory.mkpath(localDir)) if (localDirectory.mkpath(localDir))
qCInfo(LOG_LIB) << "Created directory" << localDir; qCInfo(LOG_LIB) << "Created directory" << localDir;
QStringList dirs = QStandardPaths::locateAll( QStringList dirs = QStandardPaths::locateAll(
QStandardPaths::GenericDataLocation, QStandardPaths::GenericDataLocation,
QString("awesomewidgets/%1").arg(m_type), QString("awesomewidgets/%1").arg(type()),
QStandardPaths::LocateDirectory); QStandardPaths::LocateDirectory);
QStringList names; QStringList names;
QList<T *> items; QList<AbstractExtItem *> items;
for (auto dir : dirs) { for (auto &dir : dirs) {
QStringList files = QDir(dir).entryList(QDir::Files, QDir::Name); QStringList files = QDir(dir).entryList(QDir::Files, QDir::Name);
for (auto file : files) { for (auto &file : files) {
if ((!file.endsWith(QString(".desktop"))) if ((!file.endsWith(".desktop")) || (names.contains(file)))
|| (names.contains(file)))
continue; continue;
qCInfo(LOG_LIB) << "Found file" << file << "in" << dir; qCInfo(LOG_LIB) << "Found file" << file << "in" << dir;
names.append(file); names.append(file);
items.append(new T(this, file, dirs)); QString filePath = QString("%1/%2").arg(dir).arg(file);
items.append(new T(this, filePath));
} }
} }
// sort items // sort items
std::sort(items.begin(), items.end(), [](const T *lhs, const T *rhs) { std::sort(items.begin(), items.end(),
return lhs->number() < rhs->number(); [](const AbstractExtItem *lhs, const AbstractExtItem *rhs) {
}); return lhs->number() < rhs->number();
});
return items; return items;
}; };
@ -178,92 +155,10 @@ private:
m_activeItems.clear(); m_activeItems.clear();
m_items = getItems(); m_items = getItems();
for (auto item : m_items) { for (auto &item : m_items) {
if (!item->isActive()) if (!item->isActive())
continue; continue;
m_activeItems.append(item); m_activeItems.append(static_cast<T *>(item));
}
};
void repaint()
{
widgetDialog->clear();
for (auto _item : m_items) {
QListWidgetItem *item
= new QListWidgetItem(_item->fileName(), widgetDialog);
QStringList tooltip;
tooltip.append(i18n("Name: %1", _item->name()));
tooltip.append(i18n("Comment: %1", _item->comment()));
tooltip.append(i18n("Identity: %1", _item->uniq()));
item->setToolTip(tooltip.join(QChar('\n')));
widgetDialog->addItem(item);
}
};
// methods
void copyItem()
{
T *source = itemFromWidget();
QString fileName = getName();
int number = uniqNumber();
if ((source == nullptr) || (fileName.isEmpty())) {
qCWarning(LOG_LIB) << "Nothing to copy";
return;
}
T *newItem = static_cast<T *>(source->copy(fileName, number));
if (newItem->showConfiguration(configArgs()) == 1) {
initItems();
repaint();
}
};
void createItem()
{
QString fileName = getName();
int number = uniqNumber();
QStringList dirs = QStandardPaths::locateAll(
QStandardPaths::GenericDataLocation,
QString("awesomewidgets/%1").arg(m_type),
QStandardPaths::LocateDirectory);
if (fileName.isEmpty()) {
qCWarning(LOG_LIB) << "Nothing to create";
return;
};
T *newItem = new T(this, fileName, dirs);
newItem->setNumber(number);
if (newItem->showConfiguration(configArgs()) == 1) {
initItems();
repaint();
}
};
void deleteItem()
{
T *source = itemFromWidget();
if (source == nullptr) {
qCWarning(LOG_LIB) << "Nothing to delete";
return;
};
if (source->tryDelete()) {
initItems();
repaint();
}
};
void editItem()
{
T *source = itemFromWidget();
if (source == nullptr) {
qCWarning(LOG_LIB) << "Nothing to edit";
return;
};
if (source->showConfiguration(configArgs()) == 1) {
initItems();
repaint();
} }
}; };
}; };

View File

@ -0,0 +1,216 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "extnetworkrequest.h"
#include "ui_extnetworkrequest.h"
#include <KI18n/KLocalizedString>
#include <QDir>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QSettings>
#include <QTextCodec>
#include <qreplytimeout/qreplytimeout.h>
#include "awdebug.h"
ExtNetworkRequest::ExtNetworkRequest(QWidget *_parent, const QString &_filePath)
: AbstractExtItem(_parent, _filePath)
, ui(new Ui::ExtNetworkRequest)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty())
readConfiguration();
ui->setupUi(this);
translate();
m_values[tag("response")] = "";
// HACK declare as child of nullptr to avoid crash with plasmawindowed
// in the destructor
m_manager = new QNetworkAccessManager(nullptr);
connect(m_manager, SIGNAL(finished(QNetworkReply *)), this,
SLOT(networkReplyReceived(QNetworkReply *)));
connect(this, SIGNAL(requestDataUpdate()), this, SLOT(sendRequest()));
}
ExtNetworkRequest::~ExtNetworkRequest()
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
disconnect(m_manager, SIGNAL(finished(QNetworkReply *)), this,
SLOT(networkReplyReceived(QNetworkReply *)));
disconnect(this, SIGNAL(requestDataUpdate()), this, SLOT(sendRequest()));
m_manager->deleteLater();
delete ui;
}
ExtNetworkRequest *ExtNetworkRequest::copy(const QString &_fileName,
const int _number)
{
qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
ExtNetworkRequest *item
= new ExtNetworkRequest(static_cast<QWidget *>(parent()), _fileName);
copyDefaults(item);
item->setNumber(_number);
item->setStringUrl(stringUrl());
return item;
}
QString ExtNetworkRequest::stringUrl() const
{
return m_stringUrl;
}
QString ExtNetworkRequest::uniq() const
{
return m_url.toString();
}
void ExtNetworkRequest::setStringUrl(const QString &_url)
{
qCDebug(LOG_LIB) << "Url" << _url;
m_stringUrl = _url;
initUrl();
}
void ExtNetworkRequest::readConfiguration()
{
AbstractExtItem::readConfiguration();
QSettings settings(fileName(), QSettings::IniFormat);
settings.beginGroup("Desktop Entry");
setStringUrl(settings.value("X-AW-Url", stringUrl()).toString());
settings.endGroup();
bumpApi(AW_EXTNETREQUEST_API);
}
QVariantHash ExtNetworkRequest::run()
{
if (m_isRunning)
return m_values;
startTimer();
return m_values;
}
int ExtNetworkRequest::showConfiguration(const QVariant &_args)
{
Q_UNUSED(_args)
ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment());
ui->label_numberValue->setText(QString("%1").arg(number()));
ui->lineEdit_url->setText(stringUrl());
ui->checkBox_active->setCheckState(isActive() ? Qt::Checked
: Qt::Unchecked);
ui->lineEdit_schedule->setText(cron());
ui->lineEdit_socket->setText(socket());
ui->spinBox_interval->setValue(interval());
int ret = exec();
if (ret != 1)
return ret;
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setNumber(ui->label_numberValue->text().toInt());
setApiVersion(AW_EXTNETREQUEST_API);
setStringUrl(ui->lineEdit_url->text());
setActive(ui->checkBox_active->checkState() == Qt::Checked);
setCron(ui->lineEdit_schedule->text());
setSocket(ui->lineEdit_socket->text());
setInterval(ui->spinBox_interval->value());
writeConfiguration();
return ret;
}
void ExtNetworkRequest::writeConfiguration() const
{
AbstractExtItem::writeConfiguration();
QSettings settings(writtableConfig(), QSettings::IniFormat);
qCInfo(LOG_LIB) << "Configuration file" << settings.fileName();
settings.beginGroup("Desktop Entry");
settings.setValue("X-AW-Url", stringUrl());
settings.endGroup();
settings.sync();
}
void ExtNetworkRequest::networkReplyReceived(QNetworkReply *_reply)
{
if (_reply->error() != QNetworkReply::NoError) {
qCWarning(LOG_AW) << "An error occurs" << _reply->error()
<< "with message" << _reply->errorString();
return;
}
m_isRunning = false;
m_values[tag("response")]
= QTextCodec::codecForMib(106)->toUnicode(_reply->readAll()).trimmed();
emit(dataReceived(m_values));
}
void ExtNetworkRequest::sendRequest()
{
m_isRunning = true;
QNetworkReply *reply = m_manager->get(QNetworkRequest(m_url));
new QReplyTimeout(reply, REQUEST_TIMEOUT);
}
void ExtNetworkRequest::initUrl()
{
m_url = QUrl(m_stringUrl);
}
void ExtNetworkRequest::translate()
{
ui->label_name->setText(i18n("Name"));
ui->label_comment->setText(i18n("Comment"));
ui->label_number->setText(i18n("Tag"));
ui->label_url->setText(i18n("URL"));
ui->checkBox_active->setText(i18n("Active"));
ui->label_schedule->setText(i18n("Schedule"));
ui->label_socket->setText(i18n("Socket"));
ui->label_interval->setText(i18n("Interval"));
}

View File

@ -0,0 +1,71 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#ifndef EXTNETWORKREQUEST_H
#define EXTNETWORKREQUEST_H
#include <QNetworkReply>
#include "abstractextitem.h"
namespace Ui
{
class ExtNetworkRequest;
}
class ExtNetworkRequest : public AbstractExtItem
{
Q_OBJECT
Q_PROPERTY(QString stringUrl READ stringUrl WRITE setStringUrl)
public:
explicit ExtNetworkRequest(QWidget *_parent = nullptr,
const QString &_filePath = "");
virtual ~ExtNetworkRequest();
ExtNetworkRequest *copy(const QString &_fileName, const int _number);
// get methods
QString stringUrl() const;
QString uniq() const;
// set methods
void setStringUrl(const QString &_url);
public slots:
void readConfiguration();
QVariantHash run();
int showConfiguration(const QVariant &_args);
void writeConfiguration() const;
private slots:
void networkReplyReceived(QNetworkReply *_reply);
void sendRequest();
private:
QNetworkAccessManager *m_manager = nullptr;
QUrl m_url;
bool m_isRunning = false;
Ui::ExtNetworkRequest *ui = nullptr;
void initUrl();
void translate();
// properties
QString m_stringUrl = "https://httpbin.org/get";
// values
QVariantHash m_values;
};
#endif /* EXTNETWORKREQUEST_H */

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