Merge pull request #145 from arcan1s/development

Release 3.4.0
This commit is contained in:
2020-11-07 17:15:29 +03:00
committed by GitHub
216 changed files with 4203 additions and 2821 deletions
+3 -2
View File
@@ -1,9 +1,10 @@
FROM base/archlinux FROM archlinux
RUN pacman -Sy RUN pacman -Sy
# toolchain # toolchain
RUN pacman -S --noconfirm base-devel cmake extra-cmake-modules python RUN echo -e 'y\ny' | pacman -S util-linux-libs
RUN pacman -S --noconfirm base-devel cmake extra-cmake-modules python util-linux-libs
# kf5 and qt5 libraries # kf5 and qt5 libraries
RUN pacman -S --noconfirm plasma-framework RUN pacman -S --noconfirm plasma-framework
+1 -1
View File
@@ -1,4 +1,4 @@
FROM multiarch/ubuntu-core:amd64-xenial FROM ubuntu:bionic
RUN apt-get update RUN apt-get update
# toolchain # toolchain
+1 -1
View File
@@ -1,4 +1,4 @@
FROM multiarch/ubuntu-core:i386-xenial FROM multiarch/ubuntu-core:i386-bionic
RUN apt-get update RUN apt-get update
# toolchain # toolchain
+1 -1
View File
@@ -11,4 +11,4 @@ cmake -DKDE_INSTALL_USE_QT_SYS_PATHS=ON -DCMAKE_BUILD_TYPE=Optimization -DCMAKE_
make make
# tests # tests
xvfb-run make test xvfb-run -a make test
+2 -2
View File
@@ -6,8 +6,8 @@ rm -rf build-ubuntu
mkdir build-ubuntu mkdir build-ubuntu
# patches # patches
git apply patches/qt5.6-qversionnumber.patch #git apply patches/qt5.6-qversionnumber.patch
git apply patches/qt5.5-qstringlist-and-qinfo.patch #git apply patches/qt5.5-qstringlist-and-qinfo.patch
# build # build
cd build-ubuntu cd build-ubuntu
+1 -1
View File
@@ -15,4 +15,4 @@ cmake -DKDE_INSTALL_USE_QT_SYS_PATHS=ON -DCMAKE_BUILD_TYPE=Optimization -DCMAKE_
make make
# tests # tests
xvfb-run make test xvfb-run -a make test
+1
View File
@@ -47,3 +47,4 @@ pkg
# clion settings # clion settings
.idea .idea
cmake-build*
+10 -24
View File
@@ -1,28 +1,14 @@
sudo: required sudo: required
language: generic
arch: env:
packages: - DOCKER_TAG_ARCH="arcan1s/awesome-widgets-arch"
- plasma-framework
# build deps services:
- cmake - docker
- extra-cmake-modules
- python before_install:
# test - docker build --tag="${DOCKER_TAG_ARCH}" -f ".docker/Dockerfile-arch" ".docker"
- 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: script:
- "curl -s https://raw.githubusercontent.com/mikkeloscar/arch-travis/master/arch-travis.sh | bash" - docker run --rm -v "$(pwd):/opt/build" -w /opt/build "${DOCKER_TAG_ARCH}" sh -c ".docker/build-arch.sh"
-13
View File
@@ -1,13 +0,0 @@
sudo: required
env:
- DOCKER_TAG="arcan1s/awesome-widgets"
services:
- docker
before_install:
- docker build --tag="${DOCKER_TAG}" .docker
scirpt:
- docker run "${DOCKER_TAG}" .docker/build.sh
+2
View File
@@ -11,3 +11,5 @@ Ernesto Avilés Vzqz (Spanish)
Виктор Слободян (Ukrainian) Виктор Слободян (Ukrainian)
Steve Lemuel (Chinese) Steve Lemuel (Chinese)
Mariusz Kocoń (Polish) Mariusz Kocoń (Polish)
Ibnu Daru Aji (Indonesian)
Antonio Vivace (Italian)
+1 -1
View File
@@ -38,7 +38,7 @@ 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++17**.
* Do not use C-like code: * Do not use C-like code:
* C-like style iteration if possible. Use `for (auto &foo : bar)` and * C-like style iteration if possible. Use `for (auto &foo : bar)` and
`std::for_each` instead if possible. It is also recommended to use iterators. `std::for_each` instead if possible. It is also recommended to use iterators.
+8 -1
View File
@@ -39,6 +39,7 @@ Optional dependencies
* hddtemp * hddtemp
* smartmontools * smartmontools
* music player (mpd or MPRIS supported) * music player (mpd or MPRIS supported)
* wireless_tools
Make dependencies Make dependencies
----------------- -----------------
@@ -46,6 +47,8 @@ Make dependencies
* cmake * cmake
* extra-cmake-modules * extra-cmake-modules
In addition some distros might require to install some -dev packages, e.g. the list of required packages for deb-based distros can be found [here](https://github.com/arcan1s/awesome-widgets/blob/development/.docker/Dockerfile-ubuntu-amd64#L7).
Installation Installation
------------ ------------
@@ -53,11 +56,15 @@ Installation
* install * install
mkdir build && cd build mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr ../ cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr ../sources
make && sudo make install make && sudo make install
**NOTE** on Plasma 5 it very likely requires `-DKDE_INSTALL_USE_QT_SYS_PATHS=ON` flag **NOTE** on Plasma 5 it very likely requires `-DKDE_INSTALL_USE_QT_SYS_PATHS=ON` flag
**NOTE** if you are going to build from git, you need to init submodules first, e.g.:
git submodule update --init --recursive
Additional information Additional information
====================== ======================
+2 -2
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.3 pkgver=3.4.1
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=('ce2413868cbb230e358e75a15975a1e5') md5sums=('772d1b6955ffe20a1e14c4255d04564b')
backup=('etc/xdg/plasma-dataengine-extsysmon.conf') backup=('etc/xdg/plasma-dataengine-extsysmon.conf')
prepare() { prepare() {
+4 -5
View File
@@ -1,27 +1,26 @@
--- ---
Language: Cpp Language: Cpp
AccessModifierOffset: -4 AccessModifierOffset: -4
AlignAfterOpenBracket: true AlignAfterOpenBracket: Align
AlignConsecutiveAssignments: false AlignConsecutiveAssignments: false
AlignEscapedNewlinesLeft: false
AlignOperands: true AlignOperands: true
AlignTrailingComments: true AlignTrailingComments: true
AllowAllParametersOfDeclarationOnNextLine: true AllowAllParametersOfDeclarationOnNextLine: true
AllowShortBlocksOnASingleLine: false AllowShortBlocksOnASingleLine: false
AllowShortCaseLabelsOnASingleLine: false AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: Inline AllowShortFunctionsOnASingleLine: Inline
AllowShortIfStatementsOnASingleLine: false AllowShortIfStatementsOnASingleLine: Never
AllowShortLoopsOnASingleLine: false AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: None AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakBeforeMultilineStrings: false AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: false AlwaysBreakTemplateDeclarations: No
BinPackArguments: true BinPackArguments: true
BinPackParameters: true BinPackParameters: true
BreakBeforeBinaryOperators: All BreakBeforeBinaryOperators: All
BreakBeforeBraces: Linux BreakBeforeBraces: Linux
BreakBeforeTernaryOperators: true BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: true BreakConstructorInitializersBeforeComma: true
ColumnLimit: 80 ColumnLimit: 100
CommentPragmas: '^ IWYU pragma:' CommentPragmas: '^ IWYU pragma:'
ConstructorInitializerAllOnOneLineOrOnePerLine: false ConstructorInitializerAllOnOneLineOrOnePerLine: false
ConstructorInitializerIndentWidth: 4 ConstructorInitializerIndentWidth: 4
-26
View File
@@ -1,26 +0,0 @@
[Buildset]
BuildItems=@Variant(\x00\x00\x00\t\x00\x00\x00\x00\x01\x00\x00\x00\x0b\x00\x00\x00\x00\x01\x00\x00\x00\x1e\x00a\x00w\x00e\x00s\x00o\x00m\x00e\x00-\x00w\x00i\x00d\x00g\x00e\x00t\x00s)
[CMake]
Build Directory Count=1
Current Build Directory Index=0
ProjectRootRelative=./
[CMake][CMake Build Directory 0]
Build Directory Path=file:///home/arcanis/Documents/github/awesome-widgets/build
Build Type=Optimization
CMake Binary=file:///usr/bin/cmake
Environment Profile=
Extra Arguments=
Install Directory=file:///usr
[Defines And Includes][Compiler]
Name=GCC
Path=gcc
Type=GCC
[Launch]
Launch Configurations=
[Project]
VersionControlSupport=kdevgit
-23
View File
@@ -1,23 +0,0 @@
[Buildset]
BuildItems=@Variant(\x00\x00\x00\t\x00\x00\x00\x00\x01\x00\x00\x00\x0b\x00\x00\x00\x00\x01\x00\x00\x00\x1e\x00a\x00w\x00e\x00s\x00o\x00m\x00e\x00-\x00w\x00i\x00d\x00g\x00e\x00t\x00s)
[CMake]
Build Directory Count=1
Current Build Directory Index=0
ProjectRootRelative=./
[CMake][CMake Build Directory 0]
Build Directory Path=file:///home/arcanis/Documents/github/awesome-widgets/build
Build Type=Release
CMake Binary=file:///usr/bin/cmake
Environment Profile=
Extra Arguments=
Install Directory=file:///usr
[Defines And Includes][Compiler]
Name=GCC
Path=gcc
Type=GCC
[Project]
VersionControlSupport=kdevgit
+1 -1
View File
@@ -12,7 +12,7 @@ QReplyTimeout::QReplyTimeout(QNetworkReply *reply, const int timeout)
void QReplyTimeout::timeout() void QReplyTimeout::timeout()
{ {
QNetworkReply *reply = static_cast<QNetworkReply *>(parent()); auto *reply = dynamic_cast<QNetworkReply *>(parent());
if (reply->isRunning()) if (reply->isRunning())
reply->close(); reply->close();
} }
+13 -30
View File
@@ -1,12 +1,13 @@
cmake_minimum_required(VERSION 2.8.12) cmake_minimum_required(VERSION 2.8.12)
# some fucking magic # some fucking magic
cmake_policy(SET CMP0003 OLD)
cmake_policy(SET CMP0002 OLD)
cmake_policy(SET CMP0011 NEW) cmake_policy(SET CMP0011 NEW)
cmake_policy(SET CMP0015 NEW) cmake_policy(SET CMP0015 NEW)
if (POLICY CMP0063) if (POLICY CMP0063)
cmake_policy(SET CMP0063 OLD) cmake_policy(SET CMP0063 NEW)
endif ()
if (POLICY CMP0071)
cmake_policy(SET CMP0071 NEW)
endif () endif ()
project(awesomewidgets) project(awesomewidgets)
@@ -14,8 +15,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 "4")
set(PROJECT_VERSION_PATCH "3") set(PROJECT_VERSION_PATCH "1")
set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}") set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}")
# append git version if any # append git version if any
set(PROJECT_COMMIT_SHA "Commit hash" CACHE INTERNAL "") set(PROJECT_COMMIT_SHA "Commit hash" CACHE INTERNAL "")
@@ -41,40 +42,23 @@ option(BUILD_TESTING "Build with additional test abilities" OFF)
set(PROJECT_CHANGELOG "Changelog" CACHE INTERNAL "") set(PROJECT_CHANGELOG "Changelog" CACHE INTERNAL "")
include(changelog.cmake) include(changelog.cmake)
# flags # directories
if (CMAKE_COMPILER_IS_GNUCXX)
set(CMAKE_CXX_FLAGS "-Wall -Wno-cpp -std=c++11")
set(CMAKE_CXX_FLAGS_DEBUG "-g -O0")
set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG")
set(CMAKE_CXX_FLAGS_OPTIMIZATION "-Ofast -DNDEBUG")
# avoid newer gcc warnings
add_definitions(-D_DEFAULT_SOURCE)
elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
set(CMAKE_CXX_FLAGS "-Wall -std=c++11")
set(CMAKE_CXX_FLAGS_DEBUG "-g -O0")
set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG")
set(CMAKE_CXX_FLAGS_OPTIMIZATION "-Ofast -DNDEBUG")
# linker flags
else ()
message(FATAL_ERROR "Unknown compiler")
endif ()
if (CMAKE_BUILD_TYPE MATCHES Debug)
set(CMAKE_VERBOSE_MAKEFILE ON)
endif ()
# required by successfully coverity and cppcheck build
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(PROJECT_TRDPARTY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty) set(PROJECT_TRDPARTY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty)
set(PROJECT_LIBRARY awesomewidgets) set(PROJECT_LIBRARY awesomewidgets)
set(PROJECT_MONITORSOURCES extsysmonsources) set(PROJECT_MONITORSOURCES extsysmonsources)
# modules
include(compiler.cmake)
include(libraries.cmake) include(libraries.cmake)
include(clang-format.cmake) include(clang-format.cmake)
include(cppcheck.cmake) include(cppcheck.cmake)
include(coverity.cmake) include(coverity.cmake)
# pre-configure
get_directory_property(CMAKE_DEFINITIONS COMPILE_DEFINITIONS) get_directory_property(CMAKE_DEFINITIONS COMPILE_DEFINITIONS)
configure_file(${CMAKE_SOURCE_DIR}/version.h.in ${CMAKE_CURRENT_BINARY_DIR}/version.h) configure_file(${CMAKE_SOURCE_DIR}/version.h.in ${CMAKE_CURRENT_BINARY_DIR}/version.h)
# build components
add_subdirectory(awesomewidgets) add_subdirectory(awesomewidgets)
add_subdirectory(extsysmonsources) add_subdirectory(extsysmonsources)
add_subdirectory(extsysmon) add_subdirectory(extsysmon)
@@ -90,4 +74,3 @@ if (BUILD_TESTING)
endif () endif ()
include(packages-recipe.cmake) include(packages-recipe.cmake)
+32 -63
View File
@@ -21,16 +21,12 @@
#include "awdebug.h" #include "awdebug.h"
Q_LOGGING_CATEGORY(LOG_AW, "org.kde.plasma.awesomewidget", Q_LOGGING_CATEGORY(LOG_AW, "org.kde.plasma.awesomewidget", QtMsgType::QtWarningMsg)
QtMsgType::QtWarningMsg)
Q_LOGGING_CATEGORY(LOG_DBUS, "org.kde.plasma.awdbus", QtMsgType::QtWarningMsg) Q_LOGGING_CATEGORY(LOG_DBUS, "org.kde.plasma.awdbus", QtMsgType::QtWarningMsg)
Q_LOGGING_CATEGORY(LOG_DP, "org.kde.plasma.desktoppanel", Q_LOGGING_CATEGORY(LOG_DP, "org.kde.plasma.desktoppanel", QtMsgType::QtWarningMsg)
QtMsgType::QtWarningMsg)
Q_LOGGING_CATEGORY(LOG_ESM, "org.kde.plasma.extsysmon", QtMsgType::QtWarningMsg) Q_LOGGING_CATEGORY(LOG_ESM, "org.kde.plasma.extsysmon", QtMsgType::QtWarningMsg)
Q_LOGGING_CATEGORY(LOG_ESS, "org.kde.plasma.extsysmonsources", Q_LOGGING_CATEGORY(LOG_ESS, "org.kde.plasma.extsysmonsources", QtMsgType::QtWarningMsg)
QtMsgType::QtWarningMsg) Q_LOGGING_CATEGORY(LOG_LIB, "org.kde.plasma.awesomewidgets", QtMsgType::QtWarningMsg)
Q_LOGGING_CATEGORY(LOG_LIB, "org.kde.plasma.awesomewidgets",
QtMsgType::QtWarningMsg)
QString AWDebug::getAboutText(const QString &_type) QString AWDebug::getAboutText(const QString &_type)
@@ -46,15 +42,9 @@ QString AWDebug::getAboutText(const QString &_type)
text = i18n("A set of minimalistic plasmoid widgets"); text = i18n("A set of minimalistic plasmoid widgets");
} else if (_type == "links") { } else if (_type == "links") {
text = i18n("Links:") + "<ul>" text = i18n("Links:") + "<ul>"
+ QString("<li><a href=\"%1\">%2</a></li>") + QString("<li><a href=\"%1\">%2</a></li>").arg(HOMEPAGE).arg(i18n("Homepage"))
.arg(HOMEPAGE) + QString("<li><a href=\"%1\">%2</a></li>").arg(REPOSITORY).arg(i18n("Repository"))
.arg(i18n("Homepage")) + QString("<li><a href=\"%1\">%2</a></li>").arg(BUGTRACKER).arg(i18n("Bugtracker"))
+ 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>") + QString("<li><a href=\"%1\">%2</a></li>")
.arg(TRANSLATION) .arg(TRANSLATION)
.arg(i18n("Translation issue")) .arg(i18n("Translation issue"))
@@ -70,28 +60,22 @@ QString AWDebug::getAboutText(const QString &_type)
.arg(DATE) .arg(DATE)
.arg(EMAIL) .arg(EMAIL)
.arg(AUTHOR) .arg(AUTHOR)
+ i18n("This software is licensed under %1", LICENSE) + i18nc("This software is licensed under %1", LICENSE) + "</small>";
+ "</small>";
} else if (_type == "translators") { } else if (_type == "translators") {
QStringList translatorList = QString(TRANSLATORS).split(','); QStringList translatorList = QString(TRANSLATORS).split(',');
for (auto &translator : translatorList) for (auto &translator : translatorList)
translator = QString("<li>%1</li>").arg(translator); translator = QString("<li>%1</li>").arg(translator);
text text = i18n("Translators:") + "<ul>" + translatorList.join("") + "</ul>";
= i18n("Translators:") + "<ul>" + translatorList.join("") + "</ul>";
} else if (_type == "3rdparty") { } else if (_type == "3rdparty") {
QStringList trdPartyList QStringList trdPartyList = QString(TRDPARTY_LICENSE).split(';', Qt::SkipEmptyParts);
= QString(TRDPARTY_LICENSE).split(';', QString::SkipEmptyParts);
for (int i = 0; i < trdPartyList.count(); i++) for (int i = 0; i < trdPartyList.count(); i++)
trdPartyList[i] trdPartyList[i] = QString("<li><a href=\"%3\">%1</a> (%2 license)</li>")
= QString("<li><a href=\"%3\">%1</a> (%2 license)</li>") .arg(trdPartyList.at(i).split(',')[0])
.arg(trdPartyList.at(i).split(',')[0]) .arg(trdPartyList.at(i).split(',')[1])
.arg(trdPartyList.at(i).split(',')[1]) .arg(trdPartyList.at(i).split(',')[2]);
.arg(trdPartyList.at(i).split(',')[2]); text = i18n("This software uses:") + "<ul>" + trdPartyList.join("") + "</ul>";
text = i18n("This software uses:") + "<ul>" + trdPartyList.join("")
+ "</ul>";
} else if (_type == "thanks") { } else if (_type == "thanks") {
QStringList thanks QStringList thanks = QString(SPECIAL_THANKS).split(';', Qt::SkipEmptyParts);
= QString(SPECIAL_THANKS).split(';', QString::SkipEmptyParts);
for (int i = 0; i < thanks.count(); i++) for (int i = 0; i < thanks.count(); i++)
thanks[i] = QString("<li><a href=\"%2\">%1</a></li>") thanks[i] = QString("<li><a href=\"%2\">%1</a></li>")
.arg(thanks.at(i).split(',')[0]) .arg(thanks.at(i).split(',')[0])
@@ -117,10 +101,8 @@ QStringList AWDebug::getBuildData()
metadata.append(QString(" AW_GRAPHITEM_API: %1").arg(AW_GRAPHITEM_API)); metadata.append(QString(" AW_GRAPHITEM_API: %1").arg(AW_GRAPHITEM_API));
metadata.append(QString(" AW_EXTQUOTES_API: %1").arg(AW_EXTQUOTES_API)); metadata.append(QString(" AW_EXTQUOTES_API: %1").arg(AW_EXTQUOTES_API));
metadata.append(QString(" AW_EXTSCRIPT_API: %1").arg(AW_EXTSCRIPT_API)); metadata.append(QString(" AW_EXTSCRIPT_API: %1").arg(AW_EXTSCRIPT_API));
metadata.append( metadata.append(QString(" AW_EXTUPGRADE_API: %1").arg(AW_EXTUPGRADE_API));
QString(" AW_EXTUPGRADE_API: %1").arg(AW_EXTUPGRADE_API)); metadata.append(QString(" AW_EXTWEATHER_API: %1").arg(AW_EXTWEATHER_API));
metadata.append(
QString(" AW_EXTWEATHER_API: %1").arg(AW_EXTWEATHER_API));
metadata.append(QString(" AW_FORMATTER_API: %1").arg(AW_FORMATTER_API)); metadata.append(QString(" AW_FORMATTER_API: %1").arg(AW_FORMATTER_API));
metadata.append(QString(" REQUEST_TIMEOUT: %1").arg(REQUEST_TIMEOUT)); metadata.append(QString(" REQUEST_TIMEOUT: %1").arg(REQUEST_TIMEOUT));
metadata.append(QString(" TIME_KEYS: %1").arg(TIME_KEYS)); metadata.append(QString(" TIME_KEYS: %1").arg(TIME_KEYS));
@@ -128,41 +110,28 @@ QStringList AWDebug::getBuildData()
// cmake properties // cmake properties
metadata.append("cmake properties:"); metadata.append("cmake properties:");
metadata.append(QString(" CMAKE_BUILD_TYPE: %1").arg(CMAKE_BUILD_TYPE)); metadata.append(QString(" CMAKE_BUILD_TYPE: %1").arg(CMAKE_BUILD_TYPE));
metadata.append( metadata.append(QString(" CMAKE_CXX_COMPILER: %1").arg(CMAKE_CXX_COMPILER));
QString(" CMAKE_CXX_COMPILER: %1").arg(CMAKE_CXX_COMPILER));
metadata.append(QString(" CMAKE_CXX_FLAGS: %1").arg(CMAKE_CXX_FLAGS)); metadata.append(QString(" CMAKE_CXX_FLAGS: %1").arg(CMAKE_CXX_FLAGS));
metadata.append(QString(" CMAKE_CXX_FLAGS_DEBUG: %1").arg(CMAKE_CXX_FLAGS_DEBUG));
metadata.append(QString(" CMAKE_CXX_FLAGS_RELEASE: %1").arg(CMAKE_CXX_FLAGS_RELEASE));
metadata.append( metadata.append(
QString(" CMAKE_CXX_FLAGS_DEBUG: %1").arg(CMAKE_CXX_FLAGS_DEBUG)); QString(" CMAKE_CXX_FLAGS_OPTIMIZATION: %1").arg(CMAKE_CXX_FLAGS_OPTIMIZATION));
metadata.append(QString(" CMAKE_CXX_FLAGS_RELEASE: %1") metadata.append(QString(" CMAKE_DEFINITIONS: %1").arg(CMAKE_DEFINITIONS));
.arg(CMAKE_CXX_FLAGS_RELEASE)); metadata.append(QString(" CMAKE_INSTALL_PREFIX: %1").arg(CMAKE_INSTALL_PREFIX));
metadata.append(QString(" CMAKE_CXX_FLAGS_OPTIMIZATION: %1") metadata.append(QString(" CMAKE_MODULE_LINKER_FLAGS: %1").arg(CMAKE_MODULE_LINKER_FLAGS));
.arg(CMAKE_CXX_FLAGS_OPTIMIZATION)); metadata.append(QString(" CMAKE_SHARED_LINKER_FLAGS: %1").arg(CMAKE_SHARED_LINKER_FLAGS));
metadata.append(
QString(" CMAKE_DEFINITIONS: %1").arg(CMAKE_DEFINITIONS));
metadata.append(
QString(" CMAKE_INSTALL_PREFIX: %1").arg(CMAKE_INSTALL_PREFIX));
metadata.append(QString(" CMAKE_MODULE_LINKER_FLAGS: %1")
.arg(CMAKE_MODULE_LINKER_FLAGS));
metadata.append(QString(" CMAKE_SHARED_LINKER_FLAGS: %1")
.arg(CMAKE_SHARED_LINKER_FLAGS));
// components // components
metadata.append("Components data:"); metadata.append("Components data:");
metadata.append(QString(" BUILD_PLASMOIDS: %1").arg(BUILD_PLASMOIDS)); metadata.append(QString(" BUILD_PLASMOIDS: %1").arg(BUILD_PLASMOIDS));
metadata.append( metadata.append(QString(" BUILD_DEB_PACKAGE: %1").arg(BUILD_DEB_PACKAGE));
QString(" BUILD_DEB_PACKAGE: %1").arg(BUILD_DEB_PACKAGE)); metadata.append(QString(" BUILD_RPM_PACKAGE: %1").arg(BUILD_RPM_PACKAGE));
metadata.append( metadata.append(QString(" CLANGFORMAT_EXECUTABLE: %1").arg(CLANGFORMAT_EXECUTABLE));
QString(" BUILD_RPM_PACKAGE: %1").arg(BUILD_RPM_PACKAGE));
metadata.append(
QString(" CLANGFORMAT_EXECUTABLE: %1").arg(CLANGFORMAT_EXECUTABLE));
metadata.append(QString(" COVERITY_COMMENT: %1").arg(COVERITY_COMMENT)); metadata.append(QString(" COVERITY_COMMENT: %1").arg(COVERITY_COMMENT));
metadata.append( metadata.append(QString(" COVERITY_DIRECTORY: %1").arg(COVERITY_DIRECTORY));
QString(" COVERITY_DIRECTORY: %1").arg(COVERITY_DIRECTORY));
metadata.append(QString(" COVERITY_EMAIL: %1").arg(COVERITY_EMAIL)); metadata.append(QString(" COVERITY_EMAIL: %1").arg(COVERITY_EMAIL));
metadata.append( metadata.append(QString(" COVERITY_EXECUTABLE: %1").arg(COVERITY_EXECUTABLE));
QString(" COVERITY_EXECUTABLE: %1").arg(COVERITY_EXECUTABLE));
metadata.append(QString(" COVERITY_URL: %1").arg(COVERITY_URL)); metadata.append(QString(" COVERITY_URL: %1").arg(COVERITY_URL));
metadata.append( metadata.append(QString(" CPPCHECK_EXECUTABLE: %1").arg(CPPCHECK_EXECUTABLE));
QString(" CPPCHECK_EXECUTABLE: %1").arg(CPPCHECK_EXECUTABLE));
// additional functions // additional functions
metadata.append(QString(" PROP_FUTURE: %1").arg(PROP_FUTURE)); metadata.append(QString(" PROP_FUTURE: %1").arg(PROP_FUTURE));
metadata.append(QString(" PROP_LOAD: %1").arg(PROP_LOAD)); metadata.append(QString(" PROP_LOAD: %1").arg(PROP_LOAD));
+1 -1
View File
@@ -33,7 +33,7 @@ const char LOG_FORMAT[] = "[%{time "
QString getAboutText(const QString &_type); QString getAboutText(const QString &_type);
QStringList getBuildData(); QStringList getBuildData();
} } // namespace AWDebug
Q_DECLARE_LOGGING_CATEGORY(LOG_AW) Q_DECLARE_LOGGING_CATEGORY(LOG_AW)
-1
View File
@@ -15,7 +15,6 @@ Icon=utilities-system-monitor
X-KDE-ServiceTypes=Plasma/Applet X-KDE-ServiceTypes=Plasma/Applet
X-Plasma-API=declarativeappletscript X-Plasma-API=declarativeappletscript
X-Plasma-MainScript=ui/main.qml X-Plasma-MainScript=ui/main.qml
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
@@ -30,6 +30,8 @@ Item {
width: childrenRect.width width: childrenRect.width
height: childrenRect.height height: childrenRect.height
property bool debug: awActions.isDebugEnabled()
AboutTab { AboutTab {
textProvider: awActions textProvider: awActions
} }
@@ -15,12 +15,11 @@ Icon=utilities-system-monitor
X-KDE-ServiceTypes=Plasma/Applet X-KDE-ServiceTypes=Plasma/Applet
X-Plasma-API=declarativeappletscript X-Plasma-API=declarativeappletscript
X-Plasma-MainScript=ui/main.qml X-Plasma-MainScript=ui/main.qml
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.3 X-KDE-PluginInfo-Version=3.4.1
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=
@@ -21,18 +21,17 @@
#include <KI18n/KLocalizedString> #include <KI18n/KLocalizedString>
#include <QPushButton> #include <QPushButton>
#include <utility>
#include "awabstractselector.h" #include "awabstractselector.h"
#include "awdebug.h" #include "awdebug.h"
AWAbstractPairConfig::AWAbstractPairConfig(QWidget *_parent, AWAbstractPairConfig::AWAbstractPairConfig(QWidget *_parent, const bool _hasEdit, QStringList _keys)
const bool _hasEdit,
const QStringList &_keys)
: QDialog(_parent) : QDialog(_parent)
, ui(new Ui::AWAbstractPairConfig) , ui(new Ui::AWAbstractPairConfig)
, m_hasEdit(_hasEdit) , m_hasEdit(_hasEdit)
, m_keys(_keys) , m_keys(std::move(_keys))
{ {
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
@@ -43,8 +42,7 @@ AWAbstractPairConfig::AWAbstractPairConfig(QWidget *_parent,
// edit feature // edit feature
if (m_hasEdit) { if (m_hasEdit) {
m_editButton = ui->buttonBox->addButton(i18n("Edit"), m_editButton = ui->buttonBox->addButton(i18n("Edit"), QDialogButtonBox::ActionRole);
QDialogButtonBox::ActionRole);
connect(m_editButton, SIGNAL(clicked(bool)), this, SLOT(edit())); connect(m_editButton, SIGNAL(clicked(bool)), this, SLOT(edit()));
} }
} }
@@ -86,10 +84,8 @@ void AWAbstractPairConfig::edit()
void AWAbstractPairConfig::updateUi() void AWAbstractPairConfig::updateUi()
{ {
QPair<QString, QString> current QPair<QString, QString> current = dynamic_cast<AWAbstractSelector *>(sender())->current();
= static_cast<AWAbstractSelector *>(sender())->current(); int index = m_selectors.indexOf(dynamic_cast<AWAbstractSelector *>(sender()));
int index
= m_selectors.indexOf(static_cast<AWAbstractSelector *>(sender()));
if ((current.first.isEmpty()) && (current.second.isEmpty())) { if ((current.first.isEmpty()) && (current.second.isEmpty())) {
// remove current selector if it is empty and does not last // remove current selector if it is empty and does not last
@@ -108,15 +104,13 @@ void AWAbstractPairConfig::updateUi()
} }
void AWAbstractPairConfig::addSelector(const QStringList &_keys, void AWAbstractPairConfig::addSelector(const QStringList &_keys, const QStringList &_values,
const QStringList &_values,
const QPair<QString, QString> &_current) const QPair<QString, QString> &_current)
{ {
qCDebug(LOG_AW) << "Add selector with keys" << _keys << "values" << _values qCDebug(LOG_AW) << "Add selector with keys" << _keys << "values" << _values
<< "and current ones" << _current; << "and current ones" << _current;
AWAbstractSelector *selector auto *selector = new AWAbstractSelector(ui->scrollAreaWidgetContents, m_editable);
= new AWAbstractSelector(ui->scrollAreaWidgetContents, m_editable);
selector->init(_keys, _values, _current); selector->init(_keys, _values, _current);
ui->verticalLayout->insertWidget(ui->verticalLayout->count() - 1, selector); ui->verticalLayout->insertWidget(ui->verticalLayout->count() - 1, selector);
connect(selector, SIGNAL(selectionChanged()), this, SLOT(updateUi())); connect(selector, SIGNAL(selectionChanged()), this, SLOT(updateUi()));
@@ -127,8 +121,7 @@ void AWAbstractPairConfig::addSelector(const QStringList &_keys,
void AWAbstractPairConfig::clearSelectors() void AWAbstractPairConfig::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);
selector->deleteLater(); selector->deleteLater();
} }
@@ -148,15 +141,17 @@ void AWAbstractPairConfig::execDialog()
} }
// save configuration if required // save configuration if required
auto status = true;
switch (ret) { switch (ret) {
case 0: case 0:
break; break;
case 1: case 1:
default: default:
m_helper->writeItems(data); status &= m_helper->writeItems(data);
m_helper->removeUnusedKeys(data.keys()); status &= m_helper->removeUnusedKeys(data.keys());
break; break;
} }
qCDebug(LOG_AW) << "Configuration save status" << status;
} }
@@ -167,8 +162,7 @@ QPair<QStringList, QStringList> AWAbstractPairConfig::initKeys() const
left.append(m_helper->leftKeys().isEmpty() ? m_keys : m_helper->leftKeys()); left.append(m_helper->leftKeys().isEmpty() ? m_keys : m_helper->leftKeys());
left.sort(); left.sort();
QStringList right = {""}; QStringList right = {""};
right.append(m_helper->rightKeys().isEmpty() ? m_keys right.append(m_helper->rightKeys().isEmpty() ? m_keys : m_helper->rightKeys());
: m_helper->rightKeys());
right.sort(); right.sort();
return QPair<QStringList, QStringList>(left, right); return QPair<QStringList, QStringList>(left, right);
@@ -182,8 +176,7 @@ void AWAbstractPairConfig::updateDialog()
auto keys = initKeys(); auto keys = initKeys();
for (auto &key : m_helper->keys()) for (auto &key : m_helper->keys())
addSelector(keys.first, keys.second, addSelector(keys.first, keys.second, QPair<QString, QString>(key, m_helper->pairs()[key]));
QPair<QString, QString>(key, m_helper->pairs()[key]));
// empty one // empty one
addSelector(keys.first, keys.second, QPair<QString, QString>()); addSelector(keys.first, keys.second, QPair<QString, QString>());
} }
@@ -35,19 +35,18 @@ class AWAbstractPairConfig : public QDialog
Q_OBJECT Q_OBJECT
public: public:
explicit AWAbstractPairConfig(QWidget *_parent = nullptr, explicit AWAbstractPairConfig(QWidget *_parent = nullptr, bool _hasEdit = false,
const bool _hasEdit = false, QStringList _keys = QStringList());
const QStringList &_keys = QStringList()); ~AWAbstractPairConfig() override;
virtual ~AWAbstractPairConfig();
template <class T> void initHelper() template <class T> void initHelper()
{ {
if (m_helper)
delete m_helper; delete m_helper;
m_helper = new T(this); m_helper = new T(this);
} }
void showDialog(); void showDialog();
// properties // properties
void setEditable(const bool _first, const bool _second); void setEditable(bool _first, bool _second);
private slots: private slots:
void edit(); void edit();
@@ -67,7 +66,7 @@ private:
const QPair<QString, QString> &_current); const QPair<QString, QString> &_current);
void clearSelectors(); void clearSelectors();
void execDialog(); void execDialog();
QPair<QStringList, QStringList> initKeys() const; [[nodiscard]] QPair<QStringList, QStringList> initKeys() const;
void updateDialog(); void updateDialog();
}; };
@@ -19,18 +19,18 @@
#include <QSettings> #include <QSettings>
#include <QStandardPaths> #include <QStandardPaths>
#include <utility>
#include "awdebug.h" #include "awdebug.h"
AWAbstractPairHelper::AWAbstractPairHelper(const QString &_filePath, AWAbstractPairHelper::AWAbstractPairHelper(QString _filePath, QString _section)
const QString &_section) : m_filePath(std::move(_filePath))
: m_filePath(_filePath) , m_section(std::move(_section))
, m_section(_section)
{ {
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
initItems(); AWAbstractPairHelper::initItems();
} }
@@ -58,12 +58,19 @@ QStringList AWAbstractPairHelper::values() const
} }
QSet<QString> AWAbstractPairHelper::valuesSet() const
{
auto values = m_pairs.values();
return QSet(values.cbegin(), values.cend());
}
void AWAbstractPairHelper::initItems() void AWAbstractPairHelper::initItems()
{ {
m_pairs.clear(); m_pairs.clear();
QStringList configs = QStandardPaths::locateAll( QStringList configs
QStandardPaths::GenericDataLocation, m_filePath); = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, m_filePath);
for (auto &fileName : configs) { for (auto &fileName : configs) {
QSettings settings(fileName, QSettings::IniFormat); QSettings settings(fileName, QSettings::IniFormat);
@@ -86,15 +93,14 @@ void AWAbstractPairHelper::initItems()
} }
bool AWAbstractPairHelper::writeItems( bool AWAbstractPairHelper::writeItems(const QHash<QString, QString> &_configuration) const
const QHash<QString, QString> &_configuration) const
{ {
qCDebug(LOG_AW) << "Write configuration" << _configuration; qCDebug(LOG_AW) << "Write configuration" << _configuration;
QString fileName = QString("%1/%2") QString fileName
.arg(QStandardPaths::writableLocation( = QString("%1/%2")
QStandardPaths::GenericDataLocation)) .arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation))
.arg(m_filePath); .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;
@@ -113,10 +119,10 @@ bool AWAbstractPairHelper::removeUnusedKeys(const QStringList &_keys) const
{ {
qCDebug(LOG_AW) << "Remove keys" << _keys; qCDebug(LOG_AW) << "Remove keys" << _keys;
QString fileName = QString("%1/%2") QString fileName
.arg(QStandardPaths::writableLocation( = QString("%1/%2")
QStandardPaths::GenericDataLocation)) .arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation))
.arg(m_filePath); .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;
@@ -132,4 +138,4 @@ bool AWAbstractPairHelper::removeUnusedKeys(const QStringList &_keys) const
settings.sync(); settings.sync();
return (settings.status() == QSettings::NoError); return (settings.status() == QSettings::NoError);
} }
@@ -25,17 +25,16 @@
class AWAbstractPairHelper class AWAbstractPairHelper
{ {
public: public:
explicit AWAbstractPairHelper(const QString &_filePath = "", explicit AWAbstractPairHelper(QString _filePath = "", QString _section = "");
const QString &_section = "");
virtual ~AWAbstractPairHelper(); virtual ~AWAbstractPairHelper();
QStringList keys() const; [[nodiscard]] QStringList keys() const;
QHash<QString, QString> pairs() const; [[nodiscard]] QHash<QString, QString> pairs() const;
QStringList values() const; [[nodiscard]] QStringList values() const;
[[nodiscard]] QSet<QString> valuesSet() const;
// read-write methods // read-write methods
virtual void initItems(); virtual void initItems();
virtual bool [[nodiscard]] virtual bool writeItems(const QHash<QString, QString> &_configuration) const;
writeItems(const QHash<QString, QString> &_configuration) const; [[nodiscard]] virtual bool removeUnusedKeys(const QStringList &_keys) const;
virtual bool removeUnusedKeys(const QStringList &_keys) const;
// configuration related // configuration related
virtual void editPairs() = 0; virtual void editPairs() = 0;
virtual QStringList leftKeys() = 0; virtual QStringList leftKeys() = 0;
@@ -21,8 +21,7 @@
#include "awdebug.h" #include "awdebug.h"
AWAbstractSelector::AWAbstractSelector(QWidget *_parent, AWAbstractSelector::AWAbstractSelector(QWidget *_parent, const QPair<bool, bool> &_editable)
const QPair<bool, bool> &_editable)
: QWidget(_parent) : QWidget(_parent)
, ui(new Ui::AWAbstractSelector) , ui(new Ui::AWAbstractSelector)
{ {
@@ -32,10 +31,8 @@ AWAbstractSelector::AWAbstractSelector(QWidget *_parent,
ui->comboBox_key->setEditable(_editable.first); ui->comboBox_key->setEditable(_editable.first);
ui->comboBox_value->setEditable(_editable.second); ui->comboBox_value->setEditable(_editable.second);
connect(ui->comboBox_key, SIGNAL(currentIndexChanged(int)), this, connect(ui->comboBox_key, SIGNAL(currentIndexChanged(int)), this, SIGNAL(selectionChanged()));
SIGNAL(selectionChanged())); connect(ui->comboBox_value, SIGNAL(currentIndexChanged(int)), this, SIGNAL(selectionChanged()));
connect(ui->comboBox_value, SIGNAL(currentIndexChanged(int)), this,
SIGNAL(selectionChanged()));
} }
@@ -56,18 +53,15 @@ 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 << "not found in default ones";
qCWarning(LOG_AW) << "Invalid current value" << _current
<< "not found in default ones";
return; return;
} }
qCDebug(LOG_AW) << "Init selector with keys" << _keys << "and values" qCDebug(LOG_AW) << "Init selector with keys" << _keys << "and values" << _values
<< _values << "and current ones are" << _current; << "and current ones are" << _current;
// set data // set data
ui->comboBox_key->clear(); ui->comboBox_key->clear();
@@ -33,10 +33,9 @@ class AWAbstractSelector : public QWidget
public: public:
explicit AWAbstractSelector(QWidget *_parent = nullptr, explicit AWAbstractSelector(QWidget *_parent = nullptr,
const QPair<bool, bool> &_editable const QPair<bool, bool> &_editable = {false, false});
= {false, false}); ~AWAbstractSelector() override;
virtual ~AWAbstractSelector(); [[nodiscard]] 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);
+19 -25
View File
@@ -55,14 +55,13 @@ void AWActions::checkUpdates(const bool _showAnyway)
} }
QString AWActions::getFileContent(const QString &_path) const QString AWActions::getFileContent(const QString &_path)
{ {
qCDebug(LOG_AW) << "Get content from file" << _path; qCDebug(LOG_AW) << "Get content from file" << _path;
QFile inputFile(_path); QFile inputFile(_path);
if (!inputFile.open(QIODevice::ReadOnly | QIODevice::Text)) { if (!inputFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
qCWarning(LOG_AW) << "Could not open file as text" qCWarning(LOG_AW) << "Could not open file as text" << inputFile.fileName();
<< inputFile.fileName();
return ""; return "";
} }
@@ -73,37 +72,36 @@ QString AWActions::getFileContent(const QString &_path) const
// HACK: since QML could not use QLoggingCategory I need this hack // HACK: since QML could not use QLoggingCategory I need this hack
bool AWActions::isDebugEnabled() const bool AWActions::isDebugEnabled()
{ {
return LOG_AW().isDebugEnabled(); return LOG_AW().isDebugEnabled();
} }
bool AWActions::runCmd(const QString &_cmd) const bool AWActions::runCmd(const QString &_cmd, const QStringList &_args)
{ {
qCDebug(LOG_AW) << "Cmd" << _cmd; qCDebug(LOG_AW) << "Cmd" << _cmd << "args" << _args;
sendNotification(QString("Info"), i18n("Run %1", _cmd)); sendNotification(QString("Info"), i18n("Run %1", _cmd));
return QProcess::startDetached(_cmd); return QProcess::startDetached(_cmd, _args);
} }
// HACK: this method uses variable from version.h // HACK: this method uses variable from version.h
void AWActions::showReadme() const void AWActions::showReadme()
{ {
QDesktopServices::openUrl(QUrl(HOMEPAGE)); QDesktopServices::openUrl(QUrl(HOMEPAGE));
} }
void AWActions::showLegacyInfo() const void AWActions::showLegacyInfo()
{ {
QMessageBox *msgBox = new QMessageBox(nullptr); auto *msgBox = new QMessageBox(nullptr);
msgBox->setAttribute(Qt::WA_DeleteOnClose); msgBox->setAttribute(Qt::WA_DeleteOnClose);
msgBox->setModal(false); msgBox->setModal(false);
msgBox->setWindowTitle(i18n("Not supported")); msgBox->setWindowTitle(i18n("Not supported"));
msgBox->setText( msgBox->setText(i18n("You are using mammoth's Qt version, try to update it first"));
i18n("You are using mammoth's Qt version, try to update it first"));
msgBox->setStandardButtons(QMessageBox::Ok); msgBox->setStandardButtons(QMessageBox::Ok);
msgBox->setIcon(QMessageBox::Information); msgBox->setIcon(QMessageBox::Information);
@@ -112,7 +110,7 @@ void AWActions::showLegacyInfo() const
// HACK: this method uses variables from version.h // HACK: this method uses variables from version.h
QString AWActions::getAboutText(const QString &_type) const QString AWActions::getAboutText(const QString &_type)
{ {
qCDebug(LOG_AW) << "Type" << _type; qCDebug(LOG_AW) << "Type" << _type;
@@ -120,17 +118,15 @@ QString AWActions::getAboutText(const QString &_type) const
} }
QVariantMap AWActions::getFont(const QVariantMap &_defaultFont) const QVariantMap AWActions::getFont(const QVariantMap &_defaultFont)
{ {
qCDebug(LOG_AW) << "Default font is" << _defaultFont; qCDebug(LOG_AW) << "Default font is" << _defaultFont;
QVariantMap fontMap; QVariantMap fontMap;
int ret = 0; int ret = 0;
CFont defaultCFont CFont defaultCFont = CFont(_defaultFont["family"].toString(), _defaultFont["size"].toInt(), 400,
= CFont(_defaultFont["family"].toString(), _defaultFont["size"].toInt(), false, _defaultFont["color"].toString());
400, false, _defaultFont["color"].toString()); CFont font = CFontDialog::getFont(i18n("Select font"), defaultCFont, false, false, &ret);
CFont font = CFontDialog::getFont(i18n("Select font"), defaultCFont, false,
false, &ret);
fontMap["applied"] = ret; fontMap["applied"] = ret;
fontMap["color"] = font.color().name(); fontMap["color"] = font.color().name();
@@ -142,13 +138,11 @@ QVariantMap AWActions::getFont(const QVariantMap &_defaultFont) const
// to avoid additional object definition this method is static // to avoid additional object definition this method is static
void AWActions::sendNotification(const QString &_eventId, void AWActions::sendNotification(const QString &_eventId, const QString &_message)
const QString &_message)
{ {
qCDebug(LOG_AW) << "Event" << _eventId << "with message" << _message; qCDebug(LOG_AW) << "Event" << _eventId << "with message" << _message;
KNotification *notification = KNotification::event( KNotification *notification
_eventId, QString("Awesome Widget ::: %1").arg(_eventId), _message); = KNotification::event(_eventId, QString("Awesome Widget ::: %1").arg(_eventId), _message);
notification->setComponentName( notification->setComponentName("plasma-applet-org.kde.plasma.awesome-widget");
"plasma-applet-org.kde.plasma.awesome-widget");
} }
+10 -11
View File
@@ -31,20 +31,19 @@ class AWActions : public QObject
public: public:
explicit AWActions(QObject *_parent = nullptr); explicit AWActions(QObject *_parent = nullptr);
virtual ~AWActions(); ~AWActions() override;
Q_INVOKABLE void checkUpdates(const bool _showAnyway = false); Q_INVOKABLE void checkUpdates(bool _showAnyway = false);
Q_INVOKABLE QString getFileContent(const QString &_path) const; Q_INVOKABLE static QString getFileContent(const QString &_path);
Q_INVOKABLE bool isDebugEnabled() const; Q_INVOKABLE static bool isDebugEnabled();
Q_INVOKABLE bool runCmd(const QString &_cmd) const; Q_INVOKABLE static bool runCmd(const QString &_cmd, const QStringList &_args);
Q_INVOKABLE void showLegacyInfo() const; Q_INVOKABLE static void showLegacyInfo();
Q_INVOKABLE void showReadme() const; Q_INVOKABLE static void showReadme();
// configuration slots // configuration slots
Q_INVOKABLE QString getAboutText(const QString &_type) const; Q_INVOKABLE static QString getAboutText(const QString &_type);
Q_INVOKABLE QVariantMap getFont(const QVariantMap &_defaultFont) const; Q_INVOKABLE static QVariantMap getFont(const QVariantMap &_defaultFont);
public slots: public slots:
Q_INVOKABLE static void sendNotification(const QString &_eventId, Q_INVOKABLE static void sendNotification(const QString &_eventId, const QString &_message);
const QString &_message);
private: private:
AWUpdateHelper *m_updateHelper = nullptr; AWUpdateHelper *m_updateHelper = nullptr;
+16 -25
View File
@@ -45,26 +45,22 @@ void AWBugReporter::doConnect()
{ {
// additional method for testing needs // additional method for testing needs
connect(this, SIGNAL(replyReceived(const int, const QString &)), this, connect(this, SIGNAL(replyReceived(const int, const QString &)), this,
SLOT(showInformation(const int, const QString &))); SLOT(showInformation(int, const QString &)));
} }
QString AWBugReporter::generateText(const QString &_description, QString AWBugReporter::generateText(const QString &_description, const QString &_reproduce,
const QString &_reproduce, const QString &_expected, const QString &_logs)
const QString &_expected,
const QString &_logs) const
{ {
// do not log _logs here, it may have quite large size // do not log _logs here, it may have quite large size
qCDebug(LOG_AW) << "Generate text with description" << _description qCDebug(LOG_AW) << "Generate text with description" << _description << "steps" << _reproduce
<< "steps" << _reproduce << "and expected result" << "and expected result" << _expected;
<< _expected;
QString output; QString output;
output += QString("**Description**\n\n%1\n\n").arg(_description); output += QString("**Description**\n\n%1\n\n").arg(_description);
output += QString("**Step to _reproduce**\n\n%1\n\n").arg(_reproduce); output += QString("**Step to _reproduce**\n\n%1\n\n").arg(_reproduce);
output += QString("**Expected result**\n\n%1\n\n").arg(_expected); output += QString("**Expected result**\n\n%1\n\n").arg(_expected);
output += QString("**Version**\n\n%1\n\n") output += QString("**Version**\n\n%1\n\n").arg(AWDebug::getBuildData().join(QString("\n")));
.arg(AWDebug::getBuildData().join(QString("\n")));
// append _logs // append _logs
output += QString("**Logs**\n\n%1").arg(_logs); output += QString("**Logs**\n\n%1").arg(_logs);
@@ -74,10 +70,9 @@ QString AWBugReporter::generateText(const QString &_description,
void AWBugReporter::sendBugReport(const QString &_title, const QString &_body) void AWBugReporter::sendBugReport(const QString &_title, const QString &_body)
{ {
qCDebug(LOG_AW) << "Send bug report with title" << _title << "and body" qCDebug(LOG_AW) << "Send bug report with title" << _title << "and body" << _body;
<< _body;
QNetworkAccessManager *manager = new QNetworkAccessManager(nullptr); auto *manager = new QNetworkAccessManager(nullptr);
connect(manager, SIGNAL(finished(QNetworkReply *)), this, connect(manager, SIGNAL(finished(QNetworkReply *)), this,
SLOT(issueReplyRecieved(QNetworkReply *))); SLOT(issueReplyRecieved(QNetworkReply *)));
@@ -90,10 +85,8 @@ void AWBugReporter::sendBugReport(const QString &_title, const QString &_body)
payload["body"] = _body; payload["body"] = _body;
payload["labels"] = QStringList() << "from application"; payload["labels"] = QStringList() << "from application";
// convert to QByteArray to send request // convert to QByteArray to send request
QByteArray data QByteArray data = QJsonDocument::fromVariant(payload).toJson(QJsonDocument::Compact);
= QJsonDocument::fromVariant(payload).toJson(QJsonDocument::Compact); qCInfo(LOG_AW) << "Send request with _body" << data.data() << "and size" << data.size();
qCInfo(LOG_AW) << "Send request with _body" << data.data() << "and size"
<< data.size();
manager->post(request, data); manager->post(request, data);
} }
@@ -102,12 +95,12 @@ void AWBugReporter::sendBugReport(const QString &_title, const QString &_body)
void AWBugReporter::issueReplyRecieved(QNetworkReply *_reply) void AWBugReporter::issueReplyRecieved(QNetworkReply *_reply)
{ {
if (_reply->error() != QNetworkReply::NoError) { if (_reply->error() != QNetworkReply::NoError) {
qCWarning(LOG_AW) << "An error occurs" << _reply->error() qCWarning(LOG_AW) << "An error occurs" << _reply->error() << "with message"
<< "with message" << _reply->errorString(); << _reply->errorString();
return emit(replyReceived(0, "")); return emit(replyReceived(0, ""));
} }
QJsonParseError error; QJsonParseError error{};
QJsonDocument jsonDoc = QJsonDocument::fromJson(_reply->readAll(), &error); QJsonDocument jsonDoc = QJsonDocument::fromJson(_reply->readAll(), &error);
if (error.error != QJsonParseError::NoError) { if (error.error != QJsonParseError::NoError) {
qCWarning(LOG_AW) << "Parse error" << error.errorString(); qCWarning(LOG_AW) << "Parse error" << error.errorString();
@@ -126,13 +119,12 @@ void AWBugReporter::issueReplyRecieved(QNetworkReply *_reply)
void AWBugReporter::showInformation(const int _number, const QString &_url) void AWBugReporter::showInformation(const int _number, const QString &_url)
{ {
qCDebug(LOG_AW) << "Created issue with number" << _number << "and url" qCDebug(LOG_AW) << "Created issue with number" << _number << "and url" << _url;
<< _url;
// cache url first // cache url first
m_lastBugUrl = _url; m_lastBugUrl = _url;
QMessageBox *msgBox = new QMessageBox(nullptr); auto *msgBox = new QMessageBox(nullptr);
msgBox->setAttribute(Qt::WA_DeleteOnClose); msgBox->setAttribute(Qt::WA_DeleteOnClose);
msgBox->setModal(false); msgBox->setModal(false);
msgBox->setWindowTitle(i18n("Issue created")); msgBox->setWindowTitle(i18n("Issue created"));
@@ -146,8 +138,7 @@ void AWBugReporter::showInformation(const int _number, const QString &_url)
void AWBugReporter::userReplyOnBugReport(QAbstractButton *_button) void AWBugReporter::userReplyOnBugReport(QAbstractButton *_button)
{ {
QMessageBox::ButtonRole ret QMessageBox::ButtonRole ret = dynamic_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) {
@@ -31,12 +31,10 @@ class AWBugReporter : public QObject
public: public:
explicit AWBugReporter(QObject *_parent = nullptr); explicit AWBugReporter(QObject *_parent = nullptr);
virtual ~AWBugReporter(); ~AWBugReporter() override;
Q_INVOKABLE void doConnect(); Q_INVOKABLE void doConnect();
Q_INVOKABLE QString generateText(const QString &_description, Q_INVOKABLE static QString generateText(const QString &_description, const QString &_reproduce,
const QString &_reproduce, const QString &_expected, const QString &_logs);
const QString &_expected,
const QString &_logs) const;
Q_INVOKABLE void sendBugReport(const QString &_title, const QString &_body); Q_INVOKABLE void sendBugReport(const QString &_title, const QString &_body);
signals: signals:
@@ -44,7 +42,7 @@ signals:
private slots: private slots:
void issueReplyRecieved(QNetworkReply *_reply); void issueReplyRecieved(QNetworkReply *_reply);
void showInformation(const int _number, const QString &_url); void showInformation(int _number, const QString &_url);
void userReplyOnBugReport(QAbstractButton *_button); void userReplyOnBugReport(QAbstractButton *_button);
private: private:
@@ -17,8 +17,6 @@
#include "awconfighelper.h" #include "awconfighelper.h"
#include <KI18n/KLocalizedString>
#include <QDir> #include <QDir>
#include <QQmlPropertyMap> #include <QQmlPropertyMap>
#include <QSettings> #include <QSettings>
@@ -34,8 +32,7 @@ AWConfigHelper::AWConfigHelper(QObject *_parent)
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
m_baseDir = QString("%1/awesomewidgets") m_baseDir = QString("%1/awesomewidgets")
.arg(QStandardPaths::writableLocation( .arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation));
QStandardPaths::GenericDataLocation));
} }
@@ -45,17 +42,16 @@ AWConfigHelper::~AWConfigHelper()
} }
QString AWConfigHelper::configurationDirectory() const QString AWConfigHelper::configurationDirectory()
{ {
// get readable directory // get readable directory
QString localDir = QString("%1/awesomewidgets/configs") QString localDir
.arg(QStandardPaths::writableLocation( = QString("%1/awesomewidgets/configs")
QStandardPaths::GenericDataLocation)); .arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation));
// create directory and copy files from default settings // create directory and copy files from default settings
QDir localDirectory; QDir localDirectory;
if ((!localDirectory.exists(localDir)) if ((!localDirectory.exists(localDir)) && (localDirectory.mkpath(localDir))) {
&& (localDirectory.mkpath(localDir))) {
qCInfo(LOG_AW) << "Created directory" << localDir; qCInfo(LOG_AW) << "Created directory" << localDir;
copyConfigs(localDir); copyConfigs(localDir);
} }
@@ -64,25 +60,23 @@ QString AWConfigHelper::configurationDirectory() const
} }
bool AWConfigHelper::dropCache() const bool AWConfigHelper::dropCache()
{ {
QString fileName = QString("%1/awesomewidgets.ndx") QString fileName
.arg(QStandardPaths::writableLocation( = QString("%1/awesomewidgets.ndx")
QStandardPaths::GenericCacheLocation)); .arg(QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation));
return QFile(fileName).remove(); return QFile(fileName).remove();
} }
bool AWConfigHelper::exportConfiguration(QObject *_nativeConfig, bool AWConfigHelper::exportConfiguration(QObject *_nativeConfig, const QString &_fileName) const
const QString &_fileName) const
{ {
qCDebug(LOG_AW) << "Selected filename" << _fileName; qCDebug(LOG_AW) << "Selected filename" << _fileName;
QSettings settings(_fileName, QSettings::IniFormat); QSettings settings(_fileName, QSettings::IniFormat);
// plasmoid configuration // plasmoid configuration
const QQmlPropertyMap *configuration const auto *configuration = dynamic_cast<const QQmlPropertyMap *>(_nativeConfig);
= static_cast<const QQmlPropertyMap *>(_nativeConfig);
settings.beginGroup("plasmoid"); settings.beginGroup("plasmoid");
for (auto &key : configuration->keys()) { for (auto &key : configuration->keys()) {
QVariant value = configuration->value(key); QVariant value = configuration->value(key);
@@ -94,9 +88,8 @@ bool AWConfigHelper::exportConfiguration(QObject *_nativeConfig,
// 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() << "*.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);
@@ -107,18 +100,15 @@ bool AWConfigHelper::exportConfiguration(QObject *_nativeConfig,
settings.beginGroup("json"); settings.beginGroup("json");
// script filters // script filters
readFile(settings, "filters", readFile(settings, "filters",
QString("%1/scripts/awesomewidgets-extscripts-filters.json") QString("%1/scripts/awesomewidgets-extscripts-filters.json").arg(m_baseDir));
.arg(m_baseDir));
// weather icon settings // weather icon settings
readFile(settings, "weathers", readFile(settings, "weathers",
QString("%1/weather/awesomewidgets-extweather-ids.json") QString("%1/weather/awesomewidgets-extweather-ids.json").arg(m_baseDir));
.arg(m_baseDir));
settings.endGroup(); settings.endGroup();
settings.beginGroup("ini"); settings.beginGroup("ini");
// formatter settings // formatter settings
readFile(settings, "formatters", readFile(settings, "formatters", QString("%1/formatters/formatters.ini").arg(m_baseDir));
QString("%1/formatters/formatters.ini").arg(m_baseDir));
// custom keys settings // custom keys settings
readFile(settings, "custom", QString("%1/custom.ini").arg(m_baseDir)); readFile(settings, "custom", QString("%1/custom.ini").arg(m_baseDir));
settings.endGroup(); settings.endGroup();
@@ -155,18 +145,15 @@ QVariantMap AWConfigHelper::importConfiguration(const QString &_fileName,
settings.beginGroup("json"); settings.beginGroup("json");
// script filters // script filters
writeFile(settings, "filters", writeFile(settings, "filters",
QString("%1/scripts/awesomewidgets-extscripts-filters.json") QString("%1/scripts/awesomewidgets-extscripts-filters.json").arg(m_baseDir));
.arg(m_baseDir));
// weather icon settings // weather icon settings
writeFile(settings, "weathers", writeFile(settings, "weathers",
QString("%1/weather/awesomewidgets-extweather-ids.json") QString("%1/weather/awesomewidgets-extweather-ids.json").arg(m_baseDir));
.arg(m_baseDir));
settings.endGroup(); settings.endGroup();
settings.beginGroup("ini"); settings.beginGroup("ini");
// formatter settings // formatter settings
writeFile(settings, "formatters", writeFile(settings, "formatters", QString("%1/formatters/formatters.ini").arg(m_baseDir));
QString("%1/formatters/formatters.ini").arg(m_baseDir));
// custom keys settings // custom keys settings
writeFile(settings, "custom", QString("%1/custom.ini").arg(m_baseDir)); writeFile(settings, "custom", QString("%1/custom.ini").arg(m_baseDir));
settings.endGroup(); settings.endGroup();
@@ -184,21 +171,19 @@ QVariantMap AWConfigHelper::importConfiguration(const QString &_fileName,
} }
QVariantMap AWConfigHelper::readDataEngineConfiguration() const QVariantMap AWConfigHelper::readDataEngineConfiguration()
{ {
QString fileName = QStandardPaths::locate( QString fileName = QStandardPaths::locate(QStandardPaths::ConfigLocation,
QStandardPaths::ConfigLocation, "plasma-dataengine-extsysmon.conf"); "plasma-dataengine-extsysmon.conf");
qCInfo(LOG_AW) << "Configuration file" << fileName; qCInfo(LOG_AW) << "Configuration file" << fileName;
QSettings settings(fileName, QSettings::IniFormat); QSettings settings(fileName, QSettings::IniFormat);
QVariantMap configuration; QVariantMap configuration;
settings.beginGroup("Configuration"); settings.beginGroup("Configuration");
configuration["ACPIPATH"] configuration["ACPIPATH"] = settings.value("ACPIPATH", "/sys/class/power_supply/");
= settings.value("ACPIPATH", "/sys/class/power_supply/");
configuration["GPUDEV"] = settings.value("GPUDEV", "auto"); configuration["GPUDEV"] = settings.value("GPUDEV", "auto");
configuration["HDDDEV"] = settings.value("HDDDEV", "all"); configuration["HDDDEV"] = settings.value("HDDDEV", "all");
configuration["HDDTEMPCMD"] configuration["HDDTEMPCMD"] = settings.value("HDDTEMPCMD", "sudo smartctl -a");
= settings.value("HDDTEMPCMD", "sudo smartctl -a");
configuration["MPDADDRESS"] = settings.value("MPDADDRESS", "localhost"); configuration["MPDADDRESS"] = settings.value("MPDADDRESS", "localhost");
configuration["MPDPORT"] = settings.value("MPDPORT", "6600"); configuration["MPDPORT"] = settings.value("MPDPORT", "6600");
configuration["MPRIS"] = settings.value("MPRIS", "auto"); configuration["MPRIS"] = settings.value("MPRIS", "auto");
@@ -212,14 +197,12 @@ QVariantMap AWConfigHelper::readDataEngineConfiguration() const
} }
bool AWConfigHelper::writeDataEngineConfiguration( bool AWConfigHelper::writeDataEngineConfiguration(const QVariantMap &_configuration)
const QVariantMap &_configuration) const
{ {
qCDebug(LOG_AW) << "Configuration" << _configuration; qCDebug(LOG_AW) << "Configuration" << _configuration;
QString fileName = QString("%1/plasma-dataengine-extsysmon.conf") QString fileName = QString("%1/plasma-dataengine-extsysmon.conf")
.arg(QStandardPaths::writableLocation( .arg(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation));
QStandardPaths::ConfigLocation));
QSettings settings(fileName, QSettings::IniFormat); QSettings settings(fileName, QSettings::IniFormat);
qCInfo(LOG_AW) << "Configuration file" << settings.fileName(); qCInfo(LOG_AW) << "Configuration file" << settings.fileName();
@@ -241,39 +224,35 @@ bool AWConfigHelper::writeDataEngineConfiguration(
} }
void AWConfigHelper::copyConfigs(const QString &_localDir) const void AWConfigHelper::copyConfigs(const QString &_localDir)
{ {
qCDebug(LOG_AW) << "Local directory" << _localDir; qCDebug(LOG_AW) << "Local directory" << _localDir;
QStringList dirs = QStandardPaths::locateAll( QStringList dirs
QStandardPaths::GenericDataLocation, "awesomewidgets/configs", = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, "awesomewidgets/configs",
QStandardPaths::LocateDirectory); QStandardPaths::LocateDirectory);
for (auto &dir : dirs) { for (auto &dir : dirs) {
if (dir == _localDir) if (dir == _localDir)
continue; continue;
QStringList files = QDir(dir).entryList(QDir::Files); 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" << destination
qCInfo(LOG_AW) << "File" << source << "has been copied to" << "with status" << status;
<< destination << "with status" << status;
} }
} }
} }
void AWConfigHelper::copyExtensions(const QString &_item, const QString &_type, void AWConfigHelper::copyExtensions(const QString &_item, const QString &_type,
QSettings &_settings, QSettings &_settings, const bool _inverse) const
const bool _inverse) const
{ {
qCDebug(LOG_AW) << "Extension" << _item << "has type" << _type qCDebug(LOG_AW) << "Extension" << _item << "has type" << _type << "inverse copying" << _inverse;
<< "inverse copying" << _inverse;
_settings.beginGroup(_item); _settings.beginGroup(_item);
QSettings itemSettings( QSettings itemSettings(QString("%1/%2/%3").arg(m_baseDir).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("Desktop Entry");
if (_inverse) if (_inverse)
copySettings(_settings, itemSettings); copySettings(_settings, itemSettings);
@@ -287,15 +266,14 @@ void AWConfigHelper::copyExtensions(const QString &_item, const QString &_type,
} }
void AWConfigHelper::copySettings(QSettings &_from, QSettings &_to) const void AWConfigHelper::copySettings(QSettings &_from, QSettings &_to)
{ {
for (auto &key : _from.childKeys()) for (auto &key : _from.childKeys())
_to.setValue(key, _from.value(key)); _to.setValue(key, _from.value(key));
} }
void AWConfigHelper::readFile(QSettings &_settings, const QString &_key, void AWConfigHelper::readFile(QSettings &_settings, const QString &_key, const QString &_fileName)
const QString &_fileName) const
{ {
qCDebug(LOG_AW) << "Key" << _key << "from file" << _fileName; qCDebug(LOG_AW) << "Key" << _key << "from file" << _fileName;
@@ -310,8 +288,7 @@ void AWConfigHelper::readFile(QSettings &_settings, const QString &_key,
} }
void AWConfigHelper::writeFile(QSettings &_settings, const QString &_key, void AWConfigHelper::writeFile(QSettings &_settings, const QString &_key, const QString &_fileName)
const QString &_fileName) const
{ {
qCDebug(LOG_AW) << "Key" << _key << "to file" << _fileName; qCDebug(LOG_AW) << "Key" << _key << "to file" << _fileName;
+17 -22
View File
@@ -31,34 +31,29 @@ class AWConfigHelper : public QObject
public: public:
explicit AWConfigHelper(QObject *_parent = nullptr); explicit AWConfigHelper(QObject *_parent = nullptr);
virtual ~AWConfigHelper(); ~AWConfigHelper() override;
Q_INVOKABLE QString configurationDirectory() const; Q_INVOKABLE [[nodiscard]] static QString configurationDirectory();
Q_INVOKABLE bool dropCache() const; Q_INVOKABLE static bool dropCache();
Q_INVOKABLE bool exportConfiguration(QObject *_nativeConfig, Q_INVOKABLE bool exportConfiguration(QObject *_nativeConfig, const QString &_fileName) const;
const QString &_fileName) const; Q_INVOKABLE [[nodiscard]] QVariantMap importConfiguration(const QString &_fileName,
Q_INVOKABLE QVariantMap importConfiguration(const QString &_fileName, bool _importPlasmoid,
const bool _importPlasmoid, bool _importExtensions,
const bool _importExtensions, bool _importAdds) const;
const bool _importAdds) const;
// dataengine // dataengine
Q_INVOKABLE QVariantMap readDataEngineConfiguration() const; Q_INVOKABLE static QVariantMap readDataEngineConfiguration();
Q_INVOKABLE bool Q_INVOKABLE static bool writeDataEngineConfiguration(const QVariantMap &_configuration);
writeDataEngineConfiguration(const QVariantMap &_configuration) const;
private: private:
// methods // methods
void copyConfigs(const QString &_localDir) const; static void copyConfigs(const QString &_localDir);
void copyExtensions(const QString &_item, const QString &_type, void copyExtensions(const QString &_item, const QString &_type, QSettings &_settings,
QSettings &_settings, const bool _inverse) const; bool _inverse) const;
void copySettings(QSettings &_from, QSettings &_to) const; static void copySettings(QSettings &_from, QSettings &_to);
void readFile(QSettings &_settings, const QString &_key, static void readFile(QSettings &_settings, const QString &_key, const QString &_fileName);
const QString &_fileName) const; static void writeFile(QSettings &_settings, const QString &_key, const QString &_fileName);
void writeFile(QSettings &_settings, const QString &_key,
const QString &_fileName) const;
// properties // properties
QString m_baseDir; QString m_baseDir;
QStringList m_dirs QStringList m_dirs = {"desktops", "quotes", "scripts", "upgrade", "weather", "formatters"};
= {"desktops", "quotes", "scripts", "upgrade", "weather", "formatters"};
}; };
@@ -21,8 +21,7 @@
#include "awdebug.h" #include "awdebug.h"
AWCustomKeysConfig::AWCustomKeysConfig(QWidget *_parent, AWCustomKeysConfig::AWCustomKeysConfig(QWidget *_parent, const QStringList &_keys)
const QStringList &_keys)
: AWAbstractPairConfig(_parent, false, _keys) : AWAbstractPairConfig(_parent, false, _keys)
{ {
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
@@ -29,7 +29,7 @@ class AWCustomKeysConfig : public AWAbstractPairConfig
public: public:
explicit AWCustomKeysConfig(QWidget *_parent = nullptr, explicit AWCustomKeysConfig(QWidget *_parent = nullptr,
const QStringList &_keys = QStringList()); const QStringList &_keys = QStringList());
virtual ~AWCustomKeysConfig(); ~AWCustomKeysConfig() override;
}; };
@@ -46,13 +46,13 @@ QString AWCustomKeysHelper::source(const QString &_key) const
QStringList AWCustomKeysHelper::sources() const QStringList AWCustomKeysHelper::sources() const
{ {
return QSet<QString>::fromList(values()).toList(); return valuesSet().values();
} }
QStringList AWCustomKeysHelper::refinedSources() const QStringList AWCustomKeysHelper::refinedSources() const
{ {
auto allSources = QSet<QString>::fromList(pairs().values()); auto allSources = valuesSet();
QSet<QString> output; QSet<QString> output;
while (output != allSources) { while (output != allSources) {
@@ -62,7 +62,7 @@ QStringList AWCustomKeysHelper::refinedSources() const
allSources = output; allSources = output;
} }
return output.toList(); return output.values();
} }
@@ -30,15 +30,15 @@ class AWCustomKeysHelper : public QObject, public AWAbstractPairHelper
public: public:
explicit AWCustomKeysHelper(QObject *_parent = nullptr); explicit AWCustomKeysHelper(QObject *_parent = nullptr);
virtual ~AWCustomKeysHelper(); ~AWCustomKeysHelper() override;
// get // get
QString source(const QString &_key) const; [[nodiscard]] QString source(const QString &_key) const;
QStringList sources() const; [[nodiscard]] QStringList sources() const;
QStringList refinedSources() const; [[nodiscard]] QStringList refinedSources() const;
// configuration related // configuration related
virtual void editPairs(){}; void editPairs() override{};
virtual QStringList leftKeys(); QStringList leftKeys() override;
virtual QStringList rightKeys(); QStringList rightKeys() override;
private: private:
}; };
@@ -54,16 +54,15 @@ AWDataAggregator::~AWDataAggregator()
} }
QString AWDataAggregator::htmlImage(const QPixmap &_source) const QString AWDataAggregator::htmlImage(const QPixmap &_source)
{ {
QByteArray byteArray; QByteArray byteArray;
QBuffer buffer(&byteArray); QBuffer buffer(&byteArray);
_source.save(&buffer, "PNG"); _source.save(&buffer, "PNG");
return byteArray.isEmpty() return byteArray.isEmpty() ? ""
? "" : QString("<img src=\"data:image/png;base64,%1\"/>")
: QString("<img src=\"data:image/png;base64,%1\"/>") .arg(QString(byteArray.toBase64()));
.arg(QString(byteArray.toBase64()));
} }
@@ -120,13 +119,12 @@ QPixmap AWDataAggregator::tooltipImage()
// create frame // create frame
float normX = 100.0f / static_cast<float>(m_values[key].count()); float normX = 100.0f / static_cast<float>(m_values[key].count());
float normY = 100.0f / (1.5f * m_boundaries[key]); float normY = 100.0f / (1.5f * m_boundaries[key]);
float shift = requiredKeys.indexOf(key) * 100.0f; float shift = static_cast<float>(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 != "batTooltip")
pen.setColor(QColor( pen.setColor(QColor(m_configuration[QString("%1Color").arg(key)].toString()));
m_configuration[QString("%1Color").arg(key)].toString()));
// paint data inside frame // paint data inside frame
for (int j = 0; j < m_values[key].count() - 1; j++) { for (int j = 0; j < m_values[key].count() - 1; j++) {
// some magic here // some magic here
@@ -136,11 +134,9 @@ QPixmap AWDataAggregator::tooltipImage()
float y2 = -std::fabs(m_values[key].at(j + 1)) * normY + 5.0f; float y2 = -std::fabs(m_values[key].at(j + 1)) * normY + 5.0f;
if (key == "batTooltip") { if (key == "batTooltip") {
if (m_values[key].at(j + 1) > 0) if (m_values[key].at(j + 1) > 0)
pen.setColor( pen.setColor(QColor(m_configuration["batTooltipColor"].toString()));
QColor(m_configuration["batTooltipColor"].toString()));
else else
pen.setColor(QColor( pen.setColor(QColor(m_configuration["batInTooltipColor"].toString()));
m_configuration["batInTooltipColor"].toString()));
} }
m_toolTipScene->addLine(x1, y1, x2, y2, pen); m_toolTipScene->addLine(x1, y1, x2, y2, pen);
} }
@@ -163,33 +159,27 @@ void AWDataAggregator::dataUpdate(const QVariantHash &_values)
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))
&& (m_values[_source].last() < _extremum)) return AWActions::sendNotification("event", notificationText(_source, _value));
return AWActions::sendNotification(
"event", notificationText(_source, _value));
} else { } else {
if ((m_enablePopup) && (_value < _extremum) if ((m_enablePopup) && (_value < _extremum) && (m_values[_source].last() > _extremum))
&& (m_values[_source].last() > _extremum)) return AWActions::sendNotification("event", notificationText(_source, _value));
return AWActions::sendNotification(
"event", notificationText(_source, _value));
} }
} }
void AWDataAggregator::checkValue(const QString &_source, void AWDataAggregator::checkValue(const QString &_source, const QString &_current,
const QString &_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
<< _current << "and received one" << _received; << "and received one" << _received;
if ((m_enablePopup) && (_current != _received) && (!_received.isEmpty())) if ((m_enablePopup) && (_current != _received) && (!_received.isEmpty()))
return AWActions::sendNotification( return AWActions::sendNotification("event", notificationText(_source, _received));
"event", notificationText(_source, _received));
} }
@@ -205,11 +195,9 @@ void AWDataAggregator::initScene()
} }
QString AWDataAggregator::notificationText(const QString &_source, QString AWDataAggregator::notificationText(const QString &_source, const float _value)
const float _value) const
{ {
qCDebug(LOG_AW) << "Notification source" << _source << "with value" qCDebug(LOG_AW) << "Notification source" << _source << "with value" << _value;
<< _value;
QString output; QString output;
if (_source == "batTooltip") if (_source == "batTooltip")
@@ -227,11 +215,9 @@ QString AWDataAggregator::notificationText(const QString &_source,
} }
QString AWDataAggregator::notificationText(const QString &_source, QString AWDataAggregator::notificationText(const QString &_source, const QString &_value)
const QString &_value) const
{ {
qCDebug(LOG_AW) << "Notification source" << _source << "with value" qCDebug(LOG_AW) << "Notification source" << _source << "with value" << _value;
<< _value;
QString output; QString output;
if (_source == "netdev") if (_source == "netdev")
@@ -245,8 +231,8 @@ void AWDataAggregator::setData(const QVariantHash &_values)
{ {
// do not log these arguments // do not log these arguments
// battery update requires info is AC online or not // battery update requires info is AC online or not
setData(_values["ac"].toString() == m_configuration["acOnline"], setData(_values["ac"].toString() == m_configuration["acOnline"], "batTooltip",
"batTooltip", _values["bat"].toFloat()); _values["bat"].toFloat());
// usual case // usual case
setData("cpuTooltip", _values["cpu"].toFloat(), 90.0); setData("cpuTooltip", _values["cpu"].toFloat(), 90.0);
setData("cpuclTooltip", _values["cpucl"].toFloat()); setData("cpuclTooltip", _values["cpucl"].toFloat());
@@ -260,23 +246,17 @@ void AWDataAggregator::setData(const QVariantHash &_values)
m_currentNetworkDevice = value; m_currentNetworkDevice = value;
}(_values["netdev"].toString()); }(_values["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); }(_values["gpu"].toFloat());
checkValue("gpu", value, 90.0);
m_currentGPULoad = value;
}(_values["gpu"].toFloat());
} }
void AWDataAggregator::setData(const QString &_source, float _value, void AWDataAggregator::setData(const QString &_source, 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 (m_values[_source].count() == 0)
m_values[_source].append(0.0); m_values[_source].append(0.0);
else if (m_values[_source].count() else if (m_values[_source].count() > m_configuration["tooltipNumber"].toInt())
> m_configuration["tooltipNumber"].toInt())
m_values[_source].removeFirst(); m_values[_source].removeFirst();
if (std::isnan(_value)) if (std::isnan(_value))
_value = 0.0; _value = 0.0;
@@ -286,8 +266,7 @@ void AWDataAggregator::setData(const QString &_source, float _value,
m_values[_source].append(_value); m_values[_source].append(_value);
if (_source == "downkbTooltip") { if (_source == "downkbTooltip") {
QList<float> netValues QList<float> netValues = m_values["downkbTooltip"] + m_values["upkbTooltip"];
= m_values["downkbTooltip"] + m_values["upkbTooltip"];
// to avoid inf value of normY // to avoid inf value of normY
netValues << 1.0; netValues << 1.0;
m_boundaries["downkbTooltip"] m_boundaries["downkbTooltip"]
@@ -297,11 +276,10 @@ void AWDataAggregator::setData(const QString &_source, float _value,
} }
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"
<< "for source" << _source; << _source;
// invert values for different battery colours // invert values for different battery colours
_value = _dontInvert ? _value : -_value; _value = _dontInvert ? _value : -_value;
@@ -34,8 +34,8 @@ class AWDataAggregator : public QObject
public: public:
explicit AWDataAggregator(QObject *_parent = nullptr); explicit AWDataAggregator(QObject *_parent = nullptr);
virtual ~AWDataAggregator(); ~AWDataAggregator() override;
QString htmlImage(const QPixmap &_source) const; static QString htmlImage(const QPixmap &_source);
void setParameters(const QVariantMap &_settings); void setParameters(const QVariantMap &_settings);
QPixmap tooltipImage(); QPixmap tooltipImage();
@@ -49,24 +49,20 @@ private:
// ui // ui
QGraphicsScene *m_toolTipScene = nullptr; QGraphicsScene *m_toolTipScene = nullptr;
QGraphicsView *m_toolTipView = nullptr; QGraphicsView *m_toolTipView = nullptr;
void checkValue(const QString &_source, const float _value, void checkValue(const QString &_source, float _value, 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; static QString notificationText(const QString &_source, float _value);
QString notificationText(const QString &_source, static QString notificationText(const QString &_source, const QString &_value);
const QString &_value) const;
// main method // main method
void setData(const QVariantHash &_values); void setData(const QVariantHash &_values);
void setData(const QString &_source, float _value, void setData(const QString &_source, float _value, 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(bool _dontInvert, const QString &_source, float _value);
// variables // variables
int m_counts = 0; int m_counts = 0;
QVariantHash m_configuration; QVariantHash m_configuration;
float m_currentGPULoad = 0.0f;
QString m_currentNetworkDevice = "lo"; QString m_currentNetworkDevice = "lo";
QHash<QString, float> m_boundaries; QHash<QString, float> m_boundaries;
QHash<QString, QList<float>> m_values; QHash<QString, QList<float>> m_values;
@@ -34,13 +34,12 @@ AWDataEngineAggregator::AWDataEngineAggregator(QObject *_parent)
m_dataEngines["time"] = m_consumer->dataEngine("time"); m_dataEngines["time"] = m_consumer->dataEngine("time");
// additional method required by systemmonitor structure // additional method required by systemmonitor structure
m_newSourceConnection = connect( m_newSourceConnection
m_dataEngines["systemmonitor"], &Plasma::DataEngine::sourceAdded, = connect(m_dataEngines["systemmonitor"], &Plasma::DataEngine::sourceAdded,
[this](const QString source) { [this](const QString &source) {
emit(deviceAdded(source)); emit(deviceAdded(source));
m_dataEngines["systemmonitor"]->connectSource(source, parent(), m_dataEngines["systemmonitor"]->connectSource(source, parent(), 1000);
1000); });
});
// required to define Qt::QueuedConnection for signal-slot connection // required to define Qt::QueuedConnection for signal-slot connection
qRegisterMetaType<Plasma::DataEngine::Data>("Plasma::DataEngine::Data"); qRegisterMetaType<Plasma::DataEngine::Data>("Plasma::DataEngine::Data");
@@ -57,9 +56,9 @@ AWDataEngineAggregator::~AWDataEngineAggregator()
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());
disconnect(m_newSourceConnection); disconnect(m_newSourceConnection);
} }
@@ -70,16 +69,15 @@ void AWDataEngineAggregator::reconnectSources(const int _interval)
disconnectSources(); disconnectSources();
m_dataEngines["systemmonitor"]->connectAllSources(parent(), _interval); m_dataEngines["systemmonitor"]->connectAllSources(parent(), (uint)_interval);
m_dataEngines["extsysmon"]->connectAllSources(parent(), _interval); m_dataEngines["extsysmon"]->connectAllSources(parent(), (uint)_interval);
m_dataEngines["time"]->connectSource("Local", parent(), 1000); m_dataEngines["time"]->connectSource("Local", parent(), 1000);
m_newSourceConnection = connect( m_newSourceConnection = connect(
m_dataEngines["systemmonitor"], &Plasma::DataEngine::sourceAdded, m_dataEngines["systemmonitor"], &Plasma::DataEngine::sourceAdded,
[this, _interval](const QString source) { [this, _interval](const QString &source) {
emit(deviceAdded(source)); emit(deviceAdded(source));
m_dataEngines["systemmonitor"]->connectSource(source, parent(), m_dataEngines["systemmonitor"]->connectSource(source, parent(), (uint)_interval);
_interval);
}); });
#ifdef BUILD_FUTURE #ifdef BUILD_FUTURE
@@ -94,8 +92,8 @@ void AWDataEngineAggregator::dropSource(const QString &_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 all engines // connected we will try to disconnect it from all engines
for (auto dataengine : m_dataEngines.values()) for (auto dataEngine : m_dataEngines.values())
dataengine->disconnectSource(_source, parent()); dataEngine->disconnectSource(_source, parent());
} }
@@ -105,24 +103,18 @@ void AWDataEngineAggregator::createQueuedConnection()
// for more details refer to plasma-framework source code // for more details refer to plasma-framework source code
for (auto &dataEngine : m_dataEngines.keys()) { for (auto &dataEngine : m_dataEngines.keys()) {
// different source set for different engines // different source set for different engines
QStringList sources = dataEngine == "time" QStringList sources = dataEngine == "time" ? QStringList() << "Local"
? QStringList() << "Local" : m_dataEngines[dataEngine]->sources();
: m_dataEngines[dataEngine]->sources();
// reconnect sources // reconnect sources
for (auto &source : sources) { for (auto &source : sources) {
Plasma::DataContainer *container Plasma::DataContainer *container
= m_dataEngines[dataEngine]->containerForSource(source); = m_dataEngines[dataEngine]->containerForSource(source);
// disconnect old connections first // disconnect old connections first
disconnect(container, disconnect(container, SIGNAL(dataUpdated(QString, Plasma::DataEngine::Data)), parent(),
SIGNAL(dataUpdated(QString, Plasma::DataEngine::Data)),
parent(),
SLOT(dataUpdated(QString, Plasma::DataEngine::Data))); SLOT(dataUpdated(QString, Plasma::DataEngine::Data)));
// and now reconnect with Qt::QueuedConnection type // and now reconnect with Qt::QueuedConnection type
connect(container, connect(container, SIGNAL(dataUpdated(QString, Plasma::DataEngine::Data)), parent(),
SIGNAL(dataUpdated(QString, Plasma::DataEngine::Data)), SLOT(dataUpdated(QString, Plasma::DataEngine::Data)), Qt::QueuedConnection);
parent(),
SLOT(dataUpdated(QString, Plasma::DataEngine::Data)),
Qt::QueuedConnection);
} }
} }
} }
@@ -31,9 +31,9 @@ class AWDataEngineAggregator : public QObject
public: public:
explicit AWDataEngineAggregator(QObject *_parent = nullptr); explicit AWDataEngineAggregator(QObject *_parent = nullptr);
virtual ~AWDataEngineAggregator(); ~AWDataEngineAggregator() override;
void disconnectSources(); void disconnectSources();
void reconnectSources(const int _interval); void reconnectSources(int _interval);
signals: signals:
void deviceAdded(const QString &_source); void deviceAdded(const QString &_source);
@@ -23,8 +23,7 @@
#include "awformatterhelper.h" #include "awformatterhelper.h"
AWDataEngineMapper::AWDataEngineMapper(QObject *_parent, AWDataEngineMapper::AWDataEngineMapper(QObject *_parent, AWFormatterHelper *_custom)
AWFormatterHelper *_custom)
: QObject(_parent) : QObject(_parent)
, m_customFormatters(_custom) , m_customFormatters(_custom)
{ {
@@ -59,8 +58,7 @@ AWDataEngineMapper::~AWDataEngineMapper()
} }
AWKeysAggregator::FormatterType AWKeysAggregator::FormatterType AWDataEngineMapper::formatter(const QString &_key) const
AWDataEngineMapper::formatter(const QString &_key) const
{ {
qCDebug(LOG_AW) << "Get formatter for key" << _key; qCDebug(LOG_AW) << "Get formatter for key" << _key;
@@ -78,8 +76,7 @@ QStringList AWDataEngineMapper::keysFromSource(const QString &_source) const
// HACK units required to define should the value be calculated as temperature // HACK units required to define should the value be calculated as temperature
// or fan data // or fan data
QStringList AWDataEngineMapper::registerSource(const QString &_source, QStringList AWDataEngineMapper::registerSource(const QString &_source, const 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;
@@ -92,59 +89,58 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source,
QRegExp mountFillRegExp = QRegExp("partitions/.*/filllevel"); QRegExp mountFillRegExp = QRegExp("partitions/.*/filllevel");
QRegExp mountFreeRegExp = QRegExp("partitions/.*/freespace"); QRegExp mountFreeRegExp = QRegExp("partitions/.*/freespace");
QRegExp mountUsedRegExp = QRegExp("partitions/.*/usedspace"); QRegExp mountUsedRegExp = QRegExp("partitions/.*/usedspace");
QRegExp netRegExp QRegExp netRegExp = QRegExp("network/interfaces/.*/(receiver|transmitter)/data$");
= QRegExp("network/interfaces/.*/(receiver|transmitter)/data$"); QRegExp netTotalRegExp = QRegExp("network/interfaces/.*/(receiver|transmitter)/dataTotal$");
QRegExp netTotalRegExp
= QRegExp("network/interfaces/.*/(receiver|transmitter)/dataTotal$");
if (_source == "battery/ac") { if (_source == "battery/ac") {
// AC // AC
m_map[_source] = "ac"; m_map.insert(_source, "ac");
m_formatter["ac"] = AWKeysAggregator::FormatterType::ACFormat; m_formatter["ac"] = AWKeysAggregator::FormatterType::ACFormat;
} else if (_source.startsWith("battery/")) { } else if (_source.startsWith("battery/")) {
// battery stats // battery stats
QString key = _source; QString key = _source;
key.remove("battery/"); key.remove("battery/");
m_map[_source] = key; m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::IntegerThree; m_formatter[key] = _source.contains("rate") ? AWKeysAggregator::FormatterType::Float
: AWKeysAggregator::FormatterType::IntegerThree;
} else if (_source == "cpu/system/TotalLoad") { } else if (_source == "cpu/system/TotalLoad") {
// cpu // cpu
m_map[_source] = "cpu"; m_map.insert(_source, "cpu");
m_formatter["cpu"] = AWKeysAggregator::FormatterType::Float; m_formatter["cpu"] = AWKeysAggregator::FormatterType::Float;
} else if (_source.contains(cpuRegExp)) { } else if (_source.contains(cpuRegExp)) {
// cpus // cpus
QString key = _source; QString key = _source;
key.remove("cpu/").remove("/TotalLoad"); key.remove("cpu/").remove("/TotalLoad");
m_map[_source] = key; m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Float; m_formatter[key] = AWKeysAggregator::FormatterType::Float;
} else if (_source == "cpu/system/AverageClock") { } else if (_source == "cpu/system/AverageClock") {
// cpucl // cpucl
m_map[_source] = "cpucl"; m_map.insert(_source, "cpucl");
m_formatter["cpucl"] = AWKeysAggregator::FormatterType::Integer; m_formatter["cpucl"] = AWKeysAggregator::FormatterType::Integer;
} else if (_source.contains(cpuclRegExp)) { } else if (_source.contains(cpuclRegExp)) {
// cpucls // cpucls
QString key = _source; QString key = _source;
key.remove("cpu/cpu").remove("/clock"); key.remove("cpu/cpu").remove("/clock");
key = QString("cpucl%1").arg(key); key = QString("cpucl%1").arg(key);
m_map[_source] = key; m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Integer; m_formatter[key] = AWKeysAggregator::FormatterType::Integer;
} else if (_source.startsWith("custom")) { } else if (_source.startsWith("custom")) {
// custom // custom
QString key = _source; QString key = _source;
key.remove("custom/"); key.remove("custom/");
m_map[_source] = key; m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat; m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source == "desktop/current/name") { } else if (_source == "desktop/current/name") {
// current desktop name // current desktop name
m_map[_source] = "desktop"; m_map.insert(_source, "desktop");
m_formatter["desktop"] = AWKeysAggregator::FormatterType::NoFormat; m_formatter["desktop"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source == "desktop/current/number") { } else if (_source == "desktop/current/number") {
// current desktop number // current desktop number
m_map[_source] = "ndesktop"; m_map.insert(_source, "ndesktop");
m_formatter["ndesktop"] = AWKeysAggregator::FormatterType::NoFormat; m_formatter["ndesktop"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source == "desktop/total/number") { } else if (_source == "desktop/total/number") {
// desktop count // desktop count
m_map[_source] = "tdesktops"; m_map.insert(_source, "tdesktops");
m_formatter["tdesktops"] = AWKeysAggregator::FormatterType::NoFormat; m_formatter["tdesktops"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source.contains(hddrRegExp)) { } else if (_source.contains(hddrRegExp)) {
// read speed // read speed
@@ -153,7 +149,7 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source,
int index = m_devices["disk"].indexOf(device); int index = m_devices["disk"].indexOf(device);
if (index > -1) { if (index > -1) {
QString key = QString("hddr%1").arg(index); QString key = QString("hddr%1").arg(index);
m_map[_source] = key; m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Integer; m_formatter[key] = AWKeysAggregator::FormatterType::Integer;
} }
} else if (_source.contains(hddwRegExp)) { } else if (_source.contains(hddwRegExp)) {
@@ -163,16 +159,16 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source,
int index = m_devices["disk"].indexOf(device); int index = m_devices["disk"].indexOf(device);
if (index > -1) { if (index > -1) {
QString key = QString("hddw%1").arg(index); QString key = QString("hddw%1").arg(index);
m_map[_source] = key; m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Integer; m_formatter[key] = AWKeysAggregator::FormatterType::Integer;
} }
} else if (_source == "gpu/load") { } else if (_source == "gpu/load") {
// gpu load // gpu load
m_map[_source] = "gpu"; m_map.insert(_source, "gpu");
m_formatter["gpu"] = AWKeysAggregator::FormatterType::Float; m_formatter["gpu"] = AWKeysAggregator::FormatterType::Float;
} else if (_source == "gpu/temperature") { } else if (_source == "gpu/temperature") {
// gpu temperature // gpu temperature
m_map[_source] = "gputemp"; m_map.insert(_source, "gputemp");
m_formatter["gputemp"] = AWKeysAggregator::FormatterType::Temperature; m_formatter["gputemp"] = AWKeysAggregator::FormatterType::Temperature;
} else if (_source.contains(mountFillRegExp)) { } else if (_source.contains(mountFillRegExp)) {
// fill level // fill level
@@ -181,7 +177,7 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source,
int index = m_devices["mount"].indexOf(device); int index = m_devices["mount"].indexOf(device);
if (index > -1) { if (index > -1) {
QString key = QString("hdd%1").arg(index); QString key = QString("hdd%1").arg(index);
m_map[_source] = key; m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Float; m_formatter[key] = AWKeysAggregator::FormatterType::Float;
// additional keys // additional keys
m_formatter[QString("hddtotmb%1").arg(index)] m_formatter[QString("hddtotmb%1").arg(index)]
@@ -197,11 +193,11 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source,
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.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::MemMBFormat; m_formatter[key] = AWKeysAggregator::FormatterType::MemMBFormat;
// gb // gb
key = QString("hddfreegb%1").arg(index); key = QString("hddfreegb%1").arg(index);
m_map.insertMulti(_source, key); m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::MemGBFormat; m_formatter[key] = AWKeysAggregator::FormatterType::MemGBFormat;
} }
} else if (_source.contains(mountUsedRegExp)) { } else if (_source.contains(mountUsedRegExp)) {
@@ -212,11 +208,11 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source,
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.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::MemMBFormat; m_formatter[key] = AWKeysAggregator::FormatterType::MemMBFormat;
// gb // gb
key = QString("hddgb%1").arg(index); key = QString("hddgb%1").arg(index);
m_map.insertMulti(_source, key); m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::MemGBFormat; m_formatter[key] = AWKeysAggregator::FormatterType::MemGBFormat;
} }
} else if (_source.startsWith("hdd/temperature")) { } else if (_source.startsWith("hdd/temperature")) {
@@ -226,7 +222,7 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source,
int index = m_devices["hdd"].indexOf(device); int index = m_devices["hdd"].indexOf(device);
if (index > -1) { if (index > -1) {
QString key = QString("hddtemp%1").arg(index); QString key = QString("hddtemp%1").arg(index);
m_map[_source] = key; m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Temperature; m_formatter[key] = AWKeysAggregator::FormatterType::Temperature;
} }
} else if (_source.startsWith("cpu/system/loadavg")) { } else if (_source.startsWith("cpu/system/loadavg")) {
@@ -234,41 +230,45 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source,
QString time = _source; QString time = _source;
time.remove("cpu/system/loadavg"); time.remove("cpu/system/loadavg");
QString key = QString("la%1").arg(time); QString key = QString("la%1").arg(time);
m_map[_source] = key; m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::FloatTwoSymbols; m_formatter[key] = AWKeysAggregator::FormatterType::FloatTwoSymbols;
} else if (_source == "mem/physical/application") { } else if (_source == "mem/physical/application") {
// app memory // app memory
// mb // mb
m_map[_source] = "memmb"; m_map.insert(_source, "memmb");
m_formatter["memmb"] = AWKeysAggregator::FormatterType::MemMBFormat; m_formatter["memmb"] = AWKeysAggregator::FormatterType::MemMBFormat;
// gb // gb
m_map.insertMulti(_source, "memgb"); m_map.insert(_source, "memgb");
m_formatter["memgb"] = AWKeysAggregator::FormatterType::MemGBFormat; m_formatter["memgb"] = AWKeysAggregator::FormatterType::MemGBFormat;
} else if (_source == "mem/physical/free") { } else if (_source == "mem/physical/free") {
// free memory // free memory
// mb // mb
m_map[_source] = "memfreemb"; m_map.insert(_source, "memfreemb");
m_formatter["memfreemb"] = AWKeysAggregator::FormatterType::MemMBFormat; m_formatter["memfreemb"] = AWKeysAggregator::FormatterType::MemMBFormat;
// gb // gb
m_map.insertMulti(_source, "memfreegb"); m_map.insert(_source, "memfreegb");
m_formatter["memfreegb"] = AWKeysAggregator::FormatterType::MemGBFormat; m_formatter["memfreegb"] = AWKeysAggregator::FormatterType::MemGBFormat;
} else if (_source == "mem/physical/used") { } else if (_source == "mem/physical/used") {
// used memory // used memory
// mb // mb
m_map[_source] = "memusedmb"; m_map.insert(_source, "memusedmb");
m_formatter["memusedmb"] = AWKeysAggregator::FormatterType::MemMBFormat; m_formatter["memusedmb"] = AWKeysAggregator::FormatterType::MemMBFormat;
// gb // gb
m_map.insertMulti(_source, "memusedgb"); m_map.insert(_source, "memusedgb");
m_formatter["memusedgb"] = AWKeysAggregator::FormatterType::MemGBFormat; m_formatter["memusedgb"] = AWKeysAggregator::FormatterType::MemGBFormat;
} else if (_source == "network/current/name") { } else if (_source == "network/current/name") {
// network device // network device
m_map[_source] = "netdev"; m_map.insert(_source, "netdev");
m_formatter["netdev"] = AWKeysAggregator::FormatterType::NoFormat; m_formatter["netdev"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source == "network/current/ssid") {
// current ssid
m_map.insert(_source, "ssid");
m_formatter["ssid"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source.startsWith("network/response")) { } else if (_source.startsWith("network/response")) {
// network response // network response
QString key = _source; QString key = _source;
key.remove("network/"); key.remove("network/");
m_map[_source] = key; m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat; m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source.contains(netRegExp)) { } else if (_source.contains(netRegExp)) {
// network speed // network speed
@@ -277,15 +277,15 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source,
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.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Integer; m_formatter[key] = AWKeysAggregator::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.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::NetSmartFormat; m_formatter[key] = AWKeysAggregator::FormatterType::NetSmartFormat;
// units // units
key = QString("%1units%2").arg(type).arg(index); key = QString("%1units%2").arg(type).arg(index);
m_map.insertMulti(_source, key); m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::NetSmartUnits; m_formatter[key] = AWKeysAggregator::FormatterType::NetSmartUnits;
} }
} else if (_source.contains(netTotalRegExp)) { } else if (_source.contains(netTotalRegExp)) {
@@ -295,60 +295,58 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source,
if (index > -1) { if (index > -1) {
// kb // kb
QString key = QString("%1totkb%2").arg(type).arg(index); QString key = QString("%1totkb%2").arg(type).arg(index);
m_map[_source] = key; m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Integer; m_formatter[key] = AWKeysAggregator::FormatterType::Integer;
// mb // mb
key = QString("%1tot%2").arg(type).arg(index); key = QString("%1tot%2").arg(type).arg(index);
m_map.insertMulti(_source, key); m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::MemMBFormat; m_formatter[key] = AWKeysAggregator::FormatterType::MemMBFormat;
} }
} else if (_source.startsWith("upgrade")) { } else if (_source.startsWith("upgrade")) {
// package manager // package manager
QString key = _source; QString key = _source;
key.remove("upgrade/"); key.remove("upgrade/");
m_map[_source] = key; m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::IntegerThree; m_formatter[key] = AWKeysAggregator::FormatterType::IntegerThree;
} else if (_source.startsWith("player")) { } else if (_source.startsWith("player")) {
// player // player
QString key = _source; QString key = _source;
key.remove("player/"); key.remove("player/");
m_map[_source] = key; m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat; m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source == "ps/running/count") { } else if (_source == "ps/running/count") {
// running processes count // running processes count
m_map[_source] = "pscount"; m_map.insert(_source, "pscount");
m_formatter["pscount"] = AWKeysAggregator::FormatterType::NoFormat; m_formatter["pscount"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source == "ps/running/list") { } else if (_source == "ps/running/list") {
// list of running processes // list of running processes
m_map[_source] = "ps"; m_map.insert(_source, "ps");
m_formatter["ps"] = AWKeysAggregator::FormatterType::List; m_formatter["ps"] = AWKeysAggregator::FormatterType::List;
} else if (_source == "ps/total/count") { } else if (_source == "ps/total/count") {
// total processes count // total processes count
m_map[_source] = "pstot"; m_map.insert(_source, "pstot");
m_formatter["pstot"] = AWKeysAggregator::FormatterType::NoFormat; m_formatter["pstot"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source.startsWith("quotes")) { } else if (_source.startsWith("quotes")) {
// quotes // quotes
QString key = _source; QString key = _source;
key.remove("quotes/"); key.remove("quotes/");
m_map[_source] = key; m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Quotes; m_formatter[key] = AWKeysAggregator::FormatterType::Quotes;
} else if (_source == "mem/swap/free") { } else if (_source == "mem/swap/free") {
// free swap // free swap
// mb // mb
m_map[_source] = "swapfreemb"; m_map.insert(_source, "swapfreemb");
m_formatter["swapfreemb"] m_formatter["swapfreemb"] = AWKeysAggregator::FormatterType::MemMBFormat;
= AWKeysAggregator::FormatterType::MemMBFormat;
// gb // gb
m_map.insertMulti(_source, "swapfreegb"); m_map.insert(_source, "swapfreegb");
m_formatter["swapfreegb"] m_formatter["swapfreegb"] = AWKeysAggregator::FormatterType::MemGBFormat;
= AWKeysAggregator::FormatterType::MemGBFormat;
} else if (_source == "mem/swap/used") { } else if (_source == "mem/swap/used") {
// used swap // used swap
// mb // mb
m_map[_source] = "swapmb"; m_map.insert(_source, "swapmb");
m_formatter["swapmb"] = AWKeysAggregator::FormatterType::MemMBFormat; m_formatter["swapmb"] = AWKeysAggregator::FormatterType::MemMBFormat;
// gb // gb
m_map.insertMulti(_source, "swapgb"); m_map.insert(_source, "swapgb");
m_formatter["swapgb"] = AWKeysAggregator::FormatterType::MemGBFormat; m_formatter["swapgb"] = AWKeysAggregator::FormatterType::MemGBFormat;
} else if (_source.startsWith("lmsensors/")) { } else if (_source.startsWith("lmsensors/")) {
// temperature // temperature
@@ -358,54 +356,59 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source,
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.insert(_source, key);
m_formatter[key] m_formatter[key] = _units == "°C" ? AWKeysAggregator::FormatterType::Temperature
= _units == "°C" ? AWKeysAggregator::FormatterType::Temperature : AWKeysAggregator::FormatterType::Integer;
: AWKeysAggregator::FormatterType::Integer;
} }
} else if (_source == "Local") { } else if (_source == "Local") {
// time // time
m_map[_source] = "time"; m_map.insert(_source, "time");
m_formatter["time"] = AWKeysAggregator::FormatterType::Time; m_formatter["time"] = AWKeysAggregator::FormatterType::Time;
// custom time // custom time
m_map.insertMulti(_source, "ctime"); m_map.insert(_source, "ctime");
m_formatter["ctime"] = AWKeysAggregator::FormatterType::TimeCustom; m_formatter["ctime"] = AWKeysAggregator::FormatterType::TimeCustom;
// ISO time // ISO time
m_map.insertMulti(_source, "isotime"); m_map.insert(_source, "isotime");
m_formatter["isotime"] = AWKeysAggregator::FormatterType::TimeISO; m_formatter["isotime"] = AWKeysAggregator::FormatterType::TimeISO;
// long time // long time
m_map.insertMulti(_source, "longtime"); m_map.insert(_source, "longtime");
m_formatter["longtime"] = AWKeysAggregator::FormatterType::TimeLong; m_formatter["longtime"] = AWKeysAggregator::FormatterType::TimeLong;
// short time // short time
m_map.insertMulti(_source, "shorttime"); m_map.insert(_source, "shorttime");
m_formatter["shorttime"] = AWKeysAggregator::FormatterType::TimeShort; m_formatter["shorttime"] = AWKeysAggregator::FormatterType::TimeShort;
// timestamp // timestamp
m_map.insertMulti(_source, "tstime"); m_map.insert(_source, "tstime");
m_formatter["tstime"] = AWKeysAggregator::FormatterType::Timestamp; m_formatter["tstime"] = AWKeysAggregator::FormatterType::Timestamp;
} else if (_source == "system/brightness") {
m_map.insert(_source, "brightness");
m_formatter["brightness"] = AWKeysAggregator::FormatterType::IntegerThree;
} else if (_source == "system/volume") {
m_map.insert(_source, "volume");
m_formatter["volume"] = AWKeysAggregator::FormatterType::IntegerThree;
} else if (_source == "system/uptime") { } else if (_source == "system/uptime") {
// uptime // uptime
m_map[_source] = "uptime"; m_map.insert(_source, "uptime");
m_formatter["uptime"] = AWKeysAggregator::FormatterType::Uptime; m_formatter["uptime"] = AWKeysAggregator::FormatterType::Uptime;
// custom uptime // custom uptime
m_map.insertMulti(_source, "cuptime"); m_map.insert(_source, "cuptime");
m_formatter["cuptime"] = AWKeysAggregator::FormatterType::UptimeCustom; m_formatter["cuptime"] = AWKeysAggregator::FormatterType::UptimeCustom;
} else if (_source.startsWith("weather/temperature")) { } else if (_source.startsWith("weather/temperature")) {
// temperature // temperature
QString key = _source; QString key = _source;
key.remove("weather/"); key.remove("weather/");
m_map[_source] = key; m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Temperature; m_formatter[key] = AWKeysAggregator::FormatterType::Temperature;
} else if (_source.startsWith("weather/")) { } else if (_source.startsWith("weather/")) {
// other weather // other weather
QString key = _source; QString key = _source;
key.remove("weather/"); key.remove("weather/");
m_map[_source] = key; m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat; m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source.startsWith("load/load")) { } else if (_source.startsWith("load/load")) {
// load source // load source
QString key = _source; QString key = _source;
key.remove("load/"); key.remove("load/");
m_map[_source] = key; m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Temperature; m_formatter[key] = AWKeysAggregator::FormatterType::Temperature;
} }
@@ -415,8 +418,7 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source,
QStringList customFormattersKeys; QStringList customFormattersKeys;
if (m_customFormatters) if (m_customFormatters)
customFormattersKeys = m_customFormatters->definedFormatters(); customFormattersKeys = m_customFormatters->definedFormatters();
qCInfo(LOG_AW) << "Looking for formatters" << foundKeys << "in" qCInfo(LOG_AW) << "Looking for formatters" << foundKeys << "in" << customFormattersKeys;
<< customFormattersKeys;
for (auto &key : foundKeys) { for (auto &key : foundKeys) {
if (!customFormattersKeys.contains(key)) if (!customFormattersKeys.contains(key))
continue; continue;
@@ -425,11 +427,9 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source,
// drop key from dictionary if no one user requested key required it // drop key from dictionary if no one user requested key required it
qCInfo(LOG_AW) << "Looking for keys" << foundKeys << "in" << _keys; qCInfo(LOG_AW) << "Looking for keys" << foundKeys << "in" << _keys;
bool required bool required = _keys.isEmpty()
= _keys.isEmpty() || std::any_of(foundKeys.cbegin(), foundKeys.cend(), || 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)
@@ -19,7 +19,7 @@
#ifndef AWDATAENGINEMAPPER_H #ifndef AWDATAENGINEMAPPER_H
#define AWDATAENGINEMAPPER_H #define AWDATAENGINEMAPPER_H
#include <QHash> #include <QMultiHash>
#include <QObject> #include <QObject>
#include "awkeysaggregator.h" #include "awkeysaggregator.h"
@@ -32,12 +32,11 @@ class AWDataEngineMapper : public QObject
Q_OBJECT Q_OBJECT
public: public:
explicit AWDataEngineMapper(QObject *_parent = nullptr, explicit AWDataEngineMapper(QObject *_parent = nullptr, AWFormatterHelper *_custom = nullptr);
AWFormatterHelper *_custom = nullptr); ~AWDataEngineMapper() override;
virtual ~AWDataEngineMapper();
// get methods // get methods
AWKeysAggregator::FormatterType formatter(const QString &_key) const; [[nodiscard]] AWKeysAggregator::FormatterType formatter(const QString &_key) const;
QStringList keysFromSource(const QString &_source) const; [[nodiscard]] QStringList keysFromSource(const QString &_source) const;
// set methods // set methods
QStringList registerSource(const QString &_source, const QString &_units, QStringList registerSource(const QString &_source, const QString &_units,
const QStringList &_keys); const QStringList &_keys);
@@ -48,7 +47,7 @@ private:
// variables // variables
QHash<QString, QStringList> m_devices; QHash<QString, QStringList> m_devices;
QHash<QString, AWKeysAggregator::FormatterType> m_formatter; QHash<QString, AWKeysAggregator::FormatterType> m_formatter;
QHash<QString, QString> m_map; QMultiHash<QString, QString> m_map;
}; };
@@ -40,8 +40,8 @@ AWDBusAdaptor::~AWDBusAdaptor()
QStringList AWDBusAdaptor::ActiveServices() const QStringList AWDBusAdaptor::ActiveServices() const
{ {
QDBusMessage listServices = QDBusConnection::sessionBus().interface()->call( QDBusMessage listServices
QDBus::BlockWithGui, "ListNames"); = QDBusConnection::sessionBus().interface()->call(QDBus::BlockWithGui, "ListNames");
if (listServices.arguments().isEmpty()) { if (listServices.arguments().isEmpty()) {
qCWarning(LOG_DBUS) << "Could not find any DBus service"; qCWarning(LOG_DBUS) << "Could not find any DBus service";
return {}; return {};
@@ -49,7 +49,7 @@ QStringList AWDBusAdaptor::ActiveServices() const
QStringList arguments = listServices.arguments().first().toStringList(); QStringList arguments = listServices.arguments().first().toStringList();
return std::accumulate(arguments.cbegin(), arguments.cend(), QStringList(), return std::accumulate(arguments.cbegin(), arguments.cend(), QStringList(),
[](QStringList &source, QString service) { [](QStringList &source, const QString &service) {
if (service.startsWith(AWDBUS_SERVICE)) if (service.startsWith(AWDBUS_SERVICE))
source.append(service); source.append(service);
return source; return source;
@@ -86,8 +86,8 @@ void AWDBusAdaptor::SetLogLevel(const QString &what, const int level)
qCDebug(LOG_DBUS) << "Set log level" << level << "for" << what; qCDebug(LOG_DBUS) << "Set log level" << level << "for" << what;
if (level >= m_logLevels.count()) { if (level >= m_logLevels.count()) {
qCDebug(LOG_DBUS) << "Invalid logging level" << level qCDebug(LOG_DBUS) << "Invalid logging level" << level << "should be less than"
<< "should be less than" << m_logLevels.count(); << m_logLevels.count();
return; return;
} }
@@ -96,19 +96,15 @@ void AWDBusAdaptor::SetLogLevel(const QString &what, const int level)
} }
void AWDBusAdaptor::SetLogLevel(const QString &what, const QString &level, void AWDBusAdaptor::SetLogLevel(const QString &what, const QString &level, const bool enabled)
const bool enabled)
{ {
qCDebug(LOG_DBUS) << "Set log level" << level << "enabled" << enabled qCDebug(LOG_DBUS) << "Set log level" << level << "enabled" << enabled << "for" << what;
<< "for" << what;
if (!m_logLevels.contains(level)) { if (!m_logLevels.contains(level)) {
qCDebug(LOG_DBUS) << "Invalid logging level" << level << "should be in" qCDebug(LOG_DBUS) << "Invalid logging level" << level << "should be in" << m_logLevels;
<< m_logLevels;
return; return;
} }
QString state = enabled ? "true" : "false"; QString state = enabled ? "true" : "false";
QLoggingCategory::setFilterRules( QLoggingCategory::setFilterRules(QString("%1.%2=%3").arg(what).arg(level).arg(state));
QString("%1.%2=%3").arg(what).arg(level).arg(state));
} }
@@ -33,19 +33,18 @@ class AWDBusAdaptor : public QDBusAbstractAdaptor
public: public:
explicit AWDBusAdaptor(AWKeys *_parent = nullptr); explicit AWDBusAdaptor(AWKeys *_parent = nullptr);
virtual ~AWDBusAdaptor(); ~AWDBusAdaptor() override;
public slots: public slots:
// get methods // get methods
QStringList ActiveServices() const; [[nodiscard]] QStringList ActiveServices() const;
QString Info(const QString &key) const; [[nodiscard]] QString Info(const QString &key) const;
QStringList Keys(const QString &regexp) const; [[nodiscard]] QStringList Keys(const QString &regexp) const;
QString Value(const QString &key) const; [[nodiscard]] QString Value(const QString &key) const;
qlonglong WhoAmI() const; [[nodiscard]] qlonglong WhoAmI() const;
// set methods // set methods
void SetLogLevel(const QString &what, const int level); void SetLogLevel(const QString &what, int level);
void SetLogLevel(const QString &what, const QString &level, void SetLogLevel(const QString &what, const QString &level, bool enabled);
const bool enabled);
private: private:
AWKeys *m_plugin = nullptr; AWKeys *m_plugin = nullptr;
@@ -28,7 +28,7 @@ class AWPlugin : public QQmlExtensionPlugin
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface") Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
public: public:
void registerTypes(const char *uri); void registerTypes(const char *uri) override;
}; };
@@ -29,7 +29,7 @@ class AWFormatterConfig : public AWAbstractPairConfig
public: public:
explicit AWFormatterConfig(QWidget *_parent = nullptr, explicit AWFormatterConfig(QWidget *_parent = nullptr,
const QStringList &_keys = QStringList()); const QStringList &_keys = QStringList());
virtual ~AWFormatterConfig(); ~AWFormatterConfig() override;
}; };
@@ -35,12 +35,11 @@
AWFormatterHelper::AWFormatterHelper(QWidget *_parent) AWFormatterHelper::AWFormatterHelper(QWidget *_parent)
: AbstractExtItemAggregator(_parent, "formatters") : AbstractExtItemAggregator(_parent, "formatters")
, AWAbstractPairHelper("awesomewidgets/formatters/formatters.ini", , AWAbstractPairHelper("awesomewidgets/formatters/formatters.ini", "Formatters")
"Formatters")
{ {
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
initItems(); AWFormatterHelper::initItems();
} }
@@ -56,15 +55,13 @@ AWFormatterHelper::~AWFormatterHelper()
void AWFormatterHelper::initItems() void AWFormatterHelper::initItems()
{ {
initFormatters(); initFormatters();
AWAbstractPairHelper::initItems();
// assign internal storage // assign internal storage
m_formatters.clear(); m_formatters.clear();
for (auto &key : pairs().keys()) { for (auto &key : pairs().keys()) {
auto name = pairs()[key]; auto name = pairs()[key];
if (!m_formattersClasses.contains(name)) { if (!m_formattersClasses.contains(name)) {
qCWarning(LOG_AW) qCWarning(LOG_AW) << "Invalid formatter" << name << "found in" << key;
<< "Invalid formatter" << name << "found in" << key;
continue; continue;
} }
@@ -73,13 +70,11 @@ void AWFormatterHelper::initItems()
} }
QString AWFormatterHelper::convert(const QVariant &_value, QString AWFormatterHelper::convert(const QVariant &_value, const QString &_name) const
const QString &_name) const
{ {
qCDebug(LOG_AW) << "Convert value" << _value << "for" << _name; qCDebug(LOG_AW) << "Convert value" << _value << "for" << _name;
return m_formatters.contains(_name) ? m_formatters[_name]->convert(_value) return m_formatters.contains(_name) ? m_formatters[_name]->convert(_value) : _value.toString();
: _value.toString();
} }
@@ -126,12 +121,11 @@ void AWFormatterHelper::editItems()
AWAbstractFormatter::FormatterClass AWAbstractFormatter::FormatterClass
AWFormatterHelper::defineFormatterClass(const QString &_stringType) const AWFormatterHelper::defineFormatterClass(const QString &_stringType)
{ {
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 == "DateTime")
formatter = AWAbstractFormatter::FormatterClass::DateTime; formatter = AWAbstractFormatter::FormatterClass::DateTime;
else if (_stringType == "Float") else if (_stringType == "Float")
@@ -177,32 +171,25 @@ void AWFormatterHelper::initFormatters()
auto metadata = readMetadata(filePath); auto metadata = readMetadata(filePath);
switch (metadata.second) { switch (metadata.second) {
case AWAbstractFormatter::FormatterClass::DateTime: case AWAbstractFormatter::FormatterClass::DateTime:
m_formattersClasses[metadata.first] m_formattersClasses[metadata.first] = new AWDateTimeFormatter(this, filePath);
= new AWDateTimeFormatter(this, filePath);
break; break;
case AWAbstractFormatter::FormatterClass::Float: case AWAbstractFormatter::FormatterClass::Float:
m_formattersClasses[metadata.first] m_formattersClasses[metadata.first] = new AWFloatFormatter(this, filePath);
= new AWFloatFormatter(this, filePath);
break; break;
case AWAbstractFormatter::FormatterClass::List: case AWAbstractFormatter::FormatterClass::List:
m_formattersClasses[metadata.first] m_formattersClasses[metadata.first] = new AWListFormatter(this, filePath);
= new AWListFormatter(this, filePath);
break; break;
case AWAbstractFormatter::FormatterClass::Script: case AWAbstractFormatter::FormatterClass::Script:
m_formattersClasses[metadata.first] m_formattersClasses[metadata.first] = new AWScriptFormatter(this, filePath);
= new AWScriptFormatter(this, filePath);
break; break;
case AWAbstractFormatter::FormatterClass::String: case AWAbstractFormatter::FormatterClass::String:
m_formattersClasses[metadata.first] m_formattersClasses[metadata.first] = new AWStringFormatter(this, filePath);
= new AWStringFormatter(this, filePath);
break; break;
case AWAbstractFormatter::FormatterClass::Json: case AWAbstractFormatter::FormatterClass::Json:
m_formattersClasses[metadata.first] m_formattersClasses[metadata.first] = new AWJsonFormatter(this, filePath);
= new AWJsonFormatter(this, filePath);
break; break;
case AWAbstractFormatter::FormatterClass::NoFormat: case AWAbstractFormatter::FormatterClass::NoFormat:
m_formattersClasses[metadata.first] m_formattersClasses[metadata.first] = new AWNoFormatter(this, filePath);
= new AWNoFormatter(this, filePath);
break; break;
} }
} }
@@ -211,7 +198,7 @@ void AWFormatterHelper::initFormatters()
QPair<QString, AWAbstractFormatter::FormatterClass> QPair<QString, AWAbstractFormatter::FormatterClass>
AWFormatterHelper::readMetadata(const QString &_filePath) const AWFormatterHelper::readMetadata(const QString &_filePath)
{ {
qCDebug(LOG_AW) << "Read initial parameters from" << _filePath; qCDebug(LOG_AW) << "Read initial parameters from" << _filePath;
@@ -228,19 +215,17 @@ AWFormatterHelper::readMetadata(const QString &_filePath) const
void AWFormatterHelper::doCreateItem() void AWFormatterHelper::doCreateItem()
{ {
QStringList selection QStringList selection = {"NoFormat", "DateTime", "Float", "List", "Script", "String", "Json"};
= {"NoFormat", "DateTime", "Float", "List", "Script", "String", "Json"};
bool ok; bool ok;
QString select = QInputDialog::getItem( QString select
this, i18n("Select type"), i18n("Type:"), selection, 0, false, &ok); = QInputDialog::getItem(this, i18n("Select type"), i18n("Type:"), selection, 0, false, &ok);
if (!ok) { if (!ok) {
qCWarning(LOG_AW) << "No type selected"; qCWarning(LOG_AW) << "No type selected";
return; return;
} }
qCInfo(LOG_AW) << "Selected type" << select; qCInfo(LOG_AW) << "Selected type" << select;
AWAbstractFormatter::FormatterClass formatter AWAbstractFormatter::FormatterClass formatter = defineFormatterClass(select);
= defineFormatterClass(select);
switch (formatter) { switch (formatter) {
case AWAbstractFormatter::FormatterClass::DateTime: case AWAbstractFormatter::FormatterClass::DateTime:
return createItem<AWDateTimeFormatter>(); return createItem<AWDateTimeFormatter>();
@@ -24,37 +24,35 @@
#include "awabstractpairhelper.h" #include "awabstractpairhelper.h"
class AWFormatterHelper : public AbstractExtItemAggregator, class AWFormatterHelper : public AbstractExtItemAggregator, public AWAbstractPairHelper
public AWAbstractPairHelper
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit AWFormatterHelper(QWidget *_parent = nullptr); explicit AWFormatterHelper(QWidget *_parent = nullptr);
virtual ~AWFormatterHelper(); ~AWFormatterHelper() override;
// read-write methods // read-write methods
void initItems(); void initItems() override;
// methods // methods
QString convert(const QVariant &_value, const QString &_name) const; [[nodiscard]] QString convert(const QVariant &_value, const QString &_name) const;
QStringList definedFormatters() const; [[nodiscard]] QStringList definedFormatters() const;
QList<AbstractExtItem *> items() const; [[nodiscard]] QList<AbstractExtItem *> items() const override;
// configuration related // configuration related
virtual void editPairs(); void editPairs() override;
virtual QStringList leftKeys(); QStringList leftKeys() override;
virtual QStringList rightKeys(); QStringList rightKeys() override;
public slots: public slots:
void editItems(); void editItems();
private: private:
// methods // methods
AWAbstractFormatter::FormatterClass static AWAbstractFormatter::FormatterClass defineFormatterClass(const QString &_stringType);
defineFormatterClass(const QString &_stringType) const;
void initFormatters(); void initFormatters();
QPair<QString, AWAbstractFormatter::FormatterClass> [[nodiscard]] static QPair<QString, AWAbstractFormatter::FormatterClass>
readMetadata(const QString &_filePath) const; readMetadata(const QString &_filePath);
// parent methods // parent methods
void doCreateItem(); void doCreateItem() override;
// properties // properties
QHash<QString, AWAbstractFormatter *> m_formatters; QHash<QString, AWAbstractFormatter *> m_formatters;
QHash<QString, AWAbstractFormatter *> m_formattersClasses; QHash<QString, AWAbstractFormatter *> m_formattersClasses;
+25 -37
View File
@@ -15,6 +15,7 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/ ***************************************************************************/
#include "awkeycache.h" #include "awkeycache.h"
#include <QDir> #include <QDir>
@@ -29,9 +30,9 @@ 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
.arg(QStandardPaths::writableLocation( = QString("%1/awesomewidgets.ndx")
QStandardPaths::GenericCacheLocation)); .arg(QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation));
qCInfo(LOG_AW) << "Cache file" << fileName; qCInfo(LOG_AW) << "Cache file" << fileName;
QSettings cache(fileName, QSettings::IniFormat); QSettings cache(fileName, QSettings::IniFormat);
@@ -41,8 +42,7 @@ bool AWKeyCache::addKeyToCache(const QString &_type, const QString &_key)
cachedValues.append(cache.value(number).toString()); cachedValues.append(cache.value(number).toString());
if (_type == "hdd") { if (_type == "hdd") {
QStringList allDevices QStringList allDevices = QDir("/dev").entryList(QDir::System, QDir::Name);
= QDir("/dev").entryList(QDir::System, QDir::Name);
QStringList devices = allDevices.filter(QRegExp("^[hms]d[a-z]$")); QStringList devices = allDevices.filter(QRegExp("^[hms]d[a-z]$"));
for (auto &dev : devices) { for (auto &dev : devices) {
QString device = QString("/dev/%1").arg(dev); QString device = QString("/dev/%1").arg(dev);
@@ -50,30 +50,23 @@ bool AWKeyCache::addKeyToCache(const QString &_type, const QString &_key)
continue; continue;
qCInfo(LOG_AW) << "Found new key" << device << "for type" << _type; qCInfo(LOG_AW) << "Found new key" << device << "for type" << _type;
cachedValues.append(device); cachedValues.append(device);
cache.setValue( cache.setValue(QString("%1").arg(cache.allKeys().count(), 3, 10, QChar('0')), device);
QString("%1").arg(cache.allKeys().count(), 3, 10, QChar('0')),
device);
} }
} else if (_type == "net") { } else if (_type == "net") {
QList<QNetworkInterface> rawInterfaceList QList<QNetworkInterface> rawInterfaceList = QNetworkInterface::allInterfaces();
= QNetworkInterface::allInterfaces();
for (auto &interface : rawInterfaceList) { for (auto &interface : rawInterfaceList) {
QString device = interface.name(); QString device = interface.name();
if (cachedValues.contains(device)) if (cachedValues.contains(device))
continue; continue;
qCInfo(LOG_AW) << "Found new key" << device << "for type" << _type; qCInfo(LOG_AW) << "Found new key" << device << "for type" << _type;
cachedValues.append(device); cachedValues.append(device);
cache.setValue( cache.setValue(QString("%1").arg(cache.allKeys().count(), 3, 10, QChar('0')), device);
QString("%1").arg(cache.allKeys().count(), 3, 10, QChar('0')),
device);
} }
} else { } else {
if (cachedValues.contains(_key)) if (cachedValues.contains(_key))
return false; return false;
qCInfo(LOG_AW) << "Found new key" << _key << "for type" << _type; qCInfo(LOG_AW) << "Found new key" << _key << "for type" << _type;
cache.setValue( cache.setValue(QString("%1").arg(cache.allKeys().count(), 3, 10, QChar('0')), _key);
QString("%1").arg(cache.allKeys().count(), 3, 10, QChar('0')),
_key);
} }
cache.endGroup(); cache.endGroup();
@@ -82,19 +75,17 @@ 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 QStringList &_userKeys,
const QVariantMap &_tooltip,
const QStringList &_userKeys,
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"
<< "using tooltip settings" << _tooltip; << _tooltip;
// initial copy // initial copy
QSet<QString> used = QSet<QString>::fromList(_keys); QSet<QString> used(_keys.cbegin(), _keys.cend());
used.unite(QSet<QString>::fromList(_bars)); used.unite(QSet(_bars.cbegin(), _bars.cend()));
used.unite(QSet<QString>::fromList(_userKeys)); used.unite(QSet(_userKeys.cbegin(), _userKeys.cend()));
// insert keys from tooltip // insert keys from tooltip
for (auto &key : _tooltip.keys()) { for (auto &key : _tooltip.keys()) {
if ((key.endsWith("Tooltip")) && (_tooltip[key].toBool())) { if ((key.endsWith("Tooltip")) && (_tooltip[key].toBool())) {
@@ -110,8 +101,7 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys,
continue; continue;
key.remove("hddtotmb"); key.remove("hddtotmb");
int index = key.toInt(); int index = key.toInt();
used << QString("hddfreemb%1").arg(index) used << QString("hddfreemb%1").arg(index) << QString("hddmb%1").arg(index);
<< QString("hddmb%1").arg(index);
} }
// hddtotgb* // hddtotgb*
for (auto &key : _allKeys.filter(QRegExp("^hddtotgb"))) { for (auto &key : _allKeys.filter(QRegExp("^hddtotgb"))) {
@@ -119,8 +109,7 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys,
continue; continue;
key.remove("hddtotgb"); key.remove("hddtotgb");
int index = key.toInt(); int index = key.toInt();
used << QString("hddfreegb%1").arg(index) used << QString("hddfreegb%1").arg(index) << QString("hddgb%1").arg(index);
<< QString("hddgb%1").arg(index);
} }
// mem // mem
if (used.contains("mem")) if (used.contains("mem"))
@@ -147,13 +136,12 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys,
used << "swapgb" used << "swapgb"
<< "swapfreegb"; << "swapfreegb";
// network keys // network keys
QStringList netKeys({"up", "upkb", "uptot", "uptotkb", "upunits", "down", QStringList netKeys({"up", "upkb", "uptot", "uptotkb", "upunits", "down", "downkb", "downtot",
"downkb", "downtot", "downtotkb", "downunits"}); "downtotkb", "downunits"});
for (auto &key : netKeys) { 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;
} }
@@ -167,15 +155,15 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys,
if (used.isEmpty()) if (used.isEmpty())
used << "dummy"; used << "dummy";
return used.toList(); return used.values();
} }
QHash<QString, QStringList> AWKeyCache::loadKeysFromCache() QHash<QString, QStringList> AWKeyCache::loadKeysFromCache()
{ {
QString fileName = QString("%1/awesomewidgets.ndx") QString fileName
.arg(QStandardPaths::writableLocation( = QString("%1/awesomewidgets.ndx")
QStandardPaths::GenericCacheLocation)); .arg(QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation));
qCInfo(LOG_AW) << "Cache file" << fileName; qCInfo(LOG_AW) << "Cache file" << fileName;
QSettings cache(fileName, QSettings::IniFormat); QSettings cache(fileName, QSettings::IniFormat);
+2 -3
View File
@@ -28,11 +28,10 @@ namespace AWKeyCache
{ {
bool addKeyToCache(const QString &_type, const QString &_key = ""); bool addKeyToCache(const QString &_type, const QString &_key = "");
QStringList getRequiredKeys(const QStringList &_keys, const QStringList &_bars, QStringList getRequiredKeys(const QStringList &_keys, const QStringList &_bars,
const QVariantMap &_tooltip, const QVariantMap &_tooltip, const QStringList &_userKeys,
const QStringList &_userKeys,
const QStringList &_allKeys); const QStringList &_allKeys);
QHash<QString, QStringList> loadKeysFromCache(); QHash<QString, QStringList> loadKeysFromCache();
}; } // namespace AWKeyCache
#endif /* AWKEYCACHE_H */ #endif /* AWKEYCACHE_H */
@@ -41,10 +41,8 @@ AWKeyOperations::AWKeyOperations(QObject *_parent)
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
m_customKeys = new AWCustomKeysHelper(this); m_customKeys = new AWCustomKeysHelper(this);
m_graphicalItems m_graphicalItems = new ExtItemAggregator<GraphicalItem>(nullptr, "desktops");
= new ExtItemAggregator<GraphicalItem>(nullptr, "desktops"); m_extNetRequest = new ExtItemAggregator<ExtNetworkRequest>(nullptr, "requests");
m_extNetRequest
= new ExtItemAggregator<ExtNetworkRequest>(nullptr, "requests");
m_extQuotes = new ExtItemAggregator<ExtQuotes>(nullptr, "quotes"); m_extQuotes = new ExtItemAggregator<ExtQuotes>(nullptr, "quotes");
m_extScripts = new ExtItemAggregator<ExtScript>(nullptr, "scripts"); m_extScripts = new ExtItemAggregator<ExtScript>(nullptr, "scripts");
m_extUpgrade = new ExtItemAggregator<ExtUpgrade>(nullptr, "upgrade"); m_extUpgrade = new ExtItemAggregator<ExtUpgrade>(nullptr, "upgrade");
@@ -134,24 +132,25 @@ QStringList AWKeyOperations::dictKeys() const
// battery // battery
QStringList allBatteryDevices QStringList allBatteryDevices
= QDir("/sys/class/power_supply") = QDir("/sys/class/power_supply")
.entryList(QStringList({"BAT*"}), .entryList(QStringList({"BAT*"}), QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name);
QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name); for (int i = 0; i < allBatteryDevices.count(); i++) {
for (int i = 0; i < allBatteryDevices.count(); i++)
allKeys.append(QString("bat%1").arg(i)); allKeys.append(QString("bat%1").arg(i));
allKeys.append(QString("batleft%1").arg(i));
allKeys.append(QString("batnow%1").arg(i));
allKeys.append(QString("batrate%1").arg(i));
allKeys.append(QString("battotal%1").arg(i));
}
// package manager // package manager
for (auto &item : m_extUpgrade->activeItems()) for (auto &item : m_extUpgrade->activeItems())
allKeys.append(item->tag("pkgcount")); allKeys.append(item->tag("pkgcount"));
// quotes // quotes
for (auto &item : m_extQuotes->activeItems()) { for (auto &item : m_extQuotes->activeItems()) {
allKeys.append(item->tag("ask"));
allKeys.append(item->tag("askchg"));
allKeys.append(item->tag("percaskchg"));
allKeys.append(item->tag("bid"));
allKeys.append(item->tag("bidchg"));
allKeys.append(item->tag("percbidchg"));
allKeys.append(item->tag("price")); allKeys.append(item->tag("price"));
allKeys.append(item->tag("pricechg")); allKeys.append(item->tag("pricechg"));
allKeys.append(item->tag("percpricechg")); allKeys.append(item->tag("percpricechg"));
allKeys.append(item->tag("volume"));
allKeys.append(item->tag("volumechg"));
allKeys.append(item->tag("percvolumechg"));
} }
// custom // custom
for (auto &item : m_extScripts->activeItems()) for (auto &item : m_extScripts->activeItems())
@@ -223,8 +222,7 @@ QString AWKeyOperations::infoByKey(const QString &_key) const
QString index = _key; QString index = _key;
index.remove(QRegExp("hdd[rw]")); index.remove(QRegExp("hdd[rw]"));
output = m_devices["disk"][index.toInt()]; output = m_devices["disk"][index.toInt()];
} else if (_key.contains( } else if (_key.contains(QRegExp("^hdd([0-9]|mb|gb|freemb|freegb|totmb|totgb)"))) {
QRegExp("^hdd([0-9]|mb|gb|freemb|freegb|totmb|totgb)"))) {
QString index = _key; QString index = _key;
index.remove(QRegExp("^hdd(|mb|gb|freemb|freegb|totmb|totgb)")); index.remove(QRegExp("^hdd(|mb|gb|freemb|freegb|totmb|totgb)"));
output = m_devices["mount"][index.toInt()]; output = m_devices["mount"][index.toInt()];
@@ -244,8 +242,7 @@ QString AWKeyOperations::infoByKey(const QString &_key) const
AbstractExtItem *item = m_extQuotes->itemByTag(_key, stripped); AbstractExtItem *item = m_extQuotes->itemByTag(_key, stripped);
if (item) if (item)
output = item->uniq(); output = item->uniq();
} else if (_key.contains(QRegExp( } else if (_key.contains(QRegExp("(weather|weatherId|humidity|pressure|temperature)"))) {
"(weather|weatherId|humidity|pressure|temperature)"))) {
AbstractExtItem *item = m_extWeather->itemByTag(_key, stripped); AbstractExtItem *item = m_extWeather->itemByTag(_key, stripped);
if (item) if (item)
output = item->uniq(); output = item->uniq();
@@ -284,8 +281,8 @@ void AWKeyOperations::editItem(const QString &_type)
qCDebug(LOG_AW) << "Item type" << _type; qCDebug(LOG_AW) << "Item type" << _type;
if (_type == "graphicalitem") { if (_type == "graphicalitem") {
QStringList keys = dictKeys().filter( QStringList keys
QRegExp("^(cpu(?!cl).*|gpu$|mem$|swap$|hdd[0-9].*|bat.*)")); = dictKeys().filter(QRegExp("^(cpu(?!cl).*|gpu$|mem$|swap$|hdd[0-9].*|bat.*)"));
keys.sort(); keys.sort();
m_graphicalItems->setConfigArgs(keys); m_graphicalItems->setConfigArgs(keys);
return m_graphicalItems->editItems(); return m_graphicalItems->editItems();
+10 -10
View File
@@ -39,19 +39,19 @@ class AWKeyOperations : public QObject
public: public:
explicit AWKeyOperations(QObject *_parent = nullptr); explicit AWKeyOperations(QObject *_parent = nullptr);
virtual ~AWKeyOperations(); ~AWKeyOperations() override;
QStringList devices(const QString &_type) const; [[nodiscard]] QStringList devices(const QString &_type) const;
QHash<QString, QStringList> devices() const; [[nodiscard]] QHash<QString, QStringList> devices() const;
void updateCache(); void updateCache();
// keys // keys
QStringList dictKeys() const; [[nodiscard]] QStringList dictKeys() const;
GraphicalItem *giByKey(const QString &_key) const; [[nodiscard]] GraphicalItem *giByKey(const QString &_key) const;
QStringList requiredUserKeys() const; [[nodiscard]] QStringList requiredUserKeys() const;
QStringList userKeys() const; [[nodiscard]] QStringList userKeys() const;
QString userKeySource(const QString &_key) const; [[nodiscard]] QString userKeySource(const QString &_key) const;
// values // values
QString infoByKey(const QString &_key) const; [[nodiscard]] QString infoByKey(const QString &_key) const;
QString pattern() const; [[nodiscard]] QString pattern() const;
void setPattern(const QString &_currentPattern); void setPattern(const QString &_currentPattern);
// configuration // configuration
void editItem(const QString &_type); void editItem(const QString &_type);
+41 -66
View File
@@ -62,11 +62,11 @@ AWKeys::AWKeys(QObject *_parent)
// transfer signal from AWDataAggregator object to QML ui // transfer signal from AWDataAggregator object to QML ui
connect(m_dataAggregator, SIGNAL(toolTipPainted(const QString &)), this, connect(m_dataAggregator, SIGNAL(toolTipPainted(const QString &)), this,
SIGNAL(needToolTipToBeUpdated(const QString &))); SIGNAL(needToolTipToBeUpdated(const QString &)));
connect(this, SIGNAL(dropSourceFromDataengine(const QString &)), connect(this, SIGNAL(dropSourceFromDataengine(const QString &)), m_dataEngineAggregator,
m_dataEngineAggregator, SLOT(dropSource(const QString &))); SLOT(dropSource(const 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(m_dataEngineAggregator, SIGNAL(deviceAdded(const QString &)), m_keyOperator,
m_keyOperator, SLOT(addDevice(const QString &))); SLOT(addDevice(const QString &)));
} }
@@ -76,7 +76,7 @@ AWKeys::~AWKeys()
m_timer->stop(); m_timer->stop();
// delete dbus session // delete dbus session
qlonglong id = reinterpret_cast<qlonglong>(this); auto id = reinterpret_cast<qlonglong>(this);
QDBusConnection::sessionBus().unregisterObject(QString("/%1").arg(id)); QDBusConnection::sessionBus().unregisterObject(QString("/%1").arg(id));
} }
@@ -91,17 +91,15 @@ void AWKeys::initDataAggregator(const QVariantMap &_tooltipParams)
} }
void AWKeys::initKeys(const QString &_currentPattern, const int _interval, void AWKeys::initKeys(const QString &_currentPattern, const int _interval, const int _limit,
const int _limit, const bool _optimize) const bool _optimize)
{ {
qCDebug(LOG_AW) << "Pattern" << _currentPattern << "with interval" qCDebug(LOG_AW) << "Pattern" << _currentPattern << "with interval" << _interval
<< _interval << "and queue limit" << _limit << "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(); m_aggregator->initFormatters();
m_keyOperator->setPattern(_currentPattern); m_keyOperator->setPattern(_currentPattern);
@@ -138,8 +136,7 @@ void AWKeys::updateCache()
QStringList AWKeys::dictKeys(const bool _sorted, const QString &_regexp) const QStringList AWKeys::dictKeys(const bool _sorted, const QString &_regexp) const
{ {
qCDebug(LOG_AW) << "Should be sorted" << _sorted << "and filter applied" qCDebug(LOG_AW) << "Should be sorted" << _sorted << "and filter applied" << _regexp;
<< _regexp;
// check if functions asked // check if functions asked
if (_regexp == "functions") if (_regexp == "functions")
@@ -190,10 +187,9 @@ QString AWKeys::valueByKey(const QString &_key) const
{ {
qCDebug(LOG_AW) << "Requested value for key" << _key; qCDebug(LOG_AW) << "Requested value for key" << _key;
QString trueKey QString trueKey = _key.startsWith("bar") ? m_keyOperator->infoByKey(_key) : _key;
= _key.startsWith("bar") ? m_keyOperator->infoByKey(_key) : _key;
return m_aggregator->formatter(m_values[trueKey], trueKey); return m_aggregator->formatter(m_values[trueKey], trueKey, true);
} }
@@ -205,12 +201,10 @@ void AWKeys::editItem(const QString &_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);
} }
@@ -219,28 +213,24 @@ void AWKeys::reinitKeys(const QStringList &_currentKeys)
qCDebug(LOG_AW) << "Update found keys by using list" << _currentKeys; qCDebug(LOG_AW) << "Update found keys by using list" << _currentKeys;
// append lists // append lists
m_foundBars = AWPatternFunctions::findKeys(m_keyOperator->pattern(), m_foundBars = AWPatternFunctions::findKeys(m_keyOperator->pattern(), _currentKeys, true);
_currentKeys, true); m_foundKeys = AWPatternFunctions::findKeys(m_keyOperator->pattern(), _currentKeys, false);
m_foundKeys = AWPatternFunctions::findKeys(m_keyOperator->pattern(),
_currentKeys, false);
m_foundLambdas = AWPatternFunctions::findLambdas(m_keyOperator->pattern()); m_foundLambdas = AWPatternFunctions::findLambdas(m_keyOperator->pattern());
// generate list of required keys for bars // generate list of required keys for bars
QStringList barKeys; QStringList barKeys;
for (auto &bar : m_foundBars) { for (auto &bar : m_foundBars) {
GraphicalItem *item = m_keyOperator->giByKey(bar); GraphicalItem *item = m_keyOperator->giByKey(bar);
if (item->isCustom()) if (item->isCustom())
item->setUsedKeys( item->setUsedKeys(AWPatternFunctions::findKeys(item->bar(), _currentKeys, false));
AWPatternFunctions::findKeys(item->bar(), _currentKeys, false));
else else
item->setUsedKeys(QStringList() << item->bar()); item->setUsedKeys(QStringList() << item->bar());
barKeys.append(item->usedKeys()); barKeys.append(item->usedKeys());
} }
// get required keys // get required keys
m_requiredKeys = m_optimize m_requiredKeys
? AWKeyCache::getRequiredKeys( = m_optimize ? AWKeyCache::getRequiredKeys(m_foundKeys, barKeys, m_tooltipParams,
m_foundKeys, barKeys, m_tooltipParams, m_keyOperator->requiredUserKeys(), _currentKeys)
m_keyOperator->requiredUserKeys(), _currentKeys) : QStringList();
: QStringList();
// set key data to m_aggregator // set key data to m_aggregator
m_aggregator->setDevices(m_keyOperator->devices()); m_aggregator->setDevices(m_keyOperator->devices());
@@ -278,17 +268,13 @@ void AWKeys::calculateValues()
} }
// memtot* // memtot*
m_values["memtotmb"] m_values["memtotmb"] = m_values["memusedmb"].toInt() + m_values["memfreemb"].toInt();
= m_values["memusedmb"].toInt() + m_values["memfreemb"].toInt(); m_values["memtotgb"] = m_values["memusedgb"].toFloat() + m_values["memfreegb"].toFloat();
m_values["memtotgb"]
= m_values["memusedgb"].toFloat() + m_values["memfreegb"].toFloat();
// mem // mem
m_values["mem"] m_values["mem"] = 100.0f * m_values["memmb"].toFloat() / m_values["memtotmb"].toFloat();
= 100.0f * m_values["memmb"].toFloat() / m_values["memtotmb"].toFloat();
// up, down, upkb, downkb, upunits, downunits // up, down, upkb, downkb, upunits, downunits
int netIndex int netIndex = m_keyOperator->devices("net").indexOf(m_values["netdev"].toString());
= m_keyOperator->devices("net").indexOf(m_values["netdev"].toString());
m_values["down"] = m_values[QString("down%1").arg(netIndex)]; m_values["down"] = m_values[QString("down%1").arg(netIndex)];
m_values["downkb"] = m_values[QString("downkb%1").arg(netIndex)]; m_values["downkb"] = m_values[QString("downkb%1").arg(netIndex)];
m_values["downtot"] = m_values[QString("downtot%1").arg(netIndex)]; m_values["downtot"] = m_values[QString("downtot%1").arg(netIndex)];
@@ -301,13 +287,10 @@ void AWKeys::calculateValues()
m_values["upunits"] = m_values[QString("upunits%1").arg(netIndex)]; m_values["upunits"] = m_values[QString("upunits%1").arg(netIndex)];
// swaptot* // swaptot*
m_values["swaptotmb"] m_values["swaptotmb"] = m_values["swapmb"].toInt() + m_values["swapfreemb"].toInt();
= m_values["swapmb"].toInt() + m_values["swapfreemb"].toInt(); m_values["swaptotgb"] = m_values["swapgb"].toFloat() + m_values["swapfreegb"].toFloat();
m_values["swaptotgb"]
= m_values["swapgb"].toFloat() + m_values["swapfreegb"].toFloat();
// swap // swap
m_values["swap"] = 100.0f * m_values["swapmb"].toFloat() m_values["swap"] = 100.0f * m_values["swapmb"].toFloat() / m_values["swaptotmb"].toFloat();
/ m_values["swaptotmb"].toFloat();
// user defined keys // user defined keys
for (auto &key : m_keyOperator->userKeys()) for (auto &key : m_keyOperator->userKeys())
@@ -315,22 +298,20 @@ void AWKeys::calculateValues()
// lambdas // lambdas
for (auto &key : m_foundLambdas) for (auto &key : m_foundLambdas)
m_values[key] = AWPatternFunctions::expandLambdas( m_values[key] = AWPatternFunctions::expandLambdas(key, m_aggregator, m_values, m_foundKeys);
key, m_aggregator, m_values, m_foundKeys);
} }
void AWKeys::createDBusInterface() void AWKeys::createDBusInterface()
{ {
// get this object id // get this object id
qlonglong id = reinterpret_cast<qlonglong>(this); auto id = reinterpret_cast<qlonglong>(this);
// create session // create session
QDBusConnection instanceBus = QDBusConnection::sessionBus(); QDBusConnection instanceBus = QDBusConnection::sessionBus();
// HACK we are going to use different services because it binds to // HACK we are going to use different services because it binds to
// application // application
if (instanceBus.registerService( if (instanceBus.registerService(QString("%1.i%2").arg(AWDBUS_SERVICE).arg(id))) {
QString("%1.i%2").arg(AWDBUS_SERVICE).arg(id))) {
if (!instanceBus.registerObject(AWDBUS_PATH, new AWDBusAdaptor(this), if (!instanceBus.registerObject(AWDBUS_PATH, new AWDBusAdaptor(this),
QDBusConnection::ExportAllContents)) QDBusConnection::ExportAllContents))
qCWarning(LOG_AW) << "Could not register DBus object, last error" qCWarning(LOG_AW) << "Could not register DBus object, last error"
@@ -360,16 +341,14 @@ QString AWKeys::parsePattern(QString _pattern) const
// main keys // main keys
for (auto &key : m_foundKeys) for (auto &key : m_foundKeys)
_pattern.replace(QString("$%1").arg(key), _pattern.replace(QString("$%1").arg(key),
m_aggregator->formatter(m_values[key], key)); m_aggregator->formatter(m_values[key], key, true));
// bars // bars
for (auto &bar : m_foundBars) { for (auto &bar : m_foundBars) {
GraphicalItem *item = m_keyOperator->giByKey(bar); GraphicalItem *item = m_keyOperator->giByKey(bar);
QString image QString image = item->isCustom() ? item->image(AWPatternFunctions::expandLambdas(
= item->isCustom() item->bar(), m_aggregator, m_values, item->usedKeys()))
? item->image(AWPatternFunctions::expandLambdas( : item->image(m_values[item->bar()]);
item->bar(), m_aggregator, m_values, item->usedKeys()))
: item->image(m_values[item->bar()]);
_pattern.replace(QString("$%1").arg(bar), image); _pattern.replace(QString("$%1").arg(bar), image);
} }
@@ -382,16 +361,14 @@ QString AWKeys::parsePattern(QString _pattern) const
} }
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 = m_aggregator->keysFromSource(_sourceName);
if (tags.isEmpty()) if (tags.isEmpty())
tags = m_aggregator->registerSource( tags = m_aggregator->registerSource(_sourceName, _data["units"].toString(), m_requiredKeys);
_sourceName, _data["units"].toString(), m_requiredKeys);
// update data or drop source if there are no matches and exit // update data or drop source if there are no matches and exit
if (tags.isEmpty()) { if (tags.isEmpty()) {
@@ -401,10 +378,8 @@ void AWKeys::setDataBySource(const QString &_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"] : _data["value"];
m_values[tag] = _sourceName == "Local" ? _data["DateTime"] });
: _data["value"];
});
m_mutex.unlock(); m_mutex.unlock();
} }
+13 -16
View File
@@ -38,32 +38,29 @@ class AWKeys : public QObject
public: public:
explicit AWKeys(QObject *_parent = nullptr); explicit AWKeys(QObject *_parent = nullptr);
virtual ~AWKeys(); ~AWKeys() override;
Q_INVOKABLE void initDataAggregator(const QVariantMap &_tooltipParams); Q_INVOKABLE void initDataAggregator(const QVariantMap &_tooltipParams);
Q_INVOKABLE void initKeys(const QString &_currentPattern, Q_INVOKABLE void initKeys(const QString &_currentPattern, int _interval, int _limit,
const int _interval, const int _limit, bool _optimize);
const bool _optimize); Q_INVOKABLE void setAggregatorProperty(const QString &_key, const QVariant &_value);
Q_INVOKABLE void setAggregatorProperty(const QString &_key, Q_INVOKABLE void setWrapNewLines(bool _wrap);
const QVariant &_value);
Q_INVOKABLE void setWrapNewLines(const bool _wrap);
// additional method to force load keys from Qml UI. Used in some // additional method to force load keys from Qml UI. Used in some
// configuration pages // configuration pages
Q_INVOKABLE void updateCache(); Q_INVOKABLE void updateCache();
// keys // keys
Q_INVOKABLE QStringList dictKeys(const bool _sorted = false, Q_INVOKABLE [[nodiscard]] QStringList dictKeys(bool _sorted = false,
const QString &_regexp = "") const; const QString &_regexp = "") const;
Q_INVOKABLE QVariantList getHddDevices() const; Q_INVOKABLE [[nodiscard]] QVariantList getHddDevices() const;
// values // values
Q_INVOKABLE QString infoByKey(const QString &_key) const; Q_INVOKABLE [[nodiscard]] QString infoByKey(const QString &_key) const;
Q_INVOKABLE QString valueByKey(const QString &_key) const; Q_INVOKABLE [[nodiscard]] QString valueByKey(const QString &_key) const;
// configuration // configuration
Q_INVOKABLE void editItem(const QString &_type); Q_INVOKABLE void editItem(const QString &_type);
public slots: 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 *){}; static void modelChanged(QString, QAbstractItemModel *){};
signals: signals:
void dropSourceFromDataengine(const QString &_source); void dropSourceFromDataengine(const QString &_source);
@@ -78,7 +75,7 @@ private:
// methods // methods
void calculateValues(); void calculateValues();
void createDBusInterface(); void createDBusInterface();
QString parsePattern(QString _pattern) const; [[nodiscard]] QString parsePattern(QString _pattern) const;
void setDataBySource(const QString &_sourceName, const QVariantMap &_data); void setDataBySource(const QString &_sourceName, const QVariantMap &_data);
// objects // objects
AWDataAggregator *m_dataAggregator = nullptr; AWDataAggregator *m_dataAggregator = nullptr;
@@ -55,8 +55,8 @@ void AWKeysAggregator::initFormatters()
} }
QString AWKeysAggregator::formatter(const QVariant &_data, QString AWKeysAggregator::formatter(const QVariant &_data, const QString &_key,
const QString &_key) const bool replaceSpace) const
{ {
qCDebug(LOG_AW) << "Data" << _data << "for key" << _key; qCDebug(LOG_AW) << "Data" << _data << "for key" << _key;
@@ -86,8 +86,7 @@ QString AWKeysAggregator::formatter(const QVariant &_data,
output = _data.toBool() ? m_acOnline : m_acOffline; output = _data.toBool() ? m_acOnline : m_acOffline;
break; break;
case FormatterType::MemGBFormat: case FormatterType::MemGBFormat:
output output = QString("%1").arg(_data.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);
@@ -119,7 +118,7 @@ QString AWKeysAggregator::formatter(const QVariant &_data,
break; break;
case FormatterType::TimeCustom: case FormatterType::TimeCustom:
output = m_customTime; output = m_customTime;
[&output, loc, this](const QDateTime dt) { [&output, loc, this](const QDateTime &dt) {
for (auto &key : m_timeKeys) for (auto &key : m_timeKeys)
output.replace(QString("$%1").arg(key), loc.toString(dt, key)); output.replace(QString("$%1").arg(key), loc.toString(dt, key));
}(_data.toDateTime()); }(_data.toDateTime());
@@ -134,8 +133,7 @@ QString AWKeysAggregator::formatter(const QVariant &_data,
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:
@@ -145,19 +143,14 @@ 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("$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("$d", QString("%1").arg(days));
source.replace("$hh", source.replace("$hh", QString("%1").arg(hours, 2, 10, QChar('0')));
QString("%1").arg(hours, 2, 10, QChar('0')));
source.replace("$h", QString("%1").arg(hours)); source.replace("$h", QString("%1").arg(hours));
source.replace("$mm", source.replace("$mm", QString("%1").arg(minutes, 2, 10, QChar('0')));
QString("%1").arg(minutes, 2, 10, QChar('0')));
source.replace("$m", QString("%1").arg(minutes)); source.replace("$m", QString("%1").arg(minutes));
return source; return source;
}(m_mapper->formatter(_key) == FormatterType::Uptime }(m_mapper->formatter(_key) == FormatterType::Uptime ? "$ddd$hhh$mmm" : m_customUptime,
? "$ddd$hhh$mmm"
: m_customUptime,
static_cast<int>(_data.toFloat())); static_cast<int>(_data.toFloat()));
break; break;
case FormatterType::NoFormat: case FormatterType::NoFormat:
@@ -170,7 +163,8 @@ QString AWKeysAggregator::formatter(const QVariant &_data,
} }
// replace spaces to non-breakable ones // replace spaces to non-breakable ones
if (!_key.startsWith("custom") && (!_key.startsWith("weather"))) replaceSpace &= (!_key.startsWith("custom") && (!_key.startsWith("weather")));
if (replaceSpace)
output.replace(" ", "&nbsp;"); output.replace(" ", "&nbsp;");
return output; return output;
@@ -241,8 +235,7 @@ void AWKeysAggregator::setTranslate(const bool _translate)
} }
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;
@@ -32,8 +32,7 @@ class AWKeysAggregator : public QObject
Q_PROPERTY(QString acOffline MEMBER m_acOffline WRITE setAcOffline); Q_PROPERTY(QString acOffline MEMBER m_acOffline WRITE setAcOffline);
Q_PROPERTY(QString acOnline MEMBER m_acOnline WRITE setAcOnline); Q_PROPERTY(QString acOnline MEMBER m_acOnline WRITE setAcOnline);
Q_PROPERTY(QString customTime MEMBER m_customTime WRITE setCustomTime); Q_PROPERTY(QString customTime MEMBER m_customTime WRITE setCustomTime);
Q_PROPERTY( Q_PROPERTY(QString customUptime MEMBER m_customUptime WRITE setCustomUptime);
QString customUptime MEMBER m_customUptime WRITE setCustomUptime);
Q_PROPERTY(QString tempUnits MEMBER m_tempUnits WRITE setTempUnits); Q_PROPERTY(QString tempUnits MEMBER m_tempUnits WRITE setTempUnits);
Q_PROPERTY(bool translate MEMBER m_translate WRITE setTranslate); Q_PROPERTY(bool translate MEMBER m_translate WRITE setTranslate);
@@ -67,11 +66,12 @@ public:
}; };
explicit AWKeysAggregator(QObject *_parent = nullptr); explicit AWKeysAggregator(QObject *_parent = nullptr);
virtual ~AWKeysAggregator(); ~AWKeysAggregator() override;
void initFormatters(); void initFormatters();
// get methods // get methods
QString formatter(const QVariant &_data, const QString &_key) const; [[nodiscard]] QString formatter(const QVariant &_data, const QString &_key,
QStringList keysFromSource(const QString &_source) const; bool replaceSpace) const;
[[nodiscard]] QStringList keysFromSource(const QString &_source) const;
// set methods // set methods
void setAcOffline(const QString &_inactive); void setAcOffline(const QString &_inactive);
void setAcOnline(const QString &_active); void setAcOnline(const QString &_active);
@@ -79,14 +79,14 @@ public:
void setCustomUptime(const QString &_customUptime); void setCustomUptime(const QString &_customUptime);
void setDevices(const QHash<QString, QStringList> &_devices); void setDevices(const QHash<QString, QStringList> &_devices);
void setTempUnits(const QString &_units); void setTempUnits(const QString &_units);
void setTranslate(const bool _translate); void setTranslate(bool _translate);
public slots: public slots:
QStringList registerSource(const QString &_source, const QString &_units, QStringList registerSource(const QString &_source, const QString &_units,
const QStringList &_keys); const QStringList &_keys);
private: private:
float temperature(const float temp) const; [[nodiscard]] float temperature(float temp) const;
AWFormatterHelper *m_customFormatters = nullptr; AWFormatterHelper *m_customFormatters = nullptr;
AWDataEngineMapper *m_mapper = nullptr; AWDataEngineMapper *m_mapper = nullptr;
QStringList m_timeKeys; QStringList m_timeKeys;
@@ -37,7 +37,7 @@ AWPairConfigFactory::~AWPairConfigFactory()
void AWPairConfigFactory::showFormatterDialog(const QStringList &_keys) void AWPairConfigFactory::showFormatterDialog(const QStringList &_keys)
{ {
AWFormatterConfig *config = new AWFormatterConfig(nullptr, _keys); auto *config = new AWFormatterConfig(nullptr, _keys);
config->showDialog(); config->showDialog();
config->deleteLater(); config->deleteLater();
} }
@@ -45,7 +45,7 @@ void AWPairConfigFactory::showFormatterDialog(const QStringList &_keys)
void AWPairConfigFactory::showKeysDialog(const QStringList &_keys) void AWPairConfigFactory::showKeysDialog(const QStringList &_keys)
{ {
AWCustomKeysConfig *config = new AWCustomKeysConfig(nullptr, _keys); auto *config = new AWCustomKeysConfig(nullptr, _keys);
config->showDialog(); config->showDialog();
config->deleteLater(); config->deleteLater();
} }
@@ -28,9 +28,9 @@ class AWPairConfigFactory : public QObject
public: public:
explicit AWPairConfigFactory(QObject *_parent = nullptr); explicit AWPairConfigFactory(QObject *_parent = nullptr);
virtual ~AWPairConfigFactory(); ~AWPairConfigFactory() override;
Q_INVOKABLE void showFormatterDialog(const QStringList &_keys); Q_INVOKABLE static void showFormatterDialog(const QStringList &_keys);
Q_INVOKABLE void showKeysDialog(const QStringList &_keys); Q_INVOKABLE static void showKeysDialog(const QStringList &_keys);
private: private:
}; };
@@ -24,12 +24,11 @@
#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 lambdas in" << _code;
QJSEngine engine; QJSEngine engine;
// apply $this values // apply $this values
@@ -37,13 +36,12 @@ QString AWPatternFunctions::expandLambdas(QString _code,
// 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, false));
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 "";
} else { } else {
return result.toString(); return result.toString();
@@ -56,9 +54,8 @@ 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(R"(\$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()) {
@@ -71,8 +68,7 @@ QString AWPatternFunctions::expandTemplates(QString _code)
QString templateResult = ""; QString templateResult = "";
if (result.isError()) { if (result.isError()) {
qCWarning(LOG_AW) << "Uncaught exception at line" qCWarning(LOG_AW) << "Uncaught exception at line"
<< result.property("lineNumber").toInt() << ":" << result.property("lineNumber").toInt() << ":" << result.toString();
<< result.toString();
} else { } else {
templateResult = result.toString(); templateResult = result.toString();
} }
@@ -86,8 +82,7 @@ QString AWPatternFunctions::expandTemplates(QString _code)
QList<AWPatternFunctions::AWFunction> QList<AWPatternFunctions::AWFunction>
AWPatternFunctions::findFunctionCalls(const QString &_function, AWPatternFunctions::findFunctionCalls(const QString &_function, const QString &_code)
const QString &_code)
{ {
qCDebug(LOG_AW) << "Looking for function" << _function << "in" << _code; qCDebug(LOG_AW) << "Looking for function" << _function << "in" << _code;
@@ -97,9 +92,7 @@ AWPatternFunctions::findFunctionCalls(const QString &_function,
// in this field if they are not screened by $, i.e. '$,' // in this field if they are not screened by $, i.e. '$,'
// * body depends on the function name, double brackets should be screened // * body depends on the function name, double brackets should be screened
// by using $, e.g. ${ // by using $, e.g. ${
QRegularExpression regex( QRegularExpression regex(QString(R"(\$%1\<(?<args>.*?)\>\{\{(?<body>.*?)\}\})").arg(_function));
QString("\\$%1\\<(?<args>.*?)\\>\\{\\{(?<body>.*?)\\}\\}")
.arg(_function));
regex.setPatternOptions(QRegularExpression::DotMatchesEverythingOption); regex.setPatternOptions(QRegularExpression::DotMatchesEverythingOption);
QList<AWPatternFunctions::AWFunction> foundFunctions; QList<AWPatternFunctions::AWFunction> foundFunctions;
@@ -116,9 +109,8 @@ AWPatternFunctions::findFunctionCalls(const QString &_function,
// replace '$,' to 0x1d // replace '$,' to 0x1d
argsString.replace("$,", QString(0x1d)); argsString.replace("$,", QString(0x1d));
QStringList args = argsString.split(','); QStringList args = argsString.split(',');
std::for_each(args.begin(), args.end(), [](QString &arg) { std::for_each(args.begin(), args.end(),
arg.replace(QString(0x1d), ","); [](QString &arg) { arg.replace(QString(0x1d), ","); });
});
metadata.args = args; metadata.args = args;
} }
// other variables // other variables
@@ -134,20 +126,17 @@ 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("aw_all", _code);
for (auto &function : found) { for (auto &function : found) {
QString separator = function.args.isEmpty() ? "," : function.args.at(0); QString separator = function.args.isEmpty() ? "," : function.args.at(0);
QStringList required = _keys.filter(QRegExp(function.body)); QStringList required = _keys.filter(QRegExp(function.body));
std::for_each(required.begin(), required.end(), [](QString &value) { std::for_each(required.begin(), required.end(),
value = QString("%1: $%1").arg(value); [](QString &value) { value = QString("%1: $%1").arg(value); });
});
_code.replace(function.what, required.join(separator)); _code.replace(function.what, required.join(separator));
} }
@@ -156,11 +145,9 @@ QString AWPatternFunctions::insertAllKeys(QString _code,
} }
QString AWPatternFunctions::insertKeyCount(QString _code, QString AWPatternFunctions::insertKeyCount(QString _code, const QStringList &_keys)
const QStringList &_keys)
{ {
qCDebug(LOG_AW) << "Looking for count in code" << _code << "using list" qCDebug(LOG_AW) << "Looking for count in code" << _code << "using list" << _keys;
<< _keys;
QList<AWPatternFunctions::AWFunction> found QList<AWPatternFunctions::AWFunction> found
= AWPatternFunctions::findFunctionCalls("aw_count", _code); = AWPatternFunctions::findFunctionCalls("aw_count", _code);
@@ -174,11 +161,9 @@ QString AWPatternFunctions::insertKeyCount(QString _code,
} }
QString AWPatternFunctions::insertKeyNames(QString _code, QString AWPatternFunctions::insertKeyNames(QString _code, const QStringList &_keys)
const QStringList &_keys)
{ {
qCDebug(LOG_AW) << "Looking for key names in code" << _code << "using list" qCDebug(LOG_AW) << "Looking for key names in code" << _code << "using list" << _keys;
<< _keys;
QList<AWPatternFunctions::AWFunction> found QList<AWPatternFunctions::AWFunction> found
= AWPatternFunctions::findFunctionCalls("aw_names", _code); = AWPatternFunctions::findFunctionCalls("aw_names", _code);
@@ -195,17 +180,15 @@ QString AWPatternFunctions::insertKeyNames(QString _code,
QString AWPatternFunctions::insertKeys(QString _code, const QStringList &_keys) QString AWPatternFunctions::insertKeys(QString _code, const QStringList &_keys)
{ {
qCDebug(LOG_AW) << "Looking for keys in code" << _code << "using list" qCDebug(LOG_AW) << "Looking for keys in code" << _code << "using list" << _keys;
<< _keys;
QList<AWPatternFunctions::AWFunction> found QList<AWPatternFunctions::AWFunction> found
= AWPatternFunctions::findFunctionCalls("aw_keys", _code); = AWPatternFunctions::findFunctionCalls("aw_keys", _code);
for (auto &function : found) { for (auto &function : found) {
QString separator = function.args.isEmpty() ? "," : function.args.at(0); QString separator = function.args.isEmpty() ? "," : function.args.at(0);
QStringList required = _keys.filter(QRegExp(function.body)); QStringList required = _keys.filter(QRegExp(function.body));
std::for_each(required.begin(), required.end(), [](QString &value) { std::for_each(required.begin(), required.end(),
value = QString("$%1").arg(value); [](QString &value) { value = QString("$%1").arg(value); });
});
_code.replace(function.what, required.join(separator)); _code.replace(function.what, required.join(separator));
} }
@@ -229,13 +212,11 @@ QString AWPatternFunctions::insertMacros(QString _code)
QString name = macro.args.takeFirst(); QString name = macro.args.takeFirst();
// 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" << function.what
<< "Invalid args count found for call" << function.what << "with macro" << macro.what;
<< "with macro" << macro.what;
continue; continue;
} }
// generate body to replace // generate body to replace
@@ -243,8 +224,7 @@ QString AWPatternFunctions::insertMacros(QString _code)
std::for_each(macro.args.cbegin(), macro.args.cend(), std::for_each(macro.args.cbegin(), macro.args.cend(),
[&result, macro, function](const QString &arg) { [&result, macro, function](const QString &arg) {
int index = macro.args.indexOf(arg); int index = macro.args.indexOf(arg);
result.replace(QString("$%1").arg(arg), result.replace(QString("$%1").arg(arg), function.args.at(index));
function.args.at(index));
}); });
// do replace // do replace
_code.replace(function.what, result); _code.replace(function.what, result);
@@ -258,20 +238,17 @@ QString AWPatternFunctions::insertMacros(QString _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; QString replacedCode = _code;
for (auto &key : _keys) for (auto &key : _keys)
if ((key.startsWith("bar") == _isBars) if ((key.startsWith("bar") == _isBars)
&& (replacedCode.contains(QString("$%1").arg(key)))) { && (replacedCode.contains(QString("$%1").arg(key)))) {
qCInfo(LOG_AW) << "Found key" << key << "with bar enabled" qCInfo(LOG_AW) << "Found key" << key << "with bar enabled" << _isBars;
<< _isBars;
selectedKeys.append(key); selectedKeys.append(key);
replacedCode.replace(QString("$%1").arg(key), ""); replacedCode.replace(QString("$%1").arg(key), "");
} }
@@ -288,9 +265,8 @@ QStringList AWPatternFunctions::findLambdas(const QString &_code)
QStringList selectedKeys; QStringList selectedKeys;
// match the following construction ${{some code here}} // match the following construction ${{some code here}}
QRegularExpression lambdaRegexp("\\$\\{\\{(?<body>.*?)\\}\\}"); QRegularExpression lambdaRegexp(R"(\$\{\{(?<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()) {
@@ -34,22 +34,19 @@ typedef struct {
} AWFunction; } AWFunction;
// insert methods // insert methods
QString expandLambdas(QString _code, AWKeysAggregator *_aggregator, QString expandLambdas(QString _code, AWKeysAggregator *_aggregator, const QVariantHash &_metadata,
const QVariantHash &_metadata,
const QStringList &_usedKeys); const QStringList &_usedKeys);
QString expandTemplates(QString _code); QString expandTemplates(QString _code);
QList<AWFunction> findFunctionCalls(const QString &_function, QList<AWFunction> findFunctionCalls(const QString &_function, const QString &_code);
const QString &_code);
QString insertAllKeys(QString _code, const QStringList &_keys); QString insertAllKeys(QString _code, const QStringList &_keys);
QString insertKeyCount(QString _code, const QStringList &_keys); QString insertKeyCount(QString _code, const QStringList &_keys);
QString insertKeyNames(QString _code, const QStringList &_keys); QString insertKeyNames(QString _code, const QStringList &_keys);
QString insertKeys(QString _code, const QStringList &_keys); QString insertKeys(QString _code, const QStringList &_keys);
QString insertMacros(QString _code); QString insertMacros(QString _code);
// find methods // find methods
QStringList findKeys(const QString &_code, const QStringList &_keys, QStringList findKeys(const QString &_code, const QStringList &_keys, bool _isBars);
const bool _isBars);
QStringList findLambdas(const QString &_code); QStringList findLambdas(const QString &_code);
}; } // namespace AWPatternFunctions
#endif /* AWPATTERNFUNCTIONS_H */ #endif /* AWPATTERNFUNCTIONS_H */
@@ -27,15 +27,13 @@
#include "awdebug.h" #include "awdebug.h"
AWTelemetryHandler::AWTelemetryHandler(QObject *_parent, AWTelemetryHandler::AWTelemetryHandler(QObject *_parent, const QString &_clientId)
const QString &_clientId)
: QObject(_parent) : QObject(_parent)
{ {
qCDebug(LOG_AW) << __PRETTY_FUNCTION__; qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
m_localFile = QString("%1/awesomewidgets/telemetry.ini") m_localFile = QString("%1/awesomewidgets/telemetry.ini")
.arg(QStandardPaths::writableLocation( .arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation));
QStandardPaths::GenericDataLocation));
// override client id if any // override client id if any
if (!_clientId.isEmpty()) if (!_clientId.isEmpty())
@@ -73,11 +71,10 @@ QString AWTelemetryHandler::getLast(const QString &_group) const
} }
void AWTelemetryHandler::init(const int _count, const bool _enableRemote, void AWTelemetryHandler::init(const int _count, const bool _enableRemote, const QString &_clientId)
const QString &_clientId)
{ {
qCDebug(LOG_AW) << "Init telemetry with count" << _count << "enable remote" qCDebug(LOG_AW) << "Init telemetry with count" << _count << "enable remote" << _enableRemote
<< _enableRemote << "client ID" << _clientId; << "client ID" << _clientId;
m_storeCount = _count; m_storeCount = _count;
m_uploadEnabled = _enableRemote; m_uploadEnabled = _enableRemote;
@@ -87,8 +84,7 @@ void AWTelemetryHandler::init(const int _count, const bool _enableRemote,
bool AWTelemetryHandler::put(const QString &_group, const QString &_value) const bool AWTelemetryHandler::put(const QString &_group, const QString &_value) const
{ {
qCDebug(LOG_AW) << "Store data with group" << _group << "and value" qCDebug(LOG_AW) << "Store data with group" << _group << "and value" << _value;
<< _value;
QSettings settings(m_localFile, QSettings::IniFormat); QSettings settings(m_localFile, QSettings::IniFormat);
settings.beginGroup(_group); settings.beginGroup(_group);
@@ -99,8 +95,7 @@ bool AWTelemetryHandler::put(const QString &_group, const QString &_value) const
saved.append(settings.value(key).toString()); saved.append(settings.value(key).toString());
// check if this value is already saved // check if this value is already saved
if (saved.contains(_value)) { if (saved.contains(_value)) {
qCInfo(LOG_AW) << "Configuration" << _value << "for group" << _group qCInfo(LOG_AW) << "Configuration" << _value << "for group" << _group << "is already saved";
<< "is already saved";
return false; return false;
} }
saved.append(_value); saved.append(_value);
@@ -123,17 +118,15 @@ bool AWTelemetryHandler::put(const QString &_group, const QString &_value) const
} }
void AWTelemetryHandler::uploadTelemetry(const QString &_group, void AWTelemetryHandler::uploadTelemetry(const QString &_group, const QString &_value)
const QString &_value)
{ {
qCDebug(LOG_AW) << "Upload data with group" << _group << "and value" qCDebug(LOG_AW) << "Upload data with group" << _group << "and value" << _value;
<< _value;
if (!m_uploadEnabled) { if (!m_uploadEnabled) {
qCInfo(LOG_AW) << "Upload disabled by configuration"; qCInfo(LOG_AW) << "Upload disabled by configuration";
return; return;
} }
QNetworkAccessManager *manager = new QNetworkAccessManager(nullptr); auto *manager = new QNetworkAccessManager(nullptr);
connect(manager, SIGNAL(finished(QNetworkReply *)), this, connect(manager, SIGNAL(finished(QNetworkReply *)), this,
SLOT(telemetryReplyRecieved(QNetworkReply *))); SLOT(telemetryReplyRecieved(QNetworkReply *)));
@@ -148,10 +141,8 @@ void AWTelemetryHandler::uploadTelemetry(const QString &_group,
payload["metadata"] = _value; payload["metadata"] = _value;
payload["type"] = _group; payload["type"] = _group;
// convert to QByteArray to send request // convert to QByteArray to send request
QByteArray data QByteArray data = QJsonDocument::fromVariant(payload).toJson(QJsonDocument::Compact);
= QJsonDocument::fromVariant(payload).toJson(QJsonDocument::Compact); qCInfo(LOG_AW) << "Send request with body" << data.data() << "and size" << data.size();
qCInfo(LOG_AW) << "Send request with body" << data.data() << "and size"
<< data.size();
manager->post(request, data); manager->post(request, data);
} }
@@ -160,12 +151,12 @@ void AWTelemetryHandler::uploadTelemetry(const QString &_group,
void AWTelemetryHandler::telemetryReplyRecieved(QNetworkReply *_reply) void AWTelemetryHandler::telemetryReplyRecieved(QNetworkReply *_reply)
{ {
if (_reply->error() != QNetworkReply::NoError) { if (_reply->error() != QNetworkReply::NoError) {
qCWarning(LOG_AW) << "An error occurs" << _reply->error() qCWarning(LOG_AW) << "An error occurs" << _reply->error() << "with message"
<< "with message" << _reply->errorString(); << _reply->errorString();
return; 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 (error.error != QJsonParseError::NoError) {
qCWarning(LOG_AW) << "Parse error" << error.errorString(); qCWarning(LOG_AW) << "Parse error" << error.errorString();
@@ -182,7 +173,7 @@ void AWTelemetryHandler::telemetryReplyRecieved(QNetworkReply *_reply)
} }
QString AWTelemetryHandler::getKey(const int _count) const QString AWTelemetryHandler::getKey(const int _count)
{ {
qCDebug(LOG_AW) << "Get key for keys count" << _count; qCDebug(LOG_AW) << "Get key for keys count" << _count;
@@ -31,16 +31,13 @@ class AWTelemetryHandler : public QObject
public: public:
const char *REMOTE_TELEMETRY_URL = "https://arcanis.me/telemetry"; const char *REMOTE_TELEMETRY_URL = "https://arcanis.me/telemetry";
explicit AWTelemetryHandler(QObject *_parent = nullptr, explicit AWTelemetryHandler(QObject *_parent = nullptr, const QString &_clientId = "");
const QString &_clientId = ""); ~AWTelemetryHandler() override;
virtual ~AWTelemetryHandler(); Q_INVOKABLE [[nodiscard]] QStringList get(const QString &_group) const;
Q_INVOKABLE QStringList get(const QString &_group) const; Q_INVOKABLE [[nodiscard]] QString getLast(const QString &_group) const;
Q_INVOKABLE QString getLast(const QString &_group) const; Q_INVOKABLE void init(int _count, bool _enableRemote, const QString &_clientId);
Q_INVOKABLE void init(const int _count, const bool _enableRemote, Q_INVOKABLE [[nodiscard]] bool put(const QString &_group, const QString &_value) const;
const QString &_clientId); Q_INVOKABLE void uploadTelemetry(const QString &_group, const QString &_value);
Q_INVOKABLE bool put(const QString &_group, const QString &_value) const;
Q_INVOKABLE void uploadTelemetry(const QString &_group,
const QString &_value);
signals: signals:
void replyReceived(const QString &_message); void replyReceived(const QString &_message);
@@ -49,7 +46,7 @@ private slots:
void telemetryReplyRecieved(QNetworkReply *_reply); void telemetryReplyRecieved(QNetworkReply *_reply);
private: private:
QString getKey(const int _count) const; static QString getKey(int _count);
QString m_clientId; QString m_clientId;
QString m_localFile; QString m_localFile;
int m_storeCount = 0; int m_storeCount = 0;
@@ -34,9 +34,9 @@ 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_genericConfig = QString("%1/awesomewidgets/general.ini") m_genericConfig
.arg(QStandardPaths::writableLocation( = QString("%1/awesomewidgets/general.ini")
QStandardPaths::GenericDataLocation)); .arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation));
} }
@@ -52,11 +52,10 @@ void AWUpdateHelper::checkUpdates(const bool _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); auto *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)));
} }
@@ -65,17 +64,16 @@ 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
settings.value("Version", QString(VERSION)).toString()); = QVersionNumber::fromString(settings.value("Version", QString(VERSION)).toString());
// update version // update version
settings.setValue("Version", QString(VERSION)); settings.setValue("Version", QString(VERSION));
settings.sync(); settings.sync();
qCInfo(LOG_AW) << "Found version" << version << "actual one is" 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(i18nc("Changelog of %1", VERSION), QString(CHANGELOG).replace('@', '\n'),
QString(CHANGELOG).replace('@', '\n'), QMessageBox::Ok) QMessageBox::Ok)
->open(); ->open();
return true; return true;
} else if (version != m_foundVersion) { } else if (version != m_foundVersion) {
@@ -93,12 +91,10 @@ 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)->open();
->open();
} }
@@ -107,29 +103,24 @@ 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 += i18nc("Current version : %1", VERSION);
text += QString(COMMIT_SHA).isEmpty() text += QString(COMMIT_SHA).isEmpty() ? "\n" : QString(" (%1)\n").arg(QString(COMMIT_SHA));
? "\n"
: QString(" (%1)\n").arg(QString(COMMIT_SHA));
text += i18n("New version : %1", _version.toString()) + "\n\n"; text += i18n("New version : %1", _version.toString()) + "\n\n";
text += i18n("Click \"Ok\" to download"); text += i18n("Click \"Ok\" to download");
genMessageBox(i18n("There are updates"), text, genMessageBox(i18n("There are updates"), text, QMessageBox::Ok | QMessageBox::Cancel)
QMessageBox::Ok | QMessageBox::Cancel)
->open(this, SLOT(userReplyOnUpdates(QAbstractButton *))); ->open(this, SLOT(userReplyOnUpdates(QAbstractButton *)));
} }
void AWUpdateHelper::userReplyOnUpdates(QAbstractButton *_button) void AWUpdateHelper::userReplyOnUpdates(QAbstractButton *_button)
{ {
QMessageBox::ButtonRole ret QMessageBox::ButtonRole ret = dynamic_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) {
case QMessageBox::AcceptRole: case QMessageBox::AcceptRole:
QDesktopServices::openUrl(QString(RELEASES) QDesktopServices::openUrl(QString(RELEASES) + m_foundVersion.toString());
+ m_foundVersion.toString());
break; break;
case QMessageBox::RejectRole: case QMessageBox::RejectRole:
default: default:
@@ -138,17 +129,16 @@ 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) << "Show message anyway" << _showAnyway;
if (_reply->error() != QNetworkReply::NoError) { if (_reply->error() != QNetworkReply::NoError) {
qCWarning(LOG_AW) << "An error occurs" << _reply->error() qCWarning(LOG_AW) << "An error occurs" << _reply->error() << "with message"
<< "with message" << _reply->errorString(); << _reply->errorString();
return; return;
} }
QJsonParseError error; QJsonParseError error = QJsonParseError();
QJsonDocument jsonDoc = QJsonDocument::fromJson(_reply->readAll(), &error); QJsonDocument jsonDoc = QJsonDocument::fromJson(_reply->readAll(), &error);
if (error.error != QJsonParseError::NoError) { if (error.error != QJsonParseError::NoError) {
qCWarning(LOG_AW) << "Parse error" << error.errorString(); qCWarning(LOG_AW) << "Parse error" << error.errorString();
@@ -172,14 +162,12 @@ void AWUpdateHelper::versionReplyRecieved(QNetworkReply *_reply,
// additional method which is used to show message box which does not block UI // additional method which is used to show message box which does not block UI
QMessageBox * 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" << _body;
<< "and body" << _body;
QMessageBox *msgBox = new QMessageBox(nullptr); auto *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);
@@ -32,19 +32,19 @@ class AWUpdateHelper : public QObject
public: public:
explicit AWUpdateHelper(QObject *_parent = nullptr); explicit AWUpdateHelper(QObject *_parent = nullptr);
virtual ~AWUpdateHelper(); ~AWUpdateHelper() override;
void checkUpdates(const bool _showAnyway = false); void checkUpdates(bool _showAnyway = false);
bool checkVersion(); bool checkVersion();
private slots: private slots:
void showInfo(const QVersionNumber &_version); static 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, bool _showAnyway);
private: private:
QMessageBox *genMessageBox(const QString &_title, const QString &_body, static QMessageBox *genMessageBox(const QString &_title, const QString &_body,
const QMessageBox::StandardButtons _buttons); QMessageBox::StandardButtons _buttons);
QVersionNumber m_foundVersion; QVersionNumber m_foundVersion;
QString m_genericConfig; QString m_genericConfig;
}; };
+10 -18
View File
@@ -19,9 +19,9 @@
#include <QDir> #include <QDir>
#include <QLocalServer> #include <QLocalServer>
#include <QRandomGenerator>
#include <QSettings> #include <QSettings>
#include <QStandardPaths> #include <QStandardPaths>
#include <QTime>
#include "abstractextitemaggregator.h" #include "abstractextitemaggregator.h"
#include "qcronscheduler.h" #include "qcronscheduler.h"
@@ -45,7 +45,7 @@ AbstractExtItem::~AbstractExtItem()
if (m_socket) { if (m_socket) {
m_socket->close(); m_socket->close();
m_socket->removeServer(socket()); QLocalServer::removeServer(socket());
m_socket->deleteLater(); m_socket->deleteLater();
} }
} }
@@ -57,8 +57,7 @@ void AbstractExtItem::bumpApi(const int _newVer)
// update for current API // update for current API
if ((apiVersion() > 0) && (apiVersion() < _newVer)) { if ((apiVersion() > 0) && (apiVersion() < _newVer)) {
qCWarning(LOG_LIB) << "Bump API version from" << apiVersion() << "to" qCWarning(LOG_LIB) << "Bump API version from" << apiVersion() << "to" << _newVer;
<< _newVer;
setApiVersion(_newVer); setApiVersion(_newVer);
writeConfiguration(); writeConfiguration();
} }
@@ -104,8 +103,7 @@ QString AbstractExtItem::writtableConfig() const
QString dir = QFileInfo(path).fileName(); QString dir = QFileInfo(path).fileName();
return QString("%1/awesomewidgets/%2/%3") return QString("%1/awesomewidgets/%2/%3")
.arg(QStandardPaths::writableLocation( .arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation))
QStandardPaths::GenericDataLocation))
.arg(dir) .arg(dir)
.arg(name); .arg(name);
} }
@@ -202,8 +200,7 @@ void AbstractExtItem::setCron(const QString &_cron)
qCDebug(LOG_LIB) << "Cron string" << _cron; qCDebug(LOG_LIB) << "Cron string" << _cron;
// deinit module first // deinit module first
if (m_scheduler) { if (m_scheduler) {
disconnect(m_scheduler, SIGNAL(activated()), this, disconnect(m_scheduler, SIGNAL(activated()), this, SIGNAL(requestDataUpdate()));
SIGNAL(requestDataUpdate()));
delete m_scheduler; delete m_scheduler;
} }
@@ -214,8 +211,7 @@ void AbstractExtItem::setCron(const QString &_cron)
// init scheduler // init scheduler
m_scheduler = new QCronScheduler(this); m_scheduler = new QCronScheduler(this);
m_scheduler->parse(cron()); m_scheduler->parse(cron());
connect(m_scheduler, SIGNAL(activated()), this, connect(m_scheduler, SIGNAL(activated()), this, SIGNAL(requestDataUpdate()));
SIGNAL(requestDataUpdate()));
} }
@@ -244,9 +240,7 @@ void AbstractExtItem::setNumber(int _number)
if (generateNumber) { if (generateNumber) {
_number = []() { _number = []() {
qCWarning(LOG_LIB) << "Number is empty, generate new one"; qCWarning(LOG_LIB) << "Number is empty, generate new one";
// we suppose that currentTIme().msec() is always valid time auto n = QRandomGenerator::global()->generate() % 1000;
qsrand(static_cast<uint>(QTime::currentTime().msec()));
int n = qrand() % 1000;
qCInfo(LOG_LIB) << "Generated number is" << n; qCInfo(LOG_LIB) << "Generated number is" << n;
return n; return n;
}(); }();
@@ -274,10 +268,9 @@ void AbstractExtItem::deinitSocket()
return; return;
m_socket->close(); m_socket->close();
m_socket->removeServer(socket()); QLocalServer::removeServer(socket());
delete m_socket; delete m_socket;
disconnect(m_socket, SIGNAL(newConnection()), this, disconnect(m_socket, SIGNAL(newConnection()), this, SLOT(newConnectionReceived()));
SLOT(newConnectionReceived()));
} }
@@ -289,8 +282,7 @@ void AbstractExtItem::initSocket()
m_socket = new QLocalServer(this); m_socket = new QLocalServer(this);
bool listening = m_socket->listen(socket()); bool listening = m_socket->listen(socket());
qCInfo(LOG_LIB) << "Server listening on" << socket() << listening; qCInfo(LOG_LIB) << "Server listening on" << socket() << listening;
connect(m_socket, SIGNAL(newConnection()), this, connect(m_socket, SIGNAL(newConnection()), this, SLOT(newConnectionReceived()));
SLOT(newConnectionReceived()));
} }
+20 -22
View File
@@ -40,33 +40,31 @@ class AbstractExtItem : public QDialog
Q_PROPERTY(QString uniq READ uniq) Q_PROPERTY(QString uniq READ uniq)
public: public:
explicit AbstractExtItem(QWidget *_parent = nullptr, explicit AbstractExtItem(QWidget *_parent = nullptr, const QString &_filePath = "");
const QString &_filePath = ""); ~AbstractExtItem() override;
virtual ~AbstractExtItem(); virtual void bumpApi(int _newVer);
virtual void bumpApi(const int _newVer); virtual AbstractExtItem *copy(const QString &_fileName, int _number) = 0;
virtual AbstractExtItem *copy(const QString &_fileName, const int _number)
= 0;
virtual void copyDefaults(AbstractExtItem *_other) const; virtual void copyDefaults(AbstractExtItem *_other) const;
virtual void startTimer(); virtual void startTimer();
QString writtableConfig() const; [[nodiscard]] QString writtableConfig() const;
// get methods // get methods
int apiVersion() const; [[nodiscard]] int apiVersion() const;
QString comment() const; [[nodiscard]] QString comment() const;
QString cron() const; [[nodiscard]] QString cron() const;
QString fileName() const; [[nodiscard]] QString fileName() const;
int interval() const; [[nodiscard]] int interval() const;
bool isActive() const; [[nodiscard]] bool isActive() const;
QString name() const; [[nodiscard]] QString name() const;
int number() const; [[nodiscard]] int number() const;
QString socket() const; [[nodiscard]] QString socket() const;
QString tag(const QString &_type) const; [[nodiscard]] QString tag(const QString &_type) const;
virtual QString uniq() const = 0; [[nodiscard]] virtual QString uniq() const = 0;
// set methods // set methods
void setApiVersion(const int _apiVersion); void setApiVersion(int _apiVersion);
void setActive(const bool _state); void setActive(bool _state);
void setComment(const QString &_comment); void setComment(const QString &_comment);
void setCron(const QString &_cron); void setCron(const QString &_cron);
void setInterval(const int _interval); void setInterval(int _interval);
void setName(const QString &_name); void setName(const QString &_name);
void setNumber(int _number); void setNumber(int _number);
void setSocket(const QString &_socket); void setSocket(const QString &_socket);
@@ -81,7 +79,7 @@ public slots:
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) = 0;
virtual bool tryDelete() const; [[nodiscard]] virtual bool tryDelete() const;
virtual void writeConfiguration() const; virtual void writeConfiguration() const;
private slots: private slots:
@@ -23,32 +23,29 @@
#include <QDir> #include <QDir>
#include <QInputDialog> #include <QInputDialog>
#include <QPushButton> #include <QPushButton>
#include <utility>
AbstractExtItemAggregator::AbstractExtItemAggregator(QWidget *_parent, AbstractExtItemAggregator::AbstractExtItemAggregator(QWidget *_parent, QString _type)
const QString &_type)
: QDialog(_parent) : QDialog(_parent)
, ui(new Ui::AbstractExtItemAggregator) , ui(new Ui::AbstractExtItemAggregator)
, m_type(_type) , m_type(std::move(_type))
{ {
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
// create directory at $HOME // create directory at $HOME
QString localDir = QString("%1/awesomewidgets/%2") QString localDir
.arg(QStandardPaths::writableLocation( = QString("%1/awesomewidgets/%2")
QStandardPaths::GenericDataLocation)) .arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation))
.arg(type()); .arg(type());
QDir localDirectory; QDir localDirectory;
if (localDirectory.mkpath(localDir)) if (localDirectory.mkpath(localDir))
qCInfo(LOG_LIB) << "Created directory" << localDir; qCInfo(LOG_LIB) << "Created directory" << localDir;
ui->setupUi(this); ui->setupUi(this);
copyButton copyButton = ui->buttonBox->addButton(i18n("Copy"), QDialogButtonBox::ActionRole);
= ui->buttonBox->addButton(i18n("Copy"), QDialogButtonBox::ActionRole); createButton = ui->buttonBox->addButton(i18n("Create"), QDialogButtonBox::ActionRole);
createButton = ui->buttonBox->addButton(i18n("Create"), deleteButton = ui->buttonBox->addButton(i18n("Remove"), QDialogButtonBox::ActionRole);
QDialogButtonBox::ActionRole);
deleteButton = ui->buttonBox->addButton(i18n("Remove"),
QDialogButtonBox::ActionRole);
connect(ui->buttonBox, SIGNAL(clicked(QAbstractButton *)), this, connect(ui->buttonBox, SIGNAL(clicked(QAbstractButton *)), this,
SLOT(editItemButtonPressed(QAbstractButton *))); SLOT(editItemButtonPressed(QAbstractButton *)));
@@ -72,8 +69,7 @@ void AbstractExtItemAggregator::copyItem()
QString fileName = getName(); QString fileName = getName();
int number = uniqNumber(); int number = uniqNumber();
QString dir = QString("%1/awesomewidgets/%2") QString dir = QString("%1/awesomewidgets/%2")
.arg(QStandardPaths::writableLocation( .arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation))
QStandardPaths::GenericDataLocation))
.arg(m_type); .arg(m_type);
if ((!source) || (fileName.isEmpty())) { if ((!source) || (fileName.isEmpty())) {
qCWarning(LOG_LIB) << "Nothing to copy"; qCWarning(LOG_LIB) << "Nothing to copy";
@@ -95,7 +91,7 @@ void AbstractExtItemAggregator::deleteItem()
if (!source) { if (!source) {
qCWarning(LOG_LIB) << "Nothing to delete"; qCWarning(LOG_LIB) << "Nothing to delete";
return; return;
}; }
if (source->tryDelete()) { if (source->tryDelete()) {
initItems(); initItems();
@@ -110,7 +106,7 @@ void AbstractExtItemAggregator::editItem()
if (!source) { if (!source) {
qCWarning(LOG_LIB) << "Nothing to edit"; qCWarning(LOG_LIB) << "Nothing to edit";
return; return;
}; }
if (source->showConfiguration(configArgs()) == 1) { if (source->showConfiguration(configArgs()) == 1) {
initItems(); initItems();
@@ -122,9 +118,8 @@ void AbstractExtItemAggregator::editItem()
QString AbstractExtItemAggregator::getName() QString AbstractExtItemAggregator::getName()
{ {
bool ok; bool ok;
QString name QString name = QInputDialog::getText(this, i18n("Enter file name"), i18n("File name"),
= QInputDialog::getText(this, i18n("Enter file name"), QLineEdit::Normal, "", &ok);
i18n("File name"), QLineEdit::Normal, "", &ok);
if ((!ok) || (name.isEmpty())) if ((!ok) || (name.isEmpty()))
return ""; return "";
if (!name.endsWith(".desktop")) if (!name.endsWith(".desktop"))
@@ -134,7 +129,7 @@ QString AbstractExtItemAggregator::getName()
} }
AbstractExtItem *AbstractExtItemAggregator::itemFromWidget() AbstractExtItem *AbstractExtItemAggregator::itemFromWidget() const
{ {
QListWidgetItem *widgetItem = ui->listWidget->currentItem(); QListWidgetItem *widgetItem = ui->listWidget->currentItem();
if (!widgetItem) if (!widgetItem)
@@ -149,19 +144,18 @@ AbstractExtItem *AbstractExtItemAggregator::itemFromWidget()
break; break;
} }
if (!found) if (!found)
qCWarning(LOG_LIB) << "Could not find item by name" qCWarning(LOG_LIB) << "Could not find item by name" << widgetItem->text();
<< widgetItem->text();
return found; return found;
} }
void AbstractExtItemAggregator::repaintList() void AbstractExtItemAggregator::repaintList() const
{ {
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); auto *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()));
@@ -193,10 +187,9 @@ QVariant AbstractExtItemAggregator::configArgs() const
QStringList AbstractExtItemAggregator::directories() const QStringList AbstractExtItemAggregator::directories() const
{ {
auto dirs auto dirs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation,
= QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QString("awesomewidgets/%1").arg(type()),
QString("awesomewidgets/%1").arg(type()), QStandardPaths::LocateDirectory);
QStandardPaths::LocateDirectory);
return dirs; return dirs;
} }
@@ -224,11 +217,11 @@ void AbstractExtItemAggregator::editItemActivated(QListWidgetItem *)
void AbstractExtItemAggregator::editItemButtonPressed(QAbstractButton *_button) void AbstractExtItemAggregator::editItemButtonPressed(QAbstractButton *_button)
{ {
if (static_cast<QPushButton *>(_button) == copyButton) if (dynamic_cast<QPushButton *>(_button) == copyButton)
return copyItem(); return copyItem();
else if (static_cast<QPushButton *>(_button) == createButton) else if (dynamic_cast<QPushButton *>(_button) == createButton)
return doCreateItem(); return doCreateItem();
else if (static_cast<QPushButton *>(_button) == deleteButton) else if (dynamic_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();
@@ -39,22 +39,22 @@ 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, QString _type);
virtual ~AbstractExtItemAggregator(); ~AbstractExtItemAggregator() override;
// methods // methods
void copyItem(); void copyItem();
template <class T> void createItem() template <class T> void createItem()
{ {
QString fileName = getName(); QString fileName = getName();
int number = uniqNumber(); int number = uniqNumber();
QString dir = QString("%1/awesomewidgets/%2") QString dir
.arg(QStandardPaths::writableLocation( = QString("%1/awesomewidgets/%2")
QStandardPaths::GenericDataLocation)) .arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation))
.arg(m_type); .arg(m_type);
if (fileName.isEmpty()) { if (fileName.isEmpty()) {
qCWarning(LOG_LIB) << "Nothing to create"; qCWarning(LOG_LIB) << "Nothing to create";
return; return;
}; }
QString filePath = QString("%1/%2").arg(dir).arg(fileName); QString filePath = QString("%1/%2").arg(dir).arg(fileName);
T *newItem = new T(this, filePath); T *newItem = new T(this, filePath);
@@ -62,20 +62,20 @@ public:
if (newItem->showConfiguration(configArgs()) == 1) { if (newItem->showConfiguration(configArgs()) == 1) {
initItems(); initItems();
repaintList(); repaintList();
}; }
}; };
void deleteItem(); void deleteItem();
void editItem(); void editItem();
QString getName(); QString getName();
virtual void initItems() = 0; virtual void initItems() = 0;
AbstractExtItem *itemFromWidget(); AbstractExtItem *itemFromWidget() const;
void repaintList(); void repaintList() const;
int uniqNumber() const; [[nodiscard]] int uniqNumber() const;
// get methods // get methods
QVariant configArgs() const; [[nodiscard]] QVariant configArgs() const;
QStringList directories() const; [[nodiscard]] QStringList directories() const;
virtual QList<AbstractExtItem *> items() const = 0; [[nodiscard]] virtual QList<AbstractExtItem *> items() const = 0;
QString type() const; [[nodiscard]] QString type() const;
// set methods // set methods
void setConfigArgs(const QVariant &_configArgs); void setConfigArgs(const QVariant &_configArgs);
@@ -0,0 +1,46 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#ifndef ABSTRACTQUOTESPROVIDER_H
#define ABSTRACTQUOTESPROVIDER_H
#include <QObject>
#include <QUrl>
#include "abstractextitem.h"
class AbstractQuotesProvider : public QObject
{
Q_OBJECT
public:
explicit AbstractQuotesProvider(QObject *_parent)
: QObject(_parent){};
~AbstractQuotesProvider() override = default;
virtual void initUrl(const QString &_asset) = 0;
[[nodiscard]] virtual QVariantHash parse(const QByteArray &_source,
const QVariantHash &_oldValues) const = 0;
[[nodiscard]] QString tag(const QString &_type) const
{
return dynamic_cast<AbstractExtItem *>(parent())->tag(_type);
};
[[nodiscard]] virtual QUrl url() const = 0;
};
#endif /* ABSTRACTQUOTESPROVIDER_H */
@@ -21,26 +21,24 @@
#include <QObject> #include <QObject>
#include <QUrl> #include <QUrl>
#include "abstractextitem.h"
class AbstractWeatherProvider : public QObject class AbstractWeatherProvider : public QObject
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY(int number READ number)
public: public:
explicit AbstractWeatherProvider(QObject *_parent, const int _number) explicit AbstractWeatherProvider(QObject *_parent)
: QObject(_parent) : QObject(_parent){};
, m_number(_number){}; ~AbstractWeatherProvider() override = default;
virtual ~AbstractWeatherProvider(){}; virtual void initUrl(const QString &_city, const QString &_country, int _ts) = 0;
virtual void initUrl(const QString &_city, const QString &_country, [[nodiscard]] virtual QVariantHash parse(const QVariantMap &_json) const = 0;
const int _ts) [[nodiscard]] QString tag(const QString &_type) const
= 0; {
virtual QVariantHash parse(const QVariantMap &_json) const = 0; return dynamic_cast<AbstractExtItem *>(parent())->tag(_type);
};
virtual QUrl url() const = 0; virtual QUrl url() const = 0;
int number() const { return m_number; };
private:
int m_number;
}; };
@@ -22,8 +22,7 @@
#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__;
@@ -40,7 +39,7 @@ void AWAbstractFormatter::copyDefaults(AbstractExtItem *_other) const
{ {
AbstractExtItem::copyDefaults(_other); AbstractExtItem::copyDefaults(_other);
static_cast<AWAbstractFormatter *>(_other)->setType(type()); dynamic_cast<AWAbstractFormatter *>(_other)->setType(type());
} }
@@ -108,8 +107,7 @@ void AWAbstractFormatter::setStrType(const QString &_type)
} }
void AWAbstractFormatter::setType( void AWAbstractFormatter::setType(const AWAbstractFormatter::FormatterClass _type)
const AWAbstractFormatter::FormatterClass _type)
{ {
qCDebug(LOG_LIB) << "Type" << static_cast<int>(_type); qCDebug(LOG_LIB) << "Type" << static_cast<int>(_type);
+12 -21
View File
@@ -28,32 +28,23 @@ class AWAbstractFormatter : public AbstractExtItem
Q_PROPERTY(QString strType READ strType WRITE setStrType) Q_PROPERTY(QString strType READ strType WRITE setStrType)
public: public:
enum class FormatterClass { enum class FormatterClass { DateTime, Float, List, Script, String, NoFormat, Json };
DateTime,
Float,
List,
Script,
String,
NoFormat,
Json
};
explicit AWAbstractFormatter(QWidget *_parent = nullptr, explicit AWAbstractFormatter(QWidget *_parent = nullptr, const QString &_filePath = "");
const QString &_filePath = ""); ~AWAbstractFormatter() override;
virtual ~AWAbstractFormatter(); [[nodiscard]] virtual QString convert(const QVariant &_value) const = 0;
virtual QString convert(const QVariant &_value) const = 0; void copyDefaults(AbstractExtItem *_other) const override;
void copyDefaults(AbstractExtItem *_other) const; [[nodiscard]] QString uniq() const override;
QString uniq() const;
// properties // properties
QString strType() const; [[nodiscard]] QString strType() const;
FormatterClass type() const; [[nodiscard]] FormatterClass type() const;
void setStrType(const QString &_type); void setStrType(const QString &_type);
void setType(const FormatterClass _type); void setType(FormatterClass _type);
public slots: public slots:
virtual void readConfiguration(); void readConfiguration() override;
QVariantHash run() { return QVariantHash(); }; QVariantHash run() override { return QVariantHash(); };
virtual void writeConfiguration() const; void writeConfiguration() const override;
private: private:
// properties // properties
+7 -12
View File
@@ -27,17 +27,16 @@
#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(); AWDateTimeFormatter::readConfiguration();
ui->setupUi(this); ui->setupUi(this);
translate(); AWDateTimeFormatter::translate();
} }
@@ -57,13 +56,11 @@ QString AWDateTimeFormatter::convert(const QVariant &_value) const
} }
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;
AWDateTimeFormatter *item auto *item = new AWDateTimeFormatter(dynamic_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->setTranslateString(translateString());
@@ -110,8 +107,7 @@ void AWDateTimeFormatter::readConfiguration()
settings.beginGroup("Desktop Entry"); settings.beginGroup("Desktop Entry");
setFormat(settings.value("X-AW-Format", format()).toString()); setFormat(settings.value("X-AW-Format", format()).toString());
setTranslateString( setTranslateString(settings.value("X-AW-Translate", translateString()).toBool());
settings.value("X-AW-Translate", translateString()).toBool());
settings.endGroup(); settings.endGroup();
bumpApi(AW_FORMATTER_API); bumpApi(AW_FORMATTER_API);
@@ -126,8 +122,7 @@ int AWDateTimeFormatter::showConfiguration(const QVariant &_args)
ui->lineEdit_comment->setText(comment()); ui->lineEdit_comment->setText(comment());
ui->label_typeValue->setText("DateTime"); ui->label_typeValue->setText("DateTime");
ui->lineEdit_format->setText(format()); ui->lineEdit_format->setText(format());
ui->checkBox_translate->setCheckState(translateString() ? Qt::Checked ui->checkBox_translate->setCheckState(translateString() ? Qt::Checked : Qt::Unchecked);
: Qt::Unchecked);
int ret = exec(); int ret = exec();
if (ret != 1) if (ret != 1)
+12 -14
View File
@@ -32,30 +32,28 @@ 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( Q_PROPERTY(bool translateString READ translateString WRITE setTranslateString)
bool translateString READ translateString WRITE setTranslateString)
public: public:
explicit AWDateTimeFormatter(QWidget *_parent = nullptr, explicit AWDateTimeFormatter(QWidget *_parent = nullptr, const QString &_filePath = "");
const QString &_filePath = ""); ~AWDateTimeFormatter() override;
virtual ~AWDateTimeFormatter(); [[nodiscard]] QString convert(const QVariant &_value) const override;
QString convert(const QVariant &_value) const; AWDateTimeFormatter *copy(const QString &_fileName, int _number) override;
AWDateTimeFormatter *copy(const QString &_fileName, const int _number);
// properties // properties
QString format() const; [[nodiscard]] QString format() const;
bool translateString() const; [[nodiscard]] bool translateString() const;
void setFormat(const QString &_format); void setFormat(const QString &_format);
void setTranslateString(const bool _translate); void setTranslateString(bool _translate);
public slots: public slots:
void readConfiguration(); void readConfiguration() override;
int showConfiguration(const QVariant &_args); int showConfiguration(const QVariant &_args) override;
void writeConfiguration() const; void writeConfiguration() const override;
private: private:
Ui::AWDateTimeFormatter *ui = nullptr; Ui::AWDateTimeFormatter *ui = nullptr;
void initLocale(); void initLocale();
void translate(); void translate() override;
// properties // properties
QLocale m_locale; QLocale m_locale;
QString m_format = ""; QString m_format = "";
+11 -19
View File
@@ -33,9 +33,9 @@ AWFloatFormatter::AWFloatFormatter(QWidget *_parent, const QString &_filePath)
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty()) if (!_filePath.isEmpty())
readConfiguration(); AWFloatFormatter::readConfiguration();
ui->setupUi(this); ui->setupUi(this);
translate(); AWFloatFormatter::translate();
} }
@@ -51,9 +51,8 @@ QString AWFloatFormatter::convert(const QVariant &_value) const
{ {
qCDebug(LOG_LIB) << "Convert value" << _value; qCDebug(LOG_LIB) << "Convert value" << _value;
QString output QString output = QString("%1").arg(_value.toDouble() * multiplier() + summand(), count(),
= QString("%1").arg(_value.toDouble() * multiplier() + summand(), format(), precision(), fillChar());
count(), format(), precision(), fillChar());
if (forceWidth()) if (forceWidth())
output = output.left(count()); output = output.left(count());
@@ -61,13 +60,11 @@ 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;
AWFloatFormatter *item auto *item = new AWFloatFormatter(dynamic_cast<QWidget *>(parent()), _fileName);
= new AWFloatFormatter(static_cast<QWidget *>(parent()), _fileName);
AWAbstractFormatter::copyDefaults(item); AWAbstractFormatter::copyDefaults(item);
item->setCount(count()); item->setCount(count());
item->setFormat(format()); item->setFormat(format());
@@ -152,8 +149,8 @@ void AWFloatFormatter::setFormat(char _format)
{ {
qCDebug(LOG_LIB) << "Set format" << _format; qCDebug(LOG_LIB) << "Set format" << _format;
// http://doc.qt.io/qt-5/qstring.html#argument-formats // http://doc.qt.io/qt-5/qstring.html#argument-formats
if ((_format != 'e') && (_format != 'E') && (_format != 'f') if ((_format != 'e') && (_format != 'E') && (_format != 'f') && (_format != 'g')
&& (_format != 'g') && (_format != 'G')) { && (_format != 'G')) {
qCWarning(LOG_LIB) << "Invalid format" << _format; qCWarning(LOG_LIB) << "Invalid format" << _format;
_format = 'f'; _format = 'f';
} }
@@ -196,10 +193,7 @@ void AWFloatFormatter::readConfiguration()
setCount(settings.value("X-AW-Width", count()).toInt()); setCount(settings.value("X-AW-Width", count()).toInt());
setFillChar(settings.value("X-AW-FillChar", fillChar()).toString().at(0)); setFillChar(settings.value("X-AW-FillChar", fillChar()).toString().at(0));
setForceWidth(settings.value("X-AW-ForceWidth", forceWidth()).toBool()); setForceWidth(settings.value("X-AW-ForceWidth", forceWidth()).toBool());
setFormat(settings.value("X-AW-Format", QString(format())) setFormat(settings.value("X-AW-Format", QString(format())).toString().at(0).toLatin1());
.toString()
.at(0)
.toLatin1());
setMultiplier(settings.value("X-AW-Multiplier", multiplier()).toDouble()); setMultiplier(settings.value("X-AW-Multiplier", multiplier()).toDouble());
setPrecision(settings.value("X-AW-Precision", precision()).toInt()); setPrecision(settings.value("X-AW-Precision", precision()).toInt());
setSummand(settings.value("X-AW-Summand", summand()).toDouble()); setSummand(settings.value("X-AW-Summand", summand()).toDouble());
@@ -216,13 +210,11 @@ int AWFloatFormatter::showConfiguration(const QVariant &_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("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());
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 : Qt::Unchecked);
: Qt::Unchecked);
ui->doubleSpinBox_multiplier->setValue(multiplier()); ui->doubleSpinBox_multiplier->setValue(multiplier());
ui->doubleSpinBox_summand->setValue(summand()); ui->doubleSpinBox_summand->setValue(summand());
+20 -21
View File
@@ -38,35 +38,34 @@ 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 = nullptr, const QString &_filePath = "");
const QString &_filePath = ""); ~AWFloatFormatter() override;
virtual ~AWFloatFormatter(); [[nodiscard]] QString convert(const QVariant &_value) const override;
QString convert(const QVariant &_value) const; AWFloatFormatter *copy(const QString &_fileName, int _number) override;
AWFloatFormatter *copy(const QString &_fileName, const int _number);
// properties // properties
int count() const; [[nodiscard]] int count() const;
QChar fillChar() const; [[nodiscard]] QChar fillChar() const;
bool forceWidth() const; [[nodiscard]] bool forceWidth() const;
char format() const; [[nodiscard]] char format() const;
double multiplier() const; [[nodiscard]] double multiplier() const;
int precision() const; [[nodiscard]] int precision() const;
double summand() const; [[nodiscard]] double summand() const;
void setCount(const int _count); void setCount(int _count);
void setFillChar(const QChar &_fillChar); void setFillChar(const QChar &_fillChar);
void setForceWidth(const bool _forceWidth); void setForceWidth(bool _forceWidth);
void setFormat(char _format); void setFormat(char _format);
void setMultiplier(const double _multiplier); void setMultiplier(double _multiplier);
void setPrecision(const int _precision); void setPrecision(int _precision);
void setSummand(const double _summand); void setSummand(double _summand);
public slots: public slots:
void readConfiguration(); void readConfiguration() override;
int showConfiguration(const QVariant &_args); int showConfiguration(const QVariant &_args) override;
void writeConfiguration() const; void writeConfiguration() const override;
private: private:
Ui::AWFloatFormatter *ui = nullptr; Ui::AWFloatFormatter *ui = nullptr;
void translate(); void translate() override;
// properties // properties
int m_count = 0; int m_count = 0;
QChar m_fillChar = QChar(); QChar m_fillChar = QChar();
+11 -17
View File
@@ -34,9 +34,9 @@ AWJsonFormatter::AWJsonFormatter(QWidget *_parent, const QString &_filePath)
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty()) if (!_filePath.isEmpty())
readConfiguration(); AWJsonFormatter::readConfiguration();
ui->setupUi(this); ui->setupUi(this);
translate(); AWJsonFormatter::translate();
} }
@@ -53,10 +53,9 @@ QString AWJsonFormatter::convert(const QVariant &_value) const
qCDebug(LOG_LIB) << "Convert value" << _value; qCDebug(LOG_LIB) << "Convert value" << _value;
// check if _value is string and parse first if required // check if _value is string and parse first if required
QJsonDocument json QJsonDocument json = _value.type() == QVariant::String
= _value.type() == QVariant::String ? QJsonDocument::fromJson(_value.toString().toUtf8())
? QJsonDocument::fromJson(_value.toString().toUtf8()) : QJsonDocument::fromVariant(_value);
: QJsonDocument::fromVariant(_value);
QVariant converted = json.toVariant(); QVariant converted = json.toVariant();
for (auto &element : m_splittedPath) for (auto &element : m_splittedPath)
converted = getFromJson(converted, element); converted = getFromJson(converted, element);
@@ -65,13 +64,11 @@ QString AWJsonFormatter::convert(const QVariant &_value) const
} }
AWJsonFormatter *AWJsonFormatter::copy(const QString &_fileName, AWJsonFormatter *AWJsonFormatter::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;
AWJsonFormatter *item auto *item = new AWJsonFormatter(dynamic_cast<QWidget *>(parent()), _fileName);
= new AWJsonFormatter(static_cast<QWidget *>(parent()), _fileName);
AWAbstractFormatter::copyDefaults(item); AWAbstractFormatter::copyDefaults(item);
item->setNumber(_number); item->setNumber(_number);
item->setPath(path()); item->setPath(path());
@@ -147,8 +144,7 @@ void AWJsonFormatter::writeConfiguration() const
} }
QVariant AWJsonFormatter::getFromJson(const QVariant &_value, QVariant AWJsonFormatter::getFromJson(const QVariant &_value, const QVariant &_element)
const QVariant &_element) const
{ {
qCDebug(LOG_LIB) << "Looking for element" << _element << "in" << _value; qCDebug(LOG_LIB) << "Looking for element" << _element << "in" << _value;
@@ -163,8 +159,7 @@ QVariant AWJsonFormatter::getFromJson(const QVariant &_value,
} }
QVariant AWJsonFormatter::getFromList(const QVariant &_value, QVariant AWJsonFormatter::getFromList(const QVariant &_value, const int _index)
const int _index) const
{ {
qCDebug(LOG_LIB) << "Looking for index" << _index << "in" << _value; qCDebug(LOG_LIB) << "Looking for index" << _index << "in" << _value;
@@ -172,8 +167,7 @@ QVariant AWJsonFormatter::getFromList(const QVariant &_value,
} }
QVariant AWJsonFormatter::getFromMap(const QVariant &_value, QVariant AWJsonFormatter::getFromMap(const QVariant &_value, const QString &_key)
const QString &_key) const
{ {
qCDebug(LOG_LIB) << "Looking for key" << _key << "in" << _value; qCDebug(LOG_LIB) << "Looking for key" << _key << "in" << _value;
@@ -184,7 +178,7 @@ QVariant AWJsonFormatter::getFromMap(const QVariant &_value,
void AWJsonFormatter::initPath() void AWJsonFormatter::initPath()
{ {
m_splittedPath.clear(); m_splittedPath.clear();
QStringList splittedByDot = m_path.split('.', QString::SkipEmptyParts); QStringList splittedByDot = m_path.split('.', Qt::SkipEmptyParts);
for (auto &element : splittedByDot) { for (auto &element : splittedByDot) {
bool ok; bool ok;
+12 -14
View File
@@ -32,28 +32,26 @@ class AWJsonFormatter : public AWAbstractFormatter
Q_PROPERTY(QString path READ path WRITE setPath) Q_PROPERTY(QString path READ path WRITE setPath)
public: public:
explicit AWJsonFormatter(QWidget *_parent = nullptr, explicit AWJsonFormatter(QWidget *_parent = nullptr, const QString &_filePath = "");
const QString &_filePath = ""); ~AWJsonFormatter() override;
virtual ~AWJsonFormatter(); [[nodiscard]] QString convert(const QVariant &_value) const override;
QString convert(const QVariant &_value) const; AWJsonFormatter *copy(const QString &_fileName, int _number) override;
AWJsonFormatter *copy(const QString &_fileName, const int _number);
// properties // properties
QString path() const; [[nodiscard]] QString path() const;
void setPath(const QString &_path); void setPath(const QString &_path);
public slots: public slots:
void readConfiguration(); void readConfiguration() override;
int showConfiguration(const QVariant &_args); int showConfiguration(const QVariant &_args) override;
void writeConfiguration() const; void writeConfiguration() const override;
private: private:
Ui::AWJsonFormatter *ui = nullptr; Ui::AWJsonFormatter *ui = nullptr;
QVariant getFromJson(const QVariant &_value, static QVariant getFromJson(const QVariant &_value, const QVariant &_element);
const QVariant &_element) const; static QVariant getFromList(const QVariant &_value, int _index);
QVariant getFromList(const QVariant &_value, const int _index) const; static QVariant getFromMap(const QVariant &_value, const QString &_key);
QVariant getFromMap(const QVariant &_value, const QString &_key) const;
void initPath(); void initPath();
void translate(); void translate() override;
// properties // properties
QString m_path; QString m_path;
QVariantList m_splittedPath; QVariantList m_splittedPath;
+5 -8
View File
@@ -33,9 +33,9 @@ AWListFormatter::AWListFormatter(QWidget *_parent, const QString &_filePath)
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty()) if (!_filePath.isEmpty())
readConfiguration(); AWListFormatter::readConfiguration();
ui->setupUi(this); ui->setupUi(this);
translate(); AWListFormatter::translate();
} }
@@ -59,13 +59,11 @@ 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;
AWListFormatter *item auto *item = new AWListFormatter(dynamic_cast<QWidget *>(parent()), _fileName);
= new AWListFormatter(static_cast<QWidget *>(parent()), _fileName);
AWAbstractFormatter::copyDefaults(item); AWAbstractFormatter::copyDefaults(item);
item->setFilter(filter()); item->setFilter(filter());
item->setSeparator(separator()); item->setSeparator(separator());
@@ -144,8 +142,7 @@ int AWListFormatter::showConfiguration(const QVariant &_args)
ui->label_typeValue->setText("List"); ui->label_typeValue->setText("List");
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 : Qt::Unchecked);
: Qt::Unchecked);
int ret = exec(); int ret = exec();
if (ret != 1) if (ret != 1)
+12 -13
View File
@@ -34,27 +34,26 @@ 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 = nullptr, const QString &_filePath = "");
const QString &_filePath = ""); ~AWListFormatter() override;
virtual ~AWListFormatter(); [[nodiscard]] QString convert(const QVariant &_value) const override;
QString convert(const QVariant &_value) const; AWListFormatter *copy(const QString &_fileName, int _number) override;
AWListFormatter *copy(const QString &_fileName, const int _number);
// properties // properties
QString filter() const; [[nodiscard]] QString filter() const;
bool isSorted() const; [[nodiscard]] bool isSorted() const;
QString separator() const; [[nodiscard]] 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(bool _sorted);
public slots: public slots:
void readConfiguration(); void readConfiguration() override;
int showConfiguration(const QVariant &_args); int showConfiguration(const QVariant &_args) override;
void writeConfiguration() const; void writeConfiguration() const override;
private: private:
Ui::AWListFormatter *ui = nullptr; Ui::AWListFormatter *ui = nullptr;
void translate(); void translate() override;
// properties // properties
QString m_filter = ""; QString m_filter = "";
QString m_separator = ""; QString m_separator = "";
+3 -4
View File
@@ -31,9 +31,9 @@ AWNoFormatter::AWNoFormatter(QWidget *_parent, const QString &_filePath)
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty()) if (!_filePath.isEmpty())
readConfiguration(); AWNoFormatter::readConfiguration();
ui->setupUi(this); ui->setupUi(this);
translate(); AWNoFormatter::translate();
} }
@@ -57,8 +57,7 @@ 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;
AWNoFormatter *item auto *item = new AWNoFormatter(dynamic_cast<QWidget *>(parent()), _fileName);
= new AWNoFormatter(static_cast<QWidget *>(parent()), _fileName);
AWAbstractFormatter::copyDefaults(item); AWAbstractFormatter::copyDefaults(item);
item->setNumber(_number); item->setNumber(_number);
+6 -7
View File
@@ -31,18 +31,17 @@ class AWNoFormatter : public AWAbstractFormatter
Q_OBJECT Q_OBJECT
public: public:
explicit AWNoFormatter(QWidget *_parent = nullptr, explicit AWNoFormatter(QWidget *_parent = nullptr, const QString &_filePath = "");
const QString &_filePath = ""); ~AWNoFormatter() override;
virtual ~AWNoFormatter(); [[nodiscard]] QString convert(const QVariant &_value) const override;
QString convert(const QVariant &_value) const; AWNoFormatter *copy(const QString &_fileName, int _number) override;
AWNoFormatter *copy(const QString &_fileName, const int _number);
public slots: public slots:
int showConfiguration(const QVariant &_args); int showConfiguration(const QVariant &_args) override;
private: private:
Ui::AWNoFormatter *ui = nullptr; Ui::AWNoFormatter *ui = nullptr;
void translate(); void translate() override;
// properties // properties
}; };
+8 -13
View File
@@ -34,9 +34,9 @@ AWScriptFormatter::AWScriptFormatter(QWidget *_parent, const QString &_filePath)
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty()) if (!_filePath.isEmpty())
readConfiguration(); AWScriptFormatter::readConfiguration();
ui->setupUi(this); ui->setupUi(this);
translate(); AWScriptFormatter::translate();
} }
@@ -59,9 +59,8 @@ QString AWScriptFormatter::convert(const QVariant &_value) const
QJSValue result = fn.call(args); QJSValue result = fn.call(args);
if (result.isError()) { if (result.isError()) {
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 "";
} else { } else {
return result.toString(); return result.toString();
@@ -69,13 +68,11 @@ QString AWScriptFormatter::convert(const QVariant &_value) const
} }
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;
AWScriptFormatter *item auto *item = new AWScriptFormatter(dynamic_cast<QWidget *>(parent()), _fileName);
= new AWScriptFormatter(static_cast<QWidget *>(parent()), _fileName);
AWAbstractFormatter::copyDefaults(item); AWAbstractFormatter::copyDefaults(item);
item->setAppendCode(appendCode()); item->setAppendCode(appendCode());
item->setCode(code()); item->setCode(code());
@@ -160,10 +157,8 @@ int AWScriptFormatter::showConfiguration(const QVariant &_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("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 : Qt::Unchecked);
ui->checkBox_hasReturn->setCheckState(hasReturn() ? Qt::Checked
: Qt::Unchecked);
ui->textEdit_code->setPlainText(code()); ui->textEdit_code->setPlainText(code());
int ret = exec(); int ret = exec();
+14 -15
View File
@@ -35,29 +35,28 @@ 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 = nullptr, const QString &_filePath = "");
const QString &_filePath = ""); ~AWScriptFormatter() override;
virtual ~AWScriptFormatter(); [[nodiscard]] QString convert(const QVariant &_value) const override;
QString convert(const QVariant &_value) const; AWScriptFormatter *copy(const QString &_fileName, int _number) override;
AWScriptFormatter *copy(const QString &_fileName, const int _number);
// properties // properties
bool appendCode() const; [[nodiscard]] bool appendCode() const;
QString code() const; [[nodiscard]] QString code() const;
bool hasReturn() const; [[nodiscard]] bool hasReturn() const;
QString program() const; [[nodiscard]] QString program() const;
void setAppendCode(const bool _appendCode); void setAppendCode(bool _appendCode);
void setCode(const QString &_code); void setCode(const QString &_code);
void setHasReturn(const bool _hasReturn); void setHasReturn(bool _hasReturn);
public slots: public slots:
void readConfiguration(); void readConfiguration() override;
int showConfiguration(const QVariant &_args); int showConfiguration(const QVariant &_args) override;
void writeConfiguration() const; void writeConfiguration() const override;
private: private:
Ui::AWScriptFormatter *ui = nullptr; Ui::AWScriptFormatter *ui = nullptr;
void initProgram(); void initProgram();
void translate(); void translate() override;
// properties // properties
bool m_appendCode = true; bool m_appendCode = true;
QString m_code = ""; QString m_code = "";
+5 -8
View File
@@ -33,9 +33,9 @@ AWStringFormatter::AWStringFormatter(QWidget *_parent, const QString &_filePath)
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty()) if (!_filePath.isEmpty())
readConfiguration(); AWStringFormatter::readConfiguration();
ui->setupUi(this); ui->setupUi(this);
translate(); AWStringFormatter::translate();
} }
@@ -59,13 +59,11 @@ 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;
AWStringFormatter *item auto *item = new AWStringFormatter(dynamic_cast<QWidget *>(parent()), _fileName);
= new AWStringFormatter(static_cast<QWidget *>(parent()), _fileName);
AWAbstractFormatter::copyDefaults(item); AWAbstractFormatter::copyDefaults(item);
item->setCount(count()); item->setCount(count());
item->setFillChar(fillChar()); item->setFillChar(fillChar());
@@ -143,8 +141,7 @@ int AWStringFormatter::showConfiguration(const QVariant &_args)
ui->label_typeValue->setText("String"); ui->label_typeValue->setText("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 : Qt::Unchecked);
: Qt::Unchecked);
int ret = exec(); int ret = exec();
if (ret != 1) if (ret != 1)
+13 -14
View File
@@ -34,27 +34,26 @@ 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 = nullptr, const QString &_filePath = "");
const QString &_filePath = ""); ~AWStringFormatter() override;
virtual ~AWStringFormatter(); [[nodiscard]] QString convert(const QVariant &_value) const override;
QString convert(const QVariant &_value) const; AWStringFormatter *copy(const QString &_fileName, int _number) override;
AWStringFormatter *copy(const QString &_fileName, const int _number);
// properties // properties
int count() const; [[nodiscard]] int count() const;
QChar fillChar() const; [[nodiscard]] QChar fillChar() const;
bool forceWidth() const; [[nodiscard]] bool forceWidth() const;
void setCount(const int _count); void setCount(int _count);
void setFillChar(const QChar &_fillChar); void setFillChar(const QChar &_fillChar);
void setForceWidth(const bool _forceWidth); void setForceWidth(bool _forceWidth);
public slots: public slots:
void readConfiguration(); void readConfiguration() override;
int showConfiguration(const QVariant &_args); int showConfiguration(const QVariant &_args) override;
void writeConfiguration() const; void writeConfiguration() const override;
private: private:
Ui::AWStringFormatter *ui = nullptr; Ui::AWStringFormatter *ui = nullptr;
void translate(); void translate() override;
// properties // properties
int m_count = 0; int m_count = 0;
QChar m_fillChar = QChar(); QChar m_fillChar = QChar();
+8 -9
View File
@@ -41,10 +41,10 @@ public:
qCDebug(LOG_LIB) << "Type" << _type; qCDebug(LOG_LIB) << "Type" << _type;
initItems(); ExtItemAggregator::initItems();
}; };
virtual ~ExtItemAggregator() ~ExtItemAggregator() override
{ {
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
@@ -61,7 +61,7 @@ public:
qCInfo(LOG_LIB) << "Dialog returns" << ret; qCInfo(LOG_LIB) << "Dialog returns" << ret;
}; };
void initItems() void initItems() override
{ {
m_items.clear(); m_items.clear();
m_activeItems.clear(); m_activeItems.clear();
@@ -117,13 +117,13 @@ public:
return found; return found;
}; };
QList<AbstractExtItem *> items() const { return m_items; }; [[nodiscard]] QList<AbstractExtItem *> items() const override { return m_items; };
private: private:
QList<AbstractExtItem *> m_items; QList<AbstractExtItem *> m_items;
QList<T *> m_activeItems; QList<T *> m_activeItems;
void doCreateItem() { return createItem<T>(); } void doCreateItem() override { return createItem<T>(); }
QList<AbstractExtItem *> getItems() QList<AbstractExtItem *> getItems()
{ {
@@ -139,10 +139,9 @@ private:
qCInfo(LOG_LIB) << "Found file" << file << "in" << dir; qCInfo(LOG_LIB) << "Found file" << file << "in" << dir;
QString filePath = QString("%1/%2").arg(dir).arg(file); QString filePath = QString("%1/%2").arg(dir).arg(file);
// check if already exists // check if already exists
if (std::any_of(items.cbegin(), items.cend(), if (std::any_of(items.cbegin(), items.cend(), [&filePath](AbstractExtItem *item) {
[&filePath](AbstractExtItem *item) { return (item->fileName() == filePath);
return (item->fileName() == filePath); }))
}))
continue; continue;
items.append(new T(this, filePath)); items.append(new T(this, filePath));
} }
+7 -10
View File
@@ -36,9 +36,9 @@ ExtNetworkRequest::ExtNetworkRequest(QWidget *_parent, const QString &_filePath)
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty()) if (!_filePath.isEmpty())
readConfiguration(); ExtNetworkRequest::readConfiguration();
ui->setupUi(this); ui->setupUi(this);
translate(); ExtNetworkRequest::translate();
m_values[tag("response")] = ""; m_values[tag("response")] = "";
@@ -65,13 +65,11 @@ ExtNetworkRequest::~ExtNetworkRequest()
} }
ExtNetworkRequest *ExtNetworkRequest::copy(const QString &_fileName, ExtNetworkRequest *ExtNetworkRequest::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;
ExtNetworkRequest *item auto *item = new ExtNetworkRequest(dynamic_cast<QWidget *>(parent()), _fileName);
= new ExtNetworkRequest(static_cast<QWidget *>(parent()), _fileName);
copyDefaults(item); copyDefaults(item);
item->setNumber(_number); item->setNumber(_number);
item->setStringUrl(stringUrl()); item->setStringUrl(stringUrl());
@@ -133,8 +131,7 @@ int ExtNetworkRequest::showConfiguration(const QVariant &_args)
ui->lineEdit_comment->setText(comment()); ui->lineEdit_comment->setText(comment());
ui->label_numberValue->setText(QString("%1").arg(number())); ui->label_numberValue->setText(QString("%1").arg(number()));
ui->lineEdit_url->setText(stringUrl()); ui->lineEdit_url->setText(stringUrl());
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_schedule->setText(cron());
ui->lineEdit_socket->setText(socket()); ui->lineEdit_socket->setText(socket());
ui->spinBox_interval->setValue(interval()); ui->spinBox_interval->setValue(interval());
@@ -174,8 +171,8 @@ void ExtNetworkRequest::writeConfiguration() const
void ExtNetworkRequest::networkReplyReceived(QNetworkReply *_reply) void ExtNetworkRequest::networkReplyReceived(QNetworkReply *_reply)
{ {
if (_reply->error() != QNetworkReply::NoError) { if (_reply->error() != QNetworkReply::NoError) {
qCWarning(LOG_AW) << "An error occurs" << _reply->error() qCWarning(LOG_AW) << "An error occurs" << _reply->error() << "with message"
<< "with message" << _reply->errorString(); << _reply->errorString();
return; return;
} }
+10 -11
View File
@@ -34,21 +34,20 @@ class ExtNetworkRequest : public AbstractExtItem
Q_PROPERTY(QString stringUrl READ stringUrl WRITE setStringUrl) Q_PROPERTY(QString stringUrl READ stringUrl WRITE setStringUrl)
public: public:
explicit ExtNetworkRequest(QWidget *_parent = nullptr, explicit ExtNetworkRequest(QWidget *_parent = nullptr, const QString &_filePath = "");
const QString &_filePath = ""); ~ExtNetworkRequest() override;
virtual ~ExtNetworkRequest(); ExtNetworkRequest *copy(const QString &_fileName, int _number) override;
ExtNetworkRequest *copy(const QString &_fileName, const int _number);
// get methods // get methods
QString stringUrl() const; [[nodiscard]] QString stringUrl() const;
QString uniq() const; [[nodiscard]] QString uniq() const override;
// set methods // set methods
void setStringUrl(const QString &_url); void setStringUrl(const QString &_url);
public slots: public slots:
void readConfiguration(); void readConfiguration() override;
QVariantHash run(); QVariantHash run() override;
int showConfiguration(const QVariant &_args); int showConfiguration(const QVariant &_args) override;
void writeConfiguration() const; void writeConfiguration() const override;
private slots: private slots:
void networkReplyReceived(QNetworkReply *_reply); void networkReplyReceived(QNetworkReply *_reply);
@@ -60,7 +59,7 @@ private:
bool m_isRunning = false; bool m_isRunning = false;
Ui::ExtNetworkRequest *ui = nullptr; Ui::ExtNetworkRequest *ui = nullptr;
void initUrl(); void initUrl();
void translate(); void translate() override;
// properties // properties
QString m_stringUrl = "https://httpbin.org/get"; QString m_stringUrl = "https://httpbin.org/get";
// values // values
+27 -65
View File
@@ -21,13 +21,12 @@
#include <KI18n/KLocalizedString> #include <KI18n/KLocalizedString>
#include <QDir> #include <QDir>
#include <QJsonDocument>
#include <QSettings> #include <QSettings>
#include <QUrlQuery>
#include <qreplytimeout/qreplytimeout.h> #include <qreplytimeout/qreplytimeout.h>
#include "awdebug.h" #include "awdebug.h"
#include "stooqquotesprovider.h"
ExtQuotes::ExtQuotes(QWidget *_parent, const QString &_filePath) ExtQuotes::ExtQuotes(QWidget *_parent, const QString &_filePath)
@@ -37,19 +36,16 @@ ExtQuotes::ExtQuotes(QWidget *_parent, const QString &_filePath)
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty()) if (!_filePath.isEmpty())
readConfiguration(); ExtQuotes::readConfiguration();
ui->setupUi(this); ui->setupUi(this);
translate(); ExtQuotes::translate();
m_values[tag("ask")] = 0.0;
m_values[tag("askchg")] = 0.0;
m_values[tag("percaskchg")] = 0.0;
m_values[tag("bid")] = 0.0;
m_values[tag("bidchg")] = 0.0;
m_values[tag("percbidchg")] = 0.0;
m_values[tag("price")] = 0.0; m_values[tag("price")] = 0.0;
m_values[tag("pricechg")] = 0.0; m_values[tag("pricechg")] = 0.0;
m_values[tag("percpricechg")] = 0.0; m_values[tag("percpricechg")] = 0.0;
m_values[tag("volume")] = 0;
m_values[tag("volumechg")] = 0;
m_values[tag("percvolumechg")] = 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
@@ -78,8 +74,7 @@ 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;
ExtQuotes *item auto *item = new ExtQuotes(dynamic_cast<QWidget *>(parent()), _fileName);
= new ExtQuotes(static_cast<QWidget *>(parent()), _fileName);
copyDefaults(item); copyDefaults(item);
item->setNumber(_number); item->setNumber(_number);
item->setTicker(ticker()); item->setTicker(ticker());
@@ -105,7 +100,7 @@ void ExtQuotes::setTicker(const QString &_ticker)
qCDebug(LOG_LIB) << "Ticker" << _ticker; qCDebug(LOG_LIB) << "Ticker" << _ticker;
m_ticker = _ticker; m_ticker = _ticker;
initUrl(); initProvider();
} }
@@ -141,8 +136,7 @@ int ExtQuotes::showConfiguration(const QVariant &_args)
ui->lineEdit_comment->setText(comment()); ui->lineEdit_comment->setText(comment());
ui->label_numberValue->setText(QString("%1").arg(number())); ui->label_numberValue->setText(QString("%1").arg(number()));
ui->lineEdit_ticker->setText(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_schedule->setText(cron());
ui->lineEdit_socket->setText(socket()); ui->lineEdit_socket->setText(socket());
ui->spinBox_interval->setValue(interval()); ui->spinBox_interval->setValue(interval());
@@ -182,49 +176,19 @@ void ExtQuotes::writeConfiguration() const
void ExtQuotes::quotesReplyReceived(QNetworkReply *_reply) void ExtQuotes::quotesReplyReceived(QNetworkReply *_reply)
{ {
if (_reply->error() != QNetworkReply::NoError) { if (_reply->error() != QNetworkReply::NoError) {
qCWarning(LOG_AW) << "An error occurs" << _reply->error() qCWarning(LOG_AW) << "An error occurs" << _reply->error() << "with message"
<< "with message" << _reply->errorString(); << _reply->errorString();
return; return;
} }
m_isRunning = false; m_isRunning = false;
QJsonParseError error; auto text = _reply->readAll();
QJsonDocument jsonDoc = QJsonDocument::fromJson(_reply->readAll(), &error);
_reply->deleteLater(); _reply->deleteLater();
if (error.error != QJsonParseError::NoError) {
qCWarning(LOG_LIB) << "Parse error" << error.errorString(); QVariantHash data = m_providerObject->parse(text, m_values);
if (data.isEmpty())
return; return;
} m_values = data;
QVariantMap jsonQuotes = jsonDoc.toVariant().toMap()["query"].toMap();
jsonQuotes = jsonQuotes["results"].toMap()["quote"].toMap();
double value;
// ask
value = jsonQuotes["Ask"].toString().toDouble();
m_values[tag("askchg")] = m_values[tag("ask")].toDouble() == 0.0
? 0.0
: value - m_values[tag("ask")].toDouble();
m_values[tag("percaskchg")] = 100.0 * m_values[tag("askchg")].toDouble()
/ m_values[tag("ask")].toDouble();
m_values[tag("ask")] = value;
// bid
value = jsonQuotes["Bid"].toString().toDouble();
m_values[tag("bidchg")] = m_values[tag("bid")].toDouble() == 0.0
? 0.0
: value - m_values[tag("bid")].toDouble();
m_values[tag("percbidchg")] = 100.0 * m_values[tag("bidchg")].toDouble()
/ m_values[tag("bid")].toDouble();
m_values[tag("bid")] = value;
// last trade
value = jsonQuotes["LastTradePriceOnly"].toString().toDouble();
m_values[tag("pricechg")] = m_values[tag("price")].toDouble() == 0.0
? 0.0
: value - m_values[tag("price")].toDouble();
m_values[tag("percpricechg")] = 100.0 * m_values[tag("pricechg")].toDouble()
/ m_values[tag("price")].toDouble();
m_values[tag("price")] = value;
emit(dataReceived(m_values)); emit(dataReceived(m_values));
} }
@@ -233,20 +197,19 @@ void ExtQuotes::quotesReplyReceived(QNetworkReply *_reply)
void ExtQuotes::sendRequest() void ExtQuotes::sendRequest()
{ {
m_isRunning = true; m_isRunning = true;
QNetworkReply *reply = m_manager->get(QNetworkRequest(m_url)); QNetworkReply *reply = m_manager->get(QNetworkRequest(m_providerObject->url()));
new QReplyTimeout(reply, REQUEST_TIMEOUT); new QReplyTimeout(reply, REQUEST_TIMEOUT);
} }
void ExtQuotes::initUrl() void ExtQuotes::initProvider()
{ {
// init query delete m_providerObject;
m_url = QUrl(YAHOO_QUOTES_URL);
QUrlQuery params; // in the future release it is possible to change provider here
params.addQueryItem("format", "json"); m_providerObject = new StooqQuotesProvider(this);
params.addQueryItem("env", "store://datatables.org/alltableswithkeys");
params.addQueryItem("q", QString(YAHOO_QUOTES_QUERY).arg(ticker())); return m_providerObject->initUrl(ticker());
m_url.setQuery(params);
} }
@@ -256,10 +219,9 @@ void ExtQuotes::translate()
ui->label_comment->setText(i18n("Comment")); ui->label_comment->setText(i18n("Comment"));
ui->label_number->setText(i18n("Tag")); ui->label_number->setText(i18n("Tag"));
ui->label->setText( ui->label->setText(
i18n("<html><head/><body><p>Use YAHOO! finance ticker to \ i18n("<html><head/><body><p>Use Stooq ticker to get quotes for the instrument. Refer to <a "
get quotes for the instrument. Refer to <a href=\"http://finance.yahoo.com/\">\ "href=\"https://stooq.com/\"><span style=\" text-decoration: underline; "
<span style=\" text-decoration: underline; color:#0057ae;\">http://finance.yahoo.com/\ "color:#0057ae;\">https://stooq.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_schedule->setText(i18n("Schedule"));
+13 -17
View File
@@ -23,6 +23,7 @@
#include "abstractextitem.h" #include "abstractextitem.h"
class AbstractQuotesProvider;
namespace Ui namespace Ui
{ {
class ExtQuotes; class ExtQuotes;
@@ -34,37 +35,32 @@ 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 = nullptr, const QString &_filePath = "");
const char *YAHOO_QUOTES_QUERY ~ExtQuotes() override;
= "select * from yahoo.finance.quotes where symbol='%1'"; ExtQuotes *copy(const QString &_fileName, int _number) override;
explicit ExtQuotes(QWidget *_parent = nullptr,
const QString &_filePath = "");
virtual ~ExtQuotes();
ExtQuotes *copy(const QString &_fileName, const int _number);
// get methods // get methods
QString ticker() const; [[nodiscard]] QString ticker() const;
QString uniq() const; [[nodiscard]] QString uniq() const override;
// set methods // set methods
void setTicker(const QString &_ticker); void setTicker(const QString &_ticker);
public slots: public slots:
void readConfiguration(); void readConfiguration() override;
QVariantHash run(); QVariantHash run() override;
int showConfiguration(const QVariant &_args); int showConfiguration(const QVariant &_args) override;
void writeConfiguration() const; void writeConfiguration() const override;
private slots: private slots:
void quotesReplyReceived(QNetworkReply *_reply); void quotesReplyReceived(QNetworkReply *_reply);
void sendRequest(); void sendRequest();
private: private:
AbstractQuotesProvider *m_providerObject = nullptr;
QNetworkAccessManager *m_manager = nullptr; QNetworkAccessManager *m_manager = nullptr;
QUrl m_url;
bool m_isRunning = false; bool m_isRunning = false;
Ui::ExtQuotes *ui = nullptr; Ui::ExtQuotes *ui = nullptr;
void initUrl(); void initProvider();
void translate(); void translate() override;
// properties // properties
QString m_ticker = "EURUSD=X"; QString m_ticker = "EURUSD=X";
// values // values
+1 -1
View File
@@ -84,7 +84,7 @@
<item> <item>
<widget class="QLabel" name="label"> <widget class="QLabel" name="label">
<property name="text"> <property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Use YAHOO! finance ticker to get quotes for the instrument. Refer to &lt;a href=&quot;http://finance.yahoo.com/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0057ae;&quot;&gt;http://finance.yahoo.com/&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Use Stooq ticker to get quotes for the instrument. Refer to &lt;a href=&quot;https://stooq.com/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0057ae;&quot;&gt;https://stooq.com/&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property> </property>
<property name="alignment"> <property name="alignment">
<set>Qt::AlignCenter</set> <set>Qt::AlignCenter</set>
+30 -67
View File
@@ -36,16 +36,15 @@ ExtScript::ExtScript(QWidget *_parent, const QString &_filePath)
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty()) if (!_filePath.isEmpty())
readConfiguration(); ExtScript::readConfiguration();
readJsonFilters(); readJsonFilters();
ui->setupUi(this); ui->setupUi(this);
translate(); ExtScript::translate();
m_values[tag("custom")] = ""; m_values[tag("custom")] = "";
m_process = new QProcess(nullptr); m_process = new QProcess(nullptr);
connect(m_process, SIGNAL(finished(int, QProcess::ExitStatus)), this, connect(m_process, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(updateValue()));
SLOT(updateValue()));
m_process->waitForFinished(0); m_process->waitForFinished(0);
connect(this, SIGNAL(requestDataUpdate()), this, SLOT(startProcess())); connect(this, SIGNAL(requestDataUpdate()), this, SLOT(startProcess()));
@@ -56,8 +55,7 @@ ExtScript::~ExtScript()
{ {
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
disconnect(m_process, SIGNAL(finished(int, QProcess::ExitStatus)), this, disconnect(m_process, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(updateValue()));
SLOT(updateValue()));
m_process->kill(); m_process->kill();
m_process->deleteLater(); m_process->deleteLater();
disconnect(this, SIGNAL(requestDataUpdate()), this, SLOT(startProcess())); disconnect(this, SIGNAL(requestDataUpdate()), this, SLOT(startProcess()));
@@ -69,12 +67,10 @@ 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;
ExtScript *item auto *item = new ExtScript(dynamic_cast<QWidget *>(parent()), _fileName);
= new ExtScript(static_cast<QWidget *>(parent()), _fileName);
copyDefaults(item); copyDefaults(item);
item->setExecutable(executable()); item->setExecutable(executable());
item->setNumber(_number); item->setNumber(_number);
item->setPrefix(prefix());
item->setRedirect(redirect()); item->setRedirect(redirect());
item->setFilters(filters()); item->setFilters(filters());
@@ -82,11 +78,11 @@ ExtScript *ExtScript::copy(const QString &_fileName, const int _number)
} }
QString ExtScript::jsonFiltersFile() const QString ExtScript::jsonFiltersFile()
{ {
QString fileName = QStandardPaths::locate( QString fileName
QStandardPaths::GenericDataLocation, = QStandardPaths::locate(QStandardPaths::GenericDataLocation,
"awesomewidgets/scripts/awesomewidgets-extscripts-filters.json"); "awesomewidgets/scripts/awesomewidgets-extscripts-filters.json");
qCInfo(LOG_LIB) << "Filters file" << fileName; qCInfo(LOG_LIB) << "Filters file" << fileName;
return fileName; return fileName;
@@ -105,12 +101,6 @@ QStringList ExtScript::filters() const
} }
QString ExtScript::prefix() const
{
return m_prefix;
}
ExtScript::Redirect ExtScript::redirect() const ExtScript::Redirect ExtScript::redirect() const
{ {
return m_redirect; return m_redirect;
@@ -157,17 +147,8 @@ 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](const QString &filter) { return updateFilter(filter, true); });
[this](const QString &filter) { return updateFilter(filter, true); });
}
void ExtScript::setPrefix(const QString &_prefix)
{
qCDebug(LOG_LIB) << "Prefix" << _prefix;
m_prefix = _prefix;
} }
@@ -202,8 +183,7 @@ QString ExtScript::applyFilters(QString _value) const
qCInfo(LOG_LIB) << "Found filter" << filt; qCInfo(LOG_LIB) << "Found filter" << filt;
QVariantMap filter = m_jsonFilters[filt].toMap(); QVariantMap filter = m_jsonFilters[filt].toMap();
if (filter.isEmpty()) { if (filter.isEmpty()) {
qCWarning(LOG_LIB) qCWarning(LOG_LIB) << "Could not find filter" << _value << "in the json";
<< "Could not find filter" << _value << "in the json";
continue; continue;
} }
for (auto &f : filter.keys()) for (auto &f : filter.keys())
@@ -236,12 +216,9 @@ void ExtScript::readConfiguration()
settings.beginGroup("Desktop Entry"); settings.beginGroup("Desktop Entry");
setExecutable(settings.value("Exec", executable()).toString()); setExecutable(settings.value("Exec", executable()).toString());
setPrefix(settings.value("X-AW-Prefix", prefix()).toString());
setStrRedirect(settings.value("X-AW-Redirect", strRedirect()).toString()); setStrRedirect(settings.value("X-AW-Redirect", strRedirect()).toString());
// api == 3 // api == 3
setFilters(settings.value("X-AW-Filters", filters()) setFilters(settings.value("X-AW-Filters", filters()).toString().split(',', Qt::SkipEmptyParts));
.toString()
.split(',', QString::SkipEmptyParts));
settings.endGroup(); settings.endGroup();
bumpApi(AW_EXTSCRIPT_API); bumpApi(AW_EXTSCRIPT_API);
@@ -259,7 +236,7 @@ void ExtScript::readJsonFilters()
QString jsonText = jsonFile.readAll(); QString jsonText = jsonFile.readAll();
jsonFile.close(); jsonFile.close();
QJsonParseError error; QJsonParseError error{};
QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonText.toUtf8(), &error); QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonText.toUtf8(), &error);
if (error.error != QJsonParseError::NoError) { if (error.error != QJsonParseError::NoError) {
qCWarning(LOG_LIB) << "Parse error" << error.errorString(); qCWarning(LOG_LIB) << "Parse error" << error.errorString();
@@ -289,20 +266,18 @@ int ExtScript::showConfiguration(const QVariant &_args)
ui->lineEdit_comment->setText(comment()); ui->lineEdit_comment->setText(comment());
ui->label_numberValue->setText(QString("%1").arg(number())); ui->label_numberValue->setText(QString("%1").arg(number()));
ui->lineEdit_command->setText(executable()); ui->lineEdit_command->setText(executable());
ui->lineEdit_prefix->setText(prefix()); ui->checkBox_active->setCheckState(isActive() ? Qt::Checked : Qt::Unchecked);
ui->checkBox_active->setCheckState(isActive() ? Qt::Checked
: 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_schedule->setText(cron());
ui->lineEdit_socket->setText(socket()); 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
filters().contains("color") ? Qt::Checked : Qt::Unchecked); : Qt::Unchecked);
ui->checkBox_linesFilter->setCheckState( ui->checkBox_linesFilter->setCheckState(filters().contains("newline") ? Qt::Checked
filters().contains("newline") ? Qt::Checked : Qt::Unchecked); : Qt::Unchecked);
ui->checkBox_spaceFilter->setCheckState( ui->checkBox_spaceFilter->setCheckState(filters().contains("space") ? Qt::Checked
filters().contains("space") ? Qt::Checked : Qt::Unchecked); : Qt::Unchecked);
int ret = exec(); int ret = exec();
if (ret != 1) if (ret != 1)
@@ -312,19 +287,15 @@ int ExtScript::showConfiguration(const QVariant &_args)
setNumber(ui->label_numberValue->text().toInt()); setNumber(ui->label_numberValue->text().toInt());
setApiVersion(AW_EXTSCRIPT_API); setApiVersion(AW_EXTSCRIPT_API);
setExecutable(ui->lineEdit_command->text()); setExecutable(ui->lineEdit_command->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()); setCron(ui->lineEdit_schedule->text());
setSocket(ui->lineEdit_socket->text()); setSocket(ui->lineEdit_socket->text());
setInterval(ui->spinBox_interval->value()); setInterval(ui->spinBox_interval->value());
// filters // filters
updateFilter("color", updateFilter("color", ui->checkBox_colorFilter->checkState() == Qt::Checked);
ui->checkBox_colorFilter->checkState() == Qt::Checked); updateFilter("newline", ui->checkBox_linesFilter->checkState() == Qt::Checked);
updateFilter("newline", updateFilter("space", ui->checkBox_spaceFilter->checkState() == Qt::Checked);
ui->checkBox_linesFilter->checkState() == Qt::Checked);
updateFilter("space",
ui->checkBox_spaceFilter->checkState() == Qt::Checked);
writeConfiguration(); writeConfiguration();
return ret; return ret;
@@ -340,7 +311,6 @@ void ExtScript::writeConfiguration() const
settings.beginGroup("Desktop Entry"); settings.beginGroup("Desktop Entry");
settings.setValue("Exec", executable()); settings.setValue("Exec", executable());
settings.setValue("X-AW-Prefix", prefix());
settings.setValue("X-AW-Redirect", strRedirect()); settings.setValue("X-AW-Redirect", strRedirect());
settings.setValue("X-AW-Filters", filters().join(',')); settings.setValue("X-AW-Filters", filters().join(','));
settings.endGroup(); settings.endGroup();
@@ -351,25 +321,19 @@ void ExtScript::writeConfiguration() const
void ExtScript::startProcess() void ExtScript::startProcess()
{ {
QStringList cmdList; qCInfo(LOG_LIB) << "Run cmd" << executable();
if (!prefix().isEmpty()) m_process->start("sh", QStringList() << "-c" << executable());
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" << m_process->exitCode();
QString qdebug = QTextCodec::codecForMib(106) QString qdebug
->toUnicode(m_process->readAllStandardError()) = QTextCodec::codecForMib(106)->toUnicode(m_process->readAllStandardError()).trimmed();
.trimmed();
qCInfo(LOG_LIB) << "Error" << qdebug; qCInfo(LOG_LIB) << "Error" << qdebug;
QString qoutput = QTextCodec::codecForMib(106) QString qoutput
->toUnicode(m_process->readAllStandardOutput()) = QTextCodec::codecForMib(106)->toUnicode(m_process->readAllStandardOutput()).trimmed();
.trimmed();
qCInfo(LOG_LIB) << "Output" << qoutput; qCInfo(LOG_LIB) << "Output" << qoutput;
QString strValue; QString strValue;
@@ -399,7 +363,6 @@ void ExtScript::translate()
ui->label_comment->setText(i18n("Comment")); ui->label_comment->setText(i18n("Comment"));
ui->label_number->setText(i18n("Tag")); ui->label_number->setText(i18n("Tag"));
ui->label_command->setText(i18n("Command")); ui->label_command->setText(i18n("Command"));
ui->label_prefix->setText(i18n("Prefix"));
ui->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_schedule->setText(i18n("Schedule"));
+18 -27
View File
@@ -33,46 +33,37 @@ class ExtScript : public AbstractExtItem
Q_OBJECT Q_OBJECT
Q_PROPERTY(QString executable READ executable WRITE setExecutable) Q_PROPERTY(QString executable READ executable WRITE setExecutable)
Q_PROPERTY(QStringList filters READ filters WRITE setFilters) Q_PROPERTY(QStringList filters READ filters WRITE setFilters)
Q_PROPERTY(QString prefix READ prefix WRITE setPrefix)
Q_PROPERTY(Redirect redirect READ redirect WRITE setRedirect) Q_PROPERTY(Redirect redirect READ redirect WRITE setRedirect)
public: public:
enum class Redirect { enum class Redirect { stdout2stderr = 0, nothing = 1, stderr2stdout = 2, swap = 3 };
stdout2stderr = 0,
nothing = 1,
stderr2stdout = 2,
swap = 3
};
explicit ExtScript(QWidget *_parent = nullptr, explicit ExtScript(QWidget *_parent = nullptr, const QString &_filePath = "");
const QString &_filePath = ""); ~ExtScript() override;
virtual ~ExtScript(); ExtScript *copy(const QString &_fileName, int _number) override;
ExtScript *copy(const QString &_fileName, const int _number); static QString jsonFiltersFile();
QString jsonFiltersFile() const;
// get methods // get methods
QString executable() const; [[nodiscard]] QString executable() const;
QStringList filters() const; [[nodiscard]] QStringList filters() const;
QString prefix() const; [[nodiscard]] Redirect redirect() const;
Redirect redirect() const; [[nodiscard]] QString uniq() const override;
QString uniq() const;
// derivatives // derivatives
QString strRedirect() const; [[nodiscard]] QString strRedirect() const;
// set methods // set methods
void setExecutable(const QString &_executable); void setExecutable(const QString &_executable);
void setFilters(const QStringList &_filters); void setFilters(const QStringList &_filters);
void setPrefix(const QString &_prefix); void setRedirect(Redirect _redirect);
void setRedirect(const Redirect _redirect);
void setStrRedirect(const QString &_redirect); void setStrRedirect(const QString &_redirect);
// filters // filters
QString applyFilters(QString _value) const; [[nodiscard]] QString applyFilters(QString _value) const;
void updateFilter(const QString &_filter, const bool _add); void updateFilter(const QString &_filter, bool _add);
public slots: public slots:
void readConfiguration(); void readConfiguration() override;
void readJsonFilters(); void readJsonFilters();
QVariantHash run(); QVariantHash run() override;
int showConfiguration(const QVariant &_args); int showConfiguration(const QVariant &_args) override;
void writeConfiguration() const; void writeConfiguration() const override;
private slots: private slots:
void startProcess(); void startProcess();
@@ -81,7 +72,7 @@ private slots:
private: private:
QProcess *m_process = nullptr; QProcess *m_process = nullptr;
Ui::ExtScript *ui = nullptr; Ui::ExtScript *ui = nullptr;
void translate(); void translate() override;
// properties // properties
QString m_executable = "/usr/bin/true"; QString m_executable = "/usr/bin/true";
QStringList m_filters = QStringList(); QStringList m_filters = QStringList();
+1 -24
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>463</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@@ -104,29 +104,6 @@
</item> </item>
</layout> </layout>
</item> </item>
<item>
<layout class="QHBoxLayout" name="layout_prefix">
<item>
<widget class="QLabel" name="label_prefix">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Prefix</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_prefix"/>
</item>
</layout>
</item>
<item> <item>
<layout class="QHBoxLayout" name="layout_active"> <layout class="QHBoxLayout" name="layout_active">
<item> <item>
+11 -18
View File
@@ -34,9 +34,9 @@ ExtUpgrade::ExtUpgrade(QWidget *_parent, const QString &_filePath)
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty()) if (!_filePath.isEmpty())
readConfiguration(); ExtUpgrade::readConfiguration();
ui->setupUi(this); ui->setupUi(this);
translate(); ExtUpgrade::translate();
m_values[tag("pkgcount")] = 0; m_values[tag("pkgcount")] = 0;
@@ -63,8 +63,7 @@ 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;
ExtUpgrade *item auto *item = new ExtUpgrade(dynamic_cast<QWidget *>(parent()), _fileName);
= new ExtUpgrade(static_cast<QWidget *>(parent()), _fileName);
copyDefaults(item); copyDefaults(item);
item->setExecutable(executable()); item->setExecutable(executable());
item->setFilter(filter()); item->setFilter(filter());
@@ -161,8 +160,7 @@ int ExtUpgrade::showConfiguration(const QVariant &_args)
ui->label_numberValue->setText(QString("%1").arg(number())); ui->label_numberValue->setText(QString("%1").arg(number()));
ui->lineEdit_command->setText(executable()); ui->lineEdit_command->setText(executable());
ui->lineEdit_filter->setText(filter()); ui->lineEdit_filter->setText(filter());
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_schedule->setText(cron());
ui->lineEdit_socket->setText(socket()); ui->lineEdit_socket->setText(socket());
@@ -207,9 +205,8 @@ void ExtUpgrade::writeConfiguration() const
void ExtUpgrade::startProcess() void ExtUpgrade::startProcess()
{ {
QString cmd = QString("sh -c \"%1\"").arg(executable()); qCInfo(LOG_LIB) << "Run cmd" << executable();
qCInfo(LOG_LIB) << "Run cmd" << cmd; m_process->start("sh", QStringList() << "-c" << executable());
m_process->start(cmd);
} }
@@ -218,16 +215,12 @@ void ExtUpgrade::updateValue()
qCInfo(LOG_LIB) << "Cmd returns" << m_process->exitCode(); qCInfo(LOG_LIB) << "Cmd returns" << m_process->exitCode();
qCInfo(LOG_LIB) << "Error" << m_process->readAllStandardError(); qCInfo(LOG_LIB) << "Error" << m_process->readAllStandardError();
QString qoutput = QTextCodec::codecForMib(106) QString qoutput
->toUnicode(m_process->readAllStandardOutput()) = QTextCodec::codecForMib(106)->toUnicode(m_process->readAllStandardOutput()).trimmed();
.trimmed(); m_values[tag("pkgcount")] = [this](const QString &output) {
m_values[tag("pkgcount")] = [this](QString output) {
return filter().isEmpty() return filter().isEmpty()
? output.split('\n', QString::SkipEmptyParts).count() ? output.split('\n', Qt::SkipEmptyParts).count() - null()
- null() : output.split('\n', Qt::SkipEmptyParts).filter(QRegExp(filter())).count();
: output.split('\n', QString::SkipEmptyParts)
.filter(QRegExp(filter()))
.count();
}(qoutput); }(qoutput);
emit(dataReceived(m_values)); emit(dataReceived(m_values));
+13 -14
View File
@@ -36,25 +36,24 @@ 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 = nullptr, const QString &_filePath = "");
const QString &_filePath = ""); ~ExtUpgrade() override;
virtual ~ExtUpgrade(); ExtUpgrade *copy(const QString &_fileName, int _number) override;
ExtUpgrade *copy(const QString &_fileName, const int _number);
// get methods // get methods
QString executable() const; [[nodiscard]] QString executable() const;
QString filter() const; [[nodiscard]] QString filter() const;
int null() const; [[nodiscard]] int null() const;
QString uniq() const; [[nodiscard]] QString uniq() const override;
// set methods // set methods
void setExecutable(const QString &_executable); void setExecutable(const QString &_executable);
void setFilter(const QString &_filter); void setFilter(const QString &_filter);
void setNull(const int _null); void setNull(int _null);
public slots: public slots:
void readConfiguration(); void readConfiguration() override;
QVariantHash run(); QVariantHash run() override;
int showConfiguration(const QVariant &_args); int showConfiguration(const QVariant &_args) override;
void writeConfiguration() const; void writeConfiguration() const override;
private slots: private slots:
void startProcess(); void startProcess();
@@ -63,7 +62,7 @@ private slots:
private: private:
QProcess *m_process = nullptr; QProcess *m_process = nullptr;
Ui::ExtUpgrade *ui = nullptr; Ui::ExtUpgrade *ui = nullptr;
void translate(); void translate() override;
// properties // properties
QString m_executable = "/usr/bin/true"; QString m_executable = "/usr/bin/true";
QString m_filter = ""; QString m_filter = "";

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