Compare commits

...

9 Commits

130 changed files with 1047 additions and 1078 deletions

View File

@ -1,12 +0,0 @@
FROM archlinux
RUN pacman -Sy
# toolchain
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
RUN pacman -S --noconfirm plasma-framework
# required by tests
RUN pacman -S --noconfirm xorg-server-xvfb

View File

@ -1,14 +0,0 @@
FROM ubuntu:focal
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update
# toolchain
RUN apt-get install -yq cmake extra-cmake-modules g++ git gettext
# kf5 and qt5 libraries
RUN apt-get install -yq libkf5i18n-dev libkf5notifications-dev libkf5service-dev \
libkf5windowsystem-dev libkf5plasma-dev qtbase5-dev qtdeclarative5-dev \
plasma-framework
# required by tests
RUN apt-get install -yq xvfb

View File

@ -1,14 +0,0 @@
#!/bin/bash
set -e
rm -rf build-arch
mkdir build-arch
# build
cd build-arch
cmake -DKDE_INSTALL_USE_QT_SYS_PATHS=ON -DCMAKE_BUILD_TYPE=Optimization -DCMAKE_INSTALL_PREFIX=/usr -DBUILD_FUTURE=ON -DBUILD_TESTING=ON ../sources
make
# tests
xvfb-run -a make test

View File

@ -1,15 +0,0 @@
#!/bin/bash
set -e
rm -rf build-ubuntu
mkdir build-ubuntu
# patches
git apply patches/qt5.14-splitbehavior-and-qset.patch
# build
cd build-ubuntu
cmake -DKDE_INSTALL_USE_QT_SYS_PATHS=ON -DCMAKE_BUILD_TYPE=Optimization -DCMAKE_INSTALL_PREFIX=/usr -DBUILD_FUTURE=ON -DBUILD_DEB_PACKAGE=ON ../sources
make package

View File

@ -1,17 +0,0 @@
#!/bin/bash
set -e
rm -rf build-ubuntu
mkdir build-ubuntu
# patches
git apply patches/qt5.14-splitbehavior-and-qset.patch
# build
cd build-ubuntu
cmake -DKDE_INSTALL_USE_QT_SYS_PATHS=ON -DCMAKE_BUILD_TYPE=Optimization -DCMAKE_INSTALL_PREFIX=/usr -DBUILD_FUTURE=ON -DBUILD_TESTING=ON ../sources
make
# tests
xvfb-run -a make test

41
.github/workflows/build.yml vendored Normal file
View File

@ -0,0 +1,41 @@
name: build & tests
on:
push:
branches: [ development, master ]
pull_request:
branches: [ development, master ]
env:
BUILD_TYPE: Release
jobs:
run-tests:
runs-on: ubuntu-latest
container:
image: archlinux:latest
volumes:
- ${{ github.workspace }}:/repo
options: -w /repo
steps:
- uses: actions/checkout@v3
- name: create build environment
run: pacman -Sy --noconfirm base-devel cmake extra-cmake-modules python util-linux-libs xorg-server-xvfb
- name: install dependencies
run: pacman -S --noconfirm plasma-workspace ksysguard
- name: configure cmake
run: cmake -B build -DKDE_INSTALL_USE_QT_SYS_PATHS=ON -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DBUILD_FUTURE=ON -DBUILD_TESTING=ON sources
- name: build
working-directory: /repo/build
run: make
- name: test
working-directory: /repo/build
run: xvfb-run -a make test

51
.github/workflows/release.yml vendored Normal file
View File

@ -0,0 +1,51 @@
name: release
on:
push:
tags:
- '*'
jobs:
make-release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: create changelog
id: changelog
uses: jaywcjlove/changelog-generator@main
with:
token: ${{ secrets.GITHUB_TOKEN }}
filter: 'Release \d+\.\d+\.\d+'
- name: create archive
run: bash create_archive.sh
env:
VERSION: ${{ steps.version.outputs.VERSION }}
- name: build debian package
run: |
sudo apt update && \
sudo apt install -yq cmake extra-cmake-modules g++ git gettext make && \
sudo apt install -yq libkf5i18n-dev libkf5notifications-dev libkf5service-dev \
libkf5windowsystem-dev libkf5plasma-dev qtbase5-dev qtdeclarative5-dev \
plasma-workspace-dev && \
cmake -B build-deb -DKDE_INSTALL_USE_QT_SYS_PATHS=ON -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Optimization -DBUILD_FUTURE=ON -DBUILD_DEB_PACKAGE=ON sources && \
cd build-deb && \
make package && \
cd ..
- name: release
uses: softprops/action-gh-release@v1
with:
body: |
${{ steps.changelog.outputs.compareurl }}
${{ steps.changelog.outputs.changelog }}
files: |
awesome-widgets-*-src.tar.xz
build-deb/plasma-widget-awesome-widgets-*.deb
fail_on_unmatched_files: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

3
.gitmodules vendored
View File

@ -1,3 +0,0 @@
[submodule "sources/3rdparty/fontdialog"]
path = sources/3rdparty/fontdialog
url = https://github.com/arcan1s/qtadds-fontdialog.git

View File

@ -1,14 +0,0 @@
sudo: required
language: generic
env:
- DOCKER_TAG_ARCH="arcan1s/awesome-widgets-arch"
services:
- docker
before_install:
- docker build --tag="${DOCKER_TAG_ARCH}" -f ".docker/Dockerfile-arch" ".docker"
script:
- docker run --rm -v "$(pwd):/opt/build" -w /opt/build "${DOCKER_TAG_ARCH}" sh -c ".docker/build-arch.sh"

View File

@ -1,3 +1,8 @@
Ver.3.5.0:
+ wayland support
* update code to latest standards
- drop support of windows preview
Ver.3.4.2: Ver.3.4.2:
+ Italian translation (#136, thanks to @avivace) + Italian translation (#136, thanks to @avivace)
+ stooq quotes support (default) (#131) + stooq quotes support (default) (#131)

View File

@ -1,7 +1,7 @@
awesome-widgets (ex-pytextmonitor) awesome-widgets (ex-pytextmonitor)
================================== ==================================
[![Build Status](https://travis-ci.org/arcan1s/awesome-widgets.svg?branch=development)](https://travis-ci.org/arcan1s/awesome-widgets) [![build & tests](https://github.com/arcan1s/awesome-widgets/actions/workflows/build.yml/badge.svg)](https://github.com/arcan1s/awesome-widgets/actions/workflows/build.yml)
[![Coverity Scan Build Status](https://scan.coverity.com/projects/8254/badge.svg)](https://scan.coverity.com/projects/awesome-widgets) [![Coverity Scan Build Status](https://scan.coverity.com/projects/8254/badge.svg)](https://scan.coverity.com/projects/awesome-widgets)
Information Information
@ -31,6 +31,7 @@ Dependencies
------------ ------------
* plasma-framework * plasma-framework
* ksysguard (since plasma 5.22)
Optional dependencies Optional dependencies
--------------------- ---------------------
@ -61,10 +62,6 @@ Installation
**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
====================== ======================

View File

@ -1,32 +1,20 @@
#!/bin/bash #!/bin/bash
SRCDIR="sources" SRCDIR="sources"
MAJOR=$(grep -m1 PROJECT_VERSION_MAJOR sources/CMakeLists.txt | awk '{print $2}' | sed 's/^.\(.*\)..$/\1/') VERSION="$(git describe --tags --abbrev=0)"
MINOR=$(grep -m1 PROJECT_VERSION_MINOR sources/CMakeLists.txt | awk '{print $2}' | sed 's/^.\(.*\)..$/\1/')
PATCH=$(grep -m1 PROJECT_VERSION_PATCH sources/CMakeLists.txt | awk '{print $2}' | sed 's/^.\(.*\)..$/\1/')
VERSION="${MAJOR}.${MINOR}.${PATCH}"
# update submodules
git submodule update --init --recursive
# build widget # build widget
ARCHIVE="awesome-widgets" ARCHIVE="awesome-widgets"
FILES="AUTHORS CHANGELOG COPYING packages patches" FILES="AUTHORS CHANGELOG COPYING packages patches sources"
IGNORELIST="build usr .kdev4 *.kdev4 .idea packages/*src.tar.xz" IGNORELIST="build usr .kdev4 *.kdev4 .idea packages/*src.tar.xz"
# create archive # create archive
[[ -e ${ARCHIVE}-${VERSION}-src.tar.xz ]] && rm -f "${ARCHIVE}-${VERSION}-src.tar.xz" [[ -e ${ARCHIVE}-${VERSION}-src.tar.xz ]] && rm -f "${ARCHIVE}-${VERSION}-src.tar.xz"
[[ -d ${ARCHIVE} ]] && rm -rf "${ARCHIVE}" [[ -d ${ARCHIVE} ]] && rm -rf "${ARCHIVE}"
cp -r "${SRCDIR}" "${ARCHIVE}" cp -r "${SRCDIR}" "${ARCHIVE}"
for FILE in ${FILES[*]}; do cp -r "$FILE" "${ARCHIVE}"; done for FILE in ${FILES[*]}; do cp -r "$FILE" "${ARCHIVE}"; done
for FILE in ${IGNORELIST[*]}; do rm -rf "${ARCHIVE}/${FILE}"; done for FILE in ${IGNORELIST[*]}; do rm -rf "${ARCHIVE}/${FILE}"; done
tar cJf "${ARCHIVE}-${VERSION}-src.tar.xz" "${ARCHIVE}"
ln -sf "../${ARCHIVE}-${VERSION}-src.tar.xz" packages
rm -rf "${ARCHIVE}"
# update md5sum tar cJf "${ARCHIVE}-${VERSION}-src.tar.xz" "${ARCHIVE}"
MD5SUMS=$(md5sum ${ARCHIVE}-${VERSION}-src.tar.xz | awk '{print $1}')
sed -i "/md5sums=('[0-9A-Fa-f]*/s/[^'][^)]*/md5sums=('${MD5SUMS}'/" packages/PKGBUILD rm -rf "${ARCHIVE}"
sed -i "s/pkgver=[0-9.]*/pkgver=${VERSION}/" packages/PKGBUILD
# clear
find . -type f -name '*src.tar.xz' -not -name "*${VERSION}-src.tar.xz" -exec rm -rf {} \;
find packages -type l -xtype l -exec rm -rf {} \;

View File

@ -8,7 +8,7 @@ pkgdesc="Collection of minimalistic Plasmoids which look like Awesome WM widgets
arch=('i686' 'x86_64') arch=('i686' 'x86_64')
url="https://arcanis.me/projects/awesome-widgets" url="https://arcanis.me/projects/awesome-widgets"
license=('GPL3') license=('GPL3')
depends=('plasma-framework') depends=('ksysguard' 'plasma-framework')
optdepends=("catalyst: for GPU monitor" optdepends=("catalyst: for GPU monitor"
"hddtemp: for HDD temperature monitor" "hddtemp: for HDD temperature monitor"
"smartmontools: for HDD temperature monitor" "smartmontools: for HDD temperature monitor"

View File

@ -1,11 +0,0 @@
cmake
extra-cmake-modules
g++
git
libkf5i18n-dev
libkf5notifications-dev
libkf5service-dev
libkf5windowsystem-dev
plasma-framework-dev
qtbase5-dev
qtdeclarative5-dev

View File

@ -1,255 +0,0 @@
diff --git a/sources/awdebug.cpp b/sources/awdebug.cpp
index 7135db6..a2870ec 100644
--- a/sources/awdebug.cpp
+++ b/sources/awdebug.cpp
@@ -67,7 +67,7 @@ QString AWDebug::getAboutText(const QString &_type)
translator = QString("<li>%1</li>").arg(translator);
text = i18n("Translators:") + "<ul>" + translatorList.join("") + "</ul>";
} else if (_type == "3rdparty") {
- QStringList trdPartyList = QString(TRDPARTY_LICENSE).split(';', Qt::SkipEmptyParts);
+ QStringList trdPartyList = QString(TRDPARTY_LICENSE).split(';', QString::SkipEmptyParts);
for (int i = 0; i < trdPartyList.count(); i++)
trdPartyList[i] = QString("<li><a href=\"%3\">%1</a> (%2 license)</li>")
.arg(trdPartyList.at(i).split(',')[0])
@@ -75,7 +75,7 @@ QString AWDebug::getAboutText(const QString &_type)
.arg(trdPartyList.at(i).split(',')[2]);
text = i18n("This software uses:") + "<ul>" + trdPartyList.join("") + "</ul>";
} else if (_type == "thanks") {
- QStringList thanks = QString(SPECIAL_THANKS).split(';', Qt::SkipEmptyParts);
+ QStringList thanks = QString(SPECIAL_THANKS).split(';', QString::SkipEmptyParts);
for (int i = 0; i < thanks.count(); i++)
thanks[i] = QString("<li><a href=\"%2\">%1</a></li>")
.arg(thanks.at(i).split(',')[0])
diff --git a/sources/awesome-widget/plugin/awabstractpairhelper.cpp b/sources/awesome-widget/plugin/awabstractpairhelper.cpp
index 55a4e91..f7c2969 100644
--- a/sources/awesome-widget/plugin/awabstractpairhelper.cpp
+++ b/sources/awesome-widget/plugin/awabstractpairhelper.cpp
@@ -61,7 +61,7 @@ QStringList AWAbstractPairHelper::values() const
QSet<QString> AWAbstractPairHelper::valuesSet() const
{
auto values = m_pairs.values();
- return QSet(values.cbegin(), values.cend());
+ return QSet<QString>::fromList(values);
}
@@ -138,4 +138,4 @@ bool AWAbstractPairHelper::removeUnusedKeys(const QStringList &_keys) const
settings.sync();
return (settings.status() == QSettings::NoError);
-}
\ No newline at end of file
+}
diff --git a/sources/awesome-widget/plugin/awkeycache.cpp b/sources/awesome-widget/plugin/awkeycache.cpp
index 15aab94..54b47b3 100644
--- a/sources/awesome-widget/plugin/awkeycache.cpp
+++ b/sources/awesome-widget/plugin/awkeycache.cpp
@@ -83,9 +83,9 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, const QStringL
<< _tooltip;
// initial copy
- QSet<QString> used(_keys.cbegin(), _keys.cend());
- used.unite(QSet(_bars.cbegin(), _bars.cend()));
- used.unite(QSet(_userKeys.cbegin(), _userKeys.cend()));
+ auto used = QSet<QString>::fromList(_keys);
+ used.unite(QSet<QString>::fromList(_bars));
+ used.unite(QSet<QString>::fromList(_userKeys));
// insert keys from tooltip
for (auto &key : _tooltip.keys()) {
if ((key.endsWith("Tooltip")) && (_tooltip[key].toBool())) {
diff --git a/sources/awesomewidgets/awjsonformatter.cpp b/sources/awesomewidgets/awjsonformatter.cpp
index bbdd7ce..8a1c5e0 100644
--- a/sources/awesomewidgets/awjsonformatter.cpp
+++ b/sources/awesomewidgets/awjsonformatter.cpp
@@ -178,7 +178,7 @@ QVariant AWJsonFormatter::getFromMap(const QVariant &_value, const QString &_key
void AWJsonFormatter::initPath()
{
m_splittedPath.clear();
- QStringList splittedByDot = m_path.split('.', Qt::SkipEmptyParts);
+ QStringList splittedByDot = m_path.split('.', QString::SkipEmptyParts);
for (auto &element : splittedByDot) {
bool ok;
diff --git a/sources/awesomewidgets/extscript.cpp b/sources/awesomewidgets/extscript.cpp
index 3017dac..da009f9 100644
--- a/sources/awesomewidgets/extscript.cpp
+++ b/sources/awesomewidgets/extscript.cpp
@@ -218,7 +218,7 @@ void ExtScript::readConfiguration()
setExecutable(settings.value("Exec", executable()).toString());
setStrRedirect(settings.value("X-AW-Redirect", strRedirect()).toString());
// api == 3
- setFilters(settings.value("X-AW-Filters", filters()).toString().split(',', Qt::SkipEmptyParts));
+ setFilters(settings.value("X-AW-Filters", filters()).toString().split(',', QString::SkipEmptyParts));
settings.endGroup();
bumpApi(AW_EXTSCRIPT_API);
diff --git a/sources/awesomewidgets/extupgrade.cpp b/sources/awesomewidgets/extupgrade.cpp
index 0195779..0081cc9 100644
--- a/sources/awesomewidgets/extupgrade.cpp
+++ b/sources/awesomewidgets/extupgrade.cpp
@@ -219,8 +219,8 @@ void ExtUpgrade::updateValue()
= QTextCodec::codecForMib(106)->toUnicode(m_process->readAllStandardOutput()).trimmed();
m_values[tag("pkgcount")] = [this](const QString &output) {
return filter().isEmpty()
- ? output.split('\n', Qt::SkipEmptyParts).count() - null()
- : output.split('\n', Qt::SkipEmptyParts).filter(QRegExp(filter())).count();
+ ? output.split('\n', QString::SkipEmptyParts).count() - null()
+ : output.split('\n', QString::SkipEmptyParts).filter(QRegExp(filter())).count();
}(qoutput);
emit(dataReceived(m_values));
diff --git a/sources/awesomewidgets/qcronscheduler.cpp b/sources/awesomewidgets/qcronscheduler.cpp
index 6f67590..c72abc9 100644
--- a/sources/awesomewidgets/qcronscheduler.cpp
+++ b/sources/awesomewidgets/qcronscheduler.cpp
@@ -87,7 +87,7 @@ QList<int> QCronScheduler::parseField(const QString &_value, const int _min, con
parsedField.fromRange(field.split('/').first(), _min, _max);
if (field.contains('/')) {
bool status;
- parsedField.div = field.split('/', Qt::SkipEmptyParts).at(1).toInt(&status);
+ parsedField.div = field.split('/', QString::SkipEmptyParts).at(1).toInt(&status);
if (!status)
parsedField.div = 1;
}
@@ -107,7 +107,7 @@ void QCronScheduler::QCronField::fromRange(const QString &_range, const int _min
minValue = _min;
maxValue = _max;
} else if (_range.contains("-")) {
- auto interval = _range.split('-', Qt::SkipEmptyParts);
+ auto interval = _range.split('-', QString::SkipEmptyParts);
if (interval.count() != 2)
return;
bool status;
diff --git a/sources/extsysmon/extsysmon.cpp b/sources/extsysmon/extsysmon.cpp
index 88b6e39..5bdc7f3 100644
--- a/sources/extsysmon/extsysmon.cpp
+++ b/sources/extsysmon/extsysmon.cpp
@@ -126,7 +126,7 @@ QHash<QString, QString> ExtendedSysMon::updateConfiguration(QHash<QString, QStri
} else if (_rawConfig["HDDDEV"] == "disable") {
_rawConfig["HDDDEV"] = "";
} else {
- QStringList deviceList = _rawConfig["HDDDEV"].split(',', Qt::SkipEmptyParts);
+ QStringList deviceList = _rawConfig["HDDDEV"].split(',', QString::SkipEmptyParts);
QStringList devices;
QRegExp diskRegexp = QRegExp("^/dev/[hms]d[a-z]$");
for (auto &device : deviceList)
diff --git a/sources/extsysmonsources/gpuloadsource.cpp b/sources/extsysmonsources/gpuloadsource.cpp
index 6281637..e81be26 100644
--- a/sources/extsysmonsources/gpuloadsource.cpp
+++ b/sources/extsysmonsources/gpuloadsource.cpp
@@ -132,7 +132,7 @@ void GPULoadSource::updateValue()
qCInfo(LOG_ESS) << "Output" << qoutput;
if (m_device == "nvidia") {
- for (auto &str : qoutput.split('\n', Qt::SkipEmptyParts)) {
+ for (auto &str : qoutput.split('\n', QString::SkipEmptyParts)) {
if (!str.contains("<gpu_util>"))
continue;
auto load = str.remove("<gpu_util>").remove("</gpu_util>").remove('%');
@@ -140,10 +140,10 @@ void GPULoadSource::updateValue()
break;
}
} else if (m_device == "ati") {
- for (auto &str : qoutput.split('\n', Qt::SkipEmptyParts)) {
+ for (auto &str : qoutput.split('\n', QString::SkipEmptyParts)) {
if (!str.contains("load"))
continue;
- QString load = str.split(' ', Qt::SkipEmptyParts)[3].remove('%');
+ QString load = str.split(' ', QString::SkipEmptyParts)[3].remove('%');
m_values["gpu/load"] = load.toFloat();
break;
}
diff --git a/sources/extsysmonsources/gputempsource.cpp b/sources/extsysmonsources/gputempsource.cpp
index 55fbadc..dce0c6e 100644
--- a/sources/extsysmonsources/gputempsource.cpp
+++ b/sources/extsysmonsources/gputempsource.cpp
@@ -112,7 +112,7 @@ void GPUTemperatureSource::updateValue()
qCInfo(LOG_ESS) << "Output" << qoutput;
if (m_device == "nvidia") {
- for (auto &str : qoutput.split('\n', Qt::SkipEmptyParts)) {
+ for (auto &str : qoutput.split('\n', QString::SkipEmptyParts)) {
if (!str.contains("<gpu_temp>"))
continue;
QString temp = str.remove("<gpu_temp>").remove("C</gpu_temp>");
@@ -120,10 +120,10 @@ void GPUTemperatureSource::updateValue()
break;
}
} else if (m_device == "ati") {
- for (auto &str : qoutput.split('\n', Qt::SkipEmptyParts)) {
+ for (auto &str : qoutput.split('\n', QString::SkipEmptyParts)) {
if (!str.contains("Temperature"))
continue;
- QString temp = str.split(' ', Qt::SkipEmptyParts).at(4);
+ QString temp = str.split(' ', QString::SkipEmptyParts).at(4);
m_values["gpu/temperature"] = temp.toFloat();
break;
}
diff --git a/sources/extsysmonsources/hddtempsource.cpp b/sources/extsysmonsources/hddtempsource.cpp
index efaae08..dad47a3 100644
--- a/sources/extsysmonsources/hddtempsource.cpp
+++ b/sources/extsysmonsources/hddtempsource.cpp
@@ -31,7 +31,7 @@ HDDTemperatureSource::HDDTemperatureSource(QObject *_parent, const QStringList &
Q_ASSERT(_args.count() == 2);
qCDebug(LOG_ESS) << __PRETTY_FUNCTION__;
- m_devices = _args.at(0).split(',', Qt::SkipEmptyParts);
+ m_devices = _args.at(0).split(',', QString::SkipEmptyParts);
m_cmd = _args.at(1).split(' '); // lets hope no one put cmd with spaces here lol
m_smartctl = m_cmd.contains("smartctl");
@@ -131,17 +131,17 @@ void HDDTemperatureSource::updateValue(const QString &_device)
// parse
if (m_smartctl) {
- QStringList lines = qoutput.split('\n', Qt::SkipEmptyParts);
+ QStringList lines = qoutput.split('\n', QString::SkipEmptyParts);
for (auto &str : lines) {
if (!str.startsWith("194"))
continue;
- if (str.split(' ', Qt::SkipEmptyParts).count() < 9)
+ if (str.split(' ', QString::SkipEmptyParts).count() < 9)
continue;
- m_values[_device] = str.split(' ', Qt::SkipEmptyParts).at(9).toFloat();
+ m_values[_device] = str.split(' ', QString::SkipEmptyParts).at(9).toFloat();
break;
}
} else {
- QStringList lines = qoutput.split(':', Qt::SkipEmptyParts);
+ QStringList lines = qoutput.split(':', QString::SkipEmptyParts);
if (lines.count() >= 3) {
QString temp = lines.at(2);
temp.remove(QChar(0260)).remove('C');
diff --git a/sources/extsysmonsources/playersource.cpp b/sources/extsysmonsources/playersource.cpp
index aaca22f..e127a05 100644
--- a/sources/extsysmonsources/playersource.cpp
+++ b/sources/extsysmonsources/playersource.cpp
@@ -256,11 +256,11 @@ void PlayerSource::mpdSocketReadyRead()
qCInfo(LOG_ESS) << "Output" << qoutput;
// parse
- for (auto &str : qoutput.split('\n', Qt::SkipEmptyParts)) {
- if (str.split(": ", Qt::SkipEmptyParts).count() == 2) {
+ for (auto &str : qoutput.split('\n', QString::SkipEmptyParts)) {
+ if (str.split(": ", QString::SkipEmptyParts).count() == 2) {
// "Metadata: data"
- QString metadata = str.split(": ", Qt::SkipEmptyParts).first().toLower();
- QString data = str.split(": ", Qt::SkipEmptyParts).last().trimmed();
+ QString metadata = str.split(": ", QString::SkipEmptyParts).first().toLower();
+ QString data = str.split(": ", QString::SkipEmptyParts).last().trimmed();
// there are one more time...
if ((metadata == "time") && (data.contains(':'))) {
QStringList times = data.split(':');
diff --git a/sources/test/testawtelemetryhandler.cpp b/sources/test/testawtelemetryhandler.cpp
index ffb0e79..b4181e0 100644
--- a/sources/test/testawtelemetryhandler.cpp
+++ b/sources/test/testawtelemetryhandler.cpp
@@ -51,7 +51,7 @@ void TestAWTelemetryHandler::test_get()
QStringList output = plugin->get(telemetryGroup);
QVERIFY(!output.isEmpty());
- QCOMPARE(QSet<QString>(output.cbegin(), output.cend()).count(), output.count());
+ QCOMPARE(QSet<QString>::fromList(output).count(), output.count());
QVERIFY(output.contains(telemetryData));
}

View File

@ -2,11 +2,11 @@
Language: Cpp Language: Cpp
AccessModifierOffset: -4 AccessModifierOffset: -4
AlignAfterOpenBracket: Align AlignAfterOpenBracket: Align
AlignConsecutiveAssignments: false AlignConsecutiveAssignments: None
AlignOperands: true AlignOperands: true
AlignTrailingComments: true AlignTrailingComments: true
AllowAllParametersOfDeclarationOnNextLine: true AllowAllParametersOfDeclarationOnNextLine: true
AllowShortBlocksOnASingleLine: false AllowShortBlocksOnASingleLine: Never
AllowShortCaseLabelsOnASingleLine: false AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: Inline AllowShortFunctionsOnASingleLine: Inline
AllowShortIfStatementsOnASingleLine: Never AllowShortIfStatementsOnASingleLine: Never
@ -20,7 +20,7 @@ BreakBeforeBinaryOperators: All
BreakBeforeBraces: Linux BreakBeforeBraces: Linux
BreakBeforeTernaryOperators: true BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: true BreakConstructorInitializersBeforeComma: true
ColumnLimit: 100 ColumnLimit: 120
CommentPragmas: '^ IWYU pragma:' CommentPragmas: '^ IWYU pragma:'
ConstructorInitializerAllOnOneLineOrOnePerLine: false ConstructorInitializerAllOnOneLineOrOnePerLine: false
ConstructorInitializerIndentWidth: 4 ConstructorInitializerIndentWidth: 4
@ -58,7 +58,7 @@ SpacesInContainerLiterals: true
SpacesInCStyleCastParentheses: false SpacesInCStyleCastParentheses: false
SpacesInParentheses: false SpacesInParentheses: false
SpacesInSquareBrackets: false SpacesInSquareBrackets: false
Standard: Cpp11 Standard: Latest
TabWidth: 8 TabWidth: 8
UseTab: Never UseTab: Never
... ...

@ -1 +0,0 @@
Subproject commit e7bcf8ee858e7be3012168e12c7b14ccc28535b4

165
sources/3rdparty/fontdialog/COPYING vendored Normal file
View File

@ -0,0 +1,165 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.
0. Additional Definitions.
As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU
General Public License.
"The Library" refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below.
An "Application" is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.
A "Combined Work" is a work produced by combining or linking an
Application with the Library. The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".
The "Minimal Corresponding Source" for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.
The "Corresponding Application Code" for a Combined Work means the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.
1. Exception to Section 3 of the GNU GPL.
You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.
2. Conveying Modified Versions.
If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:
a) under this License, provided that you make a good faith effort to
ensure that, in the event an Application does not supply the
function or data, the facility still operates, and performs
whatever part of its purpose remains meaningful, or
b) under the GNU GPL, with none of the additional permissions of
this License applicable to that copy.
3. Object Code Incorporating Material from Library Header Files.
The object code form of an Application may incorporate material from
a header file that is part of the Library. You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:
a) Give prominent notice with each copy of the object code that the
Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the object code with a copy of the GNU GPL and this license
document.
4. Combined Works.
You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:
a) Give prominent notice with each copy of the Combined Work that
the Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the Combined Work with a copy of the GNU GPL and this license
document.
c) For a Combined Work that displays copyright notices during
execution, include the copyright notice for the Library among
these notices, as well as a reference directing the user to the
copies of the GNU GPL and this license document.
d) Do one of the following:
0) Convey the Minimal Corresponding Source under the terms of this
License, and the Corresponding Application Code in a form
suitable for, and under terms that permit, the user to
recombine or relink the Application with a modified version of
the Linked Version to produce a modified Combined Work, in the
manner specified by section 6 of the GNU GPL for conveying
Corresponding Source.
1) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (a) uses at run time
a copy of the Library already present on the user's computer
system, and (b) will operate properly with a modified version
of the Library that is interface-compatible with the Linked
Version.
e) Provide Installation Information, but only if you would otherwise
be required to provide such information under section 6 of the
GNU GPL, and only to the extent that such information is
necessary to install and execute a modified version of the
Combined Work produced by recombining or relinking the
Application with a modified version of the Linked Version. (If
you use option 4d0, the Installation Information must accompany
the Minimal Corresponding Source and Corresponding Application
Code. If you use option 4d1, you must provide the Installation
Information in the manner specified by section 6 of the GNU GPL
for conveying Corresponding Source.)
5. Combined Libraries.
You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:
a) Accompany the combined library with a copy of the same work based
on the Library, uncombined with any other library facilities,
conveyed under the terms of this License.
b) Give prominent notice with the combined library that part of it
is a work based on the Library, and explaining where to find the
accompanying uncombined form of the same work.
6. Revised Versions of the GNU Lesser General Public License.
The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.
If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.

4
sources/3rdparty/fontdialog/README.md vendored Normal file
View File

@ -0,0 +1,4 @@
qtadds-fontdialog
=================
Font dialog which provides a font color settings

View File

@ -0,0 +1,215 @@
/***************************************************************************
* Copyright (C) 2014 Evgeniy Alekseev *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Lesser General Public *
* License as published by the Free Software Foundation; either *
* version 3.0 of the License, or (at your option) any later version. *
* *
* This library is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
* Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public *
* License along with this library. *
***************************************************************************/
#include "fontdialog.h"
#include <QGridLayout>
CFont::CFont(const QString family, int pointSize, int weight, bool italic, QColor color)
: QFont(family, pointSize, weight, italic)
{
setCurrentColor(color);
}
QColor CFont::color()
{
return currentColor;
}
void CFont::setCurrentColor(const QColor color)
{
currentColor = color;
}
int CFont::html2QFont(const int htmlWeight)
{
int weight = 16;
switch(htmlWeight) {
case 100:
weight = 16;
break;
case 200:
case 300:
weight = 25;
break;
case 400:
weight = 50;
break;
case 500:
case 600:
weight = 63;
break;
case 700:
case 800:
weight = 75;
break;
case 900:
weight = 87;
break;
default:
break;
}
return weight;
}
int CFont::qFont2html(const int weight)
{
int htmlWeight = 400;
switch(weight) {
case 16:
htmlWeight = 100;
break;
case 25:
htmlWeight = 300;
break;
case 50:
htmlWeight = 400;
break;
case 63:
htmlWeight = 600;
break;
case 75:
htmlWeight = 800;
break;
case 87:
htmlWeight = 900;
break;
default:
break;
}
return htmlWeight;
}
int CFont::htmlWeight()
{
return CFont::qFont2html(weight());
}
void CFont::setHtmlWeight(const int htmlWeight)
{
setWeight(CFont::html2QFont(htmlWeight));
}
CFont CFont::fromQFont(const QFont font, const QColor color)
{
return CFont(font.family(), font.pointSize(), font.weight(), font.italic(), color);
}
QFont CFont::toQFont()
{
return QFont(family(), pointSize(), weight(), italic());
}
CFontDialog::CFontDialog(QWidget *parent, bool needWeight, bool needItalic)
: QDialog(parent)
{
QGridLayout *mainGrid = new QGridLayout(this);
setLayout(mainGrid);
colorBox = new QComboBox(this);
connect(colorBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(updateColor(QString)));
QStringList colorNames = QColor::colorNames();
int index = 0;
for (int i=0; i<colorNames.count(); i++) {
QColor color(colorNames[i]);
colorBox->addItem(colorNames[i], color);
QModelIndex idx = colorBox->model()->index(index++, 0);
colorBox->model()->setData(idx, color, Qt::BackgroundRole);
}
mainGrid->addWidget(colorBox, 0, 0);
fontBox = new QFontComboBox(this);
mainGrid->addWidget(fontBox, 0, 1);
sizeBox = new QSpinBox(this);
mainGrid->addWidget(sizeBox, 0, 2);
weightBox = new QSpinBox(this);
mainGrid->addWidget(weightBox, 0, 3);
italicBox = new QComboBox(this);
italicBox->addItem(tr("normal"));
italicBox->addItem(tr("italic"));
mainGrid->addWidget(italicBox, 0, 4);
buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel,
Qt::Horizontal, this);
QObject::connect(buttons, SIGNAL(accepted()), this, SLOT(accept()));
QObject::connect(buttons, SIGNAL(rejected()), this, SLOT(reject()));
mainGrid->addWidget(buttons, 1, 0, 1, 5);
italicBox->setHidden(!needItalic);
weightBox->setHidden(!needWeight);
}
CFontDialog::~CFontDialog()
{
delete colorBox;
delete buttons;
delete fontBox;
delete italicBox;
delete sizeBox;
delete weightBox;
}
void CFontDialog::updateColor(const QString color)
{
colorBox->setStyleSheet(QString("background:%1").arg(QColor(color).name()));
}
CFont CFontDialog::getFont(const QString title, CFont defaultFont, bool needWeight, bool needItalic, int *status)
{
CFontDialog dlg(0, needWeight, needItalic);
dlg.setWindowTitle(title);
QStringList colorNames = QColor::colorNames();
for (int i=0; i<colorNames.count(); i++)
if (QColor(colorNames[i]) == defaultFont.color()) {
dlg.colorBox->setCurrentIndex(i);
break;
}
dlg.fontBox->setCurrentFont(defaultFont);
dlg.sizeBox->setValue(defaultFont.pointSize());
dlg.weightBox->setValue(defaultFont.weight());
if (defaultFont.italic())
dlg.italicBox->setCurrentIndex(1);
else
dlg.italicBox->setCurrentIndex(0);
CFont font = CFont(defaultFont);
int ret = dlg.exec();
if (ret == 1)
font = CFont(dlg.fontBox->currentFont().family(),
dlg.sizeBox->value(),
dlg.weightBox->value(),
dlg.italicBox->currentIndex() == 1,
QColor(dlg.colorBox->currentText()));
if (status != nullptr)
*status = ret;
return font;
}

View File

@ -0,0 +1,82 @@
/***************************************************************************
* Copyright (C) 2014 Evgeniy Alekseev *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Lesser General Public *
* License as published by the Free Software Foundation; either *
* version 3.0 of the License, or (at your option) any later version. *
* *
* This library is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
* Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public *
* License along with this library. *
***************************************************************************/
#ifndef FONTDIALOG_H
#define FONTDIALOG_H
#include <QComboBox>
#include <QDialog>
#include <QDialogButtonBox>
#include <QFontComboBox>
#include <QSpinBox>
class CFont : public QFont
{
public:
explicit CFont(const QString family, int pointSize = -1,
int weight = -1, bool italic = false,
QColor color = QColor(QString("#000000")));
// color properties
QColor color();
void setCurrentColor(const QColor color);
// html weight properties
static int html2QFont(const int htmlWeight);
static int qFont2html(const int weight);
int htmlWeight();
void setHtmlWeight(const int htmlWeight);
// conversion to QFont
static CFont fromQFont(const QFont font,
const QColor color = QColor(QString("#000000")));
QFont toQFont();
private:
QColor currentColor;
};
class CFontDialog : public QDialog
{
Q_OBJECT
public:
explicit CFontDialog(QWidget *parent = 0,
const bool needWeight = true,
const bool needItalic = true);
~CFontDialog();
static CFont getFont(const QString title = tr("Select font"),
CFont defaultFont = CFont(QString("Arial"),
12, 400, false,
QColor(QString("#000000"))),
const bool needWeight = true,
const bool needItalic = true,
int *status = nullptr);
private slots:
void updateColor(const QString color);
private:
QComboBox *colorBox;
QDialogButtonBox *buttons;
QFontComboBox *fontBox;
QComboBox *italicBox;
QSpinBox *sizeBox;
QSpinBox *weightBox;
};
#endif /* FONTDIALOG_H */

View File

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 2.8.12) cmake_minimum_required(VERSION 3.16.0)
# some fucking magic # some fucking magic
cmake_policy(SET CMP0011 NEW) cmake_policy(SET CMP0011 NEW)
@ -15,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 "4") set(PROJECT_VERSION_MINOR "5")
set(PROJECT_VERSION_PATCH "3") set(PROJECT_VERSION_PATCH "0")
set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}") set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}")
# append git version if any # append git version if any
set(PROJECT_COMMIT_SHA "Commit hash" CACHE INTERNAL "") set(PROJECT_COMMIT_SHA "Commit hash" CACHE INTERNAL "")

View File

@ -41,25 +41,15 @@ QString AWDebug::getAboutText(const QString &_type)
} else if (_type == "description") { } else if (_type == "description") {
text = i18n("A set of minimalistic plasmoid widgets"); text = i18n("A set of minimalistic plasmoid widgets");
} else if (_type == "links") { } else if (_type == "links") {
text = i18n("Links:") + "<ul>" text = i18n("Links:") + "<ul>" + QString("<li><a href=\"%1\">%2</a></li>").arg(HOMEPAGE).arg(i18n("Homepage"))
+ QString("<li><a href=\"%1\">%2</a></li>").arg(HOMEPAGE).arg(i18n("Homepage"))
+ QString("<li><a href=\"%1\">%2</a></li>").arg(REPOSITORY).arg(i18n("Repository")) + QString("<li><a href=\"%1\">%2</a></li>").arg(REPOSITORY).arg(i18n("Repository"))
+ QString("<li><a href=\"%1\">%2</a></li>").arg(BUGTRACKER).arg(i18n("Bugtracker")) + QString("<li><a href=\"%1\">%2</a></li>").arg(BUGTRACKER).arg(i18n("Bugtracker"))
+ QString("<li><a href=\"%1\">%2</a></li>") + QString("<li><a href=\"%1\">%2</a></li>").arg(TRANSLATION).arg(i18n("Translation issue"))
.arg(TRANSLATION) + QString("<li><a href=\"%1\">%2</a></li>").arg(AUR_PACKAGES).arg(i18n("AUR packages"))
.arg(i18n("Translation issue")) + QString("<li><a href=\"%1\">%2</a></li>").arg(OPENSUSE_PACKAGES).arg(i18n("openSUSE packages"))
+ QString("<li><a href=\"%1\">%2</a></li>")
.arg(AUR_PACKAGES)
.arg(i18n("AUR packages"))
+ QString("<li><a href=\"%1\">%2</a></li>")
.arg(OPENSUSE_PACKAGES)
.arg(i18n("openSUSE packages"))
+ "</ul>"; + "</ul>";
} else if (_type == "copy") { } else if (_type == "copy") {
text = QString("<small>&copy; %1 <a href=\"mailto:%2\">%3</a><br>") text = QString("<small>&copy; %1 <a href=\"mailto:%2\">%3</a><br>").arg(DATE).arg(EMAIL).arg(AUTHOR)
.arg(DATE)
.arg(EMAIL)
.arg(AUTHOR)
+ i18nc("This software is licensed under %1", LICENSE) + "</small>"; + i18nc("This software is licensed under %1", LICENSE) + "</small>";
} else if (_type == "translators") { } else if (_type == "translators") {
QStringList translatorList = QString(TRANSLATORS).split(','); QStringList translatorList = QString(TRANSLATORS).split(',');
@ -114,8 +104,7 @@ QStringList AWDebug::getBuildData()
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_DEBUG: %1").arg(CMAKE_CXX_FLAGS_DEBUG));
metadata.append(QString(" CMAKE_CXX_FLAGS_RELEASE: %1").arg(CMAKE_CXX_FLAGS_RELEASE)); metadata.append(QString(" CMAKE_CXX_FLAGS_RELEASE: %1").arg(CMAKE_CXX_FLAGS_RELEASE));
metadata.append( metadata.append(QString(" CMAKE_CXX_FLAGS_OPTIMIZATION: %1").arg(CMAKE_CXX_FLAGS_OPTIMIZATION));
QString(" CMAKE_CXX_FLAGS_OPTIMIZATION: %1").arg(CMAKE_CXX_FLAGS_OPTIMIZATION));
metadata.append(QString(" CMAKE_DEFINITIONS: %1").arg(CMAKE_DEFINITIONS)); metadata.append(QString(" CMAKE_DEFINITIONS: %1").arg(CMAKE_DEFINITIONS));
metadata.append(QString(" CMAKE_INSTALL_PREFIX: %1").arg(CMAKE_INSTALL_PREFIX)); 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_MODULE_LINKER_FLAGS: %1").arg(CMAKE_MODULE_LINKER_FLAGS));

View File

@ -22,6 +22,5 @@ X-KDE-PluginInfo-Name=org.kde.plasma.awesomewidget
X-KDE-PluginInfo-Version=@PROJECT_VERSION@ X-KDE-PluginInfo-Version=@PROJECT_VERSION@
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-License=GPLv3 X-KDE-PluginInfo-License=GPLv3
X-KDE-PluginInfo-EnabledByDefault=true X-KDE-PluginInfo-EnabledByDefault=true

View File

@ -19,9 +19,8 @@ X-Plasma-MainScript=ui/main.qml
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.4.3 X-KDE-PluginInfo-Version=3.5.0
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-License=GPLv3 X-KDE-PluginInfo-License=GPLv3
X-KDE-PluginInfo-EnabledByDefault=true X-KDE-PluginInfo-EnabledByDefault=true

View File

@ -107,8 +107,7 @@ void AWAbstractPairConfig::updateUi()
void AWAbstractPairConfig::addSelector(const QStringList &_keys, const QStringList &_values, void AWAbstractPairConfig::addSelector(const QStringList &_keys, 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;
auto *selector = new AWAbstractSelector(ui->scrollAreaWidgetContents, m_editable); auto *selector = new AWAbstractSelector(ui->scrollAreaWidgetContents, m_editable);
selector->init(_keys, _values, _current); selector->init(_keys, _values, _current);

View File

@ -35,8 +35,7 @@ class AWAbstractPairConfig : public QDialog
Q_OBJECT Q_OBJECT
public: public:
explicit AWAbstractPairConfig(QWidget *_parent = nullptr, bool _hasEdit = false, explicit AWAbstractPairConfig(QWidget *_parent = nullptr, bool _hasEdit = false, QStringList _keys = QStringList());
QStringList _keys = QStringList());
~AWAbstractPairConfig() override; ~AWAbstractPairConfig() override;
template <class T> void initHelper() template <class T> void initHelper()
{ {
@ -62,8 +61,7 @@ private:
bool m_hasEdit = false; bool m_hasEdit = false;
QStringList m_keys; QStringList m_keys;
// methods // methods
void addSelector(const QStringList &_keys, const QStringList &_values, void addSelector(const QStringList &_keys, const QStringList &_values, const QPair<QString, QString> &_current);
const QPair<QString, QString> &_current);
void clearSelectors(); void clearSelectors();
void execDialog(); void execDialog();
[[nodiscard]] QPair<QStringList, QStringList> initKeys() const; [[nodiscard]] QPair<QStringList, QStringList> initKeys() const;

View File

@ -61,7 +61,7 @@ QStringList AWAbstractPairHelper::values() const
QSet<QString> AWAbstractPairHelper::valuesSet() const QSet<QString> AWAbstractPairHelper::valuesSet() const
{ {
auto values = m_pairs.values(); auto values = m_pairs.values();
return QSet(values.cbegin(), values.cend()); return {values.cbegin(), values.cend()};
} }
@ -69,8 +69,7 @@ void AWAbstractPairHelper::initItems()
{ {
m_pairs.clear(); m_pairs.clear();
QStringList configs QStringList configs = QStandardPaths::locateAll(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);
@ -80,8 +79,7 @@ void AWAbstractPairHelper::initItems()
QStringList keys = settings.childKeys(); QStringList keys = settings.childKeys();
for (auto &key : keys) { for (auto &key : keys) {
QString value = settings.value(key).toString(); QString value = settings.value(key).toString();
qCInfo(LOG_AW) << "Found key" << key << "for value" << value << "in" qCInfo(LOG_AW) << "Found key" << key << "for value" << value << "in" << settings.fileName();
<< settings.fileName();
if (value.isEmpty()) { if (value.isEmpty()) {
qCInfo(LOG_AW) << "Skip empty value for" << key; qCInfo(LOG_AW) << "Skip empty value for" << key;
continue; continue;
@ -98,9 +96,7 @@ bool AWAbstractPairHelper::writeItems(const QHash<QString, QString> &_configurat
qCDebug(LOG_AW) << "Write configuration" << _configuration; qCDebug(LOG_AW) << "Write configuration" << _configuration;
QString fileName QString fileName
= QString("%1/%2") = QString("%1/%2").arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)).arg(m_filePath);
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation))
.arg(m_filePath);
QSettings settings(fileName, QSettings::IniFormat); QSettings settings(fileName, QSettings::IniFormat);
qCInfo(LOG_AW) << "Configuration file" << fileName; qCInfo(LOG_AW) << "Configuration file" << fileName;
@ -120,9 +116,7 @@ bool AWAbstractPairHelper::removeUnusedKeys(const QStringList &_keys) const
qCDebug(LOG_AW) << "Remove keys" << _keys; qCDebug(LOG_AW) << "Remove keys" << _keys;
QString fileName QString fileName
= QString("%1/%2") = QString("%1/%2").arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)).arg(m_filePath);
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation))
.arg(m_filePath);
QSettings settings(fileName, QSettings::IniFormat); QSettings settings(fileName, QSettings::IniFormat);
qCInfo(LOG_AW) << "Configuration file" << fileName; qCInfo(LOG_AW) << "Configuration file" << fileName;

View File

@ -60,8 +60,8 @@ void AWAbstractSelector::init(const QStringList &_keys, const QStringList &_valu
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" << _values qCDebug(LOG_AW) << "Init selector with keys" << _keys << "and values" << _values << "and current ones are"
<< "and current ones are" << _current; << _current;
// set data // set data
ui->comboBox_key->clear(); ui->comboBox_key->clear();

View File

@ -32,12 +32,10 @@ class AWAbstractSelector : public QWidget
Q_OBJECT Q_OBJECT
public: public:
explicit AWAbstractSelector(QWidget *_parent = nullptr, explicit AWAbstractSelector(QWidget *_parent = nullptr, const QPair<bool, bool> &_editable = {false, false});
const QPair<bool, bool> &_editable = {false, false});
~AWAbstractSelector() override; ~AWAbstractSelector() override;
[[nodiscard]] QPair<QString, QString> current() const; [[nodiscard]] QPair<QString, QString> current() const;
void init(const QStringList &_keys, const QStringList &_values, void init(const QStringList &_keys, const QStringList &_values, const QPair<QString, QString> &_current);
const QPair<QString, QString> &_current);
signals: signals:
void selectionChanged(); void selectionChanged();

View File

@ -124,8 +124,8 @@ QVariantMap AWActions::getFont(const QVariantMap &_defaultFont)
QVariantMap fontMap; QVariantMap fontMap;
int ret = 0; int ret = 0;
CFont defaultCFont = CFont(_defaultFont["family"].toString(), _defaultFont["size"].toInt(), 400, CFont defaultCFont = CFont(_defaultFont["family"].toString(), _defaultFont["size"].toInt(), 400, false,
false, _defaultFont["color"].toString()); _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;

View File

@ -44,13 +44,12 @@ AWBugReporter::~AWBugReporter()
void AWBugReporter::doConnect() 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(int, const QString &)));
SLOT(showInformation(int, const QString &)));
} }
QString AWBugReporter::generateText(const QString &_description, const QString &_reproduce, QString AWBugReporter::generateText(const QString &_description, const QString &_reproduce, const QString &_expected,
const QString &_expected, const QString &_logs) const QString &_logs)
{ {
// 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 << "steps" << _reproduce qCDebug(LOG_AW) << "Generate text with description" << _description << "steps" << _reproduce
@ -73,8 +72,7 @@ void AWBugReporter::sendBugReport(const QString &_title, const QString &_body)
qCDebug(LOG_AW) << "Send bug report with title" << _title << "and body" << _body; qCDebug(LOG_AW) << "Send bug report with title" << _title << "and body" << _body;
auto *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 *)));
QNetworkRequest request = QNetworkRequest(QUrl(BUGTRACKER_API)); QNetworkRequest request = QNetworkRequest(QUrl(BUGTRACKER_API));
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
@ -95,8 +93,7 @@ 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() << "with message" qCWarning(LOG_AW) << "An error occurs" << _reply->error() << "with message" << _reply->errorString();
<< _reply->errorString();
return emit(replyReceived(0, "")); return emit(replyReceived(0, ""));
} }

View File

@ -38,7 +38,7 @@ public:
Q_INVOKABLE void sendBugReport(const QString &_title, const QString &_body); Q_INVOKABLE void sendBugReport(const QString &_title, const QString &_body);
signals: signals:
void replyReceived(const int _number, const QString &_url); void replyReceived(int _number, const QString &_url);
private slots: private slots:
void issueReplyRecieved(QNetworkReply *_reply); void issueReplyRecieved(QNetworkReply *_reply);

View File

@ -31,8 +31,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(QStandardPaths::GenericDataLocation));
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation));
} }
@ -45,9 +44,8 @@ AWConfigHelper::~AWConfigHelper()
QString AWConfigHelper::configurationDirectory() QString AWConfigHelper::configurationDirectory()
{ {
// get readable directory // get readable directory
QString localDir QString localDir = QString("%1/awesomewidgets/configs")
= QString("%1/awesomewidgets/configs") .arg(QStandardPaths::writableLocation(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;
@ -63,8 +61,7 @@ QString AWConfigHelper::configurationDirectory()
bool AWConfigHelper::dropCache() bool AWConfigHelper::dropCache()
{ {
QString fileName QString fileName
= QString("%1/awesomewidgets.ndx") = QString("%1/awesomewidgets.ndx").arg(QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation));
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation));
return QFile(fileName).remove(); return QFile(fileName).remove();
} }
@ -88,8 +85,8 @@ bool AWConfigHelper::exportConfiguration(QObject *_nativeConfig, const QString &
// extensions // extensions
for (auto &item : m_dirs) { for (auto &item : m_dirs) {
QStringList items = QDir(QString("%1/%2").arg(m_baseDir).arg(item)) QStringList items
.entryList(QStringList() << "*.desktop", QDir::Files); = QDir(QString("%1/%2").arg(m_baseDir).arg(item)).entryList(QStringList() << "*.desktop", QDir::Files);
settings.beginGroup(item); settings.beginGroup(item);
for (auto &it : items) for (auto &it : items)
copyExtensions(it, item, settings, false); copyExtensions(it, item, settings, false);
@ -99,11 +96,9 @@ bool AWConfigHelper::exportConfiguration(QObject *_nativeConfig, const QString &
// additional files // additional files
settings.beginGroup("json"); settings.beginGroup("json");
// script filters // script filters
readFile(settings, "filters", readFile(settings, "filters", QString("%1/scripts/awesomewidgets-extscripts-filters.json").arg(m_baseDir));
QString("%1/scripts/awesomewidgets-extscripts-filters.json").arg(m_baseDir));
// weather icon settings // weather icon settings
readFile(settings, "weathers", readFile(settings, "weathers", QString("%1/weather/awesomewidgets-extweather-ids.json").arg(m_baseDir));
QString("%1/weather/awesomewidgets-extweather-ids.json").arg(m_baseDir));
settings.endGroup(); settings.endGroup();
settings.beginGroup("ini"); settings.beginGroup("ini");
@ -120,10 +115,8 @@ bool AWConfigHelper::exportConfiguration(QObject *_nativeConfig, const QString &
} }
QVariantMap AWConfigHelper::importConfiguration(const QString &_fileName, QVariantMap AWConfigHelper::importConfiguration(const QString &_fileName, const bool _importPlasmoid,
const bool _importPlasmoid, const bool _importExtensions, const bool _importAdds) const
const bool _importExtensions,
const bool _importAdds) const
{ {
qCDebug(LOG_AW) << "Selected filename" << _fileName; qCDebug(LOG_AW) << "Selected filename" << _fileName;
@ -144,11 +137,9 @@ QVariantMap AWConfigHelper::importConfiguration(const QString &_fileName,
if (_importAdds) { if (_importAdds) {
settings.beginGroup("json"); settings.beginGroup("json");
// script filters // script filters
writeFile(settings, "filters", writeFile(settings, "filters", QString("%1/scripts/awesomewidgets-extscripts-filters.json").arg(m_baseDir));
QString("%1/scripts/awesomewidgets-extscripts-filters.json").arg(m_baseDir));
// weather icon settings // weather icon settings
writeFile(settings, "weathers", writeFile(settings, "weathers", QString("%1/weather/awesomewidgets-extweather-ids.json").arg(m_baseDir));
QString("%1/weather/awesomewidgets-extweather-ids.json").arg(m_baseDir));
settings.endGroup(); settings.endGroup();
settings.beginGroup("ini"); settings.beginGroup("ini");
@ -173,8 +164,7 @@ QVariantMap AWConfigHelper::importConfiguration(const QString &_fileName,
QVariantMap AWConfigHelper::readDataEngineConfiguration() QVariantMap AWConfigHelper::readDataEngineConfiguration()
{ {
QString fileName = QStandardPaths::locate(QStandardPaths::ConfigLocation, QString fileName = QStandardPaths::locate(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;
@ -228,9 +218,8 @@ void AWConfigHelper::copyConfigs(const QString &_localDir)
{ {
qCDebug(LOG_AW) << "Local directory" << _localDir; qCDebug(LOG_AW) << "Local directory" << _localDir;
QStringList dirs QStringList dirs = QStandardPaths::locateAll(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;
@ -238,21 +227,19 @@ void AWConfigHelper::copyConfigs(const QString &_localDir)
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), destination); bool status = QFile::copy(QString("%1/%2").arg(dir).arg(source), destination);
qCInfo(LOG_AW) << "File" << source << "has been copied to" << destination qCInfo(LOG_AW) << "File" << source << "has been copied to" << destination << "with status" << status;
<< "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 << "inverse copying" << _inverse; qCDebug(LOG_AW) << "Extension" << _item << "has type" << _type << "inverse copying" << _inverse;
_settings.beginGroup(_item); _settings.beginGroup(_item);
QSettings itemSettings(QString("%1/%2/%3").arg(m_baseDir).arg(_type).arg(_item), QSettings itemSettings(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);

View File

@ -35,10 +35,8 @@ public:
Q_INVOKABLE [[nodiscard]] static QString configurationDirectory(); Q_INVOKABLE [[nodiscard]] static QString configurationDirectory();
Q_INVOKABLE static bool dropCache(); Q_INVOKABLE static bool dropCache();
Q_INVOKABLE bool exportConfiguration(QObject *_nativeConfig, const QString &_fileName) const; Q_INVOKABLE bool exportConfiguration(QObject *_nativeConfig, const QString &_fileName) const;
Q_INVOKABLE [[nodiscard]] QVariantMap importConfiguration(const QString &_fileName, Q_INVOKABLE [[nodiscard]] QVariantMap importConfiguration(const QString &_fileName, bool _importPlasmoid,
bool _importPlasmoid, bool _importExtensions, bool _importAdds) const;
bool _importExtensions,
bool _importAdds) const;
// dataengine // dataengine
Q_INVOKABLE static QVariantMap readDataEngineConfiguration(); Q_INVOKABLE static QVariantMap readDataEngineConfiguration();
Q_INVOKABLE static bool writeDataEngineConfiguration(const QVariantMap &_configuration); Q_INVOKABLE static bool writeDataEngineConfiguration(const QVariantMap &_configuration);
@ -46,8 +44,7 @@ public:
private: private:
// methods // methods
static void copyConfigs(const QString &_localDir); static void copyConfigs(const QString &_localDir);
void copyExtensions(const QString &_item, const QString &_type, QSettings &_settings, void copyExtensions(const QString &_item, const QString &_type, QSettings &_settings, bool _inverse) const;
bool _inverse) const;
static void copySettings(QSettings &_from, QSettings &_to); static void copySettings(QSettings &_from, QSettings &_to);
static void readFile(QSettings &_settings, const QString &_key, const QString &_fileName); static void readFile(QSettings &_settings, const QString &_key, const QString &_fileName);
static void writeFile(QSettings &_settings, const QString &_key, const QString &_fileName); static void writeFile(QSettings &_settings, const QString &_key, const QString &_fileName);

View File

@ -27,8 +27,7 @@ class AWCustomKeysConfig : public AWAbstractPairConfig
Q_OBJECT Q_OBJECT
public: public:
explicit AWCustomKeysConfig(QWidget *_parent = nullptr, explicit AWCustomKeysConfig(QWidget *_parent = nullptr, const QStringList &_keys = QStringList());
const QStringList &_keys = QStringList());
~AWCustomKeysConfig() override; ~AWCustomKeysConfig() override;
}; };

View File

@ -74,5 +74,5 @@ QStringList AWCustomKeysHelper::leftKeys()
QStringList AWCustomKeysHelper::rightKeys() QStringList AWCustomKeysHelper::rightKeys()
{ {
return QStringList(); return {};
} }

View File

@ -61,8 +61,7 @@ QString AWDataAggregator::htmlImage(const QPixmap &_source)
_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()));
} }
@ -102,10 +101,9 @@ void AWDataAggregator::setParameters(const QVariantMap &_settings)
requiredKeys.append("batTooltip"); requiredKeys.append("batTooltip");
// background // background
m_toolTipScene->setBackgroundBrush( m_toolTipScene->setBackgroundBrush(m_configuration["useTooltipBackground"].toBool()
m_configuration["useTooltipBackground"].toBool() ? QBrush(QColor(m_configuration["tooltipBackground"].toString()))
? QBrush(QColor(m_configuration["tooltipBackground"].toString())) : QBrush(Qt::NoBrush));
: QBrush(Qt::NoBrush));
} }
@ -156,11 +154,10 @@ 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" << _value qCDebug(LOG_AW) << "Notification source" << _source << "with value" << _value << "called with extremum"
<< "called with extremum" << _extremum; << _extremum;
if (_value >= 0.0) { if (_value >= 0.0) {
if ((m_enablePopup) && (_value > _extremum) && (m_values[_source].last() < _extremum)) if ((m_enablePopup) && (_value > _extremum) && (m_values[_source].last() < _extremum))
@ -172,11 +169,10 @@ void AWDataAggregator::checkValue(const QString &_source, const float _value,
} }
void AWDataAggregator::checkValue(const QString &_source, const QString &_current, void AWDataAggregator::checkValue(const QString &_source, const QString &_current, const QString &_received) const
const QString &_received) const
{ {
qCDebug(LOG_AW) << "Notification source" << _source << "with current value" << _current qCDebug(LOG_AW) << "Notification source" << _source << "with current value" << _current << "and received one"
<< "and received one" << _received; << _received;
if ((m_enablePopup) && (_current != _received) && (!_received.isEmpty())) if ((m_enablePopup) && (_current != _received) && (!_received.isEmpty()))
return AWActions::sendNotification("event", notificationText(_source, _received)); return AWActions::sendNotification("event", notificationText(_source, _received));
@ -231,8 +227,7 @@ 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"], "batTooltip", setData(_values["ac"].toString() == m_configuration["acOnline"], "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());
@ -269,8 +264,7 @@ void AWDataAggregator::setData(const QString &_source, float _value, const float
QList<float> netValues = m_values["downkbTooltip"] + m_values["upkbTooltip"]; QList<float> netValues = 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"] = 1.2f * *std::max_element(netValues.cbegin(), netValues.cend());
= 1.2f * *std::max_element(netValues.cbegin(), netValues.cend());
m_boundaries["upkbTooltip"] = m_boundaries["downkbTooltip"]; m_boundaries["upkbTooltip"] = m_boundaries["downkbTooltip"];
} }
} }
@ -278,8 +272,7 @@ void AWDataAggregator::setData(const QString &_source, float _value, const float
void AWDataAggregator::setData(const bool _dontInvert, const QString &_source, float _value) void AWDataAggregator::setData(const bool _dontInvert, const QString &_source, float _value)
{ {
qCDebug(LOG_AW) << "Do not invert" << _dontInvert << "value" << _value << "for source" qCDebug(LOG_AW) << "Do not invert" << _dontInvert << "value" << _value << "for source" << _source;
<< _source;
// invert values for different battery colours // invert values for different battery colours
_value = _dontInvert ? _value : -_value; _value = _dontInvert ? _value : -_value;

View File

@ -50,8 +50,7 @@ private:
QGraphicsScene *m_toolTipScene = nullptr; QGraphicsScene *m_toolTipScene = nullptr;
QGraphicsView *m_toolTipView = nullptr; QGraphicsView *m_toolTipView = nullptr;
void checkValue(const QString &_source, float _value, float _extremum) const; void checkValue(const QString &_source, float _value, 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();
static QString notificationText(const QString &_source, float _value); static QString notificationText(const QString &_source, float _value);
static QString notificationText(const QString &_source, const QString &_value); static QString notificationText(const QString &_source, const QString &_value);

View File

@ -20,7 +20,6 @@
#include <Plasma/DataContainer> #include <Plasma/DataContainer>
#include "awdebug.h" #include "awdebug.h"
#include "awkeys.h"
AWDataEngineAggregator::AWDataEngineAggregator(QObject *_parent) AWDataEngineAggregator::AWDataEngineAggregator(QObject *_parent)
@ -35,11 +34,10 @@ AWDataEngineAggregator::AWDataEngineAggregator(QObject *_parent)
// additional method required by systemmonitor structure // additional method required by systemmonitor structure
m_newSourceConnection m_newSourceConnection
= connect(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(), 1000);
m_dataEngines["systemmonitor"]->connectSource(source, parent(), 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");
@ -74,8 +72,7 @@ void AWDataEngineAggregator::reconnectSources(const int _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(), (uint)_interval); m_dataEngines["systemmonitor"]->connectSource(source, parent(), (uint)_interval);
}); });
@ -103,12 +100,10 @@ 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() << "Local" QStringList sources = dataEngine == "time" ? 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, SIGNAL(dataUpdated(QString, Plasma::DataEngine::Data)), parent(), disconnect(container, SIGNAL(dataUpdated(QString, Plasma::DataEngine::Data)), parent(),
SLOT(dataUpdated(QString, Plasma::DataEngine::Data))); SLOT(dataUpdated(QString, Plasma::DataEngine::Data)));

View File

@ -76,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, const QString &_units, QStringList AWDataEngineMapper::registerSource(const QString &_source, 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;
@ -180,10 +179,8 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const QSt
m_map.insert(_source, key); m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Float; m_formatter[key] = AWKeysAggregator::FormatterType::Float;
// additional keys // additional keys
m_formatter[QString("hddtotmb%1").arg(index)] m_formatter[QString("hddtotmb%1").arg(index)] = AWKeysAggregator::FormatterType::MemMBFormat;
= AWKeysAggregator::FormatterType::MemMBFormat; m_formatter[QString("hddtotgb%1").arg(index)] = AWKeysAggregator::FormatterType::MemGBFormat;
m_formatter[QString("hddtotgb%1").arg(index)]
= AWKeysAggregator::FormatterType::MemGBFormat;
} }
} else if (_source.contains(mountFreeRegExp)) { } else if (_source.contains(mountFreeRegExp)) {
// free space // free space
@ -427,9 +424,9 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const QSt
// 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 = _keys.isEmpty() bool required = _keys.isEmpty() || std::any_of(foundKeys.cbegin(), foundKeys.cend(), [&_keys](const QString &key) {
|| std::any_of(foundKeys.cbegin(), foundKeys.cend(), return _keys.contains(key);
[&_keys](const QString &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)

View File

@ -38,8 +38,7 @@ public:
[[nodiscard]] AWKeysAggregator::FormatterType formatter(const QString &_key) const; [[nodiscard]] AWKeysAggregator::FormatterType formatter(const QString &_key) const;
[[nodiscard]] 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);
void setDevices(const QHash<QString, QStringList> &_devices); void setDevices(const QHash<QString, QStringList> &_devices);
private: private:

View File

@ -38,10 +38,9 @@ AWDBusAdaptor::~AWDBusAdaptor()
} }
QStringList AWDBusAdaptor::ActiveServices() const QStringList AWDBusAdaptor::ActiveServices()
{ {
QDBusMessage listServices QDBusMessage listServices = QDBusConnection::sessionBus().interface()->call(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 +48,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, const 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 +85,7 @@ void AWDBusAdaptor::SetLogLevel(const QString &what, const int level)
qCDebug(LOG_DBUS) << "Set log level" << level << "for" << what; qCDebug(LOG_DBUS) << "Set log level" << level << "for" << what;
if (level >= m_logLevels.count()) { if (level >= m_logLevels.count()) {
qCDebug(LOG_DBUS) << "Invalid logging level" << level << "should be less than" qCDebug(LOG_DBUS) << "Invalid logging level" << level << "should be less than" << m_logLevels.count();
<< m_logLevels.count();
return; return;
} }

View File

@ -37,11 +37,11 @@ public:
public slots: public slots:
// get methods // get methods
QStringList ActiveServices() const; [[nodiscard]] static QStringList ActiveServices();
QString Info(const QString &key) const; [[nodiscard]] QString Info(const QString &key) const;
QStringList Keys(const QString &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, int level); void SetLogLevel(const QString &what, int level);
void SetLogLevel(const QString &what, const QString &level, bool enabled); void SetLogLevel(const QString &what, const QString &level, bool enabled);

View File

@ -27,8 +27,7 @@ class AWFormatterConfig : public AWAbstractPairConfig
Q_OBJECT Q_OBJECT
public: public:
explicit AWFormatterConfig(QWidget *_parent = nullptr, explicit AWFormatterConfig(QWidget *_parent = nullptr, const QStringList &_keys = QStringList());
const QStringList &_keys = QStringList());
~AWFormatterConfig() override; ~AWFormatterConfig() override;
}; };

View File

@ -102,7 +102,7 @@ void AWFormatterHelper::editPairs()
QStringList AWFormatterHelper::leftKeys() QStringList AWFormatterHelper::leftKeys()
{ {
return QStringList(); return {};
} }
@ -120,8 +120,7 @@ void AWFormatterHelper::editItems()
} }
AWAbstractFormatter::FormatterClass AWAbstractFormatter::FormatterClass AWFormatterHelper::defineFormatterClass(const QString &_stringType)
AWFormatterHelper::defineFormatterClass(const QString &_stringType)
{ {
qCDebug(LOG_AW) << "Define formatter class for" << _stringType; qCDebug(LOG_AW) << "Define formatter class for" << _stringType;
@ -163,9 +162,7 @@ void AWFormatterHelper::initFormatters()
// check if already exists // check if already exists
auto values = m_formattersClasses.values(); auto values = m_formattersClasses.values();
if (std::any_of(values.cbegin(), values.cend(), if (std::any_of(values.cbegin(), values.cend(),
[&filePath](const AWAbstractFormatter *item) { [&filePath](const AWAbstractFormatter *item) { return (item->fileName() == filePath); }))
return (item->fileName() == filePath);
}))
continue; continue;
auto metadata = readMetadata(filePath); auto metadata = readMetadata(filePath);
@ -197,8 +194,7 @@ void AWFormatterHelper::initFormatters()
} }
QPair<QString, AWAbstractFormatter::FormatterClass> QPair<QString, AWAbstractFormatter::FormatterClass> AWFormatterHelper::readMetadata(const QString &_filePath)
AWFormatterHelper::readMetadata(const QString &_filePath)
{ {
qCDebug(LOG_AW) << "Read initial parameters from" << _filePath; qCDebug(LOG_AW) << "Read initial parameters from" << _filePath;
@ -217,8 +213,7 @@ void AWFormatterHelper::doCreateItem()
{ {
QStringList selection = {"NoFormat", "DateTime", "Float", "List", "Script", "String", "Json"}; QStringList selection = {"NoFormat", "DateTime", "Float", "List", "Script", "String", "Json"};
bool ok; bool ok;
QString select QString select = QInputDialog::getItem(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;

View File

@ -49,8 +49,7 @@ private:
// methods // methods
static AWAbstractFormatter::FormatterClass defineFormatterClass(const QString &_stringType); static AWAbstractFormatter::FormatterClass defineFormatterClass(const QString &_stringType);
void initFormatters(); void initFormatters();
[[nodiscard]] static QPair<QString, AWAbstractFormatter::FormatterClass> [[nodiscard]] static QPair<QString, AWAbstractFormatter::FormatterClass> readMetadata(const QString &_filePath);
readMetadata(const QString &_filePath);
// parent methods // parent methods
void doCreateItem() override; void doCreateItem() override;
// properties // properties

View File

@ -31,8 +31,7 @@ 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 fileName
= QString("%1/awesomewidgets.ndx") = QString("%1/awesomewidgets.ndx").arg(QStandardPaths::writableLocation(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);
@ -75,12 +74,10 @@ bool AWKeyCache::addKeyToCache(const QString &_type, const QString &_key)
} }
QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, const QStringList &_bars, QStringList AWKeyCache::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)
{ {
qCDebug(LOG_AW) << "Looking for required keys in" << _keys << _bars << "using tooltip settings" qCDebug(LOG_AW) << "Looking for required keys in" << _keys << _bars << "using tooltip settings" << _tooltip;
<< _tooltip;
// initial copy // initial copy
QSet<QString> used(_keys.cbegin(), _keys.cend()); QSet<QString> used(_keys.cbegin(), _keys.cend());
@ -136,8 +133,8 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, const QStringL
used << "swapgb" used << "swapgb"
<< "swapfreegb"; << "swapfreegb";
// network keys // network keys
QStringList netKeys({"up", "upkb", "uptot", "uptotkb", "upunits", "down", "downkb", "downtot", QStringList netKeys(
"downtotkb", "downunits"}); {"up", "upkb", "uptot", "uptotkb", "upunits", "down", "downkb", "downtot", "downtotkb", "downunits"});
for (auto &key : netKeys) { for (auto &key : netKeys) {
if (!used.contains(key)) if (!used.contains(key))
continue; continue;
@ -146,8 +143,7 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, const QStringL
used << filtered; used << filtered;
} }
// netdev key // netdev key
if (std::any_of(netKeys.cbegin(), netKeys.cend(), if (std::any_of(netKeys.cbegin(), netKeys.cend(), [&used](const QString &key) { return used.contains(key); }))
[&used](const QString &key) { return used.contains(key); }))
used << "netdev"; used << "netdev";
// HACK append dummy if there are no other keys. This hack is required // HACK append dummy if there are no other keys. This hack is required
@ -162,8 +158,7 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, const QStringL
QHash<QString, QStringList> AWKeyCache::loadKeysFromCache() QHash<QString, QStringList> AWKeyCache::loadKeysFromCache()
{ {
QString fileName QString fileName
= QString("%1/awesomewidgets.ndx") = QString("%1/awesomewidgets.ndx").arg(QStandardPaths::writableLocation(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);

View File

@ -27,9 +27,8 @@
namespace AWKeyCache namespace AWKeyCache
{ {
bool addKeyToCache(const QString &_type, const QString &_key = ""); bool addKeyToCache(const QString &_type, const QString &_key = "");
QStringList getRequiredKeys(const QStringList &_keys, const QStringList &_bars, QStringList getRequiredKeys(const QStringList &_keys, const QStringList &_bars, const QVariantMap &_tooltip,
const QVariantMap &_tooltip, const QStringList &_userKeys, const QStringList &_userKeys, const QStringList &_allKeys);
const QStringList &_allKeys);
QHash<QString, QStringList> loadKeysFromCache(); QHash<QString, QStringList> loadKeysFromCache();
} // namespace AWKeyCache } // namespace AWKeyCache

View File

@ -18,7 +18,6 @@
#include "awkeyoperations.h" #include "awkeyoperations.h"
#include <QDir> #include <QDir>
#include <QJSEngine>
#include <QRegExp> #include <QRegExp>
#include <QThread> #include <QThread>
@ -281,8 +280,7 @@ 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 QStringList keys = dictKeys().filter(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();

View File

@ -56,8 +56,7 @@ AWKeys::AWKeys(QObject *_parent)
createDBusInterface(); createDBusInterface();
// update key data if required // update key data if required
connect(m_keyOperator, SIGNAL(updateKeys(const QStringList &)), this, connect(m_keyOperator, SIGNAL(updateKeys(const QStringList &)), this, SLOT(reinitKeys(const QStringList &)));
SLOT(reinitKeys(const QStringList &)));
connect(m_timer, SIGNAL(timeout()), this, SLOT(updateTextData())); connect(m_timer, SIGNAL(timeout()), this, SLOT(updateTextData()));
// transfer signal from AWDataAggregator object to QML ui // transfer signal from AWDataAggregator object to QML ui
connect(m_dataAggregator, SIGNAL(toolTipPainted(const QString &)), this, connect(m_dataAggregator, SIGNAL(toolTipPainted(const QString &)), this,
@ -91,11 +90,10 @@ void AWKeys::initDataAggregator(const QVariantMap &_tooltipParams)
} }
void AWKeys::initKeys(const QString &_currentPattern, const int _interval, const int _limit, void AWKeys::initKeys(const QString &_currentPattern, const int _interval, const int _limit, const bool _optimize)
const bool _optimize)
{ {
qCDebug(LOG_AW) << "Pattern" << _currentPattern << "with interval" << _interval qCDebug(LOG_AW) << "Pattern" << _currentPattern << "with interval" << _interval << "and queue limit" << _limit
<< "and queue limit" << _limit << "with optimization" << _optimize; << "with optimization" << _optimize;
// init // init
m_optimize = _optimize; m_optimize = _optimize;
@ -227,10 +225,9 @@ void AWKeys::reinitKeys(const QStringList &_currentKeys)
barKeys.append(item->usedKeys()); barKeys.append(item->usedKeys());
} }
// get required keys // get required keys
m_requiredKeys m_requiredKeys = m_optimize ? AWKeyCache::getRequiredKeys(m_foundKeys, barKeys, m_tooltipParams,
= m_optimize ? AWKeyCache::getRequiredKeys(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());
@ -260,11 +257,9 @@ void AWKeys::calculateValues()
for (auto &device : mountDevices) { for (auto &device : mountDevices) {
int index = mountDevices.indexOf(device); int index = mountDevices.indexOf(device);
m_values[QString("hddtotmb%1").arg(index)] m_values[QString("hddtotmb%1").arg(index)]
= m_values[QString("hddfreemb%1").arg(index)].toFloat() = m_values[QString("hddfreemb%1").arg(index)].toFloat() + m_values[QString("hddmb%1").arg(index)].toFloat();
+ m_values[QString("hddmb%1").arg(index)].toFloat();
m_values[QString("hddtotgb%1").arg(index)] m_values[QString("hddtotgb%1").arg(index)]
= m_values[QString("hddfreegb%1").arg(index)].toFloat() = m_values[QString("hddfreegb%1").arg(index)].toFloat() + m_values[QString("hddgb%1").arg(index)].toFloat();
+ m_values[QString("hddgb%1").arg(index)].toFloat();
} }
// memtot* // memtot*
@ -312,20 +307,16 @@ void AWKeys::createDBusInterface()
// 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(QString("%1.i%2").arg(AWDBUS_SERVICE).arg(id))) { if (instanceBus.registerService(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" << instanceBus.lastError().message();
qCWarning(LOG_AW) << "Could not register DBus object, last error"
<< instanceBus.lastError().message();
} else { } else {
qCWarning(LOG_AW) << "Could not register DBus service, last error" qCWarning(LOG_AW) << "Could not register DBus service, last error" << instanceBus.lastError().message();
<< instanceBus.lastError().message();
} }
// and same instance but for id independent service // and same instance but for id independent service
QDBusConnection commonBus = QDBusConnection::sessionBus(); QDBusConnection commonBus = QDBusConnection::sessionBus();
if (commonBus.registerService(AWDBUS_SERVICE)) if (commonBus.registerService(AWDBUS_SERVICE))
commonBus.registerObject(AWDBUS_PATH, new AWDBusAdaptor(this), commonBus.registerObject(AWDBUS_PATH, new AWDBusAdaptor(this), QDBusConnection::ExportAllContents);
QDBusConnection::ExportAllContents);
} }
@ -340,14 +331,13 @@ QString AWKeys::parsePattern(QString _pattern) const
// main keys // main keys
for (auto &key : m_foundKeys) for (auto &key : m_foundKeys)
_pattern.replace(QString("$%1").arg(key), _pattern.replace(QString("$%1").arg(key), m_aggregator->formatter(m_values[key], key, true));
m_aggregator->formatter(m_values[key], key, 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 = item->isCustom() ? item->image(AWPatternFunctions::expandLambdas( QString image = item->isCustom() ? item->image(
item->bar(), m_aggregator, m_values, item->usedKeys())) AWPatternFunctions::expandLambdas(item->bar(), m_aggregator, m_values, item->usedKeys()))
: item->image(m_values[item->bar()]); : item->image(m_values[item->bar()]);
_pattern.replace(QString("$%1").arg(bar), image); _pattern.replace(QString("$%1").arg(bar), image);
} }

View File

@ -40,16 +40,14 @@ public:
explicit AWKeys(QObject *_parent = nullptr); explicit AWKeys(QObject *_parent = nullptr);
~AWKeys() override; ~AWKeys() override;
Q_INVOKABLE void initDataAggregator(const QVariantMap &_tooltipParams); Q_INVOKABLE void initDataAggregator(const QVariantMap &_tooltipParams);
Q_INVOKABLE void initKeys(const QString &_currentPattern, int _interval, int _limit, Q_INVOKABLE void initKeys(const QString &_currentPattern, int _interval, int _limit, bool _optimize);
bool _optimize);
Q_INVOKABLE void setAggregatorProperty(const QString &_key, const QVariant &_value); Q_INVOKABLE void setAggregatorProperty(const QString &_key, const QVariant &_value);
Q_INVOKABLE void setWrapNewLines(bool _wrap); Q_INVOKABLE void setWrapNewLines(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 [[nodiscard]] QStringList dictKeys(bool _sorted = false, Q_INVOKABLE [[nodiscard]] QStringList dictKeys(bool _sorted = false, const QString &_regexp = "") const;
const QString &_regexp = "") const;
Q_INVOKABLE [[nodiscard]] QVariantList getHddDevices() const; Q_INVOKABLE [[nodiscard]] QVariantList getHddDevices() const;
// values // values
Q_INVOKABLE [[nodiscard]] QString infoByKey(const QString &_key) const; Q_INVOKABLE [[nodiscard]] QString infoByKey(const QString &_key) const;
@ -60,7 +58,7 @@ public:
public slots: public slots:
void dataUpdated(const QString &_sourceName, const Plasma::DataEngine::Data &_data); void dataUpdated(const QString &_sourceName, const Plasma::DataEngine::Data &_data);
// dummy method required by DataEngine connections // dummy method required by DataEngine connections
static void modelChanged(QString, QAbstractItemModel *){}; static void modelChanged(const QString &, QAbstractItemModel *){};
signals: signals:
void dropSourceFromDataengine(const QString &_source); void dropSourceFromDataengine(const QString &_source);

View File

@ -55,8 +55,7 @@ void AWKeysAggregator::initFormatters()
} }
QString AWKeysAggregator::formatter(const QVariant &_data, const QString &_key, QString AWKeysAggregator::formatter(const QVariant &_data, const QString &_key, bool replaceSpace) const
bool replaceSpace) const
{ {
qCDebug(LOG_AW) << "Data" << _data << "for key" << _key; qCDebug(LOG_AW) << "Data" << _data << "for key" << _key;
@ -235,8 +234,7 @@ void AWKeysAggregator::setTranslate(const bool _translate)
} }
QStringList AWKeysAggregator::registerSource(const QString &_source, const QString &_units, QStringList AWKeysAggregator::registerSource(const QString &_source, 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;

View File

@ -69,8 +69,7 @@ public:
~AWKeysAggregator() override; ~AWKeysAggregator() override;
void initFormatters(); void initFormatters();
// get methods // get methods
[[nodiscard]] QString formatter(const QVariant &_data, const QString &_key, [[nodiscard]] QString formatter(const QVariant &_data, const QString &_key, bool replaceSpace) const;
bool replaceSpace) const;
[[nodiscard]] QStringList keysFromSource(const QString &_source) const; [[nodiscard]] QStringList keysFromSource(const QString &_source) const;
// set methods // set methods
void setAcOffline(const QString &_inactive); void setAcOffline(const QString &_inactive);
@ -82,8 +81,7 @@ public:
void setTranslate(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:
[[nodiscard]] float temperature(float temp) const; [[nodiscard]] float temperature(float temp) const;

View File

@ -24,8 +24,7 @@
#include "awkeysaggregator.h" #include "awkeysaggregator.h"
QString AWPatternFunctions::expandLambdas(QString _code, AWKeysAggregator *_aggregator, QString AWPatternFunctions::expandLambdas(QString _code, AWKeysAggregator *_aggregator, const QVariantHash &_metadata,
const QVariantHash &_metadata,
const QStringList &_usedKeys) const QStringList &_usedKeys)
{ {
qCDebug(LOG_AW) << "Expand lambdas in" << _code; qCDebug(LOG_AW) << "Expand lambdas in" << _code;
@ -35,13 +34,12 @@ QString AWPatternFunctions::expandLambdas(QString _code, AWKeysAggregator *_aggr
_code.replace("$this", _metadata[_code].toString()); _code.replace("$this", _metadata[_code].toString());
// parsed values // parsed values
for (auto &lambdaKey : _usedKeys) for (auto &lambdaKey : _usedKeys)
_code.replace(QString("$%1").arg(lambdaKey), _code.replace(QString("$%1").arg(lambdaKey), _aggregator->formatter(_metadata[lambdaKey], lambdaKey, false));
_aggregator->formatter(_metadata[lambdaKey], lambdaKey, 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" << result.property("lineNumber").toInt() qCWarning(LOG_AW) << "Uncaught exception at line" << result.property("lineNumber").toInt() << ":"
<< ":" << result.toString(); << result.toString();
return ""; return "";
} else { } else {
return result.toString(); return result.toString();
@ -67,8 +65,8 @@ QString AWPatternFunctions::expandTemplates(QString _code)
QJSValue result = engine.evaluate(body); QJSValue result = engine.evaluate(body);
QString templateResult = ""; QString templateResult = "";
if (result.isError()) { if (result.isError()) {
qCWarning(LOG_AW) << "Uncaught exception at line" qCWarning(LOG_AW) << "Uncaught exception at line" << result.property("lineNumber").toInt() << ":"
<< result.property("lineNumber").toInt() << ":" << result.toString(); << result.toString();
} else { } else {
templateResult = result.toString(); templateResult = result.toString();
} }
@ -81,8 +79,8 @@ 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;
@ -109,8 +107,7 @@ AWPatternFunctions::findFunctionCalls(const QString &_function, const QString &_
// 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(), std::for_each(args.begin(), args.end(), [](QString &arg) { arg.replace(QString(0x1d), ","); });
[](QString &arg) { arg.replace(QString(0x1d), ","); });
metadata.args = args; metadata.args = args;
} }
// other variables // other variables
@ -130,13 +127,11 @@ QString AWPatternFunctions::insertAllKeys(QString _code, const QStringList &_key
{ {
qCDebug(LOG_AW) << "Looking for keys in code" << _code << "using list" << _keys; qCDebug(LOG_AW) << "Looking for keys in code" << _code << "using list" << _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(), std::for_each(required.begin(), required.end(), [](QString &value) { 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));
} }
@ -149,8 +144,7 @@ QString AWPatternFunctions::insertKeyCount(QString _code, const QStringList &_ke
{ {
qCDebug(LOG_AW) << "Looking for count in code" << _code << "using list" << _keys; qCDebug(LOG_AW) << "Looking for count in code" << _code << "using list" << _keys;
QList<AWPatternFunctions::AWFunction> found QList<AWPatternFunctions::AWFunction> found = AWPatternFunctions::findFunctionCalls("aw_count", _code);
= AWPatternFunctions::findFunctionCalls("aw_count", _code);
for (auto &function : found) { for (auto &function : found) {
int count = _keys.filter(QRegExp(function.body)).count(); int count = _keys.filter(QRegExp(function.body)).count();
@ -165,8 +159,7 @@ QString AWPatternFunctions::insertKeyNames(QString _code, const QStringList &_ke
{ {
qCDebug(LOG_AW) << "Looking for key names in code" << _code << "using list" << _keys; qCDebug(LOG_AW) << "Looking for key names in code" << _code << "using list" << _keys;
QList<AWPatternFunctions::AWFunction> found QList<AWPatternFunctions::AWFunction> found = AWPatternFunctions::findFunctionCalls("aw_names", _code);
= AWPatternFunctions::findFunctionCalls("aw_names", _code);
for (auto &function : found) { for (auto &function : found) {
QString separator = function.args.isEmpty() ? "," : function.args.at(0); QString separator = function.args.isEmpty() ? "," : function.args.at(0);
QStringList required = _keys.filter(QRegExp(function.body)); QStringList required = _keys.filter(QRegExp(function.body));
@ -182,13 +175,11 @@ QString AWPatternFunctions::insertKeys(QString _code, const QStringList &_keys)
{ {
qCDebug(LOG_AW) << "Looking for keys in code" << _code << "using list" << _keys; qCDebug(LOG_AW) << "Looking for keys in code" << _code << "using list" << _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(), std::for_each(required.begin(), required.end(), [](QString &value) { 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));
} }
@ -201,8 +192,7 @@ QString AWPatternFunctions::insertMacros(QString _code)
{ {
qCDebug(LOG_AW) << "Looking for macros in code" << _code; qCDebug(LOG_AW) << "Looking for macros in code" << _code;
QList<AWPatternFunctions::AWFunction> found QList<AWPatternFunctions::AWFunction> found = AWPatternFunctions::findFunctionCalls("aw_macro", _code);
= AWPatternFunctions::findFunctionCalls("aw_macro", _code);
for (auto &macro : found) { for (auto &macro : found) {
// get macro params // get macro params
if (macro.args.isEmpty()) { if (macro.args.isEmpty()) {
@ -215,17 +205,15 @@ QString AWPatternFunctions::insertMacros(QString _code)
= AWPatternFunctions::findFunctionCalls(QString("aw_macro_%1").arg(name), _code); = AWPatternFunctions::findFunctionCalls(QString("aw_macro_%1").arg(name), _code);
for (auto &function : macroUsage) { for (auto &function : macroUsage) {
if (function.args.count() != macro.args.count()) { if (function.args.count() != macro.args.count()) {
qCWarning(LOG_AW) << "Invalid args count found for call" << function.what qCWarning(LOG_AW) << "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
QString result = macro.body; QString result = macro.body;
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), function.args.at(index));
result.replace(QString("$%1").arg(arg), function.args.at(index)); });
});
// do replace // do replace
_code.replace(function.what, result); _code.replace(function.what, result);
} }
@ -238,16 +226,14 @@ QString AWPatternFunctions::insertMacros(QString _code)
} }
QStringList AWPatternFunctions::findKeys(const QString &_code, const QStringList &_keys, QStringList AWPatternFunctions::findKeys(const QString &_code, const QStringList &_keys, const bool _isBars)
const bool _isBars)
{ {
qCDebug(LOG_AW) << "Looking for keys in code" << _code << "using list" << _keys; qCDebug(LOG_AW) << "Looking for keys in code" << _code << "using list" << _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" << _isBars; qCInfo(LOG_AW) << "Found key" << key << "with bar enabled" << _isBars;
selectedKeys.append(key); selectedKeys.append(key);
replacedCode.replace(QString("$%1").arg(key), ""); replacedCode.replace(QString("$%1").arg(key), "");

View File

@ -73,8 +73,8 @@ QString AWTelemetryHandler::getLast(const QString &_group) const
void AWTelemetryHandler::init(const int _count, const bool _enableRemote, const QString &_clientId) void AWTelemetryHandler::init(const int _count, const bool _enableRemote, const QString &_clientId)
{ {
qCDebug(LOG_AW) << "Init telemetry with count" << _count << "enable remote" << _enableRemote qCDebug(LOG_AW) << "Init telemetry with count" << _count << "enable remote" << _enableRemote << "client ID"
<< "client ID" << _clientId; << _clientId;
m_storeCount = _count; m_storeCount = _count;
m_uploadEnabled = _enableRemote; m_uploadEnabled = _enableRemote;
@ -127,8 +127,7 @@ void AWTelemetryHandler::uploadTelemetry(const QString &_group, const QString &_
} }
auto *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 *)));
QUrl url(REMOTE_TELEMETRY_URL); QUrl url(REMOTE_TELEMETRY_URL);
QNetworkRequest request(url); QNetworkRequest request(url);
@ -151,8 +150,7 @@ void AWTelemetryHandler::uploadTelemetry(const QString &_group, const QString &_
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() << "with message" qCWarning(LOG_AW) << "An error occurs" << _reply->error() << "with message" << _reply->errorString();
<< _reply->errorString();
return; return;
} }

View File

@ -34,9 +34,8 @@ 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 m_genericConfig = QString("%1/awesomewidgets/general.ini")
= QString("%1/awesomewidgets/general.ini") .arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation));
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation));
} }
@ -53,9 +52,8 @@ 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
auto *manager = new QNetworkAccessManager(nullptr); auto *manager = new QNetworkAccessManager(nullptr);
connect(manager, &QNetworkAccessManager::finished, [_showAnyway, this](QNetworkReply *reply) { connect(manager, &QNetworkAccessManager::finished,
return versionReplyRecieved(reply, _showAnyway); [_showAnyway, this](QNetworkReply *reply) { return versionReplyRecieved(reply, _showAnyway); });
});
manager->get(QNetworkRequest(QUrl(VERSION_API))); manager->get(QNetworkRequest(QUrl(VERSION_API)));
} }
@ -64,16 +62,14 @@ void AWUpdateHelper::checkUpdates(const bool _showAnyway)
bool AWUpdateHelper::checkVersion() bool AWUpdateHelper::checkVersion()
{ {
QSettings settings(m_genericConfig, QSettings::IniFormat); QSettings settings(m_genericConfig, QSettings::IniFormat);
QVersionNumber version QVersionNumber version = QVersionNumber::fromString(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" << m_foundVersion; qCInfo(LOG_AW) << "Found version" << version << "actual one is" << m_foundVersion;
if ((version != m_foundVersion) && (!QString(CHANGELOG).isEmpty())) { if ((version != m_foundVersion) && (!QString(CHANGELOG).isEmpty())) {
genMessageBox(i18nc("Changelog of %1", VERSION), QString(CHANGELOG).replace('@', '\n'), genMessageBox(i18nc("Changelog of %1", VERSION), QString(CHANGELOG).replace('@', '\n'), QMessageBox::Ok)
QMessageBox::Ok)
->open(); ->open();
return true; return true;
} else if (version != m_foundVersion) { } else if (version != m_foundVersion) {
@ -133,8 +129,7 @@ void AWUpdateHelper::versionReplyRecieved(QNetworkReply *_reply, const bool _sho
{ {
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() << "with message" qCWarning(LOG_AW) << "An error occurs" << _reply->error() << "with message" << _reply->errorString();
<< _reply->errorString();
return; return;
} }

View File

@ -79,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:

View File

@ -34,10 +34,9 @@ AbstractExtItemAggregator::AbstractExtItemAggregator(QWidget *_parent, QString _
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
// create directory at $HOME // create directory at $HOME
QString localDir QString localDir = QString("%1/awesomewidgets/%2")
= QString("%1/awesomewidgets/%2") .arg(QStandardPaths::writableLocation(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;
@ -47,11 +46,9 @@ AbstractExtItemAggregator::AbstractExtItemAggregator(QWidget *_parent, QString _
createButton = ui->buttonBox->addButton(i18n("Create"), QDialogButtonBox::ActionRole); createButton = ui->buttonBox->addButton(i18n("Create"), QDialogButtonBox::ActionRole);
deleteButton = ui->buttonBox->addButton(i18n("Remove"), 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 *)));
connect(ui->buttonBox, SIGNAL(rejected()), this, SLOT(reject())); connect(ui->buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
connect(ui->listWidget, SIGNAL(itemActivated(QListWidgetItem *)), this, connect(ui->listWidget, SIGNAL(itemActivated(QListWidgetItem *)), this, SLOT(editItemActivated(QListWidgetItem *)));
SLOT(editItemActivated(QListWidgetItem *)));
} }
@ -118,8 +115,7 @@ void AbstractExtItemAggregator::editItem()
QString AbstractExtItemAggregator::getName() QString AbstractExtItemAggregator::getName()
{ {
bool ok; bool ok;
QString name = QInputDialog::getText(this, i18n("Enter file name"), i18n("File name"), QString name = QInputDialog::getText(this, i18n("Enter file name"), i18n("File name"), QLineEdit::Normal, "", &ok);
QLineEdit::Normal, "", &ok);
if ((!ok) || (name.isEmpty())) if ((!ok) || (name.isEmpty()))
return ""; return "";
if (!name.endsWith(".desktop")) if (!name.endsWith(".desktop"))
@ -187,8 +183,7 @@ QVariant AbstractExtItemAggregator::configArgs() const
QStringList AbstractExtItemAggregator::directories() const QStringList AbstractExtItemAggregator::directories() const
{ {
auto dirs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, auto dirs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QString("awesomewidgets/%1").arg(type()),
QString("awesomewidgets/%1").arg(type()),
QStandardPaths::LocateDirectory); QStandardPaths::LocateDirectory);
return dirs; return dirs;

View File

@ -47,10 +47,9 @@ public:
{ {
QString fileName = getName(); QString fileName = getName();
int number = uniqNumber(); int number = uniqNumber();
QString dir QString dir = QString("%1/awesomewidgets/%2")
= QString("%1/awesomewidgets/%2") .arg(QStandardPaths::writableLocation(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;
@ -68,7 +67,7 @@ public:
void editItem(); void editItem();
QString getName(); QString getName();
virtual void initItems() = 0; virtual void initItems() = 0;
AbstractExtItem *itemFromWidget() const; [[nodiscard]] AbstractExtItem *itemFromWidget() const;
void repaintList() const; void repaintList() const;
[[nodiscard]] int uniqNumber() const; [[nodiscard]] int uniqNumber() const;
// get methods // get methods

View File

@ -33,8 +33,7 @@ public:
: QObject(_parent){}; : QObject(_parent){};
~AbstractQuotesProvider() override = default; ~AbstractQuotesProvider() override = default;
virtual void initUrl(const QString &_asset) = 0; virtual void initUrl(const QString &_asset) = 0;
[[nodiscard]] virtual QVariantHash parse(const QByteArray &_source, [[nodiscard]] virtual QVariantHash parse(const QByteArray &_source, const QVariantHash &_oldValues) const = 0;
const QVariantHash &_oldValues) const = 0;
[[nodiscard]] QString tag(const QString &_type) const [[nodiscard]] QString tag(const QString &_type) const
{ {
return dynamic_cast<AbstractExtItem *>(parent())->tag(_type); return dynamic_cast<AbstractExtItem *>(parent())->tag(_type);

View File

@ -38,7 +38,7 @@ public:
{ {
return dynamic_cast<AbstractExtItem *>(parent())->tag(_type); return dynamic_cast<AbstractExtItem *>(parent())->tag(_type);
}; };
virtual QUrl url() const = 0; [[nodiscard]] virtual QUrl url() const = 0;
}; };

View File

@ -43,7 +43,7 @@ public:
public slots: public slots:
void readConfiguration() override; void readConfiguration() override;
QVariantHash run() override { return QVariantHash(); }; QVariantHash run() override { return {}; };
void writeConfiguration() const override; void writeConfiguration() const override;
private: private:

View File

@ -51,8 +51,8 @@ QString AWFloatFormatter::convert(const QVariant &_value) const
{ {
qCDebug(LOG_LIB) << "Convert value" << _value; qCDebug(LOG_LIB) << "Convert value" << _value;
QString output = QString("%1").arg(_value.toDouble() * multiplier() + summand(), count(), QString output
format(), precision(), fillChar()); = QString("%1").arg(_value.toDouble() * multiplier() + summand(), count(), format(), precision(), fillChar());
if (forceWidth()) if (forceWidth())
output = output.left(count()); output = output.left(count());
@ -149,8 +149,7 @@ 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') && (_format != 'g') if ((_format != 'e') && (_format != 'E') && (_format != 'f') && (_format != 'g') && (_format != 'G')) {
&& (_format != 'G')) {
qCWarning(LOG_LIB) << "Invalid format" << _format; qCWarning(LOG_LIB) << "Invalid format" << _format;
_format = 'f'; _format = 'f';
} }

View File

@ -53,9 +53,8 @@ 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 = _value.type() == QVariant::String QJsonDocument json = _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);

View File

@ -59,8 +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" << result.property("lineNumber").toInt() qCWarning(LOG_LIB) << "Uncaught exception at line" << result.property("lineNumber").toInt() << ":"
<< ":" << result.toString(); << result.toString();
return ""; return "";
} else { } else {
return result.toString(); return result.toString();
@ -199,9 +199,7 @@ void AWScriptFormatter::initProgram()
{ {
// init JS code // init JS code
if (appendCode()) if (appendCode())
m_program = QString("(function(value) { %1%2 })") m_program = QString("(function(value) { %1%2 })").arg(code()).arg(hasReturn() ? "" : "; return output;");
.arg(code())
.arg(hasReturn() ? "" : "; return output;");
else else
m_program = code(); m_program = code();

View File

@ -139,9 +139,8 @@ 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(), [&filePath](AbstractExtItem *item) { if (std::any_of(items.cbegin(), items.cend(),
return (item->fileName() == filePath); [&filePath](AbstractExtItem *item) { return (item->fileName() == filePath); }))
}))
continue; continue;
items.append(new T(this, filePath)); items.append(new T(this, filePath));
} }
@ -149,9 +148,7 @@ private:
// sort items // sort items
std::sort(items.begin(), items.end(), std::sort(items.begin(), items.end(),
[](const AbstractExtItem *lhs, const AbstractExtItem *rhs) { [](const AbstractExtItem *lhs, const AbstractExtItem *rhs) { return lhs->number() < rhs->number(); });
return lhs->number() < rhs->number();
});
return items; return items;
}; };
}; };

View File

@ -45,8 +45,7 @@ ExtNetworkRequest::ExtNetworkRequest(QWidget *_parent, const QString &_filePath)
// HACK declare as child of nullptr to avoid crash with plasmawindowed // HACK declare as child of nullptr to avoid crash with plasmawindowed
// in the destructor // in the destructor
m_manager = new QNetworkAccessManager(nullptr); m_manager = new QNetworkAccessManager(nullptr);
connect(m_manager, SIGNAL(finished(QNetworkReply *)), this, connect(m_manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(networkReplyReceived(QNetworkReply *)));
SLOT(networkReplyReceived(QNetworkReply *)));
connect(this, SIGNAL(requestDataUpdate()), this, SLOT(sendRequest())); connect(this, SIGNAL(requestDataUpdate()), this, SLOT(sendRequest()));
} }
@ -56,8 +55,7 @@ ExtNetworkRequest::~ExtNetworkRequest()
{ {
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
disconnect(m_manager, SIGNAL(finished(QNetworkReply *)), this, disconnect(m_manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(networkReplyReceived(QNetworkReply *)));
SLOT(networkReplyReceived(QNetworkReply *)));
disconnect(this, SIGNAL(requestDataUpdate()), this, SLOT(sendRequest())); disconnect(this, SIGNAL(requestDataUpdate()), this, SLOT(sendRequest()));
m_manager->deleteLater(); m_manager->deleteLater();
@ -171,14 +169,12 @@ 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() << "with message" qCWarning(LOG_AW) << "An error occurs" << _reply->error() << "with message" << _reply->errorString();
<< _reply->errorString();
return; return;
} }
m_isRunning = false; m_isRunning = false;
m_values[tag("response")] m_values[tag("response")] = QTextCodec::codecForMib(106)->toUnicode(_reply->readAll()).trimmed();
= QTextCodec::codecForMib(106)->toUnicode(_reply->readAll()).trimmed();
emit(dataReceived(m_values)); emit(dataReceived(m_values));
} }

View File

@ -50,8 +50,7 @@ ExtQuotes::ExtQuotes(QWidget *_parent, const QString &_filePath)
// HACK declare as child of nullptr to avoid crash with plasmawindowed // HACK declare as child of nullptr to avoid crash with plasmawindowed
// in the destructor // in the destructor
m_manager = new QNetworkAccessManager(nullptr); m_manager = new QNetworkAccessManager(nullptr);
connect(m_manager, SIGNAL(finished(QNetworkReply *)), this, connect(m_manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(quotesReplyReceived(QNetworkReply *)));
SLOT(quotesReplyReceived(QNetworkReply *)));
connect(this, SIGNAL(requestDataUpdate()), this, SLOT(sendRequest())); connect(this, SIGNAL(requestDataUpdate()), this, SLOT(sendRequest()));
} }
@ -61,8 +60,7 @@ ExtQuotes::~ExtQuotes()
{ {
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
disconnect(m_manager, SIGNAL(finished(QNetworkReply *)), this, disconnect(m_manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(quotesReplyReceived(QNetworkReply *)));
SLOT(quotesReplyReceived(QNetworkReply *)));
disconnect(this, SIGNAL(requestDataUpdate()), this, SLOT(sendRequest())); disconnect(this, SIGNAL(requestDataUpdate()), this, SLOT(sendRequest()));
m_manager->deleteLater(); m_manager->deleteLater();
@ -176,8 +174,7 @@ 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() << "with message" qCWarning(LOG_AW) << "An error occurs" << _reply->error() << "with message" << _reply->errorString();
<< _reply->errorString();
return; return;
} }
@ -218,10 +215,9 @@ void ExtQuotes::translate()
ui->label_name->setText(i18n("Name")); ui->label_name->setText(i18n("Name"));
ui->label_comment->setText(i18n("Comment")); ui->label_comment->setText(i18n("Comment"));
ui->label_number->setText(i18n("Tag")); ui->label_number->setText(i18n("Tag"));
ui->label->setText( ui->label->setText(i18n("<html><head/><body><p>Use Stooq ticker to get quotes for the instrument. Refer to <a "
i18n("<html><head/><body><p>Use Stooq ticker to get quotes for the instrument. Refer to <a " "href=\"https://stooq.com/\"><span style=\" text-decoration: underline; "
"href=\"https://stooq.com/\"><span style=\" text-decoration: underline; " "color:#0057ae;\">https://stooq.com/</span></a></p></body></html>"));
"color:#0057ae;\">https://stooq.com/</span></a></p></body></html>"));
ui->label_ticker->setText(i18n("Ticker")); ui->label_ticker->setText(i18n("Ticker"));
ui->checkBox_active->setText(i18n("Active")); ui->checkBox_active->setText(i18n("Active"));
ui->label_schedule->setText(i18n("Schedule")); ui->label_schedule->setText(i18n("Schedule"));

View File

@ -80,9 +80,8 @@ ExtScript *ExtScript::copy(const QString &_fileName, const int _number)
QString ExtScript::jsonFiltersFile() QString ExtScript::jsonFiltersFile()
{ {
QString fileName QString fileName = QStandardPaths::locate(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;
@ -272,12 +271,9 @@ int ExtScript::showConfiguration(const QVariant &_args)
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(filters().contains("color") ? Qt::Checked ui->checkBox_colorFilter->setCheckState(filters().contains("color") ? Qt::Checked : Qt::Unchecked);
: Qt::Unchecked); ui->checkBox_linesFilter->setCheckState(filters().contains("newline") ? Qt::Checked : Qt::Unchecked);
ui->checkBox_linesFilter->setCheckState(filters().contains("newline") ? Qt::Checked ui->checkBox_spaceFilter->setCheckState(filters().contains("space") ? Qt::Checked : Qt::Unchecked);
: Qt::Unchecked);
ui->checkBox_spaceFilter->setCheckState(filters().contains("space") ? Qt::Checked
: Qt::Unchecked);
int ret = exec(); int ret = exec();
if (ret != 1) if (ret != 1)
@ -329,11 +325,9 @@ void ExtScript::startProcess()
void ExtScript::updateValue() void ExtScript::updateValue()
{ {
qCInfo(LOG_LIB) << "Cmd returns" << m_process->exitCode(); qCInfo(LOG_LIB) << "Cmd returns" << m_process->exitCode();
QString qdebug QString qdebug = QTextCodec::codecForMib(106)->toUnicode(m_process->readAllStandardError()).trimmed();
= QTextCodec::codecForMib(106)->toUnicode(m_process->readAllStandardError()).trimmed();
qCInfo(LOG_LIB) << "Error" << qdebug; qCInfo(LOG_LIB) << "Error" << qdebug;
QString qoutput QString qoutput = QTextCodec::codecForMib(106)->toUnicode(m_process->readAllStandardOutput()).trimmed();
= QTextCodec::codecForMib(106)->toUnicode(m_process->readAllStandardOutput()).trimmed();
qCInfo(LOG_LIB) << "Output" << qoutput; qCInfo(LOG_LIB) << "Output" << qoutput;
QString strValue; QString strValue;

View File

@ -20,7 +20,6 @@
#include <KI18n/KLocalizedString> #include <KI18n/KLocalizedString>
#include <QDir>
#include <QSettings> #include <QSettings>
#include <QTextCodec> #include <QTextCodec>
@ -215,12 +214,10 @@ 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 QString qoutput = QTextCodec::codecForMib(106)->toUnicode(m_process->readAllStandardOutput()).trimmed();
= QTextCodec::codecForMib(106)->toUnicode(m_process->readAllStandardOutput()).trimmed();
m_values[tag("pkgcount")] = [this](const QString &output) { m_values[tag("pkgcount")] = [this](const QString &output) {
return filter().isEmpty() return filter().isEmpty() ? output.split('\n', Qt::SkipEmptyParts).count() - null()
? output.split('\n', Qt::SkipEmptyParts).count() - null() : output.split('\n', Qt::SkipEmptyParts).filter(QRegExp(filter())).count();
: output.split('\n', Qt::SkipEmptyParts).filter(QRegExp(filter())).count();
}(qoutput); }(qoutput);
emit(dataReceived(m_values)); emit(dataReceived(m_values));

View File

@ -53,8 +53,7 @@ ExtWeather::ExtWeather(QWidget *_parent, const QString &_filePath)
// HACK declare as child of nullptr to avoid crash with plasmawindowed // HACK declare as child of nullptr to avoid crash with plasmawindowed
// in the destructor // in the destructor
m_manager = new QNetworkAccessManager(nullptr); m_manager = new QNetworkAccessManager(nullptr);
connect(m_manager, SIGNAL(finished(QNetworkReply *)), this, connect(m_manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(weatherReplyReceived(QNetworkReply *)));
SLOT(weatherReplyReceived(QNetworkReply *)));
connect(this, SIGNAL(requestDataUpdate()), this, SLOT(sendRequest())); connect(this, SIGNAL(requestDataUpdate()), this, SLOT(sendRequest()));
} }
@ -64,8 +63,7 @@ ExtWeather::~ExtWeather()
{ {
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
disconnect(m_manager, SIGNAL(finished(QNetworkReply *)), this, disconnect(m_manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(weatherReplyReceived(QNetworkReply *)));
SLOT(weatherReplyReceived(QNetworkReply *)));
disconnect(this, SIGNAL(requestDataUpdate()), this, SLOT(sendRequest())); disconnect(this, SIGNAL(requestDataUpdate()), this, SLOT(sendRequest()));
m_manager->deleteLater(); m_manager->deleteLater();
@ -92,9 +90,8 @@ ExtWeather *ExtWeather::copy(const QString &_fileName, const int _number)
QString ExtWeather::jsonMapFile() QString ExtWeather::jsonMapFile()
{ {
QString fileName QString fileName = QStandardPaths::locate(QStandardPaths::GenericDataLocation,
= QStandardPaths::locate(QStandardPaths::GenericDataLocation, "awesomewidgets/weather/awesomewidgets-extweather-ids.json");
"awesomewidgets/weather/awesomewidgets-extweather-ids.json");
qCInfo(LOG_LIB) << "Map file" << fileName; qCInfo(LOG_LIB) << "Map file" << fileName;
return fileName; return fileName;
@ -339,8 +336,7 @@ void ExtWeather::sendRequest()
void ExtWeather::weatherReplyReceived(QNetworkReply *_reply) void ExtWeather::weatherReplyReceived(QNetworkReply *_reply)
{ {
if (_reply->error() != QNetworkReply::NoError) { if (_reply->error() != QNetworkReply::NoError) {
qCWarning(LOG_AW) << "An error occurs" << _reply->error() << "with message" qCWarning(LOG_AW) << "An error occurs" << _reply->error() << "with message" << _reply->errorString();
<< _reply->errorString();
return; return;
} }

View File

@ -100,7 +100,7 @@ QString GraphicalItem::image(const QVariant &value)
m_scene->clear(); m_scene->clear();
int scale[2] = {1, 1}; int scale[2] = {1, 1};
float converted = m_helper->getPercents(value.toFloat(), minValue(), maxValue()); float converted = GraphicalItemHelper::getPercents(value.toFloat(), minValue(), maxValue());
// paint // paint
switch (m_type) { switch (m_type) {
@ -136,8 +136,7 @@ QString GraphicalItem::image(const QVariant &value)
QByteArray byteArray; QByteArray byteArray;
QBuffer buffer(&byteArray); QBuffer buffer(&byteArray);
pixmap.save(&buffer, "PNG"); pixmap.save(&buffer, "PNG");
QString url QString url = QString("<img src=\"data:image/png;base64,%1\"/>").arg(QString(byteArray.toBase64()));
= QString("<img src=\"data:image/png;base64,%1\"/>").arg(QString(byteArray.toBase64()));
return url; return url;
} }
@ -458,12 +457,12 @@ int GraphicalItem::showConfiguration(const QVariant &_args)
ui->doubleSpinBox_max->setValue(maxValue()); ui->doubleSpinBox_max->setValue(maxValue());
ui->doubleSpinBox_min->setValue(minValue()); ui->doubleSpinBox_min->setValue(minValue());
ui->spinBox_count->setValue(count()); ui->spinBox_count->setValue(count());
if (m_helper->isColor(activeColor())) if (GraphicalItemHelper::isColor(activeColor()))
ui->comboBox_activeImageType->setCurrentIndex(0); ui->comboBox_activeImageType->setCurrentIndex(0);
else else
ui->comboBox_activeImageType->setCurrentIndex(1); ui->comboBox_activeImageType->setCurrentIndex(1);
ui->lineEdit_activeColor->setText(activeColor()); ui->lineEdit_activeColor->setText(activeColor());
if (m_helper->isColor(inactiveColor())) if (GraphicalItemHelper::isColor(inactiveColor()))
ui->comboBox_inactiveImageType->setCurrentIndex(0); ui->comboBox_inactiveImageType->setCurrentIndex(0);
else else
ui->comboBox_inactiveImageType->setCurrentIndex(1); ui->comboBox_inactiveImageType->setCurrentIndex(1);
@ -540,9 +539,8 @@ void GraphicalItem::changeColor()
QString outputColor; QString outputColor;
if (state == 0) { if (state == 0) {
QColor color = m_helper->stringToColor(lineEdit->text()); QColor color = GraphicalItemHelper::stringToColor(lineEdit->text());
QColor newColor = QColorDialog::getColor(color, this, i18n("Select color"), QColor newColor = QColorDialog::getColor(color, this, i18n("Select color"), QColorDialog::ShowAlphaChannel);
QColorDialog::ShowAlphaChannel);
if (!newColor.isValid()) if (!newColor.isValid())
return; return;
qCInfo(LOG_LIB) << "Selected color" << newColor; qCInfo(LOG_LIB) << "Selected color" << newColor;
@ -557,10 +555,9 @@ void GraphicalItem::changeColor()
} else if (state == 1) { } else if (state == 1) {
QString path = lineEdit->text(); QString path = lineEdit->text();
QString directory = QFileInfo(path).absolutePath(); QString directory = QFileInfo(path).absolutePath();
outputColor outputColor = QFileDialog::getOpenFileUrl(this, i18n("Select path"), directory,
= QFileDialog::getOpenFileUrl(this, i18n("Select path"), directory, i18n("Images (*.png *.bpm *.jpg);;All files (*.*)"))
i18n("Images (*.png *.bpm *.jpg);;All files (*.*)")) .toString();
.toString();
qCInfo(LOG_LIB) << "Selected path" << outputColor; qCInfo(LOG_LIB) << "Selected path" << outputColor;
} }

View File

@ -91,7 +91,7 @@ public:
public slots: public slots:
void readConfiguration() override; void readConfiguration() override;
QVariantHash run() override { return QVariantHash(); }; QVariantHash run() override { return {}; };
int showConfiguration(const QVariant &_args) override; int showConfiguration(const QVariant &_args) override;
void writeConfiguration() const override; void writeConfiguration() const override;

View File

@ -40,11 +40,11 @@ GraphicalItemHelper::~GraphicalItemHelper()
} }
void GraphicalItemHelper::setParameters(const QString &_active, const QString &_inactive, void GraphicalItemHelper::setParameters(const QString &_active, const QString &_inactive, const int _width,
const int _width, const int _height, const int _count) const int _height, const int _count)
{ {
qCDebug(LOG_LIB) << "Use active color" << _active << ", inactive" << _inactive << ", width" qCDebug(LOG_LIB) << "Use active color" << _active << ", inactive" << _inactive << ", width" << _width << ", height"
<< _width << ", height" << _height << ", count" << _count; << _height << ", count" << _count;
// put images to pens if any otherwise set pen colors // put images to pens if any otherwise set pen colors
// Images resize to content here as well // Images resize to content here as well
@ -155,11 +155,10 @@ void GraphicalItemHelper::paintHorizontal(const float _percent)
m_inactivePen.setWidth(m_height); m_inactivePen.setWidth(m_height);
// inactive // inactive
auto width = static_cast<float>(m_width); auto width = static_cast<float>(m_width);
m_scene->addLine(_percent * width + 0.5 * m_height, 0.5 * m_height, m_width + 0.5 * m_height, m_scene->addLine(_percent * width + 0.5 * m_height, 0.5 * m_height, m_width + 0.5 * m_height, 0.5 * m_height,
0.5 * m_height, m_inactivePen); m_inactivePen);
// active // active
m_scene->addLine(-0.5 * m_height, 0.5 * m_height, _percent * width - 0.5 * m_height, m_scene->addLine(-0.5 * m_height, 0.5 * m_height, _percent * width - 0.5 * m_height, 0.5 * m_height, m_activePen);
0.5 * m_height, m_activePen);
} }
@ -170,8 +169,8 @@ void GraphicalItemHelper::paintVertical(const float _percent)
m_activePen.setWidth(m_height); m_activePen.setWidth(m_height);
m_inactivePen.setWidth(m_height); m_inactivePen.setWidth(m_height);
// inactive // inactive
m_scene->addLine(0.5 * m_width, -0.5 * m_width, 0.5 * m_width, m_scene->addLine(0.5 * m_width, -0.5 * m_width, 0.5 * m_width, (1.0 - _percent) * m_height - 0.5 * m_width,
(1.0 - _percent) * m_height - 0.5 * m_width, m_inactivePen); m_inactivePen);
// active // active
m_scene->addLine(0.5 * m_width, (1.0 - _percent) * m_height + 0.5 * m_width, 0.5 * m_width, m_scene->addLine(0.5 * m_width, (1.0 - _percent) * m_height + 0.5 * m_width, 0.5 * m_width,
m_height + 0.5 * m_width, m_activePen); m_height + 0.5 * m_width, m_activePen);

View File

@ -33,8 +33,7 @@ public:
explicit GraphicalItemHelper(QObject *_parent = nullptr, QGraphicsScene *_scene = nullptr); explicit GraphicalItemHelper(QObject *_parent = nullptr, QGraphicsScene *_scene = nullptr);
~GraphicalItemHelper() override; ~GraphicalItemHelper() override;
// parameters // parameters
void setParameters(const QString &_active, const QString &_inactive, int _width, int _height, void setParameters(const QString &_active, const QString &_inactive, int _width, int _height, int _count);
int _count);
// paint methods // paint methods
void paintBars(float _value); void paintBars(float _value);
void paintCircle(float _percent); void paintCircle(float _percent);

View File

@ -66,8 +66,7 @@ QVariantHash OWMWeatherProvider::parse(const QVariantMap &_json) const
return parseSingleJson(_json); return parseSingleJson(_json);
} else { } else {
QVariantList list = _json["list"].toList(); QVariantList list = _json["list"].toList();
return parseSingleJson(list.count() <= m_ts ? list.at(m_ts - 1).toMap() return parseSingleJson(list.count() <= m_ts ? list.at(m_ts - 1).toMap() : list.last().toMap());
: list.last().toMap());
} }
} }

View File

@ -67,10 +67,8 @@ void QCronScheduler::expired()
{ {
QDateTime now = QDateTime::currentDateTime(); QDateTime now = QDateTime::currentDateTime();
if (m_schedule.minutes.contains(now.time().minute()) if (m_schedule.minutes.contains(now.time().minute()) && m_schedule.hours.contains(now.time().hour())
&& m_schedule.hours.contains(now.time().hour()) && m_schedule.days.contains(now.date().day()) && m_schedule.months.contains(now.date().month())
&& m_schedule.days.contains(now.date().day())
&& m_schedule.months.contains(now.date().month())
&& m_schedule.weekdays.contains(now.date().dayOfWeek())) && m_schedule.weekdays.contains(now.date().dayOfWeek()))
emit(activated()); emit(activated());
} }
@ -137,7 +135,7 @@ QList<int> QCronScheduler::QCronField::toList()
{ {
// error checking // error checking
if ((minValue == -1) || (maxValue == -1)) if ((minValue == -1) || (maxValue == -1))
return QList<int>(); return {};
QList<int> output; QList<int> output;
for (auto &i = minValue; i <= maxValue; ++i) { for (auto &i = minValue; i <= maxValue; ++i) {

View File

@ -28,20 +28,20 @@ class QCronScheduler : public QObject
Q_OBJECT Q_OBJECT
public: public:
typedef struct { struct QCronRunSchedule {
QList<int> minutes; QList<int> minutes;
QList<int> hours; QList<int> hours;
QList<int> days; QList<int> days;
QList<int> months; QList<int> months;
QList<int> weekdays; QList<int> weekdays;
} QCronRunSchedule; };
typedef struct { struct QCronField {
int minValue = -1; int minValue = -1;
int maxValue = -1; int maxValue = -1;
int div = 1; int div = 1;
void fromRange(const QString &_range, int _min, int _max); void fromRange(const QString &_range, int _min, int _max);
QList<int> toList(); QList<int> toList();
} QCronField; };
explicit QCronScheduler(QObject *_parent = nullptr); explicit QCronScheduler(QObject *_parent = nullptr);
~QCronScheduler() override; ~QCronScheduler() override;

View File

@ -49,15 +49,13 @@ void StooqQuotesProvider::initUrl(const QString &_asset)
} }
QVariantHash StooqQuotesProvider::parse(const QByteArray &_source, QVariantHash StooqQuotesProvider::parse(const QByteArray &_source, const QVariantHash &_oldValues) const
const QVariantHash &_oldValues) const
{ {
qCDebug(LOG_LIB) << "Parse csv" << _source; qCDebug(LOG_LIB) << "Parse csv" << _source;
QVariantHash values; QVariantHash values;
QStringList sourceValues QStringList sourceValues = QTextCodec::codecForMib(106)->toUnicode(_source).trimmed().split(',');
= QTextCodec::codecForMib(106)->toUnicode(_source).trimmed().split(',');
if (sourceValues.count() != 2) { if (sourceValues.count() != 2) {
qCWarning(LOG_LIB) << "Parse error" << sourceValues; qCWarning(LOG_LIB) << "Parse error" << sourceValues;
return values; return values;

View File

@ -31,8 +31,7 @@ public:
explicit StooqQuotesProvider(QObject *_parent); explicit StooqQuotesProvider(QObject *_parent);
~StooqQuotesProvider() override; ~StooqQuotesProvider() override;
void initUrl(const QString &_asset) override; void initUrl(const QString &_asset) override;
[[nodiscard]] QVariantHash parse(const QByteArray &_source, [[nodiscard]] QVariantHash parse(const QByteArray &_source, const QVariantHash &_oldValues) const override;
const QVariantHash &_oldValues) const override;
[[nodiscard]] QUrl url() const override; [[nodiscard]] QUrl url() const override;
private: private:

View File

@ -49,8 +49,7 @@ void YahooQuotesProvider::initUrl(const QString &_asset)
} }
QVariantHash YahooQuotesProvider::parse(const QByteArray &_source, QVariantHash YahooQuotesProvider::parse(const QByteArray &_source, const QVariantHash &_oldValues) const
const QVariantHash &_oldValues) const
{ {
qCDebug(LOG_LIB) << "Parse json" << _source; qCDebug(LOG_LIB) << "Parse json" << _source;

View File

@ -32,8 +32,7 @@ public:
explicit YahooQuotesProvider(QObject *_parent); explicit YahooQuotesProvider(QObject *_parent);
~YahooQuotesProvider() override; ~YahooQuotesProvider() override;
void initUrl(const QString &_asset) override; void initUrl(const QString &_asset) override;
[[nodiscard]] QVariantHash parse(const QByteArray &_source, [[nodiscard]] QVariantHash parse(const QByteArray &_source, const QVariantHash &_oldValues) const override;
const QVariantHash &_oldValues) const override;
[[nodiscard]] QUrl url() const override; [[nodiscard]] QUrl url() const override;
private: private:

View File

@ -57,7 +57,7 @@ QVariantHash YahooWeatherProvider::parse(const QVariantMap &_json) const
QVariantMap jsonMap = _json["query"].toMap(); QVariantMap jsonMap = _json["query"].toMap();
if (jsonMap["count"].toInt() != 1) { if (jsonMap["count"].toInt() != 1) {
qCWarning(LOG_LIB) << "Found data count" << _json["count"].toInt() << "is not 1"; qCWarning(LOG_LIB) << "Found data count" << _json["count"].toInt() << "is not 1";
return QVariantHash(); return {};
} }
QVariantMap results = jsonMap["results"].toMap()["channel"].toMap(); QVariantMap results = jsonMap["results"].toMap()["channel"].toMap();
QVariantMap item = results["item"].toMap(); QVariantMap item = results["item"].toMap();
@ -73,8 +73,7 @@ QUrl YahooWeatherProvider::url() const
} }
QVariantHash YahooWeatherProvider::parseCurrent(const QVariantMap &_json, QVariantHash YahooWeatherProvider::parseCurrent(const QVariantMap &_json, const QVariantMap &_atmosphere) const
const QVariantMap &_atmosphere) const
{ {
qCDebug(LOG_LIB) << "Parse current weather from" << _json; qCDebug(LOG_LIB) << "Parse current weather from" << _json;
@ -99,8 +98,7 @@ QVariantHash YahooWeatherProvider::parseForecast(const QVariantMap &_json) const
QVariantHash values; QVariantHash values;
QVariantList weatherList = _json["forecast"].toList(); QVariantList weatherList = _json["forecast"].toList();
QVariantMap weatherMap QVariantMap weatherMap = weatherList.count() < m_ts ? weatherList.last().toMap() : weatherList.at(m_ts).toMap();
= weatherList.count() < m_ts ? weatherList.last().toMap() : weatherList.at(m_ts).toMap();
int id = weatherMap["code"].toInt(); int id = weatherMap["code"].toInt();
values[tag("weatherId")] = id; values[tag("weatherId")] = id;
values[tag("timestamp")] = weatherMap["date"].toString(); values[tag("timestamp")] = weatherMap["date"].toString();

View File

@ -38,8 +38,7 @@ public:
[[nodiscard]] QUrl url() const override; [[nodiscard]] QUrl url() const override;
private: private:
[[nodiscard]] QVariantHash parseCurrent(const QVariantMap &_json, [[nodiscard]] QVariantHash parseCurrent(const QVariantMap &_json, const QVariantMap &_atmosphere) const;
const QVariantMap &_atmosphere) const;
[[nodiscard]] QVariantHash parseForecast(const QVariantMap &_json) const; [[nodiscard]] QVariantHash parseForecast(const QVariantMap &_json) const;
int m_ts = 0; int m_ts = 0;
QUrl m_url; QUrl m_url;

View File

@ -1,5 +1,6 @@
exec_program( execute_process(
"sed -n '1,/^Ver/ p' CHANGELOG 2> /dev/null | grep -v '^Ver' | tr '\n' '@'" COMMAND "sed -n '1,/^Ver/ p' CHANGELOG 2> /dev/null | grep -v '^Ver' | tr '\n' '@'"
${CMAKE_CURRENT_SOURCE_DIR} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
OUTPUT_VARIABLE PROJECT_CHANGELOG OUTPUT_VARIABLE PROJECT_CHANGELOG
OUTPUT_STRIP_TRAILING_WHITESPACE
) )

View File

@ -1,9 +1,9 @@
exec_program( execute_process(
"git" COMMAND git log -1 --format=%h
${CMAKE_CURRENT_SOURCE_DIR} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
ARGS "log" "-1" "--format=\"%h\""
OUTPUT_VARIABLE COMMIT_SHA OUTPUT_VARIABLE COMMIT_SHA
RETURN_VALUE GIT_RETURN RESULT_VARIABLE GIT_RETURN
OUTPUT_STRIP_TRAILING_WHITESPACE
) )
if (${GIT_RETURN} EQUAL "0") if (${GIT_RETURN} EQUAL "0")

View File

@ -17,7 +17,7 @@ else ()
endif () endif ()
# some flags # some flags
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
# verbose output for debug builds # verbose output for debug builds

View File

@ -22,6 +22,5 @@ X-KDE-PluginInfo-Name=org.kde.plasma.desktoppanel
X-KDE-PluginInfo-Version=@PROJECT_VERSION@ X-KDE-PluginInfo-Version=@PROJECT_VERSION@
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-License=GPLv3 X-KDE-PluginInfo-License=GPLv3
X-KDE-PluginInfo-EnabledByDefault=true X-KDE-PluginInfo-EnabledByDefault=true

View File

@ -30,7 +30,7 @@
<default>¤</default> <default>¤</default>
</entry> </entry>
<entry name="tooltipType" type="string"> <entry name="tooltipType" type="string">
<default>windows</default> <default>contours</default>
</entry> </entry>
<entry name="tooltipWidth" type="int"> <entry name="tooltipWidth" type="int">
<default>200</default> <default>200</default>

View File

@ -147,14 +147,6 @@ Item {
'label': i18n("contours"), 'label': i18n("contours"),
'name': "contours" 'name': "contours"
}, },
{
'label': i18n("windows"),
'name': "windows"
},
{
'label': i18n("clean desktop"),
'name': "clean"
},
{ {
'label': i18n("names"), 'label': i18n("names"),
'name': "names" 'name': "names"

View File

@ -77,13 +77,13 @@ Item {
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
text: dpAdds.parsePattern(plasmoid.configuration.text, index + 1) text: dpAdds.parsePattern(plasmoid.configuration.text, index)
property alias tooltip: tooltip property alias tooltip: tooltip
MouseArea { MouseArea {
hoverEnabled: true hoverEnabled: true
anchors.fill: parent anchors.fill: parent
onClicked: dpAdds.setCurrentDesktop(index + 1) onClicked: dpAdds.setCurrentDesktop(index)
onEntered: needTooltipUpdate() onEntered: needTooltipUpdate()
} }
@ -117,11 +117,11 @@ Item {
timer.start() timer.start()
return return
} }
repeater.itemAt(i).text = dpAdds.parsePattern(plasmoid.configuration.text, i + 1) repeater.itemAt(i).text = dpAdds.parsePattern(plasmoid.configuration.text, i)
if (dpAdds.currentDesktop() == i + 1) { if (dpAdds.currentDesktop() == i) {
repeater.itemAt(i).color = plasmoid.configuration.currentFontColor repeater.itemAt(i).color = plasmoid.configuration.currentFontColor
repeater.itemAt(i).font.family = plasmoid.configuration.currentFontFamily repeater.itemAt(i).font.family = plasmoid.configuration.currentFontFamily
repeater.itemAt(i).font.italic = plasmoid.configuration.currentFontStyle == "italic" ? true : false repeater.itemAt(i).font.italic = plasmoid.configuration.currentFontStyle == "italic"
repeater.itemAt(i).font.pointSize = plasmoid.configuration.currentFontSize repeater.itemAt(i).font.pointSize = plasmoid.configuration.currentFontSize
repeater.itemAt(i).font.weight = General.fontWeight[plasmoid.configuration.currentFontWeight] repeater.itemAt(i).font.weight = General.fontWeight[plasmoid.configuration.currentFontWeight]
repeater.itemAt(i).style = General.textStyle[plasmoid.configuration.currentTextStyle] repeater.itemAt(i).style = General.textStyle[plasmoid.configuration.currentTextStyle]
@ -129,7 +129,7 @@ Item {
} else { } else {
repeater.itemAt(i).color = plasmoid.configuration.fontColor repeater.itemAt(i).color = plasmoid.configuration.fontColor
repeater.itemAt(i).font.family = plasmoid.configuration.fontFamily repeater.itemAt(i).font.family = plasmoid.configuration.fontFamily
repeater.itemAt(i).font.italic = plasmoid.configuration.fontStyle == "italic" ? true : false repeater.itemAt(i).font.italic = plasmoid.configuration.fontStyle == "italic"
repeater.itemAt(i).font.pointSize = plasmoid.configuration.fontSize repeater.itemAt(i).font.pointSize = plasmoid.configuration.fontSize
repeater.itemAt(i).font.weight = General.fontWeight[plasmoid.configuration.fontWeight] repeater.itemAt(i).font.weight = General.fontWeight[plasmoid.configuration.fontWeight]
repeater.itemAt(i).style = General.textStyle[plasmoid.configuration.textStyle] repeater.itemAt(i).style = General.textStyle[plasmoid.configuration.textStyle]
@ -146,7 +146,7 @@ Item {
if (debug) console.debug() if (debug) console.debug()
for (var i=0; i<repeater.count; i++) { for (var i=0; i<repeater.count; i++) {
repeater.itemAt(i).tooltip.text = dpAdds.toolTipImage(i + 1) repeater.itemAt(i).tooltip.text = dpAdds.toolTipImage(i)
// resize text tooltip to content size // resize text tooltip to content size
// this hack does not work for images-based tooltips // this hack does not work for images-based tooltips
if (tooltipSettings.tooltipType == "names") { if (tooltipSettings.tooltipType == "names") {

View File

@ -19,9 +19,8 @@ X-Plasma-MainScript=ui/main.qml
X-KDE-PluginInfo-Author=Evgeniy Alekseev aka arcanis X-KDE-PluginInfo-Author=Evgeniy Alekseev aka arcanis
X-KDE-PluginInfo-Email=esalexeev@gmail.com X-KDE-PluginInfo-Email=esalexeev@gmail.com
X-KDE-PluginInfo-Name=org.kde.plasma.desktoppanel X-KDE-PluginInfo-Name=org.kde.plasma.desktoppanel
X-KDE-PluginInfo-Version=3.4.3 X-KDE-PluginInfo-Version=3.5.0
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-License=GPLv3 X-KDE-PluginInfo-License=GPLv3
X-KDE-PluginInfo-EnabledByDefault=true X-KDE-PluginInfo-EnabledByDefault=true

View File

@ -20,6 +20,10 @@
#include <KI18n/KLocalizedString> #include <KI18n/KLocalizedString>
#include <KNotifications/KNotification> #include <KNotifications/KNotification>
#include <KWindowSystem/KWindowSystem> #include <KWindowSystem/KWindowSystem>
#include <taskmanager/virtualdesktopinfo.h>
#include <taskmanager/waylandtasksmodel.h>
#include <taskmanager/windowtasksmodel.h>
#include <taskmanager/xwindowtasksmodel.h>
#include <QBuffer> #include <QBuffer>
#include <QGraphicsPixmapItem> #include <QGraphicsPixmapItem>
@ -42,8 +46,10 @@ DPAdds::DPAdds(QObject *_parent)
for (auto &metadata : AWDebug::getBuildData()) for (auto &metadata : AWDebug::getBuildData())
qCDebug(LOG_DP) << metadata; qCDebug(LOG_DP) << metadata;
connect(KWindowSystem::self(), SIGNAL(currentDesktopChanged(int)), this, m_vdi = new TaskManager::VirtualDesktopInfo(this);
SIGNAL(desktopChanged())); m_taskModel = new TaskManager::WindowTasksModel(this);
connect(m_vdi, SIGNAL(currentDesktopChanged()), this, SIGNAL(desktopChanged()));
connect(KWindowSystem::self(), SIGNAL(windowAdded(WId)), this, SIGNAL(windowListChanged())); connect(KWindowSystem::self(), SIGNAL(windowAdded(WId)), this, SIGNAL(windowListChanged()));
connect(KWindowSystem::self(), SIGNAL(windowRemoved(WId)), this, SIGNAL(windowListChanged())); connect(KWindowSystem::self(), SIGNAL(windowRemoved(WId)), this, SIGNAL(windowListChanged()));
} }
@ -52,6 +58,9 @@ DPAdds::DPAdds(QObject *_parent)
DPAdds::~DPAdds() DPAdds::~DPAdds()
{ {
qCDebug(LOG_DP) << __PRETTY_FUNCTION__; qCDebug(LOG_DP) << __PRETTY_FUNCTION__;
m_vdi->deleteLater();
m_taskModel->deleteLater();
} }
@ -62,9 +71,11 @@ bool DPAdds::isDebugEnabled()
} }
int DPAdds::currentDesktop() int DPAdds::currentDesktop() const
{ {
return KWindowSystem::currentDesktop(); auto current = m_vdi->currentDesktop();
auto decrement = KWindowSystem::isPlatformX11() ? 1 : 0;
return m_vdi->position(current) - decrement;
} }
@ -85,9 +96,9 @@ QStringList DPAdds::dictKeys(const bool _sorted, const QString &_regexp)
} }
int DPAdds::numberOfDesktops() int DPAdds::numberOfDesktops() const
{ {
return KWindowSystem::numberOfDesktops(); return m_vdi->numberOfDesktops();
} }
@ -117,12 +128,17 @@ QString DPAdds::toolTipImage(const int _desktop) const
toolTipView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); toolTipView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
toolTipView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); toolTipView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
auto screens = QGuiApplication::screens();
auto desktop
= std::accumulate(screens.cbegin(), screens.cend(), QRect(0, 0, 0, 0), [](QRect source, const QScreen *screen) {
return source.united(screen->availableGeometry());
});
// update // update
auto width = static_cast<float>(info.desktop.width()); auto width = static_cast<float>(desktop.width());
auto height = static_cast<float>(info.desktop.height()); auto height = static_cast<float>(desktop.height());
float margin = 5.0f * width / 400.0f; float margin = 5.0f * width / 400.0f;
toolTipView->resize(static_cast<int>(width + 2.0f * margin), toolTipView->resize(static_cast<int>(width + 2.0f * margin), static_cast<int>(height + 2.0f * margin));
static_cast<int>(height + 2.0f * margin));
toolTipScene->clear(); toolTipScene->clear();
toolTipScene->setBackgroundBrush(QBrush(Qt::NoBrush)); toolTipScene->setBackgroundBrush(QBrush(Qt::NoBrush));
// borders // borders
@ -131,45 +147,20 @@ QString DPAdds::toolTipImage(const int _desktop) const
toolTipScene->addLine(width + 2.0 * margin, height + 2.0 * margin, width + 2.0 * margin, 0); toolTipScene->addLine(width + 2.0 * margin, height + 2.0 * margin, width + 2.0 * margin, 0);
toolTipScene->addLine(width + 2.0 * margin, 0, 0, 0); toolTipScene->addLine(width + 2.0 * margin, 0, 0, 0);
if (m_tooltipType == "contours") { // with wayland countours only are supported
QPen pen = QPen(); QPen pen = QPen();
pen.setWidthF(2.0 * width / 400.0); pen.setWidthF(2.0 * width / 400.0);
pen.setColor(QColor(m_tooltipColor)); pen.setColor(QColor(m_tooltipColor));
for (auto &data : info.windowsData) { for (auto &data : info.windowsData) {
QRect rect = data.rect; QRect rect = data.rect;
auto left = static_cast<float>(rect.left()); auto left = static_cast<float>(rect.left());
auto right = static_cast<float>(rect.right()); auto right = static_cast<float>(rect.right());
auto top = static_cast<float>(rect.top()); auto top = static_cast<float>(rect.top());
auto bottom = static_cast<float>(rect.bottom()); auto bottom = static_cast<float>(rect.bottom());
toolTipScene->addLine(left + margin, bottom + margin, left + margin, top + margin, pen); toolTipScene->addLine(left + margin, bottom + margin, left + margin, top + margin, pen);
toolTipScene->addLine(left + margin, top + margin, right + margin, top + margin, pen); toolTipScene->addLine(left + margin, top + margin, right + margin, top + margin, pen);
toolTipScene->addLine(right + margin, top + margin, right + margin, bottom + margin, toolTipScene->addLine(right + margin, top + margin, right + margin, bottom + margin, pen);
pen); toolTipScene->addLine(right + margin, bottom + margin, left + margin, bottom + margin, pen);
toolTipScene->addLine(right + margin, bottom + margin, left + margin, bottom + margin,
pen);
}
} else if (m_tooltipType == "clean") {
QScreen *screen = QGuiApplication::primaryScreen();
std::for_each(info.desktopsData.cbegin(), info.desktopsData.cend(),
[&toolTipScene, &screen](const WindowData &data) {
QPixmap desktop = screen->grabWindow(data.id);
toolTipScene->addPixmap(desktop)->setOffset(data.rect.left(),
data.rect.top());
});
} else if (m_tooltipType == "windows") {
QScreen *screen = QGuiApplication::primaryScreen();
std::for_each(info.desktopsData.cbegin(), info.desktopsData.cend(),
[&toolTipScene, &screen](const WindowData &data) {
QPixmap desktop = screen->grabWindow(data.id);
toolTipScene->addPixmap(desktop)->setOffset(data.rect.left(),
data.rect.top());
});
std::for_each(info.windowsData.cbegin(), info.windowsData.cend(),
[&toolTipScene, &screen](const WindowData &data) {
QPixmap window = screen->grabWindow(data.id);
toolTipScene->addPixmap(window)->setOffset(data.rect.left(),
data.rect.top());
});
} }
QPixmap image = toolTipView->grab().scaledToWidth(m_tooltipWidth); QPixmap image = toolTipView->grab().scaledToWidth(m_tooltipWidth);
@ -232,13 +223,12 @@ QString DPAdds::valueByKey(const QString &_key, int _desktop) const
QString currentMark = currentDesktop() == _desktop ? m_mark : ""; QString currentMark = currentDesktop() == _desktop ? m_mark : "";
if (_key == "mark") if (_key == "mark")
return QString("%1") return QString("%1").arg(currentMark, m_mark.count(), QLatin1Char(' ')).replace(" ", "&nbsp;");
.arg(currentMark, m_mark.count(), QLatin1Char(' ')) else if (_key == "name") {
.replace(" ", "&nbsp;"); auto name = m_vdi->desktopNames().at(_desktop);
else if (_key == "name") return name.replace(" ", "&nbsp;");
return KWindowSystem::desktopName(_desktop).replace(" ", "&nbsp;"); } else if (_key == "number")
else if (_key == "number") return QString::number(_desktop + 1);
return QString::number(_desktop);
else if (_key == "total") else if (_key == "total")
return QString::number(numberOfDesktops()); return QString::number(numberOfDesktops());
else else
@ -261,8 +251,8 @@ QVariantMap DPAdds::getFont(const QVariantMap &_defaultFont)
QVariantMap fontMap; QVariantMap fontMap;
int ret = 0; int ret = 0;
CFont defaultCFont = CFont(_defaultFont["family"].toString(), _defaultFont["size"].toInt(), 400, CFont defaultCFont = CFont(_defaultFont["family"].toString(), _defaultFont["size"].toInt(), 400, false,
false, _defaultFont["color"].toString()); _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;
@ -290,35 +280,34 @@ void DPAdds::setCurrentDesktop(const int _desktop)
{ {
qCDebug(LOG_DP) << "Desktop" << _desktop; qCDebug(LOG_DP) << "Desktop" << _desktop;
KWindowSystem::setCurrentDesktop(_desktop); m_vdi->requestActivate(m_vdi->desktopIds().at(_desktop));
} }
DPAdds::DesktopWindowsInfo DPAdds::getInfoByDesktop(const int _desktop) DPAdds::DesktopWindowsInfo DPAdds::getInfoByDesktop(const int _desktop) const
{ {
qCDebug(LOG_DP) << "Desktop" << _desktop; qCDebug(LOG_DP) << "Desktop" << _desktop;
auto desktop = m_vdi->desktopIds().at(_desktop);
DesktopWindowsInfo info; DesktopWindowsInfo info;
info.desktop = KWindowSystem::workArea(_desktop); for (auto i = 0; i < m_taskModel->rowCount(); i++) {
auto model = m_taskModel->index(i, 0);
for (auto &id : KWindowSystem::windows()) {
KWindowInfo winInfo = KWindowInfo(
id, NET::Property::WMDesktop | NET::Property::WMGeometry | NET::Property::WMState
| NET::Property::WMWindowType | NET::Property::WMVisibleName);
if (!winInfo.isOnDesktop(_desktop))
continue;
WindowData data; WindowData data;
data.id = id;
data.name = winInfo.visibleName(); data.name = model.data(TaskManager::AbstractTasksModel::AppName).toString();
data.rect = winInfo.geometry(); data.rect = model.data(TaskManager::AbstractTasksModel::Geometry).toRect();
if (winInfo.windowType(NET::WindowTypeMask::NormalMask) == NET::WindowType::Normal) {
if (winInfo.isMinimized()) auto desktops = model.data(TaskManager::AbstractTasksModel::VirtualDesktops).toList();
if (desktops.isEmpty()) {
// don't think it is possible to put desktop to desktop
info.desktopsData.append(data);
} else {
auto isHidden = model.data(TaskManager::AbstractTasksModel::IsHidden).toBool();
auto isMinimized = model.data(TaskManager::AbstractTasksModel::IsMinimized).toBool();
if (isHidden || isMinimized || !desktops.contains(desktop))
continue; continue;
info.windowsData.append(data); info.windowsData.append(data);
} else if (winInfo.windowType(NET::WindowTypeMask::DesktopMask)
== NET::WindowType::Desktop) {
info.desktopsData.append(data);
} }
} }

View File

@ -24,18 +24,21 @@
#include <QRect> #include <QRect>
namespace TaskManager
{
class VirtualDesktopInfo;
class WindowTasksModel;
} // namespace TaskManager
class DPAdds : public QObject class DPAdds : public QObject
{ {
Q_OBJECT Q_OBJECT
typedef struct { typedef struct {
WId id;
QString name; QString name;
QRect rect; QRect rect;
} WindowData; } WindowData;
typedef struct { typedef struct {
QRect desktop;
QList<WindowData> desktopsData; QList<WindowData> desktopsData;
QList<WindowData> windowsData; QList<WindowData> windowsData;
} DesktopWindowsInfo; } DesktopWindowsInfo;
@ -44,9 +47,9 @@ public:
explicit DPAdds(QObject *_parent = nullptr); explicit DPAdds(QObject *_parent = nullptr);
~DPAdds() override; ~DPAdds() override;
Q_INVOKABLE static bool isDebugEnabled(); Q_INVOKABLE static bool isDebugEnabled();
Q_INVOKABLE static int currentDesktop(); Q_INVOKABLE [[nodiscard]] int currentDesktop() const;
Q_INVOKABLE static QStringList dictKeys(bool _sorted = true, const QString &_regexp = ""); Q_INVOKABLE static QStringList dictKeys(bool _sorted = true, const QString &_regexp = "");
Q_INVOKABLE static int numberOfDesktops(); Q_INVOKABLE [[nodiscard]] int numberOfDesktops() const;
Q_INVOKABLE [[nodiscard]] QString toolTipImage(int _desktop) const; Q_INVOKABLE [[nodiscard]] QString toolTipImage(int _desktop) const;
Q_INVOKABLE [[nodiscard]] QString parsePattern(const QString &_pattern, int _desktop) const; Q_INVOKABLE [[nodiscard]] QString parsePattern(const QString &_pattern, int _desktop) const;
// values // values
@ -64,11 +67,13 @@ signals:
public slots: public slots:
Q_INVOKABLE static void sendNotification(const QString &_eventId, const QString &_message); Q_INVOKABLE static void sendNotification(const QString &_eventId, const QString &_message);
Q_INVOKABLE static void setCurrentDesktop(int _desktop); Q_INVOKABLE void setCurrentDesktop(int _desktop);
private: private:
static DesktopWindowsInfo getInfoByDesktop(int _desktop); [[nodiscard]] DesktopWindowsInfo getInfoByDesktop(int _desktop) const;
// variables // variables
TaskManager::VirtualDesktopInfo *m_vdi = nullptr;
TaskManager::WindowTasksModel *m_taskModel = nullptr;
int m_tooltipWidth = 200; int m_tooltipWidth = 200;
QString m_mark = "*"; QString m_mark = "*";
QString m_tooltipColor = "#000000"; QString m_tooltipColor = "#000000";

View File

@ -86,8 +86,7 @@ bool ExtendedSysMon::updateSourceEvent(const QString &_source)
void ExtendedSysMon::readConfiguration() void ExtendedSysMon::readConfiguration()
{ {
QString fileName = QStandardPaths::locate(QStandardPaths::ConfigLocation, QString fileName = QStandardPaths::locate(QStandardPaths::ConfigLocation, "plasma-dataengine-extsysmon.conf");
"plasma-dataengine-extsysmon.conf");
qCInfo(LOG_ESM) << "Configuration file" << fileName; qCInfo(LOG_ESM) << "Configuration file" << fileName;
QSettings settings(fileName, QSettings::IniFormat); QSettings settings(fileName, QSettings::IniFormat);
QHash<QString, QString> rawConfig; QHash<QString, QString> rawConfig;
@ -138,8 +137,7 @@ QHash<QString, QString> ExtendedSysMon::updateConfiguration(QHash<QString, QStri
_rawConfig["HDDDEV"] = devices.join(','); _rawConfig["HDDDEV"] = devices.join(',');
} }
// player // player
if ((_rawConfig["PLAYER"] != "mpd") && (_rawConfig["PLAYER"] != "mpris") if ((_rawConfig["PLAYER"] != "mpd") && (_rawConfig["PLAYER"] != "mpris") && (_rawConfig["PLAYER"] != "disable"))
&& (_rawConfig["PLAYER"] != "disable"))
_rawConfig["PLAYER"] = "mpris"; _rawConfig["PLAYER"] = "mpris";
// player symbols // player symbols
if (_rawConfig["PLAYERSYMBOLS"].toInt() <= 0) if (_rawConfig["PLAYERSYMBOLS"].toInt() <= 0)

View File

@ -42,8 +42,7 @@ private:
QHash<QString, QString> m_configuration; QHash<QString, QString> m_configuration;
// methods // methods
void readConfiguration(); void readConfiguration();
[[nodiscard]] static QHash<QString, QString> [[nodiscard]] static QHash<QString, QString> updateConfiguration(QHash<QString, QString> _rawConfig);
updateConfiguration(QHash<QString, QString> _rawConfig);
}; };

View File

@ -87,8 +87,7 @@ void ExtSysMonAggregator::init(const QHash<QString, QString> &_config)
qCDebug(LOG_ESM) << "Configuration" << _config; qCDebug(LOG_ESM) << "Configuration" << _config;
// battery // battery
AbstractExtSysMonSource *batteryItem AbstractExtSysMonSource *batteryItem = new BatterySource(this, QStringList() << _config["ACPIPATH"]);
= new BatterySource(this, QStringList() << _config["ACPIPATH"]);
for (auto &source : batteryItem->sources()) for (auto &source : batteryItem->sources())
m_map[source] = batteryItem; m_map[source] = batteryItem;
// custom // custom
@ -100,13 +99,11 @@ void ExtSysMonAggregator::init(const QHash<QString, QString> &_config)
for (auto &source : desktopItem->sources()) for (auto &source : desktopItem->sources())
m_map[source] = desktopItem; m_map[source] = desktopItem;
// gpu load // gpu load
AbstractExtSysMonSource *gpuLoadItem AbstractExtSysMonSource *gpuLoadItem = new GPULoadSource(this, QStringList({_config["GPUDEV"]}));
= new GPULoadSource(this, QStringList({_config["GPUDEV"]}));
for (auto &source : gpuLoadItem->sources()) for (auto &source : gpuLoadItem->sources())
m_map[source] = gpuLoadItem; m_map[source] = gpuLoadItem;
// gpu temperature // gpu temperature
AbstractExtSysMonSource *gpuTempItem AbstractExtSysMonSource *gpuTempItem = new GPUTemperatureSource(this, QStringList({_config["GPUDEV"]}));
= new GPUTemperatureSource(this, QStringList({_config["GPUDEV"]}));
for (auto &source : gpuTempItem->sources()) for (auto &source : gpuTempItem->sources())
m_map[source] = gpuTempItem; m_map[source] = gpuTempItem;
// hdd temperature // hdd temperature
@ -119,9 +116,9 @@ void ExtSysMonAggregator::init(const QHash<QString, QString> &_config)
for (auto &source : networkItem->sources()) for (auto &source : networkItem->sources())
m_map[source] = networkItem; m_map[source] = networkItem;
// player // player
AbstractExtSysMonSource *playerItem = new PlayerSource( AbstractExtSysMonSource *playerItem
this, QStringList({_config["PLAYER"], _config["MPDADDRESS"], _config["MPDPORT"], = new PlayerSource(this, QStringList({_config["PLAYER"], _config["MPDADDRESS"], _config["MPDPORT"],
_config["MPRIS"], _config["PLAYERSYMBOLS"]})); _config["MPRIS"], _config["PLAYERSYMBOLS"]}));
for (auto &source : playerItem->sources()) for (auto &source : playerItem->sources())
m_map[source] = playerItem; m_map[source] = playerItem;
// processes // processes

View File

@ -13,5 +13,4 @@ X-KDE-PluginInfo-Email=esalexeev@gmail.com
X-KDE-PluginInfo-Name=extsysmon X-KDE-PluginInfo-Name=extsysmon
X-KDE-PluginInfo-Version=@PROJECT_VERSION@ X-KDE-PluginInfo-Version=@PROJECT_VERSION@
X-KDE-PluginInfo-Category=System Information X-KDE-PluginInfo-Category=System Information
X-KDE-PluginInfo-Depends=
X-KDE-PluginInfo-License=GPL3 X-KDE-PluginInfo-License=GPL3

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