Compare commits

..

44 Commits

Author SHA1 Message Date
dd262c3d84 small update of support files 2015-10-21 07:02:09 +03:00
df87850f65 Release 3.0.0
* turn back concurrent text update
* update screenshots
2015-10-21 06:53:34 +03:00
c2db8740b8 translation update 2015-10-20 01:23:12 +03:00
75ab84e993 * logging changes
* add configuration export status message
* prepare to release
2015-10-20 00:34:29 +03:00
c161004640 drop clion settings at all 2015-10-19 01:28:51 +03:00
c1a8c17ecb * drop workspace.xml from source tree (it is changed too offen)
* fix export and import configurations for json files
2015-10-19 00:57:27 +03:00
17a8a1734b * create cppcheck and clangformat targets
* apply code style (#67)
* send values by reference
* fix warnings on plugin destruction by disconnecting dataengines first
* fix invalid hddtemp group definition
2015-10-18 00:05:42 +03:00
8645260f99 * end work on #68
* create special class for configuration
* update clion settings
2015-10-17 00:06:32 +03:00
0e1b101703 * initial implementation of configuration export and import feature (#68)
* drop mediators in data transition
2015-10-16 07:22:03 +03:00
2db2de4c27 * try to drop text update to main thread instead of concurrent run
* update contributing.md
2015-10-15 16:54:13 +03:00
af0dd25b86 * add clang-format configuration and script
* add cppcheck script proto (TODO include directories according ot cmake
    output)
TODO do it while build time and/or commit
2015-10-14 01:01:25 +03:00
3be733a775 drop code oriented on the stream lock in parallel updates
This fact caused by the qt signal-slot implementation. Even if slots
code is going into parallel they will be called in the main app thread.
And also it is used inside KF5 dataengine implementation, so I'm affraid
that it could not be optimized w\o backend rewriting
2015-10-13 01:49:12 +03:00
d3ab0a7228 * add mutex to avoid crash on qhash data update (#62)
* update gitignore
* update contributing.md
2015-10-11 18:28:21 +03:00
440d180c20 some code style improvements (#67) 2015-10-10 00:51:24 +03:00
827275da3f fix crash which has been caused by the fact that we've called concurrent
data update and don't copy object (#66)
* more correct concurrent run
* move data split to awdataengineaggregator
2015-10-09 07:22:54 +03:00
6f86e8ec5e fix formating 2015-10-08 01:14:30 +03:00
f1e6f74c7d * add CONTRIBUTING.md
* add drop source ability for extsysmon
2015-10-08 01:08:59 +03:00
f7e24f680a * add Optimization build type which uses -O3
* create QTimer object in AWDataEngineAggregator class, emit signal to
  this timer because timers could not be started in the separate thread
* increase limit x2 with leaving the thread pool size as was
2015-10-07 01:39:10 +03:00
69c1f0ed5a * small build changes
* drop cast (they were added to try to avoid possible crash)
2015-10-06 06:49:24 +03:00
c4612d84ed move dataengine control to plugin part (ref to #66) 2015-10-05 00:00:38 +03:00
228d6500d3 update Spain translation 2015-10-01 00:18:58 +03:00
befdf0519f add loadsource for testing needs 2015-09-30 00:16:57 +03:00
79d2b07d57 update uk translation
fix typo in ru translation
2015-09-29 00:13:19 +03:00
84f6f1a820 * add commit SHA information
* allow to open link in quotes editor
* fix bug with no data updates in configuration ui
2015-09-28 19:27:55 +03:00
92ce241742 return back stream lock which will be disabled from qml by the timer. In
other case there is possibe plasma crash
2015-09-26 03:23:10 +03:00
ab2a444c84 auxiliary commit
* drop unnecessary includes
* bump API versions inside version.h
2015-09-24 00:05:09 +03:00
0fa274ad75 * fix bug in ui
* drop QUEUE_LIMIT build option (moved to runtime cfg)
* apply concurrent updates for slots
2015-09-23 03:53:42 +03:00
82e2bc23a1 * more intuitive configuration UI
* add queueLimit runtime configuration
2015-09-22 00:31:30 +03:00
4cc44c1d59 bump quotes api version to 3. Change data type from float to double to
avoid rounding problems
2015-09-21 06:17:43 +03:00
d20db1b888 rewrite several methods in GI, add support of graphs 2015-09-20 13:19:28 +03:00
120e201c5b * move update interval to another tab
* some changes inside concurrent run
* update COPYING to vanila format
2015-09-19 10:25:26 +03:00
24eb548bb3 * limit messages queue to ideal thread count
* move from QtScript to QJSEngine (first is deprecated since 5.6)
* drop unneeded includes in headers
* some changes inside queue managing
2015-09-17 01:10:55 +03:00
646e897058 * fix extsysmon multi keys sources
* change quotes values types to double
2015-09-16 00:01:07 +03:00
95b6b2d9e9 * add preview function
* more comments inside
* variables renaming
* unite several lists to one hash
* add build_future definition checking to source code
2015-09-15 00:02:59 +03:00
dddc3962a5 * better extensions update
* prepare dataaggregator to graph data
* add ability to wrap text
* move tag selection dialog to ui
2015-09-14 05:01:34 +03:00
f08600db61 change quotes output format
integrate aggregators to the plugin
2015-09-13 00:13:49 +03:00
0ba74b3130 add ability to wrap lines
rename AWToolTip to AWDataAggregator object
drop hasOutput property from ExtScript
fix some bugs in AWKeysAggregator
2015-09-12 02:32:31 +03:00
0298a8c088 create awkeysaggregator
change netwrok device definition (fix #64)
2015-09-11 00:43:35 +03:00
bf5c500938 fix bugs caused by integration 2015-09-10 04:59:35 +03:00
9e45b02c8e move extsysmon and plugin to the new source model 2015-09-09 01:48:09 +03:00
ab0ab0d40f some optimizations 2015-09-08 00:07:47 +03:00
f5e40d084d show message on no updates 2015-09-07 01:47:50 +03:00
d00ab81fe9 better look and feel for tooltip configuration ui 2015-09-06 01:43:45 +03:00
09275731aa try to implement concurent data update 2015-09-05 03:02:02 +03:00
141 changed files with 8949 additions and 5042 deletions

47
.gitignore vendored
View File

@ -1,7 +1,48 @@
sources/build # Compiled Object files
sources/usr *.slo
*.lo
*.o
*.obj
# Precompiled Headers
*.gch
*.pch
# Compiled Dynamic libraries
*.so
*.dylib
*.dll
# Fortran module files
*.mod
# Compiled Static libraries
*.lai
*.la
*.a
*.lib
# Executables
*.exe
*.out
*.app
# cmake
CMakeCache.txt
CMakeFiles
CMakeScripts
Makefile
cmake_install.cmake
install_manifest.txt
# build directory
build
# archives
*src.tar.[gx]z *src.tar.[gx]z
*pkg.tar.[gx]z *pkg.tar.[gx]z
build
src src
pkg pkg
# clion settings
.idea

View File

@ -1,5 +1,38 @@
+ add tags upunits, downunits Ver.3.0.0:
+ add tags upunits, downunits, upkb, downkb
+ add tags dalbum, dartist, dtitle, salbum, sartist, stitle
+ add support of lambda functions
+ add Dutch translation (thanks to Heimen Stoffels)
+ add check for update function on startup (optional)
+ add ability to disable string tags translations
+ add filtering to ExtUpgrade (ApiVer == 3)
+ add ability to change weather icons (ApiVer == 2)
+ show message if no updates found on direct request
+ add swap redirect type to ExtScript (ApiVer == 4)
+ add ability to wrap words
+ add support of graphs to GraphicalItems (ApiVer == 3)
+ add ability to show preview from configuration
+ add configuration export and import functions
- fix warning for empty tooltip image - fix warning for empty tooltip image
- fix bug with widget auto resizing
- fix bug with no settings saving in DE
- fix bug with large start size
- fix bug with no possibility use more than 10 ext tags
- drop HDD free space notifications
- drop X-AW-Output key for ExtScript (ApiVer == 4)
- fix possible crash on web sources destruction
* more pretty configuration ui
* improve logging, change format to Qt5 style
* switch to concurrent data update
* some more optimization
* better network device definition
* quotes values now have double type (ApiVer == 3)
* better quotes output
* more comments inside code
* more Qt code style
* move update interval to another group
* move DataEnignes operations to plugin
* change DataEngine data format (breaking changes)
Ver.2.4.0: Ver.2.4.0:
+ add support of weather items + add support of weather items

View File

@ -1,3 +1,39 @@
Вер.3.0.0:
+ добавлены теги upunits, downunits, upkb, downkb
+ добавлены теги dalbum, dartist, dtitle, salbum, sartist, stitle
+ добавлена поддержка лямбда функций
+ добавлен голландский перевод (спасибо Heimen Stoffels)
+ добавлена опциональная проверка обновлений на старте
+ добавлена возможность отключить перевод строковых тегов
+ добавлена фильтрация в ExtUpgrade (ApiVer == 3)
+ добавлена возможность смены иконки погоды (ApiVer == 2)
+ показ сообщений, если не найдено обновлений, при прямом запросе
+ добавлено перенаправление swap в ExtScript (ApiVer == 4)
+ добавлена возможность переноса слов
+ добавлена поддержка графиков в GraphicalItems (ApiVer == 3)
+ добавлена возможность показать превью из настроек
+ добавлены импорт и экспорт конфигурации
- исправлен ворнинг для пустых тултипов
- исправлен баг, приводящий к увеличению виджета
- исправлен баг с отсутствием сохранения настроек DE
- исправлен баг с большим размером на старте
- исправлен баг с невозможностью использования более, чем 10 расширений
- убраны уведомления о свободном месте на диске
- убран ключ X-AW-Output в ExtScript (ApiVer == 4)
- исправлен возможное падение при вызове деструктора web-источников
* более удобный интерфейс настройки
* улучшено логирование, применен стиль логирования Qt5
* переключено на конкурентное обновление (-DBUILD_FUTURE=ON)
* немного оптимизаций
* лучшее определение активного сетевого устройства
* значение котировок типа double (ApiVer == 3)
* лучший показ котировок
* больше комментариев в коде
* большее следование стилю кода Qt
* настройки интервала перемещены в другую группу
* работа с DataEngine была перемещена в плагин
* изменен формат данных внутри DataEngine (ломает совместимость)
Вер.2.4.0: Вер.2.4.0:
+ добавлена поддержка погоды + добавлена поддержка погоды
+ добавлена поддержка LA (теги la1, la5, la15) + добавлена поддержка LA (теги la1, la5, la15)

230
CONTRIBUTING.md Normal file
View File

@ -0,0 +1,230 @@
Code style
----------
The recommended code style is Qt one. See [this document](https://wiki.qt.io/Qt_Coding_Style)
for more details. To avoid manual labor there is automatic cmake target named
`clangformat` (see below). Some additional detail see below.
* Indent is only spaces. 4 spaces.
* It is highly recommended to name private variables with `m_` prefix (`m_foo`).
There is no exceptions for properties.
* Avoid to create a large methods. Exception: if method contains lambda functions.
* If some method is called only once, it is recommended to use lambda functions.
Exception is `Q_INVOKABLE` methods.
* STL containers are not recommended, use Qt ones instead.
* In other hand Qt specific variables types (`qint`, `qfloat`, etc) are not
recommended.
* Do not repeat yourself ([DRY](https://en.wikipedia.org/wiki/Don't_repeat_yourself)).
* Headers declaration:
* Include only those headers which are strictly necessary inside headers. Use
forward class declaration instead. Exception is base class header declaration.
* In a`*.cpp` file header declaration should have the following order separated
by a new line in the alphabet order:
1. Class header.
2. KDE specific headers.
3. Qt specific headers.
4. Third party headers.
5. Project headers.
* Any header should have [include guard](https://en.wikipedia.org/wiki/Include_guard)
named as `CLASSNAMECAPS_H`
* If any `#if` directive is used condition should be mentioned in `#endif`:
```
#if (FOO)
someCodeInside();
#endif /* FOO */
```
* `Q_PROPERTY` macro is allowed and recommended for QObject based classes.
* Qt macros (e.g. `signals`, `slots`, `Q_OBJECT`, etc) are allowed.
* Current project standard is **C++11**.
* Do not use C-like code:
* C-like style iteration if possible. Use `Q_FOREACH` (`foreach`) and
`std::for_each` instead if possible. It is also recommended to use iterators.
* C-like casts, use `const_cast`, `static_cast`, `dymanic_Cast` instead. Using
of `reinterpret_cast` is not recommended. It is highly recommended to use
`dynamic_Cast` with the exception catching. It is also possible to use
`qvariant_cast` if required. Exception is class constructors, e.g.:
```
char c = 'c';
std::string s = "string";
qDebug() << QString("some string") << QChar(c) << QString(s);
```
* C-like `NULL`, use `nullptr` instead.
* It is highly recommended to avoid implicit casts.
* Abstract classes (which have at least one pure virtual method) are allowed.
* Templates are allowed and recommended. Templates usually should be described
inside header not source code file.
* Hardcode is not recommended. But it is possible to use cmake variables to
configure some items during build time.
* Build should not require any additional system variable declaration/changing.
* Any line should not end with space.
* Do not hesitate move public methods to private one if possible.
* Do not hesitate use `const` modifier. In other hand `volatile` modifier is not
recommended.
* New lines rules:
* One line after license header.
* One line between header group declaration (see above).
* Two lines after header declaration and before declaration at the end of a
file.
* One line after class and types forward declarations in headers.
* One line before each method modifiers (`public`, `public slots`, etc).
* Two lines between methods inside source code (`*.cpp`).
* One line after `qCDebug()` information (see below).
* One line inside a method to improve code reading.
* Each destructor should be virtual.
* Class constructor should have default arguments. Use `QObject *parent` property
for QObject based classes.
* QObject based classes constructors should have explicit modifier.
* Create one file (source and header) per class.
* `else if` construction is allowed and recommended.
* 'true ? foo : bar' construction is allowed and recommended for one-line assignment.
Comments
--------
Please do not hesitate to use comments inside source code (especially in non-obvious
blocks). Comments also may use the following keywords:
* **TODO** - indicates that some new code should be implemented here later. Please
note that usually these methods should be implemented before the next release.
* **FIXME** - some dirty hacks and/or methods which should be done better.
* **HACK** - hacks inside code which requires to avoid some restrictions and/or
which adds additional non-obvious optimizations.
Do not use dots at the end of the comment line.
Development
-----------
* Officially the latest libraries versions should be used. In addition it is
possible to add workarounds for all versions (usually by using preprocessor
directives).
* Build should not contain any warning.
* Try to minimize message in Release build with logging disabled. It is highly
recommended to fix KDE/Qt specific warning if possible
* Do not use dependency to KDE libraries if there are no any strictly necessary.
Exceptions are KNotification and KI18n libraries.
* It is highly recommended to use submodules for third party libraries if possible.
* The main branch is **development**. Changes in this branch may be merged to the
master one only if it is a 'stable' build.
* For experimental features development new branch `feature-foo` creation is allowed
and recommended.
* Experimental features should be added inside `BUILD_FUTURE` definition:
```
#ifdef BUILD_FUTURE
someTestFunctionInside();
#endif /* BUILD_FUTURE */
```
* Any project specific build variable should be mentioned inside `version.h` as
well.
* Recommended compiler is `clang`.
HIG
---
The recommended HIG is [KDE one](https://techbase.kde.org/Projects/Usability/HIG).
Licensing
---------
All files should be licensed under GPLv3, the owner of the license should be the
project (i.e. **awesome-widgets**). See **Tools** section for more details.
Logging
-------
For logging please use [QLoggingCategory](http://doc.qt.io/qt-5/qloggingcategory.html).
Available categories should be declared in `awdebug.*` files. The following log
levels should be used:
* **debug** (`qCDebug()`) - method arguments information.
* **info** (`qCInfo()`) - additional information inside methods.
* **warning** (`qCWarning()`) - not critical information, which may be caused by
mistakes in configuration for example.
* **error** (`qCError()`) - an error which has been captured in runtime. All errors
should have own callback methods.
* **critical** (`qCCritical()`) - a critical error. After this error program will
be terminated.
The empty log string (e.g. `qCDebug();`) is not allowed because the method names
will be stripped by compiler with `Release` build type. To log class constructor
and destructor use `__PRETTY_FUNCTION__` macro.
Testing
-------
* Any changes should be tested by using `plasmawindowed` and `plasmashell` applications.
(It is also possible to use `plasmaengineexplorer` and `plasmoidviewer` in addition.)
* Any test should be performed on real (not Virtual Machine) system.
* Test builds should be:
1. `-DCMAKE_BUILD_TYPE=Debug`.
2. `-DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTING=ON`.
3. `-DCMAKE_BUILD_TYPE=Release`.
* It is recommended to create addition test if possible.
* Addition test functions should be declated and used only inside `BUILD_TESTING`
definition.
Tools
-----
* For QString concatenation use `QString::arg` method.
* Any source file should have license header:
```
/***************************************************************************
* 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/ *
***************************************************************************/
```
* Recommended class constructor for QObject based classes:
```
FooClass::FooClass(QObject *parent, const QVariant var)
: QObject(parent)
, m_var(var)
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
// some code below if any
}
```
* Property usage:
```
Q_PROPERTY(bool prop READ prop WRITE setProp);
public:
bool prop() const
{
return m_prop;
};
void setProp(const bool _prop)
{
// error checking if required
m_prop = _prop
}
private:
// declare with default value
bool m_prop = false;
```
* Use `cppcheck` to avoid common errors in the code. To start application just
run `make cppcheck`.
* Use `clang-format` to apply valid code format. To start application just run
`make clangformat`.

View File

@ -1,4 +1,4 @@
GNU GENERAL PUBLIC LICENSE GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007 Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
@ -631,8 +631,8 @@ to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found. the "copyright" line and a pointer to where the full notice is found.
awesome-widgets {one line to give the program's name and a brief idea of what it does.}
Copyright (C) 2013-2014 Evgeniy Alekseev Copyright (C) {year} {name of author}
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode: notice like this when it starts in an interactive mode:
awesome-widgets Copyright (C) 2013 Evgeniy Alekseev {project} Copyright (C) {year} {fullname}
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details. under certain conditions; type `show c' for details.

View File

@ -12,7 +12,7 @@ git submodule update --init --recursive
# build widget # build widget
ARCHIVE="awesome-widgets" ARCHIVE="awesome-widgets"
FILES="AUTHORS CHANGELOG CHANGELOG-RU COPYING" FILES="AUTHORS CHANGELOG CHANGELOG-RU COPYING"
IGNORELIST="build usr .kdev4 *.kdev4" IGNORELIST="build usr .kdev4 *.kdev4 .idea"
# create archive # create archive
[[ -e ${ARCHIVE}-${VERSION}-src.tar.xz ]] && rm -f "${ARCHIVE}-${VERSION}-src.tar.xz" [[ -e ${ARCHIVE}-${VERSION}-src.tar.xz ]] && rm -f "${ARCHIVE}-${VERSION}-src.tar.xz"
[[ -d ${ARCHIVE} ]] && rm -rf "${ARCHIVE}" [[ -d ${ARCHIVE} ]] && rm -rf "${ARCHIVE}"

View File

@ -2,53 +2,39 @@
pkgname=plasma5-applet-awesome-widgets pkgname=plasma5-applet-awesome-widgets
_pkgname=awesome-widgets _pkgname=awesome-widgets
pkgver=2.4.0.r34.gbe26033 pkgver=3.0.0
pkgrel=1 pkgrel=1
pkgdesc="Collection of minimalistic Plasmoids which look like Awesome WM widgets (ex-PyTextMonitor). Git version" pkgdesc="Collection of minimalistic Plasmoids which look like Awesome WM widgets (ex-PyTextMonitor)"
arch=('i686' 'x86_64') arch=('i686' 'x86_64')
url="http://arcanis.name/projects/awesome-widgets" url="http://arcanis.name/projects/awesome-widgets"
license=('GPL3') license=('GPL3')
depends=('plasma-framework') depends=('plasma-framework')
optdepends=("amarok: for music player monitor" optdepends=("catalyst: for GPU monitor"
"clementine: for music player monitor"
"catalyst: for GPU monitor"
"hddtemp: for HDD temperature monitor" "hddtemp: for HDD temperature monitor"
"smartmontools: for HDD temperature monitor" "smartmontools: for HDD temperature monitor"
"mpd: for music player monitor" "mpd: for music player monitor"
"nvidia-utils: for GPU monitor" "nvidia-utils: for GPU monitor")
"qmmp: for music player monitor") makedepends=('cmake' 'extra-cmake-modules')
makedepends=('cmake' 'extra-cmake-modules' 'git') source=(https://github.com/arcan1s/awesome-widgets/releases/download/V.${pkgver}/${_pkgname}-${pkgver}-src.tar.xz)
source=(${_pkgname}::git+https://github.com/arcan1s/awesome-widgets.git#branch=release-2.4.0)
install=${pkgname}.install install=${pkgname}.install
md5sums=('SKIP') md5sums=('4878899f092ee12ad8f935f0551ef6b2')
backup=('etc/xdg/plasma-dataengine-extsysmon.conf') backup=('etc/xdg/plasma-dataengine-extsysmon.conf')
pkgver() {
cd "${srcdir}/${_pkgname}"
git describe --tags --long | sed 's/V\.//' | sed 's/\([^-]*-g\)/r\1/;s/-/./g'
}
prepare() { prepare() {
rm -rf "${srcdir}/${_pkgname}/build" rm -rf "${srcdir}/build"
mkdir "${srcdir}/${_pkgname}/build" mkdir "${srcdir}/build"
# update submobules
cd "${srcdir}/${_pkgname}"
git submodule init
git submodule update --recursive
echo "$pkgver"
} }
build () { build () {
cd "${srcdir}/${_pkgname}/build" cd "${srcdir}/build"
cmake -DKDE_INSTALL_USE_QT_SYS_PATHS=ON \ cmake -DKDE_INSTALL_USE_QT_SYS_PATHS=ON \
-DCMAKE_BUILD_TYPE=Release \ -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr \ -DCMAKE_INSTALL_PREFIX=/usr \
"../sources" "../${_pkgname}"
make make
} }
package() { package() {
cd "${srcdir}/${_pkgname}/build" cd "${srcdir}/build"
make DESTDIR="${pkgdir}" install make DESTDIR="${pkgdir}" install
} }

54
packages/PKGBUILD-git Normal file
View File

@ -0,0 +1,54 @@
# Maintainer: Evgeniy Alekseev <arcanis at archlinux dot org>
pkgname=plasma5-applet-awesome-widgets
_pkgname=awesome-widgets
pkgver=2.2.1.r15.g78931b3
pkgrel=1
pkgdesc="Collection of minimalistic Plasmoids which look like Awesome WM widgets (ex-PyTextMonitor). Git version"
arch=('i686' 'x86_64')
url="http://arcanis.name/projects/awesome-widgets"
license=('GPL3')
depends=('plasma-framework')
optdepends=("amarok: for music player monitor"
"clementine: for music player monitor"
"catalyst: for GPU monitor"
"hddtemp: for HDD temperature monitor"
"smartmontools: for HDD temperature monitor"
"mpd: for music player monitor"
"nvidia-utils: for GPU monitor"
"qmmp: for music player monitor")
makedepends=('cmake' 'extra-cmake-modules' 'git')
source=(${_pkgname}::git+https://github.com/arcan1s/awesome-widgets/)
install=${pkgname}.install
md5sums=('SKIP')
backup=('etc/xdg/plasma-dataengine-extsysmon.conf')
pkgver() {
cd "${srcdir}/${_pkgname}"
git describe --tags --long | sed 's/V\.//' | sed 's/\([^-]*-g\)/r\1/;s/-/./g'
}
prepare() {
rm -rf "${srcdir}/${_pkgname}/build"
mkdir "${srcdir}/${_pkgname}/build"
# update submobules
cd "${srcdir}/${_pkgname}"
git submodule init
git submodule update --recursive
echo "$pkgver"
}
build () {
cd "${srcdir}/${_pkgname}/build"
cmake -DKDE_INSTALL_USE_QT_SYS_PATHS=ON \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr \
"../sources"
make
}
package() {
cd "${srcdir}/${_pkgname}/build"
make DESTDIR="${pkgdir}" install
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 83 KiB

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

66
sources/.clang-format Normal file
View File

@ -0,0 +1,66 @@
---
Language: Cpp
AccessModifierOffset: -4
AlignAfterOpenBracket: true
AlignConsecutiveAssignments: false
AlignEscapedNewlinesLeft: false
AlignOperands: true
AlignTrailingComments: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortBlocksOnASingleLine: false
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: Inline
AllowShortIfStatementsOnASingleLine: false
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: false
BinPackArguments: true
BinPackParameters: true
BreakBeforeBinaryOperators: All
BreakBeforeBraces: Linux
BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: true
ColumnLimit: 80
CommentPragmas: '^ IWYU pragma:'
ConstructorInitializerAllOnOneLineOrOnePerLine: false
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DerivePointerAlignment: false
DisableFormat: false
ExperimentalAutoDetectBinPacking: false
ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ]
IndentCaseLabels: false
IndentWidth: 4
IndentWrappedFunctionNames: false
KeepEmptyLinesAtTheStartOfBlocks: true
MacroBlockBegin: ''
MacroBlockEnd: ''
MaxEmptyLinesToKeep: 2
NamespaceIndentation: None
ObjCBlockIndentWidth: 2
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: true
PenaltyBreakBeforeFirstCallParameter: 19
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 60
PointerAlignment: Right
SpaceAfterCStyleCast: false
SpaceBeforeAssignmentOperators: true
SpaceBeforeParens: ControlStatements
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1
SpacesInAngles: false
SpacesInContainerLiterals: true
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
Standard: Cpp11
TabWidth: 8
UseTab: Never
...

View File

@ -8,7 +8,7 @@ ProjectRootRelative=./
[CMake][CMake Build Directory 0] [CMake][CMake Build Directory 0]
Build Directory Path=file:///home/arcanis/Documents/github/awesome-widgets/build Build Directory Path=file:///home/arcanis/Documents/github/awesome-widgets/build
Build Type=Release Build Type=Optimization
CMake Binary=file:///usr/bin/cmake CMake Binary=file:///usr/bin/cmake
Environment Profile= Environment Profile=
Extra Arguments= Extra Arguments=

View File

@ -1,218 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>About</class>
<widget class="QWidget" name="About">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>450</width>
<height>359</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tab_About">
<attribute name="title">
<string>About</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QScrollArea" name="scrollArea_about">
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents_about">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>418</width>
<height>284</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QLabel" name="label_name">
<property name="text">
<string/>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_version">
<property name="text">
<string/>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_description">
<property name="text">
<string/>
</property>
<property name="alignment">
<set>Qt::AlignJustify|Qt::AlignVCenter</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_links">
<property name="text">
<string/>
</property>
<property name="textFormat">
<enum>Qt::RichText</enum>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="openExternalLinks">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
</widget>
</item>
<item>
<spacer name="spacer_about">
<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>
</layout>
</widget>
<widget class="QWidget" name="tab_ackn">
<attribute name="title">
<string>Acknowledgement</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<widget class="QScrollArea" name="scrollArea_ackn">
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents_ackn">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>418</width>
<height>284</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_5">
<item>
<widget class="QLabel" name="label_translators">
<property name="text">
<string/>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_trdparty">
<property name="text">
<string/>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
</widget>
</item>
<item>
<spacer name="spacer_ackn">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>229</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
<item>
<widget class="QLabel" name="label_license">
<property name="text">
<string/>
</property>
<property name="textFormat">
<enum>Qt::RichText</enum>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="openExternalLinks">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::TextBrowserInteraction</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -7,16 +7,19 @@ cmake_policy(SET CMP0011 NEW)
cmake_policy(SET CMP0015 NEW) cmake_policy(SET CMP0015 NEW)
if (POLICY CMP0063) if (POLICY CMP0063)
cmake_policy(SET CMP0063 OLD) cmake_policy(SET CMP0063 OLD)
endif() endif ()
project(awesomewidgets) project(awesomewidgets)
set(PROJECT_AUTHOR "Evgeniy Alekseev") set(PROJECT_AUTHOR "Evgeniy Alekseev")
set(PROJECT_CONTACT "esalexeev@gmail.com") set(PROJECT_CONTACT "esalexeev@gmail.com")
set(PROJECT_LICENSE "GPL3") set(PROJECT_LICENSE "GPL3")
set(PROJECT_VERSION_MAJOR "2") set(PROJECT_VERSION_MAJOR "3")
set(PROJECT_VERSION_MINOR "4") set(PROJECT_VERSION_MINOR "0")
set(PROJECT_VERSION_PATCH "0") set(PROJECT_VERSION_PATCH "0")
set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}") set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}")
# append git version if any
set(PROJECT_COMMIT_SHA "Commit hash" CACHE INTERNAL "")
include(checkgit.cmake)
string(TIMESTAMP CURRENT_DATE "%Y-%m-%d %H:%M" UTC) string(TIMESTAMP CURRENT_DATE "%Y-%m-%d %H:%M" UTC)
string(TIMESTAMP CURRENT_YEAR "%Y") string(TIMESTAMP CURRENT_YEAR "%Y")
@ -25,43 +28,55 @@ message(STATUS "Project: ${PROJECT_NAME}")
message(STATUS "Version: ${PROJECT_VERSION}") message(STATUS "Version: ${PROJECT_VERSION}")
message(STATUS "Build date: ${CURRENT_DATE}") message(STATUS "Build date: ${CURRENT_DATE}")
# components
option(BUILD_PLASMOIDS "Build plasmoids" ON) option(BUILD_PLASMOIDS "Build plasmoids" ON)
option(BUILD_DEB_PACKAGE "Build deb package" OFF) 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
option(BUILD_FUTURE "Build with the features which will be marked as stable later" OFF)
option(BUILD_TESTING "Build with additional test abilities" OFF)
# some additional targets
set(CLANGFORMAT_EXECUTABLE "/usr/bin/clang-format" CACHE STRING "Path to clang-format executable")
set(CPPCHECK_EXECUTABLE "/usr/bin/cppcheck" CACHE STRING "Path to cppcheck executable")
# flags # flags
if(CMAKE_COMPILER_IS_GNUCXX) if (CMAKE_COMPILER_IS_GNUCXX)
set(CMAKE_CXX_FLAGS "-Wall -Wno-cpp -std=c++11") set(CMAKE_CXX_FLAGS "-Wall -Wno-cpp -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")
# 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 -stdlib=libc++")
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")
# linker flags # linker flags
set(CMAKE_EXE_LINKER_FLAGS "-lc++abi") set(CMAKE_EXE_LINKER_FLAGS "-lc++abi")
set(CMAKE_MODULE_LINKER_FLAGS "-lc++abi") set(CMAKE_MODULE_LINKER_FLAGS "-lc++abi")
set(CMAKE_SHARED_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 ()
if(CMAKE_BUILD_TYPE MATCHES Debug) if (CMAKE_BUILD_TYPE MATCHES Debug)
set(CMAKE_VERBOSE_MAKEFILE ON) set(CMAKE_VERBOSE_MAKEFILE ON)
endif() endif ()
configure_file(${CMAKE_SOURCE_DIR}/version.h.in ${CMAKE_CURRENT_BINARY_DIR}/version.h)
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)
include(libraries.cmake) include(libraries.cmake)
include(clang-format.cmake)
include(cppcheck.cmake)
get_directory_property(CMAKE_DEFINITIONS COMPILE_DEFINITIONS)
configure_file(${CMAKE_SOURCE_DIR}/version.h.in ${CMAKE_CURRENT_BINARY_DIR}/version.h)
add_subdirectory(awesomewidgets) add_subdirectory(awesomewidgets)
add_subdirectory(extsysmon) add_subdirectory(extsysmon)
if(BUILD_PLASMOIDS) if (BUILD_PLASMOIDS)
add_subdirectory(awesome-widget) add_subdirectory(awesome-widget)
add_subdirectory(desktop-panel) add_subdirectory(desktop-panel)
add_subdirectory(translations) add_subdirectory(translations)
endif() endif ()
include(packages-recipe.cmake) include(packages-recipe.cmake)

View File

@ -17,9 +17,68 @@
#include "awdebug.h" #include "awdebug.h"
#include "version.h"
Q_LOGGING_CATEGORY(LOG_AW, "org.kde.plasma.awesomewidget", QtMsgType::QtWarningMsg) Q_LOGGING_CATEGORY(LOG_AW, "org.kde.plasma.awesomewidget",
Q_LOGGING_CATEGORY(LOG_DP, "org.kde.plasma.desktoppanel", QtMsgType::QtWarningMsg) 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_ESM, "org.kde.plasma.extsysmon", QtMsgType::QtWarningMsg)
Q_LOGGING_CATEGORY(LOG_LIB, "org.kde.plasma.awesomewidgets", QtMsgType::QtWarningMsg) Q_LOGGING_CATEGORY(LOG_LIB, "org.kde.plasma.awesomewidgets",
QtMsgType::QtWarningMsg)
const QStringList getBuildData()
{
QStringList metadata;
metadata.append(QString("=== Awesome Widgets configuration details ==="));
// build information
metadata.append(QString("Build details:"));
metadata.append(QString(" VERSION: %1").arg(VERSION));
metadata.append(QString(" COMMIT_SHA: %1").arg(COMMIT_SHA));
metadata.append(QString(" BUILD_DATE: %1").arg(BUILD_DATE));
// configuration
metadata.append(QString("API details:"));
metadata.append(QString(" AWGIAPI: %1").arg(AWGIAPI));
metadata.append(QString(" AWEQAPI: %1").arg(AWEQAPI));
metadata.append(QString(" AWESAPI: %1").arg(AWESAPI));
metadata.append(QString(" AWEUAPI: %1").arg(AWEUAPI));
metadata.append(QString(" AWEWAPI: %1").arg(AWEWAPI));
metadata.append(QString(" TIME_KEYS: %1").arg(TIME_KEYS));
// cmake properties
metadata.append(QString("cmake properties:"));
metadata.append(QString(" CMAKE_BUILD_TYPE: %1").arg(CMAKE_BUILD_TYPE));
metadata.append(
QString(" CMAKE_CXX_COMPILER: %1").arg(CMAKE_CXX_COMPILER));
metadata.append(QString(" CMAKE_CXX_FLAGS: %1").arg(CMAKE_CXX_FLAGS));
metadata.append(
QString(" CMAKE_CXX_FLAGS_DEBUG: %1").arg(CMAKE_CXX_FLAGS_DEBUG));
metadata.append(QString(" CMAKE_CXX_FLAGS_RELEASE: %1")
.arg(CMAKE_CXX_FLAGS_RELEASE));
metadata.append(QString(" CMAKE_CXX_FLAGS_OPTIMIZATION: %1")
.arg(CMAKE_CXX_FLAGS_OPTIMIZATION));
metadata.append(
QString(" CMAKE_DEFINITIONS: %1").arg(CMAKE_DEFINITIONS));
metadata.append(
QString(" CMAKE_INSTALL_PREFIX: %1").arg(CMAKE_INSTALL_PREFIX));
metadata.append(QString(" CMAKE_MODULE_LINKER_FLAGS: %1")
.arg(CMAKE_MODULE_LINKER_FLAGS));
metadata.append(QString(" CMAKE_SHARED_LINKER_FLAGS: %1")
.arg(CMAKE_SHARED_LINKER_FLAGS));
// components
metadata.append(QString("Components data:"));
metadata.append(QString(" BUILD_PLASMOIDS: %1").arg(BUILD_PLASMOIDS));
metadata.append(
QString(" BUILD_DEB_PACKAGE: %1").arg(BUILD_DEB_PACKAGE));
metadata.append(
QString(" BUILD_RPM_PACKAGE: %1").arg(BUILD_RPM_PACKAGE));
metadata.append(
QString(" CLANGFORMAT_EXECUTABLE: %1").arg(CLANGFORMAT_EXECUTABLE));
metadata.append(
QString(" CPPCHECK_EXECUTABLE: %1").arg(CPPCHECK_EXECUTABLE));
metadata.append(QString(" PROP_FUTURE: %1").arg(PROP_FUTURE));
metadata.append(QString(" PROP_FUTURE: %1").arg(PROP_FUTURE));
return metadata;
}

View File

@ -22,7 +22,10 @@
#include <QLoggingCategory> #include <QLoggingCategory>
#ifndef LOG_FORMAT #ifndef LOG_FORMAT
#define LOG_FORMAT "[%{time yyyy-MM-ddTHH:mm:ss.zzz}][%{if-debug}DD%{endif}%{if-info}II%{endif}%{if-warning}WW%{endif}%{if-critical}CC%{endif}%{if-fatal}FF%{endif}][%{category}][%{function}] %{message}" #define LOG_FORMAT \
"[%{time process}][%{if-debug}DD%{endif}%{if-info}II%{endif}%{if-" \
"warning}WW%{endif}%{if-critical}CC%{endif}%{if-fatal}FF%{endif}][%{" \
"category}][%{function}] %{message}"
#endif /* LOG_FORMAT */ #endif /* LOG_FORMAT */
// define info log level // define info log level
@ -41,5 +44,7 @@ Q_DECLARE_LOGGING_CATEGORY(LOG_DP)
Q_DECLARE_LOGGING_CATEGORY(LOG_ESM) Q_DECLARE_LOGGING_CATEGORY(LOG_ESM)
Q_DECLARE_LOGGING_CATEGORY(LOG_LIB) Q_DECLARE_LOGGING_CATEGORY(LOG_LIB)
const QStringList getBuildData();
#endif /* AWDEBUG_H */ #endif /* AWDEBUG_H */

View File

@ -3,132 +3,138 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0 xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" > http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
<kcfgfile name=""/> <kcfgfile name=""/>
<group name="Widget"> <group name="Widget">
<!-- widget --> <!-- widget -->
<entry name="text" type="string"> <entry name="text" type="string">
<default>[cpu: $cpu%] [mem: $mem%] [swap: $swap%] [$netdev: $down/$upKB/s]</default> <default>[cpu: $cpu%] [mem: $mem%] [swap: $swap%] [$netdev: $down/$upKB/s]</default>
</entry> </entry>
</group> </group>
<group name="Advanced"> <group name="Advanced">
<!-- advanced --> <!-- advanced -->
<entry name="height" type="int"> <entry name="background" type="bool">
<default>0</default> <default>true</default>
</entry> </entry>
<entry name="width" type="int"> <entry name="translateStrings" type="bool">
<default>0</default> <default>true</default>
</entry> </entry>
<entry name="notify" type="bool"> <entry name="wrapNewLines" type="bool">
<default>true</default> <default>false</default>
</entry> </entry>
<entry name="wrapNewLines" type="bool"> <entry name="wrapText" type="bool">
<default>false</default> <default>false</default>
</entry> </entry>
<entry name="background" type="bool"> <entry name="notify" type="bool">
<default>true</default> <default>true</default>
</entry> </entry>
<entry name="customTime" type="string"> <entry name="checkUpdates" type="bool">
<default>$hh:$mm</default> <default>true</default>
</entry> </entry>
<entry name="customUptime" type="string"> <entry name="height" type="int">
<default>$dd,$hh,$mm</default> <default>0</default>
</entry> </entry>
<entry name="tempUnits" type="string"> <entry name="width" type="int">
<default>Celsius</default> <default>0</default>
</entry> </entry>
<entry name="acOnline" type="string"> <entry name="interval" type="int">
<default>(*)</default> <default>1000</default>
</entry> </entry>
<entry name="acOffline" type="string"> <entry name="queueLimit" type="int">
<default>( )</default> <default>0</default>
</entry> </entry>
<entry name="checkUpdates" type="bool"> <entry name="tempUnits" type="string">
<default>true</default> <default>Celsius</default>
</entry> </entry>
<entry name="translateStrings" type="bool"> <entry name="customTime" type="string">
<default>true</default> <default>$hh:$mm</default>
</entry> </entry>
</group> <entry name="customUptime" type="string">
<default>$dd,$hh,$mm</default>
</entry>
<entry name="acOnline" type="string">
<default>(*)</default>
</entry>
<entry name="acOffline" type="string">
<default>( )</default>
</entry>
</group>
<group name="Tooltip"> <group name="Tooltip">
<entry name="tooltipNumber" type="int"> <entry name="tooltipNumber" type="int">
<default>100</default> <default>100</default>
</entry> </entry>
<entry name="useTooltipBackground" type="bool"> <entry name="useTooltipBackground" type="bool">
<default>true</default> <default>true</default>
</entry> </entry>
<entry name="tooltipBackground" type="string"> <entry name="tooltipBackground" type="string">
<default>#ffffff</default> <default>#ffffff</default>
</entry> </entry>
<entry name="cpuTooltip" type="bool"> <entry name="cpuTooltip" type="bool">
<default>true</default> <default>true</default>
</entry> </entry>
<entry name="cpuTooltipColor" type="string"> <entry name="cpuTooltipColor" type="string">
<default>#ff0000</default> <default>#ff0000</default>
</entry> </entry>
<entry name="cpuclTooltip" type="bool"> <entry name="cpuclTooltip" type="bool">
<default>true</default> <default>true</default>
</entry> </entry>
<entry name="cpuclTooltipColor" type="string"> <entry name="cpuclTooltipColor" type="string">
<default>#00ff00</default> <default>#00ff00</default>
</entry> </entry>
<entry name="memTooltip" type="bool"> <entry name="memTooltip" type="bool">
<default>true</default> <default>true</default>
</entry> </entry>
<entry name="memTooltipColor" type="string"> <entry name="memTooltipColor" type="string">
<default>#0000ff</default> <default>#0000ff</default>
</entry> </entry>
<entry name="swapTooltip" type="bool"> <entry name="swapTooltip" type="bool">
<default>true</default> <default>true</default>
</entry> </entry>
<entry name="swapTooltipColor" type="string"> <entry name="swapTooltipColor" type="string">
<default>#ffff00</default> <default>#ffff00</default>
</entry> </entry>
<entry name="downTooltip" type="bool"> <entry name="downTooltip" type="bool">
<default>true</default> <default>true</default>
</entry> </entry>
<entry name="downTooltipColor" type="string"> <entry name="downTooltipColor" type="string">
<default>#00ffff</default> <default>#00ffff</default>
</entry> </entry>
<entry name="upTooltipColor" type="string"> <entry name="upTooltipColor" type="string">
<default>#ff00ff</default> <default>#ff00ff</default>
</entry> </entry>
<entry name="batTooltip" type="bool"> <entry name="batTooltip" type="bool">
<default>true</default> <default>true</default>
</entry> </entry>
<entry name="batTooltipColor" type="string"> <entry name="batTooltipColor" type="string">
<default>#008800</default> <default>#008800</default>
</entry> </entry>
<entry name="batInTooltipColor" type="string"> <entry name="batInTooltipColor" type="string">
<default>#880000</default> <default>#880000</default>
</entry> </entry>
</group> </group>
<group name="Appearance"> <group name="Appearance">
<!-- appearance --> <!-- appearance -->
<entry name="interval" type="int"> <entry name="textAlign" type="string">
<default>1000</default> <default>center</default>
</entry> </entry>
<entry name="textAlign" type="string"> <entry name="fontFamily" type="string">
<default>center</default> <default>Terminus</default>
</entry> </entry>
<entry name="fontFamily" type="string"> <entry name="fontSize" type="int">
<default>Terminus</default> <default>12</default>
</entry> </entry>
<entry name="fontSize" type="int"> <entry name="fontColor" type="string">
<default>12</default> <default>#000000</default>
</entry> </entry>
<entry name="fontColor" type="string"> <entry name="fontWeight" type="string">
<default>#000000</default> <default>normal</default>
</entry> </entry>
<entry name="fontWeight" type="string"> <entry name="fontStyle" type="string">
<default>normal</default> <default>normal</default>
</entry> </entry>
<entry name="fontStyle" type="string"> </group>
<default>normal</default>
</entry>
</group>
</kcfg> </kcfg>

View File

@ -25,7 +25,7 @@ import org.kde.plasma.private.awesomewidget 1.0
Item { Item {
id: aboutPage id: aboutPage
AWActions { AWActions {
id: awActions; id: awActions
} }
width: childrenRect.width width: childrenRect.width
@ -43,6 +43,7 @@ Item {
height: parent.height height: parent.height
width: parent.width width: parent.width
QtControls.Tab { QtControls.Tab {
anchors.margins: 10.0
title: i18n("About") title: i18n("About")
QtLayouts.ColumnLayout { QtLayouts.ColumnLayout {
@ -85,6 +86,7 @@ Item {
} }
QtControls.Tab { QtControls.Tab {
anchors.margins: 10.0
title: i18n("Acknowledgment") title: i18n("Acknowledgment")
QtLayouts.ColumnLayout { QtLayouts.ColumnLayout {
@ -98,6 +100,7 @@ Item {
QtControls.Label { QtControls.Label {
QtLayouts.Layout.fillHeight: true QtLayouts.Layout.fillHeight: true
QtLayouts.Layout.fillWidth: true QtLayouts.Layout.fillWidth: true
wrapMode: Text.WordWrap
horizontalAlignment: Text.AlignJustify horizontalAlignment: Text.AlignJustify
verticalAlignment: Text.AlignTop verticalAlignment: Text.AlignTop
textFormat: Text.RichText textFormat: Text.RichText
@ -109,6 +112,7 @@ Item {
} }
} }
Component.onCompleted: { Component.onCompleted: {
if (debug) console.debug() if (debug) console.debug()
} }

View File

@ -25,7 +25,10 @@ Item {
id: advancedPage id: advancedPage
// backend // backend
AWActions { AWActions {
id: awActions; id: awActions
}
AWConfigHelper {
id: awConfig
} }
width: childrenRect.width width: childrenRect.width
@ -35,23 +38,110 @@ Item {
property bool debug: awActions.isDebugEnabled() property bool debug: awActions.isDebugEnabled()
property alias cfg_background: background.checked
property alias cfg_translateStrings: translate.checked
property alias cfg_wrapNewLines: wrapNewLines.checked
property alias cfg_wrapText: wordWrap.checked
property alias cfg_notify: notify.checked
property alias cfg_checkUpdates: updates.checked
property alias cfg_height: widgetHeight.value property alias cfg_height: widgetHeight.value
property alias cfg_width: widgetWidth.value property alias cfg_width: widgetWidth.value
property alias cfg_notify: notify.checked property alias cfg_interval: update.value
property alias cfg_wrapNewLines: wrapNewLines.checked property alias cfg_queueLimit: queueLimit.value
property alias cfg_background: background.checked property string cfg_tempUnits: tempUnits.currentText
property alias cfg_customTime: customTime.text property alias cfg_customTime: customTime.text
property alias cfg_customUptime: customUptime.text property alias cfg_customUptime: customUptime.text
property string cfg_tempUnits: tempUnits.currentText
property alias cfg_acOnline: acOnline.text property alias cfg_acOnline: acOnline.text
property alias cfg_acOffline: acOffline.text property alias cfg_acOffline: acOffline.text
property alias cfg_checkUpdates: updates.checked
property alias cfg_translateStrings: translate.checked
Column { Column {
id: pageColumn id: pageColumn
anchors.fill: parent anchors.fill: parent
Row {
height: implicitHeight
width: parent.width
QtControls.Label {
height: parent.heigth
width: parent.width * 2 / 5
}
QtControls.CheckBox {
id: background
width: parent.width * 3 / 5
text: i18n("Enable background")
}
}
Row {
height: implicitHeight
width: parent.width
QtControls.Label {
height: parent.heigth
width: parent.width * 2 / 5
}
QtControls.CheckBox {
id: translate
width: parent.width * 3 / 5
text: i18n("Translate strings")
}
}
Row {
height: implicitHeight
width: parent.width
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 {
height: implicitHeight
width: parent.width
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 {
height: implicitHeight
width: parent.width
QtControls.Label {
height: parent.heigth
width: parent.width * 2 / 5
}
QtControls.CheckBox {
id: notify
width: parent.width * 3 / 5
text: i18n("Enable notifications")
}
}
Row {
height: implicitHeight
width: parent.width
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 { Row {
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
@ -96,41 +186,19 @@ Item {
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
QtControls.Label { QtControls.Label {
height: parent.heigth height: parent.height
width: parent.width * 2 / 5 width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("Time interval")
} }
QtControls.CheckBox { QtControls.SpinBox {
id: notify id: update
width: parent.width * 3 / 5 width: parent.width * 3 / 5
text: i18n("Enable notifications") minimumValue: 1000
} maximumValue: 10000
} stepSize: 500
value: plasmoid.configuration.interval
Row {
height: implicitHeight
width: parent.width
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 {
height: implicitHeight
width: parent.width
QtControls.Label {
height: parent.heigth
width: parent.width * 2 / 5
}
QtControls.CheckBox {
id: background
width: parent.width * 3 / 5
text: i18n("Enable background")
} }
} }
@ -142,29 +210,15 @@ Item {
width: parent.width * 2 / 5 width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
text: i18n("Custom time format") text: i18n("Messages queue limit")
} }
QtControls.TextField { QtControls.SpinBox {
id: customTime id: queueLimit
width: parent.width * 3 / 5 width: parent.width * 3 / 5
text: plasmoid.configuration.customTime minimumValue: 0
} maximumValue: 99
} stepSize: 1
value: plasmoid.configuration.queueLimit
Row {
height: implicitHeight
width: parent.width
QtControls.Label {
height: parent.height
width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("Custom uptime format")
}
QtControls.TextField {
id: customUptime
width: parent.width * 3 / 5
text: plasmoid.configuration.customUptime
} }
} }
@ -225,6 +279,40 @@ Item {
} }
} }
Row {
height: implicitHeight
width: parent.width
QtControls.Label {
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 {
height: implicitHeight
width: parent.width
QtControls.Label {
height: parent.height
width: parent.width * 2 / 5
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 { Row {
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
@ -263,27 +351,13 @@ Item {
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
QtControls.Label { QtControls.Label {
height: parent.heigth height: parent.height
width: parent.width * 2 / 5 width: parent.width * 2 / 5
} }
QtControls.CheckBox { QtControls.Button {
id: updates
width: parent.width * 3 / 5 width: parent.width * 3 / 5
text: i18n("Check updates on startup") text: i18n("Drop key cache")
} onClicked: awActions.dropCache()
}
Row {
height: implicitHeight
width: parent.width
QtControls.Label {
height: parent.heigth
width: parent.width * 2 / 5
}
QtControls.CheckBox {
id: translate
width: parent.width * 3 / 5
text: i18n("Translate strings")
} }
} }
@ -295,14 +369,33 @@ Item {
width: parent.width * 2 / 5 width: parent.width * 2 / 5
} }
QtControls.Button { QtControls.Button {
id: selectFont
width: parent.width * 3 / 5 width: parent.width * 3 / 5
text: i18n("Drop key cache") text: i18n("Export configuration")
onClicked: awActions.dropCache() onClicked: awConfig.exportConfiguration(plasmoid.configuration)
}
}
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: {
if (debug) console.debug()
var importConfig = awConfig.importConfiguration()
for (var key in importConfig)
plasmoid.configuration[key] = importConfig[key]
}
} }
} }
} }
Component.onCompleted: { Component.onCompleted: {
if (debug) console.debug() if (debug) console.debug()
} }

View File

@ -27,7 +27,7 @@ Item {
id: appearancePage id: appearancePage
// backend // backend
AWActions { AWActions {
id: awActions; id: awActions
} }
width: childrenRect.width width: childrenRect.width
@ -44,7 +44,6 @@ Item {
87: 5 87: 5
} }
property alias cfg_interval: update.value
property alias cfg_fontFamily: selectFont.text property alias cfg_fontFamily: selectFont.text
property alias cfg_fontSize: fontSize.value property alias cfg_fontSize: fontSize.value
property string cfg_fontWeight: fontWeight.currentText property string cfg_fontWeight: fontWeight.currentText
@ -55,26 +54,6 @@ Item {
Column { Column {
id: pageColumn id: pageColumn
anchors.fill: parent anchors.fill: parent
Row {
height: implicitHeight
width: parent.width
QtControls.Label {
height: parent.height
width: parent.width / 3
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("Time interval")
}
QtControls.SpinBox {
id: update
width: parent.width * 2 / 3
minimumValue: 1000
maximumValue: 10000
stepSize: 500
value: plasmoid.configuration.interval
}
}
Row { Row {
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
@ -257,6 +236,7 @@ Item {
} }
} }
Component.onCompleted: { Component.onCompleted: {
if (debug) console.debug() if (debug) console.debug()
} }

View File

@ -16,10 +16,8 @@
***************************************************************************/ ***************************************************************************/
import QtQuick 2.0 import QtQuick 2.0
import QtQuick.Controls 1.0 as QtControls import QtQuick.Controls 1.3 as QtControls
import QtQuick.Dialogs 1.1 as QtDialogs import QtQuick.Dialogs 1.1 as QtDialogs
import QtQuick.Layouts 1.0 as QtLayouts
import QtQuick.Controls.Styles 1.3 as QtStyles
import org.kde.plasma.private.awesomewidget 1.0 import org.kde.plasma.private.awesomewidget 1.0
@ -28,10 +26,13 @@ Item {
id: dataenginePage id: dataenginePage
// backend // backend
AWKeys { AWKeys {
id: awKeys; id: awKeys
} }
AWActions { AWActions {
id: awActions; id: awActions
}
AWConfigHelper {
id: awConfig
} }
width: childrenRect.width width: childrenRect.width
@ -41,274 +42,312 @@ Item {
property bool debug: awActions.isDebugEnabled() property bool debug: awActions.isDebugEnabled()
property variant cfg_dataengine: awActions.readDataEngineConfiguration() property variant cfg_dataengine: awConfig.readDataEngineConfiguration()
Column { Column {
id: pageColumn id: pageColumn
anchors.fill: parent anchors.fill: parent
Row { QtControls.GroupBox {
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
QtControls.Label { title: i18n("ACPI")
height: parent.height Row {
width: parent.width * 2 / 5 height: implicitHeight
horizontalAlignment: Text.AlignRight width: parent.width
verticalAlignment: Text.AlignVCenter QtControls.Label {
text: i18n("ACPI path") height: parent.height
} width: parent.width * 2 / 5
QtControls.TextField { horizontalAlignment: Text.AlignRight
width: parent.width * 3 / 5 verticalAlignment: Text.AlignVCenter
text: cfg_dataengine["ACPIPATH"] text: i18n("ACPI path")
onEditingFinished: cfg_dataengine["ACPIPATH"] = text }
QtControls.TextField {
width: parent.width * 3 / 5
text: cfg_dataengine["ACPIPATH"]
onEditingFinished: cfg_dataengine["ACPIPATH"] = text
}
} }
} }
Row { QtControls.GroupBox {
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
QtControls.Label { title: i18n("GPU")
height: parent.height Row {
width: parent.width * 2 / 5 height: implicitHeight
horizontalAlignment: Text.AlignRight width: parent.width
verticalAlignment: Text.AlignVCenter QtControls.Label {
text: i18n("GPU device") height: parent.height
} width: parent.width * 2 / 5
QtControls.ComboBox { horizontalAlignment: Text.AlignRight
id: gpuDev verticalAlignment: Text.AlignVCenter
width: parent.width * 3 / 5 text: i18n("GPU device")
model: ["auto", "disable", "ati", "nvidia"] }
Component.onCompleted: { QtControls.ComboBox {
if (debug) console.debug() id: gpuDev
for (var i=0; i<model.length; i++) { width: parent.width * 3 / 5
if (model[i] == cfg_dataengine["GPUDEV"]) { model: ["auto", "disable", "ati", "nvidia"]
if (debug) console.info("Found", model[i], "on", i) Component.onCompleted: {
currentIndex = i; if (debug) console.debug()
for (var i=0; i<model.length; i++) {
if (model[i] == cfg_dataengine["GPUDEV"]) {
if (debug) console.info("Found", model[i], "on", i)
currentIndex = i;
}
} }
} }
} }
} }
} }
Row { QtControls.GroupBox {
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
QtControls.Label { title: i18n("HDD temperature")
height: parent.height Column {
width: parent.width * 2 / 5 height: implicitHeight
horizontalAlignment: Text.AlignRight width: parent.width
verticalAlignment: Text.AlignVCenter Row {
text: i18n("HDD") height: implicitHeight
} width: parent.width
QtControls.ComboBox { QtControls.Label {
id: hdd height: parent.height
width: parent.width * 3 / 5 width: parent.width * 2 / 5
model: awKeys.getHddDevices(true) horizontalAlignment: Text.AlignRight
Component.onCompleted: { verticalAlignment: Text.AlignVCenter
if (debug) console.debug() text: i18n("HDD")
for (var i=0; i<model.length; i++) { }
if (model[i] == cfg_dataengine["HDDDEV"]) { QtControls.ComboBox {
if (debug) console.info("Found", model[i], "on", i) id: hdd
hdd.currentIndex = i; width: parent.width * 3 / 5
} }
}
Row {
height: implicitHeight
width: parent.width
QtControls.Label {
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
} }
} }
} }
} }
Row { QtControls.GroupBox {
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
QtControls.Label { title: i18n("Player")
height: parent.height Column {
width: parent.width * 2 / 5 height: implicitHeight
horizontalAlignment: Text.AlignRight width: parent.width
verticalAlignment: Text.AlignVCenter Row {
text: i18n("hddtemp cmd") height: implicitHeight
} width: parent.width
QtControls.TextField { QtControls.Label {
width: parent.width * 3 / 5 height: parent.height
text: cfg_dataengine["HDDTEMPCMD"] width: parent.width * 2 / 5
onEditingFinished: cfg_dataengine["HDDTEMPCMD"] = text horizontalAlignment: Text.AlignRight
} 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 { Row {
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
QtControls.Label { QtControls.Label {
height: parent.height height: parent.height
width: parent.width * 2 / 5 width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
text: i18n("MPD address") text: i18n("Music player")
} }
QtControls.TextField { QtControls.ComboBox {
width: parent.width * 3 / 5 id: player
text: cfg_dataengine["MPDADDRESS"] width: parent.width * 3 / 5
onEditingFinished: cfg_dataengine["MPDADDRESS"] = text model: ["disable", "mpris", "mpd"]
} Component.onCompleted: {
} if (debug) console.debug()
for (var i=0; i<model.length; i++) {
Row { if (model[i] == cfg_dataengine["PLAYER"]) {
height: implicitHeight if (debug) console.info("Found", model[i], "on", i)
width: parent.width player.currentIndex = i;
QtControls.Label { }
height: parent.height }
width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight
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
}
}
Row {
height: implicitHeight
width: parent.width
QtControls.Label {
height: parent.height
width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("MPRIS player name")
}
QtControls.ComboBox {
id: mpris
width: parent.width * 3 / 5
editable: true
model: ["auto", "amarok", "audacious", "clementine", "deadbeef",
"vlc", "qmmp", "xmms2", cfg_dataengine["MPRIS"]]
currentIndex: model.length - 1
}
}
Row {
height: implicitHeight
width: parent.width
QtControls.Label {
height: parent.height
width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("Music player")
}
QtControls.ComboBox {
id: player
width: parent.width * 3 / 5
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;
} }
} }
} }
Row {
height: implicitHeight
width: parent.width
QtControls.Label {
height: parent.height
width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("MPRIS player name")
}
QtControls.ComboBox {
id: mpris
width: parent.width * 3 / 5
editable: true
model: ["auto", "amarok", "audacious", "clementine", "deadbeef",
"vlc", "qmmp", "xmms2", cfg_dataengine["MPRIS"]]
currentIndex: model.length - 1
}
}
Row {
height: implicitHeight
width: parent.width
QtControls.Label {
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 {
height: implicitHeight
width: parent.width
QtControls.Label {
height: parent.height
width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight
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
}
}
} }
} }
Row { QtControls.GroupBox {
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
QtControls.Label { title: i18n("Extensions")
height: parent.height Column {
width: parent.width * 2 / 5 height: implicitHeight
horizontalAlignment: Text.AlignRight width: parent.width
verticalAlignment: Text.AlignVCenter Row {
text: i18n("Player data symbols") height: implicitHeight
} width: parent.width
QtControls.SpinBox { QtControls.Label {
width: parent.width * 3 / 5 height: parent.height
minimumValue: 1 width: parent.width * 2 / 5
maximumValue: 100 horizontalAlignment: Text.AlignRight
stepSize: 1 verticalAlignment: Text.AlignVCenter
value: cfg_dataengine["PLAYERSYMBOLS"] text: i18n("Custom scripts")
onEditingFinished: cfg_dataengine["PLAYERSYMBOLS"] = value }
} QtControls.Button {
} width: parent.width * 3 / 5
text: i18n("Edit scripts")
onClicked: awKeys.editItem("extscript")
}
}
Row { Row {
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
QtControls.Label { QtControls.Label {
height: parent.height height: parent.height
width: parent.width * 2 / 5 width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
text: i18n("Custom scripts") text: i18n("Quotes monitor")
} }
QtControls.Button { QtControls.Button {
width: parent.width * 3 / 5 width: parent.width * 3 / 5
text: i18n("Edit scripts") text: i18n("Edit tickers")
onClicked: awKeys.editItem("extscript") onClicked: awKeys.editItem("extquotes")
} }
} }
Row { Row {
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
QtControls.Label { QtControls.Label {
height: parent.height height: parent.height
width: parent.width * 2 / 5 width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
text: i18n("Quotes monitor") text: i18n("Package manager")
} }
QtControls.Button { QtControls.Button {
width: parent.width * 3 / 5 width: parent.width * 3 / 5
text: i18n("Edit tickers") text: i18n("Edit command")
onClicked: awKeys.editItem("extquotes") onClicked: awKeys.editItem("extupgrade")
} }
} }
Row { Row {
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
QtControls.Label { QtControls.Label {
height: parent.height height: parent.height
width: parent.width * 2 / 5 width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
text: i18n("Package manager") text: i18n("Weather")
} }
QtControls.Button { QtControls.Button {
width: parent.width * 3 / 5 width: parent.width * 3 / 5
text: i18n("Edit command") text: i18n("Edit weather")
onClicked: awKeys.editItem("extupgrade") onClicked: awKeys.editItem("extweather")
} }
} }
Row {
height: implicitHeight
width: parent.width
QtControls.Label {
height: parent.height
width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("Weather")
}
QtControls.Button {
width: parent.width * 3 / 5
text: i18n("Edit weather")
onClicked: awKeys.editItem("extweather")
} }
} }
} }
Component.onCompleted: { Component.onCompleted: {
if (debug) console.debug() if (debug) console.debug()
// init submodule // init submodule
awKeys.initKeys(plasmoid.configuration.text) awKeys.updateCache()
// update hdd model
hdd.model = awKeys.getHddDevices()
for (var i=0; i<hdd.model.length; i++) {
if (hdd.model[i] == cfg_dataengine["HDDDEV"]) {
if (debug) console.info("Found", hdd.model[i], "on", i)
hdd.currentIndex = i;
}
}
} }
Component.onDestruction: { Component.onDestruction: {
@ -318,6 +357,6 @@ Item {
cfg_dataengine["HDDDEV"] = hdd.currentText cfg_dataengine["HDDDEV"] = hdd.currentText
cfg_dataengine["PLAYER"] = player.currentText cfg_dataengine["PLAYER"] = player.currentText
cfg_dataengine["MPRIS"] = mpris.currentText cfg_dataengine["MPRIS"] = mpris.currentText
awActions.writeDataEngineConfiguration(cfg_dataengine) awConfig.writeDataEngineConfiguration(cfg_dataengine)
} }
} }

View File

@ -17,6 +17,7 @@
import QtQuick 2.4 import QtQuick 2.4
import QtQuick.Controls 1.3 as QtControls import QtQuick.Controls 1.3 as QtControls
import QtQuick.Dialogs 1.2 as QtDialogs
import QtQuick.Layouts 1.1 import QtQuick.Layouts 1.1
import org.kde.plasma.plasmoid 2.0 import org.kde.plasma.plasmoid 2.0
import org.kde.plasma.core 2.0 as PlasmaCore import org.kde.plasma.core 2.0 as PlasmaCore
@ -30,20 +31,13 @@ Item {
id: main id: main
// backend // backend
AWKeys { AWKeys {
id: awKeys; id: awKeys
} }
AWActions { AWActions {
id: awActions; id: awActions
} }
property bool debug: awActions.isDebugEnabled() property bool debug: awActions.isDebugEnabled()
property variant settings: {
"customTime": plasmoid.configuration.customTime,
"customUptime": plasmoid.configuration.customUptime,
"tempUnits": plasmoid.configuration.tempUnits,
"acOnline": plasmoid.configuration.acOnline,
"acOffline": plasmoid.configuration.acOffline
}
property variant tooltipSettings: { property variant tooltipSettings: {
"tooltipNumber": plasmoid.configuration.tooltipNumber, "tooltipNumber": plasmoid.configuration.tooltipNumber,
"useTooltipBackground": plasmoid.configuration.useTooltipBackground, "useTooltipBackground": plasmoid.configuration.useTooltipBackground,
@ -63,11 +57,12 @@ Item {
"upTooltipColor": plasmoid.configuration.upTooltipColor, "upTooltipColor": plasmoid.configuration.upTooltipColor,
"batTooltipColor": plasmoid.configuration.batTooltipColor, "batTooltipColor": plasmoid.configuration.batTooltipColor,
"batInTooltipColor": plasmoid.configuration.batInTooltipColor, "batInTooltipColor": plasmoid.configuration.batInTooltipColor,
// additinal field to parse AC status // additional field to parse AC status
"acOnline": plasmoid.configuration.acOnline "acOnline": plasmoid.configuration.acOnline,
// additional field to send notifications
"notify": plasmoid.configuration.notify
} }
signal dropSource(string sourceName)
signal needTextUpdate(string newText) signal needTextUpdate(string newText)
signal needToolTipUpdate(string newText) signal needToolTipUpdate(string newText)
signal sizeUpdate signal sizeUpdate
@ -85,53 +80,6 @@ Item {
Plasmoid.backgroundHints: plasmoid.configuration.background ? "DefaultBackground" : "NoBackground" Plasmoid.backgroundHints: plasmoid.configuration.background ? "DefaultBackground" : "NoBackground"
Plasmoid.associatedApplication: "ksysguard" Plasmoid.associatedApplication: "ksysguard"
PlasmaCore.DataSource {
id: systemmonitorDE
engine: "systemmonitor"
connectedSources: systemmonitorDE.sources
interval: plasmoid.configuration.interval
onNewData: {
if (debug) console.debug("Update source", sourceName)
systemmonitorDE.interval = plasmoid.configuration.interval
awKeys.setDataBySource(sourceName, data, settings)
}
onSourceAdded: {
if (debug) console.debug("Source", source)
awKeys.addDevice(source)
}
}
PlasmaCore.DataSource {
id: extsysmonDE
engine: "extsysmon"
connectedSources: extsysmonDE.sources
interval: plasmoid.configuration.interval
onNewData: {
if (debug) console.debug("Update source", sourceName)
extsysmonDE.interval = plasmoid.configuration.interval
awKeys.setDataBySource(sourceName, data, settings)
}
}
PlasmaCore.DataSource {
id: timeDE
engine: "time"
connectedSources: ["Local"]
interval: 1000
onNewData: {
if (debug) console.debug("Update source", sourceName)
awKeys.setDataBySource(sourceName, data, settings)
}
}
// ui // ui
Text { Text {
@ -139,7 +87,7 @@ Item {
anchors.fill: parent anchors.fill: parent
renderType: Text.NativeRendering renderType: Text.NativeRendering
textFormat: Text.RichText textFormat: Text.RichText
wrapMode: 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
@ -162,6 +110,28 @@ 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: { Component.onCompleted: {
if (debug) console.debug() if (debug) console.debug()
@ -169,22 +139,13 @@ 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("report", i18n("Mail to developers"), "email")
// init submodule // init submodule
Plasmoid.userConfiguringChanged(false) Plasmoid.userConfiguringChanged(false)
// connect data // connect data
awKeys.dropSourceFromDataengine.connect(dropSource)
awKeys.needTextToBeUpdated.connect(needTextUpdate) awKeys.needTextToBeUpdated.connect(needTextUpdate)
awKeys.needToolTipToBeUpdated.connect(needToolTipUpdate) awKeys.needToolTipToBeUpdated.connect(needToolTipUpdate)
// check updates if required // check updates if required
if (plasmoid.configuration.checkUpdates) return action_checkUpdates() if (plasmoid.configuration.checkUpdates) return awActions.checkUpdates(false)
}
onDropSource: {
if (debug) console.debug()
if (debug) console.debug("Source", sourceName)
systemmonitorDE.disconnectSource(sourceName)
} }
onNeedTextUpdate: { onNeedTextUpdate: {
@ -226,17 +187,24 @@ Item {
if (debug) console.debug() if (debug) console.debug()
// init submodule // init submodule
awKeys.initKeys(plasmoid.configuration.text) awKeys.initKeys(plasmoid.configuration.text, plasmoid.configuration.interval,
awKeys.initTooltip(tooltipSettings) plasmoid.configuration.queueLimit)
awKeys.setPopupEnabled(plasmoid.configuration.notify) awKeys.initDataAggregator(tooltipSettings)
awKeys.setTranslateStrings(plasmoid.configuration.translateStrings)
awKeys.setWrapNewLines(plasmoid.configuration.wrapNewLines) awKeys.setWrapNewLines(plasmoid.configuration.wrapNewLines)
// configure aggregator
awKeys.setAggregatorProperty("acOffline", plasmoid.configuration.acOffline)
awKeys.setAggregatorProperty("acOnline", plasmoid.configuration.acOnline)
awKeys.setAggregatorProperty("customTime", plasmoid.configuration.customTime)
awKeys.setAggregatorProperty("customUptime", plasmoid.configuration.customUptime)
awKeys.setAggregatorProperty("tempUnits", plasmoid.configuration.tempUnits)
awKeys.setAggregatorProperty("translate", plasmoid.configuration.translateStrings)
} }
function action_checkUpdates() { function action_checkUpdates() {
if (debug) console.debug() if (debug) console.debug()
return awActions.checkUpdates() return awActions.checkUpdates(true)
} }
function action_showReadme() { function action_showReadme() {
@ -245,15 +213,10 @@ Item {
return awActions.showReadme() return awActions.showReadme()
} }
function action_report() {
if (debug) console.debug()
return awActions.sendEmail()
}
function action_requestKey() { function action_requestKey() {
if (debug) console.debug() if (debug) console.debug()
return awKeys.graphicalValueByKey() tagSelectorBox.model = awKeys.dictKeys(true)
return tagSelector.open()
} }
} }

View File

@ -27,7 +27,7 @@ Item {
id: tooltipPage id: tooltipPage
// backend // backend
AWActions { AWActions {
id: awActions; id: awActions
} }
width: childrenRect.width width: childrenRect.width
@ -64,7 +64,7 @@ Item {
horizontalAlignment: Text.AlignHCenter horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
wrapMode: Text.WordWrap wrapMode: Text.WordWrap
text: i18n("CPU, CPU clock, memory, swap and network labels support graphical tooltip. To enable them just make needed checkbox fully checked.") text: i18n("CPU, CPU clock, memory, swap and network labels support graphical tooltip. To enable them just make needed checkbox checked.")
} }
Row { Row {
@ -87,431 +87,333 @@ Item {
} }
} }
Row { QtControls.GroupBox {
id: useTooltipBackground
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
QtControls.Label { checkable: true
height: parent.height title: i18n("Background")
width: parent.width * 2 / 5 - useTooltipBackground.width Row {
horizontalAlignment: Text.AlignRight height: implicitHeight
verticalAlignment: Text.AlignVCenter width: parent.width
text: i18n("Background") QtControls.Label {
} height: parent.height
QtControls.CheckBox { width: parent.width * 2 / 5
id: useTooltipBackground horizontalAlignment: Text.AlignRight
height: parent.height verticalAlignment: Text.AlignVCenter
width: implicitWidth text: i18n("Background color")
style: QtStyles.CheckBoxStyle { }
indicator: Rectangle { QtControls.Button {
implicitWidth: 16 id: tooltipBackground
implicitHeight: 16 width: parent.width * 3 / 5
radius: 3 style: QtStyles.ButtonStyle {
border.width: 1 background: Rectangle {
border.color: control.activeFocus ? "darkblue" : "gray" color: plasmoid.configuration.tooltipBackground
Rectangle {
visible: control.checked
radius: 1
anchors.fill: parent
anchors.margins: 4
color: "#555555"
border.color: "#333333"
} }
} }
text: plasmoid.configuration.tooltipBackground
onClicked: tooltipBackgroundDialog.visible = true
} }
}
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 { QtDialogs.ColorDialog {
id: tooltipBackgroundDialog id: tooltipBackgroundDialog
title: i18n("Select a color") title: i18n("Select a color")
color: tooltipBackground.text color: tooltipBackground.text
onAccepted: tooltipBackground.text = tooltipBackgroundDialog.color onAccepted: tooltipBackground.text = tooltipBackgroundDialog.color
}
} }
} }
Row { QtControls.GroupBox {
id: cpuTooltip
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
QtControls.Label { checkable: true
height: parent.height title: i18n("CPU")
width: parent.width * 2 / 5 - cpuTooltip.width Row {
horizontalAlignment: Text.AlignRight height: implicitHeight
verticalAlignment: Text.AlignVCenter width: parent.width
text: i18n("CPU color") QtControls.Label {
} height: parent.height
QtControls.CheckBox { width: parent.width * 2 / 5
id: cpuTooltip horizontalAlignment: Text.AlignRight
height: parent.height verticalAlignment: Text.AlignVCenter
width: implicitWidth text: i18n("CPU color")
style: QtStyles.CheckBoxStyle { }
indicator: Rectangle { QtControls.Button {
implicitWidth: 16 id: cpuTooltipColor
implicitHeight: 16 width: parent.width * 3 / 5
radius: 3 style: QtStyles.ButtonStyle {
border.width: 1 background: Rectangle {
border.color: control.activeFocus ? "darkblue" : "gray" color: plasmoid.configuration.cpuTooltipColor
Rectangle {
visible: control.checked
radius: 1
anchors.fill: parent
anchors.margins: 4
color: "#555555"
border.color: "#333333"
} }
} }
text: plasmoid.configuration.cpuTooltipColor
onClicked: cpuTooltipColorDialog.visible = true
} }
}
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 { QtDialogs.ColorDialog {
id: cpuTooltipColorDialog id: cpuTooltipColorDialog
title: i18n("Select a color") title: i18n("Select a color")
color: cpuTooltipColor.text color: cpuTooltipColor.text
onAccepted: cpuTooltipColor.text = cpuTooltipColorDialog.color onAccepted: cpuTooltipColor.text = cpuTooltipColorDialog.color
}
} }
} }
Row { QtControls.GroupBox {
id: cpuclTooltip
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
QtControls.Label { checkable: true
height: parent.height title: i18n("CPU clock")
width: parent.width * 2 / 5 - cpuclTooltip.width Row {
horizontalAlignment: Text.AlignRight height: implicitHeight
verticalAlignment: Text.AlignVCenter width: parent.width
text: i18n("CPU clock color") QtControls.Label {
} height: parent.height
QtControls.CheckBox { width: parent.width * 2 / 5
id: cpuclTooltip horizontalAlignment: Text.AlignRight
height: parent.height verticalAlignment: Text.AlignVCenter
width: implicitWidth text: i18n("CPU clock color")
style: QtStyles.CheckBoxStyle { }
indicator: Rectangle { QtControls.Button {
implicitWidth: 16 id: cpuclTooltipColor
implicitHeight: 16 width: parent.width * 3 / 5
radius: 3 style: QtStyles.ButtonStyle {
border.width: 1 background: Rectangle {
border.color: control.activeFocus ? "darkblue" : "gray" color: plasmoid.configuration.cpuclTooltipColor
Rectangle {
visible: control.checked
radius: 1
anchors.fill: parent
anchors.margins: 4
color: "#555555"
border.color: "#333333"
} }
} }
text: plasmoid.configuration.cpuclTooltipColor
onClicked: cpuclTooltipColorDialog.visible = true
} }
}
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 { QtDialogs.ColorDialog {
id: cpuclTooltipColorDialog id: cpuclTooltipColorDialog
title: i18n("Select a color") title: i18n("Select a color")
color: cpuclTooltipColor.text color: cpuclTooltipColor.text
onAccepted: cpuclTooltipColor.text = cpuclTooltipColorDialog.color onAccepted: cpuclTooltipColor.text = cpuclTooltipColorDialog.color
}
} }
} }
Row { QtControls.GroupBox {
id: memTooltip
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
QtControls.Label { checkable: true
height: parent.height title: i18n("Memory")
width: parent.width * 2 / 5 - memTooltip.width Row {
horizontalAlignment: Text.AlignRight height: implicitHeight
verticalAlignment: Text.AlignVCenter width: parent.width
text: i18n("Memory color") QtControls.Label {
} height: parent.height
QtControls.CheckBox { width: parent.width * 2 / 5
id: memTooltip horizontalAlignment: Text.AlignRight
height: parent.height verticalAlignment: Text.AlignVCenter
width: implicitWidth text: i18n("Memory color")
style: QtStyles.CheckBoxStyle { }
indicator: Rectangle { QtControls.Button {
implicitWidth: 16 id: memTooltipColor
implicitHeight: 16 width: parent.width * 3 / 5
radius: 3 style: QtStyles.ButtonStyle {
border.width: 1 background: Rectangle {
border.color: control.activeFocus ? "darkblue" : "gray" color: plasmoid.configuration.memTooltipColor
Rectangle {
visible: control.checked
radius: 1
anchors.fill: parent
anchors.margins: 4
color: "#555555"
border.color: "#333333"
} }
} }
text: plasmoid.configuration.memTooltipColor
onClicked: memTooltipColorDialog.visible = true
} }
}
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 { QtDialogs.ColorDialog {
id: memTooltipColorDialog id: memTooltipColorDialog
title: i18n("Select a color") title: i18n("Select a color")
color: memTooltipColor.text color: memTooltipColor.text
onAccepted: memTooltipColor.text = memTooltipColorDialog.color onAccepted: memTooltipColor.text = memTooltipColorDialog.color
}
} }
} }
Row { QtControls.GroupBox {
id: swapTooltip
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
QtControls.Label { checkable: true
height: parent.height title: i18n("Swap")
width: parent.width * 2 / 5 - swapTooltip.width Row {
horizontalAlignment: Text.AlignRight height: implicitHeight
verticalAlignment: Text.AlignVCenter width: parent.width
text: i18n("Swap color") QtControls.Label {
} height: parent.height
QtControls.CheckBox { width: parent.width * 2 / 5
id: swapTooltip horizontalAlignment: Text.AlignRight
height: parent.height verticalAlignment: Text.AlignVCenter
width: implicitWidth text: i18n("Swap color")
style: QtStyles.CheckBoxStyle { }
indicator: Rectangle { QtControls.Button {
implicitWidth: 16 id: swapTooltipColor
implicitHeight: 16 width: parent.width * 3 / 5
radius: 3 style: QtStyles.ButtonStyle {
border.width: 1 background: Rectangle {
border.color: control.activeFocus ? "darkblue" : "gray" color: plasmoid.configuration.swapTooltipColor
Rectangle {
visible: control.checked
radius: 1
anchors.fill: parent
anchors.margins: 4
color: "#555555"
border.color: "#333333"
} }
} }
text: plasmoid.configuration.swapTooltipColor
onClicked: swapTooltipColorDialog.visible = true
} }
}
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 { QtDialogs.ColorDialog {
id: swapTooltipColorDialog id: swapTooltipColorDialog
title: i18n("Select a color") title: i18n("Select a color")
color: swapTooltipColor.text color: swapTooltipColor.text
onAccepted: swapTooltipColor.text = swapTooltipColorDialog.color onAccepted: swapTooltipColor.text = swapTooltipColorDialog.color
}
} }
} }
Row { QtControls.GroupBox {
id: downTooltip
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
QtControls.Label { checkable: true
height: parent.height title: i18n("Network")
width: parent.width * 2 / 5 - downTooltip.width Column {
horizontalAlignment: Text.AlignRight height: implicitHeight
verticalAlignment: Text.AlignVCenter width: parent.width
text: i18n("Download speed color") Row {
} height: implicitHeight
QtControls.CheckBox { width: parent.width
id: downTooltip QtControls.Label {
height: parent.height height: parent.height
width: implicitWidth width: parent.width * 2 / 5
style: QtStyles.CheckBoxStyle { horizontalAlignment: Text.AlignRight
indicator: Rectangle { verticalAlignment: Text.AlignVCenter
implicitWidth: 16 text: i18n("Download speed color")
implicitHeight: 16 }
radius: 3 QtControls.Button {
border.width: 1 id: downTooltipColor
border.color: control.activeFocus ? "darkblue" : "gray" width: parent.width * 3 / 5
Rectangle { style: QtStyles.ButtonStyle {
visible: control.checked background: Rectangle {
radius: 1 color: plasmoid.configuration.downTooltipColor
anchors.fill: parent }
anchors.margins: 4
color: "#555555"
border.color: "#333333"
} }
text: plasmoid.configuration.downTooltipColor
onClicked: downTooltipColorDialog.visible = true
}
QtDialogs.ColorDialog {
id: downTooltipColorDialog
title: i18n("Select a color")
color: downTooltipColor.text
onAccepted: downTooltipColor.text = downTooltipColorDialog.color
} }
} }
} Row {
QtControls.Button { height: implicitHeight
id: downTooltipColor width: parent.width
width: parent.width * 3 / 5 QtControls.Label {
style: QtStyles.ButtonStyle { height: parent.height
background: Rectangle { width: parent.width * 2 / 5
color: plasmoid.configuration.downTooltipColor horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("Upload speed color")
} }
} QtControls.Button {
text: plasmoid.configuration.downTooltipColor id: upTooltipColor
onClicked: downTooltipColorDialog.visible = true width: parent.width * 3 / 5
} style: QtStyles.ButtonStyle {
background: Rectangle {
QtDialogs.ColorDialog { color: plasmoid.configuration.upTooltipColor
id: downTooltipColorDialog }
title: i18n("Select a color")
color: downTooltipColor.text
onAccepted: downTooltipColor.text = downTooltipColorDialog.color
}
}
Row {
height: implicitHeight
width: parent.width
QtControls.Label {
height: parent.height
width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("Upload speed color")
}
QtControls.Button {
id: upTooltipColor
width: parent.width * 3 / 5
style: QtStyles.ButtonStyle {
background: Rectangle {
color: plasmoid.configuration.upTooltipColor
}
}
text: plasmoid.configuration.upTooltipColor
onClicked: upTooltipColorDialog.visible = true
}
QtDialogs.ColorDialog {
id: upTooltipColorDialog
title: i18n("Select a color")
color: upTooltipColor.text
onAccepted: upTooltipColor.text = upTooltipColorDialog.color
}
}
Row {
height: implicitHeight
width: parent.width
QtControls.Label {
height: parent.height
width: parent.width * 2 / 5 - batTooltip.width
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("Battery active color")
}
QtControls.CheckBox {
id: batTooltip
height: parent.height
width: implicitWidth
style: QtStyles.CheckBoxStyle {
indicator: Rectangle {
implicitWidth: 16
implicitHeight: 16
radius: 3
border.width: 1
border.color: control.activeFocus ? "darkblue" : "gray"
Rectangle {
visible: control.checked
radius: 1
anchors.fill: parent
anchors.margins: 4
color: "#555555"
border.color: "#333333"
} }
text: plasmoid.configuration.upTooltipColor
onClicked: upTooltipColorDialog.visible = true
} }
}
}
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 { QtDialogs.ColorDialog {
id: batTooltipColorDialog id: upTooltipColorDialog
title: i18n("Select a color") title: i18n("Select a color")
color: batTooltipColor.text color: upTooltipColor.text
onAccepted: batTooltipColor.text = batTooltipColorDialog.color onAccepted: upTooltipColor.text = upTooltipColorDialog.color
}
}
} }
} }
Row { QtControls.GroupBox {
id: batTooltip
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
QtControls.Label { checkable: true
height: parent.height title: i18n("Battery")
width: parent.width * 2 / 5 Column {
horizontalAlignment: Text.AlignRight height: implicitHeight
verticalAlignment: Text.AlignVCenter width: parent.width
text: i18n("Battery inactive color") Row {
} height: implicitHeight
QtControls.Button { width: parent.width
id: batInTooltipColor QtControls.Label {
width: parent.width * 3 / 5 height: parent.height
style: QtStyles.ButtonStyle { width: parent.width * 2 / 5
background: Rectangle { horizontalAlignment: Text.AlignRight
color: plasmoid.configuration.batInTooltipColor 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
} }
} }
text: plasmoid.configuration.batInTooltipColor Row {
onClicked: batInTooltipColorDialog.visible = true height: implicitHeight
} width: parent.width
QtControls.Label {
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 { QtDialogs.ColorDialog {
id: batInTooltipColorDialog id: batInTooltipColorDialog
title: i18n("Select a color") title: i18n("Select a color")
color: batInTooltipColor.text color: batInTooltipColor.text
onAccepted: batInTooltipColor.text = batInTooltipColorDialog.color onAccepted: batInTooltipColor.text = batInTooltipColorDialog.color
}
}
} }
} }
} }
Component.onCompleted: { Component.onCompleted: {
if (debug) console.debug() if (debug) console.debug()
} }

View File

@ -17,7 +17,7 @@
import QtQuick 2.0 import QtQuick 2.0
import QtQuick.Controls 1.3 as QtControls import QtQuick.Controls 1.3 as QtControls
import org.kde.plasma.core 2.0 as PlasmaCore import QtQuick.Dialogs 1.2 as QtDialogs
import org.kde.plasma.private.awesomewidget 1.0 import org.kde.plasma.private.awesomewidget 1.0
@ -26,10 +26,10 @@ Item {
id: widgetPage id: widgetPage
// backend // backend
AWKeys { AWKeys {
id: awKeys; id: awKeys
} }
AWActions { AWActions {
id: awActions; id: awActions
} }
width: childrenRect.width width: childrenRect.width
@ -38,35 +38,11 @@ Item {
implicitHeight: pageColumn.implicitHeight implicitHeight: pageColumn.implicitHeight
property bool debug: awActions.isDebugEnabled() property bool debug: awActions.isDebugEnabled()
property variant settings: {
"customTime": plasmoid.configuration.customTime,
"customUptime": plasmoid.configuration.customUptime,
"tempUnits": plasmoid.configuration.tempUnits,
"acOnline": plasmoid.configuration.acOnline,
"acOffline": plasmoid.configuration.acOffline
}
property variant tooltipSettings: {
"tooltipNumber": plasmoid.configuration.tooltipNumber,
"useTooltipBackground": plasmoid.configuration.useTooltipBackground,
"tooltipBackgroung": plasmoid.configuration.tooltipBackgroung,
"cpuTooltip": plasmoid.configuration.cpuTooltip,
"cpuclTooltip": plasmoid.configuration.cpuclTooltip,
"memTooltip": plasmoid.configuration.memTooltip,
"swapTooltip": plasmoid.configuration.swapTooltip,
"downTooltip": plasmoid.configuration.downTooltip,
"upTooltip": plasmoid.configuration.downTooltip,
"batTooltip": plasmoid.configuration.batTooltip,
"cpuTooltipColor": plasmoid.configuration.cpuTooltipColor,
"cpuclTooltipColor": plasmoid.configuration.cpuclTooltipColor,
"memTooltipColor": plasmoid.configuration.memTooltipColor,
"swapTooltipColor": plasmoid.configuration.swapTooltipColor,
"downTooltipColor": plasmoid.configuration.downTooltipColor,
"upTooltipColor": plasmoid.configuration.upTooltipColor,
"batTooltipColor": plasmoid.configuration.batTooltipColor,
"batInTooltipColor": plasmoid.configuration.batInTooltipColor
}
property alias cfg_text: textPattern.text property alias cfg_text: textPattern.text
property bool lock: true
signal needTextUpdate(string newText)
Column { Column {
@ -222,7 +198,7 @@ Item {
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
QtControls.ComboBox { QtControls.ComboBox {
width: (parent.width - addTagButton.width - showValueButton.width - addLambdaButton.width) / 2 width: parent.width * 1 / 5
textRole: "label" textRole: "label"
model: [ model: [
{ {
@ -287,10 +263,10 @@ Item {
} }
QtControls.ComboBox { QtControls.ComboBox {
id: tags id: tags
width: (parent.width - addTagButton.width - showValueButton.width - addLambdaButton.width) / 2 width: parent.width * 1 / 5
} }
QtControls.Button { QtControls.Button {
id: addTagButton width: parent.width * 1 / 5
text: i18n("Add") text: i18n("Add")
onClicked: { onClicked: {
@ -303,7 +279,7 @@ Item {
} }
} }
QtControls.Button { QtControls.Button {
id: showValueButton width: parent.width * 1 / 5
text: i18n("Show value") text: i18n("Show value")
onClicked: { onClicked: {
@ -318,7 +294,7 @@ Item {
} }
} }
QtControls.Button { QtControls.Button {
id: addLambdaButton width: parent.width * 1 / 5
text: i18n("Add lambda") text: i18n("Add lambda")
onClicked: { onClicked: {
@ -335,10 +311,20 @@ Item {
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
QtControls.Button { QtControls.Button {
width: parent.width width: parent.width * 3 / 5
text: i18n("Edit bars") text: i18n("Edit bars")
onClicked: awKeys.editItem("graphicalitem") 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)
awKeys.needToBeUpdated()
}
}
} }
QtControls.TextArea { QtControls.TextArea {
@ -350,48 +336,34 @@ Item {
} }
} }
// we need to initializate DataEngines here too QtDialogs.MessageDialog {
// because we need to get keys and values id: compiledText
PlasmaCore.DataSource { modality: Qt.NonModal
id: systemmonitorDE title: i18n("Preview")
engine: "systemmonitor"
connectedSources: systemmonitorDE.sources
interval: 5000
onNewData: {
if (debug) console.debug("Update source", sourceName)
awKeys.setDataBySource(sourceName, data, settings)
}
} }
PlasmaCore.DataSource {
id: extsysmonDE
engine: "extsysmon"
connectedSources: extsysmonDE.sources
interval: 5000
onNewData: {
if (debug) console.debug("Update source", sourceName)
awKeys.setDataBySource(sourceName, data, settings)
}
}
PlasmaCore.DataSource {
id: timeDE
engine: "time"
connectedSources: ["Local"]
interval: 5000
onNewData: {
if (debug) console.debug("Update source", sourceName)
awKeys.setDataBySource(sourceName, data, settings)
}
}
Component.onCompleted: { Component.onCompleted: {
if (debug) console.debug() if (debug) console.debug()
awKeys.needTextToBeUpdated.connect(needTextUpdate)
// init submodule // init submodule
awKeys.initKeys(plasmoid.configuration.text) awKeys.initKeys(plasmoid.configuration.text, plasmoid.configuration.interval,
plasmoid.configuration.queueLimit)
awKeys.setAggregatorProperty("acOffline", plasmoid.configuration.acOffline)
awKeys.setAggregatorProperty("acOnline", plasmoid.configuration.acOnline)
awKeys.setAggregatorProperty("customTime", plasmoid.configuration.customTime)
awKeys.setAggregatorProperty("customUptime", plasmoid.configuration.customUptime)
awKeys.setAggregatorProperty("tempUnits", plasmoid.configuration.tempUnits)
awKeys.setAggregatorProperty("translate", plasmoid.configuration.translateStrings)
}
onNeedTextUpdate: {
if (lock) return
if (debug) console.debug()
compiledText.text = newText.replace(/&nbsp;/g, " ")
compiledText.open()
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=2.4.0 X-KDE-PluginInfo-Version=3.0.0
X-KDE-PluginInfo-Website=http://arcanis.name/projects/awesome-widgets/ X-KDE-PluginInfo-Website=http://arcanis.name/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

@ -2,22 +2,20 @@ set(PLUGIN_NAME awplugin)
add_definitions(-DTRANSLATION_DOMAIN=\"plasma_applet_org.kde.plasma.awesomewidget\") add_definitions(-DTRANSLATION_DOMAIN=\"plasma_applet_org.kde.plasma.awesomewidget\")
include_directories( include_directories(
${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}
${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}
${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_BINARY_DIR}/../ ${CMAKE_CURRENT_BINARY_DIR}/../
${CMAKE_CURRENT_SOURCE_DIR}/../../${PROJECT_LIBRARY}/ ${CMAKE_CURRENT_SOURCE_DIR}/../../${PROJECT_LIBRARY}/
${PROJECT_TRDPARTY_DIR} ${PROJECT_TRDPARTY_DIR}
${Qt_INCLUDE} ${Qt_INCLUDE}
${Kf5_INCLUDE} ${Kf5_INCLUDE}
) )
file(GLOB SUBPROJECT_SOURCE *.cpp ${PROJECT_TRDPARTY_DIR}/fontdialog/*.cpp ${CMAKE_SOURCE_DIR}/*.cpp) file(GLOB SUBPROJECT_SOURCE *.cpp ${PROJECT_TRDPARTY_DIR}/fontdialog/*.cpp ${CMAKE_SOURCE_DIR}/*.cpp)
file(GLOB SUBPROJECT_UI *.ui)
file(GLOB SUBPROJECT_NOTIFY *.notifyrc) file(GLOB SUBPROJECT_NOTIFY *.notifyrc)
qt5_wrap_ui(SUBPROJECT_UI_HEADER ${SUBPROJECT_UI}) add_library(${PLUGIN_NAME} SHARED ${SUBPROJECT_SOURCE})
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

@ -21,7 +21,6 @@
#include <KNotifications/KNotification> #include <KNotifications/KNotification>
#include <QDesktopServices> #include <QDesktopServices>
#include <QDir>
#include <QJsonDocument> #include <QJsonDocument>
#include <QJsonParseError> #include <QJsonParseError>
#include <QMessageBox> #include <QMessageBox>
@ -30,7 +29,6 @@
#include <QNetworkReply> #include <QNetworkReply>
#include <QProcess> #include <QProcess>
#include <QProcessEnvironment> #include <QProcessEnvironment>
#include <QSettings>
#include <QStandardPaths> #include <QStandardPaths>
#include <fontdialog/fontdialog.h> #include <fontdialog/fontdialog.h>
@ -42,104 +40,109 @@
AWActions::AWActions(QObject *parent) AWActions::AWActions(QObject *parent)
: QObject(parent) : QObject(parent)
{ {
qCDebug(LOG_AW); qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
} }
AWActions::~AWActions() AWActions::~AWActions()
{ {
qCDebug(LOG_AW); qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
} }
void AWActions::checkUpdates() void AWActions::checkUpdates(const bool showAnyway)
{ {
qCDebug(LOG_AW); qCDebug(LOG_AW) << "Show anyway" << showAnyway;
QNetworkAccessManager *manager = new QNetworkAccessManager(this); // showAnyway options requires to show message if no updates found on direct
connect(manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(versionReplyRecieved(QNetworkReply *))); // request. In case of automatic check no message will be shown
QNetworkAccessManager *manager = new QNetworkAccessManager(nullptr);
connect(manager, &QNetworkAccessManager::finished,
[showAnyway, this](QNetworkReply *reply) {
return versionReplyRecieved(reply, showAnyway);
});
manager->get(QNetworkRequest(QUrl(VERSION_API))); manager->get(QNetworkRequest(QUrl(VERSION_API)));
} }
bool AWActions::dropCache() const // HACK: since QML could not use QLoggingCategory I need this hack
{
qCDebug(LOG_AW);
QString fileName = QString("%1/awesomewidgets.ndx")
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation));
return QFile(fileName).remove();
}
bool AWActions::isDebugEnabled() const bool AWActions::isDebugEnabled() const
{ {
qCDebug(LOG_AW);
return LOG_AW().isDebugEnabled(); return LOG_AW().isDebugEnabled();
} }
void AWActions::runCmd(const QString cmd) const bool AWActions::runCmd(const QString cmd) const
{ {
qCDebug(LOG_AW);
qCDebug(LOG_AW) << "Cmd" << cmd; qCDebug(LOG_AW) << "Cmd" << cmd;
QProcess command;
sendNotification(QString("Info"), i18n("Run %1", cmd)); sendNotification(QString("Info"), i18n("Run %1", cmd));
command.startDetached(cmd); return QProcess::startDetached(cmd);
}
void AWActions::sendEmail() const
{
qCDebug(LOG_AW);
} }
// HACK: this method uses variable from version.h
void AWActions::showReadme() const void AWActions::showReadme() const
{ {
qCDebug(LOG_AW);
QDesktopServices::openUrl(QString(HOMEPAGE)); QDesktopServices::openUrl(QString(HOMEPAGE));
} }
// HACK: this method uses variables from version.h
QString AWActions::getAboutText(const QString type) const QString AWActions::getAboutText(const QString type) const
{ {
qCDebug(LOG_AW);
qCDebug(LOG_AW) << "Type" << type; qCDebug(LOG_AW) << "Type" << type;
QString text; QString text;
if (type == QString("header")) if (type == QString("header")) {
text = QString(NAME); text = QString(NAME);
else if (type == QString("version")) } else if (type == QString("version")) {
text = i18n("Version %1 (build date %2)", QString(VERSION), QString(BUILD_DATE)); text = i18n("Version %1 (build date %2)", QString(VERSION),
else if (type == QString("description")) 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"); text = i18n("A set of minimalistic plasmoid widgets");
else if (type == QString("links")) } else if (type == QString("links")) {
text = i18n("Links:") + QString("<br>") + 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>")
QString("<a href=\"%1\">%2</a><br>").arg(QString(REPOSITORY)).arg(i18n("Repository")) + .arg(QString(HOMEPAGE))
QString("<a href=\"%1\">%2</a><br>").arg(QString(BUGTRACKER)).arg(i18n("Bugtracker")) + .arg(i18n("Homepage"))
QString("<a href=\"%1\">%2</a><br>").arg(QString(TRANSLATION)).arg(i18n("Translation issue")) + + QString("<a href=\"%1\">%2</a><br>")
QString("<a href=\"%1\">%2</a><br>").arg(QString(AUR_PACKAGES)).arg(i18n("AUR packages")) + .arg(QString(REPOSITORY))
QString("<a href=\"%1\">%2</a>").arg(QString(OPENSUSE_PACKAGES)).arg(i18n("openSUSE packages")); .arg(i18n("Repository"))
else if (type == QString("copy")) + QString("<a href=\"%1\">%2</a><br>")
text = QString("<small>&copy; %1 <a href=\"mailto:%2\">%3</a><br>").arg(QString(DATE)).arg(QString(EMAIL)).arg(QString(AUTHOR)) + .arg(QString(BUGTRACKER))
i18n("This software is licensed under %1", QString(LICENSE)) + QString("</small>"); .arg(i18n("Bugtracker"))
else if (type == QString("translators")) + 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)); text = i18n("Translators: %1", QString(TRANSLATORS));
else if (type == QString("3rdparty")) { } else if (type == QString("3rdparty")) {
QStringList trdPartyList = QString(TRDPARTY_LICENSE).split(QChar(';'), QString::SkipEmptyParts); QStringList trdPartyList
for (int i=0; i<trdPartyList.count(); i++) = 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)") trdPartyList[i] = QString("<a href=\"%3\">%1</a> (%2 license)")
.arg(trdPartyList.at(i).split(QChar(','))[0]) .arg(trdPartyList.at(i).split(QChar(','))[0])
.arg(trdPartyList.at(i).split(QChar(','))[1]) .arg(trdPartyList.at(i).split(QChar(','))[1])
.arg(trdPartyList.at(i).split(QChar(','))[2]); .arg(trdPartyList.at(i).split(QChar(','))[2]);
text = i18n("This software uses: %1", trdPartyList.join(QString(", "))); text = i18n("This software uses: %1", trdPartyList.join(QString(", ")));
} }
@ -149,15 +152,14 @@ QString AWActions::getAboutText(const QString type) const
QVariantMap AWActions::getFont(const QVariantMap defaultFont) const QVariantMap AWActions::getFont(const QVariantMap defaultFont) const
{ {
qCDebug(LOG_AW);
qCDebug(LOG_AW) << "Default font is" << defaultFont; qCDebug(LOG_AW) << "Default font is" << defaultFont;
QVariantMap fontMap; QVariantMap fontMap;
CFont defaultCFont = CFont(defaultFont[QString("family")].toString(), CFont defaultCFont = CFont(defaultFont[QString("family")].toString(),
defaultFont[QString("size")].toInt(), defaultFont[QString("size")].toInt(), 400, false,
400, false, defaultFont[QString("color")].toString()); defaultFont[QString("color")].toString());
CFont font = CFontDialog::getFont(i18n("Select font"), defaultCFont, CFont font
false, false); = CFontDialog::getFont(i18n("Select font"), defaultCFont, false, false);
fontMap[QString("color")] = font.color().name(); fontMap[QString("color")] = font.color().name();
fontMap[QString("family")] = font.family(); fontMap[QString("family")] = font.family();
fontMap[QString("size")] = font.pointSize(); fontMap[QString("size")] = font.pointSize();
@ -166,98 +168,68 @@ QVariantMap AWActions::getFont(const QVariantMap defaultFont) const
} }
QVariantMap AWActions::readDataEngineConfiguration() const // to avoid additional object definition this method is static
void AWActions::sendNotification(const QString eventId, const QString message)
{ {
qCDebug(LOG_AW);
QString fileName = QStandardPaths::locate(QStandardPaths::ConfigLocation, QString("plasma-dataengine-extsysmon.conf"));
qCInfo(LOG_AW) << "Configuration file" << fileName;
QSettings settings(fileName, QSettings::IniFormat);
QVariantMap configuration;
settings.beginGroup(QString("Configuration"));
configuration[QString("ACPIPATH")] = settings.value(QString("ACPIPATH"), QString("/sys/class/power_supply/"));
configuration[QString("GPUDEV")] = settings.value(QString("GPUDEV"), QString("auto"));
configuration[QString("HDDDEV")] = settings.value(QString("HDDDEV"), QString("all"));
configuration[QString("HDDTEMPCMD")] = settings.value(QString("HDDTEMPCMD"), QString("sudo smartctl -a"));
configuration[QString("MPDADDRESS")] = settings.value(QString("MPDADDRESS"), QString("localhost"));
configuration[QString("MPDPORT")] = 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();
return configuration;
}
void AWActions::writeDataEngineConfiguration(const QVariantMap configuration) const
{
qCDebug(LOG_AW);
QString fileName = QStandardPaths::writableLocation(QStandardPaths::ConfigLocation) + QString("/plasma-dataengine-extsysmon.conf");
QSettings settings(fileName, QSettings::IniFormat);
qCInfo(LOG_AW) << "Configuration file" << settings.fileName();
settings.beginGroup(QString("Configuration"));
settings.setValue(QString("ACPIPATH"), configuration[QString("ACPIPATH")]);
settings.setValue(QString("GPUDEV"), configuration[QString("GPUDEV")]);
settings.setValue(QString("HDDDEV"), configuration[QString("HDDDEV")]);
settings.setValue(QString("HDDTEMPCMD"), configuration[QString("HDDTEMPCMD")]);
settings.setValue(QString("MPDADDRESS"), configuration[QString("MPDADDRESS")]);
settings.setValue(QString("MPDPORT"), configuration[QString("MPDPORT")]);
settings.setValue(QString("MPRIS"), configuration[QString("MPRIS")]);
settings.setValue(QString("PLAYER"), configuration[QString("PLAYER")]);
settings.setValue(QString("PLAYERSYMBOLS"), configuration[QString("PLAYERSYMBOLS")]);
settings.endGroup();
settings.sync();
}
void AWActions::sendNotification(const QString eventId, const QString message,
const bool enablePopup)
{
qCDebug(LOG_AW);
qCDebug(LOG_AW) << "Event" << eventId; qCDebug(LOG_AW) << "Event" << eventId;
qCDebug(LOG_AW) << "Message" << message; qCDebug(LOG_AW) << "Message" << message;
if ((eventId == QString("event")) && (!enablePopup)) return;
KNotification *notification = KNotification::event(eventId, QString("Awesome Widget ::: %1").arg(eventId), message); KNotification *notification = KNotification::event(
notification->setComponentName(QString("plasma-applet-org.kde.plasma.awesome-widget")); eventId, QString("Awesome Widget ::: %1").arg(eventId), message);
notification->setComponentName(
QString("plasma-applet-org.kde.plasma.awesome-widget"));
} }
void AWActions::showUpdates(QString version) const void AWActions::showInfo(const QString version) const
{ {
qCDebug(LOG_AW); qCDebug(LOG_AW) << "Version" << version;
QString text = i18n("You are using the actual version %1", version);
if (!QString(COMMIT_SHA).isEmpty())
text += QString(" (%1)").arg(QString(COMMIT_SHA));
QMessageBox::information(nullptr, i18n("No new version found"), text);
}
void AWActions::showUpdates(const QString version) const
{
qCDebug(LOG_AW) << "Version" << version;
QString text; QString text;
text += i18n("Current version : %1", QString(VERSION)) + QString("\n"); text += i18n("Current version : %1", QString(VERSION));
text += QString(COMMIT_SHA).isEmpty()
? QString("\n")
: QString(" (%1)\n").arg(QString(COMMIT_SHA));
text += i18n("New version : %1", version) + QString("\n\n"); text += i18n("New version : %1", version) + QString("\n\n");
text += i18n("Click \"Ok\" to download"); text += i18n("Click \"Ok\" to download");
int select = QMessageBox::information(nullptr, i18n("There are updates"), text, int select
QMessageBox::Ok | QMessageBox::Cancel); = QMessageBox::information(nullptr, i18n("There are updates"), text,
QMessageBox::Ok | QMessageBox::Cancel);
switch (select) { switch (select) {
case QMessageBox::Ok: case QMessageBox::Ok:
QDesktopServices::openUrl(QString(RELEASES) + version); QDesktopServices::openUrl(QString(RELEASES) + version);
break; break;
case QMessageBox::Cancel:
default:
break;
} }
} }
void AWActions::versionReplyRecieved(QNetworkReply *reply) const void AWActions::versionReplyRecieved(QNetworkReply *reply,
const bool showAnyway) const
{ {
qCDebug(LOG_AW);
qCDebug(LOG_AW) << "Return code" << reply->error(); qCDebug(LOG_AW) << "Return code" << reply->error();
qCDebug(LOG_AW) << "Reply error message" << reply->errorString(); qCDebug(LOG_AW) << "Reply error message" << reply->errorString();
qCDebug(LOG_AW) << "Show anyway" << showAnyway;
QJsonParseError error; QJsonParseError error;
QJsonDocument jsonDoc = QJsonDocument::fromJson(reply->readAll(), &error); QJsonDocument jsonDoc = QJsonDocument::fromJson(reply->readAll(), &error);
reply->deleteLater(); reply->deleteLater();
if ((reply->error() != QNetworkReply::NoError) || if ((reply->error() != QNetworkReply::NoError)
(error.error != QJsonParseError::NoError)) { || (error.error != QJsonParseError::NoError)) {
qCWarning(LOG_AW) << "Parse error" << error.errorString(); qCWarning(LOG_AW) << "Parse error" << error.errorString();
return; return;
} }
@ -268,14 +240,18 @@ void AWActions::versionReplyRecieved(QNetworkReply *reply) const
version.remove(QString("V.")); version.remove(QString("V."));
qCInfo(LOG_AW) << "Found version" << version; qCInfo(LOG_AW) << "Found version" << version;
// FIXME: possible there is a better way to check versions
int old_major = QString(VERSION).split(QChar('.')).at(0).toInt(); int old_major = QString(VERSION).split(QChar('.')).at(0).toInt();
int old_minor = QString(VERSION).split(QChar('.')).at(1).toInt(); int old_minor = QString(VERSION).split(QChar('.')).at(1).toInt();
int old_patch = QString(VERSION).split(QChar('.')).at(2).toInt(); int old_patch = QString(VERSION).split(QChar('.')).at(2).toInt();
int new_major = QString(version).split(QChar('.')).at(0).toInt(); int new_major = QString(version).split(QChar('.')).at(0).toInt();
int new_minor = QString(version).split(QChar('.')).at(1).toInt(); int new_minor = QString(version).split(QChar('.')).at(1).toInt();
int new_patch = QString(version).split(QChar('.')).at(2).toInt(); int new_patch = QString(version).split(QChar('.')).at(2).toInt();
if ((old_major < new_major) || if ((old_major < new_major)
((old_major == new_major) && (old_minor < new_minor)) || || ((old_major == new_major) && (old_minor < new_minor))
((old_major == new_major) && (old_minor == new_minor) && (old_patch < new_patch))) || ((old_major == new_major) && (old_minor == new_minor)
&& (old_patch < new_patch)))
return showUpdates(version); return showUpdates(version);
else if (showAnyway)
return showInfo(version);
} }

View File

@ -20,7 +20,6 @@
#define AWACTIONS_H #define AWACTIONS_H
#include <QObject> #include <QObject>
#include <QVariant>
class QNetworkReply; class QNetworkReply;
@ -32,29 +31,24 @@ class AWActions : public QObject
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();
Q_INVOKABLE bool dropCache() const;
Q_INVOKABLE bool isDebugEnabled() const; Q_INVOKABLE bool isDebugEnabled() const;
Q_INVOKABLE void runCmd(const QString cmd = QString("/usr/bin/true")) const; Q_INVOKABLE bool runCmd(const QString cmd = QString("/usr/bin/true")) const;
Q_INVOKABLE void sendEmail() const;
Q_INVOKABLE void showReadme() const; Q_INVOKABLE void showReadme() const;
// configuration slots // configuration slots
Q_INVOKABLE QString getAboutText(const QString type = QString("header")) const; Q_INVOKABLE QString getAboutText(const QString type
= QString("header")) const;
Q_INVOKABLE QVariantMap getFont(const QVariantMap defaultFont) const; Q_INVOKABLE QVariantMap getFont(const QVariantMap defaultFont) const;
// dataengine
Q_INVOKABLE QVariantMap readDataEngineConfiguration() const;
Q_INVOKABLE void writeDataEngineConfiguration(const QVariantMap configuration) const;
public slots: public slots:
Q_INVOKABLE static void sendNotification(const QString eventId, const QString message, Q_INVOKABLE static void sendNotification(const QString eventId,
const bool enablePopup = false); const QString message);
private slots: private slots:
void showUpdates(QString version) const; void showInfo(const QString version) const;
void versionReplyRecieved(QNetworkReply *reply) const; void showUpdates(const QString version) const;
void versionReplyRecieved(QNetworkReply *reply,
private: const bool showAnyway) const;
}; };

View File

@ -0,0 +1,345 @@
/***************************************************************************
* 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 "awconfighelper.h"
#include <KI18n/KLocalizedString>
#include <QCheckBox>
#include <QDialogButtonBox>
#include <QDir>
#include <QFileDialog>
#include <QMessageBox>
#include <QQmlPropertyMap>
#include <QSettings>
#include <QTextCodec>
#include <QVBoxLayout>
#include "awdebug.h"
AWConfigHelper::AWConfigHelper(QObject *parent)
: QObject(parent)
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
}
AWConfigHelper::~AWConfigHelper()
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
}
bool AWConfigHelper::dropCache() const
{
QString fileName = QString("%1/awesomewidgets.ndx")
.arg(QStandardPaths::writableLocation(
QStandardPaths::GenericCacheLocation));
return QFile(fileName).remove();
}
void AWConfigHelper::exportConfiguration(QObject *nativeConfig) const
{
// 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
QQmlPropertyMap *configuration
= static_cast<QQmlPropertyMap *>(nativeConfig);
settings.beginGroup(QString("plasmoid"));
foreach (QString key, configuration->keys()) {
QVariant value = configuration->value(key);
if (!value.isValid())
continue;
settings.setValue(key, value);
}
settings.endGroup();
// extensions
foreach (QString item, m_dirs) {
QStringList items
= QDir(QString("%1/%2").arg(m_baseDir).arg(item))
.entryList(QStringList() << QString("*.desktop"),
QDir::Files);
settings.beginGroup(item);
foreach (QString it, items)
copyExtensions(it, item, settings, false);
settings.endGroup();
}
// additional files
settings.beginGroup(QString("json"));
// script filters
readFile(settings, QString("filters"),
QString("%1/scripts/awesomewidgets-extscripts-filters.json")
.arg(m_baseDir));
// weather icon settings
readFile(settings, QString("weathers"),
QString("%1/weather/awesomewidgets-extweather-ids.json")
.arg(m_baseDir));
settings.endGroup();
// sync settings
settings.sync();
// show additional message
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
{
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 (selection[QString("extensions")]) {
foreach (QString item, m_dirs) {
settings.beginGroup(item);
foreach (QString it, settings.childGroups())
copyExtensions(it, item, settings, true);
settings.endGroup();
}
}
// additional files
if (selection[QString("adds")]) {
settings.beginGroup(QString("json"));
// script filters
writeFile(settings, QString("filters"),
QString("%1/scripts/awesomewidgets-extscripts-filters.json")
.arg(m_baseDir));
// weather icon settings
writeFile(settings, QString("weathers"),
QString("%1/weather/awesomewidgets-extweather-ids.json")
.arg(m_baseDir));
settings.endGroup();
}
// plasmoid configuration
if (selection[QString("plasmoid")]) {
settings.beginGroup(QString("plasmoid"));
foreach (QString key, settings.childKeys())
configuration[key] = settings.value(key);
settings.endGroup();
}
return configuration;
}
QVariantMap AWConfigHelper::readDataEngineConfiguration() const
{
QString fileName
= QStandardPaths::locate(QStandardPaths::ConfigLocation,
QString("plasma-dataengine-extsysmon.conf"));
qCInfo(LOG_AW) << "Configuration file" << fileName;
QSettings settings(fileName, QSettings::IniFormat);
QVariantMap configuration;
settings.beginGroup(QString("Configuration"));
configuration[QString("ACPIPATH")] = settings.value(
QString("ACPIPATH"), QString("/sys/class/power_supply/"));
configuration[QString("GPUDEV")]
= settings.value(QString("GPUDEV"), QString("auto"));
configuration[QString("HDDDEV")]
= settings.value(QString("HDDDEV"), QString("all"));
configuration[QString("HDDTEMPCMD")]
= settings.value(QString("HDDTEMPCMD"), QString("sudo smartctl -a"));
configuration[QString("MPDADDRESS")]
= settings.value(QString("MPDADDRESS"), QString("localhost"));
configuration[QString("MPDPORT")]
= 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();
qCInfo(LOG_AW) << "Configuration" << configuration;
return configuration;
}
void AWConfigHelper::writeDataEngineConfiguration(
const QVariantMap configuration) const
{
qCDebug(LOG_AW) << "Configuration" << configuration;
QString fileName
= QStandardPaths::writableLocation(QStandardPaths::ConfigLocation)
+ QString("/plasma-dataengine-extsysmon.conf");
QSettings settings(fileName, QSettings::IniFormat);
qCInfo(LOG_AW) << "Configuration file" << settings.fileName();
settings.beginGroup(QString("Configuration"));
settings.setValue(QString("ACPIPATH"), configuration[QString("ACPIPATH")]);
settings.setValue(QString("GPUDEV"), configuration[QString("GPUDEV")]);
settings.setValue(QString("HDDDEV"), configuration[QString("HDDDEV")]);
settings.setValue(QString("HDDTEMPCMD"),
configuration[QString("HDDTEMPCMD")]);
settings.setValue(QString("MPDADDRESS"),
configuration[QString("MPDADDRESS")]);
settings.setValue(QString("MPDPORT"), configuration[QString("MPDPORT")]);
settings.setValue(QString("MPRIS"), configuration[QString("MPRIS")]);
settings.setValue(QString("PLAYER"), configuration[QString("PLAYER")]);
settings.setValue(QString("PLAYERSYMBOLS"),
configuration[QString("PLAYERSYMBOLS")]);
settings.endGroup();
settings.sync();
}
void AWConfigHelper::copyExtensions(const QString item, const QString type,
QSettings &settings,
const bool inverse) const
{
qCDebug(LOG_AW) << "Extension" << item;
qCDebug(LOG_AW) << "Type" << type;
qCDebug(LOG_AW) << "Inverse" << inverse;
settings.beginGroup(item);
QSettings itemSettings(
QString("%1/%2/%3").arg(m_baseDir).arg(type).arg(item),
QSettings::IniFormat);
itemSettings.beginGroup(QString("Desktop Entry"));
if (inverse)
copySettings(settings, itemSettings);
else
copySettings(itemSettings, settings);
itemSettings.endGroup();
settings.endGroup();
if (inverse)
itemSettings.sync();
}
void AWConfigHelper::copySettings(QSettings &from, QSettings &to) const
{
foreach (QString key, from.childKeys())
to.setValue(key, from.value(key));
}
void AWConfigHelper::readFile(QSettings &settings, const QString key,
const QString fileName) const
{
qCDebug(LOG_AW) << "Key" << key;
qCDebug(LOG_AW) << "File" << fileName;
QFile file(fileName);
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
QString text = QString::fromUtf8(file.readAll());
file.close();
settings.setValue(key, text);
} else {
qCWarning(LOG_LIB) << "Could not open" << file.fileName();
}
}
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
{
qCDebug(LOG_AW) << "Key" << key;
qCDebug(LOG_AW) << "File" << fileName;
if (!settings.contains(key))
return;
QFile file(fileName);
if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
QTextStream out(&file);
out.setCodec("UTF-8");
out << settings.value(key).toString().toUtf8();
out.flush();
file.close();
} else {
qCWarning(LOG_LIB) << "Could not open" << file.fileName();
}
}

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 AWCONFIGHELPER_H
#define AWCONFIGHELPER_H
#include <QObject>
#include <QStandardPaths>
class QSettings;
class AWConfigHelper : public QObject
{
Q_OBJECT
public:
explicit AWConfigHelper(QObject *parent = nullptr);
virtual ~AWConfigHelper();
Q_INVOKABLE bool dropCache() const;
Q_INVOKABLE void exportConfiguration(QObject *nativeConfig) const;
Q_INVOKABLE QVariantMap importConfiguration() const;
// dataengine
Q_INVOKABLE QVariantMap readDataEngineConfiguration() const;
Q_INVOKABLE void
writeDataEngineConfiguration(const QVariantMap configuration) const;
private:
// methods
void copyExtensions(const QString item, const QString type,
QSettings &settings, const bool inverse) const;
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
QString m_baseDir = QString("%1/awesomewidgets")
.arg(QStandardPaths::writableLocation(
QStandardPaths::GenericDataLocation));
QStringList m_dirs = QStringList()
<< QString("desktops") << QString("quotes")
<< QString("scripts") << QString("upgrade")
<< QString("weather");
};
#endif /* AWCONFIGHELPER_H */

View File

@ -0,0 +1,326 @@
/***************************************************************************
* 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 "awdataaggregator.h"
#include <KI18n/KLocalizedString>
#include <QtConcurrent/QtConcurrent>
#include <QBuffer>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QPixmap>
#include <math.h>
#include "awactions.h"
#include "awdebug.h"
AWDataAggregator::AWDataAggregator(QObject *parent)
: QObject(parent)
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
// required by signals
qRegisterMetaType<QHash<QString, QString>>("QHash<QString, QString>");
initScene();
connect(this, SIGNAL(updateData(const QHash<QString, QString> &)), this,
SLOT(dataUpdate(const QHash<QString, QString> &)));
}
AWDataAggregator::~AWDataAggregator()
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
delete toolTipScene;
}
QList<float> AWDataAggregator::getData(const QString key) const
{
qCDebug(LOG_AW) << "Key" << key;
return data[QString("%1Tooltip").arg(key)];
}
QString AWDataAggregator::htmlImage(const QPixmap &source) const
{
QByteArray byteArray;
QBuffer buffer(&byteArray);
source.save(&buffer, "PNG");
return byteArray.isEmpty()
? QString()
: QString("<img src=\"data:image/png;base64,%1\"/>")
.arg(QString(byteArray.toBase64()));
}
void AWDataAggregator::setParameters(QVariantMap settings)
{
qCDebug(LOG_AW) << "Settings" << settings;
// cast from QVariantMap to QVariantHash without data lost
configuration = qvariant_cast<QVariantHash>(settings);
m_enablePopup = configuration[QString("notify")].toBool();
counts = 0;
counts += configuration[QString("cpuTooltip")].toInt();
counts += configuration[QString("cpuclTooltip")].toInt();
counts += configuration[QString("memTooltip")].toInt();
counts += configuration[QString("swapTooltip")].toInt();
counts += configuration[QString("downTooltip")].toInt();
counts += configuration[QString("batTooltip")].toInt();
// resize tooltip image
toolTipView->resize(100.0 * counts, 105.0);
boundaries[QString("cpuTooltip")] = 100.0;
boundaries[QString("cpuclTooltip")] = 4000.0;
boundaries[QString("memTooltip")] = 100.0;
boundaries[QString("swapTooltip")] = 100.0;
boundaries[QString("downTooltip")] = 1.0;
boundaries[QString("upTooltip")] = 1.0;
boundaries[QString("batTooltip")] = 100.0;
requiredKeys.clear();
if (configuration[QString("cpuTooltip")].toBool())
requiredKeys.append(QString("cpuTooltip"));
if (configuration[QString("cpuclTooltip")].toBool())
requiredKeys.append(QString("cpuclTooltip"));
if (configuration[QString("memTooltip")].toBool())
requiredKeys.append(QString("memTooltip"));
if (configuration[QString("swapTooltip")].toBool())
requiredKeys.append(QString("swapTooltip"));
if (configuration[QString("downTooltip")].toBool())
requiredKeys.append(QString("downTooltip"));
if (configuration[QString("upTooltip")].toBool())
requiredKeys.append(QString("upTooltip"));
if (configuration[QString("batTooltip")].toBool())
requiredKeys.append(QString("batTooltip"));
// background
toolTipScene->setBackgroundBrush(
configuration[QString("useTooltipBackground")].toBool()
? QBrush(QColor(
configuration[QString("tooltipBackground")].toString()))
: QBrush(Qt::NoBrush));
}
QPixmap AWDataAggregator::tooltipImage()
{
// create image
toolTipScene->clear();
QPen pen;
bool down = false;
foreach (QString key, requiredKeys) {
// create frame
float normX = 100.0 / static_cast<float>(data[key].count());
float normY = 100.0 / (1.5 * boundaries[key]);
float shift = requiredKeys.indexOf(key) * 100.0;
if (down)
shift -= 100.0;
// apply pen color
if (key != QString("batTooltip"))
pen.setColor(
QColor(configuration[QString("%1Color").arg(key)].toString()));
// paint data inside frame
for (int j = 0; j < data[key].count() - 1; j++) {
// some magic here
float x1 = j * normX + shift;
float y1 = -fabs(data[key].at(j)) * normY + 5.0;
float x2 = (j + 1) * normX + shift;
float y2 = -fabs(data[key].at(j + 1)) * normY + 5.0;
if (key == QString("batTooltip")) {
if (data[key].at(j + 1) > 0)
pen.setColor(QColor(
configuration[QString("batTooltipColor")].toString()));
else
pen.setColor(
QColor(configuration[QString("batInTooltipColor")]
.toString()));
}
toolTipScene->addLine(x1, y1, x2, y2, pen);
}
if (key == QString("downTooltip"))
down = true;
}
return toolTipView->grab();
}
void AWDataAggregator::dataUpdate(const QHash<QString, QString> &values)
{
// do not log these arguments
setData(values);
emit(toolTipPainted(htmlImage(tooltipImage())));
}
void AWDataAggregator::checkValue(const QString source, const float value,
const float extremum) const
{
qCDebug(LOG_AW) << "Notification source" << source;
qCDebug(LOG_AW) << "Value" << value;
qCDebug(LOG_AW) << "Called with extremum" << extremum;
if (value >= 0.0) {
if ((m_enablePopup) && (value > extremum)
&& (data[source].last() < extremum))
return AWActions::sendNotification(QString("event"),
notificationText(source, value));
} else {
if ((m_enablePopup) && (value < extremum)
&& (data[source].last() > extremum))
return AWActions::sendNotification(QString("event"),
notificationText(source, value));
}
}
void AWDataAggregator::checkValue(const QString source, const QString current,
const QString received) const
{
qCDebug(LOG_AW) << "Notification source" << source;
qCDebug(LOG_AW) << "Current value" << current;
qCDebug(LOG_AW) << "Received value" << received;
if ((m_enablePopup) && (current != received) && (!received.isEmpty()))
return AWActions::sendNotification(QString("event"),
notificationText(source, received));
}
void AWDataAggregator::initScene()
{
toolTipScene = new QGraphicsScene(nullptr);
toolTipView = new QGraphicsView(toolTipScene);
toolTipView->setStyleSheet(QString("background: transparent"));
toolTipView->setContentsMargins(0, 0, 0, 0);
toolTipView->setFrameShape(QFrame::NoFrame);
toolTipView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
toolTipView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
}
QString AWDataAggregator::notificationText(const QString source,
const float value) const
{
qCDebug(LOG_AW) << "Notification source" << source;
qCDebug(LOG_AW) << "Value" << value;
QString output;
if (source == QString("batTooltip"))
output = value > 0.0 ? i18n("AC online") : i18n("AC offline");
else if (source == QString("cpuTooltip"))
output = i18n("High CPU load");
else if (source == QString("memTooltip"))
output = i18n("High memory usage");
else if (source == QString("swapTooltip"))
output = i18n("Swap is used");
else if (source == QString("gpu"))
output = i18n("High GPU load");
return output;
}
QString AWDataAggregator::notificationText(const QString source,
const QString value) const
{
qCDebug(LOG_AW) << "Notification source" << source;
qCDebug(LOG_AW) << "Value" << value;
QString output;
if (source == QString("netdev"))
output = i18n("Network device has been changed to %1", value);
return output;
}
void AWDataAggregator::setData(const QHash<QString, QString> &values)
{
// do not log these arguments
// battery update requires info is AC online or not
setData(values[QString("ac")] == configuration[QString("acOnline")],
QString("batTooltip"), values[QString("bat")].toFloat());
// usual case
setData(QString("cpuTooltip"), values[QString("cpu")].toFloat(), 90.0);
setData(QString("cpuclTooltip"), values[QString("cpucl")].toFloat());
setData(QString("memTooltip"), values[QString("mem")].toFloat(), 90.0);
setData(QString("swapTooltip"), values[QString("swap")].toFloat(), 0.0);
setData(QString("downTooltip"), values[QString("downkb")].toFloat());
setData(QString("upTooltip"), values[QString("upkb")].toFloat());
// additional check for network device
[this](const QString value) {
checkValue(QString("netdev"), currentNetworkDevice, value);
currentNetworkDevice = value;
}(values[QString("netdev")]);
// additional check for GPU load
[this](const float value) {
checkValue(QString("gpu"), value, 90.0);
currentGPULoad = value;
}(values[QString("gpu")].toFloat());
}
void AWDataAggregator::setData(const QString &source, float value,
const float extremum)
{
qCDebug(LOG_AW) << "Source" << source;
qCDebug(LOG_AW) << "Value" << value;
qCDebug(LOG_AW) << "Called with extremum" << extremum;
if (data[source].count() == 0)
data[source].append(0.0);
else if (data[source].count()
> configuration[QString("tooltipNumber")].toInt())
data[source].removeFirst();
if (isnan(value))
value = 0.0;
// notifications
checkValue(source, value, extremum);
data[source].append(value);
if (source == QString("downTooltip")) {
QList<float> netValues
= data[QString("downTooltip")] + data[QString("upTooltip")];
boundaries[QString("downTooltip")]
= 1.2 * *std::max_element(netValues.cbegin(), netValues.cend());
boundaries[QString("upTooltip")] = boundaries[QString("downTooltip")];
}
}
void AWDataAggregator::setData(const bool dontInvert, const QString &source,
float value)
{
qCDebug(LOG_AW) << "Do not invert value" << dontInvert;
qCDebug(LOG_AW) << "Source" << source;
qCDebug(LOG_AW) << "Value" << value;
// invert values for different battery colours
value = dontInvert ? value : -value;
return setData(source, value, 0.0);
}

View File

@ -0,0 +1,79 @@
/***************************************************************************
* 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 AWTOOLTIP_H
#define AWTOOLTIP_H
#include <QObject>
#include <QVariant>
class QGraphicsScene;
class QGraphicsView;
class QPixmap;
class QThreadPool;
class AWDataAggregator : public QObject
{
Q_OBJECT
public:
explicit AWDataAggregator(QObject *parent = nullptr);
virtual ~AWDataAggregator();
QList<float> getData(const QString key) const;
QString htmlImage(const QPixmap &source) const;
void setParameters(QVariantMap settings);
QPixmap tooltipImage();
signals:
void updateData(const QHash<QString, QString> &values);
void toolTipPainted(const QString image) const;
public slots:
void dataUpdate(const QHash<QString, QString> &values);
private:
// ui
QGraphicsScene *toolTipScene = nullptr;
QGraphicsView *toolTipView = nullptr;
void checkValue(const QString source, const float value,
const float extremum) const;
void checkValue(const QString source, const QString current,
const QString received) const;
void initScene();
QString notificationText(const QString source, const float value) const;
QString notificationText(const QString source, const QString value) const;
// main method
void setData(const QHash<QString, QString> &values);
void setData(const QString &source, float value,
const float extremum = -1.0);
// different signature for battery device
void setData(const bool dontInvert, const QString &source, float value);
// variables
int counts = 0;
QVariantHash configuration;
float currentGPULoad = 0.0;
QString currentNetworkDevice = QString("lo");
QHash<QString, float> boundaries;
QHash<QString, QList<float>> data;
bool m_enablePopup = false;
QStringList requiredKeys;
};
#endif /* AWTOOLTIP_H */

View File

@ -0,0 +1,101 @@
/***************************************************************************
* 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 "awdataengineaggregator.h"
#include <Plasma/DataEngineConsumer>
#include "awdebug.h"
#include "awkeys.h"
AWDataEngineAggregator::AWDataEngineAggregator(QObject *parent,
const int interval)
: QObject(parent)
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
setInterval(interval);
initDataEngines();
}
AWDataEngineAggregator::~AWDataEngineAggregator()
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
// disconnect sources first
disconnectSources();
m_dataEngines.clear();
}
void AWDataEngineAggregator::disconnectSources()
{
foreach (QString dataengine, m_dataEngines.keys())
foreach (QString source, m_dataEngines[dataengine]->sources())
m_dataEngines[dataengine]->disconnectSource(source, parent());
}
void AWDataEngineAggregator::setInterval(const int _interval)
{
qCDebug(LOG_AW) << "Interval" << _interval;
m_interval = _interval;
}
void AWDataEngineAggregator::dropSource(const QString source)
{
qCDebug(LOG_AW) << "Source" << source;
// FIXME there is no possibility to check to which dataengine source
// connected we will try to disconnect it from systemmonitor and extsysmon
m_dataEngines[QString("systemmonitor")]->disconnectSource(source, parent());
m_dataEngines[QString("extsysmon")]->disconnectSource(source, parent());
}
void AWDataEngineAggregator::reconnectSources()
{
m_dataEngines[QString("systemmonitor")]->connectAllSources(parent(),
m_interval);
m_dataEngines[QString("extsysmon")]->connectAllSources(parent(),
m_interval);
m_dataEngines[QString("time")]->connectSource(QString("Local"), parent(),
1000);
}
void AWDataEngineAggregator::initDataEngines()
{
Plasma::DataEngineConsumer *deConsumer = new Plasma::DataEngineConsumer();
m_dataEngines[QString("systemmonitor")]
= deConsumer->dataEngine(QString("systemmonitor"));
m_dataEngines[QString("extsysmon")]
= deConsumer->dataEngine(QString("extsysmon"));
m_dataEngines[QString("time")] = deConsumer->dataEngine(QString("time"));
// additional method required by systemmonitor structure
connect(m_dataEngines[QString("systemmonitor")],
&Plasma::DataEngine::sourceAdded, [this](const QString source) {
static_cast<AWKeys *>(parent())->addDevice(source);
m_dataEngines[QString("systemmonitor")]->connectSource(
source, parent(), m_interval);
});
}

View File

@ -16,49 +16,36 @@
***************************************************************************/ ***************************************************************************/
#ifndef AWTOOLTIP_H #ifndef AWDATAENGINEAGGREGATOR_H
#define AWTOOLTIP_H #define AWDATAENGINEAGGREGATOR_H
#include <Plasma/DataEngine>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QHash>
#include <QObject> #include <QObject>
#include <QPixmap>
#include <QVariant>
class AWToolTip : public QObject class AWDataEngineAggregator : public QObject
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY(int interval MEMBER m_interval WRITE setInterval);
public: public:
explicit AWToolTip(QObject *parent = nullptr, QVariantMap settings = QVariantMap()); explicit AWDataEngineAggregator(QObject *parent = nullptr,
virtual ~AWToolTip(); const int interval = 1000);
QSize getSize() const; virtual ~AWDataEngineAggregator();
QString htmlImage(); void disconnectSources();
QPixmap image(); // properties
void setInterval(const int _interval);
signals: public slots:
void updateData(QHash<QString, QString> values); void dropSource(const QString source);
void toolTipPainted(QString image); void reconnectSources();
private slots:
void dataUpdate(QHash<QString, QString> values);
private: private:
// ui void initDataEngines();
QGraphicsScene *toolTipScene = nullptr; QHash<QString, Plasma::DataEngine *> m_dataEngines;
QGraphicsView *toolTipView = nullptr; int m_interval;
void setData(const QString source, float value,
const bool dontInvert = true);
// variables
int counts = 0;
QVariantHash configuration;
QHash<QString, float> boundaries;
QHash<QString, QList<float>> data;
QStringList requiredKeys;
QSize size;
}; };
#endif /* AWTOOLTIP_H */ #endif /* AWDATAENGINEAGGREGATOR_H */

View File

@ -20,6 +20,7 @@
#include <QtQml> #include <QtQml>
#include "awactions.h" #include "awactions.h"
#include "awconfighelper.h"
#include "awkeys.h" #include "awkeys.h"
@ -28,5 +29,6 @@ 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<AWConfigHelper>(uri, 1, 0, "AWConfigHelper");
qmlRegisterType<AWKeys>(uri, 1, 0, "AWKeys"); qmlRegisterType<AWKeys>(uri, 1, 0, "AWKeys");
} }

File diff suppressed because it is too large Load Diff

View File

@ -19,21 +19,23 @@
#ifndef AWKEYS_H #ifndef AWKEYS_H
#define AWKEYS_H #define AWKEYS_H
#include <QHash> #include <Plasma/DataEngine>
#include <QMutex>
#include <QObject> #include <QObject>
#include <QStringList>
#include <QVariant>
#include "extitemaggregator.h" #include "extitemaggregator.h"
#include "version.h"
class AWToolTip; class AWDataAggregator;
class AWDataEngineAggregator;
class AWKeysAggregator;
class ExtQuotes; class ExtQuotes;
class ExtScript; class ExtScript;
class ExtUpgrade; class ExtUpgrade;
class ExtWeather; class ExtWeather;
class GraphicalItem; class GraphicalItem;
class QThreadPool;
class AWKeys : public QObject class AWKeys : public QObject
{ {
@ -42,27 +44,30 @@ class AWKeys : public QObject
public: public:
explicit AWKeys(QObject *parent = nullptr); explicit AWKeys(QObject *parent = nullptr);
virtual ~AWKeys(); virtual ~AWKeys();
Q_INVOKABLE void initDataAggregator(const QVariantMap tooltipParams);
Q_INVOKABLE void initKeys(const QString currentPattern); Q_INVOKABLE void initKeys(const QString currentPattern, const int interval,
Q_INVOKABLE void initTooltip(const QVariantMap tooltipParams); const int limit);
Q_INVOKABLE void setPopupEnabled(const bool popup = false); Q_INVOKABLE void setAggregatorProperty(const QString key,
Q_INVOKABLE void setTranslateStrings(const bool translate = false); const QVariant value);
Q_INVOKABLE void setWrapNewLines(const bool wrap = false); Q_INVOKABLE void setWrapNewLines(const bool wrap = false);
Q_INVOKABLE QSize toolTipSize() const; Q_INVOKABLE void updateCache();
// keys // keys
Q_INVOKABLE void addDevice(const QString source);
Q_INVOKABLE QStringList dictKeys(const bool sorted = false, Q_INVOKABLE QStringList dictKeys(const bool sorted = false,
const QString regexp = QString()) const; const QString regexp = QString()) const;
Q_INVOKABLE QStringList getHddDevices() const; Q_INVOKABLE QStringList getHddDevices() const;
Q_INVOKABLE void setDataBySource(const QString sourceName, const QVariantMap data,
const QVariantMap params);
// values // values
Q_INVOKABLE void graphicalValueByKey() const;
Q_INVOKABLE QString infoByKey(QString key) const; Q_INVOKABLE QString infoByKey(QString key) const;
Q_INVOKABLE QString valueByKey(QString key) const; Q_INVOKABLE QString valueByKey(QString key) const;
// configuration // configuration
Q_INVOKABLE void editItem(const QString type); Q_INVOKABLE void editItem(const QString type);
public slots:
void addDevice(const QString source);
void dataUpdated(const QString &sourceName,
const Plasma::DataEngine::Data &data);
// dummy method required by DataEngine connections
void modelChanged(QString, QAbstractItemModel *){};
signals: signals:
void dropSourceFromDataengine(const QString source); void dropSourceFromDataengine(const QString source);
void needTextToBeUpdated(const QString newText) const; void needTextToBeUpdated(const QString newText) const;
@ -70,31 +75,34 @@ signals:
void needToBeUpdated(); void needToBeUpdated();
private slots: private slots:
void dataUpdate();
void loadKeysFromCache(); void loadKeysFromCache();
void reinitKeys(); void reinitKeys();
void updateTextData();
private: private:
// methods // methods
void addKeyToCache(const QString type, const QString key = QString("")); void addKeyToCache(const QString type, const QString key = QString(""));
void calculateLambdas(); void calculateValues();
QString parsePattern() const; QString parsePattern(QString pattern) const;
float temperature(const float temp, const QString units) const; void setDataBySource(const QString &sourceName, const QVariantMap &data);
// get methods // objects
AWToolTip *toolTip = nullptr; AWDataAggregator *dataAggregator = nullptr;
bool enablePopup = false; AWDataEngineAggregator *dataEngineAggregator = nullptr;
bool translateStrings = false; AWKeysAggregator *aggregator = nullptr;
bool wrapNewLines = false; ExtItemAggregator<GraphicalItem> *graphicalItems = nullptr;
ExtItemAggregator<GraphicalItem> *graphicalItems; ExtItemAggregator<ExtQuotes> *extQuotes = nullptr;
ExtItemAggregator<ExtQuotes> *extQuotes; ExtItemAggregator<ExtScript> *extScripts = nullptr;
ExtItemAggregator<ExtScript> *extScripts; ExtItemAggregator<ExtUpgrade> *extUpgrade = nullptr;
ExtItemAggregator<ExtUpgrade> *extUpgrade; ExtItemAggregator<ExtWeather> *extWeather = nullptr;
ExtItemAggregator<ExtWeather> *extWeather; // variables
QString pattern; QHash<QString, QStringList> m_devices;
QStringList foundBars, foundKeys, foundLambdas; QStringList m_foundBars, m_foundKeys, m_foundLambdas;
QStringList timeKeys = QString(TIME_KEYS).split(QChar(',')); QString m_pattern;
QHash<QString, QString> values; QHash<QString, QString> values;
QStringList diskDevices, hddDevices, mountDevices, networkDevices, tempDevices; bool m_wrapNewLines = false;
// multithread features
QThreadPool *m_threadPool = nullptr;
QMutex m_mutex;
}; };

View File

@ -0,0 +1,542 @@
/***************************************************************************
* 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 "awkeysaggregator.h"
#include <KI18n/KLocalizedString>
#include <QDateTime>
#include <QLocale>
#include <QRegExp>
#include "awdebug.h"
AWKeysAggregator::AWKeysAggregator(QObject *parent)
: QObject(parent)
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
}
AWKeysAggregator::~AWKeysAggregator()
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
}
QString AWKeysAggregator::formater(const QVariant &data,
const QString &key) const
{
qCDebug(LOG_AW) << "Data" << data;
qCDebug(LOG_AW) << "Key" << key;
QString output;
QLocale loc = m_translate ? QLocale::system() : QLocale::c();
// case block
switch (m_formater[key]) {
case Float:
output = QString("%1").arg(data.toFloat(), 5, 'f', 1);
break;
case FloatTwoSymbols:
output = QString("%1").arg(data.toFloat(), 5, 'f', 2);
break;
case Integer:
output = QString("%1").arg(data.toFloat(), 4, 'f', 0);
break;
case IntegerThree:
output = QString("%1").arg(data.toFloat(), 3, 'f', 0);
break;
case List:
output = data.toStringList().join(QChar(','));
break;
case ACFormat:
output = data.toBool() ? m_acOnline : m_acOffline;
break;
case MemGBFormat:
output
= QString("%1").arg(data.toFloat() / (1024.0 * 1024.0), 5, 'f', 1);
break;
case MemMBFormat:
output = QString("%1").arg(data.toFloat() / 1024.0, 5, 'f', 0);
break;
case NetSmartFormat:
output = [](const float value) {
if (value > 1024.0)
return QString("%1").arg(value / 1024.0, 4, 'f', 1);
else
return QString("%1").arg(value, 4, 'f', 0);
}(data.toFloat());
break;
case NetSmartUnits:
if (data.toFloat() > 1024.0)
output = m_translate ? i18n("MB/s") : QString("MB/s");
else
output = m_translate ? i18n("KB/s") : QString("KB/s");
break;
case Quotes:
// first cast
output = QString("%1").arg(data.toDouble(), 0, 'f');
output = output.rightJustified(8, QLatin1Char(' '), true);
break;
case Temperature:
output = QString("%1").arg(temperature(data.toFloat()), 5, 'f', 1);
break;
case Time:
output = data.toDateTime().toString();
break;
case TimeCustom:
output = m_customTime;
[&output, loc, this](const QDateTime dt) {
foreach (QString key, timeKeys)
output.replace(QString("$%1").arg(key), loc.toString(dt, key));
}(data.toDateTime());
break;
case TimeISO:
output = data.toDateTime().toString(Qt::ISODate);
break;
case TimeLong:
output = loc.toString(data.toDateTime(), QLocale::LongFormat);
break;
case TimeShort:
output = loc.toString(data.toDateTime(), QLocale::ShortFormat);
break;
case Uptime:
case UptimeCustom:
output =
[](QString source, const int uptime) {
int seconds = uptime - uptime % 60;
int minutes = seconds / 60 % 60;
int hours = ((seconds / 60) - minutes) / 60 % 24;
int days = (((seconds / 60) - minutes) / 60 - hours) / 24;
source.replace(QString("$dd"),
QString("%1").arg(days, 3, 10, QChar('0')));
source.replace(QString("$d"), QString("%1").arg(days));
source.replace(QString("$hh"),
QString("%1").arg(hours, 2, 10, QChar('0')));
source.replace(QString("$h"), QString("%1").arg(hours));
source.replace(QString("$mm"),
QString("%1").arg(minutes, 2, 10, QChar('0')));
source.replace(QString("$m"), QString("%1").arg(minutes));
return source;
}(m_formater[key] == Uptime ? QString("$ddd$hhh$mmm")
: m_customUptime,
data.toFloat());
break;
case NoFormat:
default:
output = data.toString();
break;
}
return output;
}
QStringList AWKeysAggregator::keysFromSource(const QString &source) const
{
qCDebug(LOG_AW) << "Search for source" << source;
return m_map.values(source);
}
void AWKeysAggregator::setAcOffline(const QString inactive)
{
qCDebug(LOG_AW) << "Inactive AC string" << inactive;
m_acOffline = inactive;
}
void AWKeysAggregator::setAcOnline(const QString active)
{
qCDebug(LOG_AW) << "Active AC string" << active;
m_acOnline = active;
}
void AWKeysAggregator::setCustomTime(const QString customTime)
{
qCDebug(LOG_AW) << "Format" << customTime;
m_customTime = customTime;
}
void AWKeysAggregator::setCustomUptime(const QString customUptime)
{
qCDebug(LOG_AW) << "Format" << customUptime;
m_customUptime = customUptime;
}
void AWKeysAggregator::setDevices(const QHash<QString, QStringList> devices)
{
qCDebug(LOG_AW) << "Devices" << devices;
m_devices = devices;
}
void AWKeysAggregator::setTempUnits(const QString units)
{
qCDebug(LOG_AW) << "Units" << units;
m_tempUnits = units;
}
void AWKeysAggregator::setTranslate(const bool translate)
{
qCDebug(LOG_AW) << "Translate" << translate;
m_translate = translate;
}
// HACK units required to define should the value be calculated as temperature
// or fan data
QStringList AWKeysAggregator::registerSource(const QString &source,
const QString &units)
{
qCDebug(LOG_AW) << "Source" << source;
qCDebug(LOG_AW) << "Units" << units;
// regular expressions
QRegExp cpuRegExp = QRegExp(QString("cpu/cpu.*/TotalLoad"));
QRegExp cpuclRegExp = QRegExp(QString("cpu/cpu.*/clock"));
QRegExp hddrRegExp = QRegExp(QString("disk/.*/Rate/rblk"));
QRegExp hddwRegExp = QRegExp(QString("disk/.*/Rate/wblk"));
QRegExp mountFillRegExp = QRegExp(QString("partitions/.*/filllevel"));
QRegExp mountFreeRegExp = QRegExp(QString("partitions/.*/freespace"));
QRegExp mountUsedRegExp = QRegExp(QString("partitions/.*/usedspace"));
QRegExp netRegExp = QRegExp(
QString("network/interfaces/.*/(receiver|transmitter)/data$"));
if (source == QString("battery/ac")) {
// AC
m_map[source] = QString("ac");
m_formater[QString("ac")] = ACFormat;
} else if (source.startsWith(QString("battery/"))) {
// battery stats
QString key = source;
key.remove(QString("battery/"));
m_map[source] = key;
m_formater[key] = IntegerThree;
} else if (source == QString("cpu/system/TotalLoad")) {
// cpu
m_map[source] = QString("cpu");
m_formater[QString("cpu")] = Float;
} else if (source.contains(cpuRegExp)) {
// cpus
QString key = source;
key.remove(QString("cpu/")).remove(QString("/TotalLoad"));
m_map[source] = key;
m_formater[key] = Float;
} else if (source == QString("cpu/system/AverageClock")) {
// cpucl
m_map[source] = QString("cpucl");
m_formater[QString("cpucl")] = Integer;
} else if (source.contains(cpuclRegExp)) {
// cpucls
QString key = source;
key.remove(QString("cpu/cpu")).remove(QString("/clock"));
key = QString("cpucl%1").arg(key);
m_map[source] = key;
m_formater[key] = Integer;
} else if (source.startsWith(QString("custom"))) {
// custom
QString key = source;
key.remove(QString("custom/"));
m_map[source] = key;
m_formater[key] = NoFormat;
} else if (source == QString("desktop/current/name")) {
// current desktop name
m_map[source] = QString("desktop");
m_formater[QString("desktop")] = NoFormat;
} else if (source == QString("desktop/current/number")) {
// current desktop number
m_map[source] = QString("ndesktop");
m_formater[QString("ndesktop")] = NoFormat;
} else if (source == QString("desktop/total/number")) {
// desktop count
m_map[source] = QString("tdesktops");
m_formater[QString("tdesktops")] = NoFormat;
} else if (source.contains(hddrRegExp)) {
// read speed
QString device = source;
device.remove(QString("/Rate/rblk"));
int index = m_devices[QString("disk")].indexOf(device);
if (index > -1) {
QString key = QString("hddr%1").arg(index);
m_map[source] = key;
m_formater[key] = Integer;
}
} else if (source.contains(hddwRegExp)) {
// write speed
QString device = source;
device.remove(QString("/Rate/wblk"));
int index = m_devices[QString("disk")].indexOf(device);
if (index > -1) {
QString key = QString("hddw%1").arg(index);
m_map[source] = key;
m_formater[key] = Integer;
}
} else if (source == QString("gpu/load")) {
// gpu load
m_map[source] = QString("gpu");
m_formater[QString("gpu")] = Float;
} else if (source == QString("gpu/temperature")) {
// gpu temperature
m_map[source] = QString("gputemp");
m_formater[QString("gputemp")] = Temperature;
} else if (source.contains(mountFillRegExp)) {
// fill level
QString device = source;
device.remove(QString("partitions")).remove(QString("/filllevel"));
int index = m_devices[QString("mount")].indexOf(device);
if (index > -1) {
QString key = QString("hdd%1").arg(index);
m_map[source] = key;
m_formater[key] = Float;
}
} else if (source.contains(mountFreeRegExp)) {
// free space
QString device = source;
device.remove(QString("partitions")).remove(QString("/freespace"));
int index = m_devices[QString("mount")].indexOf(device);
if (index > -1) {
// mb
QString key = QString("hddfreemb%1").arg(index);
m_map[source] = key;
m_formater[key] = MemMBFormat;
// gb
key = QString("hddfreegb%1").arg(index);
m_map.insertMulti(source, key);
m_formater[key] = MemGBFormat;
}
} else if (source.contains(mountUsedRegExp)) {
// used
QString device = source;
device.remove(QString("partitions")).remove(QString("/usedspace"));
int index = m_devices[QString("mount")].indexOf(device);
if (index > -1) {
// mb
QString key = QString("hddmb%1").arg(index);
m_map[source] = key;
m_formater[key] = MemMBFormat;
// gb
key = QString("hddgb%1").arg(index);
m_map.insertMulti(source, key);
m_formater[key] = MemGBFormat;
}
} else if (source.startsWith(QString("hdd/temperature"))) {
// hdd temperature
QString device = source;
device.remove(QString("hdd/temperature"));
int index = m_devices[QString("hdd")].indexOf(device);
if (index > -1) {
QString key = QString("hddtemp%1").arg(index);
m_map[source] = key;
m_formater[key] = Temperature;
}
} else if (source.startsWith(QString("cpu/system/loadavg"))) {
// load average
QString time = source;
time.remove(QString("cpu/system/loadavg"));
QString key = QString("la%1").arg(time);
m_map[source] = key;
m_formater[key] = FloatTwoSymbols;
} else if (source == QString("mem/physical/application")) {
// app memory
// mb
m_map[source] = QString("memmb");
m_formater[QString("memmb")] = MemMBFormat;
// gb
m_map.insertMulti(source, QString("memgb"));
m_formater[QString("memgb")] = MemGBFormat;
} else if (source == QString("mem/physical/free")) {
// free memory
// mb
m_map[source] = QString("memfreemb");
m_formater[QString("memfreemb")] = MemMBFormat;
// gb
m_map.insertMulti(source, QString("memfreegb"));
m_formater[QString("memfreegb")] = MemGBFormat;
} else if (source == QString("mem/physical/used")) {
// used memory
// mb
m_map[source] = QString("memusedmb");
m_formater[QString("memusedmb")] = MemMBFormat;
// gb
m_map.insertMulti(source, QString("memusedgb"));
m_formater[QString("memusedgb")] = MemGBFormat;
} else if (source == QString("network/current/name")) {
// network device
m_map[source] = QString("netdev");
m_formater[QString("netdev")] = NoFormat;
} else if (source.contains(netRegExp)) {
// network speed
QString type = source.contains(QString("receiver")) ? QString("down")
: QString("up");
int index
= m_devices[QString("net")].indexOf(source.split(QChar('/'))[2]);
if (index > -1) {
// kb
QString key = QString("%1kb%2").arg(type).arg(index);
m_map[source] = key;
m_formater[key] = Integer;
// smart
key = QString("%1%2").arg(type).arg(index);
m_map.insertMulti(source, key);
m_formater[key] = NetSmartFormat;
// units
key = QString("%1units%2").arg(type).arg(index);
m_map.insertMulti(source, key);
m_formater[key] = NetSmartUnits;
}
} else if (source.startsWith(QString("upgrade"))) {
// package manager
QString key = source;
key.remove(QString("upgrade/"));
m_map[source] = key;
m_formater[key] = IntegerThree;
} else if (source.startsWith(QString("player"))) {
// player
QString key = source;
key.remove(QString("player/"));
m_map[source] = key;
m_formater[key] = NoFormat;
} else if (source == QString("ps/running/count")) {
// running processes count
m_map[source] = QString("pscount");
m_formater[QString("pscount")] = NoFormat;
} else if (source == QString("ps/running/list")) {
// list of running processes
m_map[source] = QString("ps");
m_formater[QString("ps")] = List;
} else if (source == QString("ps/total/count")) {
// total processes count
m_map[source] = QString("pstotal");
m_formater[QString("pstotal")] = NoFormat;
} else if (source.startsWith(QString("quotes"))) {
// quotes
QString key = source;
key.remove(QString("quotes/"));
m_map[source] = key;
m_formater[key] = Quotes;
} else if (source == QString("mem/swap/free")) {
// free swap
// mb
m_map[source] = QString("swapfreemb");
m_formater[QString("swapfreemb")] = MemMBFormat;
// gb
m_map.insertMulti(source, QString("swapfreegb"));
m_formater[QString("swapfreegb")] = MemGBFormat;
} else if (source == QString("mem/swap/used")) {
// used swap
// mb
m_map[source] = QString("swapmb");
m_formater[QString("swapmb")] = MemMBFormat;
// gb
m_map.insertMulti(source, QString("swapgb"));
m_formater[QString("swapgb")] = MemGBFormat;
} else if (source.startsWith(QString("lmsensors/"))) {
// temperature
int index = m_devices[QString("temp")].indexOf(source);
// FIXME on DE initialization there are no units key
if (units.isEmpty())
return QStringList() << QString("temp%1").arg(index);
if (index > -1) {
QString key = QString("temp%1").arg(index);
m_map[source] = key;
m_formater[key] = units == QString("°C") ? Temperature : Integer;
}
} else if (source == QString("Local")) {
// time
m_map[source] = QString("time");
m_formater[QString("time")] = Time;
// custom time
m_map.insertMulti(source, QString("ctime"));
m_formater[QString("ctime")] = TimeCustom;
// ISO time
m_map.insertMulti(source, QString("isotime"));
m_formater[QString("isotime")] = TimeISO;
// long time
m_map.insertMulti(source, QString("longtime"));
m_formater[QString("longtime")] = TimeLong;
// short time
m_map.insertMulti(source, QString("shorttime"));
m_formater[QString("shorttime")] = TimeShort;
} else if (source == QString("system/uptime")) {
// uptime
m_map[source] = QString("uptime");
m_formater[QString("uptime")] = Uptime;
// custom uptime
m_map.insertMulti(source, QString("cuptime"));
m_formater[QString("cuptime")] = UptimeCustom;
} else if (source.startsWith(QString("weather/temperature"))) {
// temperature
QString key = source;
key.remove(QString("weather/"));
m_map[source] = key;
m_formater[key] = Temperature;
} else if (source.startsWith(QString("weather/"))) {
// other weather
QString key = source;
key.remove(QString("weather/"));
m_map[source] = key;
m_formater[key] = NoFormat;
} else if (source.startsWith(QString("load/load"))) {
// load source
QString key = source;
key.remove(QString("load/"));
m_map[source] = key;
m_formater[key] = Temperature;
}
return keysFromSource(source);
}
float AWKeysAggregator::temperature(const float temp) const
{
qCDebug(LOG_AW) << "Temperature value" << temp;
float converted = temp;
if (m_tempUnits == QString("Celsius")) {
} else if (m_tempUnits == QString("Fahrenheit")) {
converted = temp * 9.0 / 5.0 + 32.0;
} else if (m_tempUnits == QString("Kelvin")) {
converted = temp + 273.15;
} else if (m_tempUnits == QString("Reaumur")) {
converted = temp * 0.8;
} else if (m_tempUnits == QString("cm^-1")) {
converted = (temp + 273.15) * 0.695;
} else if (m_tempUnits == QString("kJ/mol")) {
converted = (temp + 273.15) * 8.31;
} else if (m_tempUnits == QString("kcal/mol")) {
converted = (temp + 273.15) * 1.98;
} else {
qCWarning(LOG_AW) << "Invalid units" << m_tempUnits;
}
return converted;
}

View File

@ -0,0 +1,98 @@
/***************************************************************************
* 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 AWKEYSAGGREGATOR_H
#define AWKEYSAGGREGATOR_H
#include <QHash>
#include <QObject>
#include "version.h"
class AWKeysAggregator : public QObject
{
Q_OBJECT
Q_PROPERTY(QString acOffline MEMBER m_acOffline WRITE setAcOffline);
Q_PROPERTY(QString acOnline MEMBER m_acOnline WRITE setAcOnline);
Q_PROPERTY(QString customTime MEMBER m_customTime WRITE setCustomTime);
Q_PROPERTY(
QString customUptime MEMBER m_customUptime WRITE setCustomUptime);
Q_PROPERTY(QString tempUnits MEMBER m_tempUnits WRITE setTempUnits);
Q_PROPERTY(bool translate MEMBER m_translate WRITE setTranslate);
enum FormaterType {
// general formaters
NoFormat = 0,
Float,
FloatTwoSymbols,
Integer,
IntegerThree,
List,
// unit specific formaters
ACFormat,
MemGBFormat,
MemMBFormat,
NetSmartFormat,
NetSmartUnits,
Quotes,
Temperature,
Time,
TimeCustom,
TimeISO,
TimeLong,
TimeShort,
Uptime,
UptimeCustom
};
public:
explicit AWKeysAggregator(QObject *parent = nullptr);
virtual ~AWKeysAggregator();
// get methods
QString formater(const QVariant &data, const QString &key) const;
QStringList keysFromSource(const QString &source) const;
// set methods
void setAcOffline(const QString inactive);
void setAcOnline(const QString active);
void setCustomTime(const QString customTime);
void setCustomUptime(const QString customUptime);
void setDevices(const QHash<QString, QStringList> devices);
void setTempUnits(const QString units);
void setTranslate(const bool translate);
public slots:
QStringList registerSource(const QString &source, const QString &units);
private:
float temperature(const float temp) const;
QStringList timeKeys = QString(TIME_KEYS).split(QChar(','));
// variables
QString m_acOffline;
QString m_acOnline;
QString m_customTime;
QString m_customUptime;
QHash<QString, QStringList> m_devices;
QHash<QString, FormaterType> m_formater;
QHash<QString, QString> m_map;
QString m_tempUnits;
bool m_translate = false;
};
#endif /* AWKEYSAGGREGATOR_H */

View File

@ -1,181 +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 "awtooltip.h"
#include <QBuffer>
#include <math.h>
#include "awdebug.h"
AWToolTip::AWToolTip(QObject *parent, QVariantMap settings)
: QObject(parent),
configuration(qvariant_cast<QVariantHash>(settings))
{
qCDebug(LOG_AW);
toolTipScene = new QGraphicsScene(nullptr);
toolTipView = new QGraphicsView(toolTipScene);
toolTipView->setStyleSheet(QString("background: transparent"));
toolTipView->setContentsMargins(0, 0, 0, 0);
toolTipView->setFrameShape(QFrame::NoFrame);
toolTipView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
toolTipView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
counts += configuration[QString("cpuTooltip")].toInt();
counts += configuration[QString("cpuclTooltip")].toInt();
counts += configuration[QString("memTooltip")].toInt();
counts += configuration[QString("swapTooltip")].toInt();
counts += configuration[QString("downTooltip")].toInt();
counts += configuration[QString("batTooltip")].toInt();
boundaries[QString("cpuTooltip")] = 100.0;
boundaries[QString("cpuclTooltip")] = 4000.0;
boundaries[QString("memTooltip")] = 100.0;
boundaries[QString("swapTooltip")] = 100.0;
boundaries[QString("downTooltip")] = 1.0;
boundaries[QString("upTooltip")] = 1.0;
boundaries[QString("batTooltip")] = 100.0;
size.setHeight(105.0);
size.setWidth(100.0 * counts);
if (configuration[QString("cpuTooltip")].toBool()) requiredKeys.append(QString("cpuTooltip"));
if (configuration[QString("cpuclTooltip")].toBool()) requiredKeys.append(QString("cpuclTooltip"));
if (configuration[QString("memTooltip")].toBool()) requiredKeys.append(QString("memTooltip"));
if (configuration[QString("swapTooltip")].toBool()) requiredKeys.append(QString("swapTooltip"));
if (configuration[QString("downTooltip")].toBool()) requiredKeys.append(QString("downTooltip"));
if (configuration[QString("upTooltip")].toBool()) requiredKeys.append(QString("upTooltip"));
if (configuration[QString("batTooltip")].toBool()) requiredKeys.append(QString("batTooltip"));
connect(this, SIGNAL(updateData(QHash<QString, QString>)),
this, SLOT(dataUpdate(QHash<QString, QString>)));
}
AWToolTip::~AWToolTip()
{
qCDebug(LOG_AW);
delete toolTipScene;
}
void AWToolTip::dataUpdate(QHash<QString, QString> values)
{
qCDebug(LOG_AW);
// battery update requires info is AC online or not
setData(QString("batTooltip"), values[QString("bat")].toFloat(),
values[QString("ac")] == configuration[QString("acOnline")]);
// usual case
setData(QString("cpuTooltip"), values[QString("cpu")].toFloat());
setData(QString("cpuclTooltip"), values[QString("cpucl")].toFloat());
setData(QString("memTooltip"), values[QString("mem")].toFloat());
setData(QString("swapTooltip"), values[QString("swap")].toFloat());
setData(QString("downTooltip"), values[QString("downkb")].toFloat());
setData(QString("upTooltip"), values[QString("upkb")].toFloat());
emit(toolTipPainted(htmlImage()));
}
QSize AWToolTip::getSize() const
{
qCDebug(LOG_AW);
return size;
}
QString AWToolTip::htmlImage()
{
qCDebug(LOG_AW);
QPixmap rawImage = image();
QByteArray byteArray;
QBuffer buffer(&byteArray);
rawImage.save(&buffer, "PNG");
return byteArray.isEmpty() ? QString() :
QString("<img src=\"data:image/png;base64,%1\"/>").arg(QString(byteArray.toBase64()));
}
QPixmap AWToolTip::image()
{
qCDebug(LOG_AW);
toolTipView->resize(size);
// create image
toolTipScene->clear();
QPen pen = QPen();
// background
toolTipScene->setBackgroundBrush(configuration[QString("useTooltipBackground")].toBool() ?
QBrush(QColor(configuration[QString("tooltipBackground")].toString())) :
QBrush(Qt::NoBrush));
bool down = false;
for (int i=0; i<requiredKeys.count(); i++) {
float normX = 100.0 / static_cast<float>(data[requiredKeys.at(i)].count());
float normY = 100.0 / (1.5 * boundaries[requiredKeys.at(i)]);
if (requiredKeys.at(i) != QString("batTooltip"))
pen.setColor(QColor(configuration[QString("%1Color").arg(requiredKeys.at(i))].toString()));
float shift = i * 100.0;
if (down) shift -= 100.0;
for (int j=0; j<data[requiredKeys.at(i)].count()-1; j++) {
// some magic here
float x1 = j * normX + shift;
float y1 = - fabs(data[requiredKeys.at(i)].at(j)) * normY + 5.0;
float x2 = (j + 1) * normX + shift;
float y2 = - fabs(data[requiredKeys.at(i)].at(j+1)) * normY + 5.0;
if (requiredKeys.at(i) == QString("batTooltip")) {
if (data[requiredKeys.at(i)].at(j+1) > 0)
pen.setColor(QColor(configuration[QString("batTooltipColor")].toString()));
else
pen.setColor(QColor(configuration[QString("batInTooltipColor")].toString()));
}
toolTipScene->addLine(x1, y1, x2, y2, pen);
}
if (requiredKeys.at(i) == QString("downTooltip")) down = true;
}
return toolTipView->grab();
}
void AWToolTip::setData(const QString source, float value, const bool dontInvert)
{
qCDebug(LOG_AW);
qCDebug(LOG_AW) << "Source" << source;
qCDebug(LOG_AW) << "Value" << value;
qCDebug(LOG_AW) << "Do not invert value" << dontInvert;
if (data[source].count() == 0)
data[source].append(0.0);
else if (data[source].count() > configuration[QString("tooltipNumber")].toInt())
data[source].takeFirst();
if (isnan(value)) value = 0.0;
// invert values for different battery colours
data[source].append(dontInvert ? value : -value);
if (source == QString("downTooltip")) {
QList<float> netValues = data[QString("downTooltip")] + data[QString("upTooltip")];
boundaries[QString("downTooltip")] = 1.2 * *std::max_element(netValues.cbegin(), netValues.cend());
boundaries[QString("upTooltip")] = boundaries[QString("downTooltip")];
}
}

View File

@ -3,13 +3,13 @@ message(STATUS "Subproject ${SUBPROJECT}")
add_definitions(-DTRANSLATION_DOMAIN=\"plasma_applet_org.kde.plasma.awesomewidget\") add_definitions(-DTRANSLATION_DOMAIN=\"plasma_applet_org.kde.plasma.awesomewidget\")
include_directories( include_directories(
${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}
${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}
${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_BINARY_DIR}/../ ${CMAKE_CURRENT_BINARY_DIR}/../
${PROJECT_TRDPARTY_DIR} ${PROJECT_TRDPARTY_DIR}
${Qt_INCLUDE} ${Qt_INCLUDE}
${Kf5_INCLUDE} ${Kf5_INCLUDE}
) )
file(GLOB SUBPROJECT_SOURCE *.cpp ${PROJECT_TRDPARTY_DIR}/qreplytimeout/*.cpp ${CMAKE_SOURCE_DIR}/*.cpp) file(GLOB SUBPROJECT_SOURCE *.cpp ${PROJECT_TRDPARTY_DIR}/qreplytimeout/*.cpp ${CMAKE_SOURCE_DIR}/*.cpp)
@ -26,10 +26,8 @@ file(RELATIVE_PATH SUBPROJECT_WEATHER_JSON ${CMAKE_SOURCE_DIR} ${SUBPROJECT_WEAT
# prepare # prepare
configure_file(${SUBPROJECT_WEATHER_JSON_IN} ${CMAKE_CURRENT_BINARY_DIR}/${SUBPROJECT_WEATHER_JSON}) configure_file(${SUBPROJECT_WEATHER_JSON_IN} ${CMAKE_CURRENT_BINARY_DIR}/${SUBPROJECT_WEATHER_JSON})
qt5_wrap_cpp(SUBPROJECT_MOC_SOURCE ${SUBPROJECT_HEADER})
qt5_wrap_ui(SUBPROJECT_UI_HEADER ${SUBPROJECT_UI}) qt5_wrap_ui(SUBPROJECT_UI_HEADER ${SUBPROJECT_UI})
add_library(${SUBPROJECT} STATIC ${SUBPROJECT_SOURCE} ${SUBPROJECT_MOC_SOURCE} add_library(${SUBPROJECT} STATIC ${SUBPROJECT_SOURCE} ${SUBPROJECT_HEADER} ${SUBPROJECT_UI_HEADER})
${SUBPROJECT_HEADER} ${SUBPROJECT_UI_HEADER})
target_link_libraries(${SUBPROJECT} ${Qt_LIBRARIES} ${Kf5_LIBRARIES}) target_link_libraries(${SUBPROJECT} ${Qt_LIBRARIES} ${Kf5_LIBRARIES})
# install # install

View File

@ -28,11 +28,11 @@
AbstractExtItem::AbstractExtItem(QWidget *parent, const QString desktopName, AbstractExtItem::AbstractExtItem(QWidget *parent, const QString desktopName,
const QStringList directories) const QStringList directories)
: QDialog(parent), : QDialog(parent)
m_fileName(desktopName), , m_fileName(desktopName)
m_dirs(directories) , m_dirs(directories)
{ {
qCDebug(LOG_LIB); qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
qCDebug(LOG_LIB) << "Desktop name" << desktopName; qCDebug(LOG_LIB) << "Desktop name" << desktopName;
qCDebug(LOG_LIB) << "Directories" << directories; qCDebug(LOG_LIB) << "Directories" << directories;
@ -42,90 +42,67 @@ AbstractExtItem::AbstractExtItem(QWidget *parent, const QString desktopName,
AbstractExtItem::~AbstractExtItem() AbstractExtItem::~AbstractExtItem()
{ {
qCDebug(LOG_LIB); qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
} }
template <class T> template <class T> T *AbstractExtItem::copy(const QString, const int)
T *AbstractExtItem::copy(const QString _fileName, const int _number)
{ {
Q_UNUSED(_fileName)
Q_UNUSED(_number)
qCDebug(LOG_LIB);
// an analog of pure virtual method // an analog of pure virtual method
return new T(); return new T();
} }
int AbstractExtItem::apiVersion() const int AbstractExtItem::apiVersion() const
{ {
qCDebug(LOG_LIB);
return m_apiVersion; return m_apiVersion;
} }
QString AbstractExtItem::comment() const QString AbstractExtItem::comment() const
{ {
qCDebug(LOG_LIB);
return m_comment; return m_comment;
} }
QStringList AbstractExtItem::directories() const QStringList AbstractExtItem::directories() const
{ {
qCDebug(LOG_LIB);
return m_dirs; return m_dirs;
} }
QString AbstractExtItem::fileName() const QString AbstractExtItem::fileName() const
{ {
qCDebug(LOG_LIB);
return m_fileName; return m_fileName;
} }
int AbstractExtItem::interval() const int AbstractExtItem::interval() const
{ {
qCDebug(LOG_LIB);
return m_interval; return m_interval;
} }
bool AbstractExtItem::isActive() const bool AbstractExtItem::isActive() const
{ {
qCDebug(LOG_LIB);
return m_active; return m_active;
} }
QString AbstractExtItem::name() const QString AbstractExtItem::name() const
{ {
qCDebug(LOG_LIB);
return m_name; return m_name;
} }
int AbstractExtItem::number() const int AbstractExtItem::number() const
{ {
qCDebug(LOG_LIB);
return m_number; return m_number;
} }
QString AbstractExtItem::tag(const QString _type) const QString AbstractExtItem::tag(const QString _type) const
{ {
qCDebug(LOG_LIB);
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(m_number);
@ -134,7 +111,6 @@ QString AbstractExtItem::tag(const QString _type) const
void AbstractExtItem::setApiVersion(const int _apiVersion) void AbstractExtItem::setApiVersion(const int _apiVersion)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Version" << _apiVersion; qCDebug(LOG_LIB) << "Version" << _apiVersion;
m_apiVersion = _apiVersion; m_apiVersion = _apiVersion;
@ -143,7 +119,6 @@ void AbstractExtItem::setApiVersion(const int _apiVersion)
void AbstractExtItem::setActive(const bool _state) void AbstractExtItem::setActive(const bool _state)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "State" << _state; qCDebug(LOG_LIB) << "State" << _state;
m_active = _state; m_active = _state;
@ -152,7 +127,6 @@ void AbstractExtItem::setActive(const bool _state)
void AbstractExtItem::setComment(const QString _comment) void AbstractExtItem::setComment(const QString _comment)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Comment" << _comment; qCDebug(LOG_LIB) << "Comment" << _comment;
m_comment = _comment; m_comment = _comment;
@ -161,9 +135,9 @@ void AbstractExtItem::setComment(const QString _comment)
void AbstractExtItem::setInterval(const int _interval) void AbstractExtItem::setInterval(const int _interval)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Interval" << _interval; qCDebug(LOG_LIB) << "Interval" << _interval;
if (_interval <= 0) return; if (_interval <= 0)
return;
m_interval = _interval; m_interval = _interval;
} }
@ -171,7 +145,6 @@ void AbstractExtItem::setInterval(const int _interval)
void AbstractExtItem::setName(const QString _name) void AbstractExtItem::setName(const QString _name)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Name" << _name; qCDebug(LOG_LIB) << "Name" << _name;
m_name = _name; m_name = _name;
@ -180,7 +153,6 @@ void AbstractExtItem::setName(const QString _name)
void AbstractExtItem::setNumber(int _number) void AbstractExtItem::setNumber(int _number)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Number" << _number; qCDebug(LOG_LIB) << "Number" << _number;
if (_number == -1) if (_number == -1)
_number = []() { _number = []() {
@ -197,18 +169,22 @@ void AbstractExtItem::setNumber(int _number)
void AbstractExtItem::readConfiguration() void AbstractExtItem::readConfiguration()
{ {
qCDebug(LOG_LIB); for (int i = m_dirs.count() - 1; i >= 0; i--) {
if (!QDir(m_dirs.at(i)).entryList(QDir::Files).contains(m_fileName))
for (int i=m_dirs.count()-1; i>=0; i--) { continue;
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 settings(QString("%1/%2").arg(m_dirs.at(i)).arg(m_fileName), QSettings::IniFormat); QSettings::IniFormat);
settings.beginGroup(QString("Desktop Entry")); settings.beginGroup(QString("Desktop Entry"));
setName(settings.value(QString("Name"), m_name).toString()); setName(settings.value(QString("Name"), m_name).toString());
setComment(settings.value(QString("Comment"), m_comment).toString()); setComment(settings.value(QString("Comment"), m_comment).toString());
setApiVersion(settings.value(QString("X-AW-ApiVersion"), m_apiVersion).toInt()); setApiVersion(
setActive(settings.value(QString("X-AW-Active"), QVariant(m_active)).toString() == QString("true")); settings.value(QString("X-AW-ApiVersion"), m_apiVersion).toInt());
setInterval(settings.value(QString("X-AW-Interval"), m_interval).toInt()); setActive(settings.value(QString("X-AW-Active"), QVariant(m_active))
.toString()
== QString("true"));
setInterval(
settings.value(QString("X-AW-Interval"), m_interval).toInt());
setNumber(settings.value(QString("X-AW-Number"), m_number).toInt()); setNumber(settings.value(QString("X-AW-Number"), m_number).toInt());
settings.endGroup(); settings.endGroup();
} }
@ -217,25 +193,24 @@ void AbstractExtItem::readConfiguration()
bool AbstractExtItem::tryDelete() const bool AbstractExtItem::tryDelete() const
{ {
qCDebug(LOG_LIB); foreach (QString dir, m_dirs) {
foreach(QString dir, m_dirs) {
bool status = QFile::remove(QString("%1/%2").arg(dir).arg(m_fileName)); bool status = QFile::remove(QString("%1/%2").arg(dir).arg(m_fileName));
qCInfo(LOG_LIB) << "Remove file" << QString("%1/%2").arg(dir).arg(m_fileName) << status; qCInfo(LOG_LIB) << "Remove file"
<< QString("%1/%2").arg(dir).arg(m_fileName) << status;
} }
// check if exists // check if exists
foreach(QString dir, m_dirs) foreach (QString dir, m_dirs)
if (QFile::exists(QString("%1/%2").arg(dir).arg(m_fileName))) return false; if (QFile::exists(QString("%1/%2").arg(dir).arg(m_fileName)))
return false;
return true; return true;
} }
void AbstractExtItem::writeConfiguration() const void AbstractExtItem::writeConfiguration() const
{ {
qCDebug(LOG_LIB); QSettings settings(QString("%1/%2").arg(m_dirs.first()).arg(m_fileName),
QSettings::IniFormat);
QSettings settings(QString("%1/%2").arg(m_dirs.first()).arg(m_fileName), QSettings::IniFormat);
qCInfo(LOG_LIB) << "Configuration file" << settings.fileName(); qCInfo(LOG_LIB) << "Configuration file" << settings.fileName();
settings.beginGroup(QString("Desktop Entry")); settings.beginGroup(QString("Desktop Entry"));

View File

@ -19,7 +19,6 @@
#define ABSTRACTEXTITEM_H #define ABSTRACTEXTITEM_H
#include <QDialog> #include <QDialog>
#include <QInputDialog>
#include <QVariant> #include <QVariant>
@ -37,10 +36,11 @@ class AbstractExtItem : public QDialog
Q_PROPERTY(QString uniq READ uniq) Q_PROPERTY(QString uniq READ uniq)
public: public:
explicit AbstractExtItem(QWidget *parent = nullptr, const QString desktopName = QString(), explicit AbstractExtItem(QWidget *parent = nullptr,
const QString desktopName = QString(),
const QStringList directories = QStringList()); const QStringList directories = QStringList());
virtual ~AbstractExtItem(); virtual ~AbstractExtItem();
template <class T> T *copy(const QString _fileName, const int _number); template <class T> T *copy(const QString, const int);
// get methods // get methods
int apiVersion() const; int apiVersion() const;
QString comment() const; QString comment() const;

View File

@ -29,31 +29,34 @@
AbstractExtItemAggregator::AbstractExtItemAggregator(QWidget *parent) AbstractExtItemAggregator::AbstractExtItemAggregator(QWidget *parent)
: QWidget(parent) : QWidget(parent)
{ {
qCDebug(LOG_LIB); qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
dialog = new QDialog(this); dialog = new QDialog(this);
widgetDialog = new QListWidget(dialog); widgetDialog = new QListWidget(dialog);
dialogButtons = new QDialogButtonBox(QDialogButtonBox::Open | QDialogButtonBox::Close, dialogButtons = new QDialogButtonBox(
Qt::Vertical, dialog); QDialogButtonBox::Open | QDialogButtonBox::Close, Qt::Vertical, dialog);
copyButton = dialogButtons->addButton(i18n("Copy"), QDialogButtonBox::ActionRole); copyButton
createButton = dialogButtons->addButton(i18n("Create"), QDialogButtonBox::ActionRole); = dialogButtons->addButton(i18n("Copy"), QDialogButtonBox::ActionRole);
deleteButton = dialogButtons->addButton(i18n("Remove"), QDialogButtonBox::ActionRole); createButton = dialogButtons->addButton(i18n("Create"),
QDialogButtonBox::ActionRole);
deleteButton = dialogButtons->addButton(i18n("Remove"),
QDialogButtonBox::ActionRole);
QHBoxLayout *layout = new QHBoxLayout(dialog); QHBoxLayout *layout = new QHBoxLayout(dialog);
layout->addWidget(widgetDialog); layout->addWidget(widgetDialog);
layout->addWidget(dialogButtons); layout->addWidget(dialogButtons);
dialog->setLayout(layout); dialog->setLayout(layout);
connect(dialogButtons, SIGNAL(clicked(QAbstractButton *)), connect(dialogButtons, SIGNAL(clicked(QAbstractButton *)), this,
this, SLOT(editItemButtonPressed(QAbstractButton *))); SLOT(editItemButtonPressed(QAbstractButton *)));
connect(dialogButtons, SIGNAL(rejected()), dialog, SLOT(reject())); connect(dialogButtons, SIGNAL(rejected()), dialog, SLOT(reject()));
connect(widgetDialog, SIGNAL(itemActivated(QListWidgetItem *)), connect(widgetDialog, SIGNAL(itemActivated(QListWidgetItem *)), this,
this, SLOT(editItemActivated(QListWidgetItem *))); SLOT(editItemActivated(QListWidgetItem *)));
} }
AbstractExtItemAggregator::~AbstractExtItemAggregator() AbstractExtItemAggregator::~AbstractExtItemAggregator()
{ {
qCDebug(LOG_LIB); qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
delete dialog; delete dialog;
} }
@ -61,14 +64,14 @@ AbstractExtItemAggregator::~AbstractExtItemAggregator()
QString AbstractExtItemAggregator::getName() QString AbstractExtItemAggregator::getName()
{ {
qCDebug(LOG_LIB);
bool ok; bool ok;
QString name = QInputDialog::getText(this, i18n("Enter file name"), QString name = QInputDialog::getText(this, i18n("Enter file name"),
i18n("File name"), QLineEdit::Normal, i18n("File name"), QLineEdit::Normal,
QString(""), &ok); QString(""), &ok);
if ((!ok) || (name.isEmpty())) return QString(""); if ((!ok) || (name.isEmpty()))
if (!name.endsWith(QString(".desktop"))) name += QString(".desktop"); return QString("");
if (!name.endsWith(QString(".desktop")))
name += QString(".desktop");
return name; return name;
} }
@ -76,15 +79,12 @@ QString AbstractExtItemAggregator::getName()
QVariant AbstractExtItemAggregator::configArgs() const QVariant AbstractExtItemAggregator::configArgs() const
{ {
qCDebug(LOG_LIB);
return m_configArgs; return m_configArgs;
} }
void AbstractExtItemAggregator::setConfigArgs(const QVariant _configArgs) void AbstractExtItemAggregator::setConfigArgs(const QVariant _configArgs)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Configuration arguments" << _configArgs; qCDebug(LOG_LIB) << "Configuration arguments" << _configArgs;
m_configArgs = _configArgs; m_configArgs = _configArgs;
@ -94,7 +94,6 @@ void AbstractExtItemAggregator::setConfigArgs(const QVariant _configArgs)
void AbstractExtItemAggregator::editItemActivated(QListWidgetItem *item) void AbstractExtItemAggregator::editItemActivated(QListWidgetItem *item)
{ {
Q_UNUSED(item) Q_UNUSED(item)
qCDebug(LOG_LIB);
return editItem(); return editItem();
} }
@ -102,8 +101,6 @@ void AbstractExtItemAggregator::editItemActivated(QListWidgetItem *item)
void AbstractExtItemAggregator::editItemButtonPressed(QAbstractButton *button) void AbstractExtItemAggregator::editItemButtonPressed(QAbstractButton *button)
{ {
qCDebug(LOG_LIB);
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)

View File

@ -21,12 +21,11 @@
#include <QDialog> #include <QDialog>
#include <QDialogButtonBox> #include <QDialogButtonBox>
#include <QListWidget> #include <QListWidget>
#include <QObject>
#include <QPushButton> #include <QPushButton>
#include <QWidget> #include <QWidget>
// additinal class since QObject macro does not allow class templates // additional class since QObject macro does not allow class templates
class AbstractExtItemAggregator : public QWidget class AbstractExtItemAggregator : public QWidget
{ {
Q_OBJECT Q_OBJECT

View File

@ -9,5 +9,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=2 X-AW-ApiVersion=3
X-AW-Number=3 X-AW-Number=3

View File

@ -9,5 +9,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=2 X-AW-ApiVersion=3
X-AW-Number=0 X-AW-Number=0

View File

@ -9,5 +9,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=2 X-AW-ApiVersion=3
X-AW-Number=1 X-AW-Number=1

View File

@ -9,5 +9,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=2 X-AW-ApiVersion=3
X-AW-Number=2 X-AW-Number=2

View File

@ -24,59 +24,51 @@
#include <QSettings> #include <QSettings>
#include <QStandardPaths> #include <QStandardPaths>
#include "abstractextitemaggregator.h"
#include "awdebug.h" #include "awdebug.h"
#include "abstractextitemaggregator.h"
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)
m_type(type) , m_type(type)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Type" << type;
qSetMessagePattern(LOG_FORMAT); qSetMessagePattern(LOG_FORMAT);
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
foreach (const QString metadata, getBuildData())
qCDebug(LOG_LIB) << metadata;
qCDebug(LOG_LIB) << "Type" << type;
initItems(); initItems();
}; };
virtual ~ExtItemAggregator() virtual ~ExtItemAggregator()
{ {
qCDebug(LOG_LIB); qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
m_items.clear(); m_items.clear();
} m_activeItems.clear();
};
QList<T *> activeItems() { return m_activeItems; };
void editItems() void editItems()
{ {
qCDebug(LOG_LIB);
repaint(); repaint();
int ret = dialog->exec(); int ret = dialog->exec();
qCInfo(LOG_LIB) << "Dialog returns" << ret; qCInfo(LOG_LIB) << "Dialog returns" << ret;
}; };
void initItems()
{
qCDebug(LOG_LIB);
m_items.clear();
m_items = getItems();
};
T *itemByTag(const QString _tag) const T *itemByTag(const QString _tag) const
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Tag" << _tag; qCDebug(LOG_LIB) << "Tag" << _tag;
T *found = nullptr; T *found = nullptr;
foreach(T *item, m_items) { foreach (T *item, m_items) {
if (item->tag() != _tag) continue; if (item->tag() != _tag)
continue;
found = item; found = item;
break; break;
} }
@ -84,16 +76,16 @@ public:
qCWarning(LOG_LIB) << "Could not find item by tag" << _tag; qCWarning(LOG_LIB) << "Could not find item by tag" << _tag;
return found; return found;
} };
T *itemByTagNumber(const int _number) const T *itemByTagNumber(const int _number) const
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Number" << _number; qCDebug(LOG_LIB) << "Number" << _number;
T *found = nullptr; T *found = nullptr;
foreach(T *item, m_items) { foreach (T *item, m_items) {
if (item->number() != _number) continue; if (item->number() != _number)
continue;
found = item; found = item;
break; break;
} }
@ -101,73 +93,71 @@ public:
qCWarning(LOG_LIB) << "Could not find item by number" << _number; qCWarning(LOG_LIB) << "Could not find item by number" << _number;
return found; return found;
} };
T *itemFromWidget() const T *itemFromWidget() const
{ {
qCDebug(LOG_LIB);
QListWidgetItem *widgetItem = widgetDialog->currentItem(); QListWidgetItem *widgetItem = widgetDialog->currentItem();
if (widgetItem == nullptr) return nullptr; if (widgetItem == nullptr)
return nullptr;
T *found = nullptr; T *found = nullptr;
foreach(T *item, m_items) { foreach (T *item, m_items) {
if (item->fileName() != widgetItem->text()) continue; if (item->fileName() != widgetItem->text())
continue;
found = item; found = item;
break; break;
} }
if (found == nullptr) if (found == nullptr)
qCWarning(LOG_LIB) << "Could not find item by name" << widgetItem->text(); qCWarning(LOG_LIB) << "Could not find item by name"
<< widgetItem->text();
return found; return found;
}; };
QList<T *> items() const QList<T *> items() const { return m_items; };
{
qCDebug(LOG_LIB);
return m_items;
};
int uniqNumber() const int uniqNumber() const
{ {
qCDebug(LOG_LIB);
QList<int> tagList; QList<int> tagList;
foreach(T *item, m_items) tagList.append(item->number()); foreach (T *item, m_items)
tagList.append(item->number());
int number = 0; int number = 0;
while (tagList.contains(number)) number++; while (tagList.contains(number))
number++;
return number; return number;
}; };
private: private:
QList<T *> m_items; QList<T *> m_items;
QList<T *> m_activeItems;
QString m_type; QString m_type;
// init method // init method
QList<T *> getItems() QList<T *> getItems()
{ {
qCDebug(LOG_LIB);
// create directory at $HOME // create directory at $HOME
QString localDir = QString("%1/awesomewidgets/%2") QString localDir = QString("%1/awesomewidgets/%2")
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)) .arg(QStandardPaths::writableLocation(
.arg(m_type); QStandardPaths::GenericDataLocation))
.arg(m_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(QStandardPaths::GenericDataLocation, QStringList dirs = QStandardPaths::locateAll(
QString("awesomewidgets/%1").arg(m_type), QStandardPaths::GenericDataLocation,
QStandardPaths::LocateDirectory); QString("awesomewidgets/%1").arg(m_type),
QStandardPaths::LocateDirectory);
QStringList names; QStringList names;
QList<T *> items; QList<T *> items;
foreach(QString dir, dirs) { foreach (QString dir, dirs) {
QStringList files = QDir(dir).entryList(QDir::Files, QDir::Name); QStringList files = QDir(dir).entryList(QDir::Files, QDir::Name);
foreach(QString file, files) { foreach (QString file, files) {
if (!file.endsWith(QString(".desktop"))) continue; if ((!file.endsWith(QString(".desktop")))
if (names.contains(file)) continue; || (names.contains(file)))
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)); items.append(new T(this, file, dirs));
@ -175,19 +165,31 @@ private:
} }
// sort items // sort items
std::sort(items.begin(), items.end(), [](const T *lhs, const T *rhs){ std::sort(items.begin(), items.end(), [](const T *lhs, const T *rhs) {
return lhs->number() < rhs->number(); return lhs->number() < rhs->number();
}); });
return items; return items;
}; };
void initItems()
{
m_items.clear();
m_activeItems.clear();
m_items = getItems();
foreach (T *item, m_items) {
if (!item->isActive())
continue;
m_activeItems.append(item);
}
};
void repaint() void repaint()
{ {
qCDebug(LOG_LIB);
widgetDialog->clear(); widgetDialog->clear();
foreach(T *_item, m_items) { foreach (T *_item, m_items) {
QListWidgetItem *item = new QListWidgetItem(_item->fileName(), widgetDialog); QListWidgetItem *item
= new QListWidgetItem(_item->fileName(), widgetDialog);
QStringList tooltip; QStringList tooltip;
tooltip.append(i18n("Name: %1", _item->name())); tooltip.append(i18n("Name: %1", _item->name()));
tooltip.append(i18n("Comment: %1", _item->comment())); tooltip.append(i18n("Comment: %1", _item->comment()));
@ -200,8 +202,6 @@ private:
// methods // methods
void copyItem() void copyItem()
{ {
qCDebug(LOG_LIB);
T *source = itemFromWidget(); T *source = itemFromWidget();
QString fileName = getName(); QString fileName = getName();
int number = uniqNumber(); int number = uniqNumber();
@ -219,13 +219,12 @@ private:
void createItem() void createItem()
{ {
qCDebug(LOG_LIB);
QString fileName = getName(); QString fileName = getName();
int number = uniqNumber(); int number = uniqNumber();
QStringList dirs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QStringList dirs = QStandardPaths::locateAll(
QString("awesomewidgets/%1").arg(m_type), QStandardPaths::GenericDataLocation,
QStandardPaths::LocateDirectory); QString("awesomewidgets/%1").arg(m_type),
QStandardPaths::LocateDirectory);
if (fileName.isEmpty()) { if (fileName.isEmpty()) {
qCWarning(LOG_LIB) << "Nothing to create"; qCWarning(LOG_LIB) << "Nothing to create";
return; return;
@ -241,8 +240,6 @@ private:
void deleteItem() void deleteItem()
{ {
qCDebug(LOG_LIB);
T *source = itemFromWidget(); T *source = itemFromWidget();
if (source == nullptr) { if (source == nullptr) {
qCWarning(LOG_LIB) << "Nothing to delete"; qCWarning(LOG_LIB) << "Nothing to delete";
@ -257,8 +254,6 @@ private:
void editItem() void editItem()
{ {
qCDebug(LOG_LIB);
T *source = itemFromWidget(); T *source = itemFromWidget();
if (source == nullptr) { if (source == nullptr) {
qCWarning(LOG_LIB) << "Nothing to edit"; qCWarning(LOG_LIB) << "Nothing to edit";

View File

@ -35,10 +35,10 @@
ExtQuotes::ExtQuotes(QWidget *parent, const QString quotesName, ExtQuotes::ExtQuotes(QWidget *parent, const QString quotesName,
const QStringList directories) const QStringList directories)
: AbstractExtItem(parent, quotesName, directories), : AbstractExtItem(parent, quotesName, directories)
ui(new Ui::ExtQuotes) , ui(new Ui::ExtQuotes)
{ {
qCDebug(LOG_LIB); qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
readConfiguration(); readConfiguration();
ui->setupUi(this); ui->setupUi(this);
@ -54,30 +54,33 @@ ExtQuotes::ExtQuotes(QWidget *parent, const QString quotesName,
values[tag(QString("pricechg"))] = 0.0; values[tag(QString("pricechg"))] = 0.0;
values[tag(QString("percpricechg"))] = 0.0; values[tag(QString("percpricechg"))] = 0.0;
manager = new QNetworkAccessManager(this); // HACK declare as child of nullptr to avoid crash with plasmawindowed
connect(manager, SIGNAL(finished(QNetworkReply *)), // in the destructor
this, SLOT(quotesReplyReceived(QNetworkReply *))); manager = new QNetworkAccessManager(nullptr);
connect(manager, SIGNAL(finished(QNetworkReply *)), this,
SLOT(quotesReplyReceived(QNetworkReply *)));
} }
ExtQuotes::~ExtQuotes() ExtQuotes::~ExtQuotes()
{ {
qCDebug(LOG_LIB); qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
disconnect(manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(quotesReplyReceived(QNetworkReply *))); disconnect(manager, SIGNAL(finished(QNetworkReply *)), this,
SLOT(quotesReplyReceived(QNetworkReply *)));
delete manager; manager->deleteLater();
delete ui; delete ui;
} }
ExtQuotes *ExtQuotes::copy(const QString _fileName, const int _number) ExtQuotes *ExtQuotes::copy(const QString _fileName, const int _number)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "File" << _fileName; qCDebug(LOG_LIB) << "File" << _fileName;
qCDebug(LOG_LIB) << "Number" << _number; qCDebug(LOG_LIB) << "Number" << _number;
ExtQuotes *item = new ExtQuotes(static_cast<QWidget *>(parent()), _fileName, directories()); ExtQuotes *item = new ExtQuotes(static_cast<QWidget *>(parent()), _fileName,
directories());
item->setActive(isActive()); item->setActive(isActive());
item->setApiVersion(apiVersion()); item->setApiVersion(apiVersion());
item->setComment(comment()); item->setComment(comment());
@ -92,23 +95,18 @@ ExtQuotes *ExtQuotes::copy(const QString _fileName, const int _number)
QString ExtQuotes::ticker() const QString ExtQuotes::ticker() const
{ {
qCDebug(LOG_LIB);
return m_ticker; return m_ticker;
} }
QString ExtQuotes::uniq() const QString ExtQuotes::uniq() const
{ {
qCDebug(LOG_LIB);
return m_ticker; return m_ticker;
} }
void ExtQuotes::setTicker(const QString _ticker) void ExtQuotes::setTicker(const QString _ticker)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Ticker" << _ticker; qCDebug(LOG_LIB) << "Ticker" << _ticker;
m_ticker = _ticker; m_ticker = _ticker;
@ -117,12 +115,16 @@ void ExtQuotes::setTicker(const QString _ticker)
void ExtQuotes::readConfiguration() void ExtQuotes::readConfiguration()
{ {
qCDebug(LOG_LIB);
AbstractExtItem::readConfiguration(); AbstractExtItem::readConfiguration();
for (int i=directories().count()-1; i>=0; i--) { for (int i = directories().count() - 1; i >= 0; i--) {
if (!QDir(directories().at(i)).entryList(QDir::Files).contains(fileName())) continue; if (!QDir(directories().at(i))
QSettings settings(QString("%1/%2").arg(directories().at(i)).arg(fileName()), QSettings::IniFormat); .entryList(QDir::Files)
.contains(fileName()))
continue;
QSettings settings(
QString("%1/%2").arg(directories().at(i)).arg(fileName()),
QSettings::IniFormat);
settings.beginGroup(QString("Desktop Entry")); settings.beginGroup(QString("Desktop Entry"));
setTicker(settings.value(QString("X-AW-Ticker"), m_ticker).toString()); setTicker(settings.value(QString("X-AW-Ticker"), m_ticker).toString());
@ -131,7 +133,8 @@ void ExtQuotes::readConfiguration()
// update for current API // update for current API
if ((apiVersion() > 0) && (apiVersion() < AWEQAPI)) { if ((apiVersion() > 0) && (apiVersion() < AWEQAPI)) {
qCWarning(LOG_LIB) << "Bump API version from" << apiVersion() << "to" << AWEQAPI; qCWarning(LOG_LIB) << "Bump API version from" << apiVersion() << "to"
<< AWEQAPI;
setApiVersion(AWEQAPI); setApiVersion(AWEQAPI);
writeConfiguration(); writeConfiguration();
} }
@ -140,8 +143,8 @@ void ExtQuotes::readConfiguration()
QVariantHash ExtQuotes::run() QVariantHash ExtQuotes::run()
{ {
qCDebug(LOG_LIB); if ((!isActive()) || (isRunning))
if ((!isActive()) || (isRunning)) return values; return values;
if (times == 1) { if (times == 1) {
qCInfo(LOG_LIB) << "Send request"; qCInfo(LOG_LIB) << "Send request";
@ -151,7 +154,8 @@ QVariantHash ExtQuotes::run()
} }
// update value // update value
if (times >= interval()) times = 0; if (times >= interval())
times = 0;
times++; times++;
return values; return values;
@ -161,17 +165,18 @@ QVariantHash ExtQuotes::run()
int ExtQuotes::showConfiguration(const QVariant args) int ExtQuotes::showConfiguration(const QVariant args)
{ {
Q_UNUSED(args) Q_UNUSED(args)
qCDebug(LOG_LIB);
ui->lineEdit_name->setText(name()); ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment()); ui->lineEdit_comment->setText(comment());
ui->label_numberValue->setText(QString("%1").arg(number())); ui->label_numberValue->setText(QString("%1").arg(number()));
ui->lineEdit_ticker->setText(m_ticker); ui->lineEdit_ticker->setText(m_ticker);
ui->checkBox_active->setCheckState(isActive() ? Qt::Checked : Qt::Unchecked); ui->checkBox_active->setCheckState(isActive() ? Qt::Checked
: Qt::Unchecked);
ui->spinBox_interval->setValue(interval()); ui->spinBox_interval->setValue(interval());
int ret = exec(); int ret = exec();
if (ret != 1) return ret; if (ret != 1)
return ret;
setName(ui->lineEdit_name->text()); setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text()); setComment(ui->lineEdit_comment->text());
setNumber(ui->label_numberValue->text().toInt()); setNumber(ui->label_numberValue->text().toInt());
@ -187,10 +192,11 @@ int ExtQuotes::showConfiguration(const QVariant args)
void ExtQuotes::writeConfiguration() const void ExtQuotes::writeConfiguration() const
{ {
qCDebug(LOG_LIB);
AbstractExtItem::writeConfiguration(); AbstractExtItem::writeConfiguration();
QSettings settings(QString("%1/%2").arg(directories().first()).arg(fileName()), QSettings::IniFormat); QSettings settings(
QString("%1/%2").arg(directories().first()).arg(fileName()),
QSettings::IniFormat);
qCInfo(LOG_LIB) << "Configuration file" << settings.fileName(); qCInfo(LOG_LIB) << "Configuration file" << settings.fileName();
settings.beginGroup(QString("Desktop Entry")); settings.beginGroup(QString("Desktop Entry"));
@ -202,7 +208,6 @@ void ExtQuotes::writeConfiguration() const
void ExtQuotes::quotesReplyReceived(QNetworkReply *reply) void ExtQuotes::quotesReplyReceived(QNetworkReply *reply)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Return code" << reply->error(); qCDebug(LOG_LIB) << "Return code" << reply->error();
qCDebug(LOG_LIB) << "Reply error message" << reply->errorString(); qCDebug(LOG_LIB) << "Reply error message" << reply->errorString();
@ -210,46 +215,62 @@ void ExtQuotes::quotesReplyReceived(QNetworkReply *reply)
QJsonParseError error; QJsonParseError error;
QJsonDocument jsonDoc = QJsonDocument::fromJson(reply->readAll(), &error); QJsonDocument jsonDoc = QJsonDocument::fromJson(reply->readAll(), &error);
reply->deleteLater(); reply->deleteLater();
if ((reply->error() != QNetworkReply::NoError) || if ((reply->error() != QNetworkReply::NoError)
(error.error != QJsonParseError::NoError)) { || (error.error != QJsonParseError::NoError)) {
qCWarning(LOG_LIB) << "Parse error" << error.errorString(); qCWarning(LOG_LIB) << "Parse error" << error.errorString();
return; return;
} }
QVariantMap jsonQuotes = jsonDoc.toVariant().toMap()[QString("query")].toMap(); QVariantMap jsonQuotes
jsonQuotes = jsonQuotes[QString("results")].toMap()[QString("quote")].toMap(); = jsonDoc.toVariant().toMap()[QString("query")].toMap();
float value; jsonQuotes
= jsonQuotes[QString("results")].toMap()[QString("quote")].toMap();
double value;
// ask // ask
value = jsonQuotes[QString("Ask")].toString().toFloat(); value = jsonQuotes[QString("Ask")].toString().toDouble();
values[tag(QString("askchg"))] = values[QString("ask")].toFloat() == 0.0 ? 0.0 : values[tag(QString("askchg"))]
value - values[QString("ask")].toFloat(); = values[QString("ask")].toDouble() == 0.0
values[tag(QString("percaskchg"))] = 100.0 * values[QString("askchg")].toFloat() / values[QString("ask")].toFloat(); ? 0.0
: value - values[QString("ask")].toDouble();
values[tag(QString("percaskchg"))] = 100.0
* values[QString("askchg")].toDouble()
/ values[QString("ask")].toDouble();
values[tag(QString("ask"))] = value; values[tag(QString("ask"))] = value;
// bid // bid
value = jsonQuotes[QString("Bid")].toString().toFloat(); value = jsonQuotes[QString("Bid")].toString().toDouble();
values[tag(QString("bidchg"))] = values[QString("bid")].toFloat() == 0.0 ? 0.0 : values[tag(QString("bidchg"))]
value - values[QString("bid")].toFloat(); = values[QString("bid")].toDouble() == 0.0
values[tag(QString("percbidchg"))] = 100.0 * values[QString("bidchg")].toFloat() / values[QString("bid")].toFloat(); ? 0.0
: value - values[QString("bid")].toDouble();
values[tag(QString("percbidchg"))] = 100.0
* values[QString("bidchg")].toDouble()
/ values[QString("bid")].toDouble();
values[tag(QString("bid"))] = value; values[tag(QString("bid"))] = value;
// last trade // last trade
value = jsonQuotes[QString("LastTradePriceOnly")].toString().toFloat(); value = jsonQuotes[QString("LastTradePriceOnly")].toString().toDouble();
values[tag(QString("pricechg"))] = values[QString("price")].toFloat() == 0.0 ? 0.0 : values[tag(QString("pricechg"))]
value - values[QString("price")].toFloat(); = values[QString("price")].toDouble() == 0.0
values[tag(QString("percpricechg"))] = 100.0 * values[QString("pricechg")].toFloat() / values[QString("price")].toFloat(); ? 0.0
: value - values[QString("price")].toDouble();
values[tag(QString("percpricechg"))]
= 100.0 * values[QString("pricechg")].toDouble()
/ values[QString("price")].toDouble();
values[tag(QString("price"))] = value; values[tag(QString("price"))] = value;
} }
void ExtQuotes::translate() void ExtQuotes::translate()
{ {
qCDebug(LOG_LIB);
ui->label_name->setText(i18n("Name")); ui->label_name->setText(i18n("Name"));
ui->label_comment->setText(i18n("Comment")); ui->label_comment->setText(i18n("Comment"));
ui->label_number->setText(i18n("Tag")); ui->label_number->setText(i18n("Tag"));
ui->label->setText(i18n("<html><head/><body><p>Use YAHOO! finance ticker to get quotes for the instrument. Refer to <a href=\"http://finance.yahoo.com/\"><span style=\" text-decoration: underline; color:#0057ae;\">http://finance.yahoo.com/</span></a></p></body></html>")); ui->label->setText(
i18n("<html><head/><body><p>Use YAHOO! finance ticker to \
get quotes for the instrument. Refer to <a href=\"http://finance.yahoo.com/\">\
<span style=\" text-decoration: underline; color:#0057ae;\">http://finance.yahoo.com/\
</span></a></p></body></html>"));
ui->label_ticker->setText(i18n("Ticker")); ui->label_ticker->setText(i18n("Ticker"));
ui->checkBox_active->setText(i18n("Active")); ui->checkBox_active->setText(i18n("Active"));
ui->label_interval->setText(i18n("Interval")); ui->label_interval->setText(i18n("Interval"));
@ -258,8 +279,6 @@ void ExtQuotes::translate()
QString ExtQuotes::url() const QString ExtQuotes::url() const
{ {
qCDebug(LOG_LIB);
QString apiUrl = QString(YAHOO_URL); QString apiUrl = QString(YAHOO_URL);
apiUrl.replace(QString("$TICKER"), m_ticker); apiUrl.replace(QString("$TICKER"), m_ticker);
qCInfo(LOG_LIB) << "API url" << apiUrl; qCInfo(LOG_LIB) << "API url" << apiUrl;

View File

@ -18,16 +18,20 @@
#ifndef EXTQUOTES_H #ifndef EXTQUOTES_H
#define EXTQUOTES_H #define EXTQUOTES_H
#include <QMap>
#include <QNetworkReply> #include <QNetworkReply>
#include "abstractextitem.h" #include "abstractextitem.h"
#define YAHOO_URL "https://query.yahooapis.com/v1/public/yql?q=select * from yahoo.finance.quotes where symbol=\"$TICKER\"&env=store://datatables.org/alltableswithkeys&format=json" #define YAHOO_URL \
"https://query.yahooapis.com/v1/public/yql?q=select * from " \
"yahoo.finance.quotes where " \
"symbol=\"$TICKER\"&env=store://datatables.org/" \
"alltableswithkeys&format=json"
namespace Ui { namespace Ui
class ExtQuotes; {
class ExtQuotes;
} }
class ExtQuotes : public AbstractExtItem class ExtQuotes : public AbstractExtItem
@ -36,7 +40,8 @@ class ExtQuotes : public AbstractExtItem
Q_PROPERTY(QString ticker READ ticker WRITE setTicker) Q_PROPERTY(QString ticker READ ticker WRITE setTicker)
public: public:
explicit ExtQuotes(QWidget *parent = nullptr, const QString quotesName = QString(), explicit ExtQuotes(QWidget *parent = nullptr,
const QString quotesName = QString(),
const QStringList directories = QStringList()); const QStringList directories = QStringList());
virtual ~ExtQuotes(); virtual ~ExtQuotes();
ExtQuotes *copy(const QString _fileName, const int _number); ExtQuotes *copy(const QString _fileName, const int _number);

View File

@ -92,6 +92,9 @@
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="openExternalLinks">
<bool>true</bool>
</property>
</widget> </widget>
</item> </item>
<item> <item>

View File

@ -33,10 +33,10 @@
ExtScript::ExtScript(QWidget *parent, const QString scriptName, ExtScript::ExtScript(QWidget *parent, const QString scriptName,
const QStringList directories) const QStringList directories)
: AbstractExtItem(parent, scriptName, directories), : AbstractExtItem(parent, scriptName, directories)
ui(new Ui::ExtScript) , ui(new Ui::ExtScript)
{ {
qCDebug(LOG_LIB); qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
readConfiguration(); readConfiguration();
readJsonFilters(); readJsonFilters();
@ -45,34 +45,34 @@ ExtScript::ExtScript(QWidget *parent, const QString scriptName,
value[tag(QString("custom"))] = QString(""); value[tag(QString("custom"))] = QString("");
process = new QProcess(this); process = new QProcess(nullptr);
connect(process, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(updateValue())); connect(process, SIGNAL(finished(int, QProcess::ExitStatus)), this,
SLOT(updateValue()));
process->waitForFinished(0); process->waitForFinished(0);
} }
ExtScript::~ExtScript() ExtScript::~ExtScript()
{ {
qCDebug(LOG_LIB); qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
process->kill(); process->kill();
delete process; process->deleteLater();
delete ui; delete ui;
} }
ExtScript *ExtScript::copy(const QString _fileName, const int _number) ExtScript *ExtScript::copy(const QString _fileName, const int _number)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "File" << _fileName; qCDebug(LOG_LIB) << "File" << _fileName;
qCDebug(LOG_LIB) << "Number" << _number; qCDebug(LOG_LIB) << "Number" << _number;
ExtScript *item = new ExtScript(static_cast<QWidget *>(parent()), _fileName, directories()); ExtScript *item = new ExtScript(static_cast<QWidget *>(parent()), _fileName,
directories());
item->setActive(isActive()); item->setActive(isActive());
item->setApiVersion(apiVersion()); item->setApiVersion(apiVersion());
item->setComment(comment()); item->setComment(comment());
item->setExecutable(executable()); item->setExecutable(executable());
item->setHasOutput(hasOutput());
item->setInterval(interval()); item->setInterval(interval());
item->setName(name()); item->setName(name());
item->setNumber(_number); item->setNumber(_number);
@ -85,56 +85,36 @@ ExtScript *ExtScript::copy(const QString _fileName, const int _number)
QString ExtScript::executable() const QString ExtScript::executable() const
{ {
qCDebug(LOG_LIB);
return m_executable; return m_executable;
} }
QStringList ExtScript::filters() const QStringList ExtScript::filters() const
{ {
qCDebug(LOG_LIB);
return m_filters; return m_filters;
} }
bool ExtScript::hasOutput() const
{
qCDebug(LOG_LIB);
return m_output;
}
QString ExtScript::prefix() const QString ExtScript::prefix() const
{ {
qCDebug(LOG_LIB);
return m_prefix; return m_prefix;
} }
ExtScript::Redirect ExtScript::redirect() const ExtScript::Redirect ExtScript::redirect() const
{ {
qCDebug(LOG_LIB);
return m_redirect; return m_redirect;
} }
QString ExtScript::uniq() const QString ExtScript::uniq() const
{ {
qCDebug(LOG_LIB);
return m_executable; return m_executable;
} }
QString ExtScript::strRedirect() const QString ExtScript::strRedirect() const
{ {
qCDebug(LOG_LIB);
QString value; QString value;
switch (m_redirect) { switch (m_redirect) {
case stdout2stderr: case stdout2stderr:
@ -143,6 +123,9 @@ QString ExtScript::strRedirect() const
case stderr2stdout: case stderr2stdout:
value = QString("stderr2stdout"); value = QString("stderr2stdout");
break; break;
case swap:
value = QString("swap");
break;
case nothing: case nothing:
default: default:
value = QString("nothing"); value = QString("nothing");
@ -155,7 +138,6 @@ QString ExtScript::strRedirect() const
void ExtScript::setExecutable(const QString _executable) void ExtScript::setExecutable(const QString _executable)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Executable" << _executable; qCDebug(LOG_LIB) << "Executable" << _executable;
m_executable = _executable; m_executable = _executable;
@ -164,28 +146,15 @@ void ExtScript::setExecutable(const QString _executable)
void ExtScript::setFilters(const QStringList _filters) void ExtScript::setFilters(const QStringList _filters)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Filters" << _filters; qCDebug(LOG_LIB) << "Filters" << _filters;
std::for_each(_filters.cbegin(), _filters.cend(), std::for_each(_filters.cbegin(), _filters.cend(),
[this](QString filter) { return updateFilter(filter); }); [this](QString filter) { return updateFilter(filter); });
// foreach(QString filter, _filters)
// updateFilter(filter);
}
void ExtScript::setHasOutput(const bool _state)
{
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "State" << _state;
m_output = _state;
} }
void ExtScript::setPrefix(const QString _prefix) void ExtScript::setPrefix(const QString _prefix)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Prefix" << _prefix; qCDebug(LOG_LIB) << "Prefix" << _prefix;
m_prefix = _prefix; m_prefix = _prefix;
@ -194,7 +163,6 @@ void ExtScript::setPrefix(const QString _prefix)
void ExtScript::setRedirect(const Redirect _redirect) void ExtScript::setRedirect(const Redirect _redirect)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Redirect" << _redirect; qCDebug(LOG_LIB) << "Redirect" << _redirect;
m_redirect = _redirect; m_redirect = _redirect;
@ -203,13 +171,14 @@ void ExtScript::setRedirect(const Redirect _redirect)
void ExtScript::setStrRedirect(const QString _redirect) void ExtScript::setStrRedirect(const QString _redirect)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Redirect" << _redirect; qCDebug(LOG_LIB) << "Redirect" << _redirect;
if (_redirect == QString("stdout2sdterr")) if (_redirect == QString("stdout2sdterr"))
m_redirect = stdout2stderr; m_redirect = stdout2stderr;
else if (_redirect == QString("stderr2sdtout")) else if (_redirect == QString("stderr2sdtout"))
m_redirect = stderr2stdout; m_redirect = stderr2stdout;
else if (_redirect == QString("swap"))
m_redirect = swap;
else else
m_redirect = nothing; m_redirect = nothing;
} }
@ -217,17 +186,17 @@ void ExtScript::setStrRedirect(const QString _redirect)
QString ExtScript::applyFilters(QString _value) const QString ExtScript::applyFilters(QString _value) const
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Value" << _value; qCDebug(LOG_LIB) << "Value" << _value;
foreach(QString filt, m_filters) { foreach (QString filt, m_filters) {
qCInfo(LOG_LIB) << "Found filter" << filt; qCInfo(LOG_LIB) << "Found filter" << filt;
QVariantMap filter = jsonFilters[filt].toMap(); QVariantMap filter = jsonFilters[filt].toMap();
if (filter.isEmpty()) { if (filter.isEmpty()) {
qCWarning(LOG_LIB) << "Could not find filter" << _value << "in the json"; qCWarning(LOG_LIB) << "Could not find filter" << _value
<< "in the json";
continue; continue;
} }
foreach(QString f, filter.keys()) foreach (QString f, filter.keys())
_value.replace(f, filter[f].toString()); _value.replace(f, filter[f].toString());
} }
@ -237,12 +206,12 @@ QString ExtScript::applyFilters(QString _value) const
void ExtScript::updateFilter(const QString _filter, const bool _add) void ExtScript::updateFilter(const QString _filter, const bool _add)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Filter" << _filter; qCDebug(LOG_LIB) << "Filter" << _filter;
qCDebug(LOG_LIB) << "Should be added" << _add; qCDebug(LOG_LIB) << "Should be added" << _add;
if (_add) { if (_add) {
if (m_filters.contains(_filter)) return; if (m_filters.contains(_filter))
return;
m_filters.append(_filter); m_filters.append(_filter);
} else { } else {
m_filters.removeOne(_filter); m_filters.removeOne(_filter);
@ -252,30 +221,33 @@ void ExtScript::updateFilter(const QString _filter, const bool _add)
void ExtScript::readConfiguration() void ExtScript::readConfiguration()
{ {
qCDebug(LOG_LIB);
AbstractExtItem::readConfiguration(); AbstractExtItem::readConfiguration();
for (int i=directories().count()-1; i>=0; i--) { for (int i = directories().count() - 1; i >= 0; i--) {
if (!QDir(directories().at(i)).entryList(QDir::Files).contains(fileName())) continue; if (!QDir(directories().at(i))
QSettings settings(QString("%1/%2").arg(directories().at(i)).arg(fileName()), QSettings::IniFormat); .entryList(QDir::Files)
.contains(fileName()))
continue;
QSettings settings(
QString("%1/%2").arg(directories().at(i)).arg(fileName()),
QSettings::IniFormat);
settings.beginGroup(QString("Desktop Entry")); settings.beginGroup(QString("Desktop Entry"));
setExecutable(settings.value(QString("Exec"), m_executable).toString()); setExecutable(settings.value(QString("Exec"), m_executable).toString());
setPrefix(settings.value(QString("X-AW-Prefix"), m_prefix).toString()); setPrefix(settings.value(QString("X-AW-Prefix"), m_prefix).toString());
setHasOutput(settings.value(QString("X-AW-Output"), QVariant(m_output)).toString() == QString("true")); setStrRedirect(
setStrRedirect(settings.value(QString("X-AW-Redirect"), strRedirect()).toString()); settings.value(QString("X-AW-Redirect"), strRedirect()).toString());
// api == 3 // api == 3
setFilters(settings.value(QString("X-AW-Filters"), m_filters).toString() setFilters(settings.value(QString("X-AW-Filters"), m_filters)
.split(QChar(','), QString::SkipEmptyParts)); .toString()
.split(QChar(','), QString::SkipEmptyParts));
settings.endGroup(); settings.endGroup();
} }
if (!m_output)
setRedirect(stdout2stderr);
// update for current API // update for current API
if ((apiVersion() > 0) && (apiVersion() < AWESAPI)) { if ((apiVersion() > 0) && (apiVersion() < AWESAPI)) {
qCWarning(LOG_LIB) << "Bump API version from" << apiVersion() << "to" << AWESAPI; qCWarning(LOG_LIB) << "Bump API version from" << apiVersion() << "to"
<< AWESAPI;
setApiVersion(AWESAPI); setApiVersion(AWESAPI);
writeConfiguration(); writeConfiguration();
} }
@ -284,10 +256,10 @@ void ExtScript::readConfiguration()
void ExtScript::readJsonFilters() void ExtScript::readJsonFilters()
{ {
qCDebug(LOG_LIB); QString fileName = QStandardPaths::locate(
QStandardPaths::GenericDataLocation,
QString fileName = QStandardPaths::locate(QStandardPaths::GenericDataLocation, QString(
QString("awesomewidgets/scripts/awesomewidgets-extscripts-filters.json")); "awesomewidgets/scripts/awesomewidgets-extscripts-filters.json"));
qCInfo(LOG_LIB) << "Filters file" << fileName; qCInfo(LOG_LIB) << "Filters file" << fileName;
QFile jsonFile(fileName); QFile jsonFile(fileName);
if (!jsonFile.open(QIODevice::ReadOnly | QIODevice::Text)) { if (!jsonFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
@ -311,17 +283,19 @@ void ExtScript::readJsonFilters()
QVariantHash ExtScript::run() QVariantHash ExtScript::run()
{ {
qCDebug(LOG_LIB); if (!isActive())
if (!isActive()) return value; return value;
if ((times == 1) && (process->state() == QProcess::NotRunning)) { if ((times == 1) && (process->state() == QProcess::NotRunning)) {
QStringList cmdList; QStringList cmdList;
if (!m_prefix.isEmpty()) cmdList.append(m_prefix); if (!m_prefix.isEmpty())
cmdList.append(m_prefix);
cmdList.append(m_executable); cmdList.append(m_executable);
qCInfo(LOG_LIB) << "Run cmd" << cmdList.join(QChar(' ')); qCInfo(LOG_LIB) << "Run cmd" << cmdList.join(QChar(' '));
process->start(cmdList.join(QChar(' '))); process->start(cmdList.join(QChar(' ')));
} else if (times >= interval()) } else if (times >= interval()) {
times = 0; times = 0;
}
times++; times++;
return value; return value;
@ -331,24 +305,27 @@ QVariantHash ExtScript::run()
int ExtScript::showConfiguration(const QVariant args) int ExtScript::showConfiguration(const QVariant args)
{ {
Q_UNUSED(args) Q_UNUSED(args)
qCDebug(LOG_LIB);
ui->lineEdit_name->setText(name()); ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment()); ui->lineEdit_comment->setText(comment());
ui->label_numberValue->setText(QString("%1").arg(number())); ui->label_numberValue->setText(QString("%1").arg(number()));
ui->lineEdit_command->setText(m_executable); ui->lineEdit_command->setText(m_executable);
ui->lineEdit_prefix->setText(m_prefix); ui->lineEdit_prefix->setText(m_prefix);
ui->checkBox_active->setCheckState(isActive() ? Qt::Checked : Qt::Unchecked); ui->checkBox_active->setCheckState(isActive() ? Qt::Checked
ui->checkBox_output->setCheckState(m_output ? Qt::Checked : Qt::Unchecked); : Qt::Unchecked);
ui->comboBox_redirect->setCurrentIndex(static_cast<int>(m_redirect)); ui->comboBox_redirect->setCurrentIndex(static_cast<int>(m_redirect));
ui->spinBox_interval->setValue(interval()); ui->spinBox_interval->setValue(interval());
// filters // filters
ui->checkBox_colorFilter->setCheckState(m_filters.contains(QString("color")) ? Qt::Checked : Qt::Unchecked); ui->checkBox_colorFilter->setCheckState(
ui->checkBox_linesFilter->setCheckState(m_filters.contains(QString("newline")) ? Qt::Checked : Qt::Unchecked); m_filters.contains(QString("color")) ? Qt::Checked : Qt::Unchecked);
ui->checkBox_spaceFilter->setCheckState(m_filters.contains(QString("space")) ? Qt::Checked : Qt::Unchecked); ui->checkBox_linesFilter->setCheckState(
m_filters.contains(QString("newline")) ? Qt::Checked : Qt::Unchecked);
ui->checkBox_spaceFilter->setCheckState(
m_filters.contains(QString("space")) ? Qt::Checked : Qt::Unchecked);
int ret = exec(); int ret = exec();
if (ret != 1) return ret; if (ret != 1)
return ret;
setName(ui->lineEdit_name->text()); setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text()); setComment(ui->lineEdit_comment->text());
setNumber(ui->label_numberValue->text().toInt()); setNumber(ui->label_numberValue->text().toInt());
@ -356,13 +333,15 @@ int ExtScript::showConfiguration(const QVariant args)
setExecutable(ui->lineEdit_command->text()); setExecutable(ui->lineEdit_command->text());
setPrefix(ui->lineEdit_prefix->text()); setPrefix(ui->lineEdit_prefix->text());
setActive(ui->checkBox_active->checkState() == Qt::Checked); setActive(ui->checkBox_active->checkState() == Qt::Checked);
setHasOutput(ui->checkBox_output->checkState() == Qt::Checked);
setStrRedirect(ui->comboBox_redirect->currentText()); setStrRedirect(ui->comboBox_redirect->currentText());
setInterval(ui->spinBox_interval->value()); setInterval(ui->spinBox_interval->value());
// filters // filters
updateFilter(QString("color"), ui->checkBox_colorFilter->checkState() == Qt::Checked); updateFilter(QString("color"),
updateFilter(QString("newline"), ui->checkBox_linesFilter->checkState() == Qt::Checked); ui->checkBox_colorFilter->checkState() == Qt::Checked);
updateFilter(QString("space"), ui->checkBox_spaceFilter->checkState() == Qt::Checked); updateFilter(QString("newline"),
ui->checkBox_linesFilter->checkState() == Qt::Checked);
updateFilter(QString("space"),
ui->checkBox_spaceFilter->checkState() == Qt::Checked);
writeConfiguration(); writeConfiguration();
return ret; return ret;
@ -371,16 +350,16 @@ int ExtScript::showConfiguration(const QVariant args)
void ExtScript::writeConfiguration() const void ExtScript::writeConfiguration() const
{ {
qCDebug(LOG_LIB);
AbstractExtItem::writeConfiguration(); AbstractExtItem::writeConfiguration();
QSettings settings(QString("%1/%2").arg(directories().first()).arg(fileName()), QSettings::IniFormat); QSettings settings(
QString("%1/%2").arg(directories().first()).arg(fileName()),
QSettings::IniFormat);
qCInfo(LOG_LIB) << "Configuration file" << settings.fileName(); qCInfo(LOG_LIB) << "Configuration file" << settings.fileName();
settings.beginGroup(QString("Desktop Entry")); settings.beginGroup(QString("Desktop Entry"));
settings.setValue(QString("Exec"), m_executable); settings.setValue(QString("Exec"), m_executable);
settings.setValue(QString("X-AW-Prefix"), m_prefix); settings.setValue(QString("X-AW-Prefix"), m_prefix);
settings.setValue(QString("X-AW-Output"), QVariant(m_output).toString());
settings.setValue(QString("X-AW-Redirect"), strRedirect()); settings.setValue(QString("X-AW-Redirect"), strRedirect());
settings.setValue(QString("X-AW-Filters"), m_filters.join(QChar(','))); settings.setValue(QString("X-AW-Filters"), m_filters.join(QChar(',')));
settings.endGroup(); settings.endGroup();
@ -391,13 +370,15 @@ void ExtScript::writeConfiguration() const
void ExtScript::updateValue() void ExtScript::updateValue()
{ {
qCDebug(LOG_LIB);
qCInfo(LOG_LIB) << "Cmd returns" << process->exitCode(); qCInfo(LOG_LIB) << "Cmd returns" << process->exitCode();
QString qdebug = QTextCodec::codecForMib(106)->toUnicode(process->readAllStandardError()).trimmed(); QString qdebug = QTextCodec::codecForMib(106)
->toUnicode(process->readAllStandardError())
.trimmed();
qCInfo(LOG_LIB) << "Error" << qdebug; qCInfo(LOG_LIB) << "Error" << qdebug;
QString qoutput = QTextCodec::codecForMib(106)->toUnicode(process->readAllStandardOutput()).trimmed(); QString qoutput = QTextCodec::codecForMib(106)
qCInfo(LOG_LIB) << "Error" << qoutput; ->toUnicode(process->readAllStandardOutput())
.trimmed();
qCInfo(LOG_LIB) << "Output" << qoutput;
QString strValue; QString strValue;
switch (m_redirect) { switch (m_redirect) {
@ -406,6 +387,9 @@ void ExtScript::updateValue()
case stderr2stdout: case stderr2stdout:
strValue = QString("%1\n%2").arg(qdebug).arg(qoutput); strValue = QString("%1\n%2").arg(qdebug).arg(qoutput);
break; break;
case swap:
strValue = qdebug;
break;
case nothing: case nothing:
default: default:
strValue = qoutput; strValue = qoutput;
@ -419,15 +403,12 @@ void ExtScript::updateValue()
void ExtScript::translate() void ExtScript::translate()
{ {
qCDebug(LOG_LIB);
ui->label_name->setText(i18n("Name")); ui->label_name->setText(i18n("Name"));
ui->label_comment->setText(i18n("Comment")); ui->label_comment->setText(i18n("Comment"));
ui->label_number->setText(i18n("Tag")); ui->label_number->setText(i18n("Tag"));
ui->label_command->setText(i18n("Command")); ui->label_command->setText(i18n("Command"));
ui->label_prefix->setText(i18n("Prefix")); ui->label_prefix->setText(i18n("Prefix"));
ui->checkBox_active->setText(i18n("Active")); ui->checkBox_active->setText(i18n("Active"));
ui->checkBox_output->setText(i18n("Has output"));
ui->label_redirect->setText(i18n("Redirect")); ui->label_redirect->setText(i18n("Redirect"));
ui->label_interval->setText(i18n("Interval")); ui->label_interval->setText(i18n("Interval"));
ui->groupBox_filters->setTitle(i18n("Additional filters")); ui->groupBox_filters->setTitle(i18n("Additional filters"));

View File

@ -18,14 +18,14 @@
#ifndef EXTSCRIPT_H #ifndef EXTSCRIPT_H
#define EXTSCRIPT_H #define EXTSCRIPT_H
#include <QMap>
#include <QProcess> #include <QProcess>
#include "abstractextitem.h" #include "abstractextitem.h"
namespace Ui { namespace Ui
class ExtScript; {
class ExtScript;
} }
class ExtScript : public AbstractExtItem class ExtScript : public AbstractExtItem
@ -33,25 +33,20 @@ class ExtScript : public AbstractExtItem
Q_OBJECT Q_OBJECT
Q_PROPERTY(QString executable READ executable WRITE setExecutable) Q_PROPERTY(QString executable READ executable WRITE setExecutable)
Q_PROPERTY(QStringList filters READ filters WRITE setFilters) Q_PROPERTY(QStringList filters READ filters WRITE setFilters)
Q_PROPERTY(bool output READ hasOutput WRITE setHasOutput)
Q_PROPERTY(QString prefix READ prefix WRITE setPrefix) Q_PROPERTY(QString prefix READ prefix WRITE setPrefix)
Q_PROPERTY(Redirect redirect READ redirect WRITE setRedirect) Q_PROPERTY(Redirect redirect READ redirect WRITE setRedirect)
public: public:
enum Redirect { enum Redirect { stdout2stderr = 0, nothing, stderr2stdout, swap };
stdout2stderr = 0,
nothing,
stderr2stdout
};
explicit ExtScript(QWidget *parent = nullptr, const QString scriptName = QString(), explicit ExtScript(QWidget *parent = nullptr,
const QString scriptName = QString(),
const QStringList directories = QStringList()); const QStringList directories = QStringList());
virtual ~ExtScript(); virtual ~ExtScript();
ExtScript *copy(const QString _fileName, const int _number); ExtScript *copy(const QString _fileName, const int _number);
// get methods // get methods
QString executable() const; QString executable() const;
QStringList filters() const; QStringList filters() const;
bool hasOutput() const;
QString prefix() const; QString prefix() const;
Redirect redirect() const; Redirect redirect() const;
QString uniq() const; QString uniq() const;
@ -60,7 +55,6 @@ public:
// set methods // set methods
void setExecutable(const QString _executable = QString("/usr/bin/true")); void setExecutable(const QString _executable = QString("/usr/bin/true"));
void setFilters(const QStringList _filters = QStringList()); void setFilters(const QStringList _filters = QStringList());
void setHasOutput(const bool _state = true);
void setPrefix(const QString _prefix = QString("")); void setPrefix(const QString _prefix = QString(""));
void setRedirect(const Redirect _redirect = nothing); void setRedirect(const Redirect _redirect = nothing);
void setStrRedirect(const QString _redirect = QString("nothing")); void setStrRedirect(const QString _redirect = QString("nothing"));
@ -85,7 +79,6 @@ private:
// properties // properties
QString m_executable = QString("/usr/bin/true"); QString m_executable = QString("/usr/bin/true");
QStringList m_filters = QStringList(); QStringList m_filters = QStringList();
bool m_output = true;
QString m_prefix = QString(""); QString m_prefix = QString("");
Redirect m_redirect = nothing; Redirect m_redirect = nothing;
// internal properties // internal properties

View File

@ -157,36 +157,6 @@
</item> </item>
</layout> </layout>
</item> </item>
<item>
<layout class="QHBoxLayout" name="layout_output">
<item>
<spacer name="spacer_output">
<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_output">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Has output</string>
</property>
</widget>
</item>
</layout>
</item>
<item> <item>
<layout class="QHBoxLayout" name="layout_redirect"> <layout class="QHBoxLayout" name="layout_redirect">
<item> <item>
@ -216,6 +186,11 @@
<string notr="true">stderr2stdout</string> <string notr="true">stderr2stdout</string>
</property> </property>
</item> </item>
<item>
<property name="text">
<string notr="true">swap</string>
</property>
</item>
</widget> </widget>
</item> </item>
</layout> </layout>

View File

@ -31,10 +31,10 @@
ExtUpgrade::ExtUpgrade(QWidget *parent, const QString upgradeName, ExtUpgrade::ExtUpgrade(QWidget *parent, const QString upgradeName,
const QStringList directories) const QStringList directories)
: AbstractExtItem(parent, upgradeName, directories), : AbstractExtItem(parent, upgradeName, directories)
ui(new Ui::ExtUpgrade) , ui(new Ui::ExtUpgrade)
{ {
qCDebug(LOG_LIB); qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
readConfiguration(); readConfiguration();
ui->setupUi(this); ui->setupUi(this);
@ -42,7 +42,7 @@ ExtUpgrade::ExtUpgrade(QWidget *parent, const QString upgradeName,
value[tag(QString("pkgcount"))] = 0; value[tag(QString("pkgcount"))] = 0;
process = new QProcess(this); process = new QProcess(nullptr);
connect(process, SIGNAL(finished(int)), this, SLOT(updateValue())); connect(process, SIGNAL(finished(int)), this, SLOT(updateValue()));
process->waitForFinished(0); process->waitForFinished(0);
} }
@ -50,21 +50,21 @@ ExtUpgrade::ExtUpgrade(QWidget *parent, const QString upgradeName,
ExtUpgrade::~ExtUpgrade() ExtUpgrade::~ExtUpgrade()
{ {
qCDebug(LOG_LIB); qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
process->kill(); process->kill();
delete process; process->deleteLater();
delete ui; delete ui;
} }
ExtUpgrade *ExtUpgrade::copy(const QString _fileName, const int _number) ExtUpgrade *ExtUpgrade::copy(const QString _fileName, const int _number)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "File" << _fileName; qCDebug(LOG_LIB) << "File" << _fileName;
qCDebug(LOG_LIB) << "Number" << _number; qCDebug(LOG_LIB) << "Number" << _number;
ExtUpgrade *item = new ExtUpgrade(static_cast<QWidget *>(parent()), _fileName, directories()); ExtUpgrade *item = new ExtUpgrade(static_cast<QWidget *>(parent()),
_fileName, directories());
item->setActive(isActive()); item->setActive(isActive());
item->setApiVersion(apiVersion()); item->setApiVersion(apiVersion());
item->setComment(comment()); item->setComment(comment());
@ -81,39 +81,30 @@ ExtUpgrade *ExtUpgrade::copy(const QString _fileName, const int _number)
QString ExtUpgrade::executable() const QString ExtUpgrade::executable() const
{ {
qCDebug(LOG_LIB);
return m_executable; return m_executable;
} }
QString ExtUpgrade::filter() const QString ExtUpgrade::filter() const
{ {
qCDebug(LOG_LIB);
return m_filter; return m_filter;
} }
int ExtUpgrade::null() const int ExtUpgrade::null() const
{ {
qCDebug(LOG_LIB);
return m_null; return m_null;
} }
QString ExtUpgrade::uniq() const QString ExtUpgrade::uniq() const
{ {
qCDebug(LOG_LIB);
return m_executable; return m_executable;
} }
void ExtUpgrade::setExecutable(const QString _executable) void ExtUpgrade::setExecutable(const QString _executable)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Executable" << _executable; qCDebug(LOG_LIB) << "Executable" << _executable;
m_executable = _executable; m_executable = _executable;
@ -122,7 +113,6 @@ void ExtUpgrade::setExecutable(const QString _executable)
void ExtUpgrade::setFilter(const QString _filter) void ExtUpgrade::setFilter(const QString _filter)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Filter" << _filter; qCDebug(LOG_LIB) << "Filter" << _filter;
m_filter = _filter; m_filter = _filter;
@ -131,9 +121,9 @@ void ExtUpgrade::setFilter(const QString _filter)
void ExtUpgrade::setNull(const int _null) void ExtUpgrade::setNull(const int _null)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Null lines" << _null; qCDebug(LOG_LIB) << "Null lines" << _null;
if (_null < 0) return; if (_null < 0)
return;
m_null = _null; m_null = _null;
} }
@ -141,12 +131,16 @@ void ExtUpgrade::setNull(const int _null)
void ExtUpgrade::readConfiguration() void ExtUpgrade::readConfiguration()
{ {
qCDebug(LOG_LIB);
AbstractExtItem::readConfiguration(); AbstractExtItem::readConfiguration();
for (int i=directories().count()-1; i>=0; i--) { for (int i = directories().count() - 1; i >= 0; i--) {
if (!QDir(directories().at(i)).entryList(QDir::Files).contains(fileName())) continue; if (!QDir(directories().at(i))
QSettings settings(QString("%1/%2").arg(directories().at(i)).arg(fileName()), QSettings::IniFormat); .entryList(QDir::Files)
.contains(fileName()))
continue;
QSettings settings(
QString("%1/%2").arg(directories().at(i)).arg(fileName()),
QSettings::IniFormat);
settings.beginGroup(QString("Desktop Entry")); settings.beginGroup(QString("Desktop Entry"));
setExecutable(settings.value(QString("Exec"), m_executable).toString()); setExecutable(settings.value(QString("Exec"), m_executable).toString());
@ -158,7 +152,8 @@ void ExtUpgrade::readConfiguration()
// update for current API // update for current API
if ((apiVersion() > 0) && (apiVersion() < AWEUAPI)) { if ((apiVersion() > 0) && (apiVersion() < AWEUAPI)) {
qCWarning(LOG_LIB) << "Bump API version from" << apiVersion() << "to" << AWEUAPI; qCWarning(LOG_LIB) << "Bump API version from" << apiVersion() << "to"
<< AWEUAPI;
setApiVersion(AWEUAPI); setApiVersion(AWEUAPI);
writeConfiguration(); writeConfiguration();
} }
@ -167,15 +162,16 @@ void ExtUpgrade::readConfiguration()
QVariantHash ExtUpgrade::run() QVariantHash ExtUpgrade::run()
{ {
qCDebug(LOG_LIB); if (!isActive())
if (!isActive()) return value; return value;
if ((times == 1) && (process->state() == QProcess::NotRunning)) { if ((times == 1) && (process->state() == QProcess::NotRunning)) {
QString cmd = QString("sh -c \"%1\"").arg(m_executable); QString cmd = QString("sh -c \"%1\"").arg(m_executable);
qCInfo(LOG_LIB) << "Run cmd" << cmd; qCInfo(LOG_LIB) << "Run cmd" << cmd;
process->start(cmd); process->start(cmd);
} else if (times >= interval()) } else if (times >= interval()) {
times = 0; times = 0;
}
times++; times++;
return value; return value;
@ -185,19 +181,20 @@ QVariantHash ExtUpgrade::run()
int ExtUpgrade::showConfiguration(const QVariant args) int ExtUpgrade::showConfiguration(const QVariant args)
{ {
Q_UNUSED(args) Q_UNUSED(args)
qCDebug(LOG_LIB);
ui->lineEdit_name->setText(name()); ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment()); ui->lineEdit_comment->setText(comment());
ui->label_numberValue->setText(QString("%1").arg(number())); ui->label_numberValue->setText(QString("%1").arg(number()));
ui->lineEdit_command->setText(m_executable); ui->lineEdit_command->setText(m_executable);
ui->lineEdit_filter->setText(m_filter); ui->lineEdit_filter->setText(m_filter);
ui->checkBox_active->setCheckState(isActive() ? Qt::Checked : Qt::Unchecked); ui->checkBox_active->setCheckState(isActive() ? Qt::Checked
: Qt::Unchecked);
ui->spinBox_null->setValue(m_null); ui->spinBox_null->setValue(m_null);
ui->spinBox_interval->setValue(interval()); ui->spinBox_interval->setValue(interval());
int ret = exec(); int ret = exec();
if (ret != 1) return ret; if (ret != 1)
return ret;
setName(ui->lineEdit_name->text()); setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text()); setComment(ui->lineEdit_comment->text());
setNumber(ui->label_numberValue->text().toInt()); setNumber(ui->label_numberValue->text().toInt());
@ -215,10 +212,11 @@ int ExtUpgrade::showConfiguration(const QVariant args)
void ExtUpgrade::writeConfiguration() const void ExtUpgrade::writeConfiguration() const
{ {
qCDebug(LOG_LIB);
AbstractExtItem::writeConfiguration(); AbstractExtItem::writeConfiguration();
QSettings settings(QString("%1/%2").arg(directories().first()).arg(fileName()), QSettings::IniFormat); QSettings settings(
QString("%1/%2").arg(directories().first()).arg(fileName()),
QSettings::IniFormat);
qCInfo(LOG_LIB) << "Configuration file" << settings.fileName(); qCInfo(LOG_LIB) << "Configuration file" << settings.fileName();
settings.beginGroup(QString("Desktop Entry")); settings.beginGroup(QString("Desktop Entry"));
@ -233,24 +231,25 @@ void ExtUpgrade::writeConfiguration() const
void ExtUpgrade::updateValue() void ExtUpgrade::updateValue()
{ {
qCDebug(LOG_LIB);
qCInfo(LOG_LIB) << "Cmd returns" << process->exitCode(); qCInfo(LOG_LIB) << "Cmd returns" << process->exitCode();
qCInfo(LOG_LIB) << "Error" << process->readAllStandardError(); qCInfo(LOG_LIB) << "Error" << process->readAllStandardError();
QString qoutput = QTextCodec::codecForMib(106)->toUnicode(process->readAllStandardOutput()).trimmed(); QString qoutput = QTextCodec::codecForMib(106)
->toUnicode(process->readAllStandardOutput())
.trimmed();
value[tag(QString("pkgcount"))] = [this](QString output) { value[tag(QString("pkgcount"))] = [this](QString output) {
return m_filter.isEmpty() ? return m_filter.isEmpty()
output.split(QChar('\n'), QString::SkipEmptyParts).count() - m_null : ? output.split(QChar('\n'), QString::SkipEmptyParts).count()
output.split(QChar('\n'), QString::SkipEmptyParts).filter(QRegExp(m_filter)).count(); - m_null
: output.split(QChar('\n'), QString::SkipEmptyParts)
.filter(QRegExp(m_filter))
.count();
}(qoutput); }(qoutput);
} }
void ExtUpgrade::translate() void ExtUpgrade::translate()
{ {
qCDebug(LOG_LIB);
ui->label_name->setText(i18n("Name")); ui->label_name->setText(i18n("Name"));
ui->label_comment->setText(i18n("Comment")); ui->label_comment->setText(i18n("Comment"));
ui->label_number->setText(i18n("Tag")); ui->label_number->setText(i18n("Tag"));

View File

@ -23,8 +23,9 @@
#include "abstractextitem.h" #include "abstractextitem.h"
namespace Ui { namespace Ui
class ExtUpgrade; {
class ExtUpgrade;
} }
class ExtUpgrade : public AbstractExtItem class ExtUpgrade : public AbstractExtItem
@ -35,7 +36,8 @@ class ExtUpgrade : public AbstractExtItem
Q_PROPERTY(int null READ null WRITE setNull) Q_PROPERTY(int null READ null WRITE setNull)
public: public:
explicit ExtUpgrade(QWidget *parent = nullptr, const QString upgradeName = QString(), explicit ExtUpgrade(QWidget *parent = nullptr,
const QString upgradeName = QString(),
const QStringList directories = QStringList()); const QStringList directories = QStringList());
virtual ~ExtUpgrade(); virtual ~ExtUpgrade();
ExtUpgrade *copy(const QString _fileName, const int _number); ExtUpgrade *copy(const QString _fileName, const int _number);

View File

@ -36,10 +36,10 @@
ExtWeather::ExtWeather(QWidget *parent, const QString weatherName, ExtWeather::ExtWeather(QWidget *parent, const QString weatherName,
const QStringList directories) const QStringList directories)
: AbstractExtItem(parent, weatherName, directories), : AbstractExtItem(parent, weatherName, directories)
ui(new Ui::ExtWeather) , ui(new Ui::ExtWeather)
{ {
qCDebug(LOG_LIB); qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
readConfiguration(); readConfiguration();
readJsonMap(); readJsonMap();
@ -52,31 +52,33 @@ ExtWeather::ExtWeather(QWidget *parent, const QString weatherName,
values[tag(QString("pressure"))] = 0.0; values[tag(QString("pressure"))] = 0.0;
values[tag(QString("temperature"))] = 0.0; values[tag(QString("temperature"))] = 0.0;
manager = new QNetworkAccessManager(this); // HACK declare as child of nullptr to avoid crash with plasmawindowed
connect(manager, SIGNAL(finished(QNetworkReply *)), // in the destructor
this, SLOT(weatherReplyReceived(QNetworkReply *))); manager = new QNetworkAccessManager(nullptr);
connect(manager, SIGNAL(finished(QNetworkReply *)), this,
SLOT(weatherReplyReceived(QNetworkReply *)));
} }
ExtWeather::~ExtWeather() ExtWeather::~ExtWeather()
{ {
qCDebug(LOG_LIB); qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
disconnect(manager, SIGNAL(finished(QNetworkReply *)), disconnect(manager, SIGNAL(finished(QNetworkReply *)), this,
this, SLOT(weatherReplyReceived(QNetworkReply *))); SLOT(weatherReplyReceived(QNetworkReply *)));
delete manager; manager->deleteLater();
delete ui; delete ui;
} }
ExtWeather *ExtWeather::copy(const QString _fileName, const int _number) ExtWeather *ExtWeather::copy(const QString _fileName, const int _number)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "File" << _fileName; qCDebug(LOG_LIB) << "File" << _fileName;
qCDebug(LOG_LIB) << "Number" << _number; qCDebug(LOG_LIB) << "Number" << _number;
ExtWeather *item = new ExtWeather(static_cast<QWidget *>(parent()), _fileName, directories()); ExtWeather *item = new ExtWeather(static_cast<QWidget *>(parent()),
_fileName, directories());
item->setActive(isActive()); item->setActive(isActive());
item->setApiVersion(apiVersion()); item->setApiVersion(apiVersion());
item->setCity(city()); item->setCity(city());
@ -94,57 +96,46 @@ ExtWeather *ExtWeather::copy(const QString _fileName, const int _number)
QString ExtWeather::weatherFromInt(const int _id) const QString ExtWeather::weatherFromInt(const int _id) const
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Weather ID" << _id; qCDebug(LOG_LIB) << "Weather ID" << _id;
QVariantMap map = jsonMap[m_image ? QString("image") : QString("text")].toMap(); QVariantMap map
= jsonMap[m_image ? QString("image") : QString("text")].toMap();
return map.value(QString::number(_id), map[QString("default")]).toString(); return map.value(QString::number(_id), map[QString("default")]).toString();
} }
QString ExtWeather::city() const QString ExtWeather::city() const
{ {
qCDebug(LOG_LIB);
return m_city; return m_city;
} }
QString ExtWeather::country() const QString ExtWeather::country() const
{ {
qCDebug(LOG_LIB);
return m_country; return m_country;
} }
bool ExtWeather::image() const bool ExtWeather::image() const
{ {
qCDebug(LOG_LIB);
return m_image; return m_image;
} }
int ExtWeather::ts() const int ExtWeather::ts() const
{ {
qCDebug(LOG_LIB);
return m_ts; return m_ts;
} }
QString ExtWeather::uniq() const QString ExtWeather::uniq() const
{ {
qCDebug(LOG_LIB);
return QString("%1 (%2) at %3").arg(m_city).arg(m_country).arg(m_ts); return QString("%1 (%2) at %3").arg(m_city).arg(m_country).arg(m_ts);
} }
void ExtWeather::setCity(const QString _city) void ExtWeather::setCity(const QString _city)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "City" << _city; qCDebug(LOG_LIB) << "City" << _city;
m_city = _city; m_city = _city;
@ -153,7 +144,6 @@ void ExtWeather::setCity(const QString _city)
void ExtWeather::setCountry(const QString _country) void ExtWeather::setCountry(const QString _country)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Country" << _country; qCDebug(LOG_LIB) << "Country" << _country;
m_country = _country; m_country = _country;
@ -162,7 +152,6 @@ void ExtWeather::setCountry(const QString _country)
void ExtWeather::setImage(const bool _image) void ExtWeather::setImage(const bool _image)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Use image" << _image; qCDebug(LOG_LIB) << "Use image" << _image;
m_image = _image; m_image = _image;
@ -171,7 +160,6 @@ void ExtWeather::setImage(const bool _image)
void ExtWeather::setTs(const int _ts) void ExtWeather::setTs(const int _ts)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Timestamp" << _ts; qCDebug(LOG_LIB) << "Timestamp" << _ts;
m_ts = _ts; m_ts = _ts;
@ -180,25 +168,33 @@ void ExtWeather::setTs(const int _ts)
void ExtWeather::readConfiguration() void ExtWeather::readConfiguration()
{ {
qCDebug(LOG_LIB);
AbstractExtItem::readConfiguration(); AbstractExtItem::readConfiguration();
for (int i=directories().count()-1; i>=0; i--) { for (int i = directories().count() - 1; i >= 0; i--) {
if (!QDir(directories().at(i)).entryList(QDir::Files).contains(fileName())) continue; if (!QDir(directories().at(i))
QSettings settings(QString("%1/%2").arg(directories().at(i)).arg(fileName()), QSettings::IniFormat); .entryList(QDir::Files)
.contains(fileName()))
continue;
QSettings settings(
QString("%1/%2").arg(directories().at(i)).arg(fileName()),
QSettings::IniFormat);
settings.beginGroup(QString("Desktop Entry")); settings.beginGroup(QString("Desktop Entry"));
setCity(settings.value(QString("X-AW-City"), m_city).toString()); setCity(settings.value(QString("X-AW-City"), m_city).toString());
setCountry(settings.value(QString("X-AW-Country"), m_country).toString()); setCountry(
settings.value(QString("X-AW-Country"), m_country).toString());
setTs(settings.value(QString("X-AW-TS"), m_ts).toInt()); setTs(settings.value(QString("X-AW-TS"), m_ts).toInt());
// api == 2 // api == 2
setImage(settings.value(QString("X-AW-Image"), QVariant(m_image)).toString() == QString("true")); setImage(
settings.value(QString("X-AW-Image"), QVariant(m_image)).toString()
== QString("true"));
settings.endGroup(); settings.endGroup();
} }
// update for current API // update for current API
if ((apiVersion() > 0) && (apiVersion() < AWEWAPI)) { if ((apiVersion() > 0) && (apiVersion() < AWEWAPI)) {
qCWarning(LOG_LIB) << "Bump API version from" << apiVersion() << "to" << AWEWAPI; qCWarning(LOG_LIB) << "Bump API version from" << apiVersion() << "to"
<< AWEWAPI;
setApiVersion(AWEWAPI); setApiVersion(AWEWAPI);
writeConfiguration(); writeConfiguration();
} }
@ -207,10 +203,9 @@ void ExtWeather::readConfiguration()
void ExtWeather::readJsonMap() void ExtWeather::readJsonMap()
{ {
qCDebug(LOG_LIB); QString fileName = QStandardPaths::locate(
QStandardPaths::GenericDataLocation,
QString fileName = QStandardPaths::locate(QStandardPaths::GenericDataLocation, QString("awesomewidgets/weather/awesomewidgets-extweather-ids.json"));
QString("awesomewidgets/weather/awesomewidgets-extweather-ids.json"));
qCInfo(LOG_LIB) << "Map file" << fileName; qCInfo(LOG_LIB) << "Map file" << fileName;
QFile jsonFile(fileName); QFile jsonFile(fileName);
if (!jsonFile.open(QIODevice::ReadOnly | QIODevice::Text)) { if (!jsonFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
@ -234,18 +229,20 @@ void ExtWeather::readJsonMap()
QVariantHash ExtWeather::run() QVariantHash ExtWeather::run()
{ {
qCDebug(LOG_LIB); if ((!isActive()) || (isRunning))
if ((!isActive()) || (isRunning)) return values; return values;
if (times == 1) { if (times == 1) {
qCInfo(LOG_LIB) << "Send request"; qCInfo(LOG_LIB) << "Send request";
isRunning = true; isRunning = true;
QNetworkReply *reply = manager->get(QNetworkRequest(QUrl(url(m_ts != 0)))); QNetworkReply *reply
= manager->get(QNetworkRequest(QUrl(url(m_ts != 0))));
new QReplyTimeout(reply, 1000); new QReplyTimeout(reply, 1000);
} }
// update value // update value
if (times >= interval()) times = 0; if (times >= interval())
times = 0;
times++; times++;
return values; return values;
@ -255,7 +252,6 @@ QVariantHash ExtWeather::run()
int ExtWeather::showConfiguration(const QVariant args) int ExtWeather::showConfiguration(const QVariant args)
{ {
Q_UNUSED(args) Q_UNUSED(args)
qCDebug(LOG_LIB);
ui->lineEdit_name->setText(name()); ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment()); ui->lineEdit_comment->setText(comment());
@ -264,11 +260,13 @@ int ExtWeather::showConfiguration(const QVariant args)
ui->lineEdit_country->setText(m_country); ui->lineEdit_country->setText(m_country);
ui->spinBox_timestamp->setValue(m_ts); ui->spinBox_timestamp->setValue(m_ts);
ui->checkBox_image->setCheckState(m_image ? Qt::Checked : Qt::Unchecked); ui->checkBox_image->setCheckState(m_image ? Qt::Checked : Qt::Unchecked);
ui->checkBox_active->setCheckState(isActive() ? Qt::Checked : Qt::Unchecked); ui->checkBox_active->setCheckState(isActive() ? Qt::Checked
: Qt::Unchecked);
ui->spinBox_interval->setValue(interval()); ui->spinBox_interval->setValue(interval());
int ret = exec(); int ret = exec();
if (ret != 1) return ret; if (ret != 1)
return ret;
setName(ui->lineEdit_name->text()); setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text()); setComment(ui->lineEdit_comment->text());
setNumber(ui->label_numberValue->text().toInt()); setNumber(ui->label_numberValue->text().toInt());
@ -287,10 +285,11 @@ int ExtWeather::showConfiguration(const QVariant args)
void ExtWeather::writeConfiguration() const void ExtWeather::writeConfiguration() const
{ {
qCDebug(LOG_LIB);
AbstractExtItem::writeConfiguration(); AbstractExtItem::writeConfiguration();
QSettings settings(QString("%1/%2").arg(directories().first()).arg(fileName()), QSettings::IniFormat); QSettings settings(
QString("%1/%2").arg(directories().first()).arg(fileName()),
QSettings::IniFormat);
qCInfo(LOG_LIB) << "Configuration file" << settings.fileName(); qCInfo(LOG_LIB) << "Configuration file" << settings.fileName();
settings.beginGroup(QString("Desktop Entry")); settings.beginGroup(QString("Desktop Entry"));
@ -306,7 +305,6 @@ void ExtWeather::writeConfiguration() const
void ExtWeather::weatherReplyReceived(QNetworkReply *reply) void ExtWeather::weatherReplyReceived(QNetworkReply *reply)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Return code" << reply->error(); qCDebug(LOG_LIB) << "Return code" << reply->error();
qCDebug(LOG_LIB) << "Reply error message" << reply->errorString(); qCDebug(LOG_LIB) << "Reply error message" << reply->errorString();
@ -314,8 +312,8 @@ void ExtWeather::weatherReplyReceived(QNetworkReply *reply)
QJsonParseError error; QJsonParseError error;
QJsonDocument jsonDoc = QJsonDocument::fromJson(reply->readAll(), &error); QJsonDocument jsonDoc = QJsonDocument::fromJson(reply->readAll(), &error);
reply->deleteLater(); reply->deleteLater();
if ((reply->error() != QNetworkReply::NoError) || if ((reply->error() != QNetworkReply::NoError)
(error.error != QJsonParseError::NoError)) { || (error.error != QJsonParseError::NoError)) {
qCWarning(LOG_LIB) << "Parse error" << error.errorString(); qCWarning(LOG_LIB) << "Parse error" << error.errorString();
return; return;
} }
@ -323,24 +321,26 @@ void ExtWeather::weatherReplyReceived(QNetworkReply *reply)
// convert to map // convert to map
QVariantMap json = jsonDoc.toVariant().toMap(); QVariantMap json = jsonDoc.toVariant().toMap();
if (json[QString("cod")].toInt() != 200) { if (json[QString("cod")].toInt() != 200) {
qCWarning(LOG_LIB) << "Invalid return code"; qCWarning(LOG_LIB) << "Invalid OpenWeatherMap return code"
<< json[QString("cod")].toInt();
return; return;
} }
QVariantHash data; QVariantHash data;
if (m_ts == 0) if (m_ts == 0) {
data = parseSingleJson(json); data = parseSingleJson(json);
else { } else {
QVariantList list = json[QString("list")].toList(); QVariantList list = json[QString("list")].toList();
data = parseSingleJson(list.count() <= m_ts ? list.at(m_ts-1).toMap() : list.last().toMap()); data = parseSingleJson(list.count() <= m_ts ? list.at(m_ts - 1).toMap()
: list.last().toMap());
} }
foreach(QString key, data.keys()) values[tag(key)] = data[key]; foreach (QString key, data.keys())
values[tag(key)] = data[key];
} }
QVariantHash ExtWeather::parseSingleJson(const QVariantMap json) const QVariantHash ExtWeather::parseSingleJson(const QVariantMap json) const
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Single json data" << json; qCDebug(LOG_LIB) << "Single json data" << json;
QVariantHash output; QVariantHash output;
@ -356,8 +356,10 @@ QVariantHash ExtWeather::parseSingleJson(const QVariantMap json) const
// main data // main data
QVariantMap mainWeather = json[QString("main")].toMap(); QVariantMap mainWeather = json[QString("main")].toMap();
if (!weather.isEmpty()) { if (!weather.isEmpty()) {
output[QString("humidity")] = mainWeather[QString("humidity")].toFloat(); output[QString("humidity")]
output[QString("pressure")] = mainWeather[QString("pressure")].toFloat(); = mainWeather[QString("humidity")].toFloat();
output[QString("pressure")]
= mainWeather[QString("pressure")].toFloat();
output[QString("temperature")] = mainWeather[QString("temp")].toFloat(); output[QString("temperature")] = mainWeather[QString("temp")].toFloat();
} }
@ -367,8 +369,6 @@ QVariantHash ExtWeather::parseSingleJson(const QVariantMap json) const
void ExtWeather::translate() void ExtWeather::translate()
{ {
qCDebug(LOG_LIB);
ui->label_name->setText(i18n("Name")); ui->label_name->setText(i18n("Name"));
ui->label_comment->setText(i18n("Comment")); ui->label_comment->setText(i18n("Comment"));
ui->label_number->setText(i18n("Tag")); ui->label_number->setText(i18n("Tag"));
@ -383,7 +383,6 @@ void ExtWeather::translate()
QString ExtWeather::url(const bool isForecast) const QString ExtWeather::url(const bool isForecast) const
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Is forecast" << isForecast; qCDebug(LOG_LIB) << "Is forecast" << isForecast;
QString apiUrl = isForecast ? QString(OWM_FORECAST_URL) : QString(OWM_URL); QString apiUrl = isForecast ? QString(OWM_FORECAST_URL) : QString(OWM_URL);

View File

@ -18,17 +18,21 @@
#ifndef EXTWEATHER_H #ifndef EXTWEATHER_H
#define EXTWEATHER_H #define EXTWEATHER_H
#include <QMap>
#include <QNetworkReply> #include <QNetworkReply>
#include "abstractextitem.h" #include "abstractextitem.h"
#define OWM_URL "http://api.openweathermap.org/data/2.5/weather?q=$CITY,$COUNTRY&units=metric" #define OWM_URL \
#define OWM_FORECAST_URL "http://api.openweathermap.org/data/2.5/forecast?q=$CITY,$COUNTRY&units=metric" "http://api.openweathermap.org/data/2.5/" \
"weather?q=$CITY,$COUNTRY&units=metric"
#define OWM_FORECAST_URL \
"http://api.openweathermap.org/data/2.5/" \
"forecast?q=$CITY,$COUNTRY&units=metric"
namespace Ui { namespace Ui
class ExtWeather; {
class ExtWeather;
} }
class ExtWeather : public AbstractExtItem class ExtWeather : public AbstractExtItem
@ -40,7 +44,8 @@ class ExtWeather : public AbstractExtItem
Q_PROPERTY(int ts READ ts WRITE setTs) Q_PROPERTY(int ts READ ts WRITE setTs)
public: public:
explicit ExtWeather(QWidget *parent = nullptr, const QString weatherName = QString(), explicit ExtWeather(QWidget *parent = nullptr,
const QString weatherName = QString(),
const QStringList directories = QStringList()); const QStringList directories = QStringList());
virtual ~ExtWeather(); virtual ~ExtWeather();
ExtWeather *copy(const QString _fileName, const int _number); ExtWeather *copy(const QString _fileName, const int _number);

View File

@ -28,41 +28,48 @@
#include <QGraphicsView> #include <QGraphicsView>
#include <QSettings> #include <QSettings>
#include <math.h>
#include "awdebug.h" #include "awdebug.h"
#include "version.h" #include "version.h"
GraphicalItem::GraphicalItem(QWidget *parent, const QString desktopName, GraphicalItem::GraphicalItem(QWidget *parent, const QString desktopName,
const QStringList directories) const QStringList directories)
: AbstractExtItem(parent, desktopName, directories), : AbstractExtItem(parent, desktopName, directories)
ui(new Ui::GraphicalItem) , ui(new Ui::GraphicalItem)
{ {
qCDebug(LOG_LIB); qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
readConfiguration(); readConfiguration();
ui->setupUi(this); ui->setupUi(this);
translate(); translate();
connect(ui->pushButton_activeColor, SIGNAL(clicked()), this, SLOT(changeColor())); initScene();
connect(ui->pushButton_inactiveColor, SIGNAL(clicked()), this, SLOT(changeColor()));
connect(ui->pushButton_activeColor, SIGNAL(clicked()), this,
SLOT(changeColor()));
connect(ui->pushButton_inactiveColor, SIGNAL(clicked()), this,
SLOT(changeColor()));
} }
GraphicalItem::~GraphicalItem() GraphicalItem::~GraphicalItem()
{ {
qCDebug(LOG_LIB); qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
delete m_scene;
delete ui; delete ui;
} }
GraphicalItem *GraphicalItem::copy(const QString _fileName, const int _number) GraphicalItem *GraphicalItem::copy(const QString _fileName, const int _number)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "File" << _fileName; qCDebug(LOG_LIB) << "File" << _fileName;
qCDebug(LOG_LIB) << "Number" << _number; qCDebug(LOG_LIB) << "Number" << _number;
GraphicalItem *item = new GraphicalItem(static_cast<QWidget *>(parent()), _fileName, directories()); GraphicalItem *item = new GraphicalItem(static_cast<QWidget *>(parent()),
_fileName, directories());
item->setActive(isActive()); item->setActive(isActive());
item->setActiveColor(activeColor()); item->setActiveColor(activeColor());
item->setApiVersion(apiVersion()); item->setApiVersion(apiVersion());
@ -81,81 +88,47 @@ GraphicalItem *GraphicalItem::copy(const QString _fileName, const int _number)
} }
QString GraphicalItem::image(const float value) const QString GraphicalItem::image(const QVariant value)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Value" << value; qCDebug(LOG_LIB) << "Value" << value;
if (m_bar == QString("none")) return QString(""); if (m_bar == QString("none"))
return QString("");
QColor active = stringToColor(m_activeColor); m_scene->clear();
QColor inactive = stringToColor(m_inactiveColor); int scale[2] = {1, 1};
float percent = value / 100.0;
int scale[2] = { 1, 1 };
QPen pen = QPen();
QGraphicsScene *scene = new QGraphicsScene();
scene->setBackgroundBrush(QBrush(Qt::NoBrush));
QGraphicsView *view = new QGraphicsView(scene);
view->setStyleSheet(QString("background: transparent"));
view->setContentsMargins(0, 0, 0, 0);
view->setFrameShape(QFrame::NoFrame);
view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
view->resize(m_width + 5.0, m_height + 5.0);
// paint // paint
switch (m_type) { switch (m_type) {
case Vertical: case Vertical:
pen.setWidth(m_width); paintVertical(value.toFloat());
// inactive
pen.setColor(inactive);
scene->addLine(0.5 * m_width, -0.5 * m_width, 0.5 * m_width,
(1.0 - percent) * m_height - 0.5 * m_width, pen);
// active
pen.setColor(active);
scene->addLine(0.5 * m_width, (1.0 - percent) * m_height + 0.5 * m_width,
0.5 * m_width, m_height + 0.5 * m_width, pen);
// scale // scale
scale[1] = -2 * static_cast<int>(m_direction) + 1; scale[1] = -2 * static_cast<int>(m_direction) + 1;
break; break;
case Circle: case Circle:
QGraphicsEllipseItem *circle; paintCircle(value.toFloat());
pen.setWidth(1.0);
// inactive
pen.setColor(inactive);
circle = scene->addEllipse(0.0, 0.0, m_width, m_height, pen, QBrush(inactive, Qt::SolidPattern));
circle->setSpanAngle(- (1.0 - percent) * 360.0 * 16.0);
circle->setStartAngle(90.0 * 16.0 - percent * 360.0 * 16.0);
// active
pen.setColor(active);
circle = scene->addEllipse(0.0, 0.0, m_width, m_height, pen, QBrush(active, Qt::SolidPattern));
circle->setSpanAngle(- percent * 360.0 * 16.0);
circle->setStartAngle(90.0 * 16.0);
// scale // scale
scale[0] = -2 * static_cast<int>(m_direction) + 1; scale[0] = -2 * static_cast<int>(m_direction) + 1;
break; break;
case Graph:
paintGraph(value.value<QList<float>>());
// direction option is not recognized by this GI type
break;
case Horizontal:
default: default:
pen.setWidth(m_height); paintHorizontal(value.toFloat());
// inactive
pen.setColor(inactive);
scene->addLine(percent * m_width + 0.5 * m_height, 0.5 * m_height,
m_width + 0.5 * m_height, 0.5 * m_height, pen);
// active
pen.setColor(active);
scene->addLine(-0.5 * m_height, 0.5 * m_height,
percent * m_width - 0.5 * m_height, 0.5 * m_height, pen);
// scale // scale
scale[0] = -2 * static_cast<int>(m_direction) + 1; scale[0] = -2 * static_cast<int>(m_direction) + 1;
break; break;
} }
// convert // convert
QPixmap pixmap = view->grab().transformed(QTransform().scale(scale[0], scale[1])); QPixmap pixmap
= m_view->grab().transformed(QTransform().scale(scale[0], scale[1]));
QByteArray byteArray; QByteArray byteArray;
QBuffer buffer(&byteArray); QBuffer buffer(&byteArray);
pixmap.save(&buffer, "PNG"); pixmap.save(&buffer, "PNG");
QString url = QString("<img src=\"data:image/png;base64,%1\"/>").arg(QString(byteArray.toBase64())); QString url = QString("<img src=\"data:image/png;base64,%1\"/>")
delete view; .arg(QString(byteArray.toBase64()));
delete scene;
return url; return url;
} }
@ -163,48 +136,36 @@ QString GraphicalItem::image(const float value) const
QString GraphicalItem::bar() const QString GraphicalItem::bar() const
{ {
qCDebug(LOG_LIB);
return m_bar; return m_bar;
} }
QString GraphicalItem::activeColor() const QString GraphicalItem::activeColor() const
{ {
qCDebug(LOG_LIB);
return m_activeColor; return m_activeColor;
} }
QString GraphicalItem::inactiveColor() const QString GraphicalItem::inactiveColor() const
{ {
qCDebug(LOG_LIB);
return m_inactiveColor; return m_inactiveColor;
} }
QString GraphicalItem::tag() const QString GraphicalItem::tag() const
{ {
qCDebug(LOG_LIB); return QString("bar%1%2").arg(number()).arg(m_bar);
return name() + m_bar;
} }
GraphicalItem::Type GraphicalItem::type() const GraphicalItem::Type GraphicalItem::type() const
{ {
qCDebug(LOG_LIB);
return m_type; return m_type;
} }
QString GraphicalItem::strType() const QString GraphicalItem::strType() const
{ {
qCDebug(LOG_LIB);
QString value; QString value;
switch (m_type) { switch (m_type) {
case Vertical: case Vertical:
@ -213,10 +174,14 @@ QString GraphicalItem::strType() const
case Circle: case Circle:
value = QString("Circle"); value = QString("Circle");
break; break;
case Graph:
value = QString("Graph");
break;
case Horizontal:
default: default:
value = QString("Horizontal"); value = QString("Horizontal");
break; break;
}\ }
return value; return value;
} }
@ -224,21 +189,18 @@ QString GraphicalItem::strType() const
GraphicalItem::Direction GraphicalItem::direction() const GraphicalItem::Direction GraphicalItem::direction() const
{ {
qCDebug(LOG_LIB);
return m_direction; return m_direction;
} }
QString GraphicalItem::strDirection() const QString GraphicalItem::strDirection() const
{ {
qCDebug(LOG_LIB);
QString value; QString value;
switch (m_direction) { switch (m_direction) {
case RightToLeft: case RightToLeft:
value = QString("RightToLeft"); value = QString("RightToLeft");
break; break;
case LeftToRight:
default: default:
value = QString("LeftToRight"); value = QString("LeftToRight");
break; break;
@ -250,44 +212,38 @@ QString GraphicalItem::strDirection() const
int GraphicalItem::height() const int GraphicalItem::height() const
{ {
qCDebug(LOG_LIB);
return m_height; return m_height;
} }
int GraphicalItem::width() const int GraphicalItem::width() const
{ {
qCDebug(LOG_LIB);
return m_width; return m_width;
} }
QString GraphicalItem::uniq() const QString GraphicalItem::uniq() const
{ {
qCDebug(LOG_LIB);
return m_bar; return m_bar;
} }
void GraphicalItem::setBar(const QString _bar) void GraphicalItem::setBar(const QString _bar)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Bar" << _bar; qCDebug(LOG_LIB) << "Bar" << _bar;
if (!_bar.contains(QRegExp(QString("^(cpu(?!cl).*|gpu$|mem$|swap$|hdd[0-9].*|bat.*)")))) { if (!_bar.contains(QRegExp(
QString("^(cpu(?!cl).*|gpu$|mem$|swap$|hdd[0-9].*|bat.*)")))) {
qCWarning(LOG_LIB) << "Unsupported bar type" << _bar; qCWarning(LOG_LIB) << "Unsupported bar type" << _bar;
m_bar = QString("none"); m_bar = QString("none");
} else } else {
m_bar = _bar; m_bar = _bar;
}
} }
void GraphicalItem::setActiveColor(const QString _color) void GraphicalItem::setActiveColor(const QString _color)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Color" << _color; qCDebug(LOG_LIB) << "Color" << _color;
m_activeColor = _color; m_activeColor = _color;
@ -296,7 +252,6 @@ void GraphicalItem::setActiveColor(const QString _color)
void GraphicalItem::setInactiveColor(const QString _color) void GraphicalItem::setInactiveColor(const QString _color)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Color" << _color; qCDebug(LOG_LIB) << "Color" << _color;
m_inactiveColor = _color; m_inactiveColor = _color;
@ -305,7 +260,6 @@ void GraphicalItem::setInactiveColor(const QString _color)
void GraphicalItem::setType(const Type _type) void GraphicalItem::setType(const Type _type)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Type" << _type; qCDebug(LOG_LIB) << "Type" << _type;
m_type = _type; m_type = _type;
@ -314,13 +268,14 @@ void GraphicalItem::setType(const Type _type)
void GraphicalItem::setStrType(const QString _type) void GraphicalItem::setStrType(const QString _type)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Type" << _type; qCDebug(LOG_LIB) << "Type" << _type;
if (_type == QString("Vertical")) if (_type == QString("Vertical"))
setType(Vertical); setType(Vertical);
else if (_type == QString("Circle")) else if (_type == QString("Circle"))
setType(Circle); setType(Circle);
else if (_type == QString("Graph"))
setType(Graph);
else else
setType(Horizontal); setType(Horizontal);
} }
@ -328,7 +283,6 @@ void GraphicalItem::setStrType(const QString _type)
void GraphicalItem::setDirection(const Direction _direction) void GraphicalItem::setDirection(const Direction _direction)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Direction" << _direction; qCDebug(LOG_LIB) << "Direction" << _direction;
m_direction = _direction; m_direction = _direction;
@ -337,7 +291,6 @@ void GraphicalItem::setDirection(const Direction _direction)
void GraphicalItem::setStrDirection(const QString _direction) void GraphicalItem::setStrDirection(const QString _direction)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Direction" << _direction; qCDebug(LOG_LIB) << "Direction" << _direction;
if (_direction == QString("RightToLeft")) if (_direction == QString("RightToLeft"))
@ -349,9 +302,9 @@ void GraphicalItem::setStrDirection(const QString _direction)
void GraphicalItem::setHeight(const int _height) void GraphicalItem::setHeight(const int _height)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Height" << _height; qCDebug(LOG_LIB) << "Height" << _height;
if (_height <= 0) return; if (_height <= 0)
return;
m_height = _height; m_height = _height;
} }
@ -359,9 +312,9 @@ void GraphicalItem::setHeight(const int _height)
void GraphicalItem::setWidth(const int _width) void GraphicalItem::setWidth(const int _width)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Width" << _width; qCDebug(LOG_LIB) << "Width" << _width;
if (_width <= 0) return; if (_width <= 0)
return;
m_width = _width; m_width = _width;
} }
@ -369,29 +322,41 @@ void GraphicalItem::setWidth(const int _width)
void GraphicalItem::readConfiguration() void GraphicalItem::readConfiguration()
{ {
qCDebug(LOG_LIB);
AbstractExtItem::readConfiguration(); AbstractExtItem::readConfiguration();
for (int i=directories().count()-1; i>=0; i--) { for (int i = directories().count() - 1; i >= 0; i--) {
if (!QDir(directories().at(i)).entryList(QDir::Files).contains(fileName())) continue; if (!QDir(directories().at(i))
QSettings settings(QString("%1/%2").arg(directories().at(i)).arg(fileName()), QSettings::IniFormat); .entryList(QDir::Files)
.contains(fileName()))
continue;
QSettings settings(
QString("%1/%2").arg(directories().at(i)).arg(fileName()),
QSettings::IniFormat);
settings.beginGroup(QString("Desktop Entry")); settings.beginGroup(QString("Desktop Entry"));
setBar(settings.value(QString("X-AW-Value"), m_bar).toString()); setBar(settings.value(QString("X-AW-Value"), m_bar).toString());
setActiveColor(settings.value(QString("X-AW-ActiveColor"), m_activeColor).toString()); setActiveColor(
setInactiveColor(settings.value(QString("X-AW-InactiveColor"), m_inactiveColor).toString()); settings.value(QString("X-AW-ActiveColor"), m_activeColor)
.toString());
setInactiveColor(
settings.value(QString("X-AW-InactiveColor"), m_inactiveColor)
.toString());
setStrType(settings.value(QString("X-AW-Type"), strType()).toString()); setStrType(settings.value(QString("X-AW-Type"), strType()).toString());
setStrDirection(settings.value(QString("X-AW-Direction"), strDirection()).toString()); setStrDirection(
settings.value(QString("X-AW-Direction"), strDirection())
.toString());
setHeight(settings.value(QString("X-AW-Height"), m_height).toInt()); setHeight(settings.value(QString("X-AW-Height"), m_height).toInt());
setWidth(settings.value(QString("X-AW-Width"), m_width).toInt()); setWidth(settings.value(QString("X-AW-Width"), m_width).toInt());
// api == 2 // api == 2
if (apiVersion() < 2) setNumber(bar().remove(QString("bar")).toInt()); if (apiVersion() < 2)
setNumber(bar().remove(QString("bar")).toInt());
settings.endGroup(); settings.endGroup();
} }
// update for current API // update for current API
if ((apiVersion() > 0) && (apiVersion() < AWGIAPI)) { if ((apiVersion() > 0) && (apiVersion() < AWGIAPI)) {
qCWarning(LOG_LIB) << "Bump API version from" << apiVersion() << "to" << AWGIAPI; qCWarning(LOG_LIB) << "Bump API version from" << apiVersion() << "to"
<< AWGIAPI;
setApiVersion(AWGIAPI); setApiVersion(AWGIAPI);
writeConfiguration(); writeConfiguration();
} }
@ -400,8 +365,6 @@ void GraphicalItem::readConfiguration()
QVariantHash GraphicalItem::run() QVariantHash GraphicalItem::run()
{ {
qCDebug(LOG_LIB);
// required by abstract class // required by abstract class
return QVariantHash(); return QVariantHash();
} }
@ -409,7 +372,6 @@ QVariantHash GraphicalItem::run()
int GraphicalItem::showConfiguration(const QVariant args) int GraphicalItem::showConfiguration(const QVariant args)
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Combobox arguments" << args; qCDebug(LOG_LIB) << "Combobox arguments" << args;
QStringList tags = args.toStringList(); QStringList tags = args.toStringList();
@ -426,8 +388,8 @@ int GraphicalItem::showConfiguration(const QVariant args)
ui->spinBox_width->setValue(m_width); ui->spinBox_width->setValue(m_width);
int ret = exec(); int ret = exec();
if (ret != 1) return ret; if (ret != 1)
return ret;
setName(ui->label_nameValue->text()); setName(ui->label_nameValue->text());
setComment(ui->lineEdit_comment->text()); setComment(ui->lineEdit_comment->text());
setApiVersion(AWGIAPI); setApiVersion(AWGIAPI);
@ -446,10 +408,11 @@ int GraphicalItem::showConfiguration(const QVariant args)
void GraphicalItem::writeConfiguration() const void GraphicalItem::writeConfiguration() const
{ {
qCDebug(LOG_LIB);
AbstractExtItem::writeConfiguration(); AbstractExtItem::writeConfiguration();
QSettings settings(QString("%1/%2").arg(directories().first()).arg(fileName()), QSettings::IniFormat); QSettings settings(
QString("%1/%2").arg(directories().first()).arg(fileName()),
QSettings::IniFormat);
qCInfo(LOG_LIB) << "Configuration file" << settings.fileName(); qCInfo(LOG_LIB) << "Configuration file" << settings.fileName();
settings.beginGroup(QString("Desktop Entry")); settings.beginGroup(QString("Desktop Entry"));
@ -468,12 +431,12 @@ void GraphicalItem::writeConfiguration() const
void GraphicalItem::changeColor() void GraphicalItem::changeColor()
{ {
qCDebug(LOG_LIB); QColor color
= stringToColor((static_cast<QPushButton *>(sender()))->text());
QColor color = stringToColor((static_cast<QPushButton *>(sender()))->text());
QColor newColor = QColorDialog::getColor(color, this, tr("Select color"), QColor newColor = QColorDialog::getColor(color, this, tr("Select color"),
QColorDialog::ShowAlphaChannel); QColorDialog::ShowAlphaChannel);
if (!newColor.isValid()) return; if (!newColor.isValid())
return;
qCInfo(LOG_LIB) << "Selected color" << newColor; qCInfo(LOG_LIB) << "Selected color" << newColor;
QStringList colorText; QStringList colorText;
@ -482,13 +445,112 @@ void GraphicalItem::changeColor()
colorText.append(QString("%1").arg(newColor.blue())); colorText.append(QString("%1").arg(newColor.blue()));
colorText.append(QString("%1").arg(newColor.alpha())); colorText.append(QString("%1").arg(newColor.alpha()));
return static_cast<QPushButton *>(sender())->setText(colorText.join(QChar(','))); return static_cast<QPushButton *>(sender())
->setText(colorText.join(QChar(',')));
}
void GraphicalItem::initScene()
{
// init scene
m_scene = new QGraphicsScene();
if (m_type == Graph)
m_scene->setBackgroundBrush(stringToColor(m_inactiveColor));
else
m_scene->setBackgroundBrush(QBrush(Qt::NoBrush));
// init view
m_view = new QGraphicsView(m_scene);
m_view->setStyleSheet(QString("background: transparent"));
m_view->setContentsMargins(0, 0, 0, 0);
m_view->setFrameShape(QFrame::NoFrame);
m_view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
m_view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
m_view->resize(m_width + 5.0, m_height + 5.0);
}
void GraphicalItem::paintCircle(const float value)
{
QPen pen;
pen.setWidth(1.0);
float percent = value / 100.0;
QGraphicsEllipseItem *circle;
QColor inactive = stringToColor(m_inactiveColor);
QColor active = stringToColor(m_activeColor);
// inactive
pen.setColor(inactive);
circle = m_scene->addEllipse(0.0, 0.0, m_width, m_height, pen,
QBrush(inactive, Qt::SolidPattern));
circle->setSpanAngle(-(1.0 - percent) * 360.0 * 16.0);
circle->setStartAngle(90.0 * 16.0 - percent * 360.0 * 16.0);
// active
pen.setColor(active);
circle = m_scene->addEllipse(0.0, 0.0, m_width, m_height, pen,
QBrush(active, Qt::SolidPattern));
circle->setSpanAngle(-percent * 360.0 * 16.0);
circle->setStartAngle(90.0 * 16.0);
}
void GraphicalItem::paintGraph(const QList<float> value)
{
QPen pen;
pen.setColor(stringToColor(m_activeColor));
// default norms
float normX
= static_cast<float>(m_width) / static_cast<float>(value.count());
float normY = static_cast<float>(m_height) / (1.5 * 100.0);
// paint graph
for (int i = 0; i < value.count() - 1; i++) {
// some magic here
float x1 = i * normX;
float y1 = -fabs(value.at(i)) * normY + 5.0;
float x2 = (i + 1) * normX;
float y2 = -fabs(value.at(i + 1)) * normY + 5.0;
m_scene->addLine(x1, y1, x2, y2, pen);
}
}
void GraphicalItem::paintHorizontal(const float value)
{
QPen pen;
float percent = value / 100.0;
pen.setWidth(m_height);
// inactive
pen.setColor(stringToColor(m_inactiveColor));
m_scene->addLine(percent * m_width + 0.5 * m_height, 0.5 * m_height,
m_width + 0.5 * m_height, 0.5 * m_height, pen);
// active
pen.setColor(stringToColor(m_activeColor));
m_scene->addLine(-0.5 * m_height, 0.5 * m_height,
percent * m_width - 0.5 * m_height, 0.5 * m_height, pen);
}
void GraphicalItem::paintVertical(const float value)
{
QPen pen;
float percent = value / 100.0;
pen.setWidth(m_width);
// inactive
pen.setColor(stringToColor(m_inactiveColor));
m_scene->addLine(0.5 * m_width, -0.5 * m_width, 0.5 * m_width,
(1.0 - percent) * m_height - 0.5 * m_width, pen);
// active
pen.setColor(stringToColor(m_activeColor));
m_scene->addLine(0.5 * m_width, (1.0 - percent) * m_height + 0.5 * m_width,
0.5 * m_width, m_height + 0.5 * m_width, pen);
} }
QColor GraphicalItem::stringToColor(const QString _color) const QColor GraphicalItem::stringToColor(const QString _color) const
{ {
qCDebug(LOG_LIB);
qCDebug(LOG_LIB) << "Color" << _color; qCDebug(LOG_LIB) << "Color" << _color;
QColor qcolor; QColor qcolor;
@ -506,8 +568,6 @@ QColor GraphicalItem::stringToColor(const QString _color) const
void GraphicalItem::translate() void GraphicalItem::translate()
{ {
qCDebug(LOG_LIB);
ui->label_name->setText(i18n("Name")); ui->label_name->setText(i18n("Name"));
ui->label_comment->setText(i18n("Comment")); ui->label_comment->setText(i18n("Comment"));
ui->label_value->setText(i18n("Value")); ui->label_value->setText(i18n("Value"));

View File

@ -23,8 +23,12 @@
#include "abstractextitem.h" #include "abstractextitem.h"
namespace Ui { class QGraphicsScene;
class GraphicalItem; class QGraphicsView;
namespace Ui
{
class GraphicalItem;
} }
class GraphicalItem : public AbstractExtItem class GraphicalItem : public AbstractExtItem
@ -39,21 +43,15 @@ class GraphicalItem : public AbstractExtItem
Q_PROPERTY(int width READ width WRITE setWidth) Q_PROPERTY(int width READ width WRITE setWidth)
public: public:
enum Direction { enum Direction { LeftToRight = 0, RightToLeft };
LeftToRight = 0, enum Type { Horizontal = 0, Vertical, Circle, Graph };
RightToLeft
};
enum Type {
Horizontal = 0,
Vertical,
Circle
};
explicit GraphicalItem(QWidget *parent = nullptr, const QString desktopName = QString(), explicit GraphicalItem(QWidget *parent = nullptr,
const QString desktopName = QString(),
const QStringList directories = QStringList()); const QStringList directories = QStringList());
virtual ~GraphicalItem(); virtual ~GraphicalItem();
GraphicalItem *copy(const QString _fileName, const int _number); GraphicalItem *copy(const QString _fileName, const int _number);
QString image(const float value) const; QString image(const QVariant value);
// get methods // get methods
QString bar() const; QString bar() const;
QString activeColor() const; QString activeColor() const;
@ -89,7 +87,16 @@ private slots:
private: private:
QString m_fileName; QString m_fileName;
QStringList m_dirs; QStringList m_dirs;
QGraphicsScene *m_scene = nullptr;
QGraphicsView *m_view = nullptr;
Ui::GraphicalItem *ui; Ui::GraphicalItem *ui;
void initScene();
// paint methods
void paintCircle(const float value);
void paintGraph(const QList<float> value);
void paintHorizontal(const float value);
void paintVertical(const float value);
// additional method
QColor stringToColor(const QString _color) const; QColor stringToColor(const QString _color) const;
void translate(); void translate();
// properties // properties

View File

@ -150,6 +150,11 @@
<string notr="true">Circle</string> <string notr="true">Circle</string>
</property> </property>
</item> </item>
<item>
<property name="text">
<string notr="true">Graph</string>
</property>
</item>
</widget> </widget>
</item> </item>
</layout> </layout>

View File

@ -4,6 +4,6 @@ Name=AAPL.NASDAQ
Comment=Apple Inc Comment=Apple Inc
X-AW-Ticker="AAPL" X-AW-Ticker="AAPL"
X-AW-Active=false X-AW-Active=false
X-AW-ApiVersion=2 X-AW-ApiVersion=3
X-AW-Interval=60 X-AW-Interval=60
X-AW-Number=0 X-AW-Number=0

View File

@ -4,6 +4,6 @@ Name=EUR/RUB
Comment=EUR/RUB Comment=EUR/RUB
X-AW-Ticker="EURRUB=X" X-AW-Ticker="EURRUB=X"
X-AW-Active=false X-AW-Active=false
X-AW-ApiVersion=2 X-AW-ApiVersion=3
X-AW-Interval=60 X-AW-Interval=60
X-AW-Number=1 X-AW-Number=1

View File

@ -4,6 +4,6 @@ Name=EUR/USD
Comment=EUR/USD Comment=EUR/USD
X-AW-Ticker="EURUSD=X" X-AW-Ticker="EURUSD=X"
X-AW-Active=false X-AW-Active=false
X-AW-ApiVersion=2 X-AW-ApiVersion=3
X-AW-Interval=60 X-AW-Interval=60
X-AW-Number=2 X-AW-Number=2

View File

@ -4,6 +4,6 @@ Name=GOOG.NASDAQ
Comment=Google Inc Comment=Google Inc
X-AW-Ticker="GOOG" X-AW-Ticker="GOOG"
X-AW-Active=false X-AW-Active=false
X-AW-ApiVersion=2 X-AW-ApiVersion=3
X-AW-Interval=60 X-AW-Interval=60
X-AW-Number=3 X-AW-Number=3

View File

@ -4,6 +4,6 @@ Name=MSFT.NASDAQ
Comment=Microsoft Corp Comment=Microsoft Corp
X-AW-Ticker="MSFT" X-AW-Ticker="MSFT"
X-AW-Active=false X-AW-Active=false
X-AW-ApiVersion=2 X-AW-ApiVersion=3
X-AW-Interval=60 X-AW-Interval=60
X-AW-Number=4 X-AW-Number=4

View File

@ -4,6 +4,6 @@ Name=RTS
Comment=RTS Index Comment=RTS Index
X-AW-Ticker="RTS.RS" X-AW-Ticker="RTS.RS"
X-AW-Active=false X-AW-Active=false
X-AW-ApiVersion=2 X-AW-ApiVersion=3
X-AW-Interval=60 X-AW-Interval=60
X-AW-Number=5 X-AW-Number=5

View File

@ -4,6 +4,6 @@ Name=S&P
Comment=S&P 500 Index Comment=S&P 500 Index
X-AW-Ticker="^GSPC" X-AW-Ticker="^GSPC"
X-AW-Active=false X-AW-Active=false
X-AW-ApiVersion=2 X-AW-ApiVersion=3
X-AW-Interval=60 X-AW-Interval=60
X-AW-Number=6 X-AW-Number=6

View File

@ -4,6 +4,6 @@ Name=USD/RUB
Comment=USD/RUB Comment=USD/RUB
X-AW-Ticker="USDRUB=X" X-AW-Ticker="USDRUB=X"
X-AW-Active=false X-AW-Active=false
X-AW-ApiVersion=2 X-AW-ApiVersion=3
X-AW-Interval=60 X-AW-Interval=60
X-AW-Number=8 X-AW-Number=8

View File

@ -4,6 +4,6 @@ Name=VIX
Comment=Volatility S&P 500 Comment=Volatility S&P 500
X-AW-Ticker="^VIX" X-AW-Ticker="^VIX"
X-AW-Active=false X-AW-Active=false
X-AW-ApiVersion=2 X-AW-ApiVersion=3
X-AW-Interval=60 X-AW-Interval=60
X-AW-Number=7 X-AW-Number=7

View File

@ -5,9 +5,8 @@ Comment=Custom command to get external IP
Exec=curl ip4.telize.com Exec=curl ip4.telize.com
X-AW-Prefix= X-AW-Prefix=
X-AW-Active=false X-AW-Active=false
X-AW-Output=true
X-AW-Redirect=nothing X-AW-Redirect=nothing
X-AW-Interval=1 X-AW-Interval=1
X-AW-ApiVersion=3 X-AW-ApiVersion=4
X-AW-Number=0 X-AW-Number=0
X-AW-Filters= X-AW-Filters=

11
sources/checkgit.cmake Normal file
View File

@ -0,0 +1,11 @@
exec_program(
"git"
${CMAKE_CURRENT_SOURCE_DIR}
ARGS "log" "-1" "--format=\"%h\""
OUTPUT_VARIABLE COMMIT_SHA
RETURN_VALUE GIT_RETURN
)
if (${GIT_RETURN} EQUAL "0")
set(PROJECT_COMMIT_SHA "${COMMIT_SHA}")
endif ()

View File

@ -0,0 +1,18 @@
# additional target to perform clang-format run, requires clang-format
# get all project files
file(GLOB_RECURSE ALL_SOURCE_FILES *.cpp *.h)
foreach (SOURCE_FILE ${ALL_SOURCE_FILES})
string(FIND ${SOURCE_FILE} ${PROJECT_TRDPARTY_DIR} PROJECT_TRDPARTY_DIR_FOUND)
if (NOT ${PROJECT_TRDPARTY_DIR_FOUND} EQUAL -1)
list(REMOVE_ITEM ALL_SOURCE_FILES ${SOURCE_FILE})
endif ()
endforeach ()
add_custom_target(
clangformat
COMMAND ${CLANGFORMAT_EXECUTABLE}
-style=file
-i
${ALL_SOURCE_FILES}
)

23
sources/cppcheck.cmake Normal file
View File

@ -0,0 +1,23 @@
# additional target to perform cppcheck run, requires cppcheck
# get all project files
# HACK this workaround is required to avoid qml files checking ^_^
file(GLOB_RECURSE ALL_SOURCE_FILES *.cpp *.h)
foreach (SOURCE_FILE ${ALL_SOURCE_FILES})
string(FIND ${SOURCE_FILE} ${PROJECT_TRDPARTY_DIR} PROJECT_TRDPARTY_DIR_FOUND)
if (NOT ${PROJECT_TRDPARTY_DIR_FOUND} EQUAL -1)
list(REMOVE_ITEM ALL_SOURCE_FILES ${SOURCE_FILE})
endif ()
endforeach ()
add_custom_target(
cppcheck
COMMAND ${CPPCHECK_EXECUTABLE}
--enable=warning,performance,portability,information,missingInclude
--std=c++11
--library=qt.cfg
--template="[{severity}][{id}] {message} {callstack} \(On {file}:{line}\)"
--verbose
--quiet
${ALL_SOURCE_FILES}
)

View File

@ -3,82 +3,82 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0 xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" > http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
<kcfgfile name=""/> <kcfgfile name=""/>
<group name="Widget"> <group name="Widget">
<!-- widget --> <!-- widget -->
<entry name="text" type="string"> <entry name="text" type="string">
<default>[$mark$number/$total: $name]</default> <default>[$mark$number/$total: $name]</default>
</entry> </entry>
</group> </group>
<group name="Advanced"> <group name="Advanced">
<!-- advanced --> <!-- advanced -->
<entry name="height" type="int"> <entry name="background" type="bool">
<default>0</default> <default>true</default>
</entry> </entry>
<entry name="width" type="int"> <entry name="verticalLayout" type="bool">
<default>0</default> <default>false</default>
</entry> </entry>
<entry name="tooltipType" type="string"> <entry name="height" type="int">
<default>windows</default> <default>0</default>
</entry> </entry>
<entry name="tooltipWidth" type="int"> <entry name="width" type="int">
<default>200</default> <default>0</default>
</entry> </entry>
<entry name="tooltipColor" type="string"> <entry name="mark" type="string">
<default>#ffffff</default> <default>¤</default>
</entry> </entry>
<entry name="background" type="bool"> <entry name="tooltipType" type="string">
<default>true</default> <default>windows</default>
</entry> </entry>
<entry name="verticalLayout" type="bool"> <entry name="tooltipWidth" type="int">
<default>false</default> <default>200</default>
</entry> </entry>
<entry name="mark" type="string"> <entry name="tooltipColor" type="string">
<default>¤</default> <default>#ffffff</default>
</entry> </entry>
</group> </group>
<group name="Appearance"> <group name="Appearance">
<!-- appearance --> <!-- appearance -->
<entry name="textAlign" type="string"> <entry name="textAlign" type="string">
<default>center</default> <default>center</default>
</entry> </entry>
<entry name="fontFamily" type="string"> <entry name="fontFamily" type="string">
<default>Terminus</default> <default>Terminus</default>
</entry> </entry>
<entry name="fontSize" type="int"> <entry name="fontSize" type="int">
<default>12</default> <default>12</default>
</entry> </entry>
<entry name="fontColor" type="string"> <entry name="fontColor" type="string">
<default>#000000</default> <default>#000000</default>
</entry> </entry>
<entry name="fontWeight" type="string"> <entry name="fontWeight" type="string">
<default>normal</default> <default>normal</default>
</entry> </entry>
<entry name="fontStyle" type="string"> <entry name="fontStyle" type="string">
<default>normal</default> <default>normal</default>
</entry> </entry>
<!-- current --> <!-- current -->
<entry name="currentTextAlign" type="string"> <entry name="currentTextAlign" type="string">
<default>center</default> <default>center</default>
</entry> </entry>
<entry name="currentFontFamily" type="string"> <entry name="currentFontFamily" type="string">
<default>Terminus</default> <default>Terminus</default>
</entry> </entry>
<entry name="currentFontSize" type="int"> <entry name="currentFontSize" type="int">
<default>12</default> <default>12</default>
</entry> </entry>
<entry name="currentFontColor" type="string"> <entry name="currentFontColor" type="string">
<default>#ff0000</default> <default>#ff0000</default>
</entry> </entry>
<entry name="currentFontWeight" type="string"> <entry name="currentFontWeight" type="string">
<default>normal</default> <default>normal</default>
</entry> </entry>
<entry name="currentFontStyle" type="string"> <entry name="currentFontStyle" type="string">
<default>normal</default> <default>normal</default>
</entry> </entry>
</group> </group>
</kcfg> </kcfg>

View File

@ -26,7 +26,7 @@ Item {
id: aboutPage id: aboutPage
// backend // backend
DPAdds { DPAdds {
id: dpAdds; id: dpAdds
} }
width: childrenRect.width width: childrenRect.width
@ -44,6 +44,7 @@ Item {
height: parent.height height: parent.height
width: parent.width width: parent.width
QtControls.Tab { QtControls.Tab {
anchors.margins: 10.0
title: i18n("About") title: i18n("About")
QtLayouts.ColumnLayout { QtLayouts.ColumnLayout {
@ -86,6 +87,7 @@ Item {
} }
QtControls.Tab { QtControls.Tab {
anchors.margins: 10.0
title: i18n("Acknowledgment") title: i18n("Acknowledgment")
QtLayouts.ColumnLayout { QtLayouts.ColumnLayout {
@ -99,6 +101,7 @@ Item {
QtControls.Label { QtControls.Label {
QtLayouts.Layout.fillHeight: true QtLayouts.Layout.fillHeight: true
QtLayouts.Layout.fillWidth: true QtLayouts.Layout.fillWidth: true
wrapMode: Text.WordWrap
horizontalAlignment: Text.AlignJustify horizontalAlignment: Text.AlignJustify
verticalAlignment: Text.AlignTop verticalAlignment: Text.AlignTop
textFormat: Text.RichText textFormat: Text.RichText
@ -110,6 +113,7 @@ Item {
} }
} }
Component.onCompleted: { Component.onCompleted: {
if (debug) console.debug() if (debug) console.debug()
} }

View File

@ -27,7 +27,7 @@ Item {
id: activeAppearancePage id: activeAppearancePage
// backend // backend
DPAdds { DPAdds {
id: dpAdds; id: dpAdds
} }
width: childrenRect.width width: childrenRect.width
@ -236,6 +236,7 @@ Item {
} }
} }
Component.onCompleted: { Component.onCompleted: {
if (debug) console.debug() if (debug) console.debug()
} }

View File

@ -27,7 +27,7 @@ Item {
id: advancedPage id: advancedPage
// backend // backend
DPAdds { DPAdds {
id: dpAdds; id: dpAdds
} }
width: childrenRect.width width: childrenRect.width
@ -37,19 +37,47 @@ Item {
property bool debug: dpAdds.isDebugEnabled() property bool debug: dpAdds.isDebugEnabled()
property alias cfg_background: background.checked
property alias cfg_verticalLayout: verticalLayout.checked
property alias cfg_height: widgetHeight.value property alias cfg_height: widgetHeight.value
property alias cfg_width: widgetWidth.value property alias cfg_width: widgetWidth.value
property string cfg_mark: mark.currentText
property string cfg_tooltipType: tooltipType.currentText property string cfg_tooltipType: tooltipType.currentText
property alias cfg_tooltipWidth: tooltipWidth.value property alias cfg_tooltipWidth: tooltipWidth.value
property alias cfg_tooltipColor: tooltipColor.text property alias cfg_tooltipColor: tooltipColor.text
property alias cfg_background: background.checked
property alias cfg_verticalLayout: verticalLayout.checked
property string cfg_mark: mark.currentText
Column { Column {
id: pageColumn id: pageColumn
anchors.fill: parent anchors.fill: parent
Row {
height: implicitHeight
width: parent.width
QtControls.Label {
height: parent.heigth
width: parent.width * 2 / 5
}
QtControls.CheckBox {
id: background
width: parent.width * 3 / 5
text: i18n("Enable background")
}
}
Row {
height: implicitHeight
width: parent.width
QtControls.Label {
height: parent.heigth
width: parent.width * 2 / 5
}
QtControls.CheckBox {
id: verticalLayout
width: parent.width * 3 / 5
text: i18n("Vertical layout")
}
}
Row { Row {
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
@ -90,126 +118,6 @@ Item {
} }
} }
Row {
height: implicitHeight
width: parent.width
QtControls.Label {
height: parent.height
width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("Tooltip type")
}
QtControls.ComboBox {
id: tooltipType
width: parent.width * 3 / 5
textRole: "label"
model: [
{
'label': i18n("contours"),
'name': "contours"
},
{
'label': i18n("windows"),
'name': "windows"
},
{
'label': i18n("clean desktop"),
'name': "clean"
},
{
'label': i18n("names"),
'name': "names"
},
{
'label': i18n("none"),
'name': "none"
}
]
onCurrentIndexChanged: cfg_tooltipType = model[currentIndex]["name"]
Component.onCompleted: {
if (debug) console.debug()
for (var i = 0; i < model.length; i++) {
if (model[i]["name"] == plasmoid.configuration.tooltipType) {
if (debug) console.info("Found", model[i]["name"], "on", i)
tooltipType.currentIndex = i;
}
}
}
}
}
Row {
height: implicitHeight
width: parent.width
QtControls.Label {
height: parent.height
width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("Tooltip width")
}
QtControls.SpinBox {
id: tooltipWidth
width: parent.width * 3 / 5
minimumValue: 100
maximumValue: 1000
stepSize: 50
value: plasmoid.configuration.tooltipWidth
}
}
Row {
height: implicitHeight
width: parent.width
QtControls.Label {
height: parent.height
width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("Font color")
}
QtControls.Button {
id: tooltipColor
width: parent.width * 3 / 5
style: QtStyles.ButtonStyle {
background: Rectangle {
color: plasmoid.configuration.tooltipColor
}
}
text: plasmoid.configuration.tooltipColor
onClicked: colorDialog.visible = true
}
}
Row {
height: implicitHeight
width: parent.width
QtControls.Label {
height: parent.heigth
width: parent.width * 2 / 5
}
QtControls.CheckBox {
id: background
width: parent.width * 3 / 5
text: i18n("Enable background")
}
}
Row {
height: implicitHeight
width: parent.width
QtControls.Label {
height: parent.heigth
width: parent.width * 2 / 5
}
QtControls.CheckBox {
id: verticalLayout
width: parent.width * 3 / 5
text: i18n("Vertical layout")
}
}
Row { Row {
height: implicitHeight height: implicitHeight
width: parent.width width: parent.width
@ -230,6 +138,107 @@ Item {
onCurrentIndexChanged: cfg_mark = currentText onCurrentIndexChanged: cfg_mark = currentText
} }
} }
QtControls.GroupBox {
height: implicitHeight
width: parent.width
title: i18n("Tooltip")
Column {
height: implicitHeight
width: parent.width
Row {
height: implicitHeight
width: parent.width
QtControls.Label {
height: parent.height
width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("Tooltip type")
}
QtControls.ComboBox {
id: tooltipType
width: parent.width * 3 / 5
textRole: "label"
model: [
{
'label': i18n("contours"),
'name': "contours"
},
{
'label': i18n("windows"),
'name': "windows"
},
{
'label': i18n("clean desktop"),
'name': "clean"
},
{
'label': i18n("names"),
'name': "names"
},
{
'label': i18n("none"),
'name': "none"
}
]
onCurrentIndexChanged: cfg_tooltipType = model[currentIndex]["name"]
Component.onCompleted: {
if (debug) console.debug()
for (var i = 0; i < model.length; i++) {
if (model[i]["name"] == plasmoid.configuration.tooltipType) {
if (debug) console.info("Found", model[i]["name"], "on", i)
tooltipType.currentIndex = i;
}
}
}
}
}
Row {
height: implicitHeight
width: parent.width
QtControls.Label {
height: parent.height
width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("Tooltip width")
}
QtControls.SpinBox {
id: tooltipWidth
width: parent.width * 3 / 5
minimumValue: 100
maximumValue: 1000
stepSize: 50
value: plasmoid.configuration.tooltipWidth
}
}
Row {
height: implicitHeight
width: parent.width
QtControls.Label {
height: parent.height
width: parent.width * 2 / 5
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
text: i18n("Font color")
}
QtControls.Button {
id: tooltipColor
width: parent.width * 3 / 5
style: QtStyles.ButtonStyle {
background: Rectangle {
color: plasmoid.configuration.tooltipColor
}
}
text: plasmoid.configuration.tooltipColor
onClicked: colorDialog.visible = true
}
}
}
}
} }
QtDialogs.ColorDialog { QtDialogs.ColorDialog {

View File

@ -27,7 +27,7 @@ Item {
id: inactiveAppearancePage id: inactiveAppearancePage
// backend // backend
DPAdds { DPAdds {
id: dpAdds; id: dpAdds
} }
width: childrenRect.width width: childrenRect.width
@ -236,6 +236,7 @@ Item {
} }
} }
Component.onCompleted: { Component.onCompleted: {
if (debug) console.debug() if (debug) console.debug()
} }

View File

@ -30,7 +30,7 @@ Item {
id: main id: main
// backend // backend
DPAdds { DPAdds {
id: dpAdds; id: dpAdds
} }
property bool debug: dpAdds.isDebugEnabled() property bool debug: dpAdds.isDebugEnabled()
@ -101,6 +101,7 @@ Item {
} }
} }
Timer { Timer {
id: timer id: timer
interval: 1000 interval: 1000

View File

@ -25,7 +25,7 @@ Item {
id: widgetPage id: widgetPage
// backend // backend
DPAdds { DPAdds {
id: dpAdds; id: dpAdds
} }
width: childrenRect.width width: childrenRect.width

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.desktoppanel X-KDE-PluginInfo-Name=org.kde.plasma.desktoppanel
X-KDE-PluginInfo-Version=2.4.0 X-KDE-PluginInfo-Version=3.0.0
X-KDE-PluginInfo-Website=http://arcanis.name/projects/awesome-widgets/ X-KDE-PluginInfo-Website=http://arcanis.name/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

@ -2,13 +2,13 @@ set(PLUGIN_NAME dpplugin)
add_definitions(-DTRANSLATION_DOMAIN=\"plasma_applet_org.kde.plasma.desktoppanel\") add_definitions(-DTRANSLATION_DOMAIN=\"plasma_applet_org.kde.plasma.desktoppanel\")
include_directories( include_directories(
${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}
${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}
${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_BINARY_DIR}/../ ${CMAKE_CURRENT_BINARY_DIR}/../
${PROJECT_TRDPARTY_DIR} ${PROJECT_TRDPARTY_DIR}
${Qt_INCLUDE} ${Qt_INCLUDE}
${Kf5_INCLUDE} ${Kf5_INCLUDE}
) )
file(GLOB SUBPROJECT_SOURCE *.cpp ${PROJECT_TRDPARTY_DIR}/fontdialog/*.cpp ${CMAKE_SOURCE_DIR}/*.cpp) file(GLOB SUBPROJECT_SOURCE *.cpp ${PROJECT_TRDPARTY_DIR}/fontdialog/*.cpp ${CMAKE_SOURCE_DIR}/*.cpp)

View File

@ -40,43 +40,41 @@
DPAdds::DPAdds(QObject *parent) DPAdds::DPAdds(QObject *parent)
: QObject(parent) : QObject(parent)
{ {
qCDebug(LOG_DP);
// logging
qSetMessagePattern(LOG_FORMAT); qSetMessagePattern(LOG_FORMAT);
qCDebug(LOG_DP) << __PRETTY_FUNCTION__;
foreach (const QString metadata, getBuildData())
qCDebug(LOG_DP) << metadata;
connect(KWindowSystem::self(), SIGNAL(currentDesktopChanged(int)), this, SIGNAL(desktopChanged())); connect(KWindowSystem::self(), SIGNAL(currentDesktopChanged(int)), this,
connect(KWindowSystem::self(), SIGNAL(windowAdded(WId)), this, SIGNAL(windowListChanged())); SIGNAL(desktopChanged()));
connect(KWindowSystem::self(), SIGNAL(windowRemoved(WId)), this, SIGNAL(windowListChanged())); connect(KWindowSystem::self(), SIGNAL(windowAdded(WId)), this,
SIGNAL(windowListChanged()));
connect(KWindowSystem::self(), SIGNAL(windowRemoved(WId)), this,
SIGNAL(windowListChanged()));
} }
DPAdds::~DPAdds() DPAdds::~DPAdds()
{ {
qCDebug(LOG_DP); qCDebug(LOG_DP) << __PRETTY_FUNCTION__;
} }
// HACK: since QML could not use QLoggingCategory I need this hack
bool DPAdds::isDebugEnabled() const bool DPAdds::isDebugEnabled() const
{ {
qCDebug(LOG_DP);
return LOG_DP().isDebugEnabled(); return LOG_DP().isDebugEnabled();
} }
int DPAdds::currentDesktop() const int DPAdds::currentDesktop() const
{ {
qCDebug(LOG_DP);
return KWindowSystem::currentDesktop(); return KWindowSystem::currentDesktop();
} }
QStringList DPAdds::dictKeys() const QStringList DPAdds::dictKeys() const
{ {
qCDebug(LOG_DP);
QStringList allKeys; QStringList allKeys;
allKeys.append(QString("mark")); allKeys.append(QString("mark"));
allKeys.append(QString("name")); allKeys.append(QString("name"));
@ -89,25 +87,27 @@ QStringList DPAdds::dictKeys() const
int DPAdds::numberOfDesktops() const int DPAdds::numberOfDesktops() const
{ {
qCDebug(LOG_DP);
return KWindowSystem::numberOfDesktops(); return KWindowSystem::numberOfDesktops();
} }
QString DPAdds::toolTipImage(const int desktop) const QString DPAdds::toolTipImage(const int desktop) const
{ {
qCDebug(LOG_DP);
qCDebug(LOG_DP) << "Desktop" << desktop; qCDebug(LOG_DP) << "Desktop" << desktop;
if (tooltipType == QString("none")) return QString(); // drop if no tooltip required
if (m_tooltipType == QString("none"))
return QString();
// prepare // prepare
DesktopWindowsInfo info = getInfoByDesktop(desktop); DesktopWindowsInfo info = getInfoByDesktop(desktop);
if (tooltipType == QString("names")) { // special tooltip format for names
if (m_tooltipType == QString("names")) {
QStringList windowList; QStringList windowList;
std::for_each(info.windowsData.cbegin(), info.windowsData.cend(), std::for_each(
[&windowList](WindowData data) { windowList.append(data.name); }); info.windowsData.cbegin(), info.windowsData.cend(),
return QString("<ul><li>%1</li></ul>").arg(windowList.join(QString("</li><li>"))); [&windowList](WindowData data) { windowList.append(data.name); });
return QString("<ul><li>%1</li></ul>")
.arg(windowList.join(QString("</li><li>")));
} }
// init // init
QGraphicsScene *toolTipScene = new QGraphicsScene(); QGraphicsScene *toolTipScene = new QGraphicsScene();
@ -119,54 +119,64 @@ QString DPAdds::toolTipImage(const int desktop) const
toolTipView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); toolTipView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
// update // update
float margin = 5.0 * info.desktop.width() / 400.0; float margin = 5.0 * info.desktop.width() / 400.0;
toolTipView->resize(info.desktop.width() + 2.0 * margin, info.desktop.height() + 2.0 * margin); toolTipView->resize(info.desktop.width() + 2.0 * margin,
info.desktop.height() + 2.0 * margin);
toolTipScene->clear(); toolTipScene->clear();
toolTipScene->setBackgroundBrush(QBrush(Qt::NoBrush)); toolTipScene->setBackgroundBrush(QBrush(Qt::NoBrush));
// borders // borders
toolTipScene->addLine(0, 0, 0, info.desktop.height() + 2.0 * margin); toolTipScene->addLine(0, 0, 0, info.desktop.height() + 2.0 * margin);
toolTipScene->addLine(0, info.desktop.height() + 2.0 * margin, toolTipScene->addLine(0, info.desktop.height() + 2.0 * margin,
info.desktop.width() + 2.0 * margin, info.desktop.height() + 2.0 * margin); info.desktop.width() + 2.0 * margin,
toolTipScene->addLine(info.desktop.width() + 2.0 * margin, info.desktop.height() + 2.0 * margin, info.desktop.height() + 2.0 * margin);
toolTipScene->addLine(info.desktop.width() + 2.0 * margin,
info.desktop.height() + 2.0 * margin,
info.desktop.width() + 2.0 * margin, 0); info.desktop.width() + 2.0 * margin, 0);
toolTipScene->addLine(info.desktop.width() + 2.0 * margin, 0, 0, 0); toolTipScene->addLine(info.desktop.width() + 2.0 * margin, 0, 0, 0);
if (tooltipType == QString("contours")) { if (m_tooltipType == QString("contours")) {
QPen pen = QPen(); QPen pen = QPen();
pen.setWidthF(2.0 * info.desktop.width() / 400.0); pen.setWidthF(2.0 * info.desktop.width() / 400.0);
pen.setColor(QColor(tooltipColor)); pen.setColor(QColor(m_tooltipColor));
foreach(WindowData data, info.windowsData) { foreach (WindowData data, info.windowsData) {
QRect rect = data.rect; QRect rect = data.rect;
toolTipScene->addLine(rect.left() + margin, rect.bottom() + margin, toolTipScene->addLine(rect.left() + margin, rect.bottom() + margin,
rect.left() + margin, rect.top() + margin, pen); rect.left() + margin, rect.top() + margin,
pen);
toolTipScene->addLine(rect.left() + margin, rect.top() + margin, toolTipScene->addLine(rect.left() + margin, rect.top() + margin,
rect.right() + margin, rect.top() + margin, pen); rect.right() + margin, rect.top() + margin,
pen);
toolTipScene->addLine(rect.right() + margin, rect.top() + margin, toolTipScene->addLine(rect.right() + margin, rect.top() + margin,
rect.right() + margin, rect.bottom() + margin, pen); rect.right() + margin, rect.bottom() + margin,
pen);
toolTipScene->addLine(rect.right() + margin, rect.bottom() + margin, toolTipScene->addLine(rect.right() + margin, rect.bottom() + margin,
rect.left() + margin, rect.bottom() + margin, pen); rect.left() + margin, rect.bottom() + margin,
pen);
} }
} else if (tooltipType == QString("clean")) { } else if (m_tooltipType == QString("clean")) {
QScreen *screen = QGuiApplication::primaryScreen(); QScreen *screen = QGuiApplication::primaryScreen();
std::for_each(info.desktopsData.cbegin(), info.desktopsData.cend(), std::for_each(info.desktopsData.cbegin(), info.desktopsData.cend(),
[&toolTipScene, &screen](WindowData data) { [&toolTipScene, &screen](WindowData data) {
QPixmap desktop = screen->grabWindow(data.id); QPixmap desktop = screen->grabWindow(data.id);
toolTipScene->addPixmap(desktop)->setOffset(data.rect.left(), data.rect.top()); toolTipScene->addPixmap(desktop)
}); ->setOffset(data.rect.left(), data.rect.top());
} else if (tooltipType == QString("windows")) { });
} else if (m_tooltipType == QString("windows")) {
QScreen *screen = QGuiApplication::primaryScreen(); QScreen *screen = QGuiApplication::primaryScreen();
std::for_each(info.desktopsData.cbegin(), info.desktopsData.cend(), std::for_each(info.desktopsData.cbegin(), info.desktopsData.cend(),
[&toolTipScene, &screen](WindowData data) { [&toolTipScene, &screen](WindowData data) {
QPixmap desktop = screen->grabWindow(data.id); QPixmap desktop = screen->grabWindow(data.id);
toolTipScene->addPixmap(desktop)->setOffset(data.rect.left(), data.rect.top()); toolTipScene->addPixmap(desktop)
}); ->setOffset(data.rect.left(), data.rect.top());
});
std::for_each(info.windowsData.cbegin(), info.windowsData.cend(), std::for_each(info.windowsData.cbegin(), info.windowsData.cend(),
[&toolTipScene, &screen](WindowData data) { [&toolTipScene, &screen](WindowData data) {
QPixmap window = screen->grabWindow(data.id); QPixmap window = screen->grabWindow(data.id);
toolTipScene->addPixmap(window)->setOffset(data.rect.left(), data.rect.top()); toolTipScene->addPixmap(window)
}); ->setOffset(data.rect.left(), data.rect.top());
});
} }
QPixmap image = toolTipView->grab().scaledToWidth(tooltipWidth); QPixmap image = toolTipView->grab().scaledToWidth(m_tooltipWidth);
QByteArray byteArray; QByteArray byteArray;
QBuffer buffer(&byteArray); QBuffer buffer(&byteArray);
image.save(&buffer, "PNG"); image.save(&buffer, "PNG");
@ -174,19 +184,19 @@ QString DPAdds::toolTipImage(const int desktop) const
delete toolTipView; delete toolTipView;
delete toolTipScene; delete toolTipScene;
return QString("<img src=\"data:image/png;base64,%1\"/>").arg(QString(byteArray.toBase64())); return QString("<img src=\"data:image/png;base64,%1\"/>")
.arg(QString(byteArray.toBase64()));
} }
QString DPAdds::parsePattern(const QString pattern, const int desktop) const QString DPAdds::parsePattern(const QString pattern, const int desktop) const
{ {
qCDebug(LOG_DP);
qCDebug(LOG_DP) << "Pattern" << pattern; qCDebug(LOG_DP) << "Pattern" << pattern;
qCDebug(LOG_DP) << "Desktop number" << desktop; qCDebug(LOG_DP) << "Desktop number" << desktop;
QString parsed = pattern; QString parsed = pattern;
parsed.replace(QString("$$"), QString("$\\$\\")); parsed.replace(QString("$$"), QString("$\\$\\"));
foreach(QString key, dictKeys()) foreach (QString key, dictKeys())
parsed.replace(QString("$%1").arg(key), valueByKey(key, desktop)); parsed.replace(QString("$%1").arg(key), valueByKey(key, desktop));
parsed.replace(QString("$\\$\\"), QString("$$")); parsed.replace(QString("$\\$\\"), QString("$$"));
@ -196,37 +206,37 @@ QString DPAdds::parsePattern(const QString pattern, const int desktop) const
void DPAdds::setMark(const QString newMark) void DPAdds::setMark(const QString newMark)
{ {
qCDebug(LOG_DP);
qCDebug(LOG_DP) << "Mark" << newMark; qCDebug(LOG_DP) << "Mark" << newMark;
mark = newMark; m_mark = newMark;
} }
void DPAdds::setToolTipData(const QVariantMap tooltipData) void DPAdds::setToolTipData(const QVariantMap tooltipData)
{ {
qCDebug(LOG_DP);
qCDebug(LOG_DP) << "Data" << tooltipData; qCDebug(LOG_DP) << "Data" << tooltipData;
tooltipColor = tooltipData[QString("tooltipColor")].toString(); m_tooltipColor = tooltipData[QString("tooltipColor")].toString();
tooltipType = tooltipData[QString("tooltipType")].toString(); m_tooltipType = tooltipData[QString("tooltipType")].toString();
tooltipWidth = tooltipData[QString("tooltipWidth")].toInt(); m_tooltipWidth = tooltipData[QString("tooltipWidth")].toInt();
} }
QString DPAdds::valueByKey(const QString key, int desktop) const QString DPAdds::valueByKey(const QString key, int desktop) const
{ {
qCDebug(LOG_DP);
qCDebug(LOG_DP) << "Requested key" << key; qCDebug(LOG_DP) << "Requested key" << key;
qCDebug(LOG_DP) << "Desktop number" << desktop; qCDebug(LOG_DP) << "Desktop number" << desktop;
if (desktop == -1) desktop = currentDesktop(); if (desktop == -1)
desktop = currentDesktop();
QString currentMark = currentDesktop() == desktop ? mark : QString(""); QString currentMark = currentDesktop() == desktop ? m_mark : QString("");
if (key == QString("mark")) if (key == QString("mark"))
return QString("%1").arg(currentMark, mark.count(), QLatin1Char(' ')) return QString("%1")
.replace(QString(" "), QString("&nbsp;")); .arg(currentMark, m_mark.count(), QLatin1Char(' '))
.replace(QString(" "), QString("&nbsp;"));
else if (key == QString("name")) else if (key == QString("name"))
return KWindowSystem::desktopName(desktop).replace(QString(" "), QString("&nbsp;")); return KWindowSystem::desktopName(desktop)
.replace(QString(" "), QString("&nbsp;"));
else if (key == QString("number")) else if (key == QString("number"))
return QString::number(desktop); return QString::number(desktop);
else if (key == QString("total")) else if (key == QString("total"))
@ -236,38 +246,60 @@ QString DPAdds::valueByKey(const QString key, int desktop) const
} }
// HACK: this method uses variables from version.h
QString DPAdds::getAboutText(const QString type) const QString DPAdds::getAboutText(const QString type) const
{ {
qCDebug(LOG_DP);
qCDebug(LOG_DP) << "Type" << type; qCDebug(LOG_DP) << "Type" << type;
QString text; QString text;
if (type == QString("header")) if (type == QString("header")) {
text = QString(NAME); text = QString(NAME);
else if (type == QString("version")) } else if (type == QString("version")) {
text = i18n("Version %1 (build date %2)", QString(VERSION), QString(BUILD_DATE)); text = i18n("Version %1 (build date %2)", QString(VERSION),
else if (type == QString("description")) 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"); text = i18n("A set of minimalistic plasmoid widgets");
else if (type == QString("links")) } else if (type == QString("links")) {
text = i18n("Links:") + QString("<br>") + 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>")
QString("<a href=\"%1\">%2</a><br>").arg(QString(REPOSITORY)).arg(i18n("Repository")) + .arg(QString(HOMEPAGE))
QString("<a href=\"%1\">%2</a><br>").arg(QString(BUGTRACKER)).arg(i18n("Bugtracker")) + .arg(i18n("Homepage"))
QString("<a href=\"%1\">%2</a><br>").arg(QString(TRANSLATION)).arg(i18n("Translation issue")) + + QString("<a href=\"%1\">%2</a><br>")
QString("<a href=\"%1\">%2</a><br>").arg(QString(AUR_PACKAGES)).arg(i18n("AUR packages")) + .arg(QString(REPOSITORY))
QString("<a href=\"%1\">%2</a>").arg(QString(OPENSUSE_PACKAGES)).arg(i18n("openSUSE packages")); .arg(i18n("Repository"))
else if (type == QString("copy")) + QString("<a href=\"%1\">%2</a><br>")
text = QString("<small>&copy; %1 <a href=\"mailto:%2\">%3</a><br>").arg(QString(DATE)).arg(QString(EMAIL)).arg(QString(AUTHOR)) + .arg(QString(BUGTRACKER))
i18n("This software is licensed under %1", QString(LICENSE)) + QString("</small>"); .arg(i18n("Bugtracker"))
else if (type == QString("translators")) + 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)); text = i18n("Translators: %1", QString(TRANSLATORS));
else if (type == QString("3rdparty")) { } else if (type == QString("3rdparty")) {
QStringList trdPartyList = QString(TRDPARTY_LICENSE).split(QChar(';'), QString::SkipEmptyParts); QStringList trdPartyList
for (int i=0; i<trdPartyList.count(); i++) = QString(TRDPARTY_LICENSE)
trdPartyList[i] = QString("<a href=\"%3\">%1</a> (%2 license)") .split(QChar(';'), QString::SkipEmptyParts);
.arg(trdPartyList.at(i).split(QChar(',')).at(0)) for (int i = 0; i < trdPartyList.count(); i++)
.arg(trdPartyList.at(i).split(QChar(',')).at(1)) trdPartyList[i]
.arg(trdPartyList.at(i).split(QChar(',')).at(2)); = QString("<a href=\"%3\">%1</a> (%2 license)")
.arg(trdPartyList.at(i).split(QChar(',')).at(0))
.arg(trdPartyList.at(i).split(QChar(',')).at(1))
.arg(trdPartyList.at(i).split(QChar(',')).at(2));
text = i18n("This software uses: %1", trdPartyList.join(QString(", "))); text = i18n("This software uses: %1", trdPartyList.join(QString(", ")));
} }
@ -277,15 +309,14 @@ QString DPAdds::getAboutText(const QString type) const
QVariantMap DPAdds::getFont(const QVariantMap defaultFont) const QVariantMap DPAdds::getFont(const QVariantMap defaultFont) const
{ {
qCDebug(LOG_DP);
qCDebug(LOG_DP) << "Default font is" << defaultFont; qCDebug(LOG_DP) << "Default font is" << defaultFont;
QVariantMap fontMap; QVariantMap fontMap;
CFont defaultCFont = CFont(defaultFont[QString("family")].toString(), CFont defaultCFont = CFont(defaultFont[QString("family")].toString(),
defaultFont[QString("size")].toInt(), defaultFont[QString("size")].toInt(), 400, false,
400, false, defaultFont[QString("color")].toString()); defaultFont[QString("color")].toString());
CFont font = CFontDialog::getFont(i18n("Select font"), defaultCFont, CFont font
false, false); = CFontDialog::getFont(i18n("Select font"), defaultCFont, false, false);
fontMap[QString("color")] = font.color().name(); fontMap[QString("color")] = font.color().name();
fontMap[QString("family")] = font.family(); fontMap[QString("family")] = font.family();
fontMap[QString("size")] = font.pointSize(); fontMap[QString("size")] = font.pointSize();
@ -294,20 +325,22 @@ QVariantMap DPAdds::getFont(const QVariantMap defaultFont) const
} }
// to avoid additional object definition this method is static
void DPAdds::sendNotification(const QString eventId, const QString message) void DPAdds::sendNotification(const QString eventId, const QString message)
{ {
qCDebug(LOG_DP);
qCDebug(LOG_DP) << "Event" << eventId; qCDebug(LOG_DP) << "Event" << eventId;
qCDebug(LOG_DP) << "Message" << message; qCDebug(LOG_DP) << "Message" << message;
KNotification *notification = KNotification::event(eventId, QString("Desktop Panel ::: %1").arg(eventId), message); KNotification *notification = KNotification::event(
notification->setComponentName(QString("plasma-applet-org.kde.plasma.desktop-panel")); eventId, QString("Desktop Panel ::: %1").arg(eventId), message);
notification->setComponentName(
QString("plasma-applet-org.kde.plasma.desktop-panel"));
} }
// slot for mouse click
void DPAdds::setCurrentDesktop(const int desktop) const void DPAdds::setCurrentDesktop(const int desktop) const
{ {
qCDebug(LOG_DP);
qCDebug(LOG_DP) << "Desktop" << desktop; qCDebug(LOG_DP) << "Desktop" << desktop;
KWindowSystem::setCurrentDesktop(desktop); KWindowSystem::setCurrentDesktop(desktop);
@ -316,27 +349,30 @@ void DPAdds::setCurrentDesktop(const int desktop) const
DPAdds::DesktopWindowsInfo DPAdds::getInfoByDesktop(const int desktop) const DPAdds::DesktopWindowsInfo DPAdds::getInfoByDesktop(const int desktop) const
{ {
qCDebug(LOG_DP);
qCDebug(LOG_DP) << "Desktop" << desktop; qCDebug(LOG_DP) << "Desktop" << desktop;
DesktopWindowsInfo info; DesktopWindowsInfo info;
info.desktop = KWindowSystem::workArea(desktop); info.desktop = KWindowSystem::workArea(desktop);
foreach(WId id, KWindowSystem::windows()) { foreach (WId id, KWindowSystem::windows()) {
KWindowInfo winInfo = KWindowInfo(id, KWindowInfo winInfo = KWindowInfo(
NET::Property::WMDesktop | NET::Property::WMGeometry | id, NET::Property::WMDesktop | NET::Property::WMGeometry
NET::Property::WMState | NET::Property::WMWindowType | | NET::Property::WMState | NET::Property::WMWindowType
NET::Property::WMVisibleName); | NET::Property::WMVisibleName);
if (!winInfo.isOnDesktop(desktop)) continue; if (!winInfo.isOnDesktop(desktop))
continue;
WindowData data; WindowData data;
data.id = id; data.id = id;
data.name = winInfo.visibleName(); data.name = winInfo.visibleName();
data.rect = winInfo.geometry(); data.rect = winInfo.geometry();
if (winInfo.windowType(NET::WindowTypeMask::NormalMask) == NET::WindowType::Normal) { if (winInfo.windowType(NET::WindowTypeMask::NormalMask)
if (winInfo.isMinimized()) continue; == NET::WindowType::Normal) {
if (winInfo.isMinimized())
continue;
info.windowsData.append(data); info.windowsData.append(data);
} else if (winInfo.windowType(NET::WindowTypeMask::DesktopMask) == NET::WindowType::Desktop) { } else if (winInfo.windowType(NET::WindowTypeMask::DesktopMask)
== NET::WindowType::Desktop) {
info.desktopsData.append(data); info.desktopsData.append(data);
} }
} }

View File

@ -19,11 +19,9 @@
#ifndef DPADDS_H #ifndef DPADDS_H
#define DPADDS_H #define DPADDS_H
#include <Plasma/Containment> // ui library required by WId definition
#include <QGuiApplication>
#include <QMap> #include <QRect>
#include <QObject>
#include <QVariant>
class DPAdds : public QObject class DPAdds : public QObject
@ -45,13 +43,13 @@ class DPAdds : public QObject
public: public:
explicit DPAdds(QObject *parent = nullptr); explicit DPAdds(QObject *parent = nullptr);
virtual ~DPAdds(); virtual ~DPAdds();
Q_INVOKABLE bool isDebugEnabled() const; Q_INVOKABLE bool isDebugEnabled() const;
Q_INVOKABLE int currentDesktop() const; Q_INVOKABLE int currentDesktop() const;
Q_INVOKABLE QStringList dictKeys() const; Q_INVOKABLE QStringList dictKeys() const;
Q_INVOKABLE int numberOfDesktops() const; Q_INVOKABLE int numberOfDesktops() const;
Q_INVOKABLE QString toolTipImage(const int desktop) const; Q_INVOKABLE QString toolTipImage(const int desktop) const;
Q_INVOKABLE QString parsePattern(const QString pattern, const int desktop) const; Q_INVOKABLE QString parsePattern(const QString pattern,
const int desktop) const;
// values // values
Q_INVOKABLE void setMark(const QString newMark); Q_INVOKABLE void setMark(const QString newMark);
Q_INVOKABLE void setToolTipData(const QVariantMap tooltipData); Q_INVOKABLE void setToolTipData(const QVariantMap tooltipData);
@ -65,16 +63,17 @@ signals:
void windowListChanged() const; void windowListChanged() const;
public slots: public slots:
Q_INVOKABLE static void sendNotification(const QString eventId, const QString message); Q_INVOKABLE static void sendNotification(const QString eventId,
const QString message);
Q_INVOKABLE void setCurrentDesktop(const int desktop) const; Q_INVOKABLE void setCurrentDesktop(const int desktop) const;
private: private:
DesktopWindowsInfo getInfoByDesktop(const int desktop) const; DesktopWindowsInfo getInfoByDesktop(const int desktop) const;
// variables // variables
int tooltipWidth = 200; int m_tooltipWidth = 200;
QString mark = QString("*"); QString m_mark = QString("*");
QString tooltipColor = QString("#000000"); QString m_tooltipColor = QString("#000000");
QString tooltipType = QString("none"); QString m_tooltipType = QString("none");
}; };

View File

@ -1,22 +1,21 @@
set(SUBPROJECT plasma_dataengine_extsysmon) set(SUBPROJECT plasma_dataengine_extsysmon)
set(PLUGIN_NAME ${SUBPROJECT})
message(STATUS "Subproject ${SUBPROJECT}") message(STATUS "Subproject ${SUBPROJECT}")
add_definitions(-DTRANSLATION_DOMAIN=\"plasma_applet_org.kde.plasma.awesomewidget\") add_definitions(-DTRANSLATION_DOMAIN=\"plasma_applet_org.kde.plasma.awesomewidget\")
include_directories( include_directories(
${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}
${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}
${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_BINARY_DIR}/../ ${CMAKE_CURRENT_BINARY_DIR}/../
${CMAKE_CURRENT_SOURCE_DIR}/../${PROJECT_LIBRARY}/ ${CMAKE_CURRENT_SOURCE_DIR}/../${PROJECT_LIBRARY}/
${PROJECT_TRDPARTY_DIR} ${PROJECT_TRDPARTY_DIR}
${Qt_INCLUDE} ${Qt_INCLUDE}
${Kf5_INCLUDE} ${Kf5_INCLUDE}
) )
file(GLOB SUBPROJECT_DESKTOP_IN *.desktop) file(GLOB SUBPROJECT_DESKTOP_IN *.desktop)
file(RELATIVE_PATH SUBPROJECT_DESKTOP ${CMAKE_SOURCE_DIR} ${SUBPROJECT_DESKTOP_IN}) file(RELATIVE_PATH SUBPROJECT_DESKTOP ${CMAKE_SOURCE_DIR} ${SUBPROJECT_DESKTOP_IN})
file(GLOB SUBPROJECT_SOURCE *.cpp ${PROJECT_TRDPARTY_DIR}/task/*.cpp ${CMAKE_SOURCE_DIR}/*.cpp) file(GLOB SUBPROJECT_SOURCE *.cpp sources/*.cpp ${PROJECT_TRDPARTY_DIR}/task/*.cpp ${CMAKE_SOURCE_DIR}/*.cpp)
set(TASK_HEADER ${PROJECT_TRDPARTY_DIR}/task/task.h) set(TASK_HEADER ${PROJECT_TRDPARTY_DIR}/task/task.h)
file(GLOB SUBPROJECT_CONF *.conf) file(GLOB SUBPROJECT_CONF *.conf)
file(GLOB SUBPROJECT_INI *.ini) file(GLOB SUBPROJECT_INI *.ini)
@ -26,13 +25,12 @@ configure_file(${SUBPROJECT_DESKTOP_IN} ${CMAKE_CURRENT_BINARY_DIR}/${SUBPROJECT
# make # make
qt5_wrap_cpp(TASK_MOC_SOURCE ${TASK_HEADER}) qt5_wrap_cpp(TASK_MOC_SOURCE ${TASK_HEADER})
qt5_wrap_ui(SUBPROJECT_UI_HEADER ${SUBPROJECT_UI}) add_library(${SUBPROJECT} MODULE ${SUBPROJECT_SOURCE} ${TASK_MOC_SOURCE})
add_library(${PLUGIN_NAME} MODULE ${SUBPROJECT_SOURCE} ${SUBPROJECT_UI_HEADER} ${TASK_MOC_SOURCE}) target_link_libraries(${SUBPROJECT} ${PROJECT_LIBRARY} ${Qt_LIBRARIES} ${Kf5_LIBRARIES})
target_link_libraries(${PLUGIN_NAME} ${PROJECT_LIBRARY} ${Qt_LIBRARIES} ${Kf5_LIBRARIES}) kcoreaddons_desktop_to_json(${SUBPROJECT} ${CMAKE_CURRENT_BINARY_DIR}/${SUBPROJECT_DESKTOP})
kcoreaddons_desktop_to_json(${PLUGIN_NAME} ${CMAKE_CURRENT_BINARY_DIR}/${SUBPROJECT_DESKTOP})
# install # install
install(TARGETS ${PLUGIN_NAME} DESTINATION ${PLUGIN_INSTALL_DIR}/plasma/dataengine) install(TARGETS ${SUBPROJECT} DESTINATION ${PLUGIN_INSTALL_DIR}/plasma/dataengine)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${SUBPROJECT_DESKTOP} DESTINATION ${SERVICES_INSTALL_DIR}) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${SUBPROJECT_DESKTOP} DESTINATION ${SERVICES_INSTALL_DIR})
install(FILES ${SUBPROJECT_CONF} DESTINATION ${CONFIG_INSTALL_DIR}) install(FILES ${SUBPROJECT_CONF} DESTINATION ${CONFIG_INSTALL_DIR})
install(FILES ${SUBPROJECT_INI} DESTINATION ${CONFIG_INSTALL_DIR}) install(FILES ${SUBPROJECT_INI} DESTINATION ${CONFIG_INSTALL_DIR})

View File

@ -17,28 +17,14 @@
#include "extsysmon.h" #include "extsysmon.h"
#include <KWindowSystem>
#include <Plasma/DataContainer>
#include <QDBusArgument>
#include <QDBusConnection>
#include <QDBusConnectionInterface>
#include <QDBusMessage>
#include <QDir> #include <QDir>
#include <QFile> #include <QFile>
#include <QNetworkInterface>
#include <QRegExp> #include <QRegExp>
#include <QTextCodec>
#include <QSettings> #include <QSettings>
#include <QStandardPaths> #include <QStandardPaths>
#include <task/taskadds.h>
#include "awdebug.h" #include "awdebug.h"
#include "extquotes.h" #include "extsysmonaggregator.h"
#include "extscript.h"
#include "extupgrade.h"
#include "extweather.h"
#include "version.h" #include "version.h"
@ -46,415 +32,37 @@ ExtendedSysMon::ExtendedSysMon(QObject *parent, const QVariantList &args)
: Plasma::DataEngine(parent, args) : Plasma::DataEngine(parent, args)
{ {
Q_UNUSED(args) Q_UNUSED(args)
qCDebug(LOG_ESM);
// logging
qSetMessagePattern(LOG_FORMAT); qSetMessagePattern(LOG_FORMAT);
qCDebug(LOG_ESM) << __PRETTY_FUNCTION__;
foreach (const QString metadata, getBuildData())
qCDebug(LOG_ESM) << metadata;
setMinimumPollingInterval(333); setMinimumPollingInterval(333);
readConfiguration(); readConfiguration();
extQuotes = new ExtItemAggregator<ExtQuotes>(nullptr, QString("quotes")); // init aggregator
extScripts = new ExtItemAggregator<ExtScript>(nullptr, QString("scripts")); aggregator = new ExtSysMonAggregator(this, configuration);
extUpgrade = new ExtItemAggregator<ExtUpgrade>(nullptr, QString("upgrade")); foreach (QString source, aggregator->sources())
extWeather = new ExtItemAggregator<ExtWeather>(nullptr, QString("weather")); setData(source, aggregator->initialData(source));
} }
ExtendedSysMon::~ExtendedSysMon() ExtendedSysMon::~ExtendedSysMon()
{ {
qCDebug(LOG_ESM); qCDebug(LOG_ESM) << __PRETTY_FUNCTION__;
delete extQuotes; delete aggregator;
delete extScripts;
delete extUpgrade;
delete extWeather;
}
QVariantHash ExtendedSysMon::getBattery(const QString acpiPath) const
{
qCDebug(LOG_ESM);
qCDebug(LOG_ESM) << "ACPI path" << acpiPath;
QVariantHash battery;
battery[QString("ac")] = false;
battery[QString("bat")] = 0;
// adaptor
QFile acFile(QString("%1/AC/online").arg(acpiPath));
if (acFile.open(QIODevice::ReadOnly)) {
if (QString(acFile.readLine()).trimmed().toInt() == 1)
battery[QString("ac")] = true;
}
acFile.close();
// batterites
float currentLevel = 0.0;
float fullLevel = 0.0;
QStringList batDevices = QDir(acpiPath).entryList(QStringList() << QString("BAT*"),
QDir::Dirs | QDir::NoDotAndDotDot,
QDir::Name);
for (int i=0; i<batDevices.count(); i++) {
QFile currentLevelFile(QString("%1/%2/energy_now").arg(acpiPath).arg(batDevices.at(i)));
QFile fullLevelFile(QString("%1/%2/energy_full").arg(acpiPath).arg(batDevices.at(i)));
if ((currentLevelFile.open(QIODevice::ReadOnly)) &&
(fullLevelFile.open(QIODevice::ReadOnly))) {
float batCurrent = QString(currentLevelFile.readLine()).trimmed().toFloat();
float batFull = QString(fullLevelFile.readLine()).trimmed().toFloat();
battery[QString("bat%1").arg(i)] = static_cast<int>(100 * batCurrent / batFull);
currentLevel += batCurrent;
fullLevel += batFull;
}
currentLevelFile.close();
fullLevelFile.close();
}
battery[QString("bat")] = static_cast<int>(100 * currentLevel / fullLevel);
return battery;
}
QVariantHash ExtendedSysMon::getCurrentDesktop() const
{
qCDebug(LOG_ESM);
int number = KWindowSystem::currentDesktop();
int total = KWindowSystem::numberOfDesktops();
QVariantHash currentDesktop;
currentDesktop[QString("currentName")] = KWindowSystem::desktopName(number);
currentDesktop[QString("currentNumber")] = number;
currentDesktop[QString("list")] = QStringList();
for (int i=1; i<total+1; i++)
currentDesktop[QString("list")].toStringList().append(KWindowSystem::desktopName(i));
currentDesktop[QString("number")] = total;
return currentDesktop;
}
float ExtendedSysMon::getGpu(const QString device) const
{
qCDebug(LOG_ESM);
qCDebug(LOG_ESM) << "Device" << device;
float value = 0.0;
if ((device != QString("nvidia")) && (device != QString("ati")))
return value;
QString cmd = QString("");
if (device == QString("nvidia"))
cmd = QString("nvidia-smi -q -x");
else if (device == QString("ati"))
cmd = QString("aticonfig --od-getclocks");
qCInfo(LOG_ESM) << "cmd" << cmd;
TaskResult process = runTask(cmd);
qCInfo(LOG_ESM) << "Cmd returns" << process.exitCode;
qCInfo(LOG_ESM) << "Error" << process.error;
QString qoutput = QTextCodec::codecForMib(106)->toUnicode(process.output).trimmed();
if (configuration[QString("GPUDEV")] == QString("nvidia"))
foreach(QString str, qoutput.split(QChar('\n'), QString::SkipEmptyParts)) {
if (!str.contains(QString("<gpu_util>"))) continue;
QString load = str.remove(QString("<gpu_util>")).remove(QString("</gpu_util>"))
.remove(QChar('%'));
value = load.toFloat();
break;
}
else if (configuration[QString("GPUDEV")] == QString("ati"))
foreach(QString str, qoutput.split(QChar('\n'), QString::SkipEmptyParts)) {
if (!str.contains(QString("load"))) continue;
QString load = str.split(QChar(' '), QString::SkipEmptyParts)[3]
.remove(QChar('%'));
value = load.toFloat();
break;
}
return value;
}
float ExtendedSysMon::getGpuTemp(const QString device) const
{
qCDebug(LOG_ESM);
qCDebug(LOG_ESM) << "Device" << device;
float value = 0.0;
if ((device != QString("nvidia")) && (device != QString("ati")))
return value;
QString cmd = QString("");
if (device == QString("nvidia"))
cmd = QString("nvidia-smi -q -x");
else if (device == QString("ati"))
cmd = QString("aticonfig --od-gettemperature");
qCInfo(LOG_ESM) << "cmd" << cmd;
TaskResult process = runTask(cmd);
qCInfo(LOG_ESM) << "Cmd returns" << process.exitCode;
qCInfo(LOG_ESM) << "Error" << process.error;
QString qoutput = QTextCodec::codecForMib(106)->toUnicode(process.output);
if (configuration[QString("GPUDEV")] == QString("nvidia"))
foreach(QString str, qoutput.split(QChar('\n'), QString::SkipEmptyParts)) {
if (!str.contains(QString("<gpu_temp>"))) continue;
QString temp = str.remove(QString("<gpu_temp>")).remove(QString("C</gpu_temp>"));
value = temp.toFloat();
break;
}
else if (configuration[QString("GPUDEV")] == QString("ati"))
foreach(QString str, qoutput.split(QChar('\n'), QString::SkipEmptyParts)) {
if (!str.contains(QString("Temperature"))) continue;
QString temp = str.split(QChar(' '), QString::SkipEmptyParts).at(4);
value = temp.toFloat();
break;
}
return value;
}
float ExtendedSysMon::getHddTemp(const QString cmd, const QString device) const
{
qCDebug(LOG_ESM);
qCDebug(LOG_ESM) << "cmd" << cmd;
qCDebug(LOG_ESM) << "Device" << device;
float value = 0.0;
TaskResult process = runTask(QString("%1 %2").arg(cmd).arg(device));
qCInfo(LOG_ESM) << "Cmd returns" << process.exitCode;
qCInfo(LOG_ESM) << "Error" << process.error;
bool smartctl = cmd.contains(QString("smartctl"));
qCInfo(LOG_ESM) << "Parse as smartctl" << smartctl;
QString qoutput = QTextCodec::codecForMib(106)->toUnicode(process.output).trimmed();
if (smartctl) {
foreach(QString str, qoutput.split(QChar('\n'), QString::SkipEmptyParts)) {
if (!str.startsWith(QString("194"))) continue;
if (str.split(QChar(' '), QString::SkipEmptyParts).count() < 9) break;
value = str.split(QChar(' '), QString::SkipEmptyParts).at(9).toFloat();
break;
}
} else {
if (qoutput.split(QChar(':'), QString::SkipEmptyParts).count() >= 3) {
QString temp = qoutput.split(QChar(':'), QString::SkipEmptyParts).at(2);
temp.remove(QChar(0260)).remove(QChar('C'));
value = temp.toFloat();
}
}
return value;
}
QString ExtendedSysMon::getNetworkDevice() const
{
qCDebug(LOG_ESM);
QString device = QString("lo");
QList<QNetworkInterface> rawInterfaceList = QNetworkInterface::allInterfaces();
qCInfo(LOG_ESM) << "Devices" << rawInterfaceList;
foreach(QNetworkInterface interface, rawInterfaceList)
if ((interface.flags().testFlag(QNetworkInterface::IsUp)) &&
(!interface.flags().testFlag(QNetworkInterface::IsLoopBack)) &&
(!interface.flags().testFlag(QNetworkInterface::IsPointToPoint))) {
device = interface.name();
break;
}
return device;
}
QVariantHash ExtendedSysMon::getPlayerInfo(const QString playerName, const QString mpdAddress,
const QString mpdPort, QString mpris) const
{
qCDebug(LOG_ESM);
qCDebug(LOG_ESM) << "player" << playerName;
qCDebug(LOG_ESM) << "MPD" << QString("%1:%2").arg(mpdAddress).arg(mpdPort);
qCDebug(LOG_ESM) << "MPRIS" << mpris;
QVariantHash info;
info[QString("album")] = QString("unknown");
info[QString("artist")] = QString("unknown");
info[QString("duration")] = QString("0");
info[QString("progress")] = QString("0");
info[QString("title")] = QString("unknown");
if (playerName == QString("mpd"))
// mpd
info = getPlayerMpdInfo(mpdAddress, mpdPort);
else if (playerName == QString("mpris")) {
// players which supports mpris
if (mpris == QString("auto")) mpris = getAutoMpris();
if (mpris.isEmpty()) return info;
info = getPlayerMprisInfo(mpris);
}
// dymanic properties
// solid
info[QString("salbum")] = stripString(info[QString("album")].toString(), symbols);
info[QString("sartist")] = stripString(info[QString("artist")].toString(), symbols);
info[QString("stitle")] = stripString(info[QString("title")].toString(), symbols);
// dynamic
Plasma::DataContainer *playerDC = containerDict()["player"];
QVariantHash data = playerDC == nullptr ? info : qvariant_cast<QVariantHash>(playerDC->data());
info[QString("dalbum")] = buildString(data[QString("dalbum")].toString(),
info[QString("album")].toString(), symbols);
info[QString("dartist")] = buildString(data[QString("dartist")].toString(),
info[QString("artist")].toString(), symbols);
info[QString("dtitle")] = buildString(data[QString("dtitle")].toString(),
info[QString("title")].toString(), symbols);
return info;
}
QVariantHash ExtendedSysMon::getPlayerMpdInfo(const QString mpdAddress, const QString mpdPort) const
{
qCDebug(LOG_ESM);
qCDebug(LOG_ESM) << "MPD" << QString("%1:%2").arg(mpdAddress).arg(mpdPort);
QVariantHash info;
info[QString("album")] = QString("unknown");
info[QString("artist")] = QString("unknown");
info[QString("duration")] = QString("0");
info[QString("progress")] = QString("0");
info[QString("title")] = QString("unknown");
QString cmd = QString("bash -c \"echo 'currentsong\nstatus\nclose' | curl --connect-timeout 1 -fsm 3 telnet://%1:%2\"")
.arg(mpdAddress)
.arg(mpdPort);
qCInfo(LOG_ESM) << "cmd" << cmd;
TaskResult process = runTask(cmd);
qCInfo(LOG_ESM) << "Cmd returns" << process.exitCode;
qCInfo(LOG_ESM) << "Error" << process.error;
QString qoutput = QTextCodec::codecForMib(106)->toUnicode(process.output).trimmed();
foreach(QString str, qoutput.split(QChar('\n'), QString::SkipEmptyParts)) {
if (str.split(QString(": "), QString::SkipEmptyParts).count() > 1) {
if (str.split(QString(": "), QString::SkipEmptyParts).first() == QString("Album"))
info[QString("album")] = str.split(QString(": "), QString::SkipEmptyParts)[1].trimmed();
else if (str.split(QString(": "), QString::SkipEmptyParts).first() == QString("Artist"))
info[QString("artist")] = str.split(QString(": "), QString::SkipEmptyParts)[1].trimmed();
else if (str.split(QString(": "), QString::SkipEmptyParts).first() == QString("time")) {
info[QString("duration")] = str.split(QString(": "), QString::SkipEmptyParts)[1].trimmed().split(QString(":"))[0];
info[QString("progress")] = str.split(QString(": "), QString::SkipEmptyParts)[1].trimmed().split(QString(":"))[1];
} else if (str.split(QString(": "), QString::SkipEmptyParts).first() == QString("Title"))
info[QString("title")] = str.split(QString(": "), QString::SkipEmptyParts)[1].trimmed();
}
}
return info;
}
QVariantHash ExtendedSysMon::getPlayerMprisInfo(const QString mpris) const
{
qCDebug(LOG_ESM);
qCDebug(LOG_ESM) << "MPRIS" << mpris;
QVariantHash info;
info[QString("album")] = QString("unknown");
info[QString("artist")] = QString("unknown");
info[QString("duration")] = 0;
info[QString("progress")] = 0;
info[QString("title")] = QString("unknown");
QDBusConnection bus = QDBusConnection::sessionBus();
// comes from the following request:
// qdbus org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get org.mpris.MediaPlayer2.Player Metadata
// or the same but using dbus-send:
// dbus-send --print-reply --session --dest=org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:'org.mpris.MediaPlayer2.Player' string:'Metadata'
QVariantList args = QVariantList() << QString("org.mpris.MediaPlayer2.Player") << QString("Metadata");
QDBusMessage request = QDBusMessage::createMethodCall(QString("org.mpris.MediaPlayer2.%1").arg(mpris),
QString("/org/mpris/MediaPlayer2"),
QString(""),
QString("Get"));
request.setArguments(args);
QDBusMessage response = bus.call(request, QDBus::BlockWithGui);
if ((response.type() != QDBusMessage::ReplyMessage) || (response.arguments().isEmpty())) {
qCWarning(LOG_ESM) << "Error message" << response.errorMessage();
} else {
// another portion of dirty magic
QVariantHash map = qdbus_cast<QVariantHash>(response.arguments().first()
.value<QDBusVariant>().variant()
.value<QDBusArgument>());
info[QString("album")] = map.value(QString("xesam:album"), QString("unknown"));
// artist is array
info[QString("artist")] = map.value(QString("xesam:artist"), QString("unknown")).toString();
info[QString("duration")] = map.value(QString("mpris:length"), 0).toInt() / (1000 * 1000);
info[QString("title")] = map.value(QString("xesam:title"), QString("unknown"));
}
// position
args[1] = QString("Position");
request.setArguments(args);
response = bus.call(request, QDBus::BlockWithGui);
if ((response.type() != QDBusMessage::ReplyMessage) || (response.arguments().isEmpty())) {
qCWarning(LOG_ESM) << "Error message" << response.errorMessage();
} else
// this cast is simpler than the previous one ;)
info[QString("progress")] = response.arguments().first().value<QDBusVariant>()
.variant().toLongLong() / (1000 * 1000);
return info;
}
QVariantHash ExtendedSysMon::getPsStats() const
{
qCDebug(LOG_ESM);
QStringList allDirectories = QDir(QString("/proc")).entryList(QDir::Dirs | QDir::NoDotAndDotDot,
QDir::Name);
QStringList directories = allDirectories.filter(QRegExp(QString("(\\d+)")));
QStringList running;
foreach(QString dir, directories) {
QFile statusFile(QString("/proc/%1/status").arg(dir));
if (!statusFile.open(QIODevice::ReadOnly)) continue;
QFile cmdFile(QString("/proc/%1/cmdline").arg(dir));
if (!cmdFile.open(QIODevice::ReadOnly)) continue;
QString output = statusFile.readAll();
if (output.contains(QString("running"))) running.append(cmdFile.readAll());
}
QVariantHash psStats;
psStats[QString("pscount")] = running.count();
psStats[QString("ps")] = running.join(QChar(','));
psStats[QString("pstotal")] = directories.count();
return psStats;
} }
QStringList ExtendedSysMon::sources() const QStringList ExtendedSysMon::sources() const
{ {
qCDebug(LOG_ESM); return aggregator->sources();
QStringList source;
source.append(QString("battery"));
source.append(QString("custom"));
source.append(QString("desktop"));
source.append(QString("netdev"));
source.append(QString("gpu"));
source.append(QString("gputemp"));
source.append(QString("hddtemp"));
source.append(QString("pkg"));
source.append(QString("player"));
source.append(QString("ps"));
source.append(QString("quotes"));
source.append(QString("update"));
source.append(QString("weather"));
qCInfo(LOG_ESM) << "Sources" << source;
return source;
} }
bool ExtendedSysMon::sourceRequestEvent(const QString &source) bool ExtendedSysMon::sourceRequestEvent(const QString &source)
{ {
qCDebug(LOG_ESM);
qCDebug(LOG_ESM) << "Source" << source; qCDebug(LOG_ESM) << "Source" << source;
return updateSourceEvent(source); return updateSourceEvent(source);
@ -463,58 +71,10 @@ bool ExtendedSysMon::sourceRequestEvent(const QString &source)
bool ExtendedSysMon::updateSourceEvent(const QString &source) bool ExtendedSysMon::updateSourceEvent(const QString &source)
{ {
qCDebug(LOG_ESM);
qCDebug(LOG_ESM) << "Source" << source; qCDebug(LOG_ESM) << "Source" << source;
if (source == QString("battery")) { if (aggregator->hasSource(source)) {
QVariantHash battery = getBattery(configuration[QString("ACPIPATH")]); setData(source, QString("value"), aggregator->data(source));
foreach(QString key, battery.keys()) setData(source, key, battery[key]);
} else if (source == QString("custom")) {
foreach(ExtScript *script, extScripts->items()) {
QVariantHash data = script->run();
foreach(QString key, data.keys()) setData(source, key, data[key]);
}
} else if (source == QString("desktop")) {
QVariantHash desktop = getCurrentDesktop();
foreach(QString key, desktop.keys()) setData(source, key, desktop[key]);
} else if (source == QString("gpu")) {
setData(source, QString("value"), getGpu(configuration[QString("GPUDEV")]));
} else if (source == QString("gputemp")) {
setData(source, QString("value"), getGpuTemp(configuration[QString("GPUDEV")]));
} else if (source == QString("hddtemp")) {
QStringList deviceList = configuration[QString("HDDDEV")].split(QChar(','), QString::SkipEmptyParts);
QStringList allHddDevices = getAllHdd();
foreach(QString device, allHddDevices)
setData(source, device, deviceList.contains(device) ?
getHddTemp(configuration[QString("HDDTEMPCMD")], device) : 0.0);
} else if (source == QString("netdev")) {
setData(source, QString("value"), getNetworkDevice());
} else if (source == QString("pkg")) {
foreach(ExtUpgrade *upgrade, extUpgrade->items()) {
QVariantHash data = upgrade->run();
foreach(QString key, data.keys()) setData(source, key, data[key]);
}
} else if (source == QString("player")) {
QVariantHash player = getPlayerInfo(configuration[QString("PLAYER")],
configuration[QString("MPDADDRESS")],
configuration[QString("MPDPORT")],
configuration[QString("MPRIS")]);
foreach(QString key, player.keys()) setData(source, key, player[key]);
} else if (source == QString("ps")) {
QVariantHash ps = getPsStats();
foreach(QString key, ps.keys()) setData(source, key, ps[key]);
} else if (source == QString("quotes")) {
foreach(ExtQuotes *quote, extQuotes->items()) {
QVariantHash data = quote->run();
foreach(QString key, data.keys()) setData(source, key, data[key]);
}
} else if (source == QString("update")) {
setData(source, QString("value"), true);
} else if (source == QString("weather")) {
foreach(ExtWeather *weather, extWeather->items()) {
QVariantHash data = weather->run();
foreach(QString key, data.keys()) setData(source, key, data[key]);
}
} else { } else {
qCWarning(LOG_ESM) << "Unknown source" << source; qCWarning(LOG_ESM) << "Unknown source" << source;
return false; return false;
@ -524,29 +84,12 @@ bool ExtendedSysMon::updateSourceEvent(const QString &source)
} }
QString ExtendedSysMon::buildString(const QString current, const QString value,
const int s) const
{
qCDebug(LOG_ESM);
qCDebug(LOG_ESM) << "Current value" << current;
qCDebug(LOG_ESM) << "New value" << value;
qCDebug(LOG_ESM) << "Strip after" << s;
int index = value.indexOf(current);
if ((current.isEmpty()) || ((index + s + 1) > value.count()))
return QString("%1").arg(value.left(s), s, QLatin1Char(' '));
else
return QString("%1").arg(value.mid(index + 1, s), s, QLatin1Char(' '));
}
QStringList ExtendedSysMon::getAllHdd() const QStringList ExtendedSysMon::getAllHdd() const
{ {
qCDebug(LOG_ESM); QStringList allDevices
= QDir(QString("/dev")).entryList(QDir::System, QDir::Name);
QStringList allDevices = QDir(QString("/dev")).entryList(QDir::System, QDir::Name);
QStringList devices = allDevices.filter(QRegExp(QString("^[hms]d[a-z]$"))); QStringList devices = allDevices.filter(QRegExp(QString("^[hms]d[a-z]$")));
for (int i=0; i<devices.count(); i++) for (int i = 0; i < devices.count(); i++)
devices[i] = QString("/dev/%1").arg(devices.at(i)); devices[i] = QString("/dev/%1").arg(devices.at(i));
qCInfo(LOG_ESM) << "Device list" << devices; qCInfo(LOG_ESM) << "Device list" << devices;
@ -556,11 +99,10 @@ QStringList ExtendedSysMon::getAllHdd() const
QString ExtendedSysMon::getAutoGpu() const QString ExtendedSysMon::getAutoGpu() const
{ {
qCDebug(LOG_ESM);
QString gpu = QString("disable"); QString gpu = QString("disable");
QFile moduleFile(QString("/proc/modules")); QFile moduleFile(QString("/proc/modules"));
if (!moduleFile.open(QIODevice::ReadOnly)) return gpu; if (!moduleFile.open(QIODevice::ReadOnly))
return gpu;
QString output = moduleFile.readAll(); QString output = moduleFile.readAll();
if (output.contains(QString("fglrx"))) if (output.contains(QString("fglrx")))
@ -573,67 +115,47 @@ QString ExtendedSysMon::getAutoGpu() const
} }
QString ExtendedSysMon::getAutoMpris() const
{
qCDebug(LOG_ESM);
QDBusMessage listServices = QDBusConnection::sessionBus().interface()->call(QDBus::BlockWithGui, QString("ListNames"));
if (listServices.arguments().isEmpty()) return QString();
QStringList arguments = listServices.arguments().first().toStringList();
foreach(QString arg, arguments) {
qCInfo(LOG_ESM) << "Service found" << arg;
if (!arg.startsWith(QString("org.mpris.MediaPlayer2."))) continue;
QString service = arg;
service.remove(QString("org.mpris.MediaPlayer2."));
return service;
}
return QString();
}
void ExtendedSysMon::readConfiguration() void ExtendedSysMon::readConfiguration()
{ {
qCDebug(LOG_ESM); QString fileName
= QStandardPaths::locate(QStandardPaths::ConfigLocation,
QString fileName = QStandardPaths::locate(QStandardPaths::ConfigLocation, QString("plasma-dataengine-extsysmon.conf"));
QString("plasma-dataengine-extsysmon.conf"));
qCInfo(LOG_ESM) << "Configuration file" << fileName; qCInfo(LOG_ESM) << "Configuration file" << fileName;
QSettings settings(fileName, QSettings::IniFormat); QSettings settings(fileName, QSettings::IniFormat);
QHash<QString, QString> rawConfig; QHash<QString, QString> rawConfig;
settings.beginGroup(QString("Configuration")); settings.beginGroup(QString("Configuration"));
rawConfig[QString("ACPIPATH")] = settings.value(QString("ACPIPATH"), QString("/sys/class/power_supply/")).toString(); rawConfig[QString("ACPIPATH")]
rawConfig[QString("GPUDEV")] = settings.value(QString("GPUDEV"), QString("auto")).toString(); = settings.value(QString("ACPIPATH"),
rawConfig[QString("HDDDEV")] = settings.value(QString("HDDDEV"), QString("all")).toString(); QString("/sys/class/power_supply/"))
rawConfig[QString("HDDTEMPCMD")] = settings.value(QString("HDDTEMPCMD"), QString("sudo smartctl -a")).toString(); .toString();
rawConfig[QString("MPDADDRESS")] = settings.value(QString("MPDADDRESS"), QString("localhost")).toString(); rawConfig[QString("GPUDEV")]
rawConfig[QString("MPDPORT")] = settings.value(QString("MPDPORT"), QString("6600")).toString(); = settings.value(QString("GPUDEV"), QString("auto")).toString();
rawConfig[QString("MPRIS")] = settings.value(QString("MPRIS"), QString("auto")).toString(); rawConfig[QString("HDDDEV")]
rawConfig[QString("PLAYER")] = settings.value(QString("PLAYER"), QString("mpris")).toString(); = settings.value(QString("HDDDEV"), QString("all")).toString();
rawConfig[QString("PLAYERSYMBOLS")] = settings.value(QString("PLAYERSYMBOLS"), QString("10")).toString(); rawConfig[QString("HDDTEMPCMD")]
= settings.value(QString("HDDTEMPCMD"), QString("sudo smartctl -a"))
.toString();
rawConfig[QString("MPDADDRESS")]
= settings.value(QString("MPDADDRESS"), QString("localhost"))
.toString();
rawConfig[QString("MPDPORT")]
= settings.value(QString("MPDPORT"), QString("6600")).toString();
rawConfig[QString("MPRIS")]
= settings.value(QString("MPRIS"), QString("auto")).toString();
rawConfig[QString("PLAYER")]
= settings.value(QString("PLAYER"), QString("mpris")).toString();
rawConfig[QString("PLAYERSYMBOLS")]
= settings.value(QString("PLAYERSYMBOLS"), QString("10")).toString();
settings.endGroup(); settings.endGroup();
configuration = updateConfiguration(rawConfig); configuration = updateConfiguration(rawConfig);
symbols = configuration[QString("PLAYERSYMBOLS")].toInt();
} }
QString ExtendedSysMon::stripString(const QString value, const int s) const QHash<QString, QString>
ExtendedSysMon::updateConfiguration(QHash<QString, QString> rawConfig) const
{ {
qCDebug(LOG_ESM);
qCDebug(LOG_ESM) << "New value" << value;
qCDebug(LOG_ESM) << "Strip after" << s;
return value.count() > s ? QString("%1\u2026").arg(value.left(s - 1)) :
QString("%1").arg(value, s, QLatin1Char(' '));
}
QHash<QString, QString> ExtendedSysMon::updateConfiguration(QHash<QString, QString> rawConfig) const
{
qCDebug(LOG_ESM);
qCDebug(LOG_ESM) << "Raw configuration" << rawConfig; qCDebug(LOG_ESM) << "Raw configuration" << rawConfig;
// gpudev // gpudev
@ -641,20 +163,21 @@ QHash<QString, QString> ExtendedSysMon::updateConfiguration(QHash<QString, QStri
rawConfig[QString("GPUDEV")] = QString("disable"); rawConfig[QString("GPUDEV")] = QString("disable");
else if (rawConfig[QString("GPUDEV")] == QString("auto")) else if (rawConfig[QString("GPUDEV")] == QString("auto"))
rawConfig[QString("GPUDEV")] = getAutoGpu(); rawConfig[QString("GPUDEV")] = getAutoGpu();
else if ((rawConfig[QString("GPUDEV")] != QString("ati")) && else if ((rawConfig[QString("GPUDEV")] != QString("ati"))
(rawConfig[QString("GPUDEV")] != QString("nvidia"))) && (rawConfig[QString("GPUDEV")] != QString("nvidia")))
rawConfig[QString("GPUDEV")] = getAutoGpu(); rawConfig[QString("GPUDEV")] = getAutoGpu();
// hdddev // hdddev
QStringList allHddDevices = getAllHdd(); QStringList allHddDevices = getAllHdd();
if (rawConfig[QString("HDDDEV")] == QString("all")) if (rawConfig[QString("HDDDEV")] == QString("all")) {
rawConfig[QString("HDDDEV")] = allHddDevices.join(QChar(',')); rawConfig[QString("HDDDEV")] = allHddDevices.join(QChar(','));
else if (rawConfig[QString("HDDDEV")] == QString("disable")) } else if (rawConfig[QString("HDDDEV")] == QString("disable")) {
rawConfig[QString("HDDDEV")] = QString(""); rawConfig[QString("HDDDEV")] = QString("");
else { } else {
QStringList deviceList = rawConfig[QString("HDDDEV")].split(QChar(','), QString::SkipEmptyParts); QStringList deviceList = rawConfig[QString("HDDDEV")].split(
QChar(','), QString::SkipEmptyParts);
QStringList devices; QStringList devices;
QRegExp diskRegexp = QRegExp("^/dev/[hms]d[a-z]$"); QRegExp diskRegexp = QRegExp("^/dev/[hms]d[a-z]$");
foreach(QString device, deviceList) foreach (QString device, deviceList)
if ((QFile::exists(device)) && (device.contains(diskRegexp))) if ((QFile::exists(device)) && (device.contains(diskRegexp)))
devices.append(device); devices.append(device);
if (devices.isEmpty()) if (devices.isEmpty())
@ -663,20 +186,21 @@ QHash<QString, QString> ExtendedSysMon::updateConfiguration(QHash<QString, QStri
rawConfig[QString("HDDDEV")] = devices.join(QChar(',')); rawConfig[QString("HDDDEV")] = devices.join(QChar(','));
} }
// player // player
if ((rawConfig[QString("PLAYER")] != QString("mpd")) && if ((rawConfig[QString("PLAYER")] != QString("mpd"))
(rawConfig[QString("PLAYER")] != QString("mpris")) && && (rawConfig[QString("PLAYER")] != QString("mpris"))
(rawConfig[QString("PLAYER")] != QString("disable"))) && (rawConfig[QString("PLAYER")] != QString("disable")))
rawConfig[QString("PLAYER")] = QString("mpris"); rawConfig[QString("PLAYER")] = QString("mpris");
// player symbols // player symbols
if (rawConfig[QString("PLAYERSYMBOLS")].toInt() <= 0) if (rawConfig[QString("PLAYERSYMBOLS")].toInt() <= 0)
rawConfig[QString("PLAYERSYMBOLS")] = QString("10"); rawConfig[QString("PLAYERSYMBOLS")] = QString("10");
foreach(QString key, rawConfig.keys()) foreach (QString key, rawConfig.keys())
qCInfo(LOG_ESM) << key << "=" << rawConfig[key]; qCInfo(LOG_ESM) << key << "=" << rawConfig[key];
return rawConfig; return rawConfig;
} }
K_EXPORT_PLASMA_DATAENGINE_WITH_JSON(extsysmon, ExtendedSysMon, "plasma-dataengine-extsysmon.json") K_EXPORT_PLASMA_DATAENGINE_WITH_JSON(extsysmon, ExtendedSysMon,
"plasma-dataengine-extsysmon.json")
#include "extsysmon.moc" #include "extsysmon.moc"

View File

@ -20,13 +20,8 @@
#include <Plasma/DataEngine> #include <Plasma/DataEngine>
#include "extitemaggregator.h"
class ExtSysMonAggregator;
class ExtQuotes;
class ExtScript;
class ExtUpgrade;
class ExtWeather;
class ExtendedSysMon : public Plasma::DataEngine class ExtendedSysMon : public Plasma::DataEngine
{ {
@ -35,21 +30,6 @@ class ExtendedSysMon : public Plasma::DataEngine
public: public:
explicit ExtendedSysMon(QObject *parent, const QVariantList &args); explicit ExtendedSysMon(QObject *parent, const QVariantList &args);
virtual ~ExtendedSysMon(); virtual ~ExtendedSysMon();
// update functions
QVariantHash getBattery(const QString acpiPath) const;
QVariantHash getCurrentDesktop() const;
float getGpu(const QString device) const;
float getGpuTemp(const QString device) const;
float getHddTemp(const QString cmd, const QString device) const;
QString getNetworkDevice() const;
QVariantHash getPlayerInfo(const QString playerName,
const QString mpdAddress = QString(),
const QString mpdPort = QString(),
const QString mpris = QString()) const;
QVariantHash getPlayerMpdInfo(const QString mpdAddress = QString(),
const QString mpdPort = QString()) const;
QVariantHash getPlayerMprisInfo(const QString mpris = QString()) const;
QVariantHash getPsStats() const;
protected: protected:
QStringList sources() const; QStringList sources() const;
@ -58,20 +38,14 @@ protected:
private: private:
// configuration // configuration
ExtSysMonAggregator *aggregator = nullptr;
QHash<QString, QString> configuration; QHash<QString, QString> configuration;
int symbols = 10;
ExtItemAggregator<ExtQuotes> *extQuotes;
ExtItemAggregator<ExtScript> *extScripts;
ExtItemAggregator<ExtUpgrade> *extUpgrade;
ExtItemAggregator<ExtWeather> *extWeather;
// methods // methods
QString buildString(const QString current, const QString value, const int s) const;
QStringList getAllHdd() const; QStringList getAllHdd() const;
QString getAutoGpu() const; QString getAutoGpu() const;
QString getAutoMpris() const;
void readConfiguration(); void readConfiguration();
QString stripString(const QString value, const int s) const; QHash<QString, QString>
QHash<QString, QString> updateConfiguration(QHash<QString, QString> rawConfig) const; updateConfiguration(QHash<QString, QString> rawConfig) const;
}; };

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 "extsysmonaggregator.h"
#include "awdebug.h"
#include "sources/batterysource.h"
#include "sources/customsource.h"
#include "sources/desktopsource.h"
#include "sources/gpuloadsource.h"
#include "sources/gputempsource.h"
#include "sources/hddtempsource.h"
#include "sources/loadsource.h"
#include "sources/networksource.h"
#include "sources/playersource.h"
#include "sources/processessource.h"
#include "sources/quotessource.h"
#include "sources/updatesource.h"
#include "sources/upgradesource.h"
#include "sources/weathersource.h"
#include "version.h"
ExtSysMonAggregator::ExtSysMonAggregator(QObject *parent,
const QHash<QString, QString> config)
: QObject(parent)
{
qCDebug(LOG_ESM) << __PRETTY_FUNCTION__;
init(config);
}
ExtSysMonAggregator::~ExtSysMonAggregator()
{
qCDebug(LOG_ESM) << __PRETTY_FUNCTION__;
m_map.clear();
}
QVariant ExtSysMonAggregator::data(const QString source) const
{
qCDebug(LOG_ESM) << "Source" << source;
return hasSource(source) ? m_map[source]->data(source) : QVariant();
}
bool ExtSysMonAggregator::hasSource(const QString source) const
{
return m_map.contains(source);
}
QVariantMap ExtSysMonAggregator::initialData(const QString source) const
{
qCDebug(LOG_ESM) << "Source" << source;
return hasSource(source) ? m_map[source]->initialData(source)
: QVariantMap();
}
QStringList ExtSysMonAggregator::sources() const
{
QStringList sorted = m_map.keys();
sorted.sort();
return sorted;
}
void ExtSysMonAggregator::init(const QHash<QString, QString> config)
{
qCDebug(LOG_ESM) << "Configuration" << config;
// battery
AbstractExtSysMonSource *batteryItem
= new BatterySource(this, QStringList() << config[QString("ACPIPATH")]);
foreach (QString source, batteryItem->sources())
m_map[source] = batteryItem;
// custom
AbstractExtSysMonSource *customItem = new CustomSource(this, QStringList());
foreach (QString source, customItem->sources())
m_map[source] = customItem;
// desktop
AbstractExtSysMonSource *desktopItem
= new DesktopSource(this, QStringList());
foreach (QString source, desktopItem->sources())
m_map[source] = desktopItem;
// gpu load
AbstractExtSysMonSource *gpuLoadItem
= new GPULoadSource(this, QStringList() << config[QString("GPUDEV")]);
foreach (QString source, gpuLoadItem->sources())
m_map[source] = gpuLoadItem;
// gpu temperature
AbstractExtSysMonSource *gpuTempItem = new GPUTemperatureSource(
this, QStringList() << config[QString("GPUDEV")]);
foreach (QString source, gpuTempItem->sources())
m_map[source] = gpuTempItem;
// hdd temperature
AbstractExtSysMonSource *hddTempItem = new HDDTemperatureSource(
this, QStringList() << config[QString("HDDDEV")]
<< config[QString("HDDTEMPCMD")]);
foreach (QString source, hddTempItem->sources())
m_map[source] = hddTempItem;
// network
AbstractExtSysMonSource *networkItem
= new NetworkSource(this, QStringList());
foreach (QString source, networkItem->sources())
m_map[source] = networkItem;
// player
AbstractExtSysMonSource *playerItem = new PlayerSource(
this, QStringList()
<< config[QString("PLAYER")] << config[QString("MPDADDRESS")]
<< config[QString("MPDPORT")] << config[QString("MPRIS")]
<< config[QString("PLAYERSYMBOLS")]);
foreach (QString source, playerItem->sources())
m_map[source] = playerItem;
// processes
AbstractExtSysMonSource *processesItem
= new ProcessesSource(this, QStringList());
foreach (QString source, processesItem->sources())
m_map[source] = processesItem;
// quotes
AbstractExtSysMonSource *quotesItem = new QuotesSource(this, QStringList());
foreach (QString source, quotesItem->sources())
m_map[source] = quotesItem;
// update
AbstractExtSysMonSource *updateItem = new UpdateSource(this, QStringList());
foreach (QString source, updateItem->sources())
m_map[source] = updateItem;
// upgrade
AbstractExtSysMonSource *upgradeItem
= new UpgradeSource(this, QStringList());
foreach (QString source, upgradeItem->sources())
m_map[source] = upgradeItem;
// weather
AbstractExtSysMonSource *weatherItem
= new WeatherSource(this, QStringList());
foreach (QString source, weatherItem->sources())
m_map[source] = weatherItem;
#ifdef BUILD_TESTING
// additional load source
AbstractExtSysMonSource *loadItem = new LoadSource(this, QStringList());
foreach (QString source, loadItem->sources())
m_map[source] = loadItem;
#endif /* BUILD_TESTING */
}

View File

@ -0,0 +1,45 @@
/***************************************************************************
* 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 EXTSYSMONAGGREGATOR_H
#define EXTSYSMONAGGREGATOR_H
#include <QObject>
#include "sources/abstractextsysmonsource.h"
class ExtSysMonAggregator : public QObject
{
Q_OBJECT
public:
explicit ExtSysMonAggregator(QObject *parent,
const QHash<QString, QString> config);
virtual ~ExtSysMonAggregator();
QVariant data(const QString source) const;
bool hasSource(const QString source) const;
QVariantMap initialData(const QString source) const;
QStringList sources() const;
private:
void init(const QHash<QString, QString> config);
QHash<QString, AbstractExtSysMonSource *> m_map;
};
#endif /* EXTSYSMONAGGREGATOR_H */

View File

@ -0,0 +1,46 @@
/***************************************************************************
* 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 ABSTRACTEXTSYSMONSOURCE_H
#define ABSTRACTEXTSYSMONSOURCE_H
#include <QObject>
#include <QRegExp>
#include <QVariant>
class AbstractExtSysMonSource : public QObject
{
public:
explicit AbstractExtSysMonSource(QObject *parent, const QStringList)
: QObject(parent){};
virtual ~AbstractExtSysMonSource(){};
virtual QVariant data(QString source) = 0;
virtual QVariantMap initialData(QString source) const = 0;
virtual void run() = 0;
virtual QStringList sources() const = 0;
// used by extensions
int index(const QString source) const
{
QRegExp rx(QString("\\d+"));
rx.indexIn(source);
return rx.cap().toInt();
}
};
#endif /* ABSTRACTEXTSYSMONSOURCE_H */

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