Compare commits

..

13 Commits

Author SHA1 Message Date
53918f4528 Merge pull request #100 from arcan1s/development
Release 3.2
2016-07-10 01:09:49 +04:00
77675a8e2f Merge pull request #99 from arcan1s/development
Master update
2016-07-08 15:11:07 +04:00
e4e8f299c0 Merge pull request #98 from arcan1s/development
add last sources test for playersource
2016-06-18 06:09:06 +04:00
1465657648 Merge pull request #97 from arcan1s/development
Master update
2016-06-17 16:22:07 +04:00
082efcc127 Merge pull request #93 from arcan1s/development
Release master update
2016-05-09 01:13:10 +04:00
24d45c6d48 Merge pull request #92 from arcan1s/development
Prerelease master update
2016-04-29 14:02:33 +04:00
7eb82c8c8d Merge pull request #90 from arcan1s/development
Master update
2016-04-21 17:46:47 +04:00
48e98239d9 Merge pull request #89 from arcan1s/development
Devel branch backports
2016-04-10 01:23:39 +04:00
2514dcc74d Merge pull request #88 from arcan1s/development
release 3.1.1
2016-04-06 14:51:48 +03:00
4a499a6157 Merge pull request #86 from arcan1s/development
master release update
2016-04-06 01:40:25 +03:00
6916c8f992 Merge pull request #79 from wlemuel/master
update zh translations
2016-03-02 20:07:23 +03:00
2c7b072829 update zh translations 2016-02-14 13:51:10 +08:00
636978b442 Merge pull request #78 from arcan1s/development
One more master update
2016-01-31 23:37:50 +06:00
261 changed files with 8827 additions and 12410 deletions

View File

@ -1,28 +0,0 @@
sudo: required
arch:
packages:
- plasma-framework
# build deps
- cmake
- extra-cmake-modules
- python
# test
- xorg-server-xvfb
# additional targets
- clang
- cppcheck
script:
- export DISPLAY=:99.0
- git clone https://github.com/arcan1s/awesome-widgets/
- cd awesome-widgets; git submodule update --init --recursive
- mkdir awesome-widgets/build
- cd awesome-widgets/build; cmake -DKDE_INSTALL_USE_QT_SYS_PATHS=ON -DCMAKE_BUILD_TYPE=Optimization -DCMAKE_INSTALL_PREFIX=/usr -DBUILD_FUTURE=ON -DBUILD_TESTING=ON ../sources
- cd awesome-widgets/build; make
- cd awesome-widgets/build; make cppcheck
- cd awesome-widgets/build; make clangformat && ( [ `git status -s | wc -l` -eq 0 ] || exit 1 )
- cd awesome-widgets/build; xvfb-run make test
- sleep 3
script:
- "curl -s https://raw.githubusercontent.com/mikkeloscar/arch-travis/master/arch-travis.sh | bash"

View File

@ -1,30 +1,3 @@
Ver.3.3.1:
+ add ability to direct issue report (#104)
+ add key completion (#105)
+ add ability to load historical configuration (#106)
+ add ability to upload configuration to remote server (#106)
+ add stylish (#112)
+ add DBus intergration (#115)
+ add cron-like extenstion triggers (`X-AW-Socket` option) (#117)
+ add ability to trigger extensions by calling socket (`X-AW-Schedule` option) (#118)
+ add source for network requests
+ add Json formatter
- drop patches provided support for Qt 5.4
* use custom signal slot connection for dataengine (`BUILD_FUTURE` flag required)
* update UI
* refactoring
Ver.3.2.1:
+ add X-AW-Translate option to DateTime formatter
+ add formatters to configuration export and import
+ add macro fuction to selector
+ add default formatters
- add translation reinit (fix #102)
- fix invalid float formatter saving
- fix missing ApiVersion for formatters
* use sockets for MPD data
* translation update
Ver.3.2.0: Ver.3.2.0:
+ custom formatters (#91) + custom formatters (#91)
+ add backend tests (#95) + add backend tests (#95)

View File

@ -6,8 +6,8 @@ for more details. To avoid manual labor there is automatic cmake target named
`clangformat` (see below). Some additional detail see below. `clangformat` (see below). Some additional detail see below.
* Indent is only spaces. 4 spaces. * Indent is only spaces. 4 spaces.
* Any private variable should start with `m_` prefix (`m_foo`). The only one * It is highly recommended to name private variables with `m_` prefix (`m_foo`).
exception is `Ui` object which should be named as `ui`. There is no exceptions for properties.
* Avoid to create a large methods. Exception: if method contains lambda functions. * Avoid to create a large methods. Exception: if method contains lambda functions.
* If some method is called only once, it is recommended to use lambda functions. * If some method is called only once, it is recommended to use lambda functions.
Exception is `Q_INVOKABLE` methods. Exception is `Q_INVOKABLE` methods.
@ -37,17 +37,31 @@ for more details. To avoid manual labor there is automatic cmake target named
* `Q_PROPERTY` macro is allowed and recommended for QObject based classes. * `Q_PROPERTY` macro is allowed and recommended for QObject based classes.
* Qt macros (e.g. `signals`, `slots`, `Q_OBJECT`, etc) are allowed. In other hand * Qt macros (e.g. `signals`, `slots`, `Q_OBJECT`, etc) are allowed. In other hand
`Q_FOREACH` (`foreach`) is not allowed use `for (auto &foo : bar)` instead. `Q_FOREACH` (`foreach`) is not allowed use `for (auto foo : bar)` instead.
* Current project standard is **C++11**. * Current project standard is **C++11**.
* Do not use C-like code: * Do not use C-like code:
* C-like style iteration if possible. Use `for (auto &foo : bar)` and * C-like style iteration if possible. Use `for (auto foo : bar)` and
`std::for_each` instead if possible. It is also recommended to use iterators. `std::for_each` instead if possible. It is also recommended to use iterators.
* C-like casts, use `const_cast`, `static_cast`, `dymanic_Cast` instead. Using * C-like casts, use `const_cast`, `static_cast`, `dymanic_Cast` instead. Using
of `reinterpret_cast` is not recommended. It is highly recommended to use of `reinterpret_cast` is not recommended. It is highly recommended to use
`dynamic_cast` with the exception catching. It is also possible to use `dynamic_cast` with the exception catching. It is also possible to use
`qvariant_cast` if required. `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. * C-like `NULL`, use `nullptr` instead.
* C-like constant definition, use `const vartype foo = bar` definition instead. * It is highly recommended to avoid implicit casts. Exception `nullptr` casts to
boolean, e.g.:
```
if (nullptr)
qDebug() << "nullptr is true, wtf";
```
* Abstract classes (which have at least one pure virtual method) are allowed. * Abstract classes (which have at least one pure virtual method) are allowed.
* Templates are allowed and recommended. Templates usually should be described * Templates are allowed and recommended. Templates usually should be described
inside header not source code file. inside header not source code file.
@ -77,8 +91,6 @@ for more details. To avoid manual labor there is automatic cmake target named
* 'true ? foo : bar' construction is allowed and recommended for one-line assignment. * 'true ? foo : bar' construction is allowed and recommended for one-line assignment.
* Any global pointer should be assign to `nullptr` after deletion and before * Any global pointer should be assign to `nullptr` after deletion and before
initialization. Exception: if object is deleted into class destructor. initialization. Exception: if object is deleted into class destructor.
* Do not use semicolon in qml files unless it is required.
* Any method argument including class constructors should start with `_`.
Comments Comments
-------- --------
@ -164,7 +176,8 @@ Testing
1. `-DCMAKE_BUILD_TYPE=Debug`. 1. `-DCMAKE_BUILD_TYPE=Debug`.
2. `-DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTING=ON`. 2. `-DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTING=ON`.
3. `-DCMAKE_BUILD_TYPE=Release`. 3. `-DCMAKE_BUILD_TYPE=Release`.
* Additional test functions should be declated and used only inside `BUILD_TESTING` * It is recommended to create addition test if possible.
* Addition test functions should be declated and used only inside `BUILD_TESTING`
definition. definition.
Tools Tools
@ -195,9 +208,9 @@ Tools
* Recommended class constructor for QObject based classes: * Recommended class constructor for QObject based classes:
``` ```
FooClass::FooClass(QObject *_parent, const QVariant _var) FooClass::FooClass(QObject *parent, const QVariant var)
: QObject(_parent) : QObject(parent)
, m_var(_var) , m_var(var)
{ {
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
// some code below if any // some code below if any

View File

@ -2,7 +2,7 @@
pkgname=plasma5-applet-awesome-widgets pkgname=plasma5-applet-awesome-widgets
_pkgname=awesome-widgets _pkgname=awesome-widgets
pkgver=3.3.1 pkgver=3.2.0
pkgrel=1 pkgrel=1
pkgdesc="Collection of minimalistic Plasmoids which look like Awesome WM widgets (ex-PyTextMonitor)" pkgdesc="Collection of minimalistic Plasmoids which look like Awesome WM widgets (ex-PyTextMonitor)"
arch=('i686' 'x86_64') arch=('i686' 'x86_64')
@ -17,7 +17,7 @@ optdepends=("catalyst: for GPU monitor"
makedepends=('cmake' 'extra-cmake-modules' 'python') makedepends=('cmake' 'extra-cmake-modules' 'python')
source=(https://github.com/arcan1s/awesome-widgets/releases/download/V.${pkgver}/${_pkgname}-${pkgver}-src.tar.xz) source=(https://github.com/arcan1s/awesome-widgets/releases/download/V.${pkgver}/${_pkgname}-${pkgver}-src.tar.xz)
install=${pkgname}.install install=${pkgname}.install
md5sums=('306027b017f940c9c5eaffb65ff82a7f') md5sums=('81a85890d519bd8c5791d0d99cffc9c1')
backup=('etc/xdg/plasma-dataengine-extsysmon.conf') backup=('etc/xdg/plasma-dataengine-extsysmon.conf')
prepare() { prepare() {

View File

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

View File

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

View File

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

View File

@ -14,8 +14,8 @@ set(PROJECT_AUTHOR "Evgeniy Alekseev")
set(PROJECT_CONTACT "esalexeev@gmail.com") set(PROJECT_CONTACT "esalexeev@gmail.com")
set(PROJECT_LICENSE "GPL3") set(PROJECT_LICENSE "GPL3")
set(PROJECT_VERSION_MAJOR "3") set(PROJECT_VERSION_MAJOR "3")
set(PROJECT_VERSION_MINOR "3") set(PROJECT_VERSION_MINOR "2")
set(PROJECT_VERSION_PATCH "1") set(PROJECT_VERSION_PATCH "0")
set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}") set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}")
# append git version if any # append git version if any
set(PROJECT_COMMIT_SHA "Commit hash" CACHE INTERNAL "") set(PROJECT_COMMIT_SHA "Commit hash" CACHE INTERNAL "")
@ -50,11 +50,14 @@ if (CMAKE_COMPILER_IS_GNUCXX)
# avoid newer gcc warnings # avoid newer gcc warnings
add_definitions(-D_DEFAULT_SOURCE) add_definitions(-D_DEFAULT_SOURCE)
elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang") elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
set(CMAKE_CXX_FLAGS "-Wall -std=c++11") 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") set(CMAKE_CXX_FLAGS_OPTIMIZATION "-Ofast -DNDEBUG")
# linker flags # linker flags
set(CMAKE_EXE_LINKER_FLAGS "-lc++abi")
set(CMAKE_MODULE_LINKER_FLAGS "-lc++abi")
set(CMAKE_SHARED_LINKER_FLAGS "-lc++abi")
else () else ()
message(FATAL_ERROR "Unknown compiler") message(FATAL_ERROR "Unknown compiler")
endif () endif ()
@ -62,9 +65,6 @@ if (CMAKE_BUILD_TYPE MATCHES Debug)
set(CMAKE_VERBOSE_MAKEFILE ON) set(CMAKE_VERBOSE_MAKEFILE ON)
endif () endif ()
# required by successfully coverity and cppcheck build
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(PROJECT_TRDPARTY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty) set(PROJECT_TRDPARTY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty)
set(PROJECT_LIBRARY awesomewidgets) set(PROJECT_LIBRARY awesomewidgets)
set(PROJECT_MONITORSOURCES extsysmonsources) set(PROJECT_MONITORSOURCES extsysmonsources)
@ -79,7 +79,6 @@ add_subdirectory(awesomewidgets)
add_subdirectory(extsysmonsources) add_subdirectory(extsysmonsources)
add_subdirectory(extsysmon) add_subdirectory(extsysmon)
if (BUILD_PLASMOIDS) if (BUILD_PLASMOIDS)
add_subdirectory(qml)
add_subdirectory(awesome-widget) add_subdirectory(awesome-widget)
add_subdirectory(desktop-panel) add_subdirectory(desktop-panel)
add_subdirectory(translations) add_subdirectory(translations)
@ -90,4 +89,3 @@ if (BUILD_TESTING)
endif () endif ()
include(packages-recipe.cmake) include(packages-recipe.cmake)

View File

@ -16,14 +16,11 @@
***************************************************************************/ ***************************************************************************/
#include <KI18n/KLocalizedString>
#include "awdebug.h" #include "awdebug.h"
Q_LOGGING_CATEGORY(LOG_AW, "org.kde.plasma.awesomewidget", Q_LOGGING_CATEGORY(LOG_AW, "org.kde.plasma.awesomewidget",
QtMsgType::QtWarningMsg) QtMsgType::QtWarningMsg)
Q_LOGGING_CATEGORY(LOG_DBUS, "org.kde.plasma.awdbus", QtMsgType::QtWarningMsg)
Q_LOGGING_CATEGORY(LOG_DP, "org.kde.plasma.desktoppanel", Q_LOGGING_CATEGORY(LOG_DP, "org.kde.plasma.desktoppanel",
QtMsgType::QtWarningMsg) QtMsgType::QtWarningMsg)
Q_LOGGING_CATEGORY(LOG_ESM, "org.kde.plasma.extsysmon", QtMsgType::QtWarningMsg) Q_LOGGING_CATEGORY(LOG_ESM, "org.kde.plasma.extsysmon", QtMsgType::QtWarningMsg)
@ -33,100 +30,28 @@ Q_LOGGING_CATEGORY(LOG_LIB, "org.kde.plasma.awesomewidgets",
QtMsgType::QtWarningMsg) QtMsgType::QtWarningMsg)
QString AWDebug::getAboutText(const QString &_type) const QStringList getBuildData()
{
QString text;
if (_type == "header") {
text = NAME;
} else if (_type == "version") {
text = i18n("Version %1 (build date %2)", VERSION, BUILD_DATE);
if (!QString(COMMIT_SHA).isEmpty())
text += QString(" (%1)").arg(COMMIT_SHA);
} else if (_type == "description") {
text = i18n("A set of minimalistic plasmoid widgets");
} else if (_type == "links") {
text = i18n("Links:") + "<ul>"
+ QString("<li><a href=\"%1\">%2</a></li>")
.arg(HOMEPAGE)
.arg(i18n("Homepage"))
+ QString("<li><a href=\"%1\">%2</a></li>")
.arg(REPOSITORY)
.arg(i18n("Repository"))
+ QString("<li><a href=\"%1\">%2</a></li>")
.arg(BUGTRACKER)
.arg(i18n("Bugtracker"))
+ QString("<li><a href=\"%1\">%2</a></li>")
.arg(TRANSLATION)
.arg(i18n("Translation issue"))
+ QString("<li><a href=\"%1\">%2</a></li>")
.arg(AUR_PACKAGES)
.arg(i18n("AUR packages"))
+ QString("<li><a href=\"%1\">%2</a></li>")
.arg(OPENSUSE_PACKAGES)
.arg(i18n("openSUSE packages"))
+ "</ul>";
} else if (_type == "copy") {
text = QString("<small>&copy; %1 <a href=\"mailto:%2\">%3</a><br>")
.arg(DATE)
.arg(EMAIL)
.arg(AUTHOR)
+ i18n("This software is licensed under %1", LICENSE)
+ "</small>";
} else if (_type == "translators") {
QStringList translatorList = QString(TRANSLATORS).split(',');
for (auto &translator : translatorList)
translator = QString("<li>%1</li>").arg(translator);
text
= i18n("Translators:") + "<ul>" + translatorList.join("") + "</ul>";
} else if (_type == "3rdparty") {
QStringList trdPartyList
= QString(TRDPARTY_LICENSE).split(';', QString::SkipEmptyParts);
for (int i = 0; i < trdPartyList.count(); i++)
trdPartyList[i]
= QString("<li><a href=\"%3\">%1</a> (%2 license)</li>")
.arg(trdPartyList.at(i).split(',')[0])
.arg(trdPartyList.at(i).split(',')[1])
.arg(trdPartyList.at(i).split(',')[2]);
text = i18n("This software uses:") + "<ul>" + trdPartyList.join("")
+ "</ul>";
} else if (_type == "thanks") {
QStringList thanks
= QString(SPECIAL_THANKS).split(';', QString::SkipEmptyParts);
for (int i = 0; i < thanks.count(); i++)
thanks[i] = QString("<li><a href=\"%2\">%1</a></li>")
.arg(thanks.at(i).split(',')[0])
.arg(thanks.at(i).split(',')[1]);
text = i18n("Special thanks to:") + "<ul>" + thanks.join("") + "</ul>";
}
return text;
}
QStringList AWDebug::getBuildData()
{ {
QStringList metadata; QStringList metadata;
metadata.append("=== Awesome Widgets configuration details ==="); metadata.append(QString("=== Awesome Widgets configuration details ==="));
// build information // build information
metadata.append("Build details:"); metadata.append(QString("Build details:"));
metadata.append(QString(" VERSION: %1").arg(VERSION)); metadata.append(QString(" VERSION: %1").arg(VERSION));
metadata.append(QString(" COMMIT_SHA: %1").arg(COMMIT_SHA)); metadata.append(QString(" COMMIT_SHA: %1").arg(COMMIT_SHA));
metadata.append(QString(" BUILD_DATE: %1").arg(BUILD_DATE)); metadata.append(QString(" BUILD_DATE: %1").arg(BUILD_DATE));
// configuration // configuration
metadata.append("API details:"); metadata.append(QString("API details:"));
metadata.append(QString(" AW_GRAPHITEM_API: %1").arg(AW_GRAPHITEM_API)); metadata.append(QString(" AWGIAPI: %1").arg(AWGIAPI));
metadata.append(QString(" AW_EXTQUOTES_API: %1").arg(AW_EXTQUOTES_API)); metadata.append(QString(" AWEQAPI: %1").arg(AWEQAPI));
metadata.append(QString(" AW_EXTSCRIPT_API: %1").arg(AW_EXTSCRIPT_API)); metadata.append(QString(" AWESAPI: %1").arg(AWESAPI));
metadata.append( metadata.append(QString(" AWEUAPI: %1").arg(AWEUAPI));
QString(" AW_EXTUPGRADE_API: %1").arg(AW_EXTUPGRADE_API)); metadata.append(QString(" AWEWAPI: %1").arg(AWEWAPI));
metadata.append( metadata.append(QString(" AWEFAPI: %1").arg(AWEFAPI));
QString(" AW_EXTWEATHER_API: %1").arg(AW_EXTWEATHER_API));
metadata.append(QString(" AW_FORMATTER_API: %1").arg(AW_FORMATTER_API));
metadata.append(QString(" REQUEST_TIMEOUT: %1").arg(REQUEST_TIMEOUT)); metadata.append(QString(" REQUEST_TIMEOUT: %1").arg(REQUEST_TIMEOUT));
metadata.append(QString(" TIME_KEYS: %1").arg(TIME_KEYS)); metadata.append(QString(" TIME_KEYS: %1").arg(TIME_KEYS));
metadata.append(QString(" STATIC_KEYS: %1").arg(STATIC_KEYS)); metadata.append(QString(" STATIC_KEYS: %1").arg(STATIC_KEYS));
// cmake properties // cmake properties
metadata.append("cmake properties:"); metadata.append(QString("cmake properties:"));
metadata.append(QString(" CMAKE_BUILD_TYPE: %1").arg(CMAKE_BUILD_TYPE)); metadata.append(QString(" CMAKE_BUILD_TYPE: %1").arg(CMAKE_BUILD_TYPE));
metadata.append( metadata.append(
QString(" CMAKE_CXX_COMPILER: %1").arg(CMAKE_CXX_COMPILER)); QString(" CMAKE_CXX_COMPILER: %1").arg(CMAKE_CXX_COMPILER));
@ -146,7 +71,7 @@ QStringList AWDebug::getBuildData()
metadata.append(QString(" CMAKE_SHARED_LINKER_FLAGS: %1") metadata.append(QString(" CMAKE_SHARED_LINKER_FLAGS: %1")
.arg(CMAKE_SHARED_LINKER_FLAGS)); .arg(CMAKE_SHARED_LINKER_FLAGS));
// components // components
metadata.append("Components data:"); metadata.append(QString("Components data:"));
metadata.append(QString(" BUILD_PLASMOIDS: %1").arg(BUILD_PLASMOIDS)); metadata.append(QString(" BUILD_PLASMOIDS: %1").arg(BUILD_PLASMOIDS));
metadata.append( metadata.append(
QString(" BUILD_DEB_PACKAGE: %1").arg(BUILD_DEB_PACKAGE)); QString(" BUILD_DEB_PACKAGE: %1").arg(BUILD_DEB_PACKAGE));

View File

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

View File

@ -62,15 +62,6 @@
<entry name="acOffline" type="string"> <entry name="acOffline" type="string">
<default>( )</default> <default>( )</default>
</entry> </entry>
<entry name="telemetryCount" type="int">
<default>100</default>
</entry>
<entry name="telemetryRemote" type="bool">
<default>false</default>
</entry>
<entry name="telemetryId" type="string">
<default></default>
</entry>
</group> </group>
<group name="Tooltip"> <group name="Tooltip">
@ -147,12 +138,6 @@
<entry name="fontStyle" type="string"> <entry name="fontStyle" type="string">
<default>normal</default> <default>normal</default>
</entry> </entry>
<entry name="textStyle" type="string">
<default>normal</default>
</entry>
<entry name="textStyleColor" type="string">
<default>#000000</default>
</entry>
</group> </group>
</kcfg> </kcfg>

View File

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

View File

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

View File

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

View File

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

View File

@ -15,23 +15,22 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/ ***************************************************************************/
pragma Singleton
import QtQuick 2.0 import QtQuick 2.0
import QtQuick.Controls 1.3 as QtControls
Row { QtObject {
height: implicitHeight property variant fontWeight: {
width: parent.width "light": Font.Light,
"normal": Font.Normal,
property alias text: checkBox.text "demibold": Font.DemiBold,
property alias checked: checkBox.checked "bold": Font.Bold,
"black": Font.Black
QtControls.Label {
height: parent.heigth
width: parent.width * 2 / 5
} }
QtControls.CheckBox { property variant align: {
id: checkBox "left": Text.AlignLeft,
width: parent.width * 3 / 5 "center": Text.AlignHCenter,
"right": Text.AlignRight,
"justify": Text.AlignJustify
} }
} }

View File

@ -36,12 +36,6 @@ Item {
AWActions { AWActions {
id: awActions id: awActions
} }
AWTelemetryHandler {
id: awTelemetryHandler
}
BugReport {
id: bugReport
}
property bool debug: awActions.isDebugEnabled() property bool debug: awActions.isDebugEnabled()
property variant tooltipSettings: { property variant tooltipSettings: {
@ -104,9 +98,6 @@ Item {
font.pointSize: plasmoid.configuration.fontSize font.pointSize: plasmoid.configuration.fontSize
font.weight: general.fontWeight[plasmoid.configuration.fontWeight] font.weight: general.fontWeight[plasmoid.configuration.fontWeight]
style: general.textStyle[plasmoid.configuration.textStyle]
styleColor: plasmoid.configuration.textStyleColor
PlasmaCore.ToolTipArea { PlasmaCore.ToolTipArea {
height: tooltip.height height: tooltip.height
width: tooltip.width width: tooltip.width
@ -150,7 +141,6 @@ Item {
plasmoid.setAction("requestKey", i18n("Request key"), "utilities-system-monitor") plasmoid.setAction("requestKey", i18n("Request key"), "utilities-system-monitor")
plasmoid.setAction("showReadme", i18n("Show README"), "text-x-readme") plasmoid.setAction("showReadme", i18n("Show README"), "text-x-readme")
plasmoid.setAction("checkUpdates", i18n("Check updates"), "system-software-update") plasmoid.setAction("checkUpdates", i18n("Check updates"), "system-software-update")
plasmoid.setAction("reportBug", i18n("Report bug"), "tools-report-bug")
// init submodule // init submodule
Plasmoid.userConfiguringChanged(false) Plasmoid.userConfiguringChanged(false)
// connect data // connect data
@ -210,15 +200,6 @@ Item {
awKeys.setAggregatorProperty("customUptime", plasmoid.configuration.customUptime) awKeys.setAggregatorProperty("customUptime", plasmoid.configuration.customUptime)
awKeys.setAggregatorProperty("tempUnits", plasmoid.configuration.tempUnits) awKeys.setAggregatorProperty("tempUnits", plasmoid.configuration.tempUnits)
awKeys.setAggregatorProperty("translate", plasmoid.configuration.translateStrings) awKeys.setAggregatorProperty("translate", plasmoid.configuration.translateStrings)
// update telemetry ID
if (plasmoid.configuration.telemetryId.length == 0)
plasmoid.configuration.telemetryId = generateUuid()
// save telemetry
awTelemetryHandler.init(plasmoid.configuration.telemetryCount,
plasmoid.configuration.telemetryRemote,
plasmoid.configuration.telemetryId)
if (awTelemetryHandler.put("awwidgetconfig", plasmoid.configuration.text))
awTelemetryHandler.uploadTelemetry("awwidgetconfig", plasmoid.configuration.text)
} }
@ -234,25 +215,10 @@ Item {
return awActions.showReadme() return awActions.showReadme()
} }
function action_reportBug() {
if (debug) console.debug()
bugReport.reset()
bugReport.open()
}
function action_requestKey() { function action_requestKey() {
if (debug) console.debug() if (debug) console.debug()
tagSelectorBox.model = awKeys.dictKeys(true) tagSelectorBox.model = awKeys.dictKeys(true)
return tagSelector.open() return tagSelector.open()
} }
// code from http://stackoverflow.com/questions/105034/create-guid-uuid-in-javascript
function generateUuid() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
} }

View File

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

View File

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

View File

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

View File

@ -21,16 +21,13 @@
#include "awdebug.h" #include "awdebug.h"
AWAbstractSelector::AWAbstractSelector(QWidget *_parent, AWAbstractSelector::AWAbstractSelector(QWidget *parent)
const QPair<bool, bool> &_editable) : QWidget(parent)
: QWidget(_parent)
, ui(new Ui::AWAbstractSelector) , ui(new Ui::AWAbstractSelector)
{ {
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
ui->setupUi(this); ui->setupUi(this);
ui->comboBox_key->setEditable(_editable.first);
ui->comboBox_value->setEditable(_editable.second);
connect(ui->comboBox_key, SIGNAL(currentIndexChanged(int)), this, connect(ui->comboBox_key, SIGNAL(currentIndexChanged(int)), this,
SIGNAL(selectionChanged())); SIGNAL(selectionChanged()));
@ -56,26 +53,24 @@ QPair<QString, QString> AWAbstractSelector::current() const
} }
void AWAbstractSelector::init(const QStringList &_keys, void AWAbstractSelector::init(const QStringList keys, const QStringList values,
const QStringList &_values, const QPair<QString, QString> current)
const QPair<QString, QString> &_current)
{ {
if ((!_keys.contains(_current.first)) if ((!keys.contains(current.first)) || (!values.contains(current.second))) {
|| (!_values.contains(_current.second))) { qCWarning(LOG_AW) << "Invalid current value" << current
qCWarning(LOG_AW) << "Invalid current value" << _current
<< "not found in default ones"; << "not found in default ones";
return; return;
} }
qCDebug(LOG_AW) << "Init selector with keys" << _keys << "and values" qCDebug(LOG_AW) << "Init selector with keys" << keys << "and values"
<< _values << "and current ones are" << _current; << values << "and current ones are" << current;
// set data // set data
ui->comboBox_key->clear(); ui->comboBox_key->clear();
ui->comboBox_key->addItems(_keys); ui->comboBox_key->addItems(keys);
ui->comboBox_value->clear(); ui->comboBox_value->clear();
ui->comboBox_value->addItems(_values); ui->comboBox_value->addItems(values);
// set current values // set current values
ui->comboBox_key->setCurrentText(_current.first); ui->comboBox_key->setCurrentText(current.first);
ui->comboBox_value->setCurrentText(_current.second); ui->comboBox_value->setCurrentText(current.second);
} }

View File

@ -32,13 +32,11 @@ class AWAbstractSelector : public QWidget
Q_OBJECT Q_OBJECT
public: public:
explicit AWAbstractSelector(QWidget *_parent = nullptr, explicit AWAbstractSelector(QWidget *parent = nullptr);
const QPair<bool, bool> &_editable
= {false, false});
virtual ~AWAbstractSelector(); virtual ~AWAbstractSelector();
QPair<QString, QString> current() const; QPair<QString, QString> current() const;
void init(const QStringList &_keys, const QStringList &_values, void init(const QStringList keys, const QStringList values,
const QPair<QString, QString> &_current); const QPair<QString, QString> current);
signals: signals:
void selectionChanged(); void selectionChanged();

View File

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

View File

@ -30,21 +30,20 @@ class AWActions : public QObject
Q_OBJECT Q_OBJECT
public: public:
explicit AWActions(QObject *_parent = nullptr); explicit AWActions(QObject *parent = nullptr);
virtual ~AWActions(); virtual ~AWActions();
Q_INVOKABLE void checkUpdates(const bool _showAnyway = false); Q_INVOKABLE void checkUpdates(const bool showAnyway = false);
Q_INVOKABLE QString getFileContent(const QString &_path) const;
Q_INVOKABLE bool isDebugEnabled() const; Q_INVOKABLE bool isDebugEnabled() const;
Q_INVOKABLE bool runCmd(const QString &_cmd) const; Q_INVOKABLE bool runCmd(const QString cmd = QString("/usr/bin/true")) const;
Q_INVOKABLE void showLegacyInfo() const;
Q_INVOKABLE void showReadme() const; Q_INVOKABLE void showReadme() const;
// configuration slots // configuration slots
Q_INVOKABLE QString getAboutText(const QString &_type) const; Q_INVOKABLE QString getAboutText(const QString type
Q_INVOKABLE QVariantMap getFont(const QVariantMap &_defaultFont) const; = QString("header")) const;
Q_INVOKABLE QVariantMap getFont(const QVariantMap defaultFont) const;
public slots: public slots:
Q_INVOKABLE static void sendNotification(const QString &_eventId, Q_INVOKABLE static void sendNotification(const QString eventId,
const QString &_message); const QString message);
private: private:
AWUpdateHelper *m_updateHelper = nullptr; AWUpdateHelper *m_updateHelper = nullptr;

View File

@ -1,163 +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 "awbugreporter.h"
#include <KI18n/KLocalizedString>
#include <QDesktopServices>
#include <QJsonDocument>
#include <QJsonParseError>
#include <QMessageBox>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include "awdebug.h"
AWBugReporter::AWBugReporter(QObject *_parent)
: QObject(_parent)
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
}
AWBugReporter::~AWBugReporter()
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
}
void AWBugReporter::doConnect()
{
// additional method for testing needs
connect(this, SIGNAL(replyReceived(const int, const QString &)), this,
SLOT(showInformation(const int, const QString &)));
}
QString AWBugReporter::generateText(const QString &_description,
const QString &_reproduce,
const QString &_expected,
const QString &_logs) const
{
// do not log _logs here, it may have quite large size
qCDebug(LOG_AW) << "Generate text with description" << _description
<< "steps" << _reproduce << "and expected result"
<< _expected;
QString output;
output += QString("**Description**\n\n%1\n\n").arg(_description);
output += QString("**Step to _reproduce**\n\n%1\n\n").arg(_reproduce);
output += QString("**Expected result**\n\n%1\n\n").arg(_expected);
output += QString("**Version**\n\n%1\n\n")
.arg(AWDebug::getBuildData().join(QString("\n")));
// append _logs
output += QString("**Logs**\n\n%1").arg(_logs);
return output;
}
void AWBugReporter::sendBugReport(const QString &_title, const QString &_body)
{
qCDebug(LOG_AW) << "Send bug report with title" << _title << "and body"
<< _body;
QNetworkAccessManager *manager = new QNetworkAccessManager(nullptr);
connect(manager, SIGNAL(finished(QNetworkReply *)), this,
SLOT(issueReplyRecieved(QNetworkReply *)));
QNetworkRequest request = QNetworkRequest(QUrl(BUGTRACKER_API));
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
// generate payload
QVariantMap payload;
payload["title"] = _title;
payload["body"] = _body;
payload["labels"] = QStringList() << "from application";
// convert to QByteArray to send request
QByteArray data
= QJsonDocument::fromVariant(payload).toJson(QJsonDocument::Compact);
qCInfo(LOG_AW) << "Send request with _body" << data.data() << "and size"
<< data.size();
manager->post(request, data);
}
void AWBugReporter::issueReplyRecieved(QNetworkReply *_reply)
{
if (_reply->error() != QNetworkReply::NoError) {
qCWarning(LOG_AW) << "An error occurs" << _reply->error()
<< "with message" << _reply->errorString();
return emit(replyReceived(0, ""));
}
QJsonParseError error;
QJsonDocument jsonDoc = QJsonDocument::fromJson(_reply->readAll(), &error);
if (error.error != QJsonParseError::NoError) {
qCWarning(LOG_AW) << "Parse error" << error.errorString();
return emit(replyReceived(0, ""));
}
_reply->deleteLater();
// convert to map
QVariantMap response = jsonDoc.toVariant().toMap();
QString url = response["html_url"].toString();
int number = response["number"].toInt();
return emit(replyReceived(number, url));
}
void AWBugReporter::showInformation(const int _number, const QString &_url)
{
qCDebug(LOG_AW) << "Created issue with number" << _number << "and url"
<< _url;
// cache url first
m_lastBugUrl = _url;
QMessageBox *msgBox = new QMessageBox(nullptr);
msgBox->setAttribute(Qt::WA_DeleteOnClose);
msgBox->setModal(false);
msgBox->setWindowTitle(i18n("Issue created"));
msgBox->setText(i18n("Issue %1 has been created", _number));
msgBox->setStandardButtons(QMessageBox::Open | QMessageBox::Close);
msgBox->setIcon(QMessageBox::Information);
msgBox->open(this, SLOT(userReplyOnBugReport(QAbstractButton *)));
}
void AWBugReporter::userReplyOnBugReport(QAbstractButton *_button)
{
QMessageBox::ButtonRole ret
= static_cast<QMessageBox *>(sender())->buttonRole(_button);
qCInfo(LOG_AW) << "User select" << ret;
switch (ret) {
case QMessageBox::AcceptRole:
QDesktopServices::openUrl(m_lastBugUrl);
break;
case QMessageBox::RejectRole:
default:
break;
}
}

View File

@ -1,55 +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/ *
***************************************************************************/
#ifndef AWBUGREPORTER_H
#define AWBUGREPORTER_H
#include <QObject>
class QAbstractButton;
class QNetworkReply;
class AWBugReporter : public QObject
{
Q_OBJECT
public:
explicit AWBugReporter(QObject *_parent = nullptr);
virtual ~AWBugReporter();
Q_INVOKABLE void doConnect();
Q_INVOKABLE QString generateText(const QString &_description,
const QString &_reproduce,
const QString &_expected,
const QString &_logs) const;
Q_INVOKABLE void sendBugReport(const QString &_title, const QString &_body);
signals:
void replyReceived(const int _number, const QString &_url);
private slots:
void issueReplyRecieved(QNetworkReply *_reply);
void showInformation(const int _number, const QString &_url);
void userReplyOnBugReport(QAbstractButton *_button);
private:
QString m_lastBugUrl;
};
#endif /* AWBUGREPORTER_H */

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,92 +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 "awdbusadaptor.h"
#include "awdebug.h"
#include "awkeys.h"
AWDBusAdaptor::AWDBusAdaptor(AWKeys *_parent)
: QDBusAbstractAdaptor(_parent)
, m_plugin(_parent)
{
qCDebug(LOG_DBUS) << __PRETTY_FUNCTION__;
}
AWDBusAdaptor::~AWDBusAdaptor()
{
qCDebug(LOG_DBUS) << __PRETTY_FUNCTION__;
}
QString AWDBusAdaptor::Info(const QString &key) const
{
return m_plugin->infoByKey(key);
}
QStringList AWDBusAdaptor::Keys(const QString &regexp) const
{
return m_plugin->dictKeys(true, regexp);
}
QString AWDBusAdaptor::Value(const QString &key) const
{
return m_plugin->valueByKey(key);
}
qlonglong AWDBusAdaptor::WhoAmI() const
{
return reinterpret_cast<qlonglong>(m_plugin);
}
void AWDBusAdaptor::SetLogLevel(const QString &what, const int level)
{
qCDebug(LOG_DBUS) << "Set log level" << level << "for" << what;
if (level >= m_logLevels.count()) {
qCDebug(LOG_DBUS) << "Invalid logging level" << level
<< "should be less than" << m_logLevels.count();
return;
}
for (auto &lev : m_logLevels)
SetLogLevel(what, lev, m_logLevels.indexOf(lev) >= level);
}
void AWDBusAdaptor::SetLogLevel(const QString &what, const QString &level,
const bool enabled)
{
qCDebug(LOG_DBUS) << "Set log level" << level << "enabled" << enabled
<< "for" << what;
if (!m_logLevels.contains(level)) {
qCDebug(LOG_DBUS) << "Invalid logging level" << level << "should be in"
<< m_logLevels;
return;
}
QString state = enabled ? "true" : "false";
QLoggingCategory::setFilterRules(
QString("%1.%2=%3").arg(what).arg(level).arg(state));
}

View File

@ -1,58 +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/ *
***************************************************************************/
#ifndef AWDBUSADAPTOR_H
#define AWDBUSADAPTOR_H
#include <QDBusAbstractAdaptor>
#include "version.h"
class AWKeys;
class AWDBusAdaptor : public QDBusAbstractAdaptor
{
Q_OBJECT
Q_CLASSINFO("D-Bus Interface", AWDBUS_SERVICE_NAME)
public:
explicit AWDBusAdaptor(AWKeys *_parent = nullptr);
virtual ~AWDBusAdaptor();
public slots:
// get methods
QString Info(const QString &key) const;
QStringList Keys(const QString &regexp) const;
QString Value(const QString &key) const;
qlonglong WhoAmI() const;
// set methods
void SetLogLevel(const QString &what, const int level);
void SetLogLevel(const QString &what, const QString &level,
const bool enabled);
private:
AWKeys *m_plugin = nullptr;
QStringList m_logLevels = QStringList() << "debug"
<< "info"
<< "warning"
<< "critical";
};
#endif /* AWDBUSADAPTOR_H */

View File

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

View File

@ -27,21 +27,21 @@
#include "awformatterhelper.h" #include "awformatterhelper.h"
AWFormatterConfig::AWFormatterConfig(QWidget *_parent, const QStringList &_keys) AWFormatterConfig::AWFormatterConfig(QWidget *parent, const QStringList keys)
: QDialog(_parent) : QDialog(parent)
, ui(new Ui::AWFormatterConfig) , ui(new Ui::AWFormatterConfig)
, m_keys(_keys) , m_keys(keys)
{ {
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
ui->setupUi(this); ui->setupUi(this);
m_editButton editButton
= ui->buttonBox->addButton(i18n("Edit"), QDialogButtonBox::ActionRole); = ui->buttonBox->addButton(i18n("Edit"), QDialogButtonBox::ActionRole);
init(); init();
connect(ui->buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(ui->buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
connect(ui->buttonBox, SIGNAL(rejected()), this, SLOT(reject())); connect(ui->buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
connect(m_editButton, SIGNAL(clicked(bool)), this, SLOT(editFormatters())); connect(editButton, SIGNAL(clicked(bool)), this, SLOT(editFormatters()));
} }
@ -80,14 +80,12 @@ void AWFormatterConfig::updateUi()
= m_selectors.indexOf(static_cast<AWAbstractSelector *>(sender())); = m_selectors.indexOf(static_cast<AWAbstractSelector *>(sender()));
if ((current.first.isEmpty()) && (current.second.isEmpty())) { if ((current.first.isEmpty()) && (current.second.isEmpty())) {
// remove current selector if it is empty and does not last
if (sender() == m_selectors.last()) if (sender() == m_selectors.last())
return; return;
AWAbstractSelector *selector = m_selectors.takeAt(index); AWAbstractSelector *selector = m_selectors.takeAt(index);
ui->verticalLayout->removeWidget(selector); ui->verticalLayout->removeWidget(selector);
selector->deleteLater(); selector->deleteLater();
} else { } else {
// add new selector if something changed
if (sender() != m_selectors.last()) if (sender() != m_selectors.last())
return; return;
auto keys = initKeys(); auto keys = initKeys();
@ -96,16 +94,16 @@ void AWFormatterConfig::updateUi()
} }
void AWFormatterConfig::addSelector(const QStringList &_keys, void AWFormatterConfig::addSelector(const QStringList &keys,
const QStringList &_values, const QStringList &values,
const QPair<QString, QString> &_current) const QPair<QString, QString> &current)
{ {
qCDebug(LOG_AW) << "Add selector with keys" << _keys << "values" << _values qCDebug(LOG_AW) << "Add selector with keys" << keys << "values" << values
<< "and current ones" << _current; << "and current ones" << current;
AWAbstractSelector *selector AWAbstractSelector *selector
= new AWAbstractSelector(ui->scrollAreaWidgetContents); = new AWAbstractSelector(ui->scrollAreaWidgetContents);
selector->init(_keys, _values, _current); selector->init(keys, values, current);
ui->verticalLayout->insertWidget(ui->verticalLayout->count() - 1, selector); ui->verticalLayout->insertWidget(ui->verticalLayout->count() - 1, selector);
connect(selector, SIGNAL(selectionChanged()), this, SLOT(updateUi())); connect(selector, SIGNAL(selectionChanged()), this, SLOT(updateUi()));
m_selectors.append(selector); m_selectors.append(selector);
@ -114,7 +112,7 @@ void AWFormatterConfig::addSelector(const QStringList &_keys,
void AWFormatterConfig::clearSelectors() void AWFormatterConfig::clearSelectors()
{ {
for (auto &selector : m_selectors) { for (auto selector : m_selectors) {
disconnect(selector, SIGNAL(selectionChanged()), this, disconnect(selector, SIGNAL(selectionChanged()), this,
SLOT(updateUi())); SLOT(updateUi()));
ui->verticalLayout->removeWidget(selector); ui->verticalLayout->removeWidget(selector);
@ -128,7 +126,7 @@ void AWFormatterConfig::execDialog()
{ {
int ret = exec(); int ret = exec();
QHash<QString, QString> data; QHash<QString, QString> data;
for (auto &selector : m_selectors) { for (auto selector : m_selectors) {
QPair<QString, QString> select = selector->current(); QPair<QString, QString> select = selector->current();
if (select.first.isEmpty()) if (select.first.isEmpty())
continue; continue;
@ -142,7 +140,7 @@ void AWFormatterConfig::execDialog()
case 1: case 1:
default: default:
m_helper->writeFormatters(data); m_helper->writeFormatters(data);
m_helper->removeUnusedFormatters(data.keys()); m_helper->writeFormatters(data.keys());
break; break;
} }
} }
@ -158,10 +156,10 @@ void AWFormatterConfig::init()
QPair<QStringList, QStringList> AWFormatterConfig::initKeys() const QPair<QStringList, QStringList> AWFormatterConfig::initKeys() const
{ {
// we are adding empty string at the start // we are adding empty string at the start
QStringList keys = QStringList() << ""; QStringList keys = QStringList() << QString("");
keys.append(m_keys); keys.append(m_keys);
keys.sort(); keys.sort();
QStringList knownFormatters = QStringList() << ""; QStringList knownFormatters = QStringList() << QString("");
knownFormatters.append(m_helper->knownFormatters()); knownFormatters.append(m_helper->knownFormatters());
knownFormatters.sort(); knownFormatters.sort();
@ -175,7 +173,7 @@ void AWFormatterConfig::updateDialog()
QHash<QString, QString> appliedFormatters = m_helper->getFormatters(); QHash<QString, QString> appliedFormatters = m_helper->getFormatters();
auto keys = initKeys(); auto keys = initKeys();
for (auto &key : appliedFormatters.keys()) for (auto key : appliedFormatters.keys())
addSelector(keys.first, keys.second, addSelector(keys.first, keys.second,
QPair<QString, QString>(key, appliedFormatters[key])); QPair<QString, QString>(key, appliedFormatters[key]));
// empty one // empty one

View File

@ -34,8 +34,8 @@ class AWFormatterConfig : public QDialog
Q_OBJECT Q_OBJECT
public: public:
explicit AWFormatterConfig(QWidget *_parent = nullptr, explicit AWFormatterConfig(QWidget *parent = nullptr,
const QStringList &_keys = QStringList()); const QStringList keys = QStringList());
virtual ~AWFormatterConfig(); virtual ~AWFormatterConfig();
Q_INVOKABLE void showDialog(); Q_INVOKABLE void showDialog();
@ -44,15 +44,15 @@ private slots:
void updateUi(); void updateUi();
private: private:
QPushButton *m_editButton = nullptr; QPushButton *editButton = nullptr;
Ui::AWFormatterConfig *ui = nullptr; Ui::AWFormatterConfig *ui = nullptr;
AWFormatterHelper *m_helper = nullptr; AWFormatterHelper *m_helper = nullptr;
QList<AWAbstractSelector *> m_selectors; QList<AWAbstractSelector *> m_selectors;
// properties // properties
QStringList m_keys; QStringList m_keys;
// methods // methods
void addSelector(const QStringList &_keys, const QStringList &_values, void addSelector(const QStringList &keys, const QStringList &values,
const QPair<QString, QString> &_current); const QPair<QString, QString> &current);
void clearSelectors(); void clearSelectors();
void execDialog(); void execDialog();
void init(); void init();

View File

@ -21,8 +21,8 @@
#include "awformatterconfig.h" #include "awformatterconfig.h"
AWFormatterConfigFactory::AWFormatterConfigFactory(QObject *_parent) AWFormatterConfigFactory::AWFormatterConfigFactory(QObject *parent)
: QObject(_parent) : QObject(parent)
{ {
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
} }
@ -34,9 +34,9 @@ AWFormatterConfigFactory::~AWFormatterConfigFactory()
} }
void AWFormatterConfigFactory::showDialog(const QStringList &_keys) void AWFormatterConfigFactory::showDialog(const QStringList keys)
{ {
AWFormatterConfig *config = new AWFormatterConfig(nullptr, _keys); AWFormatterConfig *config = new AWFormatterConfig(nullptr, keys);
config->showDialog(); config->showDialog();
config->deleteLater(); config->deleteLater();
} }

View File

@ -27,9 +27,9 @@ class AWFormatterConfigFactory : public QObject
Q_OBJECT Q_OBJECT
public: public:
explicit AWFormatterConfigFactory(QObject *_parent = nullptr); explicit AWFormatterConfigFactory(QObject *parent = nullptr);
virtual ~AWFormatterConfigFactory(); virtual ~AWFormatterConfigFactory();
Q_INVOKABLE void showDialog(const QStringList &_keys); Q_INVOKABLE void showDialog(const QStringList keys);
private: private:
}; };

View File

@ -26,19 +26,17 @@
#include "awdatetimeformatter.h" #include "awdatetimeformatter.h"
#include "awdebug.h" #include "awdebug.h"
#include "awfloatformatter.h" #include "awfloatformatter.h"
#include "awjsonformatter.h"
#include "awlistformatter.h" #include "awlistformatter.h"
#include "awnoformatter.h" #include "awnoformatter.h"
#include "awscriptformatter.h" #include "awscriptformatter.h"
#include "awstringformatter.h" #include "awstringformatter.h"
AWFormatterHelper::AWFormatterHelper(QWidget *_parent) AWFormatterHelper::AWFormatterHelper(QWidget *parent)
: AbstractExtItemAggregator(_parent, "formatters") : AbstractExtItemAggregator(parent, QString("formatters"))
{ {
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
m_filePath = "awesomewidgets/formatters/formatters.ini";
initItems(); initItems();
} }
@ -52,13 +50,13 @@ AWFormatterHelper::~AWFormatterHelper()
} }
QString AWFormatterHelper::convert(const QVariant &_value, QString AWFormatterHelper::convert(const QVariant &value,
const QString &_name) const const QString &name) const
{ {
qCDebug(LOG_AW) << "Convert value" << _value << "for" << _name; qCDebug(LOG_AW) << "Convert value" << value << "for" << name;
return m_formatters.contains(_name) ? m_formatters[_name]->convert(_value) return m_formatters.contains(name) ? m_formatters[name]->convert(value)
: _value.toString(); : value.toString();
} }
@ -71,7 +69,7 @@ QStringList AWFormatterHelper::definedFormatters() const
QHash<QString, QString> AWFormatterHelper::getFormatters() const QHash<QString, QString> AWFormatterHelper::getFormatters() const
{ {
QHash<QString, QString> map; QHash<QString, QString> map;
for (auto &tag : m_formatters.keys()) for (auto tag : m_formatters.keys())
map[tag] = m_formatters[tag]->name(); map[tag] = m_formatters[tag]->name();
return map; return map;
@ -81,7 +79,7 @@ QHash<QString, QString> AWFormatterHelper::getFormatters() const
QList<AbstractExtItem *> AWFormatterHelper::items() const QList<AbstractExtItem *> AWFormatterHelper::items() const
{ {
QList<AbstractExtItem *> converted; QList<AbstractExtItem *> converted;
for (auto &item : m_formattersClasses.values()) for (auto item : m_formattersClasses.values())
converted.append(item); converted.append(item);
return converted; return converted;
@ -94,21 +92,20 @@ QStringList AWFormatterHelper::knownFormatters() const
} }
bool AWFormatterHelper::removeUnusedFormatters(const QStringList &_keys) const bool AWFormatterHelper::writeFormatters(const QStringList keys) const
{ {
qCDebug(LOG_AW) << "Remove formatters" << _keys; qCDebug(LOG_AW) << "Remove formatters" << keys;
QString fileName = QString("%1/%2") QString fileName = QString("%1/awesomewidgets/formatters/formatters.ini")
.arg(QStandardPaths::writableLocation( .arg(QStandardPaths::writableLocation(
QStandardPaths::GenericDataLocation)) QStandardPaths::GenericDataLocation));
.arg(m_filePath);
QSettings settings(fileName, QSettings::IniFormat); QSettings settings(fileName, QSettings::IniFormat);
qCInfo(LOG_AW) << "Configuration file" << fileName; qCInfo(LOG_AW) << "Configuration file" << fileName;
settings.beginGroup("Formatters"); settings.beginGroup(QString("Formatters"));
QStringList foundKeys = settings.childKeys(); QStringList foundKeys = settings.childKeys();
for (auto &key : foundKeys) { for (auto key : foundKeys) {
if (_keys.contains(key)) if (keys.contains(key))
continue; continue;
settings.remove(key); settings.remove(key);
} }
@ -121,20 +118,19 @@ bool AWFormatterHelper::removeUnusedFormatters(const QStringList &_keys) const
bool AWFormatterHelper::writeFormatters( bool AWFormatterHelper::writeFormatters(
const QHash<QString, QString> &_configuration) const const QHash<QString, QString> configuration) const
{ {
qCDebug(LOG_AW) << "Write configuration" << _configuration; qCDebug(LOG_AW) << "Write configuration" << configuration;
QString fileName = QString("%1/%2") QString fileName = QString("%1/awesomewidgets/formatters/formatters.ini")
.arg(QStandardPaths::writableLocation( .arg(QStandardPaths::writableLocation(
QStandardPaths::GenericDataLocation)) QStandardPaths::GenericDataLocation));
.arg(m_filePath);
QSettings settings(fileName, QSettings::IniFormat); QSettings settings(fileName, QSettings::IniFormat);
qCInfo(LOG_AW) << "Configuration file" << fileName; qCInfo(LOG_AW) << "Configuration file" << fileName;
settings.beginGroup("Formatters"); settings.beginGroup(QString("Formatters"));
for (auto &key : _configuration.keys()) for (auto key : configuration.keys())
settings.setValue(key, _configuration[key]); settings.setValue(key, configuration[key]);
settings.endGroup(); settings.endGroup();
settings.sync(); settings.sync();
@ -152,28 +148,26 @@ void AWFormatterHelper::editItems()
AWAbstractFormatter::FormatterClass AWAbstractFormatter::FormatterClass
AWFormatterHelper::defineFormatterClass(const QString &_stringType) const AWFormatterHelper::defineFormatterClass(const QString stringType) const
{ {
qCDebug(LOG_AW) << "Define formatter class for" << _stringType; qCDebug(LOG_AW) << "Define formatter class for" << stringType;
AWAbstractFormatter::FormatterClass formatter AWAbstractFormatter::FormatterClass formatter
= AWAbstractFormatter::FormatterClass::NoFormat; = AWAbstractFormatter::FormatterClass::NoFormat;
if (_stringType == "DateTime") if (stringType == QString("DateTime"))
formatter = AWAbstractFormatter::FormatterClass::DateTime; formatter = AWAbstractFormatter::FormatterClass::DateTime;
else if (_stringType == "Float") else if (stringType == QString("Float"))
formatter = AWAbstractFormatter::FormatterClass::Float; formatter = AWAbstractFormatter::FormatterClass::Float;
else if (_stringType == "List") else if (stringType == QString("List"))
formatter = AWAbstractFormatter::FormatterClass::List; formatter = AWAbstractFormatter::FormatterClass::List;
else if (_stringType == "NoFormat") else if (stringType == QString("NoFormat"))
; ;
else if (_stringType == "Script") else if (stringType == QString("Script"))
formatter = AWAbstractFormatter::FormatterClass::Script; formatter = AWAbstractFormatter::FormatterClass::Script;
else if (_stringType == "String") else if (stringType == QString("String"))
formatter = AWAbstractFormatter::FormatterClass::String; formatter = AWAbstractFormatter::FormatterClass::String;
else if (_stringType == "Json")
formatter = AWAbstractFormatter::FormatterClass::Json;
else else
qCWarning(LOG_AW) << "Unknown formatter" << _stringType; qCWarning(LOG_AW) << "Unknown formatter" << stringType;
return formatter; return formatter;
} }
@ -186,8 +180,8 @@ void AWFormatterHelper::initFormatters()
for (int i = m_directories.count() - 1; i >= 0; i--) { for (int i = m_directories.count() - 1; i >= 0; i--) {
QStringList files QStringList files
= QDir(m_directories.at(i)).entryList(QDir::Files, QDir::Name); = QDir(m_directories.at(i)).entryList(QDir::Files, QDir::Name);
for (auto &file : files) { for (auto file : files) {
if (!file.endsWith(".desktop")) if (!file.endsWith(QString(".desktop")))
continue; continue;
qCInfo(LOG_AW) << "Found file" << file << "in" qCInfo(LOG_AW) << "Found file" << file << "in"
<< m_directories.at(i); << m_directories.at(i);
@ -219,9 +213,6 @@ void AWFormatterHelper::initFormatters()
m_formattersClasses[name] m_formattersClasses[name]
= new AWStringFormatter(this, filePath); = new AWStringFormatter(this, filePath);
break; break;
case AWAbstractFormatter::FormatterClass::Json:
m_formattersClasses[name] = new AWJsonFormatter(this, filePath);
break;
case AWAbstractFormatter::FormatterClass::NoFormat: case AWAbstractFormatter::FormatterClass::NoFormat:
m_formattersClasses[name] = new AWNoFormatter(this, filePath); m_formattersClasses[name] = new AWNoFormatter(this, filePath);
break; break;
@ -236,15 +227,16 @@ void AWFormatterHelper::initKeys()
m_formatters.clear(); m_formatters.clear();
QStringList configs = QStandardPaths::locateAll( QStringList configs = QStandardPaths::locateAll(
QStandardPaths::GenericDataLocation, m_filePath); QStandardPaths::GenericDataLocation,
QString("awesomewidgets/formatters/formatters.ini"));
for (auto &fileName : configs) { for (auto fileName : configs) {
QSettings settings(fileName, QSettings::IniFormat); QSettings settings(fileName, QSettings::IniFormat);
qCInfo(LOG_AW) << "Configuration file" << settings.fileName(); qCInfo(LOG_AW) << "Configuration file" << settings.fileName();
settings.beginGroup("Formatters"); settings.beginGroup(QString("Formatters"));
QStringList keys = settings.childKeys(); QStringList keys = settings.childKeys();
for (auto &key : keys) { for (auto key : keys) {
QString name = settings.value(key).toString(); QString name = settings.value(key).toString();
qCInfo(LOG_AW) << "Found formatter" << name << "for key" << key qCInfo(LOG_AW) << "Found formatter" << name << "for key" << key
<< "in" << settings.fileName(); << "in" << settings.fileName();
@ -253,8 +245,8 @@ void AWFormatterHelper::initKeys()
continue; continue;
} }
if (!m_formattersClasses.contains(name)) { if (!m_formattersClasses.contains(name)) {
qCWarning(LOG_AW) qCWarning(LOG_AW) << "Invalid formatter" << name << "found in"
<< "Invalid formatter" << name << "found in" << key; << key;
continue; continue;
} }
m_formatters[key] = m_formattersClasses[name]; m_formatters[key] = m_formattersClasses[name];
@ -275,20 +267,21 @@ void AWFormatterHelper::installDirectories()
qCInfo(LOG_AW) << "Created directory" << localDir; qCInfo(LOG_AW) << "Created directory" << localDir;
m_directories = QStandardPaths::locateAll( m_directories = QStandardPaths::locateAll(
QStandardPaths::GenericDataLocation, "awesomewidgets/formatters", QStandardPaths::GenericDataLocation,
QStandardPaths::LocateDirectory); QString("awesomewidgets/formatters"), QStandardPaths::LocateDirectory);
} }
QPair<QString, AWAbstractFormatter::FormatterClass> QPair<QString, AWAbstractFormatter::FormatterClass>
AWFormatterHelper::readMetadata(const QString &_filePath) const AWFormatterHelper::readMetadata(const QString filePath) const
{ {
qCDebug(LOG_AW) << "Read initial parameters from" << _filePath; qCDebug(LOG_AW) << "Read initial parameters from" << filePath;
QSettings settings(_filePath, QSettings::IniFormat); QSettings settings(filePath, QSettings::IniFormat);
settings.beginGroup("Desktop Entry"); settings.beginGroup(QString("Desktop Entry"));
QString name = settings.value("Name", _filePath).toString(); QString name = settings.value(QString("Name"), filePath).toString();
QString type = settings.value("X-AW-Type", "NoFormat").toString(); QString type
= settings.value(QString("X-AW-Type"), QString("NoFormat")).toString();
AWAbstractFormatter::FormatterClass formatter = defineFormatterClass(type); AWAbstractFormatter::FormatterClass formatter = defineFormatterClass(type);
settings.endGroup(); settings.endGroup();
@ -298,13 +291,10 @@ AWFormatterHelper::readMetadata(const QString &_filePath) const
void AWFormatterHelper::doCreateItem() void AWFormatterHelper::doCreateItem()
{ {
QStringList selection = QStringList() << "NoFormat" QStringList selection = QStringList()
<< "DateTime" << QString("NoFormat") << QString("DateTime")
<< "Float" << QString("Float") << QString("List")
<< "List" << QString("Script") << QString("String");
<< "Script"
<< "String"
<< "Json";
bool ok; bool ok;
QString select = QInputDialog::getItem( QString select = QInputDialog::getItem(
this, i18n("Select type"), i18n("Type:"), selection, 0, false, &ok); this, i18n("Select type"), i18n("Type:"), selection, 0, false, &ok);
@ -327,8 +317,6 @@ void AWFormatterHelper::doCreateItem()
return createItem<AWScriptFormatter>(); return createItem<AWScriptFormatter>();
case AWAbstractFormatter::FormatterClass::String: case AWAbstractFormatter::FormatterClass::String:
return createItem<AWStringFormatter>(); return createItem<AWStringFormatter>();
case AWAbstractFormatter::FormatterClass::Json:
return createItem<AWJsonFormatter>();
case AWAbstractFormatter::FormatterClass::NoFormat: case AWAbstractFormatter::FormatterClass::NoFormat:
return createItem<AWNoFormatter>(); return createItem<AWNoFormatter>();
} }

View File

@ -31,15 +31,15 @@ class AWFormatterHelper : public AbstractExtItemAggregator
Q_OBJECT Q_OBJECT
public: public:
explicit AWFormatterHelper(QWidget *_parent = nullptr); explicit AWFormatterHelper(QWidget *parent = nullptr);
virtual ~AWFormatterHelper(); virtual ~AWFormatterHelper();
QString convert(const QVariant &_value, const QString &_name) const; QString convert(const QVariant &value, const QString &name) const;
QStringList definedFormatters() const; QStringList definedFormatters() const;
QHash<QString, QString> getFormatters() const; QHash<QString, QString> getFormatters() const;
QList<AbstractExtItem *> items() const; QList<AbstractExtItem *> items() const;
QStringList knownFormatters() const; QStringList knownFormatters() const;
bool removeUnusedFormatters(const QStringList &_keys) const; bool writeFormatters(const QStringList keys) const;
bool writeFormatters(const QHash<QString, QString> &_configuration) const; bool writeFormatters(const QHash<QString, QString> configuration) const;
public slots: public slots:
void editItems(); void editItems();
@ -47,18 +47,17 @@ public slots:
private: private:
// methods // methods
AWAbstractFormatter::FormatterClass AWAbstractFormatter::FormatterClass
defineFormatterClass(const QString &_stringType) const; defineFormatterClass(const QString stringType) const;
void initFormatters(); void initFormatters();
void initKeys(); void initKeys();
void installDirectories(); void installDirectories();
QPair<QString, AWAbstractFormatter::FormatterClass> QPair<QString, AWAbstractFormatter::FormatterClass>
readMetadata(const QString &_filePath) const; readMetadata(const QString filePath) const;
// parent methods // parent methods
void doCreateItem(); void doCreateItem();
void initItems(); void initItems();
// properties // properties
QStringList m_directories; QStringList m_directories;
QString m_filePath;
QHash<QString, AWAbstractFormatter *> m_formatters; QHash<QString, AWAbstractFormatter *> m_formatters;
QHash<QString, AWAbstractFormatter *> m_formattersClasses; QHash<QString, AWAbstractFormatter *> m_formattersClasses;
}; };

View File

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

View File

@ -26,10 +26,10 @@
namespace AWKeyCache namespace AWKeyCache
{ {
bool addKeyToCache(const QString &_type, const QString &_key = ""); bool addKeyToCache(const QString type, const QString key = QString(""));
QStringList getRequiredKeys(const QStringList &_keys, const QStringList &_bars, QStringList getRequiredKeys(const QStringList &keys, const QStringList &bars,
const QVariantMap &_tooltip, const QVariantMap &tooltip,
const QStringList &_allKeys); const QStringList &allKeys);
QHash<QString, QStringList> loadKeysFromCache(); QHash<QString, QStringList> loadKeysFromCache();
}; };

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -24,51 +24,52 @@
#include "awkeysaggregator.h" #include "awkeysaggregator.h"
QString AWPatternFunctions::expandLambdas(QString _code, QString AWPatternFunctions::expandLambdas(QString code,
AWKeysAggregator *_aggregator, AWKeysAggregator *aggregator,
const QVariantHash &_metadata, const QVariantHash &metadata,
const QStringList &_usedKeys) const QStringList &usedKeys)
{ {
qCDebug(LOG_AW) << "Expand lamdas in" << _code; qCDebug(LOG_AW) << "Expand lamdas in" << code;
QJSEngine engine; QJSEngine engine;
// apply $this values // apply $this values
_code.replace("$this", _metadata[_code].toString()); code.replace(QString("$this"), metadata[code].toString());
// parsed values // parsed values
for (auto &lambdaKey : _usedKeys) for (auto lambdaKey : usedKeys)
_code.replace(QString("$%1").arg(lambdaKey), code.replace(QString("$%1").arg(lambdaKey),
_aggregator->formatter(_metadata[lambdaKey], lambdaKey)); aggregator->formatter(metadata[lambdaKey], lambdaKey));
qCInfo(LOG_AW) << "Expression" << _code; qCInfo(LOG_AW) << "Expression" << code;
QJSValue result = engine.evaluate(_code); QJSValue result = engine.evaluate(code);
if (result.isError()) { if (result.isError()) {
qCWarning(LOG_AW) << "Uncaught exception at line" qCWarning(LOG_AW) << "Uncaught exception at line"
<< result.property("lineNumber").toInt() << ":" << result.property("lineNumber").toInt() << ":"
<< result.toString(); << result.toString();
return ""; return QString();
} else { } else {
return result.toString(); return result.toString();
} }
} }
QString AWPatternFunctions::expandTemplates(QString _code) QString AWPatternFunctions::expandTemplates(QString code)
{ {
qCDebug(LOG_AW) << "Expand templates in" << _code; qCDebug(LOG_AW) << "Expand templates in" << code;
// match the following construction $template{{some code here}} // match the following construction $template{{some code here}}
QRegularExpression templatesRegexp("\\$template\\{\\{(?<body>.*?)\\}\\}"); QRegularExpression templatesRegexp(
QString("\\$template\\{\\{(?<body>.*?)\\}\\}"));
templatesRegexp.setPatternOptions( templatesRegexp.setPatternOptions(
QRegularExpression::DotMatchesEverythingOption); QRegularExpression::DotMatchesEverythingOption);
QRegularExpressionMatchIterator it = templatesRegexp.globalMatch(_code); QRegularExpressionMatchIterator it = templatesRegexp.globalMatch(code);
while (it.hasNext()) { while (it.hasNext()) {
QRegularExpressionMatch match = it.next(); QRegularExpressionMatch match = it.next();
QString body = match.captured("body"); QString body = match.captured(QString("body"));
QJSEngine engine; QJSEngine engine;
qCInfo(LOG_AW) << "Expression" << body; qCInfo(LOG_AW) << "Expression" << body;
QJSValue result = engine.evaluate(body); QJSValue result = engine.evaluate(body);
QString templateResult = ""; QString templateResult = QString("");
if (result.isError()) { if (result.isError()) {
qCWarning(LOG_AW) << "Uncaught exception at line" qCWarning(LOG_AW) << "Uncaught exception at line"
<< result.property("lineNumber").toInt() << ":" << result.property("lineNumber").toInt() << ":"
@ -78,18 +79,18 @@ QString AWPatternFunctions::expandTemplates(QString _code)
} }
// replace template // replace template
_code.replace(match.captured(), templateResult); code.replace(match.captured(), templateResult);
} }
return _code; return code;
} }
QList<AWPatternFunctions::AWFunction> QList<AWPatternFunctions::AWFunction>
AWPatternFunctions::findFunctionCalls(const QString &_function, AWPatternFunctions::findFunctionCalls(const QString function,
const QString &_code) const QString code)
{ {
qCDebug(LOG_AW) << "Looking for function" << _function << "in" << _code; qCDebug(LOG_AW) << "Looking for function" << function << "in" << code;
// I suggest the following regex for the internal functions // I suggest the following regex for the internal functions
// $aw_function_name<some args here if any>{{function body}} // $aw_function_name<some args here if any>{{function body}}
@ -99,34 +100,34 @@ AWPatternFunctions::findFunctionCalls(const QString &_function,
// by using $, e.g. ${ // by using $, e.g. ${
QRegularExpression regex( QRegularExpression regex(
QString("\\$%1\\<(?<args>.*?)\\>\\{\\{(?<body>.*?)\\}\\}") QString("\\$%1\\<(?<args>.*?)\\>\\{\\{(?<body>.*?)\\}\\}")
.arg(_function)); .arg(function));
regex.setPatternOptions(QRegularExpression::DotMatchesEverythingOption); regex.setPatternOptions(QRegularExpression::DotMatchesEverythingOption);
QList<AWPatternFunctions::AWFunction> foundFunctions; QList<AWPatternFunctions::AWFunction> foundFunctions;
QRegularExpressionMatchIterator it = regex.globalMatch(_code); QRegularExpressionMatchIterator it = regex.globalMatch(code);
while (it.hasNext()) { while (it.hasNext()) {
QRegularExpressionMatch match = it.next(); QRegularExpressionMatch match = it.next();
AWPatternFunctions::AWFunction metadata; AWPatternFunctions::AWFunction metadata;
// work with args // work with args
QString argsString = match.captured("args"); QString argsString = match.captured(QString("args"));
if (argsString.isEmpty()) { if (argsString.isEmpty()) {
metadata.args = QStringList(); metadata.args = QStringList();
} else { } else {
// replace '$,' to 0x1d // replace '$,' to 0x1d
argsString.replace("$,", QString(0x1d)); argsString.replace(QString("$,"), QString(0x1d));
QStringList args = argsString.split(','); QStringList args = argsString.split(QChar(','));
std::for_each(args.begin(), args.end(), [](QString &arg) { std::for_each(args.begin(), args.end(), [](QString &arg) {
arg.replace(QString(0x1d), ","); arg.replace(QString(0x1d), QString(","));
}); });
metadata.args = args; metadata.args = args;
} }
// other variables // other variables
metadata.body = match.captured("body"); metadata.body = match.captured(QString("body"));
metadata.what = match.captured(); metadata.what = match.captured();
// replace brackets // replace brackets
metadata.body.replace("${", "{"); metadata.body.replace(QString("${"), QString("{"));
metadata.body.replace("$}", "}"); metadata.body.replace(QString("$}"), QString("}"));
foundFunctions.append(metadata); foundFunctions.append(metadata);
} }
@ -134,93 +135,93 @@ AWPatternFunctions::findFunctionCalls(const QString &_function,
} }
QString AWPatternFunctions::insertAllKeys(QString _code, QString AWPatternFunctions::insertAllKeys(QString code, const QStringList keys)
const QStringList &_keys)
{ {
qCDebug(LOG_AW) << "Looking for keys in code" << _code << "using list" qCDebug(LOG_AW) << "Looking for keys in code" << code << "using list"
<< _keys; << keys;
QList<AWPatternFunctions::AWFunction> found QList<AWPatternFunctions::AWFunction> found
= AWPatternFunctions::findFunctionCalls("aw_all", _code); = AWPatternFunctions::findFunctionCalls(QString("aw_all"), code);
for (auto &function : found) { for (auto function : found) {
QString separator = function.args.isEmpty() ? "," : function.args.at(0); QString separator
QStringList required = _keys.filter(QRegExp(function.body)); = function.args.isEmpty() ? QString(",") : function.args.at(0);
QStringList required = keys.filter(QRegExp(function.body));
std::for_each(required.begin(), required.end(), [](QString &value) { std::for_each(required.begin(), required.end(), [](QString &value) {
value = QString("%1: $%1").arg(value); value = QString("%1: $%1").arg(value);
}); });
_code.replace(function.what, required.join(separator)); code.replace(function.what, required.join(separator));
} }
return _code; return code;
} }
QString AWPatternFunctions::insertKeyCount(QString _code, QString AWPatternFunctions::insertKeyCount(QString code, const QStringList keys)
const QStringList &_keys)
{ {
qCDebug(LOG_AW) << "Looking for count in code" << _code << "using list" qCDebug(LOG_AW) << "Looking for count in code" << code << "using list"
<< _keys; << keys;
QList<AWPatternFunctions::AWFunction> found QList<AWPatternFunctions::AWFunction> found
= AWPatternFunctions::findFunctionCalls("aw_count", _code); = AWPatternFunctions::findFunctionCalls(QString("aw_count"), code);
for (auto &function : found) { for (auto function : found) {
int count = _keys.filter(QRegExp(function.body)).count(); int count = keys.filter(QRegExp(function.body)).count();
_code.replace(function.what, QString::number(count)); code.replace(function.what, QString::number(count));
} }
return _code; return code;
} }
QString AWPatternFunctions::insertKeyNames(QString _code, QString AWPatternFunctions::insertKeyNames(QString code, const QStringList keys)
const QStringList &_keys)
{ {
qCDebug(LOG_AW) << "Looking for key names in code" << _code << "using list" qCDebug(LOG_AW) << "Looking for key names in code" << code << "using list"
<< _keys; << keys;
QList<AWPatternFunctions::AWFunction> found QList<AWPatternFunctions::AWFunction> found
= AWPatternFunctions::findFunctionCalls("aw_names", _code); = AWPatternFunctions::findFunctionCalls(QString("aw_names"), code);
for (auto &function : found) { for (auto function : found) {
QString separator = function.args.isEmpty() ? "," : function.args.at(0); QString separator
QStringList required = _keys.filter(QRegExp(function.body)); = function.args.isEmpty() ? QString(",") : function.args.at(0);
QStringList required = keys.filter(QRegExp(function.body));
_code.replace(function.what, required.join(separator)); code.replace(function.what, required.join(separator));
} }
return _code; return code;
} }
QString AWPatternFunctions::insertKeys(QString _code, const QStringList &_keys) QString AWPatternFunctions::insertKeys(QString code, const QStringList keys)
{ {
qCDebug(LOG_AW) << "Looking for keys in code" << _code << "using list" qCDebug(LOG_AW) << "Looking for keys in code" << code << "using list"
<< _keys; << keys;
QList<AWPatternFunctions::AWFunction> found QList<AWPatternFunctions::AWFunction> found
= AWPatternFunctions::findFunctionCalls("aw_keys", _code); = AWPatternFunctions::findFunctionCalls(QString("aw_keys"), code);
for (auto &function : found) { for (auto function : found) {
QString separator = function.args.isEmpty() ? "," : function.args.at(0); QString separator
QStringList required = _keys.filter(QRegExp(function.body)); = function.args.isEmpty() ? QString(",") : function.args.at(0);
QStringList required = keys.filter(QRegExp(function.body));
std::for_each(required.begin(), required.end(), [](QString &value) { std::for_each(required.begin(), required.end(), [](QString &value) {
value = QString("$%1").arg(value); value = QString("$%1").arg(value);
}); });
_code.replace(function.what, required.join(separator)); code.replace(function.what, required.join(separator));
} }
return _code; return code;
} }
QString AWPatternFunctions::insertMacros(QString _code) QString AWPatternFunctions::insertMacros(QString code)
{ {
qCDebug(LOG_AW) << "Looking for macros in code" << _code; qCDebug(LOG_AW) << "Looking for macros in code" << code;
QList<AWPatternFunctions::AWFunction> found QList<AWPatternFunctions::AWFunction> found
= AWPatternFunctions::findFunctionCalls("aw_macro", _code); = AWPatternFunctions::findFunctionCalls(QString("aw_macro"), code);
for (auto &macro : found) { for (auto macro : found) {
// get macro params // get macro params
if (macro.args.isEmpty()) { if (macro.args.isEmpty()) {
qCWarning(LOG_AW) << "No macro name found for" << macro.what; qCWarning(LOG_AW) << "No macro name found for" << macro.what;
@ -230,12 +231,12 @@ QString AWPatternFunctions::insertMacros(QString _code)
// find macro usage // find macro usage
QList<AWPatternFunctions::AWFunction> macroUsage QList<AWPatternFunctions::AWFunction> macroUsage
= AWPatternFunctions::findFunctionCalls( = AWPatternFunctions::findFunctionCalls(
QString("aw_macro_%1").arg(name), _code); QString("aw_macro_%1").arg(name), code);
for (auto &function : macroUsage) { for (auto function : macroUsage) {
if (function.args.count() != macro.args.count()) { if (function.args.count() != macro.args.count()) {
qCWarning(LOG_AW) qCWarning(LOG_AW) << "Invalid args count found for call"
<< "Invalid args count found for call" << function.what << function.what << "with macro"
<< "with macro" << macro.what; << macro.what;
continue; continue;
} }
// generate body to replace // generate body to replace
@ -247,33 +248,31 @@ QString AWPatternFunctions::insertMacros(QString _code)
function.args.at(index)); function.args.at(index));
}); });
// do replace // do replace
_code.replace(function.what, result); code.replace(function.what, result);
} }
// remove macro from source pattern // remove macro from source pattern
_code.remove(macro.what); code.remove(macro.what);
} }
return _code; return code;
} }
QStringList AWPatternFunctions::findKeys(const QString &_code, QStringList AWPatternFunctions::findKeys(const QString code,
const QStringList &_keys, const QStringList keys,
const bool _isBars) const bool isBars)
{ {
qCDebug(LOG_AW) << "Looking for keys in code" << _code << "using list" qCDebug(LOG_AW) << "Looking for keys in code" << code << "using list"
<< _keys; << keys;
QStringList selectedKeys; QStringList selectedKeys;
QString replacedCode = _code; for (auto key : keys)
for (auto &key : _keys) if ((key.startsWith(QString("bar")) == isBars)
if ((key.startsWith("bar") == _isBars) && (code.contains(QString("$%1").arg(key)))) {
&& (replacedCode.contains(QString("$%1").arg(key)))) {
qCInfo(LOG_AW) << "Found key" << key << "with bar enabled" qCInfo(LOG_AW) << "Found key" << key << "with bar enabled"
<< _isBars; << isBars;
selectedKeys.append(key); selectedKeys.append(key);
replacedCode.replace(QString("$%1").arg(key), "");
} }
if (selectedKeys.isEmpty()) if (selectedKeys.isEmpty())
qCWarning(LOG_AW) << "No keys found"; qCWarning(LOG_AW) << "No keys found";
@ -282,20 +281,20 @@ QStringList AWPatternFunctions::findKeys(const QString &_code,
} }
QStringList AWPatternFunctions::findLambdas(const QString &_code) QStringList AWPatternFunctions::findLambdas(const QString code)
{ {
qCDebug(LOG_AW) << "Looking for lambdas in code" << _code; qCDebug(LOG_AW) << "Looking for lambdas in code" << code;
QStringList selectedKeys; QStringList selectedKeys;
// match the following construction ${{some code here}} // match the following construction ${{some code here}}
QRegularExpression lambdaRegexp("\\$\\{\\{(?<body>.*?)\\}\\}"); QRegularExpression lambdaRegexp(QString("\\$\\{\\{(?<body>.*?)\\}\\}"));
lambdaRegexp.setPatternOptions( lambdaRegexp.setPatternOptions(
QRegularExpression::DotMatchesEverythingOption); QRegularExpression::DotMatchesEverythingOption);
QRegularExpressionMatchIterator it = lambdaRegexp.globalMatch(_code); QRegularExpressionMatchIterator it = lambdaRegexp.globalMatch(code);
while (it.hasNext()) { while (it.hasNext()) {
QRegularExpressionMatch match = it.next(); QRegularExpressionMatch match = it.next();
QString lambda = match.captured("body"); QString lambda = match.captured(QString("body"));
// append // append
qCInfo(LOG_AW) << "Found lambda" << lambda; qCInfo(LOG_AW) << "Found lambda" << lambda;

View File

@ -34,21 +34,20 @@ typedef struct {
} AWFunction; } AWFunction;
// insert methods // insert methods
QString expandLambdas(QString _code, AWKeysAggregator *_aggregator, QString expandLambdas(QString code, AWKeysAggregator *aggregator,
const QVariantHash &_metadata, const QVariantHash &metadata,
const QStringList &_usedKeys); const QStringList &usedKeys);
QString expandTemplates(QString _code); QString expandTemplates(QString code);
QList<AWFunction> findFunctionCalls(const QString &_function, QList<AWFunction> findFunctionCalls(const QString function, const QString code);
const QString &_code); QString insertAllKeys(QString code, const QStringList keys);
QString insertAllKeys(QString _code, const QStringList &_keys); QString insertKeyCount(QString code, const QStringList keys);
QString insertKeyCount(QString _code, const QStringList &_keys); QString insertKeyNames(QString code, const QStringList keys);
QString insertKeyNames(QString _code, const QStringList &_keys); QString insertKeys(QString code, const QStringList keys);
QString insertKeys(QString _code, const QStringList &_keys); QString insertMacros(QString code);
QString insertMacros(QString _code);
// find methods // find methods
QStringList findKeys(const QString &_code, const QStringList &_keys, QStringList findKeys(const QString code, const QStringList keys,
const bool _isBars); const bool isBars);
QStringList findLambdas(const QString &_code); QStringList findLambdas(const QString code);
}; };

View File

@ -1,192 +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 "awtelemetryhandler.h"
#include <QJsonDocument>
#include <QJsonParseError>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QSettings>
#include <QStandardPaths>
#include <QUuid>
#include "awdebug.h"
AWTelemetryHandler::AWTelemetryHandler(QObject *_parent,
const QString &_clientId)
: QObject(_parent)
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
m_localFile = QString("%1/awesomewidgets/telemetry.ini")
.arg(QStandardPaths::writableLocation(
QStandardPaths::GenericDataLocation));
// override client id if any
if (!_clientId.isEmpty())
m_clientId = _clientId;
}
AWTelemetryHandler::~AWTelemetryHandler()
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
}
QStringList AWTelemetryHandler::get(const QString &_group) const
{
qCDebug(LOG_AW) << "Get stored data for group" << _group;
QStringList values;
QSettings settings(m_localFile, QSettings::IniFormat);
settings.beginGroup(_group);
for (auto &key : settings.childKeys())
values.append(settings.value(key).toString());
settings.endGroup();
return values;
}
QString AWTelemetryHandler::getLast(const QString &_group) const
{
qCDebug(LOG_AW) << "Get last stored data for group" << _group;
return get(_group).last();
}
void AWTelemetryHandler::init(const int _count, const bool _enableRemote,
const QString &_clientId)
{
qCDebug(LOG_AW) << "Init telemetry with count" << _count << "enable remote"
<< _enableRemote << "client ID" << _clientId;
m_storeCount = _count;
m_uploadEnabled = _enableRemote;
m_clientId = _clientId;
}
bool AWTelemetryHandler::put(const QString &_group, const QString &_value) const
{
qCDebug(LOG_AW) << "Store data with group" << _group << "and value"
<< _value;
QSettings settings(m_localFile, QSettings::IniFormat);
settings.beginGroup(_group);
// values will be stored as num=value inside specified group
// load all values to memory
QStringList saved;
for (auto &key : settings.childKeys())
saved.append(settings.value(key).toString());
// check if this value is already saved
if (saved.contains(_value)) {
qCInfo(LOG_AW) << "Configuration" << _value << "for group" << _group
<< "is already saved";
return false;
}
saved.append(_value);
// remove old ones
while (saved.count() > m_storeCount)
saved.takeFirst();
// clear group
settings.remove("");
// and save now
for (auto &val : saved) {
QString key = getKey(settings.childKeys().count());
settings.setValue(key, val);
}
// sync settings
settings.endGroup();
settings.sync();
// return status
return (settings.status() == QSettings::NoError);
}
void AWTelemetryHandler::uploadTelemetry(const QString &_group,
const QString &_value)
{
qCDebug(LOG_AW) << "Upload data with group" << _group << "and value"
<< _value;
if (!m_uploadEnabled) {
qCInfo(LOG_AW) << "Upload disabled by configuration";
return;
}
QNetworkAccessManager *manager = new QNetworkAccessManager(nullptr);
connect(manager, SIGNAL(finished(QNetworkReply *)), this,
SLOT(telemetryReplyRecieved(QNetworkReply *)));
QUrl url(REMOTE_TELEMETRY_URL);
QNetworkRequest request(url);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
// generate payload
QVariantMap payload;
payload["api"] = AW_TELEMETRY_API;
payload["client_id"] = m_clientId;
payload["metadata"] = _value;
payload["type"] = _group;
// convert to QByteArray to send request
QByteArray data
= QJsonDocument::fromVariant(payload).toJson(QJsonDocument::Compact);
qCInfo(LOG_AW) << "Send request with body" << data.data() << "and size"
<< data.size();
manager->post(request, data);
}
void AWTelemetryHandler::telemetryReplyRecieved(QNetworkReply *_reply)
{
if (_reply->error() != QNetworkReply::NoError) {
qCWarning(LOG_AW) << "An error occurs" << _reply->error()
<< "with message" << _reply->errorString();
return;
}
QJsonParseError error;
QJsonDocument jsonDoc = QJsonDocument::fromJson(_reply->readAll(), &error);
if (error.error != QJsonParseError::NoError) {
qCWarning(LOG_AW) << "Parse error" << error.errorString();
return;
}
_reply->deleteLater();
// convert to map
QVariantMap response = jsonDoc.toVariant().toMap();
QString message = response["message"].toString();
qCInfo(LOG_AW) << "Server reply on telemetry" << message;
return emit(replyReceived(message));
}
QString AWTelemetryHandler::getKey(const int _count) const
{
qCDebug(LOG_AW) << "Get key for keys count" << _count;
return QString("%1").arg(_count, 3, 10, QChar('0'));
}

View File

@ -1,62 +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/ *
***************************************************************************/
#ifndef AWTELEMETRYHANDLER_H
#define AWTELEMETRYHANDLER_H
#include <QObject>
#include <QtCore/QVariant>
class QAbstractButton;
class QNetworkReply;
class AWTelemetryHandler : public QObject
{
Q_OBJECT
public:
const char *REMOTE_TELEMETRY_URL = "https://arcanis.me/telemetry";
explicit AWTelemetryHandler(QObject *_parent = nullptr,
const QString &_clientId = "");
virtual ~AWTelemetryHandler();
Q_INVOKABLE QStringList get(const QString &_group) const;
Q_INVOKABLE QString getLast(const QString &_group) const;
Q_INVOKABLE void init(const int _count, const bool _enableRemote,
const QString &_clientId);
Q_INVOKABLE bool put(const QString &_group, const QString &_value) const;
Q_INVOKABLE void uploadTelemetry(const QString &_group,
const QString &_value);
signals:
void replyReceived(const QString &_message);
private slots:
void telemetryReplyRecieved(QNetworkReply *_reply);
private:
QString getKey(const int _count) const;
QString m_clientId;
QString m_localFile;
int m_storeCount = 0;
bool m_uploadEnabled = false;
};
#endif /* AWTELEMETRYHANDLER_H */

View File

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

View File

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

View File

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

View File

@ -18,23 +18,21 @@
#include "abstractextitem.h" #include "abstractextitem.h"
#include <QDir> #include <QDir>
#include <QLocalServer>
#include <QSettings> #include <QSettings>
#include <QStandardPaths> #include <QStandardPaths>
#include <QTime> #include <QTime>
#include "abstractextitemaggregator.h" #include "abstractextitemaggregator.h"
#include "awdebug.h" #include "awdebug.h"
#include "qcronscheduler.h"
AbstractExtItem::AbstractExtItem(QWidget *_parent, const QString &_filePath) AbstractExtItem::AbstractExtItem(QWidget *parent, const QString filePath)
: QDialog(_parent) : QDialog(parent)
, m_fileName(_filePath) , m_fileName(filePath)
{ {
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
qCDebug(LOG_LIB) << "Desktop name" << _filePath; qCDebug(LOG_LIB) << "Desktop name" << filePath;
m_name = m_fileName; m_name = m_fileName;
} }
@ -43,12 +41,6 @@ AbstractExtItem::AbstractExtItem(QWidget *_parent, const QString &_filePath)
AbstractExtItem::~AbstractExtItem() AbstractExtItem::~AbstractExtItem()
{ {
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (m_socket) {
m_socket->close();
m_socket->removeServer(socket());
delete m_socket;
}
} }
@ -71,29 +63,8 @@ void AbstractExtItem::copyDefaults(AbstractExtItem *_other) const
_other->setActive(isActive()); _other->setActive(isActive());
_other->setApiVersion(apiVersion()); _other->setApiVersion(apiVersion());
_other->setComment(comment()); _other->setComment(comment());
_other->setCron(cron());
_other->setInterval(interval()); _other->setInterval(interval());
_other->setName(name()); _other->setName(name());
_other->setSocket(socket());
}
void AbstractExtItem::startTimer()
{
if (!socket().isEmpty())
// check if there is active socket setup
return;
else if (!cron().isEmpty())
// check if there is active scheduler
return;
else if (m_times == 1)
// check if it is time to update
emit(requestDataUpdate());
// update counter value
if (m_times >= interval())
m_times = 0;
m_times++;
} }
@ -124,12 +95,6 @@ QString AbstractExtItem::comment() const
} }
QString AbstractExtItem::cron() const
{
return m_cron;
}
QString AbstractExtItem::fileName() const QString AbstractExtItem::fileName() const
{ {
return m_fileName; return m_fileName;
@ -160,13 +125,7 @@ int AbstractExtItem::number() const
} }
QString AbstractExtItem::socket() const QString AbstractExtItem::tag(const QString _type) const
{
return m_socketFile;
}
QString AbstractExtItem::tag(const QString &_type) const
{ {
qCDebug(LOG_LIB) << "Tag type" << _type; qCDebug(LOG_LIB) << "Tag type" << _type;
@ -190,7 +149,7 @@ void AbstractExtItem::setActive(const bool _state)
} }
void AbstractExtItem::setComment(const QString &_comment) void AbstractExtItem::setComment(const QString _comment)
{ {
qCDebug(LOG_LIB) << "Comment" << _comment; qCDebug(LOG_LIB) << "Comment" << _comment;
@ -198,28 +157,6 @@ void AbstractExtItem::setComment(const QString &_comment)
} }
void AbstractExtItem::setCron(const QString &_cron)
{
qCDebug(LOG_LIB) << "Cron string" << _cron;
// deinit module first
if (m_scheduler) {
disconnect(m_scheduler, SIGNAL(activated()), this,
SIGNAL(requestDataUpdate()));
delete m_scheduler;
}
m_cron = _cron;
if (cron().isEmpty())
return;
// init scheduler
m_scheduler = new QCronScheduler(this);
m_scheduler->parse(cron());
connect(m_scheduler, SIGNAL(activated()), this,
SIGNAL(requestDataUpdate()));
}
void AbstractExtItem::setInterval(const int _interval) void AbstractExtItem::setInterval(const int _interval)
{ {
qCDebug(LOG_LIB) << "Interval" << _interval; qCDebug(LOG_LIB) << "Interval" << _interval;
@ -230,7 +167,7 @@ void AbstractExtItem::setInterval(const int _interval)
} }
void AbstractExtItem::setName(const QString &_name) void AbstractExtItem::setName(const QString _name)
{ {
qCDebug(LOG_LIB) << "Name" << _name; qCDebug(LOG_LIB) << "Name" << _name;
@ -259,55 +196,20 @@ void AbstractExtItem::setNumber(int _number)
} }
void AbstractExtItem::setSocket(const QString &_socket)
{
qCDebug(LOG_LIB) << "Socket" << _socket;
// remove old socket first
deinitSocket();
m_socketFile = _socket;
}
void AbstractExtItem::deinitSocket()
{
if (!m_socket)
return;
m_socket->close();
m_socket->removeServer(socket());
delete m_socket;
disconnect(m_socket, SIGNAL(newConnection()), this,
SLOT(newConnectionReceived()));
}
void AbstractExtItem::initSocket()
{
// remove old socket first
deinitSocket();
m_socket = new QLocalServer(this);
bool listening = m_socket->listen(socket());
qCInfo(LOG_LIB) << "Server listening on" << socket() << listening;
connect(m_socket, SIGNAL(newConnection()), this,
SLOT(newConnectionReceived()));
}
void AbstractExtItem::readConfiguration() void AbstractExtItem::readConfiguration()
{ {
QSettings settings(m_fileName, QSettings::IniFormat); QSettings settings(m_fileName, QSettings::IniFormat);
settings.beginGroup("Desktop Entry"); settings.beginGroup(QString("Desktop Entry"));
setName(settings.value("Name", name()).toString()); setName(settings.value(QString("Name"), name()).toString());
setComment(settings.value("Comment", comment()).toString()); setComment(settings.value(QString("Comment"), comment()).toString());
setApiVersion(settings.value("X-AW-ApiVersion", apiVersion()).toInt()); setApiVersion(
setActive(settings.value("X-AW-Active", isActive()).toBool()); settings.value(QString("X-AW-ApiVersion"), apiVersion()).toInt());
setInterval(settings.value("X-AW-Interval", interval()).toInt()); setActive(
setNumber(settings.value("X-AW-Number", number()).toInt()); settings.value(QString("X-AW-Active"), QVariant(isActive())).toString()
setCron(settings.value("X-AW-Schedule", cron()).toString()); == QString("true"));
setSocket(settings.value("X-AW-Socket", socket()).toString()); setInterval(settings.value(QString("X-AW-Interval"), interval()).toInt());
setNumber(settings.value(QString("X-AW-Number"), number()).toInt());
settings.endGroup(); settings.endGroup();
} }
@ -326,23 +228,15 @@ void AbstractExtItem::writeConfiguration() const
QSettings settings(writtableConfig(), QSettings::IniFormat); QSettings settings(writtableConfig(), QSettings::IniFormat);
qCInfo(LOG_LIB) << "Configuration file" << settings.fileName(); qCInfo(LOG_LIB) << "Configuration file" << settings.fileName();
settings.beginGroup("Desktop Entry"); settings.beginGroup(QString("Desktop Entry"));
settings.setValue("Encoding", "UTF-8"); settings.setValue(QString("Encoding"), QString("UTF-8"));
settings.setValue("Name", name()); settings.setValue(QString("Name"), name());
settings.setValue("Comment", comment()); settings.setValue(QString("Comment"), comment());
settings.setValue("X-AW-ApiVersion", apiVersion()); settings.setValue(QString("X-AW-ApiVersion"), apiVersion());
settings.setValue("X-AW-Active", isActive()); settings.setValue(QString("X-AW-Active"), QVariant(isActive()).toString());
settings.setValue("X-AW-Interval", interval()); settings.setValue(QString("X-AW-Interval"), interval());
settings.setValue("X-AW-Number", number()); settings.setValue(QString("X-AW-Number"), number());
settings.setValue("X-AW-Schedule", cron());
settings.setValue("X-AW-Socket", socket());
settings.endGroup(); settings.endGroup();
settings.sync(); settings.sync();
} }
void AbstractExtItem::newConnectionReceived()
{
emit(requestDataUpdate());
}

View File

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

View File

@ -25,11 +25,11 @@
#include <QPushButton> #include <QPushButton>
AbstractExtItemAggregator::AbstractExtItemAggregator(QWidget *_parent, AbstractExtItemAggregator::AbstractExtItemAggregator(QWidget *parent,
const QString &_type) const QString type)
: QDialog(_parent) : QDialog(parent)
, ui(new Ui::AbstractExtItemAggregator) , ui(new Ui::AbstractExtItemAggregator)
, m_type(_type) , m_type(type)
{ {
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
@ -113,13 +113,13 @@ void AbstractExtItemAggregator::editItem()
QString AbstractExtItemAggregator::getName() QString AbstractExtItemAggregator::getName()
{ {
bool ok; bool ok;
QString name QString name = QInputDialog::getText(this, i18n("Enter file name"),
= QInputDialog::getText(this, i18n("Enter file name"), i18n("File name"), QLineEdit::Normal,
i18n("File name"), QLineEdit::Normal, "", &ok); QString(""), &ok);
if ((!ok) || (name.isEmpty())) if ((!ok) || (name.isEmpty()))
return ""; return QString("");
if (!name.endsWith(".desktop")) if (!name.endsWith(QString(".desktop")))
name += ".desktop"; name += QString(".desktop");
return name; return name;
} }
@ -132,7 +132,7 @@ AbstractExtItem *AbstractExtItemAggregator::itemFromWidget()
return nullptr; return nullptr;
AbstractExtItem *found = nullptr; AbstractExtItem *found = nullptr;
for (auto &item : items()) { for (auto item : items()) {
QString fileName = QFileInfo(item->fileName()).fileName(); QString fileName = QFileInfo(item->fileName()).fileName();
if (fileName != widgetItem->text()) if (fileName != widgetItem->text())
continue; continue;
@ -150,14 +150,14 @@ AbstractExtItem *AbstractExtItemAggregator::itemFromWidget()
void AbstractExtItemAggregator::repaintList() void AbstractExtItemAggregator::repaintList()
{ {
ui->listWidget->clear(); ui->listWidget->clear();
for (auto &_item : items()) { for (auto _item : items()) {
QString fileName = QFileInfo(_item->fileName()).fileName(); QString fileName = QFileInfo(_item->fileName()).fileName();
QListWidgetItem *item = new QListWidgetItem(fileName, ui->listWidget); QListWidgetItem *item = new QListWidgetItem(fileName, ui->listWidget);
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()));
tooltip.append(i18n("Identity: %1", _item->uniq())); tooltip.append(i18n("Identity: %1", _item->uniq()));
item->setToolTip(tooltip.join('\n')); item->setToolTip(tooltip.join(QChar('\n')));
ui->listWidget->addItem(item); ui->listWidget->addItem(item);
} }
} }
@ -166,7 +166,7 @@ void AbstractExtItemAggregator::repaintList()
int AbstractExtItemAggregator::uniqNumber() const int AbstractExtItemAggregator::uniqNumber() const
{ {
QList<int> tagList; QList<int> tagList;
for (auto &item : items()) for (auto item : items())
tagList.append(item->number()); tagList.append(item->number());
int number = 0; int number = 0;
while (tagList.contains(number)) while (tagList.contains(number))
@ -188,7 +188,7 @@ QString AbstractExtItemAggregator::type() const
} }
void AbstractExtItemAggregator::setConfigArgs(const QVariant &_configArgs) void AbstractExtItemAggregator::setConfigArgs(const QVariant _configArgs)
{ {
qCDebug(LOG_LIB) << "Configuration arguments" << _configArgs; qCDebug(LOG_LIB) << "Configuration arguments" << _configArgs;
@ -202,14 +202,14 @@ void AbstractExtItemAggregator::editItemActivated(QListWidgetItem *)
} }
void AbstractExtItemAggregator::editItemButtonPressed(QAbstractButton *_button) void AbstractExtItemAggregator::editItemButtonPressed(QAbstractButton *button)
{ {
if (static_cast<QPushButton *>(_button) == copyButton) if (static_cast<QPushButton *>(button) == copyButton)
return copyItem(); return copyItem();
else if (static_cast<QPushButton *>(_button) == createButton) else if (static_cast<QPushButton *>(button) == createButton)
return doCreateItem(); return doCreateItem();
else if (static_cast<QPushButton *>(_button) == deleteButton) else if (static_cast<QPushButton *>(button) == deleteButton)
return deleteItem(); return deleteItem();
else if (ui->buttonBox->buttonRole(_button) == QDialogButtonBox::AcceptRole) else if (ui->buttonBox->buttonRole(button) == QDialogButtonBox::AcceptRole)
return editItem(); return editItem();
} }

View File

@ -39,7 +39,7 @@ class AbstractExtItemAggregator : public QDialog
Q_PROPERTY(QVariant type READ type) Q_PROPERTY(QVariant type READ type)
public: public:
explicit AbstractExtItemAggregator(QWidget *_parent, const QString &_type); explicit AbstractExtItemAggregator(QWidget *parent, const QString type);
virtual ~AbstractExtItemAggregator(); virtual ~AbstractExtItemAggregator();
// methods // methods
void copyItem(); void copyItem();
@ -75,11 +75,11 @@ public:
virtual QList<AbstractExtItem *> items() const = 0; virtual QList<AbstractExtItem *> items() const = 0;
QString type() const; QString type() const;
// set methods // set methods
void setConfigArgs(const QVariant &_configArgs); void setConfigArgs(const QVariant _configArgs);
private slots: private slots:
void editItemActivated(QListWidgetItem *); void editItemActivated(QListWidgetItem *);
void editItemButtonPressed(QAbstractButton *_button); void editItemButtonPressed(QAbstractButton *button);
private: private:
// ui // ui

View File

@ -28,14 +28,14 @@ class AbstractWeatherProvider : public QObject
Q_PROPERTY(int number READ number) Q_PROPERTY(int number READ number)
public: public:
explicit AbstractWeatherProvider(QObject *_parent, const int _number) explicit AbstractWeatherProvider(QObject *parent, const int number)
: QObject(_parent) : QObject(parent)
, m_number(_number){}; , m_number(number){};
virtual ~AbstractWeatherProvider(){}; virtual ~AbstractWeatherProvider(){};
virtual void initUrl(const QString &_city, const QString &_country, virtual void initUrl(const QString city, const QString country,
const int _ts) const int ts)
= 0; = 0;
virtual QVariantHash parse(const QVariantMap &_json) const = 0; virtual QVariantHash parse(const QVariantMap &json) const = 0;
virtual QUrl url() const = 0; virtual QUrl url() const = 0;
int number() const { return m_number; }; int number() const { return m_number; };

View File

@ -22,9 +22,9 @@
#include "awdebug.h" #include "awdebug.h"
AWAbstractFormatter::AWAbstractFormatter(QWidget *_parent, AWAbstractFormatter::AWAbstractFormatter(QWidget *parent,
const QString &_filePath) const QString filePath)
: AbstractExtItem(_parent, _filePath) : AbstractExtItem(parent, filePath)
{ {
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
} }
@ -55,25 +55,22 @@ QString AWAbstractFormatter::strType() const
QString value; QString value;
switch (m_type) { switch (m_type) {
case FormatterClass::DateTime: case FormatterClass::DateTime:
value = "DateTime"; value = QString("DateTime");
break; break;
case FormatterClass::Float: case FormatterClass::Float:
value = "Float"; value = QString("Float");
break; break;
case FormatterClass::List: case FormatterClass::List:
value = "List"; value = QString("List");
break; break;
case FormatterClass::Script: case FormatterClass::Script:
value = "Script"; value = QString("Script");
break; break;
case FormatterClass::String: case FormatterClass::String:
value = "String"; value = QString("String");
break;
case FormatterClass::Json:
value = "Json";
break; break;
case FormatterClass::NoFormat: case FormatterClass::NoFormat:
value = "NoFormat"; value = QString("NoFormat");
break; break;
} }
@ -87,22 +84,20 @@ AWAbstractFormatter::FormatterClass AWAbstractFormatter::type() const
} }
void AWAbstractFormatter::setStrType(const QString &_type) void AWAbstractFormatter::setStrType(const QString _type)
{ {
qCDebug(LOG_LIB) << "Type" << _type; qCDebug(LOG_LIB) << "Type" << _type;
if (_type == "DateTime") if (_type == QString("DateTime"))
m_type = FormatterClass::DateTime; m_type = FormatterClass::DateTime;
else if (_type == "Float") else if (_type == QString("Float"))
m_type = FormatterClass::Float; m_type = FormatterClass::Float;
else if (_type == "List") else if (_type == QString("List"))
m_type = FormatterClass::List; m_type = FormatterClass::List;
else if (_type == "Script") else if (_type == QString("Script"))
m_type = FormatterClass::Script; m_type = FormatterClass::Script;
else if (_type == "String") else if (_type == QString("String"))
m_type = FormatterClass::String; m_type = FormatterClass::String;
else if (_type == "Json")
m_type = FormatterClass::Json;
else else
m_type = FormatterClass::NoFormat; m_type = FormatterClass::NoFormat;
} }
@ -123,8 +118,8 @@ void AWAbstractFormatter::readConfiguration()
QSettings settings(fileName(), QSettings::IniFormat); QSettings settings(fileName(), QSettings::IniFormat);
settings.beginGroup("Desktop Entry"); settings.beginGroup(QString("Desktop Entry"));
setStrType(settings.value("X-AW-Type", strType()).toString()); setStrType(settings.value(QString("X-AW-Type"), strType()).toString());
settings.endGroup(); settings.endGroup();
} }
@ -136,8 +131,8 @@ void AWAbstractFormatter::writeConfiguration() const
QSettings settings(writtableConfig(), QSettings::IniFormat); QSettings settings(writtableConfig(), QSettings::IniFormat);
qCInfo(LOG_LIB) << "Configuration file" << settings.fileName(); qCInfo(LOG_LIB) << "Configuration file" << settings.fileName();
settings.beginGroup("Desktop Entry"); settings.beginGroup(QString("Desktop Entry"));
settings.setValue("X-AW-Type", strType()); settings.setValue(QString("X-AW-Type"), strType());
settings.endGroup(); settings.endGroup();
settings.sync(); settings.sync();

View File

@ -34,12 +34,11 @@ public:
List, List,
Script, Script,
String, String,
NoFormat, NoFormat
Json
}; };
explicit AWAbstractFormatter(QWidget *_parent = nullptr, explicit AWAbstractFormatter(QWidget *parent,
const QString &_filePath = ""); const QString filePath = QString());
virtual ~AWAbstractFormatter(); virtual ~AWAbstractFormatter();
virtual QString convert(const QVariant &_value) const = 0; virtual QString convert(const QVariant &_value) const = 0;
void copyDefaults(AbstractExtItem *_other) const; void copyDefaults(AbstractExtItem *_other) const;
@ -47,8 +46,8 @@ public:
// properties // properties
QString strType() const; QString strType() const;
FormatterClass type() const; FormatterClass type() const;
void setStrType(const QString &_type); void setStrType(const QString type);
void setType(const FormatterClass _type); void setType(const FormatterClass _type = FormatterClass::NoFormat);
public slots: public slots:
virtual void readConfiguration(); virtual void readConfiguration();

View File

@ -28,14 +28,14 @@
#include "awdebug.h" #include "awdebug.h"
AWDateTimeFormatter::AWDateTimeFormatter(QWidget *_parent, AWDateTimeFormatter::AWDateTimeFormatter(QWidget *parent,
const QString &_filePath) const QString filePath)
: AWAbstractFormatter(_parent, _filePath) : AWAbstractFormatter(parent, filePath)
, ui(new Ui::AWDateTimeFormatter) , ui(new Ui::AWDateTimeFormatter)
{ {
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty()) if (!filePath.isEmpty())
readConfiguration(); readConfiguration();
ui->setupUi(this); ui->setupUi(this);
translate(); translate();
@ -54,11 +54,11 @@ QString AWDateTimeFormatter::convert(const QVariant &_value) const
{ {
qCDebug(LOG_LIB) << "Convert value" << _value; qCDebug(LOG_LIB) << "Convert value" << _value;
return m_locale.toString(_value.toDateTime(), m_format); return _value.toDateTime().toString(m_format);
} }
AWDateTimeFormatter *AWDateTimeFormatter::copy(const QString &_fileName, AWDateTimeFormatter *AWDateTimeFormatter::copy(const QString _fileName,
const int _number) const int _number)
{ {
qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number; qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
@ -67,7 +67,6 @@ AWDateTimeFormatter *AWDateTimeFormatter::copy(const QString &_fileName,
= new AWDateTimeFormatter(static_cast<QWidget *>(parent()), _fileName); = new AWDateTimeFormatter(static_cast<QWidget *>(parent()), _fileName);
AWAbstractFormatter::copyDefaults(item); AWAbstractFormatter::copyDefaults(item);
item->setFormat(format()); item->setFormat(format());
item->setTranslateString(translateString());
item->setNumber(_number); item->setNumber(_number);
return item; return item;
@ -80,13 +79,7 @@ QString AWDateTimeFormatter::format() const
} }
bool AWDateTimeFormatter::translateString() const void AWDateTimeFormatter::setFormat(const QString _format)
{
return m_translate;
}
void AWDateTimeFormatter::setFormat(const QString &_format)
{ {
qCDebug(LOG_LIB) << "Set format" << _format; qCDebug(LOG_LIB) << "Set format" << _format;
@ -94,51 +87,36 @@ void AWDateTimeFormatter::setFormat(const QString &_format)
} }
void AWDateTimeFormatter::setTranslateString(const bool _translate)
{
qCDebug(LOG_LIB) << "Set translate string" << _translate;
m_translate = _translate;
initLocale();
}
void AWDateTimeFormatter::readConfiguration() void AWDateTimeFormatter::readConfiguration()
{ {
AWAbstractFormatter::readConfiguration(); AWAbstractFormatter::readConfiguration();
QSettings settings(fileName(), QSettings::IniFormat); QSettings settings(fileName(), QSettings::IniFormat);
settings.beginGroup("Desktop Entry"); settings.beginGroup(QString("Desktop Entry"));
setFormat(settings.value("X-AW-Format", format()).toString()); setFormat(settings.value(QString("X-AW-Format"), format()).toString());
setTranslateString(
settings.value("X-AW-Translate", translateString()).toBool());
settings.endGroup(); settings.endGroup();
bumpApi(AW_FORMATTER_API); bumpApi(AWEFAPI);
} }
int AWDateTimeFormatter::showConfiguration(const QVariant &_args) int AWDateTimeFormatter::showConfiguration(const QVariant args)
{ {
Q_UNUSED(_args) Q_UNUSED(args)
ui->lineEdit_name->setText(name()); ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment()); ui->lineEdit_comment->setText(comment());
ui->label_typeValue->setText("DateTime"); ui->label_typeValue->setText(QString("DateTime"));
ui->lineEdit_format->setText(format()); ui->lineEdit_format->setText(format());
ui->checkBox_translate->setCheckState(translateString() ? Qt::Checked
: Qt::Unchecked);
int ret = exec(); int ret = exec();
if (ret != 1) if (ret != 1)
return ret; return ret;
setName(ui->lineEdit_name->text()); setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text()); setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text()); setStrType(ui->label_typeValue->text());
setFormat(ui->lineEdit_format->text()); setFormat(ui->lineEdit_format->text());
setTranslateString(ui->checkBox_translate->checkState() == Qt::Checked);
writeConfiguration(); writeConfiguration();
return ret; return ret;
@ -152,26 +130,18 @@ void AWDateTimeFormatter::writeConfiguration() const
QSettings settings(writtableConfig(), QSettings::IniFormat); QSettings settings(writtableConfig(), QSettings::IniFormat);
qCInfo(LOG_LIB) << "Configuration file" << settings.fileName(); qCInfo(LOG_LIB) << "Configuration file" << settings.fileName();
settings.beginGroup("Desktop Entry"); settings.beginGroup(QString("Desktop Entry"));
settings.setValue("X-AW-Format", format()); settings.setValue(QString("X-AW-Format"), format());
settings.setValue("X-AW-Translate", translateString());
settings.endGroup(); settings.endGroup();
settings.sync(); settings.sync();
} }
void AWDateTimeFormatter::initLocale()
{
m_locale = m_translate ? QLocale::system() : QLocale::c();
}
void AWDateTimeFormatter::translate() void AWDateTimeFormatter::translate()
{ {
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_type->setText(i18n("Type")); ui->label_type->setText(i18n("Type"));
ui->label_format->setText(i18n("Format")); ui->label_format->setText(i18n("Format"));
ui->checkBox_translate->setText(i18n("Translate strings"));
} }

View File

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

View File

@ -7,7 +7,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>420</width> <width>420</width>
<height>185</height> <height>157</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -104,36 +104,6 @@
</item> </item>
</layout> </layout>
</item> </item>
<item>
<layout class="QHBoxLayout" name="layout_translate">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="checkBox_translate">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Translate strings</string>
</property>
</widget>
</item>
</layout>
</item>
<item> <item>
<spacer name="verticalSpacer"> <spacer name="verticalSpacer">
<property name="orientation"> <property name="orientation">

View File

@ -27,13 +27,13 @@
#include "awdebug.h" #include "awdebug.h"
AWFloatFormatter::AWFloatFormatter(QWidget *_parent, const QString &_filePath) AWFloatFormatter::AWFloatFormatter(QWidget *parent, const QString filePath)
: AWAbstractFormatter(_parent, _filePath) : AWAbstractFormatter(parent, filePath)
, ui(new Ui::AWFloatFormatter) , ui(new Ui::AWFloatFormatter)
{ {
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty()) if (!filePath.isEmpty())
readConfiguration(); readConfiguration();
ui->setupUi(this); ui->setupUi(this);
translate(); translate();
@ -62,7 +62,7 @@ QString AWFloatFormatter::convert(const QVariant &_value) const
} }
AWFloatFormatter *AWFloatFormatter::copy(const QString &_fileName, AWFloatFormatter *AWFloatFormatter::copy(const QString _fileName,
const int _number) const int _number)
{ {
qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number; qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
@ -133,7 +133,7 @@ void AWFloatFormatter::setCount(const int _count)
} }
void AWFloatFormatter::setFillChar(const QChar &_fillChar) void AWFloatFormatter::setFillChar(const QChar _fillChar)
{ {
qCDebug(LOG_LIB) << "Set char" << _fillChar; qCDebug(LOG_LIB) << "Set char" << _fillChar;
@ -193,30 +193,34 @@ void AWFloatFormatter::readConfiguration()
QSettings settings(fileName(), QSettings::IniFormat); QSettings settings(fileName(), QSettings::IniFormat);
settings.beginGroup("Desktop Entry"); settings.beginGroup(QString("Desktop Entry"));
setCount(settings.value("X-AW-Width", count()).toInt()); setCount(settings.value(QString("X-AW-Width"), count()).toInt());
setFillChar(settings.value("X-AW-FillChar", fillChar()).toString().at(0)); setFillChar(
setForceWidth(settings.value("X-AW-ForceWidth", forceWidth()).toBool()); settings.value(QString("X-AW-FillChar"), fillChar()).toString().at(0));
setFormat(settings.value("X-AW-Format", QString(format())) setForceWidth(
settings.value(QString("X-AW-ForceWidth"), forceWidth()).toBool());
setFormat(settings.value(QString("X-AW-Format"), QString(format()))
.toString() .toString()
.at(0) .at(0)
.toLatin1()); .toLatin1());
setMultiplier(settings.value("X-AW-Multiplier", multiplier()).toDouble()); setMultiplier(
setPrecision(settings.value("X-AW-Precision", precision()).toInt()); settings.value(QString("X-AW-Multiplier"), multiplier()).toDouble());
setSummand(settings.value("X-AW-Summand", summand()).toDouble()); setPrecision(
settings.value(QString("X-AW-Precision"), precision()).toInt());
setSummand(settings.value(QString("X-AW-Summand"), summand()).toDouble());
settings.endGroup(); settings.endGroup();
bumpApi(AW_FORMATTER_API); bumpApi(AWEFAPI);
} }
int AWFloatFormatter::showConfiguration(const QVariant &_args) int AWFloatFormatter::showConfiguration(const QVariant args)
{ {
Q_UNUSED(_args) Q_UNUSED(args)
ui->lineEdit_name->setText(name()); ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment()); ui->lineEdit_comment->setText(comment());
ui->label_typeValue->setText("Float"); ui->label_typeValue->setText(QString("Float"));
ui->comboBox_format->setCurrentIndex( ui->comboBox_format->setCurrentIndex(
ui->comboBox_format->findText(QString(format()))); ui->comboBox_format->findText(QString(format())));
ui->spinBox_precision->setValue(precision()); ui->spinBox_precision->setValue(precision());
@ -232,7 +236,6 @@ int AWFloatFormatter::showConfiguration(const QVariant &_args)
return ret; return ret;
setName(ui->lineEdit_name->text()); setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text()); setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text()); setStrType(ui->label_typeValue->text());
setFormat(ui->comboBox_format->currentText().at(0).toLatin1()); setFormat(ui->comboBox_format->currentText().at(0).toLatin1());
setPrecision(ui->spinBox_precision->value()); setPrecision(ui->spinBox_precision->value());
@ -254,14 +257,14 @@ void AWFloatFormatter::writeConfiguration() const
QSettings settings(writtableConfig(), QSettings::IniFormat); QSettings settings(writtableConfig(), QSettings::IniFormat);
qCInfo(LOG_LIB) << "Configuration file" << settings.fileName(); qCInfo(LOG_LIB) << "Configuration file" << settings.fileName();
settings.beginGroup("Desktop Entry"); settings.beginGroup(QString("Desktop Entry"));
settings.setValue("X-AW-Width", count()); settings.setValue(QString("X-AW-Width"), count());
settings.setValue("X-AW-FillChar", fillChar()); settings.setValue(QString("X-AW-FillChar"), fillChar());
settings.setValue("X-AW-Format", QString(format())); settings.setValue(QString("X-AW-Format"), format());
settings.setValue("X-AW-ForceWidth", forceWidth()); settings.setValue(QString("X-AW-ForceWidth"), forceWidth());
settings.setValue("X-AW-Multiplier", multiplier()); settings.setValue(QString("X-AW-Multiplier"), multiplier());
settings.setValue("X-AW-Precision", precision()); settings.setValue(QString("X-AW-Precision"), precision());
settings.setValue("X-AW-Summand", summand()); settings.setValue(QString("X-AW-Summand"), summand());
settings.endGroup(); settings.endGroup();
settings.sync(); settings.sync();

View File

@ -38,11 +38,11 @@ class AWFloatFormatter : public AWAbstractFormatter
Q_PROPERTY(double summand READ summand WRITE setSummand) Q_PROPERTY(double summand READ summand WRITE setSummand)
public: public:
explicit AWFloatFormatter(QWidget *_parent = nullptr, explicit AWFloatFormatter(QWidget *parent,
const QString &_filePath = ""); const QString filePath = QString());
virtual ~AWFloatFormatter(); virtual ~AWFloatFormatter();
QString convert(const QVariant &_value) const; QString convert(const QVariant &_value) const;
AWFloatFormatter *copy(const QString &_fileName, const int _number); AWFloatFormatter *copy(const QString _fileName, const int _number);
// properties // properties
int count() const; int count() const;
QChar fillChar() const; QChar fillChar() const;
@ -52,7 +52,7 @@ public:
int precision() const; int precision() const;
double summand() const; double summand() const;
void setCount(const int _count); void setCount(const int _count);
void setFillChar(const QChar &_fillChar); void setFillChar(const QChar _fillChar);
void setForceWidth(const bool _forceWidth); void setForceWidth(const bool _forceWidth);
void setFormat(char _format); void setFormat(char _format);
void setMultiplier(const double _multiplier); void setMultiplier(const double _multiplier);
@ -61,7 +61,7 @@ public:
public slots: public slots:
void readConfiguration(); void readConfiguration();
int showConfiguration(const QVariant &_args); int showConfiguration(const QVariant args = QVariant());
void writeConfiguration() const; void writeConfiguration() const;
private: private:

View File

@ -1,203 +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 "awjsonformatter.h"
#include "ui_awjsonformatter.h"
#include <KI18n/KLocalizedString>
#include <QJsonDocument>
#include <QSettings>
#include "awdebug.h"
AWJsonFormatter::AWJsonFormatter(QWidget *_parent, const QString &_filePath)
: AWAbstractFormatter(_parent, _filePath)
, ui(new Ui::AWJsonFormatter)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty())
readConfiguration();
ui->setupUi(this);
translate();
}
AWJsonFormatter::~AWJsonFormatter()
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
delete ui;
}
QString AWJsonFormatter::convert(const QVariant &_value) const
{
qCDebug(LOG_LIB) << "Convert value" << _value;
// check if _value is string and parse first if required
QJsonDocument json
= _value.type() == QVariant::String
? QJsonDocument::fromJson(_value.toString().toUtf8())
: QJsonDocument::fromVariant(_value);
QVariant converted = json.toVariant();
for (auto &element : m_splittedPath)
converted = getFromJson(converted, element);
return converted.toString();
}
AWJsonFormatter *AWJsonFormatter::copy(const QString &_fileName,
const int _number)
{
qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
AWJsonFormatter *item
= new AWJsonFormatter(static_cast<QWidget *>(parent()), _fileName);
AWAbstractFormatter::copyDefaults(item);
item->setNumber(_number);
item->setPath(path());
return item;
}
QString AWJsonFormatter::path() const
{
return m_path;
}
void AWJsonFormatter::setPath(const QString &_path)
{
qCDebug(LOG_LIB) << "Path" << _path;
m_path = _path;
initPath();
}
void AWJsonFormatter::readConfiguration()
{
AWAbstractFormatter::readConfiguration();
QSettings settings(fileName(), QSettings::IniFormat);
settings.beginGroup("Desktop Entry");
setPath(settings.value("X-AW-Path", path()).toString());
settings.endGroup();
bumpApi(AW_FORMATTER_API);
}
int AWJsonFormatter::showConfiguration(const QVariant &args)
{
Q_UNUSED(args)
ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment());
ui->label_typeValue->setText("Json");
ui->lineEdit_path->setText(path());
int ret = exec();
if (ret != 1)
return ret;
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text());
setPath(ui->lineEdit_path->text());
writeConfiguration();
return ret;
}
void AWJsonFormatter::writeConfiguration() const
{
AWAbstractFormatter::writeConfiguration();
QSettings settings(writtableConfig(), QSettings::IniFormat);
qCInfo(LOG_LIB) << "Configuration file" << settings.fileName();
settings.beginGroup("Desktop Entry");
settings.setValue("X-AW-Path", path());
settings.endGroup();
settings.sync();
}
QVariant AWJsonFormatter::getFromJson(const QVariant &_value,
const QVariant &_element) const
{
qCDebug(LOG_LIB) << "Looking for element" << _element << "in" << _value;
if (_element.type() == QVariant::String) {
return getFromMap(_value, _element.toString());
} else if (_element.type() == QVariant::Int) {
return getFromList(_value, _element.toInt());
} else {
qCWarning(LOG_LIB) << "Unknown type" << _element.typeName();
return _value;
}
}
QVariant AWJsonFormatter::getFromList(const QVariant &_value,
const int _index) const
{
qCDebug(LOG_LIB) << "Looking for index" << _index << "in" << _value;
return _value.toList()[_index];
}
QVariant AWJsonFormatter::getFromMap(const QVariant &_value,
const QString &_key) const
{
qCDebug(LOG_LIB) << "Looking for key" << _key << "in" << _value;
return _value.toMap()[_key];
}
void AWJsonFormatter::initPath()
{
m_splittedPath.clear();
QStringList splittedByDot = m_path.split('.', QString::SkipEmptyParts);
for (auto &element : splittedByDot) {
bool ok;
int number = element.toInt(&ok);
m_splittedPath.append(ok ? QVariant(number) : QVariant(element));
}
}
void AWJsonFormatter::translate()
{
ui->label_name->setText(i18n("Name"));
ui->label_comment->setText(i18n("Comment"));
ui->label_type->setText(i18n("Type"));
ui->label_path->setText(i18n("Path"));
}

View File

@ -1,63 +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/ *
***************************************************************************/
#ifndef AWJSONFORMATTER_H
#define AWJSONFORMATTER_H
#include "awabstractformatter.h"
namespace Ui
{
class AWJsonFormatter;
}
class AWJsonFormatter : public AWAbstractFormatter
{
Q_OBJECT
Q_PROPERTY(QString path READ path WRITE setPath)
public:
explicit AWJsonFormatter(QWidget *_parent = nullptr,
const QString &_filePath = "");
virtual ~AWJsonFormatter();
QString convert(const QVariant &_value) const;
AWJsonFormatter *copy(const QString &_fileName, const int _number);
// properties
QString path() const;
void setPath(const QString &_path);
public slots:
void readConfiguration();
int showConfiguration(const QVariant &_args);
void writeConfiguration() const;
private:
Ui::AWJsonFormatter *ui = nullptr;
QVariant getFromJson(const QVariant &_value,
const QVariant &_element) const;
QVariant getFromList(const QVariant &_value, const int _index) const;
QVariant getFromMap(const QVariant &_value, const QString &_key) const;
void initPath();
void translate();
// properties
QString m_path;
QVariantList m_splittedPath;
};
#endif /* AWJSONFORMATTER_H */

View File

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

View File

@ -26,13 +26,13 @@
#include "awdebug.h" #include "awdebug.h"
AWListFormatter::AWListFormatter(QWidget *_parent, const QString &_filePath) AWListFormatter::AWListFormatter(QWidget *parent, const QString filePath)
: AWAbstractFormatter(_parent, _filePath) : AWAbstractFormatter(parent, filePath)
, ui(new Ui::AWListFormatter) , ui(new Ui::AWListFormatter)
{ {
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty()) if (!filePath.isEmpty())
readConfiguration(); readConfiguration();
ui->setupUi(this); ui->setupUi(this);
translate(); translate();
@ -59,7 +59,7 @@ QString AWListFormatter::convert(const QVariant &_value) const
} }
AWListFormatter *AWListFormatter::copy(const QString &_fileName, AWListFormatter *AWListFormatter::copy(const QString _fileName,
const int _number) const int _number)
{ {
qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number; qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
@ -94,7 +94,7 @@ QString AWListFormatter::separator() const
} }
void AWListFormatter::setFilter(const QString &_filter) void AWListFormatter::setFilter(const QString _filter)
{ {
qCDebug(LOG_LIB) << "Filter" << _filter; qCDebug(LOG_LIB) << "Filter" << _filter;
@ -103,7 +103,7 @@ void AWListFormatter::setFilter(const QString &_filter)
} }
void AWListFormatter::setSeparator(const QString &_separator) void AWListFormatter::setSeparator(const QString _separator)
{ {
qCDebug(LOG_LIB) << "Separtor" << _separator; qCDebug(LOG_LIB) << "Separtor" << _separator;
@ -125,23 +125,24 @@ void AWListFormatter::readConfiguration()
QSettings settings(fileName(), QSettings::IniFormat); QSettings settings(fileName(), QSettings::IniFormat);
settings.beginGroup("Desktop Entry"); settings.beginGroup(QString("Desktop Entry"));
setFilter(settings.value("X-AW-Filter", filter()).toString()); setFilter(settings.value(QString("X-AW-Filter"), filter()).toString());
setSeparator(settings.value("X-AW-Separator", separator()).toString()); setSeparator(
setSorted(settings.value("X-AW-Sort", isSorted()).toBool()); settings.value(QString("X-AW-Separator"), separator()).toString());
setSorted(settings.value(QString("X-AW-Sort"), isSorted()).toBool());
settings.endGroup(); settings.endGroup();
bumpApi(AW_FORMATTER_API); bumpApi(AWEFAPI);
} }
int AWListFormatter::showConfiguration(const QVariant &_args) int AWListFormatter::showConfiguration(const QVariant args)
{ {
Q_UNUSED(_args) Q_UNUSED(args)
ui->lineEdit_name->setText(name()); ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment()); ui->lineEdit_comment->setText(comment());
ui->label_typeValue->setText("List"); ui->label_typeValue->setText(QString("NoFormat"));
ui->lineEdit_filter->setText(filter()); ui->lineEdit_filter->setText(filter());
ui->lineEdit_separator->setText(separator()); ui->lineEdit_separator->setText(separator());
ui->checkBox_sorted->setCheckState(isSorted() ? Qt::Checked ui->checkBox_sorted->setCheckState(isSorted() ? Qt::Checked
@ -152,7 +153,6 @@ int AWListFormatter::showConfiguration(const QVariant &_args)
return ret; return ret;
setName(ui->lineEdit_name->text()); setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text()); setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text()); setStrType(ui->label_typeValue->text());
setFilter(ui->lineEdit_filter->text()); setFilter(ui->lineEdit_filter->text());
setSeparator(ui->lineEdit_separator->text()); setSeparator(ui->lineEdit_separator->text());
@ -170,10 +170,10 @@ void AWListFormatter::writeConfiguration() const
QSettings settings(writtableConfig(), QSettings::IniFormat); QSettings settings(writtableConfig(), QSettings::IniFormat);
qCInfo(LOG_LIB) << "Configuration file" << settings.fileName(); qCInfo(LOG_LIB) << "Configuration file" << settings.fileName();
settings.beginGroup("Desktop Entry"); settings.beginGroup(QString("Desktop Entry"));
settings.setValue("X-AW-Filter", filter()); settings.setValue(QString("X-AW-Filter"), filter());
settings.setValue("X-AW-Separator", separator()); settings.setValue(QString("X-AW-Separator"), separator());
settings.setValue("X-AW-Sort", isSorted()); settings.setValue(QString("X-AW-Sort"), isSorted());
settings.endGroup(); settings.endGroup();
settings.sync(); settings.sync();

View File

@ -34,30 +34,30 @@ class AWListFormatter : public AWAbstractFormatter
Q_PROPERTY(bool sorted READ isSorted WRITE setSorted) Q_PROPERTY(bool sorted READ isSorted WRITE setSorted)
public: public:
explicit AWListFormatter(QWidget *_parent = nullptr, explicit AWListFormatter(QWidget *parent,
const QString &_filePath = ""); const QString filePath = QString());
virtual ~AWListFormatter(); virtual ~AWListFormatter();
QString convert(const QVariant &_value) const; QString convert(const QVariant &_value) const;
AWListFormatter *copy(const QString &_fileName, const int _number); AWListFormatter *copy(const QString _fileName, const int _number);
// properties // properties
QString filter() const; QString filter() const;
bool isSorted() const; bool isSorted() const;
QString separator() const; QString separator() const;
void setFilter(const QString &_filter); void setFilter(const QString _filter);
void setSeparator(const QString &_separator); void setSeparator(const QString _separator);
void setSorted(const bool _sorted); void setSorted(const bool _sorted);
public slots: public slots:
void readConfiguration(); void readConfiguration();
int showConfiguration(const QVariant &_args); int showConfiguration(const QVariant args = QVariant());
void writeConfiguration() const; void writeConfiguration() const;
private: private:
Ui::AWListFormatter *ui = nullptr; Ui::AWListFormatter *ui = nullptr;
void translate(); void translate();
// properties // properties
QString m_filter = ""; QString m_filter = QString();
QString m_separator = ""; QString m_separator = QString();
bool m_sorted = false; bool m_sorted = false;
QRegExp m_regex; QRegExp m_regex;
}; };

View File

@ -24,13 +24,13 @@
#include "awdebug.h" #include "awdebug.h"
AWNoFormatter::AWNoFormatter(QWidget *_parent, const QString &_filePath) AWNoFormatter::AWNoFormatter(QWidget *parent, const QString filePath)
: AWAbstractFormatter(_parent, _filePath) : AWAbstractFormatter(parent, filePath)
, ui(new Ui::AWNoFormatter) , ui(new Ui::AWNoFormatter)
{ {
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty()) if (!filePath.isEmpty())
readConfiguration(); readConfiguration();
ui->setupUi(this); ui->setupUi(this);
translate(); translate();
@ -53,7 +53,7 @@ QString AWNoFormatter::convert(const QVariant &_value) const
} }
AWNoFormatter *AWNoFormatter::copy(const QString &_fileName, const int _number) AWNoFormatter *AWNoFormatter::copy(const QString _fileName, const int _number)
{ {
qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number; qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
@ -66,20 +66,19 @@ AWNoFormatter *AWNoFormatter::copy(const QString &_fileName, const int _number)
} }
int AWNoFormatter::showConfiguration(const QVariant &_args) int AWNoFormatter::showConfiguration(const QVariant args)
{ {
Q_UNUSED(_args) Q_UNUSED(args)
ui->lineEdit_name->setText(name()); ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment()); ui->lineEdit_comment->setText(comment());
ui->label_typeValue->setText("NoFormat"); ui->label_typeValue->setText(QString("NoFormat"));
int ret = exec(); int ret = exec();
if (ret != 1) if (ret != 1)
return ret; return ret;
setName(ui->lineEdit_name->text()); setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text()); setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text()); setStrType(ui->label_typeValue->text());
writeConfiguration(); writeConfiguration();

View File

@ -31,14 +31,13 @@ class AWNoFormatter : public AWAbstractFormatter
Q_OBJECT Q_OBJECT
public: public:
explicit AWNoFormatter(QWidget *_parent = nullptr, explicit AWNoFormatter(QWidget *parent, const QString filePath = QString());
const QString &_filePath = "");
virtual ~AWNoFormatter(); virtual ~AWNoFormatter();
QString convert(const QVariant &_value) const; QString convert(const QVariant &_value) const;
AWNoFormatter *copy(const QString &_fileName, const int _number); AWNoFormatter *copy(const QString _fileName, const int _number);
public slots: public slots:
int showConfiguration(const QVariant &_args); int showConfiguration(const QVariant args = QVariant());
private: private:
Ui::AWNoFormatter *ui = nullptr; Ui::AWNoFormatter *ui = nullptr;

View File

@ -28,13 +28,13 @@
#include "awdebug.h" #include "awdebug.h"
AWScriptFormatter::AWScriptFormatter(QWidget *_parent, const QString &_filePath) AWScriptFormatter::AWScriptFormatter(QWidget *parent, const QString filePath)
: AWAbstractFormatter(_parent, _filePath) : AWAbstractFormatter(parent, filePath)
, ui(new Ui::AWScriptFormatter) , ui(new Ui::AWScriptFormatter)
{ {
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty()) if (!filePath.isEmpty())
readConfiguration(); readConfiguration();
ui->setupUi(this); ui->setupUi(this);
translate(); translate();
@ -63,14 +63,14 @@ QString AWScriptFormatter::convert(const QVariant &_value) const
qCWarning(LOG_LIB) << "Uncaught exception at line" qCWarning(LOG_LIB) << "Uncaught exception at line"
<< result.property("lineNumber").toInt() << ":" << result.property("lineNumber").toInt() << ":"
<< result.toString(); << result.toString();
return ""; return QString();
} else { } else {
return result.toString(); return result.toString();
} }
} }
AWScriptFormatter *AWScriptFormatter::copy(const QString &_fileName, AWScriptFormatter *AWScriptFormatter::copy(const QString _fileName,
const int _number) const int _number)
{ {
qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number; qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
@ -120,7 +120,7 @@ void AWScriptFormatter::setAppendCode(const bool _appendCode)
} }
void AWScriptFormatter::setCode(const QString &_code) void AWScriptFormatter::setCode(const QString _code)
{ {
qCDebug(LOG_LIB) << "Set code" << _code; qCDebug(LOG_LIB) << "Set code" << _code;
@ -144,23 +144,25 @@ void AWScriptFormatter::readConfiguration()
QSettings settings(fileName(), QSettings::IniFormat); QSettings settings(fileName(), QSettings::IniFormat);
settings.beginGroup("Desktop Entry"); settings.beginGroup(QString("Desktop Entry"));
setAppendCode(settings.value("X-AW-AppendCode", appendCode()).toBool()); setAppendCode(
setCode(settings.value("X-AW-Code", code()).toString()); settings.value(QString("X-AW-AppendCode"), appendCode()).toBool());
setHasReturn(settings.value("X-AW-HasReturn", hasReturn()).toBool()); setCode(settings.value(QString("X-AW-Code"), code()).toString());
setHasReturn(
settings.value(QString("X-AW-HasReturn"), hasReturn()).toBool());
settings.endGroup(); settings.endGroup();
bumpApi(AW_FORMATTER_API); bumpApi(AWEFAPI);
} }
int AWScriptFormatter::showConfiguration(const QVariant &_args) int AWScriptFormatter::showConfiguration(const QVariant args)
{ {
Q_UNUSED(_args) Q_UNUSED(args)
ui->lineEdit_name->setText(name()); ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment()); ui->lineEdit_comment->setText(comment());
ui->label_typeValue->setText("Script"); ui->label_typeValue->setText(QString("Script"));
ui->checkBox_appendCode->setCheckState(appendCode() ? Qt::Checked ui->checkBox_appendCode->setCheckState(appendCode() ? Qt::Checked
: Qt::Unchecked); : Qt::Unchecked);
ui->checkBox_hasReturn->setCheckState(hasReturn() ? Qt::Checked ui->checkBox_hasReturn->setCheckState(hasReturn() ? Qt::Checked
@ -172,7 +174,6 @@ int AWScriptFormatter::showConfiguration(const QVariant &_args)
return ret; return ret;
setName(ui->lineEdit_name->text()); setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text()); setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text()); setStrType(ui->label_typeValue->text());
setAppendCode(ui->checkBox_appendCode->checkState() == Qt::Checked); setAppendCode(ui->checkBox_appendCode->checkState() == Qt::Checked);
setHasReturn(ui->checkBox_hasReturn->checkState() == Qt::Checked); setHasReturn(ui->checkBox_hasReturn->checkState() == Qt::Checked);
@ -191,10 +192,10 @@ void AWScriptFormatter::writeConfiguration() const
QSettings settings(writtableConfig(), QSettings::IniFormat); QSettings settings(writtableConfig(), QSettings::IniFormat);
qCInfo(LOG_LIB) << "Configuration file" << settings.fileName(); qCInfo(LOG_LIB) << "Configuration file" << settings.fileName();
settings.beginGroup("Desktop Entry"); settings.beginGroup(QString("Desktop Entry"));
settings.setValue("X-AW-AppendCode", appendCode()); settings.setValue(QString("X-AW-AppendCode"), appendCode());
settings.setValue("X-AW-Code", code()); settings.setValue(QString("X-AW-Code"), code());
settings.setValue("X-AW-HasReturn", hasReturn()); settings.setValue(QString("X-AW-HasReturn"), hasReturn());
settings.endGroup(); settings.endGroup();
settings.sync(); settings.sync();
@ -205,9 +206,10 @@ void AWScriptFormatter::initProgram()
{ {
// init JS code // init JS code
if (appendCode()) if (appendCode())
m_program = QString("(function(value) { %1%2 })") m_program
.arg(code()) = QString("(function(value) { %1%2 })")
.arg(hasReturn() ? "" : "; return output;"); .arg(code())
.arg(hasReturn() ? QString("") : QString("; return output;"));
else else
m_program = code(); m_program = code();

View File

@ -35,23 +35,23 @@ class AWScriptFormatter : public AWAbstractFormatter
Q_PROPERTY(QString program READ program) Q_PROPERTY(QString program READ program)
public: public:
explicit AWScriptFormatter(QWidget *_parent = nullptr, explicit AWScriptFormatter(QWidget *parent,
const QString &_filePath = ""); const QString filePath = QString());
virtual ~AWScriptFormatter(); virtual ~AWScriptFormatter();
QString convert(const QVariant &_value) const; QString convert(const QVariant &_value) const;
AWScriptFormatter *copy(const QString &_fileName, const int _number); AWScriptFormatter *copy(const QString _fileName, const int _number);
// properties // properties
bool appendCode() const; bool appendCode() const;
QString code() const; QString code() const;
bool hasReturn() const; bool hasReturn() const;
QString program() const; QString program() const;
void setAppendCode(const bool _appendCode); void setAppendCode(const bool _appendCode);
void setCode(const QString &_code); void setCode(const QString _code);
void setHasReturn(const bool _hasReturn); void setHasReturn(const bool _hasReturn);
public slots: public slots:
void readConfiguration(); void readConfiguration();
int showConfiguration(const QVariant &_args); int showConfiguration(const QVariant args = QVariant());
void writeConfiguration() const; void writeConfiguration() const;
private: private:
@ -60,7 +60,7 @@ private:
void translate(); void translate();
// properties // properties
bool m_appendCode = true; bool m_appendCode = true;
QString m_code = ""; QString m_code = QString();
bool m_hasReturn = false; bool m_hasReturn = false;
QString m_program; QString m_program;
}; };

View File

@ -27,13 +27,13 @@
#include "awdebug.h" #include "awdebug.h"
AWStringFormatter::AWStringFormatter(QWidget *_parent, const QString &_filePath) AWStringFormatter::AWStringFormatter(QWidget *parent, const QString filePath)
: AWAbstractFormatter(_parent, _filePath) : AWAbstractFormatter(parent, filePath)
, ui(new Ui::AWStringFormatter) , ui(new Ui::AWStringFormatter)
{ {
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty()) if (!filePath.isEmpty())
readConfiguration(); readConfiguration();
ui->setupUi(this); ui->setupUi(this);
translate(); translate();
@ -60,7 +60,7 @@ QString AWStringFormatter::convert(const QVariant &_value) const
} }
AWStringFormatter *AWStringFormatter::copy(const QString &_fileName, AWStringFormatter *AWStringFormatter::copy(const QString _fileName,
const int _number) const int _number)
{ {
qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number; qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
@ -103,7 +103,7 @@ void AWStringFormatter::setCount(const int _count)
} }
void AWStringFormatter::setFillChar(const QChar &_fillChar) void AWStringFormatter::setFillChar(const QChar _fillChar)
{ {
qCDebug(LOG_LIB) << "Set char" << _fillChar; qCDebug(LOG_LIB) << "Set char" << _fillChar;
@ -125,23 +125,25 @@ void AWStringFormatter::readConfiguration()
QSettings settings(fileName(), QSettings::IniFormat); QSettings settings(fileName(), QSettings::IniFormat);
settings.beginGroup("Desktop Entry"); settings.beginGroup(QString("Desktop Entry"));
setCount(settings.value("X-AW-Width", count()).toInt()); setCount(settings.value(QString("X-AW-Width"), count()).toInt());
setFillChar(settings.value("X-AW-FillChar", fillChar()).toString().at(0)); setFillChar(
setForceWidth(settings.value("X-AW-ForceWidth", forceWidth()).toBool()); settings.value(QString("X-AW-FillChar"), fillChar()).toString().at(0));
setForceWidth(
settings.value(QString("X-AW-ForceWidth"), forceWidth()).toBool());
settings.endGroup(); settings.endGroup();
bumpApi(AW_FORMATTER_API); bumpApi(AWEFAPI);
} }
int AWStringFormatter::showConfiguration(const QVariant &_args) int AWStringFormatter::showConfiguration(const QVariant args)
{ {
Q_UNUSED(_args) Q_UNUSED(args)
ui->lineEdit_name->setText(name()); ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment()); ui->lineEdit_comment->setText(comment());
ui->label_typeValue->setText("String"); ui->label_typeValue->setText(QString("String"));
ui->spinBox_width->setValue(count()); ui->spinBox_width->setValue(count());
ui->lineEdit_fill->setText(QString(fillChar())); ui->lineEdit_fill->setText(QString(fillChar()));
ui->checkBox_forceWidth->setCheckState(forceWidth() ? Qt::Checked ui->checkBox_forceWidth->setCheckState(forceWidth() ? Qt::Checked
@ -152,7 +154,6 @@ int AWStringFormatter::showConfiguration(const QVariant &_args)
return ret; return ret;
setName(ui->lineEdit_name->text()); setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text()); setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text()); setStrType(ui->label_typeValue->text());
setCount(ui->spinBox_width->value()); setCount(ui->spinBox_width->value());
setFillChar(ui->lineEdit_fill->text().at(0)); setFillChar(ui->lineEdit_fill->text().at(0));
@ -170,10 +171,10 @@ void AWStringFormatter::writeConfiguration() const
QSettings settings(writtableConfig(), QSettings::IniFormat); QSettings settings(writtableConfig(), QSettings::IniFormat);
qCInfo(LOG_LIB) << "Configuration file" << settings.fileName(); qCInfo(LOG_LIB) << "Configuration file" << settings.fileName();
settings.beginGroup("Desktop Entry"); settings.beginGroup(QString("Desktop Entry"));
settings.setValue("X-AW-Width", count()); settings.setValue(QString("X-AW-Width"), count());
settings.setValue("X-AW-FillChar", fillChar()); settings.setValue(QString("X-AW-FillChar"), fillChar());
settings.setValue("X-AW-ForceWidth", forceWidth()); settings.setValue(QString("X-AW-ForceWidth"), forceWidth());
settings.endGroup(); settings.endGroup();
settings.sync(); settings.sync();

View File

@ -34,22 +34,22 @@ class AWStringFormatter : public AWAbstractFormatter
Q_PROPERTY(bool forceWidth READ forceWidth WRITE setForceWidth) Q_PROPERTY(bool forceWidth READ forceWidth WRITE setForceWidth)
public: public:
explicit AWStringFormatter(QWidget *_parent = nullptr, explicit AWStringFormatter(QWidget *parent,
const QString &_filePath = ""); const QString filePath = QString());
virtual ~AWStringFormatter(); virtual ~AWStringFormatter();
QString convert(const QVariant &_value) const; QString convert(const QVariant &_value) const;
AWStringFormatter *copy(const QString &_fileName, const int _number); AWStringFormatter *copy(const QString _fileName, const int _number);
// properties // properties
int count() const; int count() const;
QChar fillChar() const; QChar fillChar() const;
bool forceWidth() const; bool forceWidth() const;
void setCount(const int _count); void setCount(const int _count);
void setFillChar(const QChar &_fillChar); void setFillChar(const QChar _fillChar);
void setForceWidth(const bool _forceWidth); void setForceWidth(const bool _forceWidth);
public slots: public slots:
void readConfiguration(); void readConfiguration();
int showConfiguration(const QVariant &_args); int showConfiguration(const QVariant args = QVariant());
void writeConfiguration() const; void writeConfiguration() const;
private: private:

View File

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

View File

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

View File

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

View File

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

View File

@ -31,15 +31,15 @@
template <class T> class ExtItemAggregator : public AbstractExtItemAggregator template <class T> class ExtItemAggregator : public AbstractExtItemAggregator
{ {
public: public:
explicit ExtItemAggregator(QWidget *_parent, const QString &_type) explicit ExtItemAggregator(QWidget *parent, const QString type)
: AbstractExtItemAggregator(_parent, _type) : AbstractExtItemAggregator(parent, type)
{ {
qSetMessagePattern(AWDebug::LOG_FORMAT); qSetMessagePattern(LOG_FORMAT);
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
for (auto &metadata : AWDebug::getBuildData()) for (auto metadata : getBuildData())
qCDebug(LOG_LIB) << metadata; qCDebug(LOG_LIB) << metadata;
qCDebug(LOG_LIB) << "Type" << _type; qCDebug(LOG_LIB) << "Type" << type;
initItems(); initItems();
}; };
@ -61,21 +61,12 @@ public:
qCInfo(LOG_LIB) << "Dialog returns" << ret; qCInfo(LOG_LIB) << "Dialog returns" << ret;
}; };
void initSockets() T *itemByTag(const QString _tag, const QString _type) const
{
// HACK as soon as per one widget instance we have two objects each of
// them will try to control socket, whereas actually only one of them
// should be owner of the socket
for (auto &item : m_items)
item->initSocket();
}
T *itemByTag(const QString &_tag, const QString &_type) const
{ {
qCDebug(LOG_LIB) << "Tag" << _tag << "with used type" << _type; qCDebug(LOG_LIB) << "Tag" << _tag << "with used type" << _type;
T *found = nullptr; T *found = nullptr;
for (auto &item : m_items) { for (auto item : m_items) {
if (item->tag(_type) != _tag) if (item->tag(_type) != _tag)
continue; continue;
found = static_cast<T *>(item); found = static_cast<T *>(item);
@ -92,7 +83,7 @@ public:
qCDebug(LOG_LIB) << "Number" << _number; qCDebug(LOG_LIB) << "Number" << _number;
T *found = nullptr; T *found = nullptr;
for (auto &item : m_items) { for (auto item : m_items) {
if (item->number() != _number) if (item->number() != _number)
continue; continue;
found = static_cast<T *>(item); found = static_cast<T *>(item);
@ -129,10 +120,11 @@ private:
QStandardPaths::LocateDirectory); QStandardPaths::LocateDirectory);
QStringList names; QStringList names;
QList<AbstractExtItem *> items; QList<AbstractExtItem *> items;
for (auto &dir : dirs) { for (auto dir : dirs) {
QStringList files = QDir(dir).entryList(QDir::Files, QDir::Name); QStringList files = QDir(dir).entryList(QDir::Files, QDir::Name);
for (auto &file : files) { for (auto file : files) {
if ((!file.endsWith(".desktop")) || (names.contains(file))) if ((!file.endsWith(QString(".desktop")))
|| (names.contains(file)))
continue; continue;
qCInfo(LOG_LIB) << "Found file" << file << "in" << dir; qCInfo(LOG_LIB) << "Found file" << file << "in" << dir;
names.append(file); names.append(file);
@ -155,7 +147,7 @@ private:
m_activeItems.clear(); m_activeItems.clear();
m_items = getItems(); m_items = getItems();
for (auto &item : m_items) { for (auto item : m_items) {
if (!item->isActive()) if (!item->isActive())
continue; continue;
m_activeItems.append(static_cast<T *>(item)); m_activeItems.append(static_cast<T *>(item));

View File

@ -1,216 +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 "extnetworkrequest.h"
#include "ui_extnetworkrequest.h"
#include <KI18n/KLocalizedString>
#include <QDir>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QSettings>
#include <QTextCodec>
#include <qreplytimeout/qreplytimeout.h>
#include "awdebug.h"
ExtNetworkRequest::ExtNetworkRequest(QWidget *_parent, const QString &_filePath)
: AbstractExtItem(_parent, _filePath)
, ui(new Ui::ExtNetworkRequest)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty())
readConfiguration();
ui->setupUi(this);
translate();
m_values[tag("response")] = "";
// HACK declare as child of nullptr to avoid crash with plasmawindowed
// in the destructor
m_manager = new QNetworkAccessManager(nullptr);
connect(m_manager, SIGNAL(finished(QNetworkReply *)), this,
SLOT(networkReplyReceived(QNetworkReply *)));
connect(this, SIGNAL(requestDataUpdate()), this, SLOT(sendRequest()));
}
ExtNetworkRequest::~ExtNetworkRequest()
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
disconnect(m_manager, SIGNAL(finished(QNetworkReply *)), this,
SLOT(networkReplyReceived(QNetworkReply *)));
disconnect(this, SIGNAL(requestDataUpdate()), this, SLOT(sendRequest()));
m_manager->deleteLater();
delete ui;
}
ExtNetworkRequest *ExtNetworkRequest::copy(const QString &_fileName,
const int _number)
{
qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
ExtNetworkRequest *item
= new ExtNetworkRequest(static_cast<QWidget *>(parent()), _fileName);
copyDefaults(item);
item->setNumber(_number);
item->setStringUrl(stringUrl());
return item;
}
QString ExtNetworkRequest::stringUrl() const
{
return m_stringUrl;
}
QString ExtNetworkRequest::uniq() const
{
return m_url.toString();
}
void ExtNetworkRequest::setStringUrl(const QString &_url)
{
qCDebug(LOG_LIB) << "Url" << _url;
m_stringUrl = _url;
initUrl();
}
void ExtNetworkRequest::readConfiguration()
{
AbstractExtItem::readConfiguration();
QSettings settings(fileName(), QSettings::IniFormat);
settings.beginGroup("Desktop Entry");
setStringUrl(settings.value("X-AW-Url", stringUrl()).toString());
settings.endGroup();
bumpApi(AW_EXTNETREQUEST_API);
}
QVariantHash ExtNetworkRequest::run()
{
if (m_isRunning)
return m_values;
startTimer();
return m_values;
}
int ExtNetworkRequest::showConfiguration(const QVariant &_args)
{
Q_UNUSED(_args)
ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment());
ui->label_numberValue->setText(QString("%1").arg(number()));
ui->lineEdit_url->setText(stringUrl());
ui->checkBox_active->setCheckState(isActive() ? Qt::Checked
: Qt::Unchecked);
ui->lineEdit_schedule->setText(cron());
ui->lineEdit_socket->setText(socket());
ui->spinBox_interval->setValue(interval());
int ret = exec();
if (ret != 1)
return ret;
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setNumber(ui->label_numberValue->text().toInt());
setApiVersion(AW_EXTNETREQUEST_API);
setStringUrl(ui->lineEdit_url->text());
setActive(ui->checkBox_active->checkState() == Qt::Checked);
setCron(ui->lineEdit_schedule->text());
setSocket(ui->lineEdit_socket->text());
setInterval(ui->spinBox_interval->value());
writeConfiguration();
return ret;
}
void ExtNetworkRequest::writeConfiguration() const
{
AbstractExtItem::writeConfiguration();
QSettings settings(writtableConfig(), QSettings::IniFormat);
qCInfo(LOG_LIB) << "Configuration file" << settings.fileName();
settings.beginGroup("Desktop Entry");
settings.setValue("X-AW-Url", stringUrl());
settings.endGroup();
settings.sync();
}
void ExtNetworkRequest::networkReplyReceived(QNetworkReply *_reply)
{
if (_reply->error() != QNetworkReply::NoError) {
qCWarning(LOG_AW) << "An error occurs" << _reply->error()
<< "with message" << _reply->errorString();
return;
}
m_isRunning = false;
m_values[tag("response")]
= QTextCodec::codecForMib(106)->toUnicode(_reply->readAll()).trimmed();
emit(dataReceived(m_values));
}
void ExtNetworkRequest::sendRequest()
{
m_isRunning = true;
QNetworkReply *reply = m_manager->get(QNetworkRequest(m_url));
new QReplyTimeout(reply, REQUEST_TIMEOUT);
}
void ExtNetworkRequest::initUrl()
{
m_url = QUrl(m_stringUrl);
}
void ExtNetworkRequest::translate()
{
ui->label_name->setText(i18n("Name"));
ui->label_comment->setText(i18n("Comment"));
ui->label_number->setText(i18n("Tag"));
ui->label_url->setText(i18n("URL"));
ui->checkBox_active->setText(i18n("Active"));
ui->label_schedule->setText(i18n("Schedule"));
ui->label_socket->setText(i18n("Socket"));
ui->label_interval->setText(i18n("Interval"));
}

View File

@ -1,71 +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/ *
***************************************************************************/
#ifndef EXTNETWORKREQUEST_H
#define EXTNETWORKREQUEST_H
#include <QNetworkReply>
#include "abstractextitem.h"
namespace Ui
{
class ExtNetworkRequest;
}
class ExtNetworkRequest : public AbstractExtItem
{
Q_OBJECT
Q_PROPERTY(QString stringUrl READ stringUrl WRITE setStringUrl)
public:
explicit ExtNetworkRequest(QWidget *_parent = nullptr,
const QString &_filePath = "");
virtual ~ExtNetworkRequest();
ExtNetworkRequest *copy(const QString &_fileName, const int _number);
// get methods
QString stringUrl() const;
QString uniq() const;
// set methods
void setStringUrl(const QString &_url);
public slots:
void readConfiguration();
QVariantHash run();
int showConfiguration(const QVariant &_args);
void writeConfiguration() const;
private slots:
void networkReplyReceived(QNetworkReply *_reply);
void sendRequest();
private:
QNetworkAccessManager *m_manager = nullptr;
QUrl m_url;
bool m_isRunning = false;
Ui::ExtNetworkRequest *ui = nullptr;
void initUrl();
void translate();
// properties
QString m_stringUrl = "https://httpbin.org/get";
// values
QVariantHash m_values;
};
#endif /* EXTNETWORKREQUEST_H */

View File

@ -1,282 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ExtNetworkRequest</class>
<widget class="QDialog" name="ExtNetworkRequest">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>420</width>
<height>320</height>
</rect>
</property>
<property name="windowTitle">
<string>Configuration</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="layout_name">
<item>
<widget class="QLabel" name="label_name">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Name</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_name"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_comment">
<item>
<widget class="QLabel" name="label_comment">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Comment</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_comment"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_number">
<item>
<widget class="QLabel" name="label_number">
<property name="text">
<string>Tag</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_numberValue">
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_url">
<item>
<widget class="QLabel" name="label_url">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>URL</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_url"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_active">
<item>
<spacer name="spacer_active">
<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_active">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Active</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QGroupBox" name="groupBox_update">
<property name="title">
<string>Update</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QHBoxLayout" name="layout_interval">
<item>
<widget class="QLabel" name="label_interval">
<property name="text">
<string>Interval</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="spinBox_interval">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>10000</number>
</property>
<property name="singleStep">
<number>500</number>
</property>
<property name="value">
<number>3600</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_schedule">
<item>
<widget class="QLabel" name="label_schedule">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Schedule</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_schedule"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_socket">
<item>
<widget class="QLabel" name="label_socket">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Socket</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_socket"/>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>ExtNetworkRequest</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>ExtNetworkRequest</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -33,34 +33,32 @@
#include "awdebug.h" #include "awdebug.h"
ExtQuotes::ExtQuotes(QWidget *_parent, const QString &_filePath) ExtQuotes::ExtQuotes(QWidget *parent, const QString filePath)
: AbstractExtItem(_parent, _filePath) : AbstractExtItem(parent, filePath)
, ui(new Ui::ExtQuotes) , ui(new Ui::ExtQuotes)
{ {
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty()) if (!filePath.isEmpty())
readConfiguration(); readConfiguration();
ui->setupUi(this); ui->setupUi(this);
translate(); translate();
m_values[tag("ask")] = 0.0; values[tag(QString("ask"))] = 0.0;
m_values[tag("askchg")] = 0.0; values[tag(QString("askchg"))] = 0.0;
m_values[tag("percaskchg")] = 0.0; values[tag(QString("percaskchg"))] = 0.0;
m_values[tag("bid")] = 0.0; values[tag(QString("bid"))] = 0.0;
m_values[tag("bidchg")] = 0.0; values[tag(QString("bidchg"))] = 0.0;
m_values[tag("percbidchg")] = 0.0; values[tag(QString("percbidchg"))] = 0.0;
m_values[tag("price")] = 0.0; values[tag(QString("price"))] = 0.0;
m_values[tag("pricechg")] = 0.0; values[tag(QString("pricechg"))] = 0.0;
m_values[tag("percpricechg")] = 0.0; values[tag(QString("percpricechg"))] = 0.0;
// HACK declare as child of nullptr to avoid crash with plasmawindowed // HACK declare as child of nullptr to avoid crash with plasmawindowed
// in the destructor // in the destructor
m_manager = new QNetworkAccessManager(nullptr); m_manager = new QNetworkAccessManager(nullptr);
connect(m_manager, SIGNAL(finished(QNetworkReply *)), this, connect(m_manager, SIGNAL(finished(QNetworkReply *)), this,
SLOT(quotesReplyReceived(QNetworkReply *))); SLOT(quotesReplyReceived(QNetworkReply *)));
connect(this, SIGNAL(requestDataUpdate()), this, SLOT(sendRequest()));
} }
@ -70,14 +68,13 @@ ExtQuotes::~ExtQuotes()
disconnect(m_manager, SIGNAL(finished(QNetworkReply *)), this, disconnect(m_manager, SIGNAL(finished(QNetworkReply *)), this,
SLOT(quotesReplyReceived(QNetworkReply *))); SLOT(quotesReplyReceived(QNetworkReply *)));
disconnect(this, SIGNAL(requestDataUpdate()), this, SLOT(sendRequest()));
m_manager->deleteLater(); m_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) << "File" << _fileName << "with number" << _number; qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
@ -103,7 +100,7 @@ QString ExtQuotes::uniq() const
} }
void ExtQuotes::setTicker(const QString &_ticker) void ExtQuotes::setTicker(const QString _ticker)
{ {
qCDebug(LOG_LIB) << "Ticker" << _ticker; qCDebug(LOG_LIB) << "Ticker" << _ticker;
@ -118,27 +115,46 @@ void ExtQuotes::readConfiguration()
QSettings settings(fileName(), QSettings::IniFormat); QSettings settings(fileName(), QSettings::IniFormat);
settings.beginGroup("Desktop Entry"); settings.beginGroup(QString("Desktop Entry"));
setTicker(settings.value("X-AW-Ticker", ticker()).toString()); setTicker(settings.value(QString("X-AW-Ticker"), ticker()).toString());
settings.endGroup(); settings.endGroup();
bumpApi(AW_EXTQUOTES_API); // update for current API
if ((apiVersion() > 0) && (apiVersion() < AWEQAPI)) {
qCWarning(LOG_LIB) << "Bump API version from" << apiVersion() << "to"
<< AWEQAPI;
setApiVersion(AWEQAPI);
writeConfiguration();
}
bumpApi(AWEQAPI);
} }
QVariantHash ExtQuotes::run() QVariantHash ExtQuotes::run()
{ {
if (m_isRunning) if ((!isActive()) || (isRunning))
return m_values; return values;
startTimer();
return m_values; if (times == 1) {
qCInfo(LOG_LIB) << "Send request";
isRunning = true;
QNetworkReply *reply = m_manager->get(QNetworkRequest(m_url));
new QReplyTimeout(reply, REQUEST_TIMEOUT);
}
// update value
if (times >= interval())
times = 0;
times++;
return values;
} }
int ExtQuotes::showConfiguration(const QVariant &_args) int ExtQuotes::showConfiguration(const QVariant args)
{ {
Q_UNUSED(_args) Q_UNUSED(args)
ui->lineEdit_name->setText(name()); ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment()); ui->lineEdit_comment->setText(comment());
@ -146,8 +162,6 @@ int ExtQuotes::showConfiguration(const QVariant &_args)
ui->lineEdit_ticker->setText(ticker()); ui->lineEdit_ticker->setText(ticker());
ui->checkBox_active->setCheckState(isActive() ? Qt::Checked ui->checkBox_active->setCheckState(isActive() ? Qt::Checked
: Qt::Unchecked); : Qt::Unchecked);
ui->lineEdit_schedule->setText(cron());
ui->lineEdit_socket->setText(socket());
ui->spinBox_interval->setValue(interval()); ui->spinBox_interval->setValue(interval());
int ret = exec(); int ret = exec();
@ -156,11 +170,9 @@ int ExtQuotes::showConfiguration(const QVariant &_args)
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());
setApiVersion(AW_EXTQUOTES_API); setApiVersion(AWEQAPI);
setTicker(ui->lineEdit_ticker->text()); setTicker(ui->lineEdit_ticker->text());
setActive(ui->checkBox_active->checkState() == Qt::Checked); setActive(ui->checkBox_active->checkState() == Qt::Checked);
setCron(ui->lineEdit_schedule->text());
setSocket(ui->lineEdit_socket->text());
setInterval(ui->spinBox_interval->value()); setInterval(ui->spinBox_interval->value());
writeConfiguration(); writeConfiguration();
@ -175,69 +187,67 @@ void ExtQuotes::writeConfiguration() const
QSettings settings(writtableConfig(), QSettings::IniFormat); QSettings settings(writtableConfig(), QSettings::IniFormat);
qCInfo(LOG_LIB) << "Configuration file" << settings.fileName(); qCInfo(LOG_LIB) << "Configuration file" << settings.fileName();
settings.beginGroup("Desktop Entry"); settings.beginGroup(QString("Desktop Entry"));
settings.setValue("X-AW-Ticker", ticker()); settings.setValue(QString("X-AW-Ticker"), ticker());
settings.endGroup(); settings.endGroup();
settings.sync(); settings.sync();
} }
void ExtQuotes::quotesReplyReceived(QNetworkReply *_reply) void ExtQuotes::quotesReplyReceived(QNetworkReply *reply)
{ {
if (_reply->error() != QNetworkReply::NoError) { qCDebug(LOG_LIB) << "Return code" << reply->error() << "with message"
qCWarning(LOG_AW) << "An error occurs" << _reply->error() << reply->errorString();
<< "with message" << _reply->errorString();
return;
}
m_isRunning = false; isRunning = false;
QJsonParseError error; QJsonParseError error;
QJsonDocument jsonDoc = QJsonDocument::fromJson(_reply->readAll(), &error); QJsonDocument jsonDoc = QJsonDocument::fromJson(reply->readAll(), &error);
_reply->deleteLater(); reply->deleteLater();
if (error.error != QJsonParseError::NoError) { if ((reply->error() != QNetworkReply::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()["query"].toMap(); QVariantMap jsonQuotes
jsonQuotes = jsonQuotes["results"].toMap()["quote"].toMap(); = jsonDoc.toVariant().toMap()[QString("query")].toMap();
jsonQuotes
= jsonQuotes[QString("results")].toMap()[QString("quote")].toMap();
double value; double value;
// ask // ask
value = jsonQuotes["Ask"].toString().toDouble(); value = jsonQuotes[QString("Ask")].toString().toDouble();
m_values[tag("askchg")] = m_values[tag("ask")].toDouble() == 0.0 values[tag(QString("askchg"))]
? 0.0 = values[tag(QString("ask"))].toDouble() == 0.0
: value - m_values[tag("ask")].toDouble(); ? 0.0
m_values[tag("percaskchg")] = 100.0 * m_values[tag("askchg")].toDouble() : value - values[tag(QString("ask"))].toDouble();
/ m_values[tag("ask")].toDouble(); values[tag(QString("percaskchg"))]
m_values[tag("ask")] = value; = 100.0 * values[tag(QString("askchg"))].toDouble()
/ values[tag(QString("ask"))].toDouble();
values[tag(QString("ask"))] = value;
// bid // bid
value = jsonQuotes["Bid"].toString().toDouble(); value = jsonQuotes[QString("Bid")].toString().toDouble();
m_values[tag("bidchg")] = m_values[tag("bid")].toDouble() == 0.0 values[tag(QString("bidchg"))]
? 0.0 = values[tag(QString("bid"))].toDouble() == 0.0
: value - m_values[tag("bid")].toDouble(); ? 0.0
m_values[tag("percbidchg")] = 100.0 * m_values[tag("bidchg")].toDouble() : value - values[tag(QString("bid"))].toDouble();
/ m_values[tag("bid")].toDouble(); values[tag(QString("percbidchg"))]
m_values[tag("bid")] = value; = 100.0 * values[tag(QString("bidchg"))].toDouble()
/ values[tag(QString("bid"))].toDouble();
values[tag(QString("bid"))] = value;
// last trade // last trade
value = jsonQuotes["LastTradePriceOnly"].toString().toDouble(); value = jsonQuotes[QString("LastTradePriceOnly")].toString().toDouble();
m_values[tag("pricechg")] = m_values[tag("price")].toDouble() == 0.0 values[tag(QString("pricechg"))]
? 0.0 = values[tag(QString("price"))].toDouble() == 0.0
: value - m_values[tag("price")].toDouble(); ? 0.0
m_values[tag("percpricechg")] = 100.0 * m_values[tag("pricechg")].toDouble() : value - values[tag(QString("price"))].toDouble();
/ m_values[tag("price")].toDouble(); values[tag(QString("percpricechg"))]
m_values[tag("price")] = value; = 100.0 * values[tag(QString("pricechg"))].toDouble()
/ values[tag(QString("price"))].toDouble();
values[tag(QString("price"))] = value;
emit(dataReceived(m_values)); emit(dataReceived(values));
}
void ExtQuotes::sendRequest()
{
m_isRunning = true;
QNetworkReply *reply = m_manager->get(QNetworkRequest(m_url));
new QReplyTimeout(reply, REQUEST_TIMEOUT);
} }
@ -246,9 +256,11 @@ void ExtQuotes::initUrl()
// init query // init query
m_url = QUrl(YAHOO_QUOTES_URL); m_url = QUrl(YAHOO_QUOTES_URL);
QUrlQuery params; QUrlQuery params;
params.addQueryItem("format", "json"); params.addQueryItem(QString("format"), QString("json"));
params.addQueryItem("env", "store://datatables.org/alltableswithkeys"); params.addQueryItem(QString("env"),
params.addQueryItem("q", QString(YAHOO_QUOTES_QUERY).arg(ticker())); QString("store://datatables.org/alltableswithkeys"));
params.addQueryItem(QString("q"),
QString(YAHOO_QUOTES_QUERY).arg(ticker()));
m_url.setQuery(params); m_url.setQuery(params);
} }
@ -265,7 +277,5 @@ get quotes for the instrument. Refer to <a href=\"http://finance.yahoo.com/\">\
</span></a></p></body></html>")); </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_schedule->setText(i18n("Schedule"));
ui->label_socket->setText(i18n("Socket"));
ui->label_interval->setText(i18n("Interval")); ui->label_interval->setText(i18n("Interval"));
} }

View File

@ -22,6 +22,10 @@
#include "abstractextitem.h" #include "abstractextitem.h"
#define YAHOO_QUOTES_URL "https://query.yahooapis.com/v1/public/yql"
#define YAHOO_QUOTES_QUERY \
"select * from yahoo.finance.quotes where symbol='%1'"
namespace Ui namespace Ui
{ {
@ -34,41 +38,36 @@ class ExtQuotes : public AbstractExtItem
Q_PROPERTY(QString ticker READ ticker WRITE setTicker) Q_PROPERTY(QString ticker READ ticker WRITE setTicker)
public: public:
const char *YAHOO_QUOTES_URL = "https://query.yahooapis.com/v1/public/yql"; explicit ExtQuotes(QWidget *parent, const QString filePath = QString());
const char *YAHOO_QUOTES_QUERY
= "select * from yahoo.finance.quotes where symbol='%1'";
explicit ExtQuotes(QWidget *_parent = nullptr,
const QString &_filePath = "");
virtual ~ExtQuotes(); virtual ~ExtQuotes();
ExtQuotes *copy(const QString &_fileName, const int _number); ExtQuotes *copy(const QString _fileName, const int _number);
// get methods // get methods
QString ticker() const; QString ticker() const;
QString uniq() const; QString uniq() const;
// set methods // set methods
void setTicker(const QString &_ticker); void setTicker(const QString _ticker = QString("EURUSD=X"));
public slots: public slots:
void readConfiguration(); void readConfiguration();
QVariantHash run(); QVariantHash run();
int showConfiguration(const QVariant &_args); int showConfiguration(const QVariant args = QVariant());
void writeConfiguration() const; void writeConfiguration() const;
private slots: private slots:
void quotesReplyReceived(QNetworkReply *_reply); void quotesReplyReceived(QNetworkReply *reply);
void sendRequest();
private: private:
QNetworkAccessManager *m_manager = nullptr; QNetworkAccessManager *m_manager = nullptr;
QUrl m_url; QUrl m_url;
bool m_isRunning = false; bool isRunning = false;
Ui::ExtQuotes *ui = nullptr; Ui::ExtQuotes *ui = nullptr;
void initUrl(); void initUrl();
void translate(); void translate();
// properties // properties
QString m_ticker = "EURUSD=X"; QString m_ticker = QString("EURUSD=X");
// values // values
QVariantHash m_values; int times = 0;
QVariantHash values;
}; };

View File

@ -7,7 +7,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>420</width> <width>420</width>
<height>378</height> <height>301</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -151,89 +151,34 @@
</layout> </layout>
</item> </item>
<item> <item>
<widget class="QGroupBox" name="groupBox_update"> <layout class="QHBoxLayout" name="layout_interval">
<property name="title"> <item>
<string>Update</string> <widget class="QLabel" name="label_interval">
</property> <property name="text">
<layout class="QVBoxLayout" name="verticalLayout_2"> <string>Interval</string>
<item> </property>
<layout class="QHBoxLayout" name="layout_interval"> <property name="alignment">
<item> <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<widget class="QLabel" name="label_interval"> </property>
<property name="text"> </widget>
<string>Interval</string> </item>
</property> <item>
<property name="alignment"> <widget class="QSpinBox" name="spinBox_interval">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> <property name="minimum">
</property> <number>1</number>
</widget> </property>
</item> <property name="maximum">
<item> <number>10000</number>
<widget class="QSpinBox" name="spinBox_interval"> </property>
<property name="minimum"> <property name="singleStep">
<number>1</number> <number>10</number>
</property> </property>
<property name="maximum"> <property name="value">
<number>10000</number> <number>60</number>
</property> </property>
<property name="singleStep"> </widget>
<number>500</number> </item>
</property> </layout>
<property name="value">
<number>3600</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_schedule">
<item>
<widget class="QLabel" name="label_schedule">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Schedule</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_schedule"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_socket">
<item>
<widget class="QLabel" name="label_socket">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Socket</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_socket"/>
</item>
</layout>
</item>
</layout>
</widget>
</item> </item>
<item> <item>
<spacer name="verticalSpacer"> <spacer name="verticalSpacer">

View File

@ -30,26 +30,24 @@
#include "awdebug.h" #include "awdebug.h"
ExtScript::ExtScript(QWidget *_parent, const QString &_filePath) ExtScript::ExtScript(QWidget *parent, const QString filePath)
: AbstractExtItem(_parent, _filePath) : AbstractExtItem(parent, filePath)
, ui(new Ui::ExtScript) , ui(new Ui::ExtScript)
{ {
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty()) if (!filePath.isEmpty())
readConfiguration(); readConfiguration();
readJsonFilters(); readJsonFilters();
ui->setupUi(this); ui->setupUi(this);
translate(); translate();
m_values[tag("custom")] = ""; value[tag(QString("custom"))] = QString("");
m_process = new QProcess(nullptr); process = new QProcess(nullptr);
connect(m_process, SIGNAL(finished(int, QProcess::ExitStatus)), this, connect(process, SIGNAL(finished(int, QProcess::ExitStatus)), this,
SLOT(updateValue())); SLOT(updateValue()));
m_process->waitForFinished(0); process->waitForFinished(0);
connect(this, SIGNAL(requestDataUpdate()), this, SLOT(startProcess()));
} }
@ -57,16 +55,13 @@ ExtScript::~ExtScript()
{ {
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
disconnect(m_process, SIGNAL(finished(int, QProcess::ExitStatus)), this, process->kill();
SLOT(updateValue())); process->deleteLater();
m_process->kill();
m_process->deleteLater();
disconnect(this, SIGNAL(requestDataUpdate()), this, SLOT(startProcess()));
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) << "File" << _fileName << "with number" << _number; qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
@ -83,17 +78,6 @@ ExtScript *ExtScript::copy(const QString &_fileName, const int _number)
} }
QString ExtScript::jsonFiltersFile() const
{
QString fileName = QStandardPaths::locate(
QStandardPaths::GenericDataLocation,
"awesomewidgets/scripts/awesomewidgets-extscripts-filters.json");
qCInfo(LOG_LIB) << "Filters file" << fileName;
return fileName;
}
QString ExtScript::executable() const QString ExtScript::executable() const
{ {
return m_executable; return m_executable;
@ -129,16 +113,16 @@ QString ExtScript::strRedirect() const
QString value; QString value;
switch (redirect()) { switch (redirect()) {
case Redirect::stdout2stderr: case Redirect::stdout2stderr:
value = "stdout2stderr"; value = QString("stdout2stderr");
break; break;
case Redirect::stderr2stdout: case Redirect::stderr2stdout:
value = "stderr2stdout"; value = QString("stderr2stdout");
break; break;
case Redirect::swap: case Redirect::swap:
value = "swap"; value = QString("swap");
break; break;
case Redirect::nothing: case Redirect::nothing:
value = "nothing"; value = QString("nothing");
break; break;
} }
@ -146,7 +130,7 @@ QString ExtScript::strRedirect() const
} }
void ExtScript::setExecutable(const QString &_executable) void ExtScript::setExecutable(const QString _executable)
{ {
qCDebug(LOG_LIB) << "Executable" << _executable; qCDebug(LOG_LIB) << "Executable" << _executable;
@ -154,17 +138,16 @@ void ExtScript::setExecutable(const QString &_executable)
} }
void ExtScript::setFilters(const QStringList &_filters) void ExtScript::setFilters(const QStringList _filters)
{ {
qCDebug(LOG_LIB) << "Filters" << _filters; qCDebug(LOG_LIB) << "Filters" << _filters;
std::for_each( std::for_each(_filters.cbegin(), _filters.cend(),
_filters.cbegin(), _filters.cend(), [this](QString filter) { return updateFilter(filter); });
[this](const QString &filter) { return updateFilter(filter, true); });
} }
void ExtScript::setPrefix(const QString &_prefix) void ExtScript::setPrefix(const QString _prefix)
{ {
qCDebug(LOG_LIB) << "Prefix" << _prefix; qCDebug(LOG_LIB) << "Prefix" << _prefix;
@ -180,15 +163,15 @@ void ExtScript::setRedirect(const Redirect _redirect)
} }
void ExtScript::setStrRedirect(const QString &_redirect) void ExtScript::setStrRedirect(const QString _redirect)
{ {
qCDebug(LOG_LIB) << "Redirect" << _redirect; qCDebug(LOG_LIB) << "Redirect" << _redirect;
if (_redirect == "stdout2sdterr") if (_redirect == QString("stdout2sdterr"))
setRedirect(Redirect::stdout2stderr); setRedirect(Redirect::stdout2stderr);
else if (_redirect == "stderr2sdtout") else if (_redirect == QString("stderr2sdtout"))
setRedirect(Redirect::stderr2stdout); setRedirect(Redirect::stderr2stdout);
else if (_redirect == "swap") else if (_redirect == QString("swap"))
setRedirect(Redirect::swap); setRedirect(Redirect::swap);
else else
setRedirect(Redirect::nothing); setRedirect(Redirect::nothing);
@ -199,15 +182,15 @@ QString ExtScript::applyFilters(QString _value) const
{ {
qCDebug(LOG_LIB) << "Value" << _value; qCDebug(LOG_LIB) << "Value" << _value;
for (auto &filt : filters()) { for (auto filt : filters()) {
qCInfo(LOG_LIB) << "Found filter" << filt; qCInfo(LOG_LIB) << "Found filter" << filt;
QVariantMap filter = m_jsonFilters[filt].toMap(); QVariantMap filter = jsonFilters[filt].toMap();
if (filter.isEmpty()) { if (filter.isEmpty()) {
qCWarning(LOG_LIB) qCWarning(LOG_LIB) << "Could not find filter" << _value
<< "Could not find filter" << _value << "in the json"; << "in the json";
continue; continue;
} }
for (auto &f : filter.keys()) for (auto f : filter.keys())
_value.replace(f, filter[f].toString()); _value.replace(f, filter[f].toString());
} }
@ -215,7 +198,7 @@ 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) << "Should be added filters" << _add << "from" << _filter; qCDebug(LOG_LIB) << "Should be added filters" << _add << "from" << _filter;
@ -235,23 +218,28 @@ void ExtScript::readConfiguration()
QSettings settings(fileName(), QSettings::IniFormat); QSettings settings(fileName(), QSettings::IniFormat);
settings.beginGroup("Desktop Entry"); settings.beginGroup(QString("Desktop Entry"));
setExecutable(settings.value("Exec", executable()).toString()); setExecutable(settings.value(QString("Exec"), executable()).toString());
setPrefix(settings.value("X-AW-Prefix", prefix()).toString()); setPrefix(settings.value(QString("X-AW-Prefix"), prefix()).toString());
setStrRedirect(settings.value("X-AW-Redirect", strRedirect()).toString()); setStrRedirect(
settings.value(QString("X-AW-Redirect"), strRedirect()).toString());
// api == 3 // api == 3
setFilters(settings.value("X-AW-Filters", filters()) setFilters(settings.value(QString("X-AW-Filters"), filters())
.toString() .toString()
.split(',', QString::SkipEmptyParts)); .split(QChar(','), QString::SkipEmptyParts));
settings.endGroup(); settings.endGroup();
bumpApi(AW_EXTSCRIPT_API); bumpApi(AWESAPI);
} }
void ExtScript::readJsonFilters() void ExtScript::readJsonFilters()
{ {
QString fileName = jsonFiltersFile(); QString fileName = QStandardPaths::locate(
QStandardPaths::GenericDataLocation,
QString(
"awesomewidgets/scripts/awesomewidgets-extscripts-filters.json"));
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)) {
qCWarning(LOG_LIB) << "Could not open" << fileName; qCWarning(LOG_LIB) << "Could not open" << fileName;
@ -266,25 +254,41 @@ void ExtScript::readJsonFilters()
qCWarning(LOG_LIB) << "Parse error" << error.errorString(); qCWarning(LOG_LIB) << "Parse error" << error.errorString();
return; return;
} }
m_jsonFilters = jsonDoc.toVariant().toMap(); jsonFilters = jsonDoc.toVariant().toMap();
qCInfo(LOG_LIB) << "Filters" << m_jsonFilters; qCInfo(LOG_LIB) << "Filters" << jsonFilters;
} }
QVariantHash ExtScript::run() QVariantHash ExtScript::run()
{ {
if (m_process->state() != QProcess::NotRunning) if (!isActive())
return m_values; return value;
startTimer(); if (process->state() != QProcess::NotRunning)
qCWarning(LOG_LIB) << "Another process is already running"
<< process->state();
return m_values; if ((times == 1) && (process->state() == QProcess::NotRunning)) {
QStringList cmdList;
if (!prefix().isEmpty())
cmdList.append(prefix());
cmdList.append(executable());
qCInfo(LOG_LIB) << "Run cmd" << cmdList.join(QChar(' '));
process->start(cmdList.join(QChar(' ')));
}
// update value
if (times >= interval())
times = 0;
times++;
return value;
} }
int ExtScript::showConfiguration(const QVariant &_args) int ExtScript::showConfiguration(const QVariant args)
{ {
Q_UNUSED(_args) Q_UNUSED(args)
ui->lineEdit_name->setText(name()); ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment()); ui->lineEdit_comment->setText(comment());
@ -294,16 +298,14 @@ int ExtScript::showConfiguration(const QVariant &_args)
ui->checkBox_active->setCheckState(isActive() ? Qt::Checked ui->checkBox_active->setCheckState(isActive() ? Qt::Checked
: Qt::Unchecked); : Qt::Unchecked);
ui->comboBox_redirect->setCurrentIndex(static_cast<int>(redirect())); ui->comboBox_redirect->setCurrentIndex(static_cast<int>(redirect()));
ui->lineEdit_schedule->setText(cron());
ui->lineEdit_socket->setText(socket());
ui->spinBox_interval->setValue(interval()); ui->spinBox_interval->setValue(interval());
// filters // filters
ui->checkBox_colorFilter->setCheckState( ui->checkBox_colorFilter->setCheckState(
filters().contains("color") ? Qt::Checked : Qt::Unchecked); filters().contains(QString("color")) ? Qt::Checked : Qt::Unchecked);
ui->checkBox_linesFilter->setCheckState( ui->checkBox_linesFilter->setCheckState(
filters().contains("newline") ? Qt::Checked : Qt::Unchecked); filters().contains(QString("newline")) ? Qt::Checked : Qt::Unchecked);
ui->checkBox_spaceFilter->setCheckState( ui->checkBox_spaceFilter->setCheckState(
filters().contains("space") ? Qt::Checked : Qt::Unchecked); filters().contains(QString("space")) ? Qt::Checked : Qt::Unchecked);
int ret = exec(); int ret = exec();
if (ret != 1) if (ret != 1)
@ -311,20 +313,18 @@ int ExtScript::showConfiguration(const QVariant &_args)
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());
setApiVersion(AW_EXTSCRIPT_API); setApiVersion(AWESAPI);
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);
setRedirect(static_cast<Redirect>(ui->comboBox_redirect->currentIndex())); setRedirect(static_cast<Redirect>(ui->comboBox_redirect->currentIndex()));
setCron(ui->lineEdit_schedule->text());
setSocket(ui->lineEdit_socket->text());
setInterval(ui->spinBox_interval->value()); setInterval(ui->spinBox_interval->value());
// filters // filters
updateFilter("color", updateFilter(QString("color"),
ui->checkBox_colorFilter->checkState() == Qt::Checked); ui->checkBox_colorFilter->checkState() == Qt::Checked);
updateFilter("newline", updateFilter(QString("newline"),
ui->checkBox_linesFilter->checkState() == Qt::Checked); ui->checkBox_linesFilter->checkState() == Qt::Checked);
updateFilter("space", updateFilter(QString("space"),
ui->checkBox_spaceFilter->checkState() == Qt::Checked); ui->checkBox_spaceFilter->checkState() == Qt::Checked);
writeConfiguration(); writeConfiguration();
@ -339,37 +339,26 @@ void ExtScript::writeConfiguration() const
QSettings settings(writtableConfig(), QSettings::IniFormat); QSettings settings(writtableConfig(), QSettings::IniFormat);
qCInfo(LOG_LIB) << "Configuration file" << settings.fileName(); qCInfo(LOG_LIB) << "Configuration file" << settings.fileName();
settings.beginGroup("Desktop Entry"); settings.beginGroup(QString("Desktop Entry"));
settings.setValue("Exec", executable()); settings.setValue(QString("Exec"), executable());
settings.setValue("X-AW-Prefix", prefix()); settings.setValue(QString("X-AW-Prefix"), prefix());
settings.setValue("X-AW-Redirect", strRedirect()); settings.setValue(QString("X-AW-Redirect"), strRedirect());
settings.setValue("X-AW-Filters", filters().join(',')); settings.setValue(QString("X-AW-Filters"), filters().join(QChar(',')));
settings.endGroup(); settings.endGroup();
settings.sync(); settings.sync();
} }
void ExtScript::startProcess()
{
QStringList cmdList;
if (!prefix().isEmpty())
cmdList.append(prefix());
cmdList.append(executable());
qCInfo(LOG_LIB) << "Run cmd" << cmdList.join(' ');
m_process->start(cmdList.join(' '));
}
void ExtScript::updateValue() void ExtScript::updateValue()
{ {
qCInfo(LOG_LIB) << "Cmd returns" << m_process->exitCode(); qCInfo(LOG_LIB) << "Cmd returns" << process->exitCode();
QString qdebug = QTextCodec::codecForMib(106) QString qdebug = QTextCodec::codecForMib(106)
->toUnicode(m_process->readAllStandardError()) ->toUnicode(process->readAllStandardError())
.trimmed(); .trimmed();
qCInfo(LOG_LIB) << "Error" << qdebug; qCInfo(LOG_LIB) << "Error" << qdebug;
QString qoutput = QTextCodec::codecForMib(106) QString qoutput = QTextCodec::codecForMib(106)
->toUnicode(m_process->readAllStandardOutput()) ->toUnicode(process->readAllStandardOutput())
.trimmed(); .trimmed();
qCInfo(LOG_LIB) << "Output" << qoutput; qCInfo(LOG_LIB) << "Output" << qoutput;
QString strValue; QString strValue;
@ -389,8 +378,8 @@ void ExtScript::updateValue()
} }
// filters // filters
m_values[tag("custom")] = applyFilters(strValue); value[tag(QString("custom"))] = applyFilters(strValue);
emit(dataReceived(m_values)); emit(dataReceived(value));
} }
@ -403,8 +392,6 @@ void ExtScript::translate()
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->label_redirect->setText(i18n("Redirect")); ui->label_redirect->setText(i18n("Redirect"));
ui->label_schedule->setText(i18n("Schedule"));
ui->label_socket->setText(i18n("Socket"));
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"));
ui->checkBox_colorFilter->setText(i18n("Wrap colors")); ui->checkBox_colorFilter->setText(i18n("Wrap colors"));

View File

@ -44,11 +44,9 @@ public:
swap = 3 swap = 3
}; };
explicit ExtScript(QWidget *_parent = nullptr, explicit ExtScript(QWidget *parent, const QString filePath = QString());
const QString &_filePath = "");
virtual ~ExtScript(); virtual ~ExtScript();
ExtScript *copy(const QString &_fileName, const int _number); ExtScript *copy(const QString _fileName, const int _number);
QString jsonFiltersFile() const;
// get methods // get methods
QString executable() const; QString executable() const;
QStringList filters() const; QStringList filters() const;
@ -58,38 +56,38 @@ public:
// derivatives // derivatives
QString strRedirect() const; QString strRedirect() const;
// set methods // set methods
void setExecutable(const QString &_executable); void setExecutable(const QString _executable = QString("/usr/bin/true"));
void setFilters(const QStringList &_filters); void setFilters(const QStringList _filters = QStringList());
void setPrefix(const QString &_prefix); void setPrefix(const QString _prefix = QString(""));
void setRedirect(const Redirect _redirect); void setRedirect(const Redirect _redirect = Redirect::nothing);
void setStrRedirect(const QString &_redirect); void setStrRedirect(const QString _redirect = QString("nothing"));
// filters // filters
QString applyFilters(QString _value) const; QString applyFilters(QString _value) const;
void updateFilter(const QString &_filter, const bool _add); void updateFilter(const QString _filter, const bool _add = true);
public slots: public slots:
void readConfiguration(); void readConfiguration();
void readJsonFilters(); void readJsonFilters();
QVariantHash run(); QVariantHash run();
int showConfiguration(const QVariant &_args); int showConfiguration(const QVariant args = QVariant());
void writeConfiguration() const; void writeConfiguration() const;
private slots: private slots:
void startProcess();
void updateValue(); void updateValue();
private: private:
QProcess *m_process = nullptr; QProcess *process = nullptr;
Ui::ExtScript *ui = nullptr; Ui::ExtScript *ui = nullptr;
void translate(); void translate();
// properties // properties
QString m_executable = "/usr/bin/true"; QString m_executable = QString("/usr/bin/true");
QStringList m_filters = QStringList(); QStringList m_filters = QStringList();
QString m_prefix = ""; QString m_prefix = QString("");
Redirect m_redirect = Redirect::nothing; Redirect m_redirect = Redirect::nothing;
// internal properties // internal properties
QVariantMap m_jsonFilters; QVariantMap jsonFilters = QVariantMap();
QVariantHash m_values; int times = 0;
QVariantHash value;
}; };

View File

@ -7,7 +7,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>420</width> <width>420</width>
<height>506</height> <height>424</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -196,89 +196,28 @@
</layout> </layout>
</item> </item>
<item> <item>
<widget class="QGroupBox" name="groupBox_update"> <layout class="QHBoxLayout" name="layout_interval">
<property name="title"> <item>
<string>Update</string> <widget class="QLabel" name="label_interval">
</property> <property name="text">
<layout class="QVBoxLayout" name="verticalLayout_3"> <string>Interval</string>
<item> </property>
<layout class="QHBoxLayout" name="layout_interval"> <property name="alignment">
<item> <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<widget class="QLabel" name="label_interval"> </property>
<property name="text"> </widget>
<string>Interval</string> </item>
</property> <item>
<property name="alignment"> <widget class="QSpinBox" name="spinBox_interval">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> <property name="minimum">
</property> <number>1</number>
</widget> </property>
</item> <property name="maximum">
<item> <number>10000</number>
<widget class="QSpinBox" name="spinBox_interval"> </property>
<property name="minimum"> </widget>
<number>1</number> </item>
</property> </layout>
<property name="maximum">
<number>10000</number>
</property>
<property name="singleStep">
<number>500</number>
</property>
<property name="value">
<number>3600</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_schedule">
<item>
<widget class="QLabel" name="label_schedule">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Schedule</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_schedule"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_socket">
<item>
<widget class="QLabel" name="label_socket">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Socket</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_socket"/>
</item>
</layout>
</item>
</layout>
</widget>
</item> </item>
<item> <item>
<widget class="QGroupBox" name="groupBox_filters"> <widget class="QGroupBox" name="groupBox_filters">

View File

@ -28,24 +28,22 @@
#include "awdebug.h" #include "awdebug.h"
ExtUpgrade::ExtUpgrade(QWidget *_parent, const QString &_filePath) ExtUpgrade::ExtUpgrade(QWidget *parent, const QString filePath)
: AbstractExtItem(_parent, _filePath) : AbstractExtItem(parent, filePath)
, ui(new Ui::ExtUpgrade) , ui(new Ui::ExtUpgrade)
{ {
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty()) if (!filePath.isEmpty())
readConfiguration(); readConfiguration();
ui->setupUi(this); ui->setupUi(this);
translate(); translate();
m_values[tag("pkgcount")] = 0; value[tag(QString("pkgcount"))] = 0;
m_process = new QProcess(nullptr); process = new QProcess(nullptr);
connect(m_process, SIGNAL(finished(int)), this, SLOT(updateValue())); connect(process, SIGNAL(finished(int)), this, SLOT(updateValue()));
m_process->waitForFinished(0); process->waitForFinished(0);
connect(this, SIGNAL(requestDataUpdate()), this, SLOT(startProcess()));
} }
@ -53,14 +51,13 @@ ExtUpgrade::~ExtUpgrade()
{ {
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
m_process->kill(); process->kill();
m_process->deleteLater(); process->deleteLater();
disconnect(this, SIGNAL(requestDataUpdate()), this, SLOT(startProcess()));
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) << "File" << _fileName << "with number" << _number; qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
@ -100,7 +97,7 @@ QString ExtUpgrade::uniq() const
} }
void ExtUpgrade::setExecutable(const QString &_executable) void ExtUpgrade::setExecutable(const QString _executable)
{ {
qCDebug(LOG_LIB) << "Executable" << _executable; qCDebug(LOG_LIB) << "Executable" << _executable;
@ -108,7 +105,7 @@ void ExtUpgrade::setExecutable(const QString &_executable)
} }
void ExtUpgrade::setFilter(const QString &_filter) void ExtUpgrade::setFilter(const QString _filter)
{ {
qCDebug(LOG_LIB) << "Filter" << _filter; qCDebug(LOG_LIB) << "Filter" << _filter;
@ -132,30 +129,40 @@ void ExtUpgrade::readConfiguration()
QSettings settings(fileName(), QSettings::IniFormat); QSettings settings(fileName(), QSettings::IniFormat);
settings.beginGroup("Desktop Entry"); settings.beginGroup(QString("Desktop Entry"));
setExecutable(settings.value("Exec", executable()).toString()); setExecutable(settings.value(QString("Exec"), executable()).toString());
setNull(settings.value("X-AW-Null", null()).toInt()); setNull(settings.value(QString("X-AW-Null"), null()).toInt());
// api == 3 // api == 3
setFilter(settings.value("X-AW-Filter", filter()).toString()); setFilter(settings.value(QString("X-AW-Filter"), filter()).toString());
settings.endGroup(); settings.endGroup();
bumpApi(AW_EXTUPGRADE_API); bumpApi(AWEUAPI);
} }
QVariantHash ExtUpgrade::run() QVariantHash ExtUpgrade::run()
{ {
if (m_process->state() != QProcess::NotRunning) if (!isActive())
return m_values; return value;
startTimer();
return m_values; if ((times == 1) && (process->state() == QProcess::NotRunning)) {
QString cmd = QString("sh -c \"%1\"").arg(executable());
qCInfo(LOG_LIB) << "Run cmd" << cmd;
process->start(cmd);
}
// update value
if (times >= interval())
times = 0;
times++;
return value;
} }
int ExtUpgrade::showConfiguration(const QVariant &_args) int ExtUpgrade::showConfiguration(const QVariant args)
{ {
Q_UNUSED(_args) Q_UNUSED(args)
ui->lineEdit_name->setText(name()); ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment()); ui->lineEdit_comment->setText(comment());
@ -165,8 +172,6 @@ int ExtUpgrade::showConfiguration(const QVariant &_args)
ui->checkBox_active->setCheckState(isActive() ? Qt::Checked ui->checkBox_active->setCheckState(isActive() ? Qt::Checked
: Qt::Unchecked); : Qt::Unchecked);
ui->spinBox_null->setValue(null()); ui->spinBox_null->setValue(null());
ui->lineEdit_schedule->setText(cron());
ui->lineEdit_socket->setText(socket());
ui->spinBox_interval->setValue(interval()); ui->spinBox_interval->setValue(interval());
int ret = exec(); int ret = exec();
@ -175,13 +180,11 @@ int ExtUpgrade::showConfiguration(const QVariant &_args)
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());
setApiVersion(AW_EXTUPGRADE_API); setApiVersion(AWEUAPI);
setExecutable(ui->lineEdit_command->text()); setExecutable(ui->lineEdit_command->text());
setFilter(ui->lineEdit_filter->text()); setFilter(ui->lineEdit_filter->text());
setActive(ui->checkBox_active->checkState() == Qt::Checked); setActive(ui->checkBox_active->checkState() == Qt::Checked);
setNull(ui->spinBox_null->value()); setNull(ui->spinBox_null->value());
setCron(ui->lineEdit_schedule->text());
setSocket(ui->lineEdit_socket->text());
setInterval(ui->spinBox_interval->value()); setInterval(ui->spinBox_interval->value());
writeConfiguration(); writeConfiguration();
@ -196,42 +199,34 @@ void ExtUpgrade::writeConfiguration() const
QSettings settings(writtableConfig(), QSettings::IniFormat); QSettings settings(writtableConfig(), QSettings::IniFormat);
qCInfo(LOG_LIB) << "Configuration file" << settings.fileName(); qCInfo(LOG_LIB) << "Configuration file" << settings.fileName();
settings.beginGroup("Desktop Entry"); settings.beginGroup(QString("Desktop Entry"));
settings.setValue("Exec", executable()); settings.setValue(QString("Exec"), executable());
settings.setValue("X-AW-Filter", filter()); settings.setValue(QString("X-AW-Filter"), filter());
settings.setValue("X-AW-Null", null()); settings.setValue(QString("X-AW-Null"), null());
settings.endGroup(); settings.endGroup();
settings.sync(); settings.sync();
} }
void ExtUpgrade::startProcess()
{
QString cmd = QString("sh -c \"%1\"").arg(executable());
qCInfo(LOG_LIB) << "Run cmd" << cmd;
m_process->start(cmd);
}
void ExtUpgrade::updateValue() void ExtUpgrade::updateValue()
{ {
qCInfo(LOG_LIB) << "Cmd returns" << m_process->exitCode(); qCInfo(LOG_LIB) << "Cmd returns" << process->exitCode();
qCInfo(LOG_LIB) << "Error" << m_process->readAllStandardError(); qCInfo(LOG_LIB) << "Error" << process->readAllStandardError();
QString qoutput = QTextCodec::codecForMib(106) QString qoutput = QTextCodec::codecForMib(106)
->toUnicode(m_process->readAllStandardOutput()) ->toUnicode(process->readAllStandardOutput())
.trimmed(); .trimmed();
m_values[tag("pkgcount")] = [this](QString output) { value[tag(QString("pkgcount"))] = [this](QString output) {
return filter().isEmpty() return filter().isEmpty()
? output.split('\n', QString::SkipEmptyParts).count() ? output.split(QChar('\n'), QString::SkipEmptyParts).count()
- null() - null()
: output.split('\n', QString::SkipEmptyParts) : output.split(QChar('\n'), QString::SkipEmptyParts)
.filter(QRegExp(filter())) .filter(QRegExp(filter()))
.count(); .count();
}(qoutput); }(qoutput);
emit(dataReceived(m_values)); emit(dataReceived(value));
} }
@ -244,7 +239,5 @@ void ExtUpgrade::translate()
ui->label_filter->setText(i18n("Filter")); ui->label_filter->setText(i18n("Filter"));
ui->checkBox_active->setText(i18n("Active")); ui->checkBox_active->setText(i18n("Active"));
ui->label_null->setText(i18n("Null")); ui->label_null->setText(i18n("Null"));
ui->label_socket->setText(i18n("Socket"));
ui->label_schedule->setText(i18n("Schedule"));
ui->label_interval->setText(i18n("Interval")); ui->label_interval->setText(i18n("Interval"));
} }

View File

@ -36,40 +36,39 @@ 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, explicit ExtUpgrade(QWidget *parent, const QString filePath = QString());
const QString &_filePath = "");
virtual ~ExtUpgrade(); virtual ~ExtUpgrade();
ExtUpgrade *copy(const QString &_fileName, const int _number); ExtUpgrade *copy(const QString _fileName, const int _number);
// get methods // get methods
QString executable() const; QString executable() const;
QString filter() const; QString filter() const;
int null() const; int null() const;
QString uniq() const; QString uniq() const;
// set methods // set methods
void setExecutable(const QString &_executable); void setExecutable(const QString _executable = QString("/usr/bin/true"));
void setFilter(const QString &_filter); void setFilter(const QString _filter = QString());
void setNull(const int _null); void setNull(const int _null = 0);
public slots: public slots:
void readConfiguration(); void readConfiguration();
QVariantHash run(); QVariantHash run();
int showConfiguration(const QVariant &_args); int showConfiguration(const QVariant args = QVariant());
void writeConfiguration() const; void writeConfiguration() const;
private slots: private slots:
void startProcess();
void updateValue(); void updateValue();
private: private:
QProcess *m_process = nullptr; QProcess *process = nullptr;
Ui::ExtUpgrade *ui = nullptr; Ui::ExtUpgrade *ui = nullptr;
void translate(); void translate();
// properties // properties
QString m_executable = "/usr/bin/true"; QString m_executable = QString("/usr/bin/true");
QString m_filter = ""; QString m_filter = QString("");
int m_null = 0; int m_null = 0;
// internal properties // internal properties
QVariantHash m_values; int times = 0;
QVariantHash value;
}; };

View File

@ -7,7 +7,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>420</width> <width>420</width>
<height>382</height> <height>301</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -182,89 +182,34 @@
</layout> </layout>
</item> </item>
<item> <item>
<widget class="QGroupBox" name="groupBox_update"> <layout class="QHBoxLayout" name="layout_interval">
<property name="title"> <item>
<string>Update</string> <widget class="QLabel" name="label_interval">
</property> <property name="text">
<layout class="QVBoxLayout" name="verticalLayout_2"> <string>Interval</string>
<item> </property>
<layout class="QHBoxLayout" name="layout_interval"> <property name="alignment">
<item> <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<widget class="QLabel" name="label_interval"> </property>
<property name="text"> </widget>
<string>Interval</string> </item>
</property> <item>
<property name="alignment"> <widget class="QSpinBox" name="spinBox_interval">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> <property name="minimum">
</property> <number>1</number>
</widget> </property>
</item> <property name="maximum">
<item> <number>10000</number>
<widget class="QSpinBox" name="spinBox_interval"> </property>
<property name="minimum"> <property name="singleStep">
<number>1</number> <number>500</number>
</property> </property>
<property name="maximum"> <property name="value">
<number>10000</number> <number>3600</number>
</property> </property>
<property name="singleStep"> </widget>
<number>500</number> </item>
</property> </layout>
<property name="value">
<number>3600</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_schedule">
<item>
<widget class="QLabel" name="label_schedule">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Schedule</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_schedule"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_socket">
<item>
<widget class="QLabel" name="label_socket">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Socket</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_socket"/>
</item>
</layout>
</item>
</layout>
</widget>
</item> </item>
<item> <item>
<spacer name="verticalSpacer"> <spacer name="verticalSpacer">

View File

@ -35,31 +35,29 @@
#include "yahooweatherprovider.h" #include "yahooweatherprovider.h"
ExtWeather::ExtWeather(QWidget *_parent, const QString &_filePath) ExtWeather::ExtWeather(QWidget *parent, const QString filePath)
: AbstractExtItem(_parent, _filePath) : AbstractExtItem(parent, filePath)
, ui(new Ui::ExtWeather) , ui(new Ui::ExtWeather)
{ {
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty()) if (!filePath.isEmpty())
readConfiguration(); readConfiguration();
readJsonMap(); readJsonMap();
ui->setupUi(this); ui->setupUi(this);
translate(); translate();
m_values[tag("weatherId")] = 0; values[tag(QString("weatherId"))] = 0;
m_values[tag("weather")] = ""; values[tag(QString("weather"))] = QString("");
m_values[tag("humidity")] = 0; values[tag(QString("humidity"))] = 0;
m_values[tag("pressure")] = 0.0; values[tag(QString("pressure"))] = 0.0;
m_values[tag("temperature")] = 0.0; values[tag(QString("temperature"))] = 0.0;
// HACK declare as child of nullptr to avoid crash with plasmawindowed // HACK declare as child of nullptr to avoid crash with plasmawindowed
// in the destructor // in the destructor
m_manager = new QNetworkAccessManager(nullptr); m_manager = new QNetworkAccessManager(nullptr);
connect(m_manager, SIGNAL(finished(QNetworkReply *)), this, connect(m_manager, SIGNAL(finished(QNetworkReply *)), this,
SLOT(weatherReplyReceived(QNetworkReply *))); SLOT(weatherReplyReceived(QNetworkReply *)));
connect(this, SIGNAL(requestDataUpdate()), this, SLOT(sendRequest()));
} }
@ -69,7 +67,6 @@ ExtWeather::~ExtWeather()
disconnect(m_manager, SIGNAL(finished(QNetworkReply *)), this, disconnect(m_manager, SIGNAL(finished(QNetworkReply *)), this,
SLOT(weatherReplyReceived(QNetworkReply *))); SLOT(weatherReplyReceived(QNetworkReply *)));
disconnect(this, SIGNAL(requestDataUpdate()), this, SLOT(sendRequest()));
m_manager->deleteLater(); m_manager->deleteLater();
delete m_providerObject; delete m_providerObject;
@ -77,7 +74,7 @@ ExtWeather::~ExtWeather()
} }
ExtWeather *ExtWeather::copy(const QString &_fileName, const int _number) ExtWeather *ExtWeather::copy(const QString _fileName, const int _number)
{ {
qCDebug(LOG_LIB) << "File" << _fileName << "number" << _number; qCDebug(LOG_LIB) << "File" << _fileName << "number" << _number;
@ -95,23 +92,13 @@ ExtWeather *ExtWeather::copy(const QString &_fileName, const int _number)
} }
QString ExtWeather::jsonMapFile() const
{
QString fileName = QStandardPaths::locate(
QStandardPaths::GenericDataLocation,
"awesomewidgets/weather/awesomewidgets-extweather-ids.json");
qCInfo(LOG_LIB) << "Map file" << fileName;
return fileName;
}
QString ExtWeather::weatherFromInt(const int _id) const QString ExtWeather::weatherFromInt(const int _id) const
{ {
qCDebug(LOG_LIB) << "Weather ID" << _id; qCDebug(LOG_LIB) << "Weather ID" << _id;
QVariantMap map = m_jsonMap[m_image ? "image" : "text"].toMap(); QVariantMap map
return map.value(QString::number(_id), map["default"]).toString(); = m_jsonMap[m_image ? QString("image") : QString("text")].toMap();
return map.value(QString::number(_id), map[QString("default")]).toString();
} }
@ -144,10 +131,10 @@ QString ExtWeather::strProvider() const
QString value; QString value;
switch (m_provider) { switch (m_provider) {
case Provider::OWM: case Provider::OWM:
value = "OWM"; value = QString("OWM");
break; break;
case Provider::Yahoo: case Provider::Yahoo:
value = "Yahoo"; value = QString("Yahoo");
break; break;
} }
@ -167,7 +154,7 @@ QString ExtWeather::uniq() const
} }
void ExtWeather::setCity(const QString &_city) void ExtWeather::setCity(const QString _city)
{ {
qCDebug(LOG_LIB) << "City" << _city; qCDebug(LOG_LIB) << "City" << _city;
@ -176,7 +163,7 @@ void ExtWeather::setCity(const QString &_city)
} }
void ExtWeather::setCountry(const QString &_country) void ExtWeather::setCountry(const QString _country)
{ {
qCDebug(LOG_LIB) << "Country" << _country; qCDebug(LOG_LIB) << "Country" << _country;
@ -202,11 +189,11 @@ void ExtWeather::setProvider(const Provider _provider)
} }
void ExtWeather::setStrProvider(const QString &_provider) void ExtWeather::setStrProvider(const QString _provider)
{ {
qCDebug(LOG_LIB) << "Provider" << _provider; qCDebug(LOG_LIB) << "Provider" << _provider;
if (_provider == "Yahoo") if (_provider == QString("Yahoo"))
setProvider(Provider::Yahoo); setProvider(Provider::Yahoo);
else else
setProvider(Provider::OWM); setProvider(Provider::OWM);
@ -228,23 +215,28 @@ void ExtWeather::readConfiguration()
QSettings settings(fileName(), QSettings::IniFormat); QSettings settings(fileName(), QSettings::IniFormat);
settings.beginGroup("Desktop Entry"); settings.beginGroup(QString("Desktop Entry"));
setCity(settings.value("X-AW-City", city()).toString()); setCity(settings.value(QString("X-AW-City"), city()).toString());
setCountry(settings.value("X-AW-Country", country()).toString()); setCountry(settings.value(QString("X-AW-Country"), country()).toString());
setTs(settings.value("X-AW-TS", ts()).toInt()); setTs(settings.value(QString("X-AW-TS"), ts()).toInt());
// api == 2 // api == 2
setImage(settings.value("X-AW-Image", image()).toBool()); setImage(settings.value(QString("X-AW-Image"), QVariant(image())).toString()
== QString("true"));
// api == 3 // api == 3
setStrProvider(settings.value("X-AW-Provider", strProvider()).toString()); setStrProvider(
settings.value(QString("X-AW-Provider"), strProvider()).toString());
settings.endGroup(); settings.endGroup();
bumpApi(AW_EXTWEATHER_API); bumpApi(AWEWAPI);
} }
void ExtWeather::readJsonMap() void ExtWeather::readJsonMap()
{ {
QString fileName = jsonMapFile(); QString fileName = QStandardPaths::locate(
QStandardPaths::GenericDataLocation,
QString("awesomewidgets/weather/awesomewidgets-extweather-ids.json"));
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)) {
qCWarning(LOG_LIB) << "Could not open" << fileName; qCWarning(LOG_LIB) << "Could not open" << fileName;
@ -267,17 +259,29 @@ void ExtWeather::readJsonMap()
QVariantHash ExtWeather::run() QVariantHash ExtWeather::run()
{ {
if (m_isRunning) if ((!isActive()) || (isRunning))
return m_values; return values;
startTimer();
return m_values; if (times == 1) {
qCInfo(LOG_LIB) << "Send request";
isRunning = true;
QNetworkReply *reply
= m_manager->get(QNetworkRequest(m_providerObject->url()));
new QReplyTimeout(reply, REQUEST_TIMEOUT);
}
// update value
if (times >= interval())
times = 0;
times++;
return values;
} }
int ExtWeather::showConfiguration(const QVariant &_args) int ExtWeather::showConfiguration(const QVariant args)
{ {
Q_UNUSED(_args) Q_UNUSED(args)
ui->lineEdit_name->setText(name()); ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment()); ui->lineEdit_comment->setText(comment());
@ -289,8 +293,6 @@ int ExtWeather::showConfiguration(const QVariant &_args)
ui->checkBox_image->setCheckState(image() ? Qt::Checked : Qt::Unchecked); ui->checkBox_image->setCheckState(image() ? Qt::Checked : Qt::Unchecked);
ui->checkBox_active->setCheckState(isActive() ? Qt::Checked ui->checkBox_active->setCheckState(isActive() ? Qt::Checked
: Qt::Unchecked); : Qt::Unchecked);
ui->lineEdit_schedule->setText(cron());
ui->lineEdit_socket->setText(socket());
ui->spinBox_interval->setValue(interval()); ui->spinBox_interval->setValue(interval());
int ret = exec(); int ret = exec();
@ -299,15 +301,13 @@ int ExtWeather::showConfiguration(const QVariant &_args)
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());
setApiVersion(AW_EXTWEATHER_API); setApiVersion(AWEWAPI);
setCity(ui->lineEdit_city->text()); setCity(ui->lineEdit_city->text());
setCountry(ui->lineEdit_country->text()); setCountry(ui->lineEdit_country->text());
setProvider(static_cast<Provider>(ui->comboBox_provider->currentIndex())); setProvider(static_cast<Provider>(ui->comboBox_provider->currentIndex()));
setTs(ui->spinBox_timestamp->value()); setTs(ui->spinBox_timestamp->value());
setImage(ui->checkBox_image->checkState() == Qt::Checked); setImage(ui->checkBox_image->checkState() == Qt::Checked);
setActive(ui->checkBox_active->checkState() == Qt::Checked); setActive(ui->checkBox_active->checkState() == Qt::Checked);
setCron(ui->lineEdit_schedule->text());
setSocket(ui->lineEdit_socket->text());
setInterval(ui->spinBox_interval->value()); setInterval(ui->spinBox_interval->value());
writeConfiguration(); writeConfiguration();
@ -322,40 +322,29 @@ void ExtWeather::writeConfiguration() const
QSettings settings(writtableConfig(), QSettings::IniFormat); QSettings settings(writtableConfig(), QSettings::IniFormat);
qCInfo(LOG_LIB) << "Configuration file" << settings.fileName(); qCInfo(LOG_LIB) << "Configuration file" << settings.fileName();
settings.beginGroup("Desktop Entry"); settings.beginGroup(QString("Desktop Entry"));
settings.setValue("X-AW-City", city()); settings.setValue(QString("X-AW-City"), city());
settings.setValue("X-AW-Country", country()); settings.setValue(QString("X-AW-Country"), country());
settings.setValue("X-AW-Image", image()); settings.setValue(QString("X-AW-Image"), image());
settings.setValue("X-AW-Provider", strProvider()); settings.setValue(QString("X-AW-Provider"), strProvider());
settings.setValue("X-AW-TS", ts()); settings.setValue(QString("X-AW-TS"), ts());
settings.endGroup(); settings.endGroup();
settings.sync(); settings.sync();
} }
void ExtWeather::sendRequest() void ExtWeather::weatherReplyReceived(QNetworkReply *reply)
{ {
m_isRunning = true; qCDebug(LOG_LIB) << "Return code" << reply->error() << "with message"
QNetworkReply *reply << reply->errorString();
= m_manager->get(QNetworkRequest(m_providerObject->url()));
new QReplyTimeout(reply, REQUEST_TIMEOUT);
}
isRunning = false;
void ExtWeather::weatherReplyReceived(QNetworkReply *_reply)
{
if (_reply->error() != QNetworkReply::NoError) {
qCWarning(LOG_AW) << "An error occurs" << _reply->error()
<< "with message" << _reply->errorString();
return;
}
m_isRunning = false;
QJsonParseError error; QJsonParseError error;
QJsonDocument jsonDoc = QJsonDocument::fromJson(_reply->readAll(), &error); QJsonDocument jsonDoc = QJsonDocument::fromJson(reply->readAll(), &error);
_reply->deleteLater(); reply->deleteLater();
if (error.error != QJsonParseError::NoError) { if ((reply->error() != QNetworkReply::NoError)
|| (error.error != QJsonParseError::NoError)) {
qCWarning(LOG_LIB) << "Parse error" << error.errorString(); qCWarning(LOG_LIB) << "Parse error" << error.errorString();
return; return;
} }
@ -363,11 +352,11 @@ void ExtWeather::weatherReplyReceived(QNetworkReply *_reply)
QVariantHash data = m_providerObject->parse(jsonDoc.toVariant().toMap()); QVariantHash data = m_providerObject->parse(jsonDoc.toVariant().toMap());
if (data.isEmpty()) if (data.isEmpty())
return; return;
m_values = data; values = data;
m_values[tag("weather")] values[tag(QString("weather"))]
= weatherFromInt(m_values[tag("weatherId")].toInt()); = weatherFromInt(values[tag(QString("weatherId"))].toInt());
emit(dataReceived(m_values)); emit(dataReceived(values));
} }
@ -399,7 +388,5 @@ void ExtWeather::translate()
ui->label_timestamp->setText(i18n("Timestamp")); ui->label_timestamp->setText(i18n("Timestamp"));
ui->checkBox_image->setText(i18n("Use images")); ui->checkBox_image->setText(i18n("Use images"));
ui->checkBox_active->setText(i18n("Active")); ui->checkBox_active->setText(i18n("Active"));
ui->label_schedule->setText(i18n("Schedule"));
ui->label_socket->setText(i18n("Socket"));
ui->label_interval->setText(i18n("Interval")); ui->label_interval->setText(i18n("Interval"));
} }

View File

@ -42,11 +42,9 @@ class ExtWeather : public AbstractExtItem
public: public:
enum class Provider { OWM = 0, Yahoo = 1 }; enum class Provider { OWM = 0, Yahoo = 1 };
explicit ExtWeather(QWidget *_parent = nullptr, explicit ExtWeather(QWidget *parent, const QString filePath = QString());
const QString &_filePath = "");
virtual ~ExtWeather(); virtual ~ExtWeather();
ExtWeather *copy(const QString &_fileName, const int _number); ExtWeather *copy(const QString _fileName, const int _number);
QString jsonMapFile() const;
QString weatherFromInt(const int _id) const; QString weatherFromInt(const int _id) const;
// get methods // get methods
QString city() const; QString city() const;
@ -57,40 +55,40 @@ public:
int ts() const; int ts() const;
QString uniq() const; QString uniq() const;
// set methods // set methods
void setCity(const QString &_city); void setCity(const QString _city = QString("London"));
void setCountry(const QString &_country); void setCountry(const QString _country = QString("uk"));
void setImage(const bool _image); void setImage(const bool _image = false);
void setProvider(const Provider _provider); void setProvider(const Provider _provider = Provider::OWM);
void setStrProvider(const QString &_provider); void setStrProvider(const QString _provider = QString("OWM"));
void setTs(const int _ts); void setTs(const int _ts = 0);
public slots: public slots:
void readConfiguration(); void readConfiguration();
void readJsonMap(); void readJsonMap();
QVariantHash run(); QVariantHash run();
int showConfiguration(const QVariant &_args); int showConfiguration(const QVariant args = QVariant());
void writeConfiguration() const; void writeConfiguration() const;
private slots: private slots:
void sendRequest(); void weatherReplyReceived(QNetworkReply *reply);
void weatherReplyReceived(QNetworkReply *_reply);
private: private:
QNetworkAccessManager *m_manager = nullptr; QNetworkAccessManager *m_manager = nullptr;
AbstractWeatherProvider *m_providerObject = nullptr; AbstractWeatherProvider *m_providerObject = nullptr;
bool m_isRunning = false; bool isRunning = false;
Ui::ExtWeather *ui = nullptr; Ui::ExtWeather *ui = nullptr;
void initProvider(); void initProvider();
void translate(); void translate();
// properties // properties
QString m_city = "London"; QString m_city = QString("London");
QString m_country = "uk"; QString m_country = QString("uk");
bool m_image = false; bool m_image = false;
Provider m_provider = Provider::OWM; Provider m_provider = Provider::OWM;
int m_ts = 0; int m_ts = 0;
QVariantMap m_jsonMap; QVariantMap m_jsonMap = QVariantMap();
// values // values
QVariantHash m_values; int times = 0;
QVariantHash values;
}; };

View File

@ -7,7 +7,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>420</width> <width>420</width>
<height>446</height> <height>333</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -249,89 +249,34 @@
</layout> </layout>
</item> </item>
<item> <item>
<widget class="QGroupBox" name="groupBox_update"> <layout class="QHBoxLayout" name="layout_interval">
<property name="title"> <item>
<string>Update</string> <widget class="QLabel" name="label_interval">
</property> <property name="text">
<layout class="QVBoxLayout" name="verticalLayout_2"> <string>Interval</string>
<item> </property>
<layout class="QHBoxLayout" name="layout_interval"> <property name="alignment">
<item> <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<widget class="QLabel" name="label_interval"> </property>
<property name="text"> </widget>
<string>Interval</string> </item>
</property> <item>
<property name="alignment"> <widget class="QSpinBox" name="spinBox_interval">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> <property name="minimum">
</property> <number>1</number>
</widget> </property>
</item> <property name="maximum">
<item> <number>10000</number>
<widget class="QSpinBox" name="spinBox_interval"> </property>
<property name="minimum"> <property name="singleStep">
<number>1</number> <number>10</number>
</property> </property>
<property name="maximum"> <property name="value">
<number>10000</number> <number>60</number>
</property> </property>
<property name="singleStep"> </widget>
<number>500</number> </item>
</property> </layout>
<property name="value">
<number>3600</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_schedule">
<item>
<widget class="QLabel" name="label_schedule">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Schedule</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_schedule"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="layout_socket">
<item>
<widget class="QLabel" name="label_socket">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Socket</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_socket"/>
</item>
</layout>
</item>
</layout>
</widget>
</item> </item>
<item> <item>
<spacer name="verticalSpacer"> <spacer name="verticalSpacer">

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