Compare commits

..

31 Commits

Author SHA1 Message Date
63f1aa8125 release alpha2 2024-03-27 02:36:13 +02:00
3c8bf1baf1 test cases update 2024-03-27 02:30:08 +02:00
3f20aa8878 massive qml edit 2024-03-27 01:45:35 +02:00
4fcea42e8e qml improvements 2024-03-26 15:41:34 +02:00
0b2b58bd33 gpu support 2024-03-26 10:39:09 +02:00
7b60e8a42f disablle deskttop soourec 2024-03-25 15:31:42 +02:00
161ff64293 Release 4.0.0 2024-03-25 14:04:30 +02:00
115bef3dbe correct subscription processing 2024-03-24 00:42:03 +02:00
b6ade7310a extend temperature sensors 2024-03-23 15:30:35 +02:00
0555185044 add time source 2024-03-23 15:11:49 +02:00
23e197789f make it build together 2024-03-23 13:57:28 +02:00
67640cccdc do not derive from qwidget in aggregates 2024-03-22 16:57:47 +02:00
33a41bb6c0 do not derive from qwidget 2024-03-21 16:51:29 +02:00
42c11a6b60 port dataengin 2024-03-20 18:45:17 +02:00
423597dbd9 port widget to dbus 2024-03-15 15:51:23 +02:00
0fcfb7d7e4 port library 2024-03-08 16:22:00 +02:00
5fd3a4a21a update to plasma 6 support 2024-03-07 12:09:46 +02:00
eecb128865 Release 3.5.1 2023-05-18 13:02:44 +03:00
0565d3533f correct desktop indices for main widget 2023-05-18 12:53:51 +03:00
88f70c0ea6 Release 3.5.0 2023-05-18 02:57:31 +03:00
338828da88 add release pipeline 2023-05-18 01:41:48 +03:00
09a3c32d0c fix some found warning 2023-05-17 21:37:00 +03:00
e9beea2d7a create workflow run 2023-05-17 18:23:58 +03:00
1e69aa93f5 add support of hidden flag 2023-05-17 14:11:58 +03:00
73f1617cbf Merge pull request #156 from arcan1s/feature/wayland-support
wayland support
2023-05-17 03:48:20 +03:00
dea9d488df wayland support 2023-05-17 03:42:40 +03:00
84de9755b5 fix (some) KF deprecation warnings 2023-03-30 03:31:57 +03:00
ff40ac96d8 update dependencies list 2021-07-07 22:09:44 +03:00
de9d90df4a Release 3.4.3
compilation fixes for old ubuntu and provide patch for old qt versions
2021-01-08 15:48:20 +03:00
883659272d add patch for qt < 5.14 2021-01-08 11:17:11 +03:00
0c443e9278 do not use nodiscard for slots (#147) 2021-01-08 10:52:57 +03:00
233 changed files with 3415 additions and 4600 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,12 +0,0 @@
FROM ubuntu:bionic
RUN apt-get update
# toolchain
RUN apt-get install -y cmake extra-cmake-modules g++ git gettext
# kf5 and qt5 libraries
RUN apt-get install -y libkf5i18n-dev libkf5notifications-dev libkf5service-dev \
libkf5windowsystem-dev plasma-framework-dev qtbase5-dev qtdeclarative5-dev \
plasma-framework
# required by tests
RUN apt-get install -y xvfb

View File

@ -1,12 +0,0 @@
FROM multiarch/ubuntu-core:i386-bionic
RUN apt-get update
# toolchain
RUN apt-get install -y cmake extra-cmake-modules g++ git gettext
# kf5 and qt5 libraries
RUN apt-get install -y libkf5i18n-dev libkf5notifications-dev libkf5service-dev \
libkf5windowsystem-dev plasma-framework-dev qtbase5-dev qtdeclarative5-dev \
plasma-framework
# required by tests
RUN apt-get install -y 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,16 +0,0 @@
#!/bin/bash
set -e
rm -rf build-ubuntu
mkdir build-ubuntu
# patches
#git apply patches/qt5.6-qversionnumber.patch
#git apply patches/qt5.5-qstringlist-and-qinfo.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,18 +0,0 @@
#!/bin/bash
set -e
rm -rf build-ubuntu
mkdir build-ubuntu
# patches
git apply patches/qt5.6-qversionnumber.patch
git apply patches/qt5.5-qstringlist-and-qinfo.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
- name: configure cmake
run: cmake -B build -S sources -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DBUILD_FUTURE=ON -DBUILD_TESTING=ON
- 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,11 @@
Ver.4.0.0:
* migration to plasma 6
Ver.3.5.0:
+ wayland support
* update code to latest standards
- drop support of windows preview
Ver.3.4.2:
+ Italian translation (#136, thanks to @avivace)
+ stooq quotes support (default) (#131)
@ -7,7 +15,6 @@ Ver.3.4.2:
* update to new qt api
- fix non printable spaces (#142, #143)
Ver.3.3.3:
+ add custom keys support (#101)
* DBus interface improvements

View File

@ -1,7 +1,7 @@
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)
Information
@ -31,6 +31,7 @@ Dependencies
------------
* plasma-framework
* ksysguard (since plasma 5.22)
Optional dependencies
---------------------
@ -61,10 +62,6 @@ Installation
**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
======================

View File

@ -1,32 +1,20 @@
#!/bin/bash
SRCDIR="sources"
MAJOR=$(grep -m1 PROJECT_VERSION_MAJOR sources/CMakeLists.txt | awk '{print $2}' | sed 's/^.\(.*\)..$/\1/')
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
VERSION="$(git describe --tags --abbrev=0)"
# build widget
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"
# create archive
[[ -e ${ARCHIVE}-${VERSION}-src.tar.xz ]] && rm -f "${ARCHIVE}-${VERSION}-src.tar.xz"
[[ -d ${ARCHIVE} ]] && rm -rf "${ARCHIVE}"
cp -r "${SRCDIR}" "${ARCHIVE}"
for FILE in ${FILES[*]}; do cp -r "$FILE" "${ARCHIVE}"; 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
MD5SUMS=$(md5sum ${ARCHIVE}-${VERSION}-src.tar.xz | awk '{print $1}')
sed -i "/md5sums=('[0-9A-Fa-f]*/s/[^'][^)]*/md5sums=('${MD5SUMS}'/" packages/PKGBUILD
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 {} \;
tar cJf "${ARCHIVE}-${VERSION}-src.tar.xz" "${ARCHIVE}"
rm -rf "${ARCHIVE}"

View File

@ -1,41 +1,30 @@
# Maintainer: Evgeniy Alekseev <arcanis at archlinux dot org>
pkgname=plasma5-applet-awesome-widgets
pkgname=plasma6-applet-awesome-widgets
_pkgname=awesome-widgets
pkgver=3.4.2
pkgver=4.0.0alpha2
pkgrel=1
pkgdesc="Collection of minimalistic Plasmoids which look like Awesome WM widgets (ex-PyTextMonitor)"
arch=('i686' 'x86_64')
arch=('x86_64')
url="https://arcanis.me/projects/awesome-widgets"
license=('GPL3')
depends=('plasma-framework')
optdepends=("catalyst: for GPU monitor"
"hddtemp: for HDD temperature monitor"
"smartmontools: for HDD temperature monitor"
"mpd: for music player monitor"
"nvidia-utils: for GPU monitor")
depends=('plasma-workspace')
optdepends=("mpd: for music player monitor")
makedepends=('cmake' 'extra-cmake-modules' 'python')
source=(https://github.com/arcan1s/awesome-widgets/releases/download/V.${pkgver}/${_pkgname}-${pkgver}-src.tar.xz)
install=${pkgname}.install
md5sums=('df3ad1c626fdc1893f0f6e0b0fe636c2')
source=(https://github.com/arcan1s/awesome-widgets/releases/download/${pkgver}/${_pkgname}-${pkgver}-src.tar.xz)
install="$pkgname.install"
backup=('etc/xdg/plasma-dataengine-extsysmon.conf')
prepare() {
rm -rf "${srcdir}/build"
mkdir "${srcdir}/build"
}
build () {
cd "${srcdir}/build"
cmake -DKDE_INSTALL_USE_QT_SYS_PATHS=ON \
-DCMAKE_BUILD_TYPE=Optimization \
-DCMAKE_INSTALL_PREFIX=/usr \
-DBUILD_FUTURE=ON \
"../${_pkgname}"
make
cmake -B build -S "${_pkgname}" \
-DCMAKE_BUILD_TYPE=Optimization \
-DBUILD_FUTURE=ON \
-DBUILD_TESTING=OFF
cmake --build build
}
package() {
cd "${srcdir}/build"
make DESTDIR="${pkgdir}" install
DESTDIR="$pkgdir" cmake --install build
}
sha256sums=('b2a7b07a1df6f710f4e0d6e5898933f4ddb131818b922dc4b8e48afe3e98a664')

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,33 +0,0 @@
diff --git a/sources/awdebug.h b/sources/awdebug.h
index 8447c65..4eef49a 100644
--- a/sources/awdebug.h
+++ b/sources/awdebug.h
@@ -23,10 +23,15 @@
#include "version.h"
+#ifndef qCInfo
+#define qCInfo qCDebug
+#endif
+
+
namespace AWDebug
{
const char LOG_FORMAT[] = "[%{time "
- "process}][%{if-debug}DD%{endif}%{if-info}II%{endif}%"
+ "process}][%{if-debug}DD%{endif}%"
"{if-warning}WW%{endif}%{if-critical}CC%{endif}%{if-"
"fatal}FF%{endif}][%{category}][%{function}] "
"%{message}";
diff --git a/sources/awesome-widget/plugin/awkeysaggregator.h b/sources/awesome-widget/plugin/awkeysaggregator.h
index d6d5d1a..ee301df 100644
--- a/sources/awesome-widget/plugin/awkeysaggregator.h
+++ b/sources/awesome-widget/plugin/awkeysaggregator.h
@@ -21,6 +21,7 @@
#include <QHash>
#include <QObject>
+#include <QStringList>
class AWFormatterHelper;

View File

@ -1,139 +0,0 @@
diff --git a/sources/awesome-widget/plugin/awupdatehelper.cpp b/sources/awesome-widget/plugin/awupdatehelper.cpp
index f6b5338..b5a3163 100644
--- a/sources/awesome-widget/plugin/awupdatehelper.cpp
+++ b/sources/awesome-widget/plugin/awupdatehelper.cpp
@@ -35,7 +35,7 @@ AWUpdateHelper::AWUpdateHelper(QObject *_parent)
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
- m_foundVersion = QVersionNumber::fromString(VERSION);
+ m_foundVersion = VERSION;
m_genericConfig = QString("%1/awesomewidgets/general.ini")
.arg(QStandardPaths::writableLocation(
QStandardPaths::GenericDataLocation));
@@ -67,8 +67,7 @@ void AWUpdateHelper::checkUpdates(const bool _showAnyway)
bool AWUpdateHelper::checkVersion()
{
QSettings settings(m_genericConfig, QSettings::IniFormat);
- QVersionNumber version = QVersionNumber::fromString(
- settings.value("Version", QString(VERSION)).toString());
+ QString version = settings.value("Version", VERSION).toString();
// update version
settings.setValue("Version", QString(VERSION));
settings.sync();
@@ -91,12 +90,11 @@ bool AWUpdateHelper::checkVersion()
}
-void AWUpdateHelper::showInfo(const QVersionNumber &_version)
+void AWUpdateHelper::showInfo(const QString &_version)
{
qCDebug(LOG_AW) << "Version" << _version;
- QString text
- = i18n("You are using the actual version %1", _version.toString());
+ QString text = i18n("You are using the actual version %1", _version);
if (!QString(COMMIT_SHA).isEmpty())
text += QString(" (%1)").arg(QString(COMMIT_SHA));
return genMessageBox(i18n("No new version found"), text, QMessageBox::Ok)
@@ -104,7 +102,7 @@ void AWUpdateHelper::showInfo(const QVersionNumber &_version)
}
-void AWUpdateHelper::showUpdates(const QVersionNumber &_version)
+void AWUpdateHelper::showUpdates(const QString &_version)
{
qCDebug(LOG_AW) << "Version" << _version;
@@ -113,7 +111,7 @@ void AWUpdateHelper::showUpdates(const QVersionNumber &_version)
text += QString(COMMIT_SHA).isEmpty()
? "\n"
: QString(" (%1)\n").arg(QString(COMMIT_SHA));
- text += i18n("New version : %1", _version.toString()) + "\n\n";
+ text += i18n("New version : %1", _version) + "\n\n";
text += i18n("Click \"Ok\" to download");
genMessageBox(i18n("There are updates"), text,
@@ -130,8 +128,7 @@ void AWUpdateHelper::userReplyOnUpdates(QAbstractButton *_button)
switch (ret) {
case QMessageBox::AcceptRole:
- QDesktopServices::openUrl(QString(RELEASES)
- + m_foundVersion.toString());
+ QDesktopServices::openUrl(QString(RELEASES) + m_foundVersion);
break;
case QMessageBox::RejectRole:
default:
@@ -162,14 +159,23 @@ void AWUpdateHelper::versionReplyRecieved(QNetworkReply *_reply,
QVariantMap firstRelease = jsonDoc.toVariant().toList().first().toMap();
QString version = firstRelease["tag_name"].toString();
version.remove("V.");
- m_foundVersion = QVersionNumber::fromString(version);
+ m_foundVersion = version;
qCInfo(LOG_AW) << "Update found version to" << m_foundVersion;
- QVersionNumber oldVersion = QVersionNumber::fromString(VERSION);
- if (oldVersion < m_foundVersion)
- return showUpdates(m_foundVersion);
+ // FIXME: possible there is a better way to check versions
+ int old_major = QString(VERSION).split(QChar('.')).at(0).toInt();
+ int old_minor = QString(VERSION).split(QChar('.')).at(1).toInt();
+ int old_patch = QString(VERSION).split(QChar('.')).at(2).toInt();
+ int new_major = version.split(QChar('.')).at(0).toInt();
+ int new_minor = version.split(QChar('.')).at(1).toInt();
+ int new_patch = version.split(QChar('.')).at(2).toInt();
+ if ((old_major < new_major)
+ || ((old_major == new_major) && (old_minor < new_minor))
+ || ((old_major == new_major) && (old_minor == new_minor)
+ && (old_patch < new_patch)))
+ return showUpdates(version);
else if (_showAnyway)
- return showInfo(m_foundVersion);
+ return showInfo(version);
}
diff --git a/sources/awesome-widget/plugin/awupdatehelper.h b/sources/awesome-widget/plugin/awupdatehelper.h
index cfd26e7..b311be2 100644
--- a/sources/awesome-widget/plugin/awupdatehelper.h
+++ b/sources/awesome-widget/plugin/awupdatehelper.h
@@ -21,7 +21,6 @@
#include <QMessageBox>
#include <QObject>
-#include <QVersionNumber>
class QNetworkReply;
@@ -37,15 +36,15 @@ public:
bool checkVersion();
private slots:
- void showInfo(const QVersionNumber &_version);
- void showUpdates(const QVersionNumber &_version);
+ void showInfo(const QString &_version);
+ void showUpdates(const QString &_version);
void userReplyOnUpdates(QAbstractButton *_button);
void versionReplyRecieved(QNetworkReply *_reply, const bool _showAnyway);
private:
QMessageBox *genMessageBox(const QString &_title, const QString &_body,
const QMessageBox::StandardButtons _buttons);
- QVersionNumber m_foundVersion;
+ QString m_foundVersion;
QString m_genericConfig;
};
diff --git a/sources/libraries.cmake b/sources/libraries.cmake
index 6f171a6..004b39f 100644
--- a/sources/libraries.cmake
+++ b/sources/libraries.cmake
@@ -2,7 +2,7 @@
find_package(Gettext REQUIRED)
# main qt libraries
-find_package(Qt5 5.6.0 REQUIRED COMPONENTS Core DBus Network Qml Test Widgets)
+find_package(Qt5 5.5.0 REQUIRED COMPONENTS Core DBus Network Qml Test Widgets)
add_definitions(
${Qt5Core_DEFINITIONS} ${Qt5DBus_DEFINITIONS} ${Qt5Network_DEFINITIONS}
${Qt5Qml_DEFINITIONS} ${Qt5Widgets_DEFINITIONS}

View File

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

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,140 @@
/***************************************************************************
* 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;
}
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,77 @@
/***************************************************************************
* 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);
// 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
cmake_policy(SET CMP0011 NEW)
@ -14,9 +14,9 @@ project(awesomewidgets)
set(PROJECT_AUTHOR "Evgeniy Alekseev")
set(PROJECT_CONTACT "esalexeev@gmail.com")
set(PROJECT_LICENSE "GPL3")
set(PROJECT_VERSION_MAJOR "3")
set(PROJECT_VERSION_MINOR "4")
set(PROJECT_VERSION_PATCH "2")
set(PROJECT_VERSION_MAJOR "4")
set(PROJECT_VERSION_MINOR "0")
set(PROJECT_VERSION_PATCH "0")
set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}")
# append git version if any
set(PROJECT_COMMIT_SHA "Commit hash" CACHE INTERNAL "")

View File

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

View File

@ -1,7 +1,7 @@
set(SUBPROJECT plasma_applet_awesome-widget)
message(STATUS "Subproject ${SUBPROJECT}")
configure_file(metadata.desktop ${CMAKE_CURRENT_SOURCE_DIR}/package/metadata.desktop)
configure_file(metadata.json ${CMAKE_CURRENT_SOURCE_DIR}/package/metadata.json)
add_subdirectory(plugin)
plasma_install_package(package org.kde.plasma.awesomewidget)

View File

@ -1,27 +0,0 @@
[Desktop Entry]
Encoding=UTF-8
Name=Awesome Widget
Comment=A minimalistic Plasmoid
Comment[en]=A minimalistic Plasmoid
Comment[es]=Un plasmoide minimalista
Comment[es]=Un script Plasmoïde minimaliste
Comment[pt_BR]=Um script Plasmoid
Comment[ru]=Минималистичный плазмоид
Comment[uk]=Мінімалістичний плазмоїд
X-KDE-ServiceTypes=Plasma/Applet
Type=Service
Icon=utilities-system-monitor
X-KDE-ServiceTypes=Plasma/Applet
X-Plasma-API=declarativeappletscript
X-Plasma-MainScript=ui/main.qml
X-KDE-PluginInfo-Author=Evgeniy Alekseev aka arcanis
X-KDE-PluginInfo-Email=esalexeev@gmail.com
X-KDE-PluginInfo-Name=org.kde.plasma.awesomewidget
X-KDE-PluginInfo-Version=@PROJECT_VERSION@
X-KDE-PluginInfo-Website=https://arcanis.me/projects/awesome-widgets/
X-KDE-PluginInfo-Category=System Information
X-KDE-PluginInfo-Depends=
X-KDE-PluginInfo-License=GPLv3
X-KDE-PluginInfo-EnabledByDefault=true

View File

@ -0,0 +1,26 @@
{
"KPackageStructure": "Plasma/Applet",
"KPlugin": {
"Authors": [
{
"Email": "esalexeev@gmail.com",
"Name": "Evgeniy Alekseev aka arcanis"
}
],
"Category": "System Information",
"Description": "A minimalistic Plasmoid",
"Description[en]": "A minimalistic Plasmoid",
"Description[es]": "Un script Plasmoïde minimaliste",
"Description[pt_BR]": "Um script Plasmoid",
"Description[ru]": "Минималистичный плазмоид",
"Description[uk]": "Мінімалістичний плазмоїд",
"EnabledByDefault": true,
"Icon": "utilities-system-monitor",
"Id": "org.kde.plasma.awesomewidget",
"License": "GPLv3",
"Name": "Awesome Widget",
"Version": "@PROJECT_VERSION@",
"Website": "https://arcanis.me/projects/awesome-widgets/"
},
"X-Plasma-API-Minimum-Version": "6.0"
}

View File

@ -15,7 +15,7 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
import QtQuick 2.0
import QtQuick 2.15
import org.kde.plasma.configuration 2.0

View File

@ -7,150 +7,150 @@
<group name="Widget">
<!-- widget -->
<entry name="text" type="string">
<entry name="text" type="String">
<default>[cpu: $cpu%] [mem: $mem%] [swap: $swap%] [$netdev: $down/$upKB/s]</default>
</entry>
</group>
<group name="Advanced">
<!-- advanced -->
<entry name="background" type="bool">
<entry name="background" type="Bool">
<default>true</default>
</entry>
<entry name="translateStrings" type="bool">
<entry name="translateStrings" type="Bool">
<default>true</default>
</entry>
<entry name="wrapNewLines" type="bool">
<entry name="wrapNewLines" type="Bool">
<default>false</default>
</entry>
<entry name="wrapText" type="bool">
<entry name="wrapText" type="Bool">
<default>false</default>
</entry>
<entry name="notify" type="bool">
<entry name="notify" type="Bool">
<default>true</default>
</entry>
<entry name="checkUpdates" type="bool">
<entry name="checkUpdates" type="Bool">
<default>true</default>
</entry>
<entry name="optimize" type="bool">
<entry name="optimize" type="Bool">
<default>true</default>
</entry>
<entry name="height" type="int">
<entry name="height" type="Int">
<default>0</default>
</entry>
<entry name="width" type="int">
<entry name="width" type="Int">
<default>0</default>
</entry>
<entry name="interval" type="int">
<entry name="interval" type="Int">
<default>1000</default>
</entry>
<entry name="queueLimit" type="int">
<entry name="queueLimit" type="Int">
<default>0</default>
</entry>
<entry name="tempUnits" type="string">
<entry name="tempUnits" type="String">
<default>Celsius</default>
</entry>
<entry name="customTime" type="string">
<entry name="customTime" type="String">
<default>$hh:$mm</default>
</entry>
<entry name="customUptime" type="string">
<entry name="customUptime" type="String">
<default>$dd,$hh,$mm</default>
</entry>
<entry name="acOnline" type="string">
<entry name="acOnline" type="String">
<default>(*)</default>
</entry>
<entry name="acOffline" type="string">
<entry name="acOffline" type="String">
<default>( )</default>
</entry>
<entry name="telemetryCount" type="int">
<entry name="telemetryCount" type="Int">
<default>100</default>
</entry>
<entry name="telemetryRemote" type="bool">
<entry name="telemetryRemote" type="Bool">
<default>false</default>
</entry>
<entry name="telemetryId" type="string">
<entry name="telemetryId" type="String">
<default></default>
</entry>
</group>
<group name="Tooltip">
<entry name="tooltipNumber" type="int">
<entry name="tooltipNumber" type="Int">
<default>100</default>
</entry>
<entry name="useTooltipBackground" type="bool">
<entry name="useTooltipBackground" type="Bool">
<default>true</default>
</entry>
<entry name="tooltipBackground" type="string">
<entry name="tooltipBackground" type="String">
<default>#ffffff</default>
</entry>
<entry name="cpuTooltip" type="bool">
<entry name="cpuTooltip" type="Bool">
<default>true</default>
</entry>
<entry name="cpuTooltipColor" type="string">
<entry name="cpuTooltipColor" type="String">
<default>#ff0000</default>
</entry>
<entry name="cpuclTooltip" type="bool">
<entry name="cpuclTooltip" type="Bool">
<default>true</default>
</entry>
<entry name="cpuclTooltipColor" type="string">
<entry name="cpuclTooltipColor" type="String">
<default>#00ff00</default>
</entry>
<entry name="memTooltip" type="bool">
<entry name="memTooltip" type="Bool">
<default>true</default>
</entry>
<entry name="memTooltipColor" type="string">
<entry name="memTooltipColor" type="String">
<default>#0000ff</default>
</entry>
<entry name="swapTooltip" type="bool">
<entry name="swapTooltip" type="Bool">
<default>true</default>
</entry>
<entry name="swapTooltipColor" type="string">
<entry name="swapTooltipColor" type="String">
<default>#ffff00</default>
</entry>
<entry name="downkbTooltip" type="bool">
<entry name="downkbTooltip" type="Bool">
<default>true</default>
</entry>
<entry name="downkbTooltipColor" type="string">
<entry name="downkbTooltipColor" type="String">
<default>#00ffff</default>
</entry>
<entry name="upkbTooltipColor" type="string">
<entry name="upkbTooltipColor" type="String">
<default>#ff00ff</default>
</entry>
<entry name="batTooltip" type="bool">
<entry name="batTooltip" type="Bool">
<default>true</default>
</entry>
<entry name="batTooltipColor" type="string">
<entry name="batTooltipColor" type="String">
<default>#008800</default>
</entry>
<entry name="batInTooltipColor" type="string">
<entry name="batInTooltipColor" type="String">
<default>#880000</default>
</entry>
</group>
<group name="Appearance">
<!-- appearance -->
<entry name="textAlign" type="string">
<entry name="textAlign" type="String">
<default>center</default>
</entry>
<entry name="fontFamily" type="string">
<entry name="fontFamily" type="String">
<default>Terminus</default>
</entry>
<entry name="fontSize" type="int">
<entry name="fontSize" type="Int">
<default>12</default>
</entry>
<entry name="fontColor" type="string">
<entry name="fontColor" type="String">
<default>#000000</default>
</entry>
<entry name="fontWeight" type="string">
<entry name="fontWeight" type="String">
<default>normal</default>
</entry>
<entry name="fontStyle" type="string">
<entry name="fontStyle" type="String">
<default>normal</default>
</entry>
<entry name="textStyle" type="string">
<entry name="textStyle" type="String">
<default>normal</default>
</entry>
<entry name="textStyleColor" type="string">
<entry name="textStyleColor" type="String">
<default>#000000</default>
</entry>
</group>

View File

@ -15,28 +15,21 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
import QtQuick 2.0
import QtQuick 2.15
import org.kde.kcmutils as KCM
import org.kde.plasma.private.awesomewidget 1.0
Item {
KCM.SimpleKCM {
id: aboutPage
// backend
AWActions {
id: awActions
}
width: childrenRect.width
height: childrenRect.height
property bool debug: awActions.isDebugEnabled()
AboutTab {
textProvider: awActions
}
Component.onCompleted: {
if (debug) console.debug()
}
}

View File

@ -15,26 +15,21 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
import QtQuick 2.0
import QtQuick.Controls 1.3 as QtControls
import QtQuick 2.15
import QtQuick.Controls
import org.kde.kcmutils as KCM
import org.kde.plasma.private.awesomewidget 1.0
Item {
KCM.SimpleKCM {
id: advancedPage
// backend
AWActions {
id: awActions
}
width: childrenRect.width
height: childrenRect.height
implicitWidth: pageColumn.implicitWidth
implicitHeight: pageColumn.implicitHeight
property bool debug: awActions.isDebugEnabled()
property alias cfg_background: background.checked
property alias cfg_translateStrings: translate.checked
property alias cfg_wrapNewLines: wrapNewLines.checked
@ -55,7 +50,6 @@ Item {
property alias cfg_telemetryRemote: telemetryRemote.checked
property alias cfg_telemetryId: telemetryId.value
Column {
id: pageColumn
anchors.fill: parent
@ -135,37 +129,37 @@ Item {
id: tempUnits
model: [
{
'label': i18n("Celsius"),
'name': "Celsius"
"label": i18n("Celsius"),
"name": "Celsius"
},
{
'label': i18n("Fahrenheit"),
'name': "Fahrenheit"
"label": i18n("Fahrenheit"),
"name": "Fahrenheit"
},
{
'label': i18n("Kelvin"),
'name': "Kelvin"
"label": i18n("Kelvin"),
"name": "Kelvin"
},
{
'label': i18n("Reaumur"),
'name': "Reaumur"
"label": i18n("Reaumur"),
"name": "Reaumur"
},
{
'label': i18n("cm^-1"),
'name': "cm^-1"
"label": i18n("cm^-1"),
"name": "cm^-1"
},
{
'label': i18n("kJ/mol"),
'name': "kJ/mol"
"label": i18n("kJ/mol"),
"name": "kJ/mol"
},
{
'label': i18n("kcal/mol"),
'name': "kcal/mol"
"label": i18n("kcal/mol"),
"name": "kcal/mol"
}
]
text: i18n("Temperature units")
value: plasmoid.configuration.tempUnits
onValueEdited: cfg_tempUnits = newValue
onValueEdited: newValue => cfg_tempUnits = newValue
}
LineSelector {
@ -192,18 +186,20 @@ Item {
value: plasmoid.configuration.acOffline
}
QtControls.GroupBox {
height: implicitHeight
GroupBox {
width: parent.width
height: implicitHeight
title: i18n("Actions")
Column {
height: implicitHeight
width: parent.width
ButtonSelector {
value: i18n("Drop key cache")
onButtonActivated: awActions.dropCache()
}
ButtonSelector {
ExportDialog {
id: saveConfigAs
@ -212,11 +208,12 @@ Item {
value: i18n("Export configuration")
onButtonActivated: saveConfigAs.open()
}
ButtonSelector {
ImportDialog {
id: loadConfigFrom
onConfigurationReceived: {
for (var key in configuration)
for (const key in configuration)
plasmoid.configuration[key] = configuration[key]
}
}
@ -226,7 +223,7 @@ Item {
}
}
QtControls.GroupBox {
GroupBox {
height: implicitHeight
width: parent.width
title: i18n("Telemetry")
@ -234,10 +231,12 @@ Item {
Column {
height: implicitHeight
width: parent.width
CheckBoxSelector {
id: telemetryRemote
text: i18n("Enable remote telemetry")
}
IntegerSelector {
id: telemetryCount
maximumValue: 10000
@ -246,6 +245,7 @@ Item {
text: i18n("History count")
value: plasmoid.configuration.telemetryCount
}
LineSelector {
id: telemetryId
text: i18n("Telemetry ID")
@ -254,9 +254,4 @@ Item {
}
}
}
Component.onCompleted: {
if (debug) console.debug()
}
}

View File

@ -15,31 +15,22 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
import QtQuick 2.0
import QtQuick 2.15
import org.kde.kcmutils as KCM
import org.kde.plasma.private.awesomewidget 1.0
import "."
Item {
KCM.SimpleKCM {
id: appearancePage
// backend
AWActions {
id: awActions
}
width: childrenRect.width
height: childrenRect.height
implicitWidth: pageColumn.implicitWidth
implicitHeight: pageColumn.implicitHeight
property bool debug: awActions.isDebugEnabled()
property variant weight: {
25: 0,
50: 1,
63: 3,
75: 4,
87: 5
87: 5,
}
property alias cfg_fontFamily: font.value
@ -50,7 +41,6 @@ Item {
property alias cfg_textStyleColor: selectStyleColor.value
property string cfg_textStyle: textStyle.value
Column {
id: pageColumn
anchors.fill: parent
@ -75,7 +65,7 @@ Item {
model: General.fontWeightModel
text: i18n("Font weight")
value: plasmoid.configuration.fontWeight
onValueEdited: cfg_fontWeight = newValue
onValueEdited: newValue => cfg_fontWeight = newValue
}
ComboBoxSelector {
@ -83,7 +73,7 @@ Item {
model: General.fontStyleModel
text: i18n("Font style")
value: plasmoid.configuration.fontStyle
onValueEdited: cfg_fontStyle = newValue
onValueEdited: newValue => cfg_fontStyle = newValue
}
ColorSelector {
@ -97,7 +87,7 @@ Item {
model: General.textStyleModel
text: i18n("Style")
value: plasmoid.configuration.textStyle
onValueEdited: cfg_textStyle = newValue
onValueEdited: newValue => cfg_textStyle = newValue
}
ColorSelector {
@ -106,9 +96,4 @@ Item {
value: plasmoid.configuration.textStyleColor
}
}
Component.onCompleted: {
if (debug) console.debug()
}
}

View File

@ -15,105 +15,46 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
import QtQuick 2.0
import QtQuick.Controls 1.3 as QtControls
import QtQuick.Dialogs 1.1 as QtDialogs
import QtQuick 2.15
import QtQuick.Controls
import org.kde.kcmutils as KCM
import org.kde.plasma.private.awesomewidget 1.0
Item {
KCM.SimpleKCM {
id: dataenginePage
// backend
AWKeys {
id: awKeys
}
AWActions {
id: awActions
}
AWConfigHelper {
id: awConfig
}
width: childrenRect.width
height: childrenRect.height
implicitWidth: pageColumn.implicitWidth
implicitHeight: pageColumn.implicitHeight
property bool debug: awActions.isDebugEnabled()
property variant cfg_dataengine: awConfig.readDataEngineConfiguration()
Column {
id: pageColumn
anchors.fill: parent
QtControls.GroupBox {
GroupBox {
height: implicitHeight
width: parent.width
title: i18n("ACPI")
LineSelector {
text: i18n("ACPI path")
value: cfg_dataengine["ACPIPATH"]
onValueEdited: cfg_dataengine["ACPIPATH"] = newValue
onValueEdited: newValue => cfg_dataengine["ACPIPATH"] = newValue
}
}
QtControls.GroupBox {
height: implicitHeight
width: parent.width
title: i18n("GPU")
ComboBoxSelector {
model: [
{
'label': "auto",
'name': "auto"
},
{
'label': "disable",
'name': "disable"
},
{
'label': "ati",
'name': "ati"
},
{
'label': "nvidia",
'name': "nvidia"
}
]
text: i18n("GPU device")
value: cfg_dataengine["GPUDEV"]
onValueEdited: cfg_dataengine["GPUDEV"] = newValue
}
}
QtControls.GroupBox {
height: implicitHeight
width: parent.width
title: i18n("HDD temperature")
Column {
height: implicitHeight
width: parent.width
ComboBoxSelector {
id: hdd
text: i18n("HDD")
value: cfg_dataengine["HDDDEV"]
onValueEdited: cfg_dataengine["HDDDEV"] = newValue
}
LineSelector {
text: i18n("hddtemp cmd")
value: cfg_dataengine["HDDTEMPCMD"]
onValueEdited: cfg_dataengine["HDDTEMPCMD"] = newValue
}
}
}
QtControls.GroupBox {
GroupBox {
height: implicitHeight
width: parent.width
title: i18n("Player")
Column {
height: implicitHeight
width: parent.width
@ -123,27 +64,27 @@ Item {
stepSize: 1
text: i18n("Player data symbols")
value: cfg_dataengine["PLAYERSYMBOLS"]
onValueEdited: cfg_dataengine["PLAYERSYMBOLS"] = newValue
onValueEdited: newValue => cfg_dataengine["PLAYERSYMBOLS"] = newValue
}
ComboBoxSelector {
model: [
{
'label': "disable",
'name': "disable"
"label": "disable",
"name": "disable"
},
{
'label': "mpris",
'name': "mpris"
"label": "mpris",
"name": "mpris"
},
{
'label': "mpd",
'name': "mpd"
"label": "mpd",
"name": "mpd"
}
]
text: i18n("Music player")
value: cfg_dataengine["PLAYER"]
onValueEdited: cfg_dataengine["PLAYER"] = newValue
onValueEdited: newValue => cfg_dataengine["PLAYER"] = newValue
}
ComboBoxSelector {
@ -151,40 +92,40 @@ Item {
editable: true
model: [
{
'label': 'auto',
'name': 'auto'
"label": "auto",
"name": "auto"
},
{
'label': 'amarok',
'name': 'amarok'
"label": "amarok",
"name": "amarok"
},
{
'label': 'audacious',
'name': 'audacious'
"label": "audacious",
"name": "audacious"
},
{
'label': 'clementine',
'name': 'clementine'
"label": "clementine",
"name": "clementine"
},
{
'label': 'DeaDBeeF',
'name': 'DeaDBeeF'
"label": "DeaDBeeF",
"name": "DeaDBeeF"
},
{
'label': 'vlc',
'name': 'vlc'
"label": "vlc",
"name": "vlc"
},
{
'label': 'qmmp',
'name': 'qmmp'
"label": "qmmp",
"name": "qmmp"
},
{
'label': 'xmms2',
'name': 'xmms2'
"label": "xmms2",
"name": "xmms2"
},
{
'label': cfg_dataengine["MPRIS"],
'name': cfg_dataengine["MPRIS"]
"label": cfg_dataengine["MPRIS"],
"name": cfg_dataengine["MPRIS"]
}
]
text: i18n("MPRIS player name")
@ -194,7 +135,7 @@ Item {
LineSelector {
text: i18n("MPD address")
value: cfg_dataengine["MPDADDRESS"]
onValueEdited: cfg_dataengine["MPDADDRESS"] = newValue
onValueEdited: newValue => cfg_dataengine["MPDADDRESS"] = newValue
}
IntegerSelector {
@ -203,18 +144,20 @@ Item {
stepSize: 1
text: i18n("MPD port")
value: cfg_dataengine["MPDPORT"]
onValueEdited: cfg_dataengine["MPDPORT"] = newValue
onValueEdited: newValue => cfg_dataengine["MPDPORT"] = newValue
}
}
}
QtControls.GroupBox {
GroupBox {
height: implicitHeight
width: parent.width
title: i18n("Extensions")
Column {
height: implicitHeight
width: parent.width
ButtonSelector {
value: i18n("Custom scripts")
onButtonActivated: awKeys.editItem("extscript")
@ -245,8 +188,6 @@ Item {
Component.onCompleted: {
if (debug) console.debug()
// init submodule
awKeys.updateCache()
@ -256,8 +197,6 @@ Item {
}
Component.onDestruction: {
if (debug) console.debug()
cfg_dataengine["MPRIS"] = mpris.editText
awConfig.writeDataEngineConfiguration(cfg_dataengine)
}

View File

@ -15,20 +15,20 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
import QtQuick 2.4
import QtQuick.Controls 1.3 as QtControls
import QtQuick.Dialogs 1.2 as QtDialogs
import QtQuick.Layouts 1.1
import QtQuick 2.15
import QtQuick.Controls
import QtQuick.Dialogs
import QtQuick.Layouts
import org.kde.plasma.core as PlasmaCore
import org.kde.plasma.plasmoid 2.0
import org.kde.plasma.core 2.0 as PlasmaCore
import org.kde.plasma.components 2.0 as PlasmaComponents
import org.kde.plasma.private.awesomewidget 1.0
import "."
Item {
PlasmoidItem {
id: main
// backend
AWKeys {
id: awKeys
@ -43,7 +43,6 @@ Item {
id: bugReport
}
property bool debug: awActions.isDebugEnabled()
property variant tooltipSettings: {
"tooltipNumber": plasmoid.configuration.tooltipNumber,
"useTooltipBackground": plasmoid.configuration.useTooltipBackground,
@ -73,19 +72,12 @@ Item {
signal needToolTipUpdate(string newText)
signal sizeUpdate
// init
Plasmoid.preferredRepresentation: Plasmoid.fullRepresentation
Plasmoid.compactRepresentation: Plasmoid.fullRepresentation
Layout.fillWidth: plasmoid.formFactor != PlasmaCore.Planar
Layout.fillHeight: plasmoid.formFactor != PlasmaCore.Planar
Layout.fillWidth: PlasmoidItem.formFactor !== PlasmaCore.Planar
Layout.fillHeight: PlasmoidItem.formFactor !== PlasmaCore.Planar
Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter
Plasmoid.icon: "utilities-system-monitor"
Plasmoid.backgroundHints: plasmoid.configuration.background ? "DefaultBackground" : "NoBackground"
Plasmoid.associatedApplication: "ksysguard"
// ui
Text {
@ -100,7 +92,7 @@ Item {
color: plasmoid.configuration.fontColor
font.family: plasmoid.configuration.fontFamily
font.italic: plasmoid.configuration.fontStyle == "italic" ? true : false
font.italic: plasmoid.configuration.fontStyle === "italic" ? true : false
font.pointSize: plasmoid.configuration.fontSize
font.weight: General.fontWeight[plasmoid.configuration.fontWeight]
@ -119,19 +111,19 @@ Item {
}
}
QtDialogs.Dialog {
Dialog {
id: tagSelector
title: i18n("Select tag")
QtControls.ComboBox {
ComboBox {
id: tagSelectorBox
width: parent.width
editable: true
}
onAccepted: {
var tag = tagSelectorBox.editText
var message = i18n("Tag: %1", tag)
const tag = tagSelectorBox.editText
let message = i18n("Tag: %1", tag)
message += "<br>"
message += i18n("Value: %1", awKeys.valueByKey(tag))
message += "<br>"
@ -140,17 +132,37 @@ Item {
}
}
Plasmoid.contextualActions: [
PlasmaCore.Action {
text: i18n("Request key")
icon.name: "utilities-system-monitor"
onTriggered: {
tagSelectorBox.model = awKeys.dictKeys(true)
tagSelector.open()
}
},
PlasmaCore.Action {
text: i18n("Show README")
icon.name: "text-x-readme"
onTriggered: awActions.showReadme()
},
PlasmaCore.Action {
text: i18n("Check updates")
icon.name: "system-software-update"
onTriggered: awActions.checkUpdates(true)
},
PlasmaCore.Action {
text: i18n("Report bug")
icon.name: "tools-report-bug"
onTriggered: {
bugReport.reset()
bugReport.open()
}
}
]
Component.onCompleted: {
if (debug) console.debug()
// actions
// it makes no sense to use this field with optimization enable
if (!plasmoid.configuration.optimize)
plasmoid.setAction("requestKey", i18n("Request key"), "utilities-system-monitor")
plasmoid.setAction("showReadme", i18n("Show README"), "text-x-readme")
plasmoid.setAction("checkUpdates", i18n("Check updates"), "system-software-update")
plasmoid.setAction("reportBug", i18n("Report bug"), "tools-report-bug")
// init submodule
Plasmoid.userConfiguringChanged(false)
// connect data
@ -160,32 +172,26 @@ Item {
if (plasmoid.configuration.checkUpdates) return awActions.checkUpdates(false)
}
onNeedTextUpdate: {
if (debug) console.debug()
onNeedTextUpdate: newText => {
text.text = newText
sizeUpdate()
}
onNeedToolTipUpdate: {
if (debug) console.debug()
onNeedToolTipUpdate: newText => {
tooltip.text = newText
}
onSizeUpdate: {
if (debug) console.debug()
// 16 is a magic number
// in other case plasmoid will increase own size on each update
if (plasmoid.configuration.height == 0) {
if (plasmoid.configuration.height === 0) {
Layout.minimumHeight = text.contentHeight - 16
Layout.maximumHeight = -1
} else {
Layout.minimumHeight = plasmoid.configuration.height
Layout.maximumHeight = plasmoid.configuration.height
}
if (plasmoid.configuration.width == 0) {
if (plasmoid.configuration.width === 0) {
Layout.minimumWidth = text.contentWidth - 16
Layout.maximumWidth = -1
} else {
@ -196,7 +202,6 @@ Item {
Plasmoid.onUserConfiguringChanged: {
if (plasmoid.userConfiguring) return
if (debug) console.debug()
// init submodule
awKeys.initDataAggregator(tooltipSettings)
@ -211,7 +216,7 @@ Item {
awKeys.setAggregatorProperty("tempUnits", plasmoid.configuration.tempUnits)
awKeys.setAggregatorProperty("translate", plasmoid.configuration.translateStrings)
// update telemetry ID
if (plasmoid.configuration.telemetryId.length == 0)
if (plasmoid.configuration.telemetryId.length === 0)
plasmoid.configuration.telemetryId = generateUuid()
// save telemetry
awTelemetryHandler.init(plasmoid.configuration.telemetryCount,
@ -221,37 +226,10 @@ Item {
awTelemetryHandler.uploadTelemetry("awwidgetconfig", plasmoid.configuration.text)
}
function action_checkUpdates() {
if (debug) console.debug()
return awActions.checkUpdates(true)
}
function action_showReadme() {
if (debug) console.debug()
return awActions.showReadme()
}
function action_reportBug() {
if (debug) console.debug()
bugReport.reset()
bugReport.open()
}
function action_requestKey() {
if (debug) console.debug()
tagSelectorBox.model = awKeys.dictKeys(true)
return tagSelector.open()
}
// code from http://stackoverflow.com/questions/105034/create-guid-uuid-in-javascript
function generateUuid() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) {
let r = Math.random() * 16 | 0, v = c === "x" ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}

View File

@ -15,25 +15,15 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
import QtQuick 2.0
import QtQuick.Controls 1.3 as QtControls
import QtQuick 2.15
import QtQuick.Controls
import org.kde.kcmutils as KCM
import org.kde.plasma.private.awesomewidget 1.0
Item {
KCM.SimpleKCM {
id: tooltipPage
// backend
AWActions {
id: awActions
}
width: childrenRect.width
height: childrenRect.height
implicitWidth: pageColumn.implicitWidth
implicitHeight: pageColumn.implicitHeight
property bool debug: awActions.isDebugEnabled()
property alias cfg_tooltipNumber: tooltipNumber.value
property alias cfg_useTooltipBackground: useTooltipBackground.checked
@ -46,18 +36,18 @@ Item {
property alias cfg_memTooltipColor: memTooltipColor.value
property alias cfg_swapTooltip: swapTooltip.checked
property alias cfg_swapTooltipColor: swapTooltipColor.value
property alias cfg_downkbTooltip: downkbTooltip.checked
property alias cfg_downkbTooltip: networkTooltip.checked
property alias cfg_downkbTooltipColor: downkbTooltipColor.value
property alias cfg_upkbTooltipColor: upkbTooltipColor.value
property alias cfg_batTooltip: batTooltip.checked
property alias cfg_batTooltipColor: batTooltipColor.value
property alias cfg_batInTooltipColor: batInTooltipColor.value
Column {
id: pageColumn
anchors.fill: parent
QtControls.Label {
Label {
width: parent.width
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
@ -74,85 +64,116 @@ Item {
value: plasmoid.configuration.tooltipNumber
}
QtControls.GroupBox {
GroupBox {
id: useTooltipBackground
height: implicitHeight
width: parent.width
checkable: true
title: i18n("Background")
property alias checked: useTooltipBackgroundLabel.checked
label: CheckBox {
id: useTooltipBackgroundLabel
text: i18n("Background")
}
ColorSelector {
id: tooltipBackground
enabled: useTooltipBackgroundLabel.checked
text: i18n("Background color")
value: plasmoid.configuration.tooltipBackground
}
}
QtControls.GroupBox {
GroupBox {
id: cpuTooltip
height: implicitHeight
width: parent.width
checkable: true
title: i18n("CPU")
property alias checked: cpuTooltipLabel.checked
label: CheckBox {
id: cpuTooltipLabel
text: i18n("CPU")
}
ColorSelector {
id: cpuTooltipColor
enabled: cpuTooltipLabel.checked
text: i18n("CPU color")
value: plasmoid.configuration.cpuTooltipColor
}
}
QtControls.GroupBox {
GroupBox {
id: cpuclTooltip
height: implicitHeight
width: parent.width
checkable: true
title: i18n("CPU clock")
property alias checked: cpuclTooltipLabel.checked
label: CheckBox {
id: cpuclTooltipLabel
text: i18n("CPU clock")
}
ColorSelector {
id: cpuclTooltipColor
enabled: cpuclTooltipLabel.checked
text: i18n("CPU clock color")
value: plasmoid.configuration.cpuclTooltipColor
}
}
QtControls.GroupBox {
GroupBox {
id: memTooltip
height: implicitHeight
width: parent.width
checkable: true
title: i18n("Memory")
property alias checked: memTooltipLabel.checked
label: CheckBox {
id: memTooltipLabel
text: i18n("Memory")
}
ColorSelector {
id: memTooltipColor
enabled: memTooltipLabel.checked
text: i18n("Memory color")
value: plasmoid.configuration.memTooltipColor
}
}
QtControls.GroupBox {
GroupBox {
id: swapTooltip
height: implicitHeight
width: parent.width
checkable: true
title: i18n("Swap")
property alias checked: swapTooltipLabel.checked
label: CheckBox {
id: swapTooltipLabel
text: i18n("Swap")
}
ColorSelector {
id: swapTooltipColor
enabled: swapTooltipLabel.checked
text: i18n("Swap color")
value: plasmoid.configuration.swapTooltipColor
}
}
QtControls.GroupBox {
id: downkbTooltip
height: implicitHeight
GroupBox {
id: networkTooltip
width: parent.width
checkable: true
title: i18n("Network")
property alias checked: networkTooltipLabel.checked
label: CheckBox {
id: networkTooltipLabel
text: i18n("Network")
}
Column {
height: implicitHeight
width: parent.width
enabled: networkTooltipLabel.checked
ColorSelector {
id: downkbTooltipColor
text: i18n("Download speed color")
value: plasmoid.configuration.downkbTooltipColor
}
ColorSelector {
id: upkbTooltipColor
text: i18n("Upload speed color")
@ -161,20 +182,26 @@ Item {
}
}
QtControls.GroupBox {
GroupBox {
id: batTooltip
height: implicitHeight
width: parent.width
checkable: true
title: i18n("Battery")
property alias checked: batteryTooltipLabel.checked
label: CheckBox {
id: batteryTooltipLabel
text: i18n("Battery")
}
Column {
height: implicitHeight
width: parent.width
enabled: batteryTooltipLabel.checked
ColorSelector {
id: batTooltipColor
text: i18n("Battery active color")
value: plasmoid.configuration.batTooltipColor
}
ColorSelector {
id: batInTooltipColor
text: i18n("Battery inactive color")
@ -183,9 +210,4 @@ Item {
}
}
}
Component.onCompleted: {
if (debug) console.debug()
}
}

View File

@ -15,14 +15,17 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
import QtQuick 2.2
import QtQuick 2.15
import QtQuick.Controls
import org.kde.kcmutils as KCM
import org.kde.plasma.private.awesomewidget 1.0
import "."
Item {
KCM.SimpleKCM {
id: widgetPage
// backend
AWKeys {
id: awKeys
@ -31,19 +34,11 @@ Item {
id: awActions
}
width: childrenRect.width
height: childrenRect.height
implicitWidth: pageColumn.implicitWidth
implicitHeight: pageColumn.implicitHeight
property bool debug: awActions.isDebugEnabled()
property alias cfg_text: textPattern.text
property bool lock: true
signal needTextUpdate(string newText)
Column {
id: pageColumn
anchors.fill: parent
@ -74,10 +69,7 @@ Item {
}
}
Component.onCompleted: {
if (debug) console.debug()
awKeys.needTextToBeUpdated.connect(needTextUpdate)
// init submodule
awKeys.initKeys(plasmoid.configuration.text, plasmoid.configuration.interval,
@ -90,9 +82,8 @@ Item {
awKeys.setAggregatorProperty("translate", plasmoid.configuration.translateStrings)
}
onNeedTextUpdate: {
onNeedTextUpdate: newText => {
if (lock) return
if (debug) console.debug()
extensions.showMessage(newText)
lock = true

View File

@ -1,27 +0,0 @@
[Desktop Entry]
Encoding=UTF-8
Name=Awesome Widget
Comment=A minimalistic Plasmoid
Comment[en]=A minimalistic Plasmoid
Comment[es]=Un plasmoide minimalista
Comment[es]=Un script Plasmoïde minimaliste
Comment[pt_BR]=Um script Plasmoid
Comment[ru]=Минималистичный плазмоид
Comment[uk]=Мінімалістичний плазмоїд
X-KDE-ServiceTypes=Plasma/Applet
Type=Service
Icon=utilities-system-monitor
X-KDE-ServiceTypes=Plasma/Applet
X-Plasma-API=declarativeappletscript
X-Plasma-MainScript=ui/main.qml
X-KDE-PluginInfo-Author=Evgeniy Alekseev aka arcanis
X-KDE-PluginInfo-Email=esalexeev@gmail.com
X-KDE-PluginInfo-Name=org.kde.plasma.awesomewidget
X-KDE-PluginInfo-Version=3.4.2
X-KDE-PluginInfo-Website=https://arcanis.me/projects/awesome-widgets/
X-KDE-PluginInfo-Category=System Information
X-KDE-PluginInfo-Depends=
X-KDE-PluginInfo-License=GPLv3
X-KDE-PluginInfo-EnabledByDefault=true

View File

@ -0,0 +1,26 @@
{
"KPackageStructure": "Plasma/Applet",
"KPlugin": {
"Authors": [
{
"Email": "esalexeev@gmail.com",
"Name": "Evgeniy Alekseev aka arcanis"
}
],
"Category": "System Information",
"Description": "A minimalistic Plasmoid",
"Description[en]": "A minimalistic Plasmoid",
"Description[es]": "Un script Plasmoïde minimaliste",
"Description[pt_BR]": "Um script Plasmoid",
"Description[ru]": "Минималистичный плазмоид",
"Description[uk]": "Мінімалістичний плазмоїд",
"EnabledByDefault": true,
"Icon": "utilities-system-monitor",
"Id": "org.kde.plasma.awesomewidget",
"License": "GPLv3",
"Name": "Awesome Widget",
"Version": "4.0.0",
"Website": "https://arcanis.me/projects/awesome-widgets/"
},
"X-Plasma-API-Minimum-Version": "6.0"
}

View File

@ -7,17 +7,17 @@ include_directories(
${CMAKE_CURRENT_SOURCE_DIR}/../../${PROJECT_LIBRARY}/
${PROJECT_TRDPARTY_DIR}
${Qt_INCLUDE}
${Kf5_INCLUDE}
${Kf6_INCLUDE}
)
file(GLOB SUBPROJECT_SOURCE *.cpp ${PROJECT_TRDPARTY_DIR}/fontdialog/*.cpp ${CMAKE_SOURCE_DIR}/*.cpp)
file(GLOB SUBPROJECT_UI *.ui)
file(GLOB SUBPROJECT_NOTIFY *.notifyrc)
qt5_wrap_ui(SUBPROJECT_UI_HEADER ${SUBPROJECT_UI})
qt6_wrap_ui(SUBPROJECT_UI_HEADER ${SUBPROJECT_UI})
add_library(${PLUGIN_NAME} SHARED ${SUBPROJECT_SOURCE} ${SUBPROJECT_UI_HEADER})
target_link_libraries(${PLUGIN_NAME} ${PROJECT_LIBRARY} ${Qt_LIBRARIES} ${Kf5_LIBRARIES})
target_link_libraries(${PLUGIN_NAME} ${PROJECT_LIBRARY} ${Qt_LIBRARIES} ${Kf6_LIBRARIES})
install(TARGETS ${PLUGIN_NAME} DESTINATION ${QML_INSTALL_DIR}/org/kde/plasma/private/awesomewidget)
install(FILES qmldir DESTINATION ${QML_INSTALL_DIR}/org/kde/plasma/private/awesomewidget)
install(FILES ${SUBPROJECT_NOTIFY} DESTINATION ${KNOTIFYRC_INSTALL_DIR})
install(TARGETS ${PLUGIN_NAME} DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/plasma/private/awesomewidget)
install(FILES qmldir DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/plasma/private/awesomewidget)
install(FILES ${SUBPROJECT_NOTIFY} DESTINATION ${KDE_INSTALL_KNOTIFYRCDIR})

View File

@ -107,8 +107,7 @@ void AWAbstractPairConfig::updateUi()
void AWAbstractPairConfig::addSelector(const QStringList &_keys, const QStringList &_values,
const QPair<QString, QString> &_current)
{
qCDebug(LOG_AW) << "Add selector with keys" << _keys << "values" << _values
<< "and current ones" << _current;
qCDebug(LOG_AW) << "Add selector with keys" << _keys << "values" << _values << "and current ones" << _current;
auto *selector = new AWAbstractSelector(ui->scrollAreaWidgetContents, m_editable);
selector->init(_keys, _values, _current);

View File

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

View File

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

View File

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

View File

@ -71,13 +71,6 @@ QString AWActions::getFileContent(const QString &_path)
}
// HACK: since QML could not use QLoggingCategory I need this hack
bool AWActions::isDebugEnabled()
{
return LOG_AW().isDebugEnabled();
}
bool AWActions::runCmd(const QString &_cmd, const QStringList &_args)
{
qCDebug(LOG_AW) << "Cmd" << _cmd << "args" << _args;
@ -124,8 +117,8 @@ QVariantMap AWActions::getFont(const QVariantMap &_defaultFont)
QVariantMap fontMap;
int ret = 0;
CFont defaultCFont = CFont(_defaultFont["family"].toString(), _defaultFont["size"].toInt(), 400,
false, _defaultFont["color"].toString());
CFont defaultCFont = CFont(_defaultFont["family"].toString(), _defaultFont["size"].toInt(), 400, false,
_defaultFont["color"].toString());
CFont font = CFontDialog::getFont(i18n("Select font"), defaultCFont, false, false, &ret);
fontMap["applied"] = ret;

View File

@ -34,7 +34,6 @@ public:
~AWActions() override;
Q_INVOKABLE void checkUpdates(bool _showAnyway = false);
Q_INVOKABLE static QString getFileContent(const QString &_path);
Q_INVOKABLE static bool isDebugEnabled();
Q_INVOKABLE static bool runCmd(const QString &_cmd, const QStringList &_args);
Q_INVOKABLE static void showLegacyInfo();
Q_INVOKABLE static void showReadme();

View File

@ -44,13 +44,12 @@ AWBugReporter::~AWBugReporter()
void AWBugReporter::doConnect()
{
// additional method for testing needs
connect(this, SIGNAL(replyReceived(const int, const QString &)), this,
SLOT(showInformation(int, const QString &)));
connect(this, SIGNAL(replyReceived(const int, const QString &)), this, SLOT(showInformation(int, const QString &)));
}
QString AWBugReporter::generateText(const QString &_description, const QString &_reproduce,
const QString &_expected, const QString &_logs)
QString AWBugReporter::generateText(const QString &_description, const QString &_reproduce, const QString &_expected,
const QString &_logs)
{
// do not log _logs here, it may have quite large size
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;
auto *manager = new QNetworkAccessManager(nullptr);
connect(manager, SIGNAL(finished(QNetworkReply *)), this,
SLOT(issueReplyRecieved(QNetworkReply *)));
connect(manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(issueReplyRecieved(QNetworkReply *)));
QNetworkRequest request = QNetworkRequest(QUrl(BUGTRACKER_API));
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
@ -95,8 +93,7 @@ void AWBugReporter::sendBugReport(const QString &_title, const QString &_body)
void AWBugReporter::issueReplyRecieved(QNetworkReply *_reply)
{
if (_reply->error() != QNetworkReply::NoError) {
qCWarning(LOG_AW) << "An error occurs" << _reply->error() << "with message"
<< _reply->errorString();
qCWarning(LOG_AW) << "An error occurs" << _reply->error() << "with message" << _reply->errorString();
return emit(replyReceived(0, ""));
}

View File

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

View File

@ -21,7 +21,6 @@
#include <QQmlPropertyMap>
#include <QSettings>
#include <QStandardPaths>
#include <QTextCodec>
#include "awdebug.h"
@ -31,8 +30,7 @@ AWConfigHelper::AWConfigHelper(QObject *_parent)
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
m_baseDir = QString("%1/awesomewidgets")
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation));
m_baseDir = QString("%1/awesomewidgets").arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation));
}
@ -45,9 +43,8 @@ AWConfigHelper::~AWConfigHelper()
QString AWConfigHelper::configurationDirectory()
{
// get readable directory
QString localDir
= QString("%1/awesomewidgets/configs")
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation));
QString localDir = QString("%1/awesomewidgets/configs")
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation));
// create directory and copy files from default settings
QDir localDirectory;
@ -63,8 +60,7 @@ QString AWConfigHelper::configurationDirectory()
bool AWConfigHelper::dropCache()
{
QString fileName
= QString("%1/awesomewidgets.ndx")
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation));
= QString("%1/awesomewidgets.ndx").arg(QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation));
return QFile(fileName).remove();
}
@ -88,8 +84,8 @@ bool AWConfigHelper::exportConfiguration(QObject *_nativeConfig, const QString &
// extensions
for (auto &item : m_dirs) {
QStringList items = QDir(QString("%1/%2").arg(m_baseDir).arg(item))
.entryList(QStringList() << "*.desktop", QDir::Files);
QStringList items
= QDir(QString("%1/%2").arg(m_baseDir).arg(item)).entryList(QStringList() << "*.desktop", QDir::Files);
settings.beginGroup(item);
for (auto &it : items)
copyExtensions(it, item, settings, false);
@ -99,11 +95,9 @@ bool AWConfigHelper::exportConfiguration(QObject *_nativeConfig, const QString &
// additional files
settings.beginGroup("json");
// script filters
readFile(settings, "filters",
QString("%1/scripts/awesomewidgets-extscripts-filters.json").arg(m_baseDir));
readFile(settings, "filters", QString("%1/scripts/awesomewidgets-extscripts-filters.json").arg(m_baseDir));
// weather icon settings
readFile(settings, "weathers",
QString("%1/weather/awesomewidgets-extweather-ids.json").arg(m_baseDir));
readFile(settings, "weathers", QString("%1/weather/awesomewidgets-extweather-ids.json").arg(m_baseDir));
settings.endGroup();
settings.beginGroup("ini");
@ -120,10 +114,8 @@ bool AWConfigHelper::exportConfiguration(QObject *_nativeConfig, const QString &
}
QVariantMap AWConfigHelper::importConfiguration(const QString &_fileName,
const bool _importPlasmoid,
const bool _importExtensions,
const bool _importAdds) const
QVariantMap AWConfigHelper::importConfiguration(const QString &_fileName, const bool _importPlasmoid,
const bool _importExtensions, const bool _importAdds) const
{
qCDebug(LOG_AW) << "Selected filename" << _fileName;
@ -144,11 +136,9 @@ QVariantMap AWConfigHelper::importConfiguration(const QString &_fileName,
if (_importAdds) {
settings.beginGroup("json");
// script filters
writeFile(settings, "filters",
QString("%1/scripts/awesomewidgets-extscripts-filters.json").arg(m_baseDir));
writeFile(settings, "filters", QString("%1/scripts/awesomewidgets-extscripts-filters.json").arg(m_baseDir));
// weather icon settings
writeFile(settings, "weathers",
QString("%1/weather/awesomewidgets-extweather-ids.json").arg(m_baseDir));
writeFile(settings, "weathers", QString("%1/weather/awesomewidgets-extweather-ids.json").arg(m_baseDir));
settings.endGroup();
settings.beginGroup("ini");
@ -173,17 +163,13 @@ QVariantMap AWConfigHelper::importConfiguration(const QString &_fileName,
QVariantMap AWConfigHelper::readDataEngineConfiguration()
{
QString fileName = QStandardPaths::locate(QStandardPaths::ConfigLocation,
"plasma-dataengine-extsysmon.conf");
QString fileName = QStandardPaths::locate(QStandardPaths::ConfigLocation, "plasma-dataengine-extsysmon.conf");
qCInfo(LOG_AW) << "Configuration file" << fileName;
QSettings settings(fileName, QSettings::IniFormat);
QVariantMap configuration;
settings.beginGroup("Configuration");
configuration["ACPIPATH"] = settings.value("ACPIPATH", "/sys/class/power_supply/");
configuration["GPUDEV"] = settings.value("GPUDEV", "auto");
configuration["HDDDEV"] = settings.value("HDDDEV", "all");
configuration["HDDTEMPCMD"] = settings.value("HDDTEMPCMD", "sudo smartctl -a");
configuration["MPDADDRESS"] = settings.value("MPDADDRESS", "localhost");
configuration["MPDPORT"] = settings.value("MPDPORT", "6600");
configuration["MPRIS"] = settings.value("MPRIS", "auto");
@ -208,9 +194,6 @@ bool AWConfigHelper::writeDataEngineConfiguration(const QVariantMap &_configurat
settings.beginGroup("Configuration");
settings.setValue("ACPIPATH", _configuration["ACPIPATH"]);
settings.setValue("GPUDEV", _configuration["GPUDEV"]);
settings.setValue("HDDDEV", _configuration["HDDDEV"]);
settings.setValue("HDDTEMPCMD", _configuration["HDDTEMPCMD"]);
settings.setValue("MPDADDRESS", _configuration["MPDADDRESS"]);
settings.setValue("MPDPORT", _configuration["MPDPORT"]);
settings.setValue("MPRIS", _configuration["MPRIS"]);
@ -228,9 +211,8 @@ void AWConfigHelper::copyConfigs(const QString &_localDir)
{
qCDebug(LOG_AW) << "Local directory" << _localDir;
QStringList dirs
= QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, "awesomewidgets/configs",
QStandardPaths::LocateDirectory);
QStringList dirs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, "awesomewidgets/configs",
QStandardPaths::LocateDirectory);
for (auto &dir : dirs) {
if (dir == _localDir)
continue;
@ -238,21 +220,19 @@ void AWConfigHelper::copyConfigs(const QString &_localDir)
for (auto &source : files) {
QString destination = QString("%1/%2").arg(_localDir).arg(source);
bool status = QFile::copy(QString("%1/%2").arg(dir).arg(source), destination);
qCInfo(LOG_AW) << "File" << source << "has been copied to" << destination
<< "with status" << status;
qCInfo(LOG_AW) << "File" << source << "has been copied to" << destination << "with status" << status;
}
}
}
void AWConfigHelper::copyExtensions(const QString &_item, const QString &_type,
QSettings &_settings, const bool _inverse) const
void AWConfigHelper::copyExtensions(const QString &_item, const QString &_type, QSettings &_settings,
const bool _inverse) const
{
qCDebug(LOG_AW) << "Extension" << _item << "has type" << _type << "inverse copying" << _inverse;
_settings.beginGroup(_item);
QSettings itemSettings(QString("%1/%2/%3").arg(m_baseDir).arg(_type).arg(_item),
QSettings::IniFormat);
QSettings itemSettings(QString("%1/%2/%3").arg(m_baseDir).arg(_type).arg(_item), QSettings::IniFormat);
itemSettings.beginGroup("Desktop Entry");
if (_inverse)
copySettings(_settings, itemSettings);
@ -298,7 +278,6 @@ void AWConfigHelper::writeFile(QSettings &_settings, const QString &_key, const
QFile file(_fileName);
if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
QTextStream out(&file);
out.setCodec("UTF-8");
out << _settings.value(_key).toString().toUtf8();
out.flush();
file.close();

View File

@ -35,10 +35,8 @@ public:
Q_INVOKABLE [[nodiscard]] static QString configurationDirectory();
Q_INVOKABLE static bool dropCache();
Q_INVOKABLE bool exportConfiguration(QObject *_nativeConfig, const QString &_fileName) const;
Q_INVOKABLE [[nodiscard]] QVariantMap importConfiguration(const QString &_fileName,
bool _importPlasmoid,
bool _importExtensions,
bool _importAdds) const;
Q_INVOKABLE [[nodiscard]] QVariantMap importConfiguration(const QString &_fileName, bool _importPlasmoid,
bool _importExtensions, bool _importAdds) const;
// dataengine
Q_INVOKABLE static QVariantMap readDataEngineConfiguration();
Q_INVOKABLE static bool writeDataEngineConfiguration(const QVariantMap &_configuration);
@ -46,8 +44,7 @@ public:
private:
// methods
static void copyConfigs(const QString &_localDir);
void copyExtensions(const QString &_item, const QString &_type, QSettings &_settings,
bool _inverse) const;
void copyExtensions(const QString &_item, const QString &_type, QSettings &_settings, bool _inverse) const;
static void copySettings(QSettings &_from, QSettings &_to);
static void readFile(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
public:
explicit AWCustomKeysConfig(QWidget *_parent = nullptr,
const QStringList &_keys = QStringList());
explicit AWCustomKeysConfig(QWidget *_parent = nullptr, const QStringList &_keys = QStringList());
~AWCustomKeysConfig() override;
};

View File

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

View File

@ -61,8 +61,7 @@ QString AWDataAggregator::htmlImage(const QPixmap &_source)
_source.save(&buffer, "PNG");
return byteArray.isEmpty() ? ""
: QString("<img src=\"data:image/png;base64,%1\"/>")
.arg(QString(byteArray.toBase64()));
: QString("<img src=\"data:image/png;base64,%1\"/>").arg(QString(byteArray.toBase64()));
}
@ -102,10 +101,9 @@ void AWDataAggregator::setParameters(const QVariantMap &_settings)
requiredKeys.append("batTooltip");
// background
m_toolTipScene->setBackgroundBrush(
m_configuration["useTooltipBackground"].toBool()
? QBrush(QColor(m_configuration["tooltipBackground"].toString()))
: QBrush(Qt::NoBrush));
m_toolTipScene->setBackgroundBrush(m_configuration["useTooltipBackground"].toBool()
? QBrush(QColor(m_configuration["tooltipBackground"].toString()))
: QBrush(Qt::NoBrush));
}
@ -156,11 +154,10 @@ void AWDataAggregator::dataUpdate(const QVariantHash &_values)
}
void AWDataAggregator::checkValue(const QString &_source, const float _value,
const float _extremum) const
void AWDataAggregator::checkValue(const QString &_source, const float _value, const float _extremum) const
{
qCDebug(LOG_AW) << "Notification source" << _source << "with value" << _value
<< "called with extremum" << _extremum;
qCDebug(LOG_AW) << "Notification source" << _source << "with value" << _value << "called with extremum"
<< _extremum;
if (_value >= 0.0) {
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,
const QString &_received) const
void AWDataAggregator::checkValue(const QString &_source, const QString &_current, const QString &_received) const
{
qCDebug(LOG_AW) << "Notification source" << _source << "with current value" << _current
<< "and received one" << _received;
qCDebug(LOG_AW) << "Notification source" << _source << "with current value" << _current << "and received one"
<< _received;
if ((m_enablePopup) && (_current != _received) && (!_received.isEmpty()))
return AWActions::sendNotification("event", notificationText(_source, _received));
@ -231,8 +227,7 @@ void AWDataAggregator::setData(const QVariantHash &_values)
{
// do not log these arguments
// battery update requires info is AC online or not
setData(_values["ac"].toString() == m_configuration["acOnline"], "batTooltip",
_values["bat"].toFloat());
setData(_values["ac"].toString() == m_configuration["acOnline"], "batTooltip", _values["bat"].toFloat());
// usual case
setData("cpuTooltip", _values["cpu"].toFloat(), 90.0);
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"];
// to avoid inf value of normY
netValues << 1.0;
m_boundaries["downkbTooltip"]
= 1.2f * *std::max_element(netValues.cbegin(), netValues.cend());
m_boundaries["downkbTooltip"] = 1.2f * *std::max_element(netValues.cbegin(), netValues.cend());
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)
{
qCDebug(LOG_AW) << "Do not invert" << _dontInvert << "value" << _value << "for source"
<< _source;
qCDebug(LOG_AW) << "Do not invert" << _dontInvert << "value" << _value << "for source" << _source;
// invert values for different battery colours
_value = _dontInvert ? _value : -_value;

View File

@ -50,8 +50,7 @@ private:
QGraphicsScene *m_toolTipScene = nullptr;
QGraphicsView *m_toolTipView = nullptr;
void checkValue(const QString &_source, float _value, float _extremum) const;
void checkValue(const QString &_source, const QString &_current,
const QString &_received) const;
void checkValue(const QString &_source, const QString &_current, const QString &_received) const;
void initScene();
static QString notificationText(const QString &_source, float _value);
static QString notificationText(const QString &_source, const QString &_value);

View File

@ -17,32 +17,35 @@
#include "awdataengineaggregator.h"
#include <Plasma/DataContainer>
#include <ksysguard/formatter/Unit.h>
#include <ksysguard/systemstats/DBusInterface.h>
#include <QDBusConnection>
#include "awdebug.h"
#include "awkeys.h"
AWDataEngineAggregator::AWDataEngineAggregator(QObject *_parent)
: QObject(_parent)
, m_interface(new KSysGuard::SystemStats::DBusInterface())
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
m_consumer = new Plasma::DataEngineConsumer();
m_dataEngines["systemmonitor"] = m_consumer->dataEngine("systemmonitor");
m_dataEngines["extsysmon"] = m_consumer->dataEngine("extsysmon");
m_dataEngines["time"] = m_consumer->dataEngine("time");
qDBusRegisterMetaType<KSysGuard::SensorData>();
qDBusRegisterMetaType<KSysGuard::SensorInfo>();
qDBusRegisterMetaType<KSysGuard::SensorDataList>();
qDBusRegisterMetaType<QHash<QString, KSysGuard::SensorInfo>>();
// additional method required by systemmonitor structure
m_newSourceConnection
= connect(m_dataEngines["systemmonitor"], &Plasma::DataEngine::sourceAdded,
[this](const QString &source) {
emit(deviceAdded(source));
m_dataEngines["systemmonitor"]->connectSource(source, parent(), 1000);
});
connect(m_interface, &KSysGuard::SystemStats::DBusInterface::newSensorData, this,
&AWDataEngineAggregator::updateData);
connect(m_interface, &KSysGuard::SystemStats::DBusInterface::sensorMetaDataChanged, this,
&AWDataEngineAggregator::updateSensors);
connect(m_interface, &KSysGuard::SystemStats::DBusInterface::sensorAdded, this,
&AWDataEngineAggregator::sensorAdded);
connect(m_interface, &KSysGuard::SystemStats::DBusInterface::sensorRemoved, this,
&AWDataEngineAggregator::sensorRemoved);
// required to define Qt::QueuedConnection for signal-slot connection
qRegisterMetaType<Plasma::DataEngine::Data>("Plasma::DataEngine::Data");
loadSources();
}
@ -51,70 +54,102 @@ AWDataEngineAggregator::~AWDataEngineAggregator()
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
disconnectSources();
m_interface->deleteLater();
}
void AWDataEngineAggregator::connectSources()
{
auto keys = m_sensors.keys();
auto newKeys = QSet(keys.cbegin(), keys.cend()) - m_subscribed;
m_interface->subscribe(newKeys.values()).waitForFinished();
m_subscribed.unite(newKeys);
}
void AWDataEngineAggregator::disconnectSources()
{
for (auto dataEngine : m_dataEngines.values())
for (auto &source : dataEngine->sources())
dataEngine->disconnectSource(source, parent());
disconnect(m_newSourceConnection);
m_interface->unsubscribe(m_subscribed.values()).waitForFinished();
m_subscribed.clear();
}
void AWDataEngineAggregator::reconnectSources(const int _interval)
bool AWDataEngineAggregator::isValidSensor(const KSysGuard::SensorInfo &_sensor)
{
qCDebug(LOG_AW) << "Reconnect sources with interval" << _interval;
return _sensor.unit != KSysGuard::UnitInvalid;
}
disconnectSources();
m_dataEngines["systemmonitor"]->connectAllSources(parent(), (uint)_interval);
m_dataEngines["extsysmon"]->connectAllSources(parent(), (uint)_interval);
m_dataEngines["time"]->connectSource("Local", parent(), 1000);
void AWDataEngineAggregator::loadSources()
{
auto response = m_interface->allSensors();
response.waitForFinished();
m_newSourceConnection = connect(
m_dataEngines["systemmonitor"], &Plasma::DataEngine::sourceAdded,
[this, _interval](const QString &source) {
emit(deviceAdded(source));
m_dataEngines["systemmonitor"]->connectSource(source, parent(), (uint)_interval);
});
auto sensors = response.value();
updateSensors(sensors);
connectSources();
#ifdef BUILD_FUTURE
createQueuedConnection();
#endif /* BUILD_FUTURE */
for (auto &sensor : m_sensors.keys())
emit(deviceAdded(sensor));
}
void AWDataEngineAggregator::dropSource(const QString &_source)
{
qCDebug(LOG_AW) << "Source" << _source;
qCDebug(LOG_AW) << "Disconnect sensor" << _source;
// HACK there is no possibility to check to which dataengine source
// connected we will try to disconnect it from all engines
for (auto dataEngine : m_dataEngines.values())
dataEngine->disconnectSource(_source, parent());
}
void AWDataEngineAggregator::createQueuedConnection()
{
// HACK additional method which forces QueuedConnection instead of Auto one
// for more details refer to plasma-framework source code
for (auto &dataEngine : m_dataEngines.keys()) {
// different source set for different engines
QStringList sources = dataEngine == "time" ? QStringList() << "Local"
: m_dataEngines[dataEngine]->sources();
// reconnect sources
for (auto &source : sources) {
Plasma::DataContainer *container
= m_dataEngines[dataEngine]->containerForSource(source);
// disconnect old connections first
disconnect(container, SIGNAL(dataUpdated(QString, Plasma::DataEngine::Data)), parent(),
SLOT(dataUpdated(QString, Plasma::DataEngine::Data)));
// and now reconnect with Qt::QueuedConnection type
connect(container, SIGNAL(dataUpdated(QString, Plasma::DataEngine::Data)), parent(),
SLOT(dataUpdated(QString, Plasma::DataEngine::Data)), Qt::QueuedConnection);
}
if (m_subscribed.contains(_source)) {
m_interface->unsubscribe({_source}).waitForFinished();
m_subscribed.remove(_source);
}
}
void AWDataEngineAggregator::sensorAdded(const QString &_sensor)
{
qCDebug(LOG_AW) << "New sensor added" << _sensor;
// check if sensor is actually valid
auto response = m_interface->sensors({_sensor});
response.waitForFinished();
auto info = response.value().value(_sensor);
if (!isValidSensor(info))
return;
m_sensors[_sensor] = info;
dropSource(_sensor); // force reconnect
if (!m_subscribed.contains(_sensor)) {
m_interface->subscribe({_sensor}).waitForFinished();
m_subscribed.insert(_sensor);
}
// notify about new device
emit(deviceAdded(_sensor));
}
void AWDataEngineAggregator::sensorRemoved(const QString &_sensor)
{
qCDebug(LOG_AW) << "Sensor" << _sensor << "has been removed";
m_sensors.remove(_sensor);
dropSource(_sensor);
}
void AWDataEngineAggregator::updateData(KSysGuard::SensorDataList _data)
{
emit(dataUpdated(m_sensors, _data));
}
void AWDataEngineAggregator::updateSensors(const QHash<QString, KSysGuard::SensorInfo> &_sensors)
{
for (auto sensor = _sensors.cbegin(); sensor != _sensors.cend(); ++sensor) {
if (!isValidSensor(sensor.value()))
continue;
m_sensors.insert(sensor.key(), sensor.value());
}
}

View File

@ -15,16 +15,20 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#pragma once
#ifndef AWDATAENGINEAGGREGATOR_H
#define AWDATAENGINEAGGREGATOR_H
#include <Plasma/DataEngine>
#include <Plasma/DataEngineConsumer>
#include <ksysguard/systemstats/SensorInfo.h>
#include <QHash>
#include <QObject>
#include <QSet>
namespace KSysGuard::SystemStats
{
class DBusInterface;
}
class AWDataEngineAggregator : public QObject
{
Q_OBJECT
@ -32,21 +36,24 @@ class AWDataEngineAggregator : public QObject
public:
explicit AWDataEngineAggregator(QObject *_parent = nullptr);
~AWDataEngineAggregator() override;
void connectSources();
void disconnectSources();
void reconnectSources(int _interval);
[[nodiscard]] static bool isValidSensor(const KSysGuard::SensorInfo &_sensor);
void loadSources();
signals:
void dataUpdated(const QHash<QString, KSysGuard::SensorInfo> &_sensors, const KSysGuard::SensorDataList &_data);
void deviceAdded(const QString &_source);
public slots:
void dropSource(const QString &_source);
void sensorAdded(const QString &_sensor);
void sensorRemoved(const QString &_sensor);
void updateData(KSysGuard::SensorDataList _data);
void updateSensors(const QHash<QString, KSysGuard::SensorInfo> &_sensors);
private:
void createQueuedConnection();
Plasma::DataEngineConsumer *m_consumer = nullptr;
QHash<QString, Plasma::DataEngine *> m_dataEngines;
QMetaObject::Connection m_newSourceConnection;
KSysGuard::SystemStats::DBusInterface *m_interface = nullptr;
QHash<QString, KSysGuard::SensorInfo> m_sensors;
QSet<QString> m_subscribed;
};
#endif /* AWDATAENGINEAGGREGATOR_H */

View File

@ -17,7 +17,7 @@
#include "awdataenginemapper.h"
#include <QRegExp>
#include <QRegularExpression>
#include "awdebug.h"
#include "awformatterhelper.h"
@ -76,77 +76,80 @@ QStringList AWDataEngineMapper::keysFromSource(const QString &_source) const
// HACK units required to define should the value be calculated as temperature
// or fan data
QStringList AWDataEngineMapper::registerSource(const QString &_source, const QString &_units,
QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSysGuard::Unit _units,
const QStringList &_keys)
{
qCDebug(LOG_AW) << "Source" << _source << "with units" << _units;
// regular expressions
QRegExp cpuRegExp = QRegExp("cpu/cpu.*/TotalLoad");
QRegExp cpuclRegExp = QRegExp("cpu/cpu.*/clock");
QRegExp hddrRegExp = QRegExp("disk/.*/Rate/rblk");
QRegExp hddwRegExp = QRegExp("disk/.*/Rate/wblk");
QRegExp mountFillRegExp = QRegExp("partitions/.*/filllevel");
QRegExp mountFreeRegExp = QRegExp("partitions/.*/freespace");
QRegExp mountUsedRegExp = QRegExp("partitions/.*/usedspace");
QRegExp netRegExp = QRegExp("network/interfaces/.*/(receiver|transmitter)/data$");
QRegExp netTotalRegExp = QRegExp("network/interfaces/.*/(receiver|transmitter)/dataTotal$");
auto cpuRegExp = QRegularExpression("^cpu/cpu.*/usage$");
auto cpuclRegExp = QRegularExpression("^cpu/cpu.*/frequency$");
auto cpuTempRegExp = QRegularExpression("^cpu/cpu.*/temperature$");
auto gpuRegExp = QRegularExpression("^gpu/gpu.*/usage$");
auto gpuTempRegExp = QRegularExpression("^gpu/gpu.*/temperature$");
auto hddrRegExp = QRegularExpression("^disk/.*/read$");
auto hddwRegExp = QRegularExpression("^disk/.*/write$");
auto mountFillRegExp = QRegularExpression("^disk/.*/usedPercent$");
auto mountFreeRegExp = QRegularExpression("^disk/.*/free$");
auto mountUsedRegExp = QRegularExpression("^disk/.*/used$");
auto netRegExp = QRegularExpression("^network/.*/(download|upload)$");
auto netTotalRegExp = QRegularExpression("^network/.*/(totalDownload|totalUpload)$");
if (_source == "battery/ac") {
if (_source == "extsysmon/battery/ac") {
// AC
m_map.insert(_source, "ac");
m_formatter["ac"] = AWKeysAggregator::FormatterType::ACFormat;
} else if (_source.startsWith("battery/")) {
} else if (_source.startsWith("extsysmon/battery/")) {
// battery stats
QString key = _source;
key.remove("battery/");
auto key = _source;
key.remove("extsysmon/battery/");
m_map.insert(_source, key);
m_formatter[key] = _source.contains("rate") ? AWKeysAggregator::FormatterType::Float
: AWKeysAggregator::FormatterType::IntegerThree;
} else if (_source == "cpu/system/TotalLoad") {
} else if (_source == "cpu/all/usage") {
// cpu
m_map.insert(_source, "cpu");
m_formatter["cpu"] = AWKeysAggregator::FormatterType::Float;
} else if (_source.contains(cpuRegExp)) {
// cpus
QString key = _source;
key.remove("cpu/").remove("/TotalLoad");
auto key = _source;
key.remove("cpu/").remove("/usage");
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Float;
} else if (_source == "cpu/system/AverageClock") {
} else if (_source == "cpu/all/averageFrequency") {
// cpucl
m_map.insert(_source, "cpucl");
m_formatter["cpucl"] = AWKeysAggregator::FormatterType::Integer;
} else if (_source.contains(cpuclRegExp)) {
// cpucls
QString key = _source;
key.remove("cpu/cpu").remove("/clock");
auto key = _source;
key.remove("cpu/cpu").remove("/frequency");
key = QString("cpucl%1").arg(key);
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Integer;
} else if (_source.startsWith("custom")) {
} else if (_source.startsWith("extsysmon/custom")) {
// custom
QString key = _source;
key.remove("custom/");
auto key = _source;
key.remove("extsysmon/custom/");
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source == "desktop/current/name") {
} else if (_source == "extsysmon/desktop/name") {
// current desktop name
m_map.insert(_source, "desktop");
m_formatter["desktop"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source == "desktop/current/number") {
} else if (_source == "extsysmon/desktop/number") {
// current desktop number
m_map.insert(_source, "ndesktop");
m_formatter["ndesktop"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source == "desktop/total/number") {
} else if (_source == "extsysmon/desktop/count") {
// desktop count
m_map.insert(_source, "tdesktops");
m_formatter["tdesktops"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source.contains(hddrRegExp)) {
// read speed
QString device = _source;
device.remove("/Rate/rblk");
int index = m_devices["disk"].indexOf(device);
auto device = _source;
device.remove("disk/").remove("/read");
auto index = m_devices["disk"].indexOf(device);
if (index > -1) {
QString key = QString("hddr%1").arg(index);
m_map.insert(_source, key);
@ -154,42 +157,56 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const QSt
}
} else if (_source.contains(hddwRegExp)) {
// write speed
QString device = _source;
device.remove("/Rate/wblk");
int index = m_devices["disk"].indexOf(device);
auto device = _source;
device.remove("disk/").remove("/write");
auto index = m_devices["disk"].indexOf(device);
if (index > -1) {
QString key = QString("hddw%1").arg(index);
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Integer;
}
} else if (_source == "gpu/load") {
} else if (_source == "gpu/all/usage") {
// gpu load
m_map.insert(_source, "gpu");
m_formatter["gpu"] = AWKeysAggregator::FormatterType::Float;
} else if (_source == "gpu/temperature") {
// gpu temperature
m_map.insert(_source, "gputemp");
m_formatter["gputemp"] = AWKeysAggregator::FormatterType::Temperature;
} else if (_source.contains(gpuRegExp)) {
// gpus
auto device = _source;
device.remove("gpu/").remove("/usage");
auto index = m_devices["gpu"].indexOf(device);
if (index > -1) {
auto key = QString("gpu%1").arg(index);
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Float;
}
} else if (_source.contains(gpuTempRegExp)) {
// gpus temps
auto device = _source;
device.remove("gpu/").remove("/temperature");
auto index = m_devices["gpu"].indexOf(device);
if (index > -1) {
auto key = QString("gputemp%1").arg(index);
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Temperature;
}
} else if (_source.contains(mountFillRegExp)) {
// fill level
QString device = _source;
device.remove("partitions").remove("/filllevel");
int index = m_devices["mount"].indexOf(device);
auto device = _source;
device.remove("disk/").remove("/usedPercent");
auto index = m_devices["mount"].indexOf(device);
if (index > -1) {
QString key = QString("hdd%1").arg(index);
auto key = QString("hdd%1").arg(index);
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Float;
// additional keys
m_formatter[QString("hddtotmb%1").arg(index)]
= AWKeysAggregator::FormatterType::MemMBFormat;
m_formatter[QString("hddtotgb%1").arg(index)]
= AWKeysAggregator::FormatterType::MemGBFormat;
m_formatter[QString("hddtotmb%1").arg(index)] = AWKeysAggregator::FormatterType::MemMBFormat;
m_formatter[QString("hddtotgb%1").arg(index)] = AWKeysAggregator::FormatterType::MemGBFormat;
}
} else if (_source.contains(mountFreeRegExp)) {
// free space
QString device = _source;
device.remove("partitions").remove("/freespace");
int index = m_devices["mount"].indexOf(device);
auto device = _source;
device.remove("disk/").remove("/free");
auto index = m_devices["mount"].indexOf(device);
if (index > -1) {
// mb
QString key = QString("hddfreemb%1").arg(index);
@ -202,9 +219,9 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const QSt
}
} else if (_source.contains(mountUsedRegExp)) {
// used
QString device = _source;
device.remove("partitions").remove("/usedspace");
int index = m_devices["mount"].indexOf(device);
auto device = _source;
device.remove("disk/").remove("/used");
auto index = m_devices["mount"].indexOf(device);
if (index > -1) {
// mb
QString key = QString("hddmb%1").arg(index);
@ -215,24 +232,14 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const QSt
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::MemGBFormat;
}
} else if (_source.startsWith("hdd/temperature")) {
// hdd temperature
QString device = _source;
device.remove("hdd/temperature");
int index = m_devices["hdd"].indexOf(device);
if (index > -1) {
QString key = QString("hddtemp%1").arg(index);
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Temperature;
}
} else if (_source.startsWith("cpu/system/loadavg")) {
} else if (_source.startsWith("cpu/loadaverages/loadaverage")) {
// load average
QString time = _source;
time.remove("cpu/system/loadavg");
QString key = QString("la%1").arg(time);
auto time = _source;
time.remove("cpu/loadaverages/loadaverage");
auto key = QString("la%1").arg(time);
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::FloatTwoSymbols;
} else if (_source == "mem/physical/application") {
} else if (_source == "memory/physical/application") {
// app memory
// mb
m_map.insert(_source, "memmb");
@ -240,7 +247,7 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const QSt
// gb
m_map.insert(_source, "memgb");
m_formatter["memgb"] = AWKeysAggregator::FormatterType::MemGBFormat;
} else if (_source == "mem/physical/free") {
} else if (_source == "memory/physical/free") {
// free memory
// mb
m_map.insert(_source, "memfreemb");
@ -248,7 +255,7 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const QSt
// gb
m_map.insert(_source, "memfreegb");
m_formatter["memfreegb"] = AWKeysAggregator::FormatterType::MemGBFormat;
} else if (_source == "mem/physical/used") {
} else if (_source == "memory/physical/used") {
// used memory
// mb
m_map.insert(_source, "memusedmb");
@ -256,27 +263,27 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const QSt
// gb
m_map.insert(_source, "memusedgb");
m_formatter["memusedgb"] = AWKeysAggregator::FormatterType::MemGBFormat;
} else if (_source == "network/current/name") {
} else if (_source == "extsysmon/network/device") {
// network device
m_map.insert(_source, "netdev");
m_formatter["netdev"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source == "network/current/ssid") {
} else if (_source == "extsysmon/network/ssid") {
// current ssid
m_map.insert(_source, "ssid");
m_formatter["ssid"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source.startsWith("network/response")) {
} else if (_source.startsWith("extsysmon/requests/response")) {
// network response
QString key = _source;
key.remove("network/");
auto key = _source;
key.remove("extsysmon/requests/");
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source.contains(netRegExp)) {
// network speed
QString type = _source.contains("receiver") ? "down" : "up";
int index = m_devices["net"].indexOf(_source.split('/')[2]);
auto type = _source.endsWith("download") ? "down" : "up";
auto index = m_devices["net"].indexOf(_source.split('/')[1]);
if (index > -1) {
// kb
QString key = QString("%1kb%2").arg(type).arg(index);
auto key = QString("%1kb%2").arg(type).arg(index);
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Integer;
// smart
@ -290,11 +297,11 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const QSt
}
} else if (_source.contains(netTotalRegExp)) {
// network data total
QString type = _source.contains("receiver") ? "down" : "up";
int index = m_devices["net"].indexOf(_source.split('/')[2]);
auto type = _source.endsWith("Download") ? "down" : "up";
auto index = m_devices["net"].indexOf(_source.split('/')[1]);
if (index > -1) {
// kb
QString key = QString("%1totkb%2").arg(type).arg(index);
auto key = QString("%1totkb%2").arg(type).arg(index);
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Integer;
// mb
@ -302,37 +309,37 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const QSt
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::MemMBFormat;
}
} else if (_source.startsWith("upgrade")) {
} else if (_source.startsWith("extsysmon/upgrade")) {
// package manager
QString key = _source;
key.remove("upgrade/");
auto key = _source;
key.remove("extsysmon/upgrade/");
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::IntegerThree;
} else if (_source.startsWith("player")) {
} else if (_source.startsWith("extsysmon/player")) {
// player
QString key = _source;
key.remove("player/");
auto key = _source;
key.remove("extsysmon/player/");
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source == "ps/running/count") {
} else if (_source == "extsysmon/ps/running") {
// running processes count
m_map.insert(_source, "pscount");
m_formatter["pscount"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source == "ps/running/list") {
} else if (_source == "extsysmon/ps/list") {
// list of running processes
m_map.insert(_source, "ps");
m_formatter["ps"] = AWKeysAggregator::FormatterType::List;
} else if (_source == "ps/total/count") {
} else if (_source == "extsysmon/ps/count") {
// total processes count
m_map.insert(_source, "pstot");
m_formatter["pstot"] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source.startsWith("quotes")) {
} else if (_source.startsWith("extsysmon/quotes")) {
// quotes
QString key = _source;
key.remove("quotes/");
auto key = _source;
key.remove("extsysmon/quotes/");
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Quotes;
} else if (_source == "mem/swap/free") {
} else if (_source == "memory/swap/free") {
// free swap
// mb
m_map.insert(_source, "swapfreemb");
@ -340,7 +347,7 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const QSt
// gb
m_map.insert(_source, "swapfreegb");
m_formatter["swapfreegb"] = AWKeysAggregator::FormatterType::MemGBFormat;
} else if (_source == "mem/swap/used") {
} else if (_source == "memory/swap/used") {
// used swap
// mb
m_map.insert(_source, "swapmb");
@ -348,19 +355,20 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const QSt
// gb
m_map.insert(_source, "swapgb");
m_formatter["swapgb"] = AWKeysAggregator::FormatterType::MemGBFormat;
} else if (_source.startsWith("lmsensors/")) {
} else if (_source.startsWith("lmsensors/") || _source.contains(cpuTempRegExp)
|| _source == "cpu/all/averageTemperature") {
// temperature
int index = m_devices["temp"].indexOf(_source);
auto index = m_devices["temp"].indexOf(_source);
// HACK on DE initialization there are no units key
if (_units.isEmpty())
if (_units == KSysGuard::UnitInvalid)
return QStringList({QString("temp%1").arg(index)});
if (index > -1) {
QString key = QString("temp%1").arg(index);
auto key = QString("temp%1").arg(index);
m_map.insert(_source, key);
m_formatter[key] = _units == "°C" ? AWKeysAggregator::FormatterType::Temperature
: AWKeysAggregator::FormatterType::Integer;
m_formatter[key] = _units == KSysGuard::UnitCelsius ? AWKeysAggregator::FormatterType::Temperature
: AWKeysAggregator::FormatterType::Integer;
}
} else if (_source == "Local") {
} else if (_source == "extsysmon/time/now") {
// time
m_map.insert(_source, "time");
m_formatter["time"] = AWKeysAggregator::FormatterType::Time;
@ -379,40 +387,40 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const QSt
// timestamp
m_map.insert(_source, "tstime");
m_formatter["tstime"] = AWKeysAggregator::FormatterType::Timestamp;
} else if (_source == "system/brightness") {
} else if (_source == "extsysmon/system/brightness") {
m_map.insert(_source, "brightness");
m_formatter["brightness"] = AWKeysAggregator::FormatterType::IntegerThree;
} else if (_source == "system/volume") {
} else if (_source == "extsysmon/system/volume") {
m_map.insert(_source, "volume");
m_formatter["volume"] = AWKeysAggregator::FormatterType::IntegerThree;
} else if (_source == "system/uptime") {
} else if (_source == "os/system/uptime") {
// uptime
m_map.insert(_source, "uptime");
m_formatter["uptime"] = AWKeysAggregator::FormatterType::Uptime;
// custom uptime
m_map.insert(_source, "cuptime");
m_formatter["cuptime"] = AWKeysAggregator::FormatterType::UptimeCustom;
} else if (_source.startsWith("weather/temperature")) {
} else if (_source.startsWith("extsysmon/weather/temperature")) {
// temperature
QString key = _source;
key.remove("weather/");
auto key = _source;
key.remove("extsysmon/weather/");
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Temperature;
} else if (_source.startsWith("weather/")) {
} else if (_source.startsWith("extsysmon/weather/")) {
// other weather
QString key = _source;
key.remove("weather/");
auto key = _source;
key.remove("extsysmon/weather/");
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat;
} else if (_source.startsWith("load/load")) {
} else if (_source.startsWith("extsysmon/load/load")) {
// load source
QString key = _source;
key.remove("load/");
auto key = _source;
key.remove("extsysmon/load/");
m_map.insert(_source, key);
m_formatter[key] = AWKeysAggregator::FormatterType::Temperature;
}
QStringList foundKeys = keysFromSource(_source);
auto foundKeys = keysFromSource(_source);
// rewrite formatters for custom ones
QStringList customFormattersKeys;
@ -427,9 +435,9 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const QSt
// drop key from dictionary if no one user requested key required it
qCInfo(LOG_AW) << "Looking for keys" << foundKeys << "in" << _keys;
bool required = _keys.isEmpty()
|| std::any_of(foundKeys.cbegin(), foundKeys.cend(),
[&_keys](const QString &key) { return _keys.contains(key); });
auto required = _keys.isEmpty() || std::any_of(foundKeys.cbegin(), foundKeys.cend(), [&_keys](const QString &key) {
return _keys.contains(key);
});
if (!required) {
m_map.remove(_source);
for (auto &key : foundKeys)

View File

@ -19,6 +19,8 @@
#ifndef AWDATAENGINEMAPPER_H
#define AWDATAENGINEMAPPER_H
#include <ksysguard/formatter/Unit.h>
#include <QMultiHash>
#include <QObject>
@ -38,8 +40,7 @@ public:
[[nodiscard]] AWKeysAggregator::FormatterType formatter(const QString &_key) const;
[[nodiscard]] QStringList keysFromSource(const QString &_source) const;
// set methods
QStringList registerSource(const QString &_source, const QString &_units,
const QStringList &_keys);
QStringList registerSource(const QString &_source, const KSysGuard::Unit _units, const QStringList &_keys);
void setDevices(const QHash<QString, QStringList> &_devices);
private:

View File

@ -38,10 +38,9 @@ AWDBusAdaptor::~AWDBusAdaptor()
}
QStringList AWDBusAdaptor::ActiveServices() const
QStringList AWDBusAdaptor::ActiveServices()
{
QDBusMessage listServices
= QDBusConnection::sessionBus().interface()->call(QDBus::BlockWithGui, "ListNames");
QDBusMessage listServices = QDBusConnection::sessionBus().interface()->call(QDBus::BlockWithGui, "ListNames");
if (listServices.arguments().isEmpty()) {
qCWarning(LOG_DBUS) << "Could not find any DBus service";
return {};
@ -49,7 +48,7 @@ QStringList AWDBusAdaptor::ActiveServices() const
QStringList arguments = listServices.arguments().first().toStringList();
return std::accumulate(arguments.cbegin(), arguments.cend(), QStringList(),
[](QStringList &source, const QString &service) {
[](QStringList source, const QString &service) {
if (service.startsWith(AWDBUS_SERVICE))
source.append(service);
return source;
@ -86,8 +85,7 @@ void AWDBusAdaptor::SetLogLevel(const QString &what, const int level)
qCDebug(LOG_DBUS) << "Set log level" << level << "for" << what;
if (level >= m_logLevels.count()) {
qCDebug(LOG_DBUS) << "Invalid logging level" << level << "should be less than"
<< m_logLevels.count();
qCDebug(LOG_DBUS) << "Invalid logging level" << level << "should be less than" << m_logLevels.count();
return;
}

View File

@ -37,7 +37,7 @@ public:
public slots:
// get methods
[[nodiscard]] QStringList ActiveServices() const;
[[nodiscard]] static QStringList ActiveServices();
[[nodiscard]] QString Info(const QString &key) const;
[[nodiscard]] QStringList Keys(const QString &regexp) const;
[[nodiscard]] QString Value(const QString &key) const;

View File

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

View File

@ -102,7 +102,7 @@ void AWFormatterHelper::editPairs()
QStringList AWFormatterHelper::leftKeys()
{
return QStringList();
return {};
}
@ -114,14 +114,12 @@ QStringList AWFormatterHelper::rightKeys()
void AWFormatterHelper::editItems()
{
repaintList();
int ret = exec();
auto ret = exec();
qCInfo(LOG_AW) << "Dialog returns" << ret;
}
AWAbstractFormatter::FormatterClass
AWFormatterHelper::defineFormatterClass(const QString &_stringType)
AWAbstractFormatter::FormatterClass AWFormatterHelper::defineFormatterClass(const QString &_stringType)
{
qCDebug(LOG_AW) << "Define formatter class for" << _stringType;
@ -163,9 +161,7 @@ void AWFormatterHelper::initFormatters()
// check if already exists
auto values = m_formattersClasses.values();
if (std::any_of(values.cbegin(), values.cend(),
[&filePath](const AWAbstractFormatter *item) {
return (item->fileName() == filePath);
}))
[&filePath](const AWAbstractFormatter *item) { return (item->fileName() == filePath); }))
continue;
auto metadata = readMetadata(filePath);
@ -197,28 +193,26 @@ void AWFormatterHelper::initFormatters()
}
QPair<QString, AWAbstractFormatter::FormatterClass>
AWFormatterHelper::readMetadata(const QString &_filePath)
QPair<QString, AWAbstractFormatter::FormatterClass> AWFormatterHelper::readMetadata(const QString &_filePath)
{
qCDebug(LOG_AW) << "Read initial parameters from" << _filePath;
QSettings settings(_filePath, QSettings::IniFormat);
settings.beginGroup("Desktop Entry");
QString name = settings.value("Name", _filePath).toString();
QString type = settings.value("X-AW-Type", "NoFormat").toString();
AWAbstractFormatter::FormatterClass formatter = defineFormatterClass(type);
auto name = settings.value("Name", _filePath).toString();
auto type = settings.value("X-AW-Type", "NoFormat").toString();
auto formatter = defineFormatterClass(type);
settings.endGroup();
return QPair<QString, AWAbstractFormatter::FormatterClass>(name, formatter);
}
void AWFormatterHelper::doCreateItem()
void AWFormatterHelper::doCreateItem(QListWidget *_widget)
{
QStringList selection = {"NoFormat", "DateTime", "Float", "List", "Script", "String", "Json"};
bool ok;
QString select
= QInputDialog::getItem(this, i18n("Select type"), i18n("Type:"), selection, 0, false, &ok);
auto select = QInputDialog::getItem(nullptr, i18n("Select type"), i18n("Type:"), selection, 0, false, &ok);
if (!ok) {
qCWarning(LOG_AW) << "No type selected";
return;
@ -228,18 +222,18 @@ void AWFormatterHelper::doCreateItem()
AWAbstractFormatter::FormatterClass formatter = defineFormatterClass(select);
switch (formatter) {
case AWAbstractFormatter::FormatterClass::DateTime:
return createItem<AWDateTimeFormatter>();
return createItem<AWDateTimeFormatter>(_widget);
case AWAbstractFormatter::FormatterClass::Float:
return createItem<AWFloatFormatter>();
return createItem<AWFloatFormatter>(_widget);
case AWAbstractFormatter::FormatterClass::List:
return createItem<AWListFormatter>();
return createItem<AWListFormatter>(_widget);
case AWAbstractFormatter::FormatterClass::Script:
return createItem<AWScriptFormatter>();
return createItem<AWScriptFormatter>(_widget);
case AWAbstractFormatter::FormatterClass::String:
return createItem<AWStringFormatter>();
return createItem<AWStringFormatter>(_widget);
case AWAbstractFormatter::FormatterClass::Json:
return createItem<AWJsonFormatter>();
return createItem<AWJsonFormatter>(_widget);
case AWAbstractFormatter::FormatterClass::NoFormat:
return createItem<AWNoFormatter>();
return createItem<AWNoFormatter>(_widget);
}
}

View File

@ -49,10 +49,9 @@ private:
// methods
static AWAbstractFormatter::FormatterClass defineFormatterClass(const QString &_stringType);
void initFormatters();
[[nodiscard]] static QPair<QString, AWAbstractFormatter::FormatterClass>
readMetadata(const QString &_filePath);
[[nodiscard]] static QPair<QString, AWAbstractFormatter::FormatterClass> readMetadata(const QString &_filePath);
// parent methods
void doCreateItem() override;
void doCreateItem(QListWidget *_widget) override;
// properties
QHash<QString, AWAbstractFormatter *> m_formatters;
QHash<QString, AWAbstractFormatter *> m_formattersClasses;

View File

@ -20,6 +20,7 @@
#include <QDir>
#include <QNetworkInterface>
#include <QRegularExpression>
#include <QSettings>
#include <QStandardPaths>
@ -30,9 +31,8 @@ bool AWKeyCache::addKeyToCache(const QString &_type, const QString &_key)
{
qCDebug(LOG_AW) << "Key" << _key << "with type" << _type;
QString fileName
= QString("%1/awesomewidgets.ndx")
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation));
auto fileName
= QString("%1/awesomewidgets.ndx").arg(QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation));
qCInfo(LOG_AW) << "Cache file" << fileName;
QSettings cache(fileName, QSettings::IniFormat);
@ -41,19 +41,8 @@ bool AWKeyCache::addKeyToCache(const QString &_type, const QString &_key)
for (auto &number : cache.allKeys())
cachedValues.append(cache.value(number).toString());
if (_type == "hdd") {
QStringList allDevices = QDir("/dev").entryList(QDir::System, QDir::Name);
QStringList devices = allDevices.filter(QRegExp("^[hms]d[a-z]$"));
for (auto &dev : devices) {
QString device = QString("/dev/%1").arg(dev);
if (cachedValues.contains(device))
continue;
qCInfo(LOG_AW) << "Found new key" << device << "for type" << _type;
cachedValues.append(device);
cache.setValue(QString("%1").arg(cache.allKeys().count(), 3, 10, QChar('0')), device);
}
} else if (_type == "net") {
QList<QNetworkInterface> rawInterfaceList = QNetworkInterface::allInterfaces();
if (_type == "net") {
auto rawInterfaceList = QNetworkInterface::allInterfaces();
for (auto &interface : rawInterfaceList) {
QString device = interface.name();
if (cachedValues.contains(device))
@ -75,12 +64,10 @@ bool AWKeyCache::addKeyToCache(const QString &_type, const QString &_key)
}
QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, const QStringList &_bars,
const QVariantMap &_tooltip, const QStringList &_userKeys,
const QStringList &_allKeys)
QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, const QStringList &_bars, const QVariantMap &_tooltip,
const QStringList &_userKeys, const QStringList &_allKeys)
{
qCDebug(LOG_AW) << "Looking for required keys in" << _keys << _bars << "using tooltip settings"
<< _tooltip;
qCDebug(LOG_AW) << "Looking for required keys in" << _keys << _bars << "using tooltip settings" << _tooltip;
// initial copy
QSet<QString> used(_keys.cbegin(), _keys.cend());
@ -96,19 +83,19 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, const QStringL
// insert depending keys, refer to AWKeys::calculateValues()
// hddtotmb*
for (auto &key : _allKeys.filter(QRegExp("^hddtotmb"))) {
for (auto &key : _allKeys.filter(QRegularExpression("^hddtotmb"))) {
if (!used.contains(key))
continue;
key.remove("hddtotmb");
int index = key.toInt();
auto index = key.toInt();
used << QString("hddfreemb%1").arg(index) << QString("hddmb%1").arg(index);
}
// hddtotgb*
for (auto &key : _allKeys.filter(QRegExp("^hddtotgb"))) {
for (auto &key : _allKeys.filter(QRegularExpression("^hddtotgb"))) {
if (!used.contains(key))
continue;
key.remove("hddtotgb");
int index = key.toInt();
auto index = key.toInt();
used << QString("hddfreegb%1").arg(index) << QString("hddgb%1").arg(index);
}
// mem
@ -136,18 +123,17 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, const QStringL
used << "swapgb"
<< "swapfreegb";
// network keys
QStringList netKeys({"up", "upkb", "uptot", "uptotkb", "upunits", "down", "downkb", "downtot",
"downtotkb", "downunits"});
QStringList netKeys(
{"up", "upkb", "uptot", "uptotkb", "upunits", "down", "downkb", "downtot", "downtotkb", "downunits"});
for (auto &key : netKeys) {
if (!used.contains(key))
continue;
QStringList filt = _allKeys.filter(QRegExp(QString("^%1[0-9]{1,}").arg(key)));
auto filt = _allKeys.filter(QRegularExpression(QString("^%1[0-9]{1,}").arg(key)));
for (auto &filtered : filt)
used << filtered;
}
// netdev key
if (std::any_of(netKeys.cbegin(), netKeys.cend(),
[&used](const QString &key) { return used.contains(key); }))
if (std::any_of(netKeys.cbegin(), netKeys.cend(), [&used](const QString &key) { return used.contains(key); }))
used << "netdev";
// HACK append dummy if there are no other keys. This hack is required
@ -161,9 +147,8 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, const QStringL
QHash<QString, QStringList> AWKeyCache::loadKeysFromCache()
{
QString fileName
= QString("%1/awesomewidgets.ndx")
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation));
auto fileName
= QString("%1/awesomewidgets.ndx").arg(QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation));
qCInfo(LOG_AW) << "Cache file" << fileName;
QSettings cache(fileName, QSettings::IniFormat);

View File

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

View File

@ -18,8 +18,7 @@
#include "awkeyoperations.h"
#include <QDir>
#include <QJSEngine>
#include <QRegExp>
#include <QRegularExpression>
#include <QThread>
#include "awcustomkeyshelper.h"
@ -73,7 +72,6 @@ QHash<QString, QStringList> AWKeyOperations::devices() const
void AWKeyOperations::updateCache()
{
// update network and hdd list
addKeyToCache("hdd");
addKeyToCache("net");
}
@ -91,15 +89,20 @@ QStringList AWKeyOperations::dictKeys() const
allKeys.append(item->tag("timestamp"));
}
// cpuclock & cpu
for (int i = 0; i < QThread::idealThreadCount(); i++) {
for (auto i = 0; i < QThread::idealThreadCount(); i++) {
allKeys.append(QString("cpucl%1").arg(i));
allKeys.append(QString("cpu%1").arg(i));
}
// temperature
for (int i = 0; i < m_devices["temp"].count(); i++)
for (auto i = 0; i < m_devices["temp"].count(); i++)
allKeys.append(QString("temp%1").arg(i));
// gpu
for (auto i = 0; i < m_devices["gpu"].count(); i++) {
allKeys.append(QString("gpu%1").arg(i));
allKeys.append(QString("gputemp%1").arg(i));
}
// hdd
for (int i = 0; i < m_devices["mount"].count(); i++) {
for (auto i = 0; i < m_devices["mount"].count(); i++) {
allKeys.append(QString("hddmb%1").arg(i));
allKeys.append(QString("hddgb%1").arg(i));
allKeys.append(QString("hddfreemb%1").arg(i));
@ -109,15 +112,12 @@ QStringList AWKeyOperations::dictKeys() const
allKeys.append(QString("hdd%1").arg(i));
}
// hdd speed
for (int i = 0; i < m_devices["disk"].count(); i++) {
for (auto i = 0; i < m_devices["disk"].count(); i++) {
allKeys.append(QString("hddr%1").arg(i));
allKeys.append(QString("hddw%1").arg(i));
}
// hdd temp
for (int i = 0; i < m_devices["hdd"].count(); i++)
allKeys.append(QString("hddtemp%1").arg(i));
// network
for (int i = 0; i < m_devices["net"].count(); i++) {
for (auto i = 0; i < m_devices["net"].count(); i++) {
allKeys.append(QString("downunits%1").arg(i));
allKeys.append(QString("upunits%1").arg(i));
allKeys.append(QString("downtotkb%1").arg(i));
@ -130,9 +130,8 @@ QStringList AWKeyOperations::dictKeys() const
allKeys.append(QString("up%1").arg(i));
}
// battery
QStringList allBatteryDevices
= QDir("/sys/class/power_supply")
.entryList(QStringList({"BAT*"}), QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name);
auto allBatteryDevices = QDir("/sys/class/power_supply")
.entryList(QStringList({"BAT*"}), QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name);
for (int i = 0; i < allBatteryDevices.count(); i++) {
allKeys.append(QString("bat%1").arg(i));
allKeys.append(QString("batleft%1").arg(i));
@ -206,52 +205,48 @@ QString AWKeyOperations::infoByKey(const QString &_key) const
{
qCDebug(LOG_AW) << "Requested key" << _key;
QString stripped = _key;
stripped.remove(QRegExp("\\d+"));
auto stripped = _key;
stripped.remove(QRegularExpression("\\d+"));
QString output;
if (_key.startsWith("bar")) {
AbstractExtItem *item = m_graphicalItems->itemByTag(_key, stripped);
auto *item = m_graphicalItems->itemByTag(_key, stripped);
if (item)
output = item->uniq();
} else if (_key.startsWith("custom")) {
AbstractExtItem *item = m_extScripts->itemByTag(_key, stripped);
auto *item = m_extScripts->itemByTag(_key, stripped);
if (item)
output = item->uniq();
} else if (_key.contains(QRegExp("^hdd[rw]"))) {
QString index = _key;
index.remove(QRegExp("hdd[rw]"));
} else if (_key.contains(QRegularExpression("^hdd[rw]"))) {
auto index = _key;
index.remove(QRegularExpression("hdd[rw]"));
output = m_devices["disk"][index.toInt()];
} else if (_key.contains(QRegExp("^hdd([0-9]|mb|gb|freemb|freegb|totmb|totgb)"))) {
QString index = _key;
index.remove(QRegExp("^hdd(|mb|gb|freemb|freegb|totmb|totgb)"));
} else if (_key.contains(QRegularExpression("^hdd([0-9]|mb|gb|freemb|freegb|totmb|totgb)"))) {
auto index = _key;
index.remove(QRegularExpression("^hdd(|mb|gb|freemb|freegb|totmb|totgb)"));
output = m_devices["mount"][index.toInt()];
} else if (_key.startsWith("hddtemp")) {
QString index = _key;
index.remove("hddtemp");
output = m_devices["hdd"][index.toInt()];
} else if (_key.contains(QRegExp("^(down|up)[0-9]"))) {
QString index = _key;
index.remove(QRegExp("^(down|up)"));
} else if (_key.contains(QRegularExpression("^(down|up)[0-9]"))) {
auto index = _key;
index.remove(QRegularExpression("^(down|up)"));
output = m_devices["net"][index.toInt()];
} else if (_key.startsWith("pkgcount")) {
AbstractExtItem *item = m_extUpgrade->itemByTag(_key, stripped);
auto *item = m_extUpgrade->itemByTag(_key, stripped);
if (item)
output = item->uniq();
} else if (_key.contains(QRegExp("(^|perc)(ask|bid|price)(chg|)"))) {
AbstractExtItem *item = m_extQuotes->itemByTag(_key, stripped);
} else if (_key.contains(QRegularExpression("(^|perc)(ask|bid|price)(chg|)"))) {
auto *item = m_extQuotes->itemByTag(_key, stripped);
if (item)
output = item->uniq();
} else if (_key.contains(QRegExp("(weather|weatherId|humidity|pressure|temperature)"))) {
AbstractExtItem *item = m_extWeather->itemByTag(_key, stripped);
} else if (_key.contains(QRegularExpression("(weather|weatherId|humidity|pressure|temperature)"))) {
auto *item = m_extWeather->itemByTag(_key, stripped);
if (item)
output = item->uniq();
} else if (_key.startsWith("temp")) {
QString index = _key;
auto index = _key;
index.remove("temp");
output = m_devices["temp"][index.toInt()];
} else if (_key.startsWith("response")) {
AbstractExtItem *item = m_extNetRequest->itemByTag(_key, stripped);
auto *item = m_extNetRequest->itemByTag(_key, stripped);
if (item)
output = item->uniq();
} else {
@ -281,8 +276,7 @@ void AWKeyOperations::editItem(const QString &_type)
qCDebug(LOG_AW) << "Item type" << _type;
if (_type == "graphicalitem") {
QStringList keys
= dictKeys().filter(QRegExp("^(cpu(?!cl).*|gpu$|mem$|swap$|hdd[0-9].*|bat.*)"));
QStringList keys = dictKeys().filter(QRegularExpression("^(cpu(?!cl).*|gpu$|mem$|swap$|hdd[0-9].*|bat.*)"));
keys.sort();
m_graphicalItems->setConfigArgs(keys);
return m_graphicalItems->editItems();
@ -304,19 +298,26 @@ void AWKeyOperations::addDevice(const QString &_source)
{
qCDebug(LOG_AW) << "Source" << _source;
QRegExp diskRegexp = QRegExp("disk/(?:md|sd|hd)[a-z|0-9]_.*/Rate/(?:rblk)");
QRegExp mountRegexp = QRegExp("partitions/.*/filllevel");
auto diskRegexp = QRegularExpression("^disk/.*/read$");
auto mountRegexp = QRegularExpression("^disk/.*/usedPercent$");
auto cpuTempRegExp = QRegularExpression("^cpu/cpu.*/temperature$");
auto gpuRegExp = QRegularExpression("^gpu/gpu.*/usage$");
if (_source.contains(diskRegexp)) {
QString device = _source;
device.remove("/Rate/rblk");
auto device = _source;
device.remove("disk/").remove("/read");
addKeyToCache("disk", device);
} else if (_source.contains(mountRegexp)) {
QString device = _source;
device.remove("partitions").remove("/filllevel");
auto device = _source;
device.remove("disk/").remove("/usedPercent");
addKeyToCache("mount", device);
} else if (_source.startsWith("lmsensors")) {
} else if (_source.startsWith("lmsensors") || _source.contains(cpuTempRegExp)
|| _source == "cpu/all/averageTemperature") {
addKeyToCache("temp", _source);
} else if (_source.contains(gpuRegExp)) {
auto device = _source;
device.remove("gpu/").remove("/usage");
addKeyToCache("gpu", device);
}
}

View File

@ -56,17 +56,17 @@ AWKeys::AWKeys(QObject *_parent)
createDBusInterface();
// update key data if required
connect(m_keyOperator, SIGNAL(updateKeys(const QStringList &)), this,
SLOT(reinitKeys(const QStringList &)));
connect(m_timer, SIGNAL(timeout()), this, SLOT(updateTextData()));
connect(m_keyOperator, &AWKeyOperations::updateKeys, this, &AWKeys::reinitKeys);
connect(m_timer, &QTimer::timeout, this, &AWKeys::updateTextData);
// transfer signal from AWDataAggregator object to QML ui
connect(m_dataAggregator, SIGNAL(toolTipPainted(const QString &)), this,
SIGNAL(needToolTipToBeUpdated(const QString &)));
connect(this, SIGNAL(dropSourceFromDataengine(const QString &)), m_dataEngineAggregator,
SLOT(dropSource(const QString &)));
connect(m_dataAggregator, &AWDataAggregator::toolTipPainted,
[this](const QString &_tooltip) { emit(needToolTipToBeUpdated(_tooltip)); });
connect(this, &AWKeys::dropSourceFromDataengine, m_dataEngineAggregator, &AWDataEngineAggregator::dropSource);
connect(m_dataEngineAggregator, &AWDataEngineAggregator::dataUpdated, this, &AWKeys::dataUpdated);
// transfer signal from dataengine to update source list
connect(m_dataEngineAggregator, SIGNAL(deviceAdded(const QString &)), m_keyOperator,
SLOT(addDevice(const QString &)));
connect(m_dataEngineAggregator, &AWDataEngineAggregator::deviceAdded, m_keyOperator, &AWKeyOperations::addDevice);
}
@ -91,11 +91,10 @@ void AWKeys::initDataAggregator(const QVariantMap &_tooltipParams)
}
void AWKeys::initKeys(const QString &_currentPattern, const int _interval, const int _limit,
const bool _optimize)
void AWKeys::initKeys(const QString &_currentPattern, const int _interval, const int _limit, const bool _optimize)
{
qCDebug(LOG_AW) << "Pattern" << _currentPattern << "with interval" << _interval
<< "and queue limit" << _limit << "with optimization" << _optimize;
qCDebug(LOG_AW) << "Pattern" << _currentPattern << "with interval" << _interval << "and queue limit" << _limit
<< "with optimization" << _optimize;
// init
m_optimize = _optimize;
@ -104,7 +103,7 @@ void AWKeys::initKeys(const QString &_currentPattern, const int _interval, const
m_aggregator->initFormatters();
m_keyOperator->setPattern(_currentPattern);
m_keyOperator->updateCache();
m_dataEngineAggregator->reconnectSources(_interval);
m_dataEngineAggregator->loadSources();
// timer
m_timer->setInterval(_interval);
@ -150,7 +149,7 @@ QStringList AWKeys::dictKeys(const bool _sorted, const QString &_regexp) const
if (_sorted)
allKeys.sort();
return allKeys.filter(QRegExp(_regexp));
return allKeys.filter(QRegularExpression(_regexp));
}
@ -187,9 +186,9 @@ QString AWKeys::valueByKey(const QString &_key) const
{
qCDebug(LOG_AW) << "Requested value for key" << _key;
QString trueKey = _key.startsWith("bar") ? m_keyOperator->infoByKey(_key) : _key;
auto realKey = _key.startsWith("bar") ? m_keyOperator->infoByKey(_key) : _key;
return m_aggregator->formatter(m_values[trueKey], trueKey, true);
return m_aggregator->formatter(m_values[realKey], realKey, true);
}
@ -201,10 +200,15 @@ void AWKeys::editItem(const QString &_type)
}
void AWKeys::dataUpdated(const QString &_sourceName, const Plasma::DataEngine::Data &_data)
void AWKeys::dataUpdated(const QHash<QString, KSysGuard::SensorInfo> &_sensors, const KSysGuard::SensorDataList &_data)
{
// run concurrent data update
QtConcurrent::run(m_threadPool, this, &AWKeys::setDataBySource, _sourceName, _data);
for (auto &single : _data) {
if (_sensors.contains(single.sensorProperty)) {
setDataBySource(single.sensorProperty, _sensors.value(single.sensorProperty), single);
}
// TODO use QtConcurrent::map or something like that
// QtConcurrent::run(m_threadPool, this, &AWKeys::setDataBySource, "ss", sensor);
}
}
@ -227,10 +231,9 @@ void AWKeys::reinitKeys(const QStringList &_currentKeys)
barKeys.append(item->usedKeys());
}
// get required keys
m_requiredKeys
= m_optimize ? AWKeyCache::getRequiredKeys(m_foundKeys, barKeys, m_tooltipParams,
m_keyOperator->requiredUserKeys(), _currentKeys)
: QStringList();
m_requiredKeys = m_optimize ? AWKeyCache::getRequiredKeys(m_foundKeys, barKeys, m_tooltipParams,
m_keyOperator->requiredUserKeys(), _currentKeys)
: QStringList();
// set key data to m_aggregator
m_aggregator->setDevices(m_keyOperator->devices());
@ -242,7 +245,7 @@ void AWKeys::updateTextData()
// do not do it in parallel to avoid race condition
m_mutex.lock();
calculateValues();
QString text = parsePattern(m_keyOperator->pattern());
auto text = parsePattern(m_keyOperator->pattern());
// update tooltip values under lock
m_dataAggregator->dataUpdate(m_values);
m_mutex.unlock();
@ -259,19 +262,17 @@ void AWKeys::calculateValues()
QStringList mountDevices = m_keyOperator->devices("mount");
for (auto &device : mountDevices) {
int index = mountDevices.indexOf(device);
m_values[QString("hddtotmb%1").arg(index)]
= m_values[QString("hddfreemb%1").arg(index)].toFloat()
+ m_values[QString("hddmb%1").arg(index)].toFloat();
m_values[QString("hddtotgb%1").arg(index)]
= m_values[QString("hddfreegb%1").arg(index)].toFloat()
+ m_values[QString("hddgb%1").arg(index)].toFloat();
m_values[QString("hddtotmb%1").arg(index)] = m_values[QString("hddfreemb%1").arg(index)].toDouble()
+ m_values[QString("hddmb%1").arg(index)].toDouble();
m_values[QString("hddtotgb%1").arg(index)] = m_values[QString("hddfreegb%1").arg(index)].toDouble()
+ m_values[QString("hddgb%1").arg(index)].toDouble();
}
// memtot*
m_values["memtotmb"] = m_values["memusedmb"].toInt() + m_values["memfreemb"].toInt();
m_values["memtotgb"] = m_values["memusedgb"].toFloat() + m_values["memfreegb"].toFloat();
m_values["memtotmb"] = m_values["memusedmb"].toLongLong() + m_values["memfreemb"].toLongLong();
m_values["memtotgb"] = m_values["memusedgb"].toDouble() + m_values["memfreegb"].toDouble();
// mem
m_values["mem"] = 100.0f * m_values["memmb"].toFloat() / m_values["memtotmb"].toFloat();
m_values["mem"] = 100.0f * m_values["memmb"].toDouble() / m_values["memtotmb"].toDouble();
// up, down, upkb, downkb, upunits, downunits
int netIndex = m_keyOperator->devices("net").indexOf(m_values["netdev"].toString());
@ -287,10 +288,10 @@ void AWKeys::calculateValues()
m_values["upunits"] = m_values[QString("upunits%1").arg(netIndex)];
// swaptot*
m_values["swaptotmb"] = m_values["swapmb"].toInt() + m_values["swapfreemb"].toInt();
m_values["swaptotgb"] = m_values["swapgb"].toFloat() + m_values["swapfreegb"].toFloat();
m_values["swaptotmb"] = m_values["swapmb"].toLongLong() + m_values["swapfreemb"].toLongLong();
m_values["swaptotgb"] = m_values["swapgb"].toDouble() + m_values["swapfreegb"].toDouble();
// swap
m_values["swap"] = 100.0f * m_values["swapmb"].toFloat() / m_values["swaptotmb"].toFloat();
m_values["swap"] = 100.0f * m_values["swapmb"].toDouble() / m_values["swaptotmb"].toDouble();
// user defined keys
for (auto &key : m_keyOperator->userKeys())
@ -312,27 +313,23 @@ void AWKeys::createDBusInterface()
// HACK we are going to use different services because it binds to
// application
if (instanceBus.registerService(QString("%1.i%2").arg(AWDBUS_SERVICE).arg(id))) {
if (!instanceBus.registerObject(AWDBUS_PATH, new AWDBusAdaptor(this),
QDBusConnection::ExportAllContents))
qCWarning(LOG_AW) << "Could not register DBus object, last error"
<< instanceBus.lastError().message();
if (!instanceBus.registerObject(AWDBUS_PATH, new AWDBusAdaptor(this), QDBusConnection::ExportAllContents))
qCWarning(LOG_AW) << "Could not register DBus object, last error" << instanceBus.lastError().message();
} else {
qCWarning(LOG_AW) << "Could not register DBus service, last error"
<< instanceBus.lastError().message();
qCWarning(LOG_AW) << "Could not register DBus service, last error" << instanceBus.lastError().message();
}
// and same instance but for id independent service
QDBusConnection commonBus = QDBusConnection::sessionBus();
if (commonBus.registerService(AWDBUS_SERVICE))
commonBus.registerObject(AWDBUS_PATH, new AWDBusAdaptor(this),
QDBusConnection::ExportAllContents);
commonBus.registerObject(AWDBUS_PATH, new AWDBusAdaptor(this), QDBusConnection::ExportAllContents);
}
QString AWKeys::parsePattern(QString _pattern) const
{
// screen sign
_pattern.replace("$$", QString(0x1d));
_pattern.replace("$$", QChar(0x1d));
// lambdas
for (auto &key : m_foundLambdas)
@ -340,20 +337,19 @@ QString AWKeys::parsePattern(QString _pattern) const
// main keys
for (auto &key : m_foundKeys)
_pattern.replace(QString("$%1").arg(key),
m_aggregator->formatter(m_values[key], key, true));
_pattern.replace(QString("$%1").arg(key), m_aggregator->formatter(m_values[key], key, true));
// bars
for (auto &bar : m_foundBars) {
GraphicalItem *item = m_keyOperator->giByKey(bar);
QString image = item->isCustom() ? item->image(AWPatternFunctions::expandLambdas(
item->bar(), m_aggregator, m_values, item->usedKeys()))
QString image = item->isCustom() ? item->image(
AWPatternFunctions::expandLambdas(item->bar(), m_aggregator, m_values, item->usedKeys()))
: item->image(m_values[item->bar()]);
_pattern.replace(QString("$%1").arg(bar), image);
}
// prepare strings
_pattern.replace(QString(0x1d), "$");
_pattern.replace(QChar(0x1d), "$");
if (m_wrapNewLines)
_pattern.replace("\n", "<br>");
@ -361,25 +357,23 @@ QString AWKeys::parsePattern(QString _pattern) const
}
void AWKeys::setDataBySource(const QString &_sourceName, const QVariantMap &_data)
void AWKeys::setDataBySource(const QString &_source, const KSysGuard::SensorInfo &_sensor,
const KSysGuard::SensorData &_data)
{
qCDebug(LOG_AW) << "Source" << _sourceName << "with data" << _data;
qCDebug(LOG_AW) << "Source" << _source << _sensor.name << "with data" << _data.payload;
// first list init
QStringList tags = m_aggregator->keysFromSource(_sourceName);
auto tags = m_aggregator->keysFromSource(_source);
if (tags.isEmpty())
tags = m_aggregator->registerSource(_sourceName, _data["units"].toString(), m_requiredKeys);
tags = m_aggregator->registerSource(_source, _sensor.unit, m_requiredKeys);
// update data or drop source if there are no matches and exit
if (tags.isEmpty()) {
qCInfo(LOG_AW) << "Source" << _sourceName << "not found";
return emit(dropSourceFromDataengine(_sourceName));
qCInfo(LOG_AW) << "Sensor" << _source << "not found";
return emit(dropSourceFromDataengine(_source));
}
m_mutex.lock();
// HACK workaround for time values which are stored in the different path
std::for_each(tags.cbegin(), tags.cend(), [this, &_data, &_sourceName](const QString &tag) {
m_values[tag] = _sourceName == "Local" ? _data["DateTime"] : _data["value"];
});
std::for_each(tags.cbegin(), tags.cend(), [this, &_data](const QString &tag) { m_values[tag] = _data.payload; });
m_mutex.unlock();
}

View File

@ -19,11 +19,11 @@
#ifndef AWKEYS_H
#define AWKEYS_H
#include <Plasma/DataEngine>
#include <QMutex>
#include <QObject>
#include <ksysguard/systemstats/SensorInfo.h>
class AWDataAggregator;
class AWDataEngineAggregator;
@ -40,16 +40,14 @@ public:
explicit AWKeys(QObject *_parent = nullptr);
~AWKeys() override;
Q_INVOKABLE void initDataAggregator(const QVariantMap &_tooltipParams);
Q_INVOKABLE void initKeys(const QString &_currentPattern, int _interval, int _limit,
bool _optimize);
Q_INVOKABLE void initKeys(const QString &_currentPattern, int _interval, int _limit, bool _optimize);
Q_INVOKABLE void setAggregatorProperty(const QString &_key, const QVariant &_value);
Q_INVOKABLE void setWrapNewLines(bool _wrap);
// additional method to force load keys from Qml UI. Used in some
// configuration pages
Q_INVOKABLE void updateCache();
// keys
Q_INVOKABLE [[nodiscard]] QStringList dictKeys(bool _sorted = false,
const QString &_regexp = "") const;
Q_INVOKABLE [[nodiscard]] QStringList dictKeys(bool _sorted = false, const QString &_regexp = "") const;
Q_INVOKABLE [[nodiscard]] QVariantList getHddDevices() const;
// values
Q_INVOKABLE [[nodiscard]] QString infoByKey(const QString &_key) const;
@ -58,9 +56,7 @@ public:
Q_INVOKABLE void editItem(const QString &_type);
public slots:
void dataUpdated(const QString &_sourceName, const Plasma::DataEngine::Data &_data);
// dummy method required by DataEngine connections
static void modelChanged(QString, QAbstractItemModel *){};
void dataUpdated(const QHash<QString, KSysGuard::SensorInfo> &_sensors, const KSysGuard::SensorDataList &_data);
signals:
void dropSourceFromDataengine(const QString &_source);
@ -76,7 +72,8 @@ private:
void calculateValues();
void createDBusInterface();
[[nodiscard]] QString parsePattern(QString _pattern) const;
void setDataBySource(const QString &_sourceName, const QVariantMap &_data);
void setDataBySource(const QString &_source, const KSysGuard::SensorInfo &_sensor,
const KSysGuard::SensorData &_data);
// objects
AWDataAggregator *m_dataAggregator = nullptr;
AWDataEngineAggregator *m_dataEngineAggregator = nullptr;

View File

@ -55,8 +55,7 @@ void AWKeysAggregator::initFormatters()
}
QString AWKeysAggregator::formatter(const QVariant &_data, const QString &_key,
bool replaceSpace) const
QString AWKeysAggregator::formatter(const QVariant &_data, const QString &_key, bool replaceSpace) const
{
qCDebug(LOG_AW) << "Data" << _data << "for key" << _key;
@ -65,19 +64,19 @@ QString AWKeysAggregator::formatter(const QVariant &_data, const QString &_key,
// case block
switch (m_mapper->formatter(_key)) {
case FormatterType::Float:
output = QString("%1").arg(_data.toFloat(), 5, 'f', 1);
output = QString("%1").arg(_data.toDouble(), 5, 'f', 1);
break;
case FormatterType::FloatTwoSymbols:
output = QString("%1").arg(_data.toFloat(), 5, 'f', 2);
output = QString("%1").arg(_data.toDouble(), 5, 'f', 2);
break;
case FormatterType::Integer:
output = QString("%1").arg(_data.toFloat(), 4, 'f', 0);
output = QString("%1").arg(_data.toDouble(), 4, 'f', 0);
break;
case FormatterType::IntegerFive:
output = QString("%1").arg(_data.toFloat(), 5, 'f', 0);
output = QString("%1").arg(_data.toDouble(), 5, 'f', 0);
break;
case FormatterType::IntegerThree:
output = QString("%1").arg(_data.toFloat(), 3, 'f', 0);
output = QString("%1").arg(_data.toDouble(), 3, 'f', 0);
break;
case FormatterType::List:
output = _data.toStringList().join(',');
@ -86,10 +85,10 @@ QString AWKeysAggregator::formatter(const QVariant &_data, const QString &_key,
output = _data.toBool() ? m_acOnline : m_acOffline;
break;
case FormatterType::MemGBFormat:
output = QString("%1").arg(_data.toFloat() / (1024.0 * 1024.0), 5, 'f', 1);
output = QString("%1").arg(_data.toDouble() / (1024.0 * 1024.0), 5, 'f', 1);
break;
case FormatterType::MemMBFormat:
output = QString("%1").arg(_data.toFloat() / 1024.0, 5, 'f', 0);
output = QString("%1").arg(_data.toDouble() / 1024.0, 5, 'f', 0);
break;
case FormatterType::NetSmartFormat:
output = [](const float value) {
@ -97,10 +96,10 @@ QString AWKeysAggregator::formatter(const QVariant &_data, const QString &_key,
return QString("%1").arg(value / 1024.0, 4, 'f', 1);
else
return QString("%1").arg(value, 4, 'f', 0);
}(_data.toFloat());
}(_data.toDouble());
break;
case FormatterType::NetSmartUnits:
if (_data.toFloat() > 1024.0)
if (_data.toDouble() > 1024.0)
output = m_translate ? i18n("MB/s") : "MB/s";
else
output = m_translate ? i18n("KB/s") : "KB/s";
@ -111,29 +110,29 @@ QString AWKeysAggregator::formatter(const QVariant &_data, const QString &_key,
output = output.rightJustified(8, QLatin1Char(' '), true);
break;
case FormatterType::Temperature:
output = QString("%1").arg(temperature(_data.toFloat()), 5, 'f', 1);
output = QString("%1").arg(temperature(_data.toDouble()), 5, 'f', 1);
break;
case FormatterType::Time:
output = _data.toDateTime().toString();
output = QDateTime::fromSecsSinceEpoch(_data.toLongLong()).toString();
break;
case FormatterType::TimeCustom:
output = m_customTime;
[&output, loc, this](const QDateTime &dt) {
for (auto &key : m_timeKeys)
output.replace(QString("$%1").arg(key), loc.toString(dt, key));
}(_data.toDateTime());
}(QDateTime::fromSecsSinceEpoch(_data.toLongLong()));
break;
case FormatterType::TimeISO:
output = _data.toDateTime().toString(Qt::ISODate);
output = QDateTime::fromSecsSinceEpoch(_data.toLongLong()).toString(Qt::ISODate);
break;
case FormatterType::TimeLong:
output = loc.toString(_data.toDateTime(), QLocale::LongFormat);
output = loc.toString(QDateTime::fromSecsSinceEpoch(_data.toLongLong()), QLocale::LongFormat);
break;
case FormatterType::TimeShort:
output = loc.toString(_data.toDateTime(), QLocale::ShortFormat);
output = loc.toString(QDateTime::fromSecsSinceEpoch(_data.toLongLong()), QLocale::ShortFormat);
break;
case FormatterType::Timestamp:
output = QString("%1").arg(_data.toDateTime().toMSecsSinceEpoch() / 1000.0, 10, 'f', 0);
output = _data.toString();
break;
case FormatterType::Uptime:
case FormatterType::UptimeCustom:
@ -151,7 +150,7 @@ QString AWKeysAggregator::formatter(const QVariant &_data, const QString &_key,
source.replace("$m", QString("%1").arg(minutes));
return source;
}(m_mapper->formatter(_key) == FormatterType::Uptime ? "$ddd$hhh$mmm" : m_customUptime,
static_cast<int>(_data.toFloat()));
static_cast<int>(_data.toDouble()));
break;
case FormatterType::NoFormat:
output = _data.toString();
@ -235,7 +234,7 @@ void AWKeysAggregator::setTranslate(const bool _translate)
}
QStringList AWKeysAggregator::registerSource(const QString &_source, const QString &_units,
QStringList AWKeysAggregator::registerSource(const QString &_source, const KSysGuard::Unit &_units,
const QStringList &_keys)
{
qCDebug(LOG_AW) << "Source" << _source << "with units" << _units;

View File

@ -19,6 +19,8 @@
#ifndef AWKEYSAGGREGATOR_H
#define AWKEYSAGGREGATOR_H
#include <ksysguard/formatter/Unit.h>
#include <QHash>
#include <QObject>
@ -69,8 +71,7 @@ public:
~AWKeysAggregator() override;
void initFormatters();
// get methods
[[nodiscard]] QString formatter(const QVariant &_data, const QString &_key,
bool replaceSpace) const;
[[nodiscard]] QString formatter(const QVariant &_data, const QString &_key, bool replaceSpace) const;
[[nodiscard]] QStringList keysFromSource(const QString &_source) const;
// set methods
void setAcOffline(const QString &_inactive);
@ -82,8 +83,7 @@ public:
void setTranslate(bool _translate);
public slots:
QStringList registerSource(const QString &_source, const QString &_units,
const QStringList &_keys);
QStringList registerSource(const QString &_source, const KSysGuard::Unit &_units, const QStringList &_keys);
private:
[[nodiscard]] float temperature(float temp) const;

View File

@ -24,8 +24,7 @@
#include "awkeysaggregator.h"
QString AWPatternFunctions::expandLambdas(QString _code, AWKeysAggregator *_aggregator,
const QVariantHash &_metadata,
QString AWPatternFunctions::expandLambdas(QString _code, AWKeysAggregator *_aggregator, const QVariantHash &_metadata,
const QStringList &_usedKeys)
{
qCDebug(LOG_AW) << "Expand lambdas in" << _code;
@ -35,13 +34,12 @@ QString AWPatternFunctions::expandLambdas(QString _code, AWKeysAggregator *_aggr
_code.replace("$this", _metadata[_code].toString());
// parsed values
for (auto &lambdaKey : _usedKeys)
_code.replace(QString("$%1").arg(lambdaKey),
_aggregator->formatter(_metadata[lambdaKey], lambdaKey, false));
_code.replace(QString("$%1").arg(lambdaKey), _aggregator->formatter(_metadata[lambdaKey], lambdaKey, false));
qCInfo(LOG_AW) << "Expression" << _code;
QJSValue result = engine.evaluate(_code);
if (result.isError()) {
qCWarning(LOG_AW) << "Uncaught exception at line" << result.property("lineNumber").toInt()
<< ":" << result.toString();
qCWarning(LOG_AW) << "Uncaught exception at line" << result.property("lineNumber").toInt() << ":"
<< result.toString();
return "";
} else {
return result.toString();
@ -67,8 +65,8 @@ QString AWPatternFunctions::expandTemplates(QString _code)
QJSValue result = engine.evaluate(body);
QString templateResult = "";
if (result.isError()) {
qCWarning(LOG_AW) << "Uncaught exception at line"
<< result.property("lineNumber").toInt() << ":" << result.toString();
qCWarning(LOG_AW) << "Uncaught exception at line" << result.property("lineNumber").toInt() << ":"
<< result.toString();
} else {
templateResult = result.toString();
}
@ -81,8 +79,8 @@ QString AWPatternFunctions::expandTemplates(QString _code)
}
QList<AWPatternFunctions::AWFunction>
AWPatternFunctions::findFunctionCalls(const QString &_function, const QString &_code)
QList<AWPatternFunctions::AWFunction> AWPatternFunctions::findFunctionCalls(const QString &_function,
const QString &_code)
{
qCDebug(LOG_AW) << "Looking for function" << _function << "in" << _code;
@ -107,10 +105,9 @@ AWPatternFunctions::findFunctionCalls(const QString &_function, const QString &_
metadata.args = QStringList();
} else {
// replace '$,' to 0x1d
argsString.replace("$,", QString(0x1d));
argsString.replace("$,", QChar(0x1d));
QStringList args = argsString.split(',');
std::for_each(args.begin(), args.end(),
[](QString &arg) { arg.replace(QString(0x1d), ","); });
std::for_each(args.begin(), args.end(), [](QString &arg) { arg.replace(QChar(0x1d), ","); });
metadata.args = args;
}
// 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;
QList<AWPatternFunctions::AWFunction> found
= AWPatternFunctions::findFunctionCalls("aw_all", _code);
QList<AWPatternFunctions::AWFunction> found = AWPatternFunctions::findFunctionCalls("aw_all", _code);
for (auto &function : found) {
QString separator = function.args.isEmpty() ? "," : function.args.at(0);
QStringList required = _keys.filter(QRegExp(function.body));
std::for_each(required.begin(), required.end(),
[](QString &value) { value = QString("%1: $%1").arg(value); });
QStringList required = _keys.filter(QRegularExpression(function.body));
std::for_each(required.begin(), required.end(), [](QString &value) { value = QString("%1: $%1").arg(value); });
_code.replace(function.what, required.join(separator));
}
@ -149,10 +144,9 @@ QString AWPatternFunctions::insertKeyCount(QString _code, const QStringList &_ke
{
qCDebug(LOG_AW) << "Looking for count in code" << _code << "using list" << _keys;
QList<AWPatternFunctions::AWFunction> found
= AWPatternFunctions::findFunctionCalls("aw_count", _code);
QList<AWPatternFunctions::AWFunction> found = AWPatternFunctions::findFunctionCalls("aw_count", _code);
for (auto &function : found) {
int count = _keys.filter(QRegExp(function.body)).count();
int count = _keys.filter(QRegularExpression(function.body)).count();
_code.replace(function.what, QString::number(count));
}
@ -165,11 +159,10 @@ QString AWPatternFunctions::insertKeyNames(QString _code, const QStringList &_ke
{
qCDebug(LOG_AW) << "Looking for key names in code" << _code << "using list" << _keys;
QList<AWPatternFunctions::AWFunction> found
= AWPatternFunctions::findFunctionCalls("aw_names", _code);
QList<AWPatternFunctions::AWFunction> found = AWPatternFunctions::findFunctionCalls("aw_names", _code);
for (auto &function : found) {
QString separator = function.args.isEmpty() ? "," : function.args.at(0);
QStringList required = _keys.filter(QRegExp(function.body));
QStringList required = _keys.filter(QRegularExpression(function.body));
_code.replace(function.what, required.join(separator));
}
@ -182,13 +175,11 @@ QString AWPatternFunctions::insertKeys(QString _code, const QStringList &_keys)
{
qCDebug(LOG_AW) << "Looking for keys in code" << _code << "using list" << _keys;
QList<AWPatternFunctions::AWFunction> found
= AWPatternFunctions::findFunctionCalls("aw_keys", _code);
QList<AWPatternFunctions::AWFunction> found = AWPatternFunctions::findFunctionCalls("aw_keys", _code);
for (auto &function : found) {
QString separator = function.args.isEmpty() ? "," : function.args.at(0);
QStringList required = _keys.filter(QRegExp(function.body));
std::for_each(required.begin(), required.end(),
[](QString &value) { value = QString("$%1").arg(value); });
QStringList required = _keys.filter(QRegularExpression(function.body));
std::for_each(required.begin(), required.end(), [](QString &value) { value = QString("$%1").arg(value); });
_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;
QList<AWPatternFunctions::AWFunction> found
= AWPatternFunctions::findFunctionCalls("aw_macro", _code);
QList<AWPatternFunctions::AWFunction> found = AWPatternFunctions::findFunctionCalls("aw_macro", _code);
for (auto &macro : found) {
// get macro params
if (macro.args.isEmpty()) {
@ -215,17 +205,15 @@ QString AWPatternFunctions::insertMacros(QString _code)
= AWPatternFunctions::findFunctionCalls(QString("aw_macro_%1").arg(name), _code);
for (auto &function : macroUsage) {
if (function.args.count() != macro.args.count()) {
qCWarning(LOG_AW) << "Invalid args count found for call" << function.what
<< "with macro" << macro.what;
qCWarning(LOG_AW) << "Invalid args count found for call" << function.what << "with macro" << macro.what;
continue;
}
// generate body to replace
QString result = macro.body;
std::for_each(macro.args.cbegin(), macro.args.cend(),
[&result, macro, function](const QString &arg) {
int index = macro.args.indexOf(arg);
result.replace(QString("$%1").arg(arg), function.args.at(index));
});
std::for_each(macro.args.cbegin(), macro.args.cend(), [&result, macro, function](const QString &arg) {
int index = macro.args.indexOf(arg);
result.replace(QString("$%1").arg(arg), function.args.at(index));
});
// do replace
_code.replace(function.what, result);
}
@ -238,16 +226,14 @@ QString AWPatternFunctions::insertMacros(QString _code)
}
QStringList AWPatternFunctions::findKeys(const QString &_code, const QStringList &_keys,
const bool _isBars)
QStringList AWPatternFunctions::findKeys(const QString &_code, const QStringList &_keys, const bool _isBars)
{
qCDebug(LOG_AW) << "Looking for keys in code" << _code << "using list" << _keys;
QStringList selectedKeys;
QString replacedCode = _code;
for (auto &key : _keys)
if ((key.startsWith("bar") == _isBars)
&& (replacedCode.contains(QString("$%1").arg(key)))) {
if ((key.startsWith("bar") == _isBars) && (replacedCode.contains(QString("$%1").arg(key)))) {
qCInfo(LOG_AW) << "Found key" << key << "with bar enabled" << _isBars;
selectedKeys.append(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)
{
qCDebug(LOG_AW) << "Init telemetry with count" << _count << "enable remote" << _enableRemote
<< "client ID" << _clientId;
qCDebug(LOG_AW) << "Init telemetry with count" << _count << "enable remote" << _enableRemote << "client ID"
<< _clientId;
m_storeCount = _count;
m_uploadEnabled = _enableRemote;
@ -127,8 +127,7 @@ void AWTelemetryHandler::uploadTelemetry(const QString &_group, const QString &_
}
auto *manager = new QNetworkAccessManager(nullptr);
connect(manager, SIGNAL(finished(QNetworkReply *)), this,
SLOT(telemetryReplyRecieved(QNetworkReply *)));
connect(manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(telemetryReplyRecieved(QNetworkReply *)));
QUrl url(REMOTE_TELEMETRY_URL);
QNetworkRequest request(url);
@ -151,8 +150,7 @@ void AWTelemetryHandler::uploadTelemetry(const QString &_group, const QString &_
void AWTelemetryHandler::telemetryReplyRecieved(QNetworkReply *_reply)
{
if (_reply->error() != QNetworkReply::NoError) {
qCWarning(LOG_AW) << "An error occurs" << _reply->error() << "with message"
<< _reply->errorString();
qCWarning(LOG_AW) << "An error occurs" << _reply->error() << "with message" << _reply->errorString();
return;
}

View File

@ -24,6 +24,7 @@
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QSettings>
#include <QStandardPaths>
#include "awdebug.h"
@ -34,9 +35,8 @@ AWUpdateHelper::AWUpdateHelper(QObject *_parent)
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
m_foundVersion = QVersionNumber::fromString(VERSION);
m_genericConfig
= QString("%1/awesomewidgets/general.ini")
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation));
m_genericConfig = QString("%1/awesomewidgets/general.ini")
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation));
}
@ -53,9 +53,8 @@ void AWUpdateHelper::checkUpdates(const bool _showAnyway)
// showAnyway options requires to show message if no updates found on direct
// request. In case of automatic check no message will be shown
auto *manager = new QNetworkAccessManager(nullptr);
connect(manager, &QNetworkAccessManager::finished, [_showAnyway, this](QNetworkReply *reply) {
return versionReplyRecieved(reply, _showAnyway);
});
connect(manager, &QNetworkAccessManager::finished,
[_showAnyway, this](QNetworkReply *reply) { return versionReplyRecieved(reply, _showAnyway); });
manager->get(QNetworkRequest(QUrl(VERSION_API)));
}
@ -64,16 +63,14 @@ void AWUpdateHelper::checkUpdates(const bool _showAnyway)
bool AWUpdateHelper::checkVersion()
{
QSettings settings(m_genericConfig, QSettings::IniFormat);
QVersionNumber version
= QVersionNumber::fromString(settings.value("Version", QString(VERSION)).toString());
QVersionNumber version = QVersionNumber::fromString(settings.value("Version", QString(VERSION)).toString());
// update version
settings.setValue("Version", QString(VERSION));
settings.sync();
qCInfo(LOG_AW) << "Found version" << version << "actual one is" << m_foundVersion;
if ((version != m_foundVersion) && (!QString(CHANGELOG).isEmpty())) {
genMessageBox(i18nc("Changelog of %1", VERSION), QString(CHANGELOG).replace('@', '\n'),
QMessageBox::Ok)
genMessageBox(i18nc("Changelog of %1", VERSION), QString(CHANGELOG).replace('@', '\n'), QMessageBox::Ok)
->open();
return true;
} else if (version != m_foundVersion) {
@ -133,8 +130,7 @@ void AWUpdateHelper::versionReplyRecieved(QNetworkReply *_reply, const bool _sho
{
qCDebug(LOG_AW) << "Show message anyway" << _showAnyway;
if (_reply->error() != QNetworkReply::NoError) {
qCWarning(LOG_AW) << "An error occurs" << _reply->error() << "with message"
<< _reply->errorString();
qCWarning(LOG_AW) << "An error occurs" << _reply->error() << "with message" << _reply->errorString();
return;
}

View File

@ -7,7 +7,7 @@ include_directories(
${CMAKE_BINARY_DIR}
${PROJECT_TRDPARTY_DIR}
${Qt_INCLUDE}
${Kf5_INCLUDE}
${Kf6_INCLUDE}
)
file(GLOB SUBPROJECT_SOURCE *.cpp ${PROJECT_TRDPARTY_DIR}/qreplytimeout/*.cpp ${CMAKE_SOURCE_DIR}/*.cpp)
@ -28,18 +28,18 @@ file(RELATIVE_PATH SUBPROJECT_WEATHER_JSON ${CMAKE_SOURCE_DIR} ${SUBPROJECT_WEAT
# prepare
configure_file(${SUBPROJECT_WEATHER_JSON_IN} ${CMAKE_CURRENT_BINARY_DIR}/${SUBPROJECT_WEATHER_JSON})
qt5_wrap_ui(SUBPROJECT_UI_HEADER ${SUBPROJECT_UI})
qt6_wrap_ui(SUBPROJECT_UI_HEADER ${SUBPROJECT_UI})
add_library(${SUBPROJECT} STATIC ${SUBPROJECT_SOURCE} ${SUBPROJECT_HEADER} ${SUBPROJECT_UI_HEADER})
target_link_libraries(${SUBPROJECT} ${Qt_LIBRARIES} ${Kf5_LIBRARIES})
target_link_libraries(${SUBPROJECT} ${Qt_LIBRARIES} ${Kf6_LIBRARIES})
# install
install(DIRECTORY ${SUBPROJECT_CONFIGS} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_FORMATTERS} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_GRAPHITEMS} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_QUOTES} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_SCRIPTS} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_REQUESTS} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_UPGRADE} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_WEATHER} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME})
install(FILES ${SUBPROJECT_INI} DESTINATION ${CONFIG_INSTALL_DIR})
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${SUBPROJECT_WEATHER_JSON} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME}/weather)
install(DIRECTORY ${SUBPROJECT_CONFIGS} DESTINATION ${KDE_INSTALL_DATADIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_FORMATTERS} DESTINATION ${KDE_INSTALL_DATADIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_GRAPHITEMS} DESTINATION ${KDE_INSTALL_DATADIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_QUOTES} DESTINATION ${KDE_INSTALL_DATADIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_SCRIPTS} DESTINATION ${KDE_INSTALL_DATADIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_REQUESTS} DESTINATION ${KDE_INSTALL_DATADIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_UPGRADE} DESTINATION ${KDE_INSTALL_DATADIR}/${PROJECT_NAME})
install(DIRECTORY ${SUBPROJECT_WEATHER} DESTINATION ${KDE_INSTALL_DATADIR}/${PROJECT_NAME})
install(FILES ${SUBPROJECT_INI} DESTINATION /${KDE_INSTALL_CONFDIR})
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${SUBPROJECT_WEATHER_JSON} DESTINATION ${KDE_INSTALL_DATADIR}/${PROJECT_NAME}/weather)

View File

@ -27,8 +27,8 @@
#include "qcronscheduler.h"
AbstractExtItem::AbstractExtItem(QWidget *_parent, const QString &_filePath)
: QDialog(_parent)
AbstractExtItem::AbstractExtItem(QObject *_parent, const QString &_filePath)
: QObject(_parent)
, m_fileName(_filePath)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
@ -97,15 +97,13 @@ void AbstractExtItem::startTimer()
QString AbstractExtItem::writtableConfig() const
{
QString path = m_fileName;
QString name = QFileInfo(path).fileName();
path.remove(path.count() - name.count() - 1, name.count() + 1);
QString dir = QFileInfo(path).fileName();
auto path = m_fileName;
auto name = QFileInfo(path).fileName();
path.remove(path.length() - name.length() - 1, name.length() + 1);
auto dir = QFileInfo(path).fileName();
return QString("%1/awesomewidgets/%2/%3")
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation))
.arg(dir)
.arg(name);
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation), dir, name);
}
@ -269,8 +267,8 @@ void AbstractExtItem::deinitSocket()
m_socket->close();
QLocalServer::removeServer(socket());
delete m_socket;
disconnect(m_socket, SIGNAL(newConnection()), this, SLOT(newConnectionReceived()));
delete m_socket;
}

View File

@ -18,14 +18,14 @@
#ifndef ABSTRACTEXTITEM_H
#define ABSTRACTEXTITEM_H
#include <QDialog>
#include <QVariant>
class QCronScheduler;
class QLocalServer;
class QWidget;
class AbstractExtItem : public QDialog
class AbstractExtItem : public QObject
{
Q_OBJECT
Q_PROPERTY(bool active READ isActive WRITE setActive)
@ -40,7 +40,7 @@ class AbstractExtItem : public QDialog
Q_PROPERTY(QString uniq READ uniq)
public:
explicit AbstractExtItem(QWidget *_parent = nullptr, const QString &_filePath = "");
explicit AbstractExtItem(QObject *_parent = nullptr, const QString &_filePath = "");
~AbstractExtItem() override;
virtual void bumpApi(int _newVer);
virtual AbstractExtItem *copy(const QString &_fileName, int _number) = 0;
@ -78,7 +78,7 @@ public slots:
virtual void initSocket();
virtual void readConfiguration();
virtual QVariantHash run() = 0;
virtual int showConfiguration(const QVariant &_args) = 0;
virtual int showConfiguration(QWidget *_parent, const QVariant &_args) = 0;
[[nodiscard]] virtual bool tryDelete() const;
virtual void writeConfiguration() const;
@ -89,7 +89,8 @@ private:
QCronScheduler *m_scheduler = nullptr;
QString m_fileName = "/dev/null";
int m_times = 0;
virtual void translate() = 0;
// FIXME find a better way to do it
virtual void translate(void *_ui) = 0;
// properties
int m_apiVersion = 0;
bool m_active = true;

View File

@ -26,68 +26,45 @@
#include <utility>
AbstractExtItemAggregator::AbstractExtItemAggregator(QWidget *_parent, QString _type)
: QDialog(_parent)
, ui(new Ui::AbstractExtItemAggregator)
AbstractExtItemAggregator::AbstractExtItemAggregator(QObject *_parent, QString _type)
: QObject(_parent)
, m_type(std::move(_type))
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
// create directory at $HOME
QString localDir
= QString("%1/awesomewidgets/%2")
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation))
.arg(type());
auto localDir = QString("%1/awesomewidgets/%2")
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation), type());
QDir localDirectory;
if (localDirectory.mkpath(localDir))
qCInfo(LOG_LIB) << "Created directory" << localDir;
ui->setupUi(this);
copyButton = ui->buttonBox->addButton(i18n("Copy"), QDialogButtonBox::ActionRole);
createButton = ui->buttonBox->addButton(i18n("Create"), QDialogButtonBox::ActionRole);
deleteButton = ui->buttonBox->addButton(i18n("Remove"), QDialogButtonBox::ActionRole);
connect(ui->buttonBox, SIGNAL(clicked(QAbstractButton *)), this,
SLOT(editItemButtonPressed(QAbstractButton *)));
connect(ui->buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
connect(ui->listWidget, SIGNAL(itemActivated(QListWidgetItem *)), this,
SLOT(editItemActivated(QListWidgetItem *)));
}
AbstractExtItemAggregator::~AbstractExtItemAggregator()
void AbstractExtItemAggregator::copyItem(QListWidget *_widget)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
delete ui;
}
void AbstractExtItemAggregator::copyItem()
{
AbstractExtItem *source = itemFromWidget();
QString fileName = getName();
int number = uniqNumber();
QString dir = QString("%1/awesomewidgets/%2")
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation))
.arg(m_type);
auto source = itemFromWidget(_widget);
auto fileName = getName();
auto number = uniqNumber();
auto dir = QString("%1/awesomewidgets/%2")
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation), m_type);
if ((!source) || (fileName.isEmpty())) {
qCWarning(LOG_LIB) << "Nothing to copy";
return;
}
QString filePath = QString("%1/%2").arg(dir).arg(fileName);
auto filePath = QString("%1/%2").arg(dir, fileName);
AbstractExtItem *newItem = source->copy(filePath, number);
if (newItem->showConfiguration(configArgs()) == 1) {
auto newItem = source->copy(filePath, number);
if (newItem->showConfiguration(nullptr, configArgs()) == 1) {
initItems();
repaintList();
repaintList(_widget);
}
}
void AbstractExtItemAggregator::deleteItem()
void AbstractExtItemAggregator::deleteItem(QListWidget *_widget)
{
AbstractExtItem *source = itemFromWidget();
auto source = itemFromWidget(_widget);
if (!source) {
qCWarning(LOG_LIB) << "Nothing to delete";
return;
@ -95,31 +72,63 @@ void AbstractExtItemAggregator::deleteItem()
if (source->tryDelete()) {
initItems();
repaintList();
repaintList(_widget);
}
}
void AbstractExtItemAggregator::editItem()
void AbstractExtItemAggregator::editItem(QListWidget *_widget)
{
AbstractExtItem *source = itemFromWidget();
auto source = itemFromWidget(_widget);
if (!source) {
qCWarning(LOG_LIB) << "Nothing to edit";
return;
}
if (source->showConfiguration(configArgs()) == 1) {
if (source->showConfiguration(nullptr, configArgs()) == 1) {
initItems();
repaintList();
repaintList(_widget);
}
}
int AbstractExtItemAggregator::exec()
{
auto dialog = new QDialog();
auto ui = new Ui::AbstractExtItemAggregator();
ui->setupUi(dialog);
auto copyButton = ui->buttonBox->addButton(i18n("Copy"), QDialogButtonBox::ActionRole);
auto createButton = ui->buttonBox->addButton(i18n("Create"), QDialogButtonBox::ActionRole);
auto deleteButton = ui->buttonBox->addButton(i18n("Remove"), QDialogButtonBox::ActionRole);
connect(ui->buttonBox, &QDialogButtonBox::clicked, [&](QAbstractButton *_button) {
if (dynamic_cast<QPushButton *>(_button) == copyButton)
copyItem(ui->listWidget);
else if (dynamic_cast<QPushButton *>(_button) == createButton)
doCreateItem(ui->listWidget);
else if (dynamic_cast<QPushButton *>(_button) == deleteButton)
deleteItem(ui->listWidget);
else if (ui->buttonBox->buttonRole(_button) == QDialogButtonBox::AcceptRole)
editItem(ui->listWidget);
});
connect(ui->buttonBox, &QDialogButtonBox::rejected, [dialog]() { dialog->reject(); });
connect(ui->listWidget, &QListWidget::itemActivated, [&](QListWidgetItem *) { editItem(ui->listWidget); });
repaintList(ui->listWidget);
auto ret = dialog->exec();
dialog->deleteLater();
delete ui;
return ret;
}
QString AbstractExtItemAggregator::getName()
{
bool ok;
QString name = QInputDialog::getText(this, i18n("Enter file name"), i18n("File name"),
QLineEdit::Normal, "", &ok);
auto name = QInputDialog::getText(nullptr, i18n("Enter file name"), i18n("File name"), QLineEdit::Normal, "", &ok);
if ((!ok) || (name.isEmpty()))
return "";
if (!name.endsWith(".desktop"))
@ -129,15 +138,15 @@ QString AbstractExtItemAggregator::getName()
}
AbstractExtItem *AbstractExtItemAggregator::itemFromWidget() const
AbstractExtItem *AbstractExtItemAggregator::itemFromWidget(QListWidget *_widget) const
{
QListWidgetItem *widgetItem = ui->listWidget->currentItem();
auto widgetItem = _widget->currentItem();
if (!widgetItem)
return nullptr;
AbstractExtItem *found = nullptr;
for (auto &item : items()) {
QString fileName = QFileInfo(item->fileName()).fileName();
auto fileName = QFileInfo(item->fileName()).fileName();
if (fileName != widgetItem->text())
continue;
found = item;
@ -150,18 +159,18 @@ AbstractExtItem *AbstractExtItemAggregator::itemFromWidget() const
}
void AbstractExtItemAggregator::repaintList() const
void AbstractExtItemAggregator::repaintList(QListWidget *_widget) const
{
ui->listWidget->clear();
_widget->clear();
for (auto &_item : items()) {
QString fileName = QFileInfo(_item->fileName()).fileName();
auto *item = new QListWidgetItem(fileName, ui->listWidget);
auto item = new QListWidgetItem(fileName, _widget);
QStringList tooltip;
tooltip.append(i18n("Name: %1", _item->name()));
tooltip.append(i18n("Comment: %1", _item->comment()));
tooltip.append(i18n("Identity: %1", _item->uniq()));
item->setToolTip(tooltip.join('\n'));
ui->listWidget->addItem(item);
_widget->addItem(item);
}
}
@ -187,8 +196,7 @@ QVariant AbstractExtItemAggregator::configArgs() const
QStringList AbstractExtItemAggregator::directories() const
{
auto dirs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation,
QString("awesomewidgets/%1").arg(type()),
auto dirs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QString("awesomewidgets/%1").arg(type()),
QStandardPaths::LocateDirectory);
return dirs;
@ -207,22 +215,3 @@ void AbstractExtItemAggregator::setConfigArgs(const QVariant &_configArgs)
m_configArgs = _configArgs;
}
void AbstractExtItemAggregator::editItemActivated(QListWidgetItem *)
{
return editItem();
}
void AbstractExtItemAggregator::editItemButtonPressed(QAbstractButton *_button)
{
if (dynamic_cast<QPushButton *>(_button) == copyButton)
return copyItem();
else if (dynamic_cast<QPushButton *>(_button) == createButton)
return doCreateItem();
else if (dynamic_cast<QPushButton *>(_button) == deleteButton)
return deleteItem();
else if (ui->buttonBox->buttonRole(_button) == QDialogButtonBox::AcceptRole)
return editItem();
}

View File

@ -18,7 +18,6 @@
#ifndef ABSTRACTEXTITEMAGGREGATOR_H
#define ABSTRACTEXTITEMAGGREGATOR_H
#include <QDialog>
#include <QStandardPaths>
#include "abstractextitem.h"
@ -26,50 +25,45 @@
class QAbstractButton;
class QListWidget;
class QListWidgetItem;
namespace Ui
{
class AbstractExtItemAggregator;
}
class AbstractExtItemAggregator : public QDialog
class AbstractExtItemAggregator : public QObject
{
Q_OBJECT
Q_PROPERTY(QVariant configArgs READ configArgs WRITE setConfigArgs)
Q_PROPERTY(QVariant type READ type)
public:
explicit AbstractExtItemAggregator(QWidget *_parent, QString _type);
~AbstractExtItemAggregator() override;
explicit AbstractExtItemAggregator(QObject *_parent, QString _type);
// methods
void copyItem();
template <class T> void createItem()
void copyItem(QListWidget *_widget);
template <class T> void createItem(QListWidget *_widget)
{
QString fileName = getName();
int number = uniqNumber();
QString dir
= QString("%1/awesomewidgets/%2")
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation))
.arg(m_type);
auto fileName = getName();
auto number = uniqNumber();
auto dir = QString("%1/awesomewidgets/%2")
.arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation), m_type);
if (fileName.isEmpty()) {
qCWarning(LOG_LIB) << "Nothing to create";
return;
}
QString filePath = QString("%1/%2").arg(dir).arg(fileName);
auto filePath = QString("%1/%2").arg(dir, fileName);
T *newItem = new T(this, filePath);
auto newItem = new T(this, filePath);
newItem->setNumber(number);
if (newItem->showConfiguration(configArgs()) == 1) {
if (newItem->showConfiguration(nullptr, configArgs()) == 1) {
initItems();
repaintList();
repaintList(_widget);
}
};
void deleteItem();
void editItem();
void deleteItem(QListWidget *_widget);
void editItem(QListWidget *_widget);
[[nodiscard]] int exec();
QString getName();
virtual void initItems() = 0;
AbstractExtItem *itemFromWidget() const;
void repaintList() const;
[[nodiscard]] AbstractExtItem *itemFromWidget(QListWidget *_widget) const;
void repaintList(QListWidget *_widget) const;
[[nodiscard]] int uniqNumber() const;
// get methods
[[nodiscard]] QVariant configArgs() const;
@ -79,21 +73,12 @@ public:
// set methods
void setConfigArgs(const QVariant &_configArgs);
private slots:
void editItemActivated(QListWidgetItem *);
void editItemButtonPressed(QAbstractButton *_button);
private:
// ui
Ui::AbstractExtItemAggregator *ui = nullptr;
QPushButton *copyButton = nullptr;
QPushButton *createButton = nullptr;
QPushButton *deleteButton = nullptr;
// properties
QVariant m_configArgs;
QString m_type;
// ui methods
virtual void doCreateItem() = 0;
virtual void doCreateItem(QListWidget *_widget) = 0;
};

View File

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

View File

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

View File

@ -22,19 +22,13 @@
#include "awdebug.h"
AWAbstractFormatter::AWAbstractFormatter(QWidget *_parent, const QString &_filePath)
AWAbstractFormatter::AWAbstractFormatter(QObject *_parent, const QString &_filePath)
: AbstractExtItem(_parent, _filePath)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
}
AWAbstractFormatter::~AWAbstractFormatter()
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
}
void AWAbstractFormatter::copyDefaults(AbstractExtItem *_other) const
{
AbstractExtItem::copyDefaults(_other);
@ -45,7 +39,7 @@ void AWAbstractFormatter::copyDefaults(AbstractExtItem *_other) const
QString AWAbstractFormatter::uniq() const
{
return QString("%1(%2)").arg(name()).arg(strType());
return QString("%1(%2)").arg(name(), strType());
}

View File

@ -18,6 +18,8 @@
#ifndef AWABSTRACTFORMATTER_H
#define AWABSTRACTFORMATTER_H
#include <QRegularExpression>
#include "abstractextitem.h"
@ -30,8 +32,8 @@ class AWAbstractFormatter : public AbstractExtItem
public:
enum class FormatterClass { DateTime, Float, List, Script, String, NoFormat, Json };
explicit AWAbstractFormatter(QWidget *_parent = nullptr, const QString &_filePath = "");
~AWAbstractFormatter() override;
explicit AWAbstractFormatter(QObject *_parent = nullptr, const QString &_filePath = "");
~AWAbstractFormatter() override = default;
[[nodiscard]] virtual QString convert(const QVariant &_value) const = 0;
void copyDefaults(AbstractExtItem *_other) const override;
[[nodiscard]] QString uniq() const override;
@ -43,7 +45,7 @@ public:
public slots:
void readConfiguration() override;
QVariantHash run() override { return QVariantHash(); };
QVariantHash run() override { return {}; };
void writeConfiguration() const override;
private:

View File

@ -15,7 +15,6 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awdatetimeformatter.h"
#include "ui_awdatetimeformatter.h"
@ -27,24 +26,13 @@
#include "awdebug.h"
AWDateTimeFormatter::AWDateTimeFormatter(QWidget *_parent, const QString &_filePath)
AWDateTimeFormatter::AWDateTimeFormatter(QObject *_parent, const QString &_filePath)
: AWAbstractFormatter(_parent, _filePath)
, ui(new Ui::AWDateTimeFormatter)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty())
AWDateTimeFormatter::readConfiguration();
ui->setupUi(this);
AWDateTimeFormatter::translate();
}
AWDateTimeFormatter::~AWDateTimeFormatter()
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
delete ui;
}
@ -60,7 +48,7 @@ AWDateTimeFormatter *AWDateTimeFormatter::copy(const QString &_fileName, const i
{
qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
auto *item = new AWDateTimeFormatter(dynamic_cast<QWidget *>(parent()), _fileName);
auto item = new AWDateTimeFormatter(parent(), _fileName);
AWAbstractFormatter::copyDefaults(item);
item->setFormat(format());
item->setTranslateString(translateString());
@ -114,27 +102,36 @@ void AWDateTimeFormatter::readConfiguration()
}
int AWDateTimeFormatter::showConfiguration(const QVariant &_args)
int AWDateTimeFormatter::showConfiguration(QWidget *_parent, const QVariant &_args)
{
Q_UNUSED(_args)
auto dialog = new QDialog(_parent);
auto ui = new Ui::AWDateTimeFormatter();
ui->setupUi(dialog);
translate(ui);
ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment());
ui->label_typeValue->setText("DateTime");
ui->lineEdit_format->setText(format());
ui->checkBox_translate->setCheckState(translateString() ? Qt::Checked : Qt::Unchecked);
int ret = exec();
if (ret != 1)
return ret;
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text());
setFormat(ui->lineEdit_format->text());
setTranslateString(ui->checkBox_translate->checkState() == Qt::Checked);
auto ret = dialog->exec();
if (ret == 1) {
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text());
setFormat(ui->lineEdit_format->text());
setTranslateString(ui->checkBox_translate->checkState() == Qt::Checked);
writeConfiguration();
}
dialog->deleteLater();
delete ui;
writeConfiguration();
return ret;
}
@ -160,9 +157,10 @@ void AWDateTimeFormatter::initLocale()
m_locale = m_translate ? QLocale::system() : QLocale::c();
}
void AWDateTimeFormatter::translate()
void AWDateTimeFormatter::translate(void *_ui)
{
auto ui = reinterpret_cast<Ui::AWDateTimeFormatter *>(_ui);
ui->label_name->setText(i18n("Name"));
ui->label_comment->setText(i18n("Comment"));
ui->label_type->setText(i18n("Type"));

View File

@ -23,11 +23,6 @@
#include "awabstractformatter.h"
namespace Ui
{
class AWDateTimeFormatter;
}
class AWDateTimeFormatter : public AWAbstractFormatter
{
Q_OBJECT
@ -35,8 +30,7 @@ class AWDateTimeFormatter : public AWAbstractFormatter
Q_PROPERTY(bool translateString READ translateString WRITE setTranslateString)
public:
explicit AWDateTimeFormatter(QWidget *_parent = nullptr, const QString &_filePath = "");
~AWDateTimeFormatter() override;
explicit AWDateTimeFormatter(QObject *_parent = nullptr, const QString &_filePath = "");
[[nodiscard]] QString convert(const QVariant &_value) const override;
AWDateTimeFormatter *copy(const QString &_fileName, int _number) override;
// properties
@ -47,13 +41,12 @@ public:
public slots:
void readConfiguration() override;
int showConfiguration(const QVariant &_args) override;
int showConfiguration(QWidget *_parent, const QVariant &_args) override;
void writeConfiguration() const override;
private:
Ui::AWDateTimeFormatter *ui = nullptr;
void initLocale();
void translate() override;
void translate(void *_ui) override;
// properties
QLocale m_locale;
QString m_format = "";

View File

@ -5,120 +5,120 @@
"image": {
"__comment": "should be described as html image with full path inside",
"default": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/3200.gif\">",
"default": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/3200.gif\">",
"800": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/01d.png\">",
"800": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/01d.png\">",
"801": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/02d.png\">",
"801": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/02d.png\">",
"802": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/03d.png\">",
"803": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/03d.png\">",
"802": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/03d.png\">",
"803": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/03d.png\">",
"804": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/04d.png\">",
"804": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/04d.png\">",
"300": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">",
"301": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">",
"302": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">",
"310": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">",
"311": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">",
"312": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">",
"313": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">",
"314": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">",
"321": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">",
"520": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">",
"521": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">",
"522": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">",
"531": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/09d.png\">",
"300": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/09d.png\">",
"301": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/09d.png\">",
"302": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/09d.png\">",
"310": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/09d.png\">",
"311": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/09d.png\">",
"312": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/09d.png\">",
"313": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/09d.png\">",
"314": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/09d.png\">",
"321": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/09d.png\">",
"520": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/09d.png\">",
"521": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/09d.png\">",
"522": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/09d.png\">",
"531": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/09d.png\">",
"500": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/10d.png\">",
"501": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/10d.png\">",
"502": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/10d.png\">",
"503": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/10d.png\">",
"504": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/10d.png\">",
"500": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/10d.png\">",
"501": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/10d.png\">",
"502": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/10d.png\">",
"503": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/10d.png\">",
"504": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/10d.png\">",
"200": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/11d.png\">",
"201": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/11d.png\">",
"202": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/11d.png\">",
"210": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/11d.png\">",
"211": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/11d.png\">",
"212": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/11d.png\">",
"221": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/11d.png\">",
"230": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/11d.png\">",
"231": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/11d.png\">",
"232": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/11d.png\">",
"200": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/11d.png\">",
"201": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/11d.png\">",
"202": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/11d.png\">",
"210": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/11d.png\">",
"211": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/11d.png\">",
"212": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/11d.png\">",
"221": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/11d.png\">",
"230": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/11d.png\">",
"231": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/11d.png\">",
"232": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/11d.png\">",
"511": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/13d.png\">",
"600": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/13d.png\">",
"601": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/13d.png\">",
"602": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/13d.png\">",
"611": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/13d.png\">",
"612": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/13d.png\">",
"615": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/13d.png\">",
"616": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/13d.png\">",
"620": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/13d.png\">",
"621": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/13d.png\">",
"622": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/13d.png\">",
"511": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/13d.png\">",
"600": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/13d.png\">",
"601": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/13d.png\">",
"602": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/13d.png\">",
"611": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/13d.png\">",
"612": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/13d.png\">",
"615": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/13d.png\">",
"616": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/13d.png\">",
"620": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/13d.png\">",
"621": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/13d.png\">",
"622": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/13d.png\">",
"701": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/50d.png\">",
"711": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/50d.png\">",
"721": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/50d.png\">",
"731": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/50d.png\">",
"741": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/50d.png\">",
"751": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/50d.png\">",
"761": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/50d.png\">",
"762": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/50d.png\">",
"771": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/50d.png\">",
"781": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/50d.png\">",
"701": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/50d.png\">",
"711": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/50d.png\">",
"721": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/50d.png\">",
"731": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/50d.png\">",
"741": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/50d.png\">",
"751": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/50d.png\">",
"761": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/50d.png\">",
"762": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/50d.png\">",
"771": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/50d.png\">",
"781": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/50d.png\">",
"0": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/0.gif\">",
"1": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/1.gif\">",
"2": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/2.gif\">",
"3": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/3.gif\">",
"4": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/4.gif\">",
"5": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/5.gif\">",
"6": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/6.gif\">",
"7": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/7.gif\">",
"8": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/8.gif\">",
"9": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/9.gif\">",
"10": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/10.gif\">",
"11": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/11.gif\">",
"12": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/12.gif\">",
"13": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/13.gif\">",
"14": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/14.gif\">",
"15": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/15.gif\">",
"16": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/16.gif\">",
"17": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/17.gif\">",
"18": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/18.gif\">",
"19": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/19.gif\">",
"20": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/20.gif\">",
"21": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/21.gif\">",
"22": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/22.gif\">",
"23": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/23.gif\">",
"24": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/24.gif\">",
"25": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/25.gif\">",
"26": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/26.gif\">",
"27": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/27.gif\">",
"28": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/28.gif\">",
"29": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/29.gif\">",
"30": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/30.gif\">",
"31": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/31.gif\">",
"32": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/32.gif\">",
"33": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/33.gif\">",
"34": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/34.gif\">",
"35": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/35.gif\">",
"36": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/36.gif\">",
"37": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/37.gif\">",
"38": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/38.gif\">",
"39": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/39.gif\">",
"40": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/40.gif\">",
"41": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/41.gif\">",
"42": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/42.gif\">",
"43": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/43.gif\">",
"44": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/44.gif\">",
"45": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/45.gif\">",
"46": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/46.gif\">",
"47": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/47.gif\">",
"3200": "<img src=\"@CMAKE_INSTALL_PREFIX@/@DATA_INSTALL_DIR@/@PROJECT_NAME@/weather/3200.gif\">"
"0": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/0.gif\">",
"1": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/1.gif\">",
"2": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/2.gif\">",
"3": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/3.gif\">",
"4": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/4.gif\">",
"5": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/5.gif\">",
"6": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/6.gif\">",
"7": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/7.gif\">",
"8": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/8.gif\">",
"9": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/9.gif\">",
"10": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/10.gif\">",
"11": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/11.gif\">",
"12": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/12.gif\">",
"13": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/13.gif\">",
"14": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/14.gif\">",
"15": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/15.gif\">",
"16": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/16.gif\">",
"17": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/17.gif\">",
"18": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/18.gif\">",
"19": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/19.gif\">",
"20": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/20.gif\">",
"21": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/21.gif\">",
"22": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/22.gif\">",
"23": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/23.gif\">",
"24": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/24.gif\">",
"25": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/25.gif\">",
"26": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/26.gif\">",
"27": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/27.gif\">",
"28": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/28.gif\">",
"29": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/29.gif\">",
"30": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/30.gif\">",
"31": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/31.gif\">",
"32": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/32.gif\">",
"33": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/33.gif\">",
"34": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/34.gif\">",
"35": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/35.gif\">",
"36": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/36.gif\">",
"37": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/37.gif\">",
"38": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/38.gif\">",
"39": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/39.gif\">",
"40": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/40.gif\">",
"41": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/41.gif\">",
"42": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/42.gif\">",
"43": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/43.gif\">",
"44": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/44.gif\">",
"45": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/45.gif\">",
"46": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/46.gif\">",
"47": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/47.gif\">",
"3200": "<img src=\"@KDE_INSTALL_FULL_DATADIR@/@PROJECT_NAME@/weather/3200.gif\">"
},
"text": {

View File

@ -15,7 +15,6 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awfloatformatter.h"
#include "ui_awfloatformatter.h"
@ -26,24 +25,13 @@
#include "awdebug.h"
AWFloatFormatter::AWFloatFormatter(QWidget *_parent, const QString &_filePath)
AWFloatFormatter::AWFloatFormatter(QObject *_parent, const QString &_filePath)
: AWAbstractFormatter(_parent, _filePath)
, ui(new Ui::AWFloatFormatter)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty())
AWFloatFormatter::readConfiguration();
ui->setupUi(this);
AWFloatFormatter::translate();
}
AWFloatFormatter::~AWFloatFormatter()
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
delete ui;
}
@ -51,8 +39,8 @@ QString AWFloatFormatter::convert(const QVariant &_value) const
{
qCDebug(LOG_LIB) << "Convert value" << _value;
QString output = QString("%1").arg(_value.toDouble() * multiplier() + summand(), count(),
format(), precision(), fillChar());
auto output
= QString("%1").arg(_value.toDouble() * multiplier() + summand(), count(), format(), precision(), fillChar());
if (forceWidth())
output = output.left(count());
@ -64,7 +52,7 @@ AWFloatFormatter *AWFloatFormatter::copy(const QString &_fileName, const int _nu
{
qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
auto *item = new AWFloatFormatter(dynamic_cast<QWidget *>(parent()), _fileName);
auto item = new AWFloatFormatter(parent(), _fileName);
AWAbstractFormatter::copyDefaults(item);
item->setCount(count());
item->setFormat(format());
@ -149,8 +137,7 @@ void AWFloatFormatter::setFormat(char _format)
{
qCDebug(LOG_LIB) << "Set format" << _format;
// http://doc.qt.io/qt-5/qstring.html#argument-formats
if ((_format != 'e') && (_format != 'E') && (_format != 'f') && (_format != 'g')
&& (_format != 'G')) {
if ((_format != 'e') && (_format != 'E') && (_format != 'f') && (_format != 'g') && (_format != 'G')) {
qCWarning(LOG_LIB) << "Invalid format" << _format;
_format = 'f';
}
@ -203,10 +190,15 @@ void AWFloatFormatter::readConfiguration()
}
int AWFloatFormatter::showConfiguration(const QVariant &_args)
int AWFloatFormatter::showConfiguration(QWidget *_parent, const QVariant &_args)
{
Q_UNUSED(_args)
auto dialog = new QDialog(_parent);
auto ui = new Ui::AWFloatFormatter();
ui->setupUi(dialog);
translate(ui);
ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment());
ui->label_typeValue->setText("Float");
@ -218,22 +210,26 @@ int AWFloatFormatter::showConfiguration(const QVariant &_args)
ui->doubleSpinBox_multiplier->setValue(multiplier());
ui->doubleSpinBox_summand->setValue(summand());
int ret = exec();
if (ret != 1)
return ret;
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text());
setFormat(ui->comboBox_format->currentText().at(0).toLatin1());
setPrecision(ui->spinBox_precision->value());
setCount(ui->spinBox_width->value());
setFillChar(ui->lineEdit_fill->text().at(0));
setForceWidth(ui->checkBox_forceWidth->checkState() == Qt::Checked);
setMultiplier(ui->doubleSpinBox_multiplier->value());
setSummand(ui->doubleSpinBox_summand->value());
auto ret = dialog->exec();
if (ret == 1) {
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text());
setFormat(ui->comboBox_format->currentText().at(0).toLatin1());
setPrecision(ui->spinBox_precision->value());
setCount(ui->spinBox_width->value());
setFillChar(ui->lineEdit_fill->text().at(0));
setForceWidth(ui->checkBox_forceWidth->checkState() == Qt::Checked);
setMultiplier(ui->doubleSpinBox_multiplier->value());
setSummand(ui->doubleSpinBox_summand->value());
writeConfiguration();
}
dialog->deleteLater();
delete ui;
writeConfiguration();
return ret;
}
@ -259,8 +255,10 @@ void AWFloatFormatter::writeConfiguration() const
}
void AWFloatFormatter::translate()
void AWFloatFormatter::translate(void *_ui)
{
auto ui = reinterpret_cast<Ui::AWFloatFormatter *>(_ui);
ui->label_name->setText(i18n("Name"));
ui->label_comment->setText(i18n("Comment"));
ui->label_type->setText(i18n("Type"));

View File

@ -21,11 +21,6 @@
#include "awabstractformatter.h"
namespace Ui
{
class AWFloatFormatter;
}
class AWFloatFormatter : public AWAbstractFormatter
{
Q_OBJECT
@ -38,8 +33,7 @@ class AWFloatFormatter : public AWAbstractFormatter
Q_PROPERTY(double summand READ summand WRITE setSummand)
public:
explicit AWFloatFormatter(QWidget *_parent = nullptr, const QString &_filePath = "");
~AWFloatFormatter() override;
explicit AWFloatFormatter(QObject *_parent = nullptr, const QString &_filePath = "");
[[nodiscard]] QString convert(const QVariant &_value) const override;
AWFloatFormatter *copy(const QString &_fileName, int _number) override;
// properties
@ -60,12 +54,11 @@ public:
public slots:
void readConfiguration() override;
int showConfiguration(const QVariant &_args) override;
int showConfiguration(QWidget *_parent, const QVariant &_args) override;
void writeConfiguration() const override;
private:
Ui::AWFloatFormatter *ui = nullptr;
void translate() override;
void translate(void *_ui) override;
// properties
int m_count = 0;
QChar m_fillChar = QChar();

View File

@ -15,7 +15,6 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awjsonformatter.h"
#include "ui_awjsonformatter.h"
@ -27,24 +26,13 @@
#include "awdebug.h"
AWJsonFormatter::AWJsonFormatter(QWidget *_parent, const QString &_filePath)
AWJsonFormatter::AWJsonFormatter(QObject *_parent, const QString &_filePath)
: AWAbstractFormatter(_parent, _filePath)
, ui(new Ui::AWJsonFormatter)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty())
AWJsonFormatter::readConfiguration();
ui->setupUi(this);
AWJsonFormatter::translate();
}
AWJsonFormatter::~AWJsonFormatter()
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
delete ui;
}
@ -53,9 +41,8 @@ QString AWJsonFormatter::convert(const QVariant &_value) const
qCDebug(LOG_LIB) << "Convert value" << _value;
// check if _value is string and parse first if required
QJsonDocument json = _value.type() == QVariant::String
? QJsonDocument::fromJson(_value.toString().toUtf8())
: QJsonDocument::fromVariant(_value);
QJsonDocument json = _value.userType() == QMetaType::QString ? QJsonDocument::fromJson(_value.toString().toUtf8())
: QJsonDocument::fromVariant(_value);
QVariant converted = json.toVariant();
for (auto &element : m_splittedPath)
converted = getFromJson(converted, element);
@ -68,7 +55,7 @@ AWJsonFormatter *AWJsonFormatter::copy(const QString &_fileName, const int _numb
{
qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
auto *item = new AWJsonFormatter(dynamic_cast<QWidget *>(parent()), _fileName);
auto item = new AWJsonFormatter(parent(), _fileName);
AWAbstractFormatter::copyDefaults(item);
item->setNumber(_number);
item->setPath(path());
@ -106,25 +93,34 @@ void AWJsonFormatter::readConfiguration()
}
int AWJsonFormatter::showConfiguration(const QVariant &args)
int AWJsonFormatter::showConfiguration(QWidget *_parent, const QVariant &args)
{
Q_UNUSED(args)
auto dialog = new QDialog(_parent);
auto ui = new Ui::AWJsonFormatter();
ui->setupUi(dialog);
translate(ui);
ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment());
ui->label_typeValue->setText("Json");
ui->lineEdit_path->setText(path());
int ret = exec();
if (ret != 1)
return ret;
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text());
setPath(ui->lineEdit_path->text());
auto ret = dialog->exec();
if (ret == 1) {
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text());
setPath(ui->lineEdit_path->text());
writeConfiguration();
}
dialog->deleteLater();
delete ui;
writeConfiguration();
return ret;
}
@ -148,9 +144,9 @@ QVariant AWJsonFormatter::getFromJson(const QVariant &_value, const QVariant &_e
{
qCDebug(LOG_LIB) << "Looking for element" << _element << "in" << _value;
if (_element.type() == QVariant::String) {
if (_element.userType() == QMetaType::QString) {
return getFromMap(_value, _element.toString());
} else if (_element.type() == QVariant::Int) {
} else if (_element.userType() == QMetaType::Int) {
return getFromList(_value, _element.toInt());
} else {
qCWarning(LOG_LIB) << "Unknown type" << _element.typeName();
@ -188,8 +184,10 @@ void AWJsonFormatter::initPath()
}
void AWJsonFormatter::translate()
void AWJsonFormatter::translate(void *_ui)
{
auto ui = reinterpret_cast<Ui::AWJsonFormatter *>(_ui);
ui->label_name->setText(i18n("Name"));
ui->label_comment->setText(i18n("Comment"));
ui->label_type->setText(i18n("Type"));

View File

@ -21,19 +21,13 @@
#include "awabstractformatter.h"
namespace Ui
{
class AWJsonFormatter;
}
class AWJsonFormatter : public AWAbstractFormatter
{
Q_OBJECT
Q_PROPERTY(QString path READ path WRITE setPath)
public:
explicit AWJsonFormatter(QWidget *_parent = nullptr, const QString &_filePath = "");
~AWJsonFormatter() override;
explicit AWJsonFormatter(QObject *_parent = nullptr, const QString &_filePath = "");
[[nodiscard]] QString convert(const QVariant &_value) const override;
AWJsonFormatter *copy(const QString &_fileName, int _number) override;
// properties
@ -42,16 +36,15 @@ public:
public slots:
void readConfiguration() override;
int showConfiguration(const QVariant &_args) override;
int showConfiguration(QWidget *_parent, const QVariant &_args) override;
void writeConfiguration() const override;
private:
Ui::AWJsonFormatter *ui = nullptr;
static QVariant getFromJson(const QVariant &_value, const QVariant &_element);
static QVariant getFromList(const QVariant &_value, int _index);
static QVariant getFromMap(const QVariant &_value, const QString &_key);
void initPath();
void translate() override;
void translate(void *_ui) override;
// properties
QString m_path;
QVariantList m_splittedPath;

View File

@ -15,7 +15,6 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awlistformatter.h"
#include "ui_awlistformatter.h"
@ -26,24 +25,13 @@
#include "awdebug.h"
AWListFormatter::AWListFormatter(QWidget *_parent, const QString &_filePath)
AWListFormatter::AWListFormatter(QObject *_parent, const QString &_filePath)
: AWAbstractFormatter(_parent, _filePath)
, ui(new Ui::AWListFormatter)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty())
AWListFormatter::readConfiguration();
ui->setupUi(this);
AWListFormatter::translate();
}
AWListFormatter::~AWListFormatter()
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
delete ui;
}
@ -51,7 +39,7 @@ QString AWListFormatter::convert(const QVariant &_value) const
{
qCDebug(LOG_LIB) << "Convert value" << _value;
QStringList output = _value.toStringList();
auto output = _value.toStringList();
if (isSorted())
output.sort();
@ -63,7 +51,7 @@ AWListFormatter *AWListFormatter::copy(const QString &_fileName, const int _numb
{
qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
auto *item = new AWListFormatter(dynamic_cast<QWidget *>(parent()), _fileName);
auto item = new AWListFormatter(parent(), _fileName);
AWAbstractFormatter::copyDefaults(item);
item->setFilter(filter());
item->setSeparator(separator());
@ -97,7 +85,7 @@ void AWListFormatter::setFilter(const QString &_filter)
qCDebug(LOG_LIB) << "Filter" << _filter;
m_filter = _filter;
m_regex = QRegExp(m_filter);
m_regex = QRegularExpression(m_filter);
}
@ -133,10 +121,15 @@ void AWListFormatter::readConfiguration()
}
int AWListFormatter::showConfiguration(const QVariant &_args)
int AWListFormatter::showConfiguration(QWidget *_parent, const QVariant &_args)
{
Q_UNUSED(_args)
auto dialog = new QDialog(_parent);
auto ui = new Ui::AWListFormatter();
ui->setupUi(dialog);
translate(ui);
ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment());
ui->label_typeValue->setText("List");
@ -144,18 +137,22 @@ int AWListFormatter::showConfiguration(const QVariant &_args)
ui->lineEdit_separator->setText(separator());
ui->checkBox_sorted->setCheckState(isSorted() ? Qt::Checked : Qt::Unchecked);
int ret = exec();
if (ret != 1)
return ret;
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text());
setFilter(ui->lineEdit_filter->text());
setSeparator(ui->lineEdit_separator->text());
setSorted(ui->checkBox_sorted->checkState() == Qt::Checked);
auto ret = dialog->exec();
if (ret == 1) {
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text());
setFilter(ui->lineEdit_filter->text());
setSeparator(ui->lineEdit_separator->text());
setSorted(ui->checkBox_sorted->checkState() == Qt::Checked);
writeConfiguration();
}
dialog->deleteLater();
delete ui;
writeConfiguration();
return ret;
}
@ -177,8 +174,10 @@ void AWListFormatter::writeConfiguration() const
}
void AWListFormatter::translate()
void AWListFormatter::translate(void *_ui)
{
auto ui = reinterpret_cast<Ui::AWListFormatter *>(_ui);
ui->label_name->setText(i18n("Name"));
ui->label_comment->setText(i18n("Comment"));
ui->label_type->setText(i18n("Type"));

View File

@ -21,11 +21,6 @@
#include "awabstractformatter.h"
namespace Ui
{
class AWListFormatter;
}
class AWListFormatter : public AWAbstractFormatter
{
Q_OBJECT
@ -34,8 +29,7 @@ class AWListFormatter : public AWAbstractFormatter
Q_PROPERTY(bool sorted READ isSorted WRITE setSorted)
public:
explicit AWListFormatter(QWidget *_parent = nullptr, const QString &_filePath = "");
~AWListFormatter() override;
explicit AWListFormatter(QObject *_parent = nullptr, const QString &_filePath = "");
[[nodiscard]] QString convert(const QVariant &_value) const override;
AWListFormatter *copy(const QString &_fileName, int _number) override;
// properties
@ -48,17 +42,16 @@ public:
public slots:
void readConfiguration() override;
int showConfiguration(const QVariant &_args) override;
int showConfiguration(QWidget *_parent, const QVariant &_args) override;
void writeConfiguration() const override;
private:
Ui::AWListFormatter *ui = nullptr;
void translate() override;
void translate(void *_ui) override;
// properties
QString m_filter = "";
QString m_separator = "";
bool m_sorted = false;
QRegExp m_regex;
QRegularExpression m_regex;
};

View File

@ -15,7 +15,6 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awnoformatter.h"
#include "ui_awnoformatter.h"
@ -24,24 +23,13 @@
#include "awdebug.h"
AWNoFormatter::AWNoFormatter(QWidget *_parent, const QString &_filePath)
AWNoFormatter::AWNoFormatter(QObject *_parent, const QString &_filePath)
: AWAbstractFormatter(_parent, _filePath)
, ui(new Ui::AWNoFormatter)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty())
AWNoFormatter::readConfiguration();
ui->setupUi(this);
AWNoFormatter::translate();
}
AWNoFormatter::~AWNoFormatter()
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
delete ui;
}
@ -57,7 +45,7 @@ AWNoFormatter *AWNoFormatter::copy(const QString &_fileName, const int _number)
{
qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
auto *item = new AWNoFormatter(dynamic_cast<QWidget *>(parent()), _fileName);
auto item = new AWNoFormatter(parent(), _fileName);
AWAbstractFormatter::copyDefaults(item);
item->setNumber(_number);
@ -65,29 +53,40 @@ AWNoFormatter *AWNoFormatter::copy(const QString &_fileName, const int _number)
}
int AWNoFormatter::showConfiguration(const QVariant &_args)
int AWNoFormatter::showConfiguration(QWidget *_parent, const QVariant &_args)
{
Q_UNUSED(_args)
auto dialog = new QDialog(_parent);
auto ui = new Ui::AWNoFormatter();
ui->setupUi(dialog);
translate(ui);
ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment());
ui->label_typeValue->setText("NoFormat");
int ret = exec();
if (ret != 1)
return ret;
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text());
auto ret = dialog->exec();
if (ret == 1) {
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text());
writeConfiguration();
}
dialog->deleteLater();
delete ui;
writeConfiguration();
return ret;
}
void AWNoFormatter::translate()
void AWNoFormatter::translate(void *_ui)
{
auto ui = reinterpret_cast<Ui::AWNoFormatter *>(_ui);
ui->label_name->setText(i18n("Name"));
ui->label_comment->setText(i18n("Comment"));
ui->label_type->setText(i18n("Type"));

View File

@ -21,27 +21,20 @@
#include "awabstractformatter.h"
namespace Ui
{
class AWNoFormatter;
}
class AWNoFormatter : public AWAbstractFormatter
{
Q_OBJECT
public:
explicit AWNoFormatter(QWidget *_parent = nullptr, const QString &_filePath = "");
~AWNoFormatter() override;
explicit AWNoFormatter(QObject *_parent = nullptr, const QString &_filePath = "");
[[nodiscard]] QString convert(const QVariant &_value) const override;
AWNoFormatter *copy(const QString &_fileName, int _number) override;
public slots:
int showConfiguration(const QVariant &_args) override;
int showConfiguration(QWidget *_parent, const QVariant &_args) override;
private:
Ui::AWNoFormatter *ui = nullptr;
void translate() override;
void translate(void *_ui) override;
// properties
};

View File

@ -15,7 +15,6 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awscriptformatter.h"
#include "ui_awscriptformatter.h"
@ -27,24 +26,13 @@
#include "awdebug.h"
AWScriptFormatter::AWScriptFormatter(QWidget *_parent, const QString &_filePath)
AWScriptFormatter::AWScriptFormatter(QObject *_parent, const QString &_filePath)
: AWAbstractFormatter(_parent, _filePath)
, ui(new Ui::AWScriptFormatter)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty())
AWScriptFormatter::readConfiguration();
ui->setupUi(this);
AWScriptFormatter::translate();
}
AWScriptFormatter::~AWScriptFormatter()
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
delete ui;
}
@ -54,13 +42,12 @@ QString AWScriptFormatter::convert(const QVariant &_value) const
// init engine
QJSEngine engine;
QJSValue fn = engine.evaluate(m_program);
QJSValueList args = QJSValueList() << _value.toString();
QJSValue result = fn.call(args);
auto fn = engine.evaluate(m_program);
auto result = fn.call({_value.toString()});
if (result.isError()) {
qCWarning(LOG_LIB) << "Uncaught exception at line" << result.property("lineNumber").toInt()
<< ":" << result.toString();
qCWarning(LOG_LIB) << "Uncaught exception at line" << result.property("lineNumber").toInt() << ":"
<< result.toString();
return "";
} else {
return result.toString();
@ -72,7 +59,7 @@ AWScriptFormatter *AWScriptFormatter::copy(const QString &_fileName, const int _
{
qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
auto *item = new AWScriptFormatter(dynamic_cast<QWidget *>(parent()), _fileName);
auto item = new AWScriptFormatter(parent(), _fileName);
AWAbstractFormatter::copyDefaults(item);
item->setAppendCode(appendCode());
item->setCode(code());
@ -150,10 +137,15 @@ void AWScriptFormatter::readConfiguration()
}
int AWScriptFormatter::showConfiguration(const QVariant &_args)
int AWScriptFormatter::showConfiguration(QWidget *_parent, const QVariant &_args)
{
Q_UNUSED(_args)
auto dialog = new QDialog(_parent);
auto ui = new Ui::AWScriptFormatter();
ui->setupUi(dialog);
translate(ui);
ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment());
ui->label_typeValue->setText("Script");
@ -161,19 +153,23 @@ int AWScriptFormatter::showConfiguration(const QVariant &_args)
ui->checkBox_hasReturn->setCheckState(hasReturn() ? Qt::Checked : Qt::Unchecked);
ui->textEdit_code->setPlainText(code());
int ret = exec();
if (ret != 1)
return ret;
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text());
setAppendCode(ui->checkBox_appendCode->checkState() == Qt::Checked);
setHasReturn(ui->checkBox_hasReturn->checkState() == Qt::Checked);
setCode(ui->textEdit_code->toPlainText());
initProgram();
int ret = dialog->exec();
if (ret == 1) {
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text());
setAppendCode(ui->checkBox_appendCode->checkState() == Qt::Checked);
setHasReturn(ui->checkBox_hasReturn->checkState() == Qt::Checked);
setCode(ui->textEdit_code->toPlainText());
initProgram();
writeConfiguration();
}
dialog->deleteLater();
delete ui;
writeConfiguration();
return ret;
}
@ -199,9 +195,7 @@ void AWScriptFormatter::initProgram()
{
// init JS code
if (appendCode())
m_program = QString("(function(value) { %1%2 })")
.arg(code())
.arg(hasReturn() ? "" : "; return output;");
m_program = QString("(function(value) { %1%2 })").arg(code(), hasReturn() ? "" : "; return output;");
else
m_program = code();
@ -209,8 +203,10 @@ void AWScriptFormatter::initProgram()
}
void AWScriptFormatter::translate()
void AWScriptFormatter::translate(void *_ui)
{
auto ui = reinterpret_cast<Ui::AWScriptFormatter *>(_ui);
ui->label_name->setText(i18n("Name"));
ui->label_comment->setText(i18n("Comment"));
ui->label_type->setText(i18n("Type"));

View File

@ -21,11 +21,6 @@
#include "awabstractformatter.h"
namespace Ui
{
class AWScriptFormatter;
}
class AWScriptFormatter : public AWAbstractFormatter
{
Q_OBJECT
@ -35,8 +30,7 @@ class AWScriptFormatter : public AWAbstractFormatter
Q_PROPERTY(QString program READ program)
public:
explicit AWScriptFormatter(QWidget *_parent = nullptr, const QString &_filePath = "");
~AWScriptFormatter() override;
explicit AWScriptFormatter(QObject *_parent = nullptr, const QString &_filePath = "");
[[nodiscard]] QString convert(const QVariant &_value) const override;
AWScriptFormatter *copy(const QString &_fileName, int _number) override;
// properties
@ -50,13 +44,12 @@ public:
public slots:
void readConfiguration() override;
int showConfiguration(const QVariant &_args) override;
int showConfiguration(QWidget *_parent, const QVariant &_args) override;
void writeConfiguration() const override;
private:
Ui::AWScriptFormatter *ui = nullptr;
void initProgram();
void translate() override;
void translate(void *_ui) override;
// properties
bool m_appendCode = true;
QString m_code = "";

View File

@ -15,7 +15,6 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awstringformatter.h"
#include "ui_awstringformatter.h"
@ -26,24 +25,13 @@
#include "awdebug.h"
AWStringFormatter::AWStringFormatter(QWidget *_parent, const QString &_filePath)
AWStringFormatter::AWStringFormatter(QObject *_parent, const QString &_filePath)
: AWAbstractFormatter(_parent, _filePath)
, ui(new Ui::AWStringFormatter)
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
if (!_filePath.isEmpty())
AWStringFormatter::readConfiguration();
ui->setupUi(this);
AWStringFormatter::translate();
}
AWStringFormatter::~AWStringFormatter()
{
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
delete ui;
}
@ -51,7 +39,7 @@ QString AWStringFormatter::convert(const QVariant &_value) const
{
qCDebug(LOG_LIB) << "Convert value" << _value;
QString output = QString("%1").arg(_value.toString(), count(), fillChar());
auto output = QString("%1").arg(_value.toString(), count(), fillChar());
if (forceWidth())
output = output.left(count());
@ -63,7 +51,7 @@ AWStringFormatter *AWStringFormatter::copy(const QString &_fileName, const int _
{
qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number;
auto *item = new AWStringFormatter(dynamic_cast<QWidget *>(parent()), _fileName);
auto item = new AWStringFormatter(parent(), _fileName);
AWAbstractFormatter::copyDefaults(item);
item->setCount(count());
item->setFillChar(fillChar());
@ -132,10 +120,15 @@ void AWStringFormatter::readConfiguration()
}
int AWStringFormatter::showConfiguration(const QVariant &_args)
int AWStringFormatter::showConfiguration(QWidget *_parent, const QVariant &_args)
{
Q_UNUSED(_args)
auto dialog = new QDialog(_parent);
auto ui = new Ui::AWStringFormatter();
ui->setupUi(dialog);
translate(ui);
ui->lineEdit_name->setText(name());
ui->lineEdit_comment->setText(comment());
ui->label_typeValue->setText("String");
@ -143,18 +136,22 @@ int AWStringFormatter::showConfiguration(const QVariant &_args)
ui->lineEdit_fill->setText(QString(fillChar()));
ui->checkBox_forceWidth->setCheckState(forceWidth() ? Qt::Checked : Qt::Unchecked);
int ret = exec();
if (ret != 1)
return ret;
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text());
setCount(ui->spinBox_width->value());
setFillChar(ui->lineEdit_fill->text().at(0));
setForceWidth(ui->checkBox_forceWidth->checkState() == Qt::Checked);
auto ret = dialog->exec();
if (ret == 1) {
setName(ui->lineEdit_name->text());
setComment(ui->lineEdit_comment->text());
setApiVersion(AW_FORMATTER_API);
setStrType(ui->label_typeValue->text());
setCount(ui->spinBox_width->value());
setFillChar(ui->lineEdit_fill->text().at(0));
setForceWidth(ui->checkBox_forceWidth->checkState() == Qt::Checked);
writeConfiguration();
}
dialog->deleteLater();
delete ui;
writeConfiguration();
return ret;
}
@ -176,8 +173,10 @@ void AWStringFormatter::writeConfiguration() const
}
void AWStringFormatter::translate()
void AWStringFormatter::translate(void *_ui)
{
auto ui = reinterpret_cast<Ui::AWStringFormatter *>(_ui);
ui->label_name->setText(i18n("Name"));
ui->label_comment->setText(i18n("Comment"));
ui->label_type->setText(i18n("Type"));

View File

@ -21,11 +21,6 @@
#include "awabstractformatter.h"
namespace Ui
{
class AWStringFormatter;
}
class AWStringFormatter : public AWAbstractFormatter
{
Q_OBJECT
@ -34,8 +29,7 @@ class AWStringFormatter : public AWAbstractFormatter
Q_PROPERTY(bool forceWidth READ forceWidth WRITE setForceWidth)
public:
explicit AWStringFormatter(QWidget *_parent = nullptr, const QString &_filePath = "");
~AWStringFormatter() override;
explicit AWStringFormatter(QObject *_parent = nullptr, const QString &_filePath = "");
[[nodiscard]] QString convert(const QVariant &_value) const override;
AWStringFormatter *copy(const QString &_fileName, int _number) override;
// properties
@ -48,12 +42,11 @@ public:
public slots:
void readConfiguration() override;
int showConfiguration(const QVariant &_args) override;
int showConfiguration(QWidget *_parent, const QVariant &_args) override;
void writeConfiguration() const override;
private:
Ui::AWStringFormatter *ui = nullptr;
void translate() override;
void translate(void *_ui) override;
// properties
int m_count = 0;
QChar m_fillChar = QChar();

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