Compare commits

..

18 Commits

Author SHA1 Message Date
c73486aaf8 gpu memory demo 2026-02-02 16:31:57 +02:00
59e3b21071 feat: use singleton connection to systemstats
it has been found in #174, that if there are multiple instances of
widget, it keeps subscribing on all sources, because of how dbus
interface works.

In order to hande it, all subscriptions are now kept from singleton with
tracking active clients
2026-01-30 16:03:45 +02:00
7e13e1eef7 Release 4.0.5 2026-01-28 19:53:21 +02:00
da53052a6f fix: always unsubscribe on sources 2026-01-28 19:51:51 +02:00
1a0a1fb884 Release 4.0.4 2026-01-28 14:18:16 +02:00
7a4367734b fix: check if subscription optimisation is enabled explicitly
Previous implementation has used implicit logic with empty keys arrays,
which might lead to some errors in processing
2026-01-28 14:16:55 +02:00
cdcd929cec Release 4.0.3 2026-01-01 19:54:34 +02:00
8605f66535 fix: compilation error with the latest releases (#173)
As it has been found in the releated issue, compile error occurs because
of missing evaluation and appears to be caused by Qt6QmlTargets.cmake.
Instead of trying to hack generated files, lets just drop qml
definitions because we don't really use them explicitly
2026-01-01 19:49:26 +02:00
3abcd8d6ae Release 4.0.2 2025-07-25 09:34:56 +03:00
daveedmee
0725288595 feat: added German translation (#172)
* Added German translation

About 96% of the plasmaoid into German. Missing strings for:

- AC online tag (as well as AC online)
- AC offline tag (as well as AC offline) (I think they are used for when you have a charging cable plugged into your laptop? I am on a desktop so I can't check)
- Quotes Monitor (as well as quotes – are they used for stocks?)
- User keys
- Has return

Also worth noting is that your redirection to stooq.com doesn't make sense for a German as it is a Polish stocks site

* Fixed some spelling issues

* fixed spelling of openSUSE

* Update de.po

Confused minimal with minimalistic. Changed translation accordingly

* added missing translation strings

Missing translations added for
- AC
- AC online (+tag)
- AC offline (+tag)
- Quotes (+Monitor)
- User keys
- has return
- Player data symbols
2025-07-23 20:22:00 +03:00
Winter
8342d65ffa docs: update README.md (#169) 2025-03-14 14:41:06 +02:00
571417f786 Release 4.0.1 2024-12-11 17:12:24 +02:00
e3d24d1890 fix: disable tooltip painting for now, because it causes error during
png rendering in qt
2024-12-11 17:09:10 +02:00
ee7bd90aae Release 4.0.0 2024-05-05 15:55:56 +03:00
f79c94e9e2 fix: add buttons to import dialog 2024-05-05 15:55:03 +03:00
66baa78cda build: fix debug builds 2024-05-05 15:41:43 +03:00
transifex-integration[bot]
79a148a21a chore: translate awesome-widgets.pot in ru (#167)
100% translated source file: 'awesome-widgets.pot'
on 'ru'.

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2024-05-04 01:19:09 +03:00
64b4618904 refactor: split formatters and matchers into separated singleton classes (#166)
* split formatter into separated singleton classes

* split data engine matchers to classes

* nodiscard attribute for formatter methods

* small refactoring in matchers

* fix codefactor warnings

* fix test building
2024-04-30 21:53:21 +03:00
44 changed files with 1749 additions and 75 deletions

3
.gitignore vendored
View File

@@ -48,3 +48,6 @@ pkg
# clion settings
.idea
cmake-build*
# clang
.cache

View File

@@ -13,3 +13,4 @@ Steve Lemuel (Chinese)
Mariusz Kocoń (Polish)
Ibnu Daru Aji (Indonesian)
Antonio Vivace (Italian)
@daveedmee (German)

View File

@@ -1,5 +1,19 @@
Ver.4.0.3:
- drop qml definition to avoid compile errors
Ver.4.0.2:
+ German translation (#172, thanks to daveedmee)
Ver.4.0.1:
- temporary disable tooltip painting in main widget
Ver.4.0.0:
* migration to plasma 6
* dialog windows have been replaced by notifications
+ $gpuN keys have been added
+ new key $ssid
- $cuptime key has been removed in favour of $uptime
- $gputemp key has been replaced by $gpuN
Ver.3.5.0:
+ wayland support

View File

@@ -75,5 +75,5 @@ Links
* [Scripts and bars](https://arcanis.me/en/2014/12/19/aw-v21-bells-and-whistles/)
* Plasmoid on [kde-look](http://kde-look.org/content/show.php/Awesome+Widgets?content=157124)
* DataEngine on [kde-look](http://kde-look.org/content/show.php/Extended+Systemmonitor+DataEngine?content=158773)
* Archlinux [AUR](https://aur.archlinux.org/packages/plasma5-applet-awesome-widgets/) package
* Archlinux [AUR](https://aur.archlinux.org/packages/plasma6-applets-awesome-widgets) package
* [OpenSuse](http://software.opensuse.org/search?q=awesome-widgets) packages, [KF5 OpenSuse](http://software.opensuse.org/package/plasma5-awesome-widgets) package

View File

@@ -2,7 +2,7 @@
pkgname=plasma6-applet-awesome-widgets
_pkgname=awesome-widgets
pkgver=4.0.0alpha2
pkgver=4.0.5
pkgrel=1
pkgdesc="Collection of minimalistic Plasmoids which look like Awesome WM widgets (ex-PyTextMonitor)"
arch=('x86_64')
@@ -27,5 +27,3 @@ build () {
package() {
DESTDIR="$pkgdir" cmake --install build
}
sha256sums=('b2a7b07a1df6f710f4e0d6e5898933f4ddb131818b922dc4b8e48afe3e98a664')

View File

@@ -19,7 +19,7 @@ set(PROJECT_CONTACT "esalexeev@gmail.com")
set(PROJECT_LICENSE "GPL3")
set(PROJECT_VERSION_MAJOR "4")
set(PROJECT_VERSION_MINOR "0")
set(PROJECT_VERSION_PATCH "0")
set(PROJECT_VERSION_PATCH "5")
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

@@ -15,7 +15,9 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#ifndef NDEBUG
#define NDEBUG
#endif /* NDEBUG */
#include <KI18n/KLocalizedString>
#include "awdebug.h"

View File

@@ -130,7 +130,7 @@ PlasmoidItem {
Plasmoid.userConfiguringChanged(false)
// connect data
awKeys.needTextToBeUpdated.connect(needTextUpdate)
awKeys.needToolTipToBeUpdated.connect(needToolTipUpdate)
//awKeys.needToolTipToBeUpdated.connect(needToolTipUpdate)
// check updates if required
if (plasmoid.configuration.checkUpdates) return awActions.checkUpdates(false)
}

View File

@@ -19,7 +19,7 @@
"Id": "org.kde.plasma.awesomewidget",
"License": "GPLv3",
"Name": "Awesome Widget",
"Version": "4.0.0",
"Version": "4.0.5",
"Website": "https://arcanis.me/projects/awesome-widgets/"
},
"X-Plasma-API-Minimum-Version": "6.0"

View File

@@ -34,7 +34,7 @@ public:
[[nodiscard]] QStringList sources() const;
[[nodiscard]] QStringList refinedSources() const;
// configuration related
void editPairs() override{};
void editPairs() override {};
QStringList leftKeys() override;
QStringList rightKeys() override;
};

View File

@@ -17,7 +17,6 @@
#pragma once
#include <QObject>
#include <QVariant>

View File

@@ -95,14 +95,55 @@ void AWDataEngineAggregator::loadSources()
}
void AWDataEngineAggregator::registerClient(QObject *_client)
{
qCDebug(LOG_AW) << "Register client" << _client;
// register new client
m_clients.insert(_client);
// (re)connect sources for new client
connectSources();
}
void AWDataEngineAggregator::unregisterClient(QObject *_client)
{
qCDebug(LOG_AW) << "Unregister client" << _client;
m_clients.remove(_client);
for (auto [source, clients] : m_droppedBy.asKeyValueRange()) {
if (clients.remove(_client)) {
if (isSubscriptionUnused(source))
dropSource(source);
}
}
}
void AWDataEngineAggregator::dropSource(const QString &_source)
{
qCDebug(LOG_AW) << "Disconnect sensor" << _source;
if (m_subscribed.contains(_source)) {
if (m_subscribed.remove(_source))
m_interface->unsubscribe({_source}).waitForFinished();
m_subscribed.remove(_source);
}
}
void AWDataEngineAggregator::dropSourceForClient(QObject *_client, const QString &_source)
{
qCDebug(LOG_AW) << "Client" << _client << "dropping source" << _source;
m_droppedBy[_source].insert(_client);
// only unsubscribe if ALL clients have dropped this source
if (isSubscriptionUnused(_source))
dropSource(_source);
}
bool AWDataEngineAggregator::isSubscriptionUnused(const QString &_source) const
{
return m_droppedBy.value(_source).size() >= m_clients.size() && !m_clients.isEmpty();
}

View File

@@ -23,6 +23,7 @@
#include <QObject>
#include <QSet>
#include <memory>
namespace KSysGuard::SystemStats
{
@@ -34,12 +35,26 @@ class AWDataEngineAggregator : public QObject
Q_OBJECT
public:
explicit AWDataEngineAggregator(QObject *_parent = nullptr);
~AWDataEngineAggregator() override;
AWDataEngineAggregator(AWDataEngineAggregator &) = delete;
void operator=(const AWDataEngineAggregator &) = delete;
[[nodiscard]] static AWDataEngineAggregator *instance(QObject *_client)
{
static auto instance = loadInstance();
instance->registerClient(_client);
return instance.get();
};
void connectSources();
void disconnectSources();
void dropSourceForClient(QObject *_client, const QString &_source);
[[nodiscard]] inline bool isSubscriptionUnused(const QString &_source) const;
[[nodiscard]] static bool isValidSensor(const KSysGuard::SensorInfo &_sensor);
void loadSources();
void registerClient(QObject *_client);
void unregisterClient(QObject *_client);
signals:
void dataUpdated(const QHash<QString, KSysGuard::SensorInfo> &_sensors, const KSysGuard::SensorDataList &_data);
@@ -52,7 +67,18 @@ public slots:
void updateData(const KSysGuard::SensorDataList &_data);
void updateSensors(const QHash<QString, KSysGuard::SensorInfo> &_sensors);
protected:
explicit AWDataEngineAggregator(QObject *_parent = nullptr);
[[nodiscard]] static std::unique_ptr<AWDataEngineAggregator> loadInstance()
{
auto instance = new AWDataEngineAggregator();
return std::unique_ptr<AWDataEngineAggregator>(instance);
};
private:
QSet<QObject *> m_clients;
QHash<QString, QSet<QObject *>> m_droppedBy;
KSysGuard::SystemStats::DBusInterface *m_interface = nullptr;
QHash<QString, KSysGuard::SensorInfo> m_sensors;
QSet<QString> m_subscribed;

View File

@@ -43,6 +43,10 @@ AWDataEngineMapper::AWDataEngineMapper(QObject *_parent, AWFormatterHelper *_cus
m_formatter["uptot"] = AWPluginFormatterMemoryMB::instance();
m_formatter["uptotkb"] = AWPluginFormatterMemory::instance();
m_formatter["upunits"] = AWPluginFormatterNetUnits::instance();
// gpu memory
m_formatter["gpumem"] = AWPluginFormatterFloat::instance();
m_formatter["gpufreemb"] = AWPluginFormatterMemoryMB::instance();
m_formatter["gpufreegb"] = AWPluginFormatterMemoryGB::instance();
}
@@ -65,7 +69,7 @@ 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 KSysGuard::Unit _units,
const QStringList &_keys)
const QStringList &_keys, const bool _disconnectUnused)
{
qCDebug(LOG_AW) << "Source" << _source << "with units" << _units;
@@ -91,7 +95,7 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
// check if keys were actually requested
qCInfo(LOG_AW) << "Looking for keys" << keys << "in" << _keys;
auto required = _keys.isEmpty()
auto required = !_disconnectUnused
|| std::any_of(keys.cbegin(), keys.cend(), [&_keys](auto &key) { return _keys.contains(key); });
if (!required)
return {};
@@ -109,4 +113,12 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
void AWDataEngineMapper::setDevices(const AWPluginMatcherSettings &_settings)
{
m_settings = _settings;
// update formatters
// gpu memory per device
for (auto i = 0; i < m_settings.gpu.count(); ++i) {
m_formatter[QString("gpumem%1").arg(i)] = AWPluginFormatterFloat::instance();
m_formatter[QString("gpufreemb%1").arg(i)] = AWPluginFormatterMemoryMB::instance();
m_formatter[QString("gpufreegb%1").arg(i)] = AWPluginFormatterMemoryGB::instance();
}
}

View File

@@ -39,7 +39,8 @@ public:
[[nodiscard]] AWPluginFormaterInterface *formatter(const QString &_key) const;
[[nodiscard]] QStringList keysFromSource(const QString &_source) const;
// set methods
QStringList registerSource(const QString &_source, KSysGuard::Unit _units, const QStringList &_keys);
QStringList registerSource(const QString &_source, KSysGuard::Unit _units, const QStringList &_keys,
const bool _disconnectUnused);
void setDevices(const AWPluginMatcherSettings &_settings);
private:

View File

@@ -70,12 +70,12 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, const QStringL
qCDebug(LOG_AW) << "Looking for required keys in" << _keys << _bars << "using tooltip settings" << _tooltip;
// initial copy
QSet<QString> used(_keys.cbegin(), _keys.cend());
QSet used(_keys.cbegin(), _keys.cend());
used.unite(QSet(_bars.cbegin(), _bars.cend()));
used.unite(QSet(_userKeys.cbegin(), _userKeys.cend()));
// insert keys from tooltip
for (auto [key, value] : _tooltip.asKeyValueRange()) {
if ((key.endsWith("Tooltip")) && value.toBool()) {
if (key.endsWith("Tooltip") && value.toBool()) {
auto local = key;
local.remove("Tooltip");
used << local;
@@ -84,7 +84,7 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, const QStringL
// insert keys which depend on others, refer to AWKeys::calculateValues()
// network keys
QStringList netKeys(
static QStringList netKeys(
{"up", "upkb", "uptot", "uptotkb", "upunits", "down", "downkb", "downtot", "downtotkb", "downunits"});
for (auto &key : netKeys) {
if (!used.contains(key))
@@ -96,11 +96,13 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, const QStringL
// netdev key
if (std::any_of(netKeys.cbegin(), netKeys.cend(), [&used](auto &key) { return used.contains(key); }))
used << "netdev";
// HACK append dummy if there are no other keys. This hack is required
// because empty list leads to the same behaviour as skip checking
if (used.isEmpty())
used << "dummy";
// gpu memory keys
static auto gpuMemoryCalculatedRegExp = QRegularExpression("^gpu(mem|freemb|freegb)");
for (auto key : _keys.filter(gpuMemoryCalculatedRegExp)) {
auto index = key.remove(gpuMemoryCalculatedRegExp);
used << QString("gpuusedmb%1").arg(index) << QString("gputotmb%1").arg(index)
<< QString("gpuusedgb%1").arg(index) << QString("gputotgb%1").arg(index);
}
return used.values();
}

View File

@@ -85,6 +85,13 @@ QStringList AWKeyOperations::dictKeys() const
// gpu
for (auto i = 0; i < m_devices.gpu.count(); ++i) {
allKeys.append(QString("gpu%1").arg(i));
allKeys.append(QString("gpumem%1").arg(i));
allKeys.append(QString("gpufreemb%1").arg(i));
allKeys.append(QString("gpufreegb%1").arg(i));
allKeys.append(QString("gputotmb%1").arg(i));
allKeys.append(QString("gputotgb%1").arg(i));
allKeys.append(QString("gpuusedmb%1").arg(i));
allKeys.append(QString("gpuusedgb%1").arg(i));
allKeys.append(QString("gputemp%1").arg(i));
}
// hdd

View File

@@ -43,7 +43,7 @@ AWKeys::AWKeys(QObject *_parent)
m_aggregator = new AWKeysAggregator(this);
m_dataAggregator = new AWDataAggregator(this);
m_dataEngineAggregator = new AWDataEngineAggregator(this);
m_dataEngineAggregator = AWDataEngineAggregator::instance(this);
m_keyOperator = new AWKeyOperations(this);
m_timer = new QTimer(this);
@@ -59,7 +59,8 @@ AWKeys::AWKeys(QObject *_parent)
connect(m_dataAggregator, &AWDataAggregator::toolTipPainted,
[this](const QString &_tooltip) { emit(needToolTipToBeUpdated(_tooltip)); });
connect(this, &AWKeys::dropSourceFromDataengine, m_dataEngineAggregator, &AWDataEngineAggregator::dropSource);
connect(this, &AWKeys::dropSourceFromDataengine, this,
[this](const QString &_source) { m_dataEngineAggregator->dropSourceForClient(this, _source); });
connect(m_dataEngineAggregator, &AWDataEngineAggregator::dataUpdated, this, &AWKeys::dataUpdated);
// transfer signal from dataengine to update source list
connect(m_dataEngineAggregator, &AWDataEngineAggregator::deviceAdded, m_keyOperator, &AWKeyOperations::addDevice);
@@ -70,6 +71,8 @@ AWKeys::~AWKeys()
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
m_dataEngineAggregator->unregisterClient(this);
m_timer->stop();
// delete dbus session
auto id = reinterpret_cast<qlonglong>(this);
@@ -206,9 +209,8 @@ 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 = AWKeyCache::getRequiredKeys(m_foundKeys, barKeys, m_tooltipParams,
m_keyOperator->requiredUserKeys(), _currentKeys);
// set key data to m_aggregator
m_aggregator->setDevices(m_keyOperator->devices());
@@ -246,6 +248,19 @@ void AWKeys::calculateValues()
m_values["uptotkb"] = m_values[QString("uptotkb%1").arg(netIndex)];
m_values["upunits"] = m_values[QString("upunits%1").arg(netIndex)];
// gpu memory keys
m_values["gpufreemb"] = m_values["gputotmb"].toLongLong() - m_values["gpuusedmb"].toLongLong();
m_values["gpufreegb"] = m_values["gputotgb"].toDouble() - m_values["gpuusedgb"].toDouble();
m_values["gpumem"] = 100.0 * m_values["gpuusedmb"].toDouble() / m_values["gputotmb"].toDouble();
for (auto i = 0; i < devices.gpu.count(); ++i) {
m_values[QString("gpufreemb%1").arg(i)] = m_values[QString("gputotmb%1").arg(i)].toLongLong()
- m_values[QString("gpuusedmb%1").arg(i)].toLongLong();
m_values[QString("gpufreegb%1").arg(i)]
= m_values[QString("gputotgb%1").arg(i)].toDouble() - m_values[QString("gpuusedgb%1").arg(i)].toDouble();
m_values[QString("gpumem%1").arg(i)] = 100.0 * m_values[QString("gpuusedmb%1").arg(i)].toDouble()
/ m_values[QString("gputotmb%1").arg(i)].toDouble();
}
// user defined keys
for (auto &key : m_keyOperator->userKeys())
m_values[key] = m_values[m_keyOperator->userKeySource(key)];
@@ -295,8 +310,8 @@ QString AWKeys::parsePattern(QString _pattern) const
// bars
for (auto &bar : m_foundBars) {
auto item = m_keyOperator->giByKey(bar);
auto image = item->isCustom() ? item->image(
AWPatternFunctions::expandLambdas(item->bar(), m_aggregator, m_values, item->usedKeys()))
auto 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);
}
@@ -317,7 +332,7 @@ void AWKeys::setDataBySource(const QString &_source, const KSysGuard::SensorInfo
// first list init
auto tags = m_aggregator->keysFromSource(_source);
if (tags.isEmpty())
tags = m_aggregator->registerSource(_source, _sensor.unit, m_requiredKeys);
tags = m_aggregator->registerSource(_source, _sensor.unit, m_requiredKeys, m_optimize);
// update data or drop source if there are no matches and exit
if (tags.isEmpty()) {

View File

@@ -151,9 +151,9 @@ void AWKeysAggregator::setTranslate(const bool _translate)
QStringList AWKeysAggregator::registerSource(const QString &_source, const KSysGuard::Unit _units,
const QStringList &_keys)
const QStringList &_keys, const bool _disconnectUnused)
{
qCDebug(LOG_AW) << "Source" << _source << "with units" << _units;
return m_mapper->registerSource(_source, _units, _keys);
return m_mapper->registerSource(_source, _units, _keys, _disconnectUnused);
}

View File

@@ -61,7 +61,8 @@ public:
void setTranslate(bool _translate);
public slots:
QStringList registerSource(const QString &_source, KSysGuard::Unit _units, const QStringList &_keys);
QStringList registerSource(const QString &_source, KSysGuard::Unit _units, const QStringList &_keys,
const bool _disconnectUnused);
private:
AWPluginFormatSettings m_settings;

View File

@@ -17,6 +17,9 @@
#include "awupdatehelper.h"
#ifndef NDEBUG
#define NDEBUG
#endif /* NDEBUG */
#include <KI18n/KLocalizedString>
#include <KNotifications/KNotification>

View File

@@ -32,7 +32,7 @@ public:
[[nodiscard]] virtual QString format(const QVariant &_value, const QString &_key,
const AWPluginFormatSettings &_settings) const
= 0;
virtual void load(){};
virtual void load() {};
};

View File

@@ -15,6 +15,8 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#pragma once
#include "awpluginformatterac.h"
#include "awpluginformattercustom.h"
#include "awpluginformatterdouble.h"

View File

@@ -0,0 +1,36 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awpluginmatchergpumemorytotal.h"
#include "formatters/formatters.h"
QHash<QString, AWPluginFormaterInterface *> AWPluginMatcherGPUMemoryTotal::keys(const QString &, const KSysGuard::Unit,
const AWPluginMatcherSettings &) const
{
return {
{"gputotmb", AWPluginFormatterMemoryMB::instance()},
{"gputotgb", AWPluginFormatterMemoryGB::instance()},
};
}
bool AWPluginMatcherGPUMemoryTotal::matches(const QString &_source) const
{
return _source == "gpu/all/totalVram";
}

View File

@@ -0,0 +1,29 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#pragma once
#include "awpluginmatcher.h"
class AWPluginMatcherGPUMemoryTotal : public AWPluginMatcher<AWPluginMatcherGPUMemoryTotal>
{
public:
[[nodiscard]] QHash<QString, AWPluginFormaterInterface *> keys(const QString &, KSysGuard::Unit,
const AWPluginMatcherSettings &) const override;
[[nodiscard]] bool matches(const QString &_source) const override;
};

View File

@@ -0,0 +1,44 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awpluginmatchergpumemorytotalcore.h"
#include <QRegularExpression>
#include "formatters/formatters.h"
QHash<QString, AWPluginFormaterInterface *>
AWPluginMatcherGPUMemoryTotalCore::keys(const QString &_source, const KSysGuard::Unit,
const AWPluginMatcherSettings &_settings) const
{
auto index = AWPluginMatcher::index(_source, _settings.gpu);
if (index == -1)
return {};
return {
{QString("gputotmb%1").arg(index), AWPluginFormatterMemoryMB::instance()},
{QString("gputotgb%1").arg(index), AWPluginFormatterMemoryGB::instance()},
};
}
bool AWPluginMatcherGPUMemoryTotalCore::matches(const QString &_source) const
{
static auto regexp = QRegularExpression("^gpu/gpu.*/totalVram$");
return _source.contains(regexp);
}

View File

@@ -0,0 +1,29 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#pragma once
#include "awpluginmatcher.h"
class AWPluginMatcherGPUMemoryTotalCore : public AWPluginMatcher<AWPluginMatcherGPUMemoryTotalCore>
{
public:
[[nodiscard]] QHash<QString, AWPluginFormaterInterface *>
keys(const QString &_source, KSysGuard::Unit, const AWPluginMatcherSettings &_settings) const override;
[[nodiscard]] bool matches(const QString &_source) const override;
};

View File

@@ -0,0 +1,36 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awpluginmatchergpumemoryused.h"
#include "formatters/formatters.h"
QHash<QString, AWPluginFormaterInterface *> AWPluginMatcherGPUMemoryUsed::keys(const QString &, const KSysGuard::Unit,
const AWPluginMatcherSettings &) const
{
return {
{"gpuusedmb", AWPluginFormatterMemoryMB::instance()},
{"gpuusedgb", AWPluginFormatterMemoryGB::instance()},
};
}
bool AWPluginMatcherGPUMemoryUsed::matches(const QString &_source) const
{
return _source == "gpu/all/usedVram";
}

View File

@@ -0,0 +1,29 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#pragma once
#include "awpluginmatcher.h"
class AWPluginMatcherGPUMemoryUsed : public AWPluginMatcher<AWPluginMatcherGPUMemoryUsed>
{
public:
[[nodiscard]] QHash<QString, AWPluginFormaterInterface *> keys(const QString &, KSysGuard::Unit,
const AWPluginMatcherSettings &) const override;
[[nodiscard]] bool matches(const QString &_source) const override;
};

View File

@@ -0,0 +1,44 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#include "awpluginmatchergpumemoryusedcore.h"
#include <QRegularExpression>
#include "formatters/formatters.h"
QHash<QString, AWPluginFormaterInterface *>
AWPluginMatcherGPUMemoryUsedCore::keys(const QString &_source, const KSysGuard::Unit,
const AWPluginMatcherSettings &_settings) const
{
auto index = AWPluginMatcher::index(_source, _settings.gpu);
if (index == -1)
return {};
return {
{QString("gpuusedmb%1").arg(index), AWPluginFormatterMemoryMB::instance()},
{QString("gpuusedgb%1").arg(index), AWPluginFormatterMemoryGB::instance()},
};
}
bool AWPluginMatcherGPUMemoryUsedCore::matches(const QString &_source) const
{
static auto regexp = QRegularExpression("^gpu/gpu.*/usedVram$");
return _source.contains(regexp);
}

View File

@@ -0,0 +1,29 @@
/***************************************************************************
* This file is part of awesome-widgets *
* *
* awesome-widgets is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* awesome-widgets is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#pragma once
#include "awpluginmatcher.h"
class AWPluginMatcherGPUMemoryUsedCore : public AWPluginMatcher<AWPluginMatcherGPUMemoryUsedCore>
{
public:
[[nodiscard]] QHash<QString, AWPluginFormaterInterface *>
keys(const QString &_source, KSysGuard::Unit, const AWPluginMatcherSettings &_settings) const override;
[[nodiscard]] bool matches(const QString &_source) const override;
};

View File

@@ -15,6 +15,8 @@
* along with awesome-widgets. If not, see http://www.gnu.org/licenses/ *
***************************************************************************/
#pragma once
#include "awpluginmatcherac.h"
#include "awpluginmatcherbattery.h"
#include "awpluginmatcherbrightness.h"
@@ -28,6 +30,10 @@
#include "awpluginmatcherdesktopnumber.h"
#include "awpluginmatchergpu.h"
#include "awpluginmatchergpucore.h"
#include "awpluginmatchergpumemorytotal.h"
#include "awpluginmatchergpumemorytotalcore.h"
#include "awpluginmatchergpumemoryused.h"
#include "awpluginmatchergpumemoryusedcore.h"
#include "awpluginmatchergputemperature.h"
#include "awpluginmatcherhdd.h"
#include "awpluginmatcherhddfree.h"
@@ -80,6 +86,10 @@ static QList<AWPluginMatcherInterface *> matchers = {
AWPluginMatcherDesktopNumber::instance(),
AWPluginMatcherGPU::instance(),
AWPluginMatcherGPUCore::instance(),
AWPluginMatcherGPUMemoryTotal::instance(),
AWPluginMatcherGPUMemoryTotalCore::instance(),
AWPluginMatcherGPUMemoryUsed::instance(),
AWPluginMatcherGPUMemoryUsedCore::instance(),
AWPluginMatcherGPUTemperature::instance(),
AWPluginMatcherHDD::instance(),
AWPluginMatcherHDDFree::instance(),

View File

@@ -30,6 +30,7 @@ configure_file(${SUBPROJECT_WEATHER_JSON_IN} ${CMAKE_CURRENT_BINARY_DIR}/${SUBPR
qt6_wrap_ui(SUBPROJECT_UI_HEADER ${SUBPROJECT_UI} OPTIONS --translate ui_i18n)
add_library(${SUBPROJECT} STATIC ${SUBPROJECT_SOURCE} ${SUBPROJECT_HEADER} ${SUBPROJECT_UI_HEADER})
set_property(TARGET ${SUBPROJECT} PROPERTY POSITION_INDEPENDENT_CODE ON)
target_link_libraries(${SUBPROJECT} ${Qt_LIBRARIES} ${Kf6_LIBRARIES})
# install

View File

@@ -436,7 +436,7 @@ int GraphicalItem::showConfiguration(QWidget *_parent, const QVariant &_args)
auto ui = new Ui::GraphicalItem();
ui->setupUi(dialog);
connect(ui->checkBox_custom, &QCheckBox::stateChanged, [ui](const int state) { changeValue(ui, state); });
connect(ui->checkBox_custom, &QCheckBox::checkStateChanged, [ui](const int state) { changeValue(ui, state); });
connect(ui->comboBox_type, &QComboBox::currentIndexChanged, [ui](const int state) { changeCountState(ui, state); });
connect(ui->toolButton_activeColor, &QToolButton::clicked, [this, ui]() { changeColor(ui); });
connect(ui->toolButton_inactiveColor, &QToolButton::clicked, [this, ui]() { changeColor(ui); });
@@ -472,7 +472,7 @@ int GraphicalItem::showConfiguration(QWidget *_parent, const QVariant &_args)
// update UI
emit(ui->comboBox_type->currentIndexChanged(ui->comboBox_type->currentIndex()));
emit(ui->checkBox_custom->stateChanged(ui->checkBox_custom->checkState()));
emit(ui->checkBox_custom->checkStateChanged(ui->checkBox_custom->checkState()));
int ret = dialog->exec();
if (ret == 1) {

View File

@@ -21,4 +21,4 @@
#ifndef ui_i18n
#define ui_i18n(text, parent) i18n(text)
#endif
#endif /* ui_i18n */

View File

@@ -19,7 +19,7 @@
"Id": "org.kde.plasma.desktoppanel",
"License": "GPLv3",
"Name": "Desktop Panel",
"Version": "4.0.0",
"Version": "4.0.5",
"Website": "https://arcanis.me/projects/awesome-widgets/"
},
"X-Plasma-API-Minimum-Version": "6.0"

View File

@@ -15,4 +15,5 @@ file(GLOB SUBPROJECT_SOURCE *.cpp)
file(GLOB SUBPROJECT_HEADER *.h)
add_library(${SUBPROJECT} STATIC ${SUBPROJECT_SOURCE} ${SUBPROJECT_HEADER})
set_property(TARGET ${SUBPROJECT} PROPERTY POSITION_INDEPENDENT_CODE ON)
target_link_libraries(${SUBPROJECT} ${PROJECT_LIBRARY} ${Qt_LIBRARIES} ${Kf6_LIBRARIES})

View File

@@ -128,8 +128,8 @@ QVariant SystemInfoSource::sendDBusRequest(const QString &_destination, const QS
auto response = bus.call(request, QDBus::BlockWithGui, REQUEST_TIMEOUT);
if ((response.type() != QDBusMessage::ReplyMessage) || (response.arguments().isEmpty())) {
qCWarning(LOG_ESS) << "Error message" << response.errorMessage();
if (response.type() != QDBusMessage::ReplyMessage || response.arguments().isEmpty()) {
qCWarning(LOG_ESS) << "Error" << response.errorName() << "with message" << response.errorMessage();
return {};
} else {
return response.arguments().first();

View File

@@ -5,7 +5,7 @@ find_package(Gettext REQUIRED)
find_package(Qt6 6.6.0 REQUIRED COMPONENTS Core Concurrent DBus Network Qml Test Widgets)
add_definitions(
${Qt6Core_DEFINITIONS} ${Qt6DBus_DEFINITIONS} ${Qt6Network_DEFINITIONS}
${Qt6Qml_DEFINITIONS} ${Qt6Widgets_DEFINITIONS}
${Qt6Widgets_DEFINITIONS}
)
set(Qt_INCLUDE
${Qt6Core_INCLUDE_DIRS} ${Qt6Concurrent_INCLUDE_DIRS} ${Qt6DBus_INCLUDE_DIRS} ${Qt6Network_INCLUDE_DIRS}

View File

@@ -38,6 +38,7 @@ Item {
Dialog {
id: importSelection
standardButtons: Dialog.Ok | Dialog.Cancel
Column {
CheckBox {

View File

@@ -45,7 +45,7 @@ void TestAWBugReporter::test_generateText()
void TestAWBugReporter::test_sendBugReport()
{
QSignalSpy spy(plugin, SIGNAL(replyReceived(int, QString &)));
QSignalSpy spy(plugin, SIGNAL(replyReceived(int, const QString &)));
plugin->sendBugReport(AWTestLibrary::randomString(),
plugin->generateText(data.at(0), data.at(1), data.at(2), data.at(3)));

1249
sources/translations/de.po Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,22 +1,25 @@
# Copyright (C) 2014
# This file is distributed under the same license as the PyTextMonitor package.
#
# SPDX-FileCopyrightText: 2014, 2015, 2016, 2017, 2020, 2024 Evgeniy Alekseev <esalexeev@gmail.com>
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the awesome-widgets package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Evgeniy Alekseev <darkarcanis@mail.ru>, 2024
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Project-Id-Version: awesome-widgets\n"
"Report-Msgid-Bugs-To: https://github.com/arcan1s/awesome-widgets/issues\n"
"POT-Creation-Date: 2024-04-22 14:53+0300\n"
"PO-Revision-Date: 2024-04-19 20:17+0300\n"
"Last-Translator: Evgenii Alekseev <esalexeev@gmail.com>\n"
"Language-Team: Russian <kde-russian@lists.kde.ru>\n"
"Language: ru\n"
"PO-Revision-Date: 2024-04-21 13:49+0000\n"
"Last-Translator: Evgeniy Alekseev <darkarcanis@mail.ru>, 2024\n"
"Language-Team: Russian (https://app.transifex.com/arcanis/teams/20130/ru/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Lokalize 24.02.1\n"
"Language: ru\n"
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
#: /home/arcanis/documents/github/awesome-widgets/sources/translations/../awdebug.cpp
#, kde-format
@@ -436,7 +439,7 @@ msgstr "Погода"
#: /home/arcanis/documents/github/awesome-widgets/sources/translations/../awesome-widget/package/contents/ui/main.qml
#, kde-format
msgid "Run monitor"
msgstr "Запустить монитор"
msgstr "Запустить системный монитор"
#: /home/arcanis/documents/github/awesome-widgets/sources/translations/../awesome-widget/package/contents/ui/main.qml
#, kde-format
@@ -795,7 +798,7 @@ msgstr "Котировки"
#: /home/arcanis/documents/github/awesome-widgets/sources/translations/../qml/General.qml
#, kde-format
msgid "System"
msgstr "Системные"
msgstr "Система"
#: /home/arcanis/documents/github/awesome-widgets/sources/translations/../extsysmon/extsysmonaggregator.cpp
#: /home/arcanis/documents/github/awesome-widgets/sources/translations/../qml/General.qml
@@ -837,11 +840,12 @@ msgstr "Предварительный просмотр"
#: /home/arcanis/documents/github/awesome-widgets/sources/translations/../qml/AWInfoLabel.qml
#, kde-format
msgid ""
"Detailed information may be found on <a href=\"https://arcanis.me/projects/"
"awesome-widgets/\">project homepage</a>"
"Detailed information may be found on <a "
"href=\"https://arcanis.me/projects/awesome-widgets/\">project homepage</a>"
msgstr ""
"Подробная информация может быть найдена на <a href=\"https://arcanis.me/ru/"
"projects/awesome-widgets/\">домашней странице проекта</a>"
"Подробная информация может быть найдена на <a "
"href=\"https://arcanis.me/ru/projects/awesome-widgets/\">домашней странице "
"проекта</a>"
#: /home/arcanis/documents/github/awesome-widgets/sources/translations/../qml/AWTagSelector.qml
#, kde-format
@@ -932,7 +936,7 @@ msgstr "HDD"
#: /home/arcanis/documents/github/awesome-widgets/sources/translations/../qml/General.qml
#, kde-format
msgid "Network request"
msgstr "Веб-запрос"
msgstr "Сетевой запрос"
#: /home/arcanis/documents/github/awesome-widgets/sources/translations/../qml/General.qml
#, kde-format
@@ -947,7 +951,7 @@ msgstr "Функции"
#: /home/arcanis/documents/github/awesome-widgets/sources/translations/../qml/General.qml
#, kde-format
msgid "User defined"
msgstr "Пользовательские ключи"
msgstr "Пользовательские определения"
#: /home/arcanis/documents/github/awesome-widgets/sources/translations/../qml/General.qml
#, kde-format
@@ -1037,9 +1041,8 @@ msgstr "Импорт дополнительных файлов"
#: /home/arcanis/documents/github/awesome-widgets/build/awesomewidgets/ui_extupgrade.h
#: /home/arcanis/documents/github/awesome-widgets/build/awesomewidgets/ui_extweather.h
#: /home/arcanis/documents/github/awesome-widgets/build/awesomewidgets/ui_graphicalitem.h
#, fuzzy
msgid "Configuration"
msgstr "Экспорт настроек"
msgstr "Настройки"
#: /home/arcanis/documents/github/awesome-widgets/build/awesomewidgets/ui_awdatetimeformatter.h
#: /home/arcanis/documents/github/awesome-widgets/build/awesomewidgets/ui_awfloatformatter.h
@@ -1173,7 +1176,7 @@ msgstr "Активен"
#: /home/arcanis/documents/github/awesome-widgets/build/awesomewidgets/ui_extupgrade.h
#: /home/arcanis/documents/github/awesome-widgets/build/awesomewidgets/ui_extweather.h
msgid "Update"
msgstr ""
msgstr "Обновление"
#: /home/arcanis/documents/github/awesome-widgets/build/awesomewidgets/ui_extnetworkrequest.h
#: /home/arcanis/documents/github/awesome-widgets/build/awesomewidgets/ui_extquotes.h
@@ -1205,10 +1208,10 @@ msgid ""
"Refer to <a href=\"https://stooq.com/\"><span style=\" text-decoration: "
"underline; color:#0057ae;\">https://stooq.com/</span></a></p></body></html>"
msgstr ""
"<html><head/><body><p>Используйте тикеры Stooq, чтобы получить котировки по "
"инструменту. См. <a href=\"https://stooq.com/\"><span style=\" text-"
"decoration: underline; color:#0057ae;\">https://stooq.com/</span></a></p></"
"body></html>"
"<html><head/><body><p>Используйте Stooq тикер для получения котировок по "
"финансовому инструменту, используя сайт <a "
"href=\"https\\://stooq.com/\"><span style=\" text-decoration\\: underline; "
"color\\:#0057ae;\">https\\://stooq.com/</span></a></p></body></html> "
#: /home/arcanis/documents/github/awesome-widgets/build/awesomewidgets/ui_extquotes.h
msgid "Ticker"
@@ -1281,12 +1284,11 @@ msgstr "Тип активного наполнения"
#: /home/arcanis/documents/github/awesome-widgets/build/awesomewidgets/ui_graphicalitem.h
msgid "..."
msgstr ""
msgstr "..."
#: /home/arcanis/documents/github/awesome-widgets/build/awesomewidgets/ui_graphicalitem.h
#, fuzzy
msgid "Inactive filling type"
msgstr "Тип неактивного наполнения"
msgstr "Цвет неактивного наполнения"
#: /home/arcanis/documents/github/awesome-widgets/build/awesomewidgets/ui_graphicalitem.h
msgid "Direction"

View File

@@ -70,6 +70,13 @@ static const char STATIC_KEYS[] = "time,"
"cpucl,"
"cpu,"
"gpu,"
"gpumem,"
"gpufreemb,"
"gpufreegb,"
"gputotmb,"
"gputotgb,"
"gpuusedmb,"
"gpuusedgb,"
"memmb,"
"memgb,"
"memfreemb,"