mirror of
https://github.com/arcan1s/awesome-widgets.git
synced 2025-07-15 06:45:48 +00:00
* better extensions update
* prepare dataaggregator to graph data * add ability to wrap text * move tag selection dialog to ui
This commit is contained in:
@ -20,25 +20,69 @@
|
||||
#include <KI18n/KLocalizedString>
|
||||
|
||||
#include <QBuffer>
|
||||
|
||||
#include <math.h>
|
||||
|
||||
#include "awactions.h"
|
||||
#include "awdebug.h"
|
||||
|
||||
|
||||
AWDataAggregator::AWDataAggregator(QObject *parent, QVariantMap settings)
|
||||
: QObject(parent),
|
||||
configuration(qvariant_cast<QVariantHash>(settings))
|
||||
AWDataAggregator::AWDataAggregator(QObject *parent)
|
||||
: QObject(parent)
|
||||
{
|
||||
qCDebug(LOG_AW);
|
||||
|
||||
toolTipScene = new QGraphicsScene(nullptr);
|
||||
toolTipView = new QGraphicsView(toolTipScene);
|
||||
toolTipView->setStyleSheet(QString("background: transparent"));
|
||||
toolTipView->setContentsMargins(0, 0, 0, 0);
|
||||
toolTipView->setFrameShape(QFrame::NoFrame);
|
||||
toolTipView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||
toolTipView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||
initScene();
|
||||
|
||||
connect(this, SIGNAL(updateData(QHash<QString, QString>)),
|
||||
this, SLOT(dataUpdate(QHash<QString, QString>)));
|
||||
}
|
||||
|
||||
|
||||
AWDataAggregator::~AWDataAggregator()
|
||||
{
|
||||
qCDebug(LOG_AW);
|
||||
|
||||
delete toolTipScene;
|
||||
}
|
||||
|
||||
|
||||
QList<float> AWDataAggregator::getData(const QString key) const
|
||||
{
|
||||
qCDebug(LOG_AW);
|
||||
qCDebug(LOG_AW) << "Key" << key;
|
||||
|
||||
return data[QString("%1Tooltip").arg(key)];
|
||||
}
|
||||
|
||||
|
||||
QSize AWDataAggregator::getTooltipSize() const
|
||||
{
|
||||
qCDebug(LOG_AW);
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
|
||||
QString AWDataAggregator::htmlImage(const QPixmap source) const
|
||||
{
|
||||
qCDebug(LOG_AW);
|
||||
|
||||
QByteArray byteArray;
|
||||
QBuffer buffer(&byteArray);
|
||||
source.save(&buffer, "PNG");
|
||||
|
||||
return byteArray.isEmpty() ? QString() :
|
||||
QString("<img src=\"data:image/png;base64,%1\"/>").arg(QString(byteArray.toBase64()));
|
||||
}
|
||||
|
||||
|
||||
void AWDataAggregator::setParameters(QVariantMap settings)
|
||||
{
|
||||
qCDebug(LOG_AW);
|
||||
qCDebug(LOG_AW) << "Settings" << settings;
|
||||
|
||||
configuration = qvariant_cast<QVariantHash>(settings);
|
||||
|
||||
enablePopup = configuration[QString("notify")].toBool();
|
||||
|
||||
@ -67,66 +111,10 @@ AWDataAggregator::AWDataAggregator(QObject *parent, QVariantMap settings)
|
||||
if (configuration[QString("upTooltip")].toBool()) requiredKeys.append(QString("upTooltip"));
|
||||
if (configuration[QString("batTooltip")].toBool()) requiredKeys.append(QString("batTooltip"));
|
||||
|
||||
connect(this, SIGNAL(updateData(QHash<QString, QString>)),
|
||||
this, SLOT(dataUpdate(QHash<QString, QString>)));
|
||||
}
|
||||
|
||||
|
||||
AWDataAggregator::~AWDataAggregator()
|
||||
{
|
||||
qCDebug(LOG_AW);
|
||||
|
||||
delete toolTipScene;
|
||||
}
|
||||
|
||||
|
||||
void AWDataAggregator::dataUpdate(QHash<QString, QString> values)
|
||||
{
|
||||
qCDebug(LOG_AW);
|
||||
|
||||
// battery update requires info is AC online or not
|
||||
setData(values[QString("ac")] == configuration[QString("acOnline")],
|
||||
QString("batTooltip"), values[QString("bat")].toFloat());
|
||||
// usual case
|
||||
setData(QString("cpuTooltip"), values[QString("cpu")].toFloat(), 90.0);
|
||||
setData(QString("cpuclTooltip"), values[QString("cpucl")].toFloat());
|
||||
setData(QString("memTooltip"), values[QString("mem")].toFloat(), 90.0);
|
||||
setData(QString("swapTooltip"), values[QString("swap")].toFloat(), 0.0);
|
||||
setData(QString("downTooltip"), values[QString("downkb")].toFloat());
|
||||
setData(QString("upTooltip"), values[QString("upkb")].toFloat());
|
||||
// additional check for network device
|
||||
[this](const QString value) {
|
||||
checkValue(QString("netdev"), currentNetworkDevice, value);
|
||||
currentNetworkDevice = value;
|
||||
}(values[QString("netdev")]);
|
||||
// additional check for GPU load
|
||||
[this](const float value) {
|
||||
checkValue(QString("gpu"), value, 90.0);
|
||||
currentGPULoad = value;
|
||||
}(values[QString("gpu")].toFloat());
|
||||
|
||||
emit(toolTipPainted(htmlImage(tooltipImage())));
|
||||
}
|
||||
|
||||
|
||||
QSize AWDataAggregator::getTooltipSize() const
|
||||
{
|
||||
qCDebug(LOG_AW);
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
|
||||
QString AWDataAggregator::htmlImage(const QPixmap source)
|
||||
{
|
||||
qCDebug(LOG_AW);
|
||||
|
||||
QByteArray byteArray;
|
||||
QBuffer buffer(&byteArray);
|
||||
source.save(&buffer, "PNG");
|
||||
|
||||
return byteArray.isEmpty() ? QString() :
|
||||
QString("<img src=\"data:image/png;base64,%1\"/>").arg(QString(byteArray.toBase64()));
|
||||
// background
|
||||
toolTipScene->setBackgroundBrush(configuration[QString("useTooltipBackground")].toBool() ?
|
||||
QBrush(QColor(configuration[QString("tooltipBackground")].toString())) :
|
||||
QBrush(Qt::NoBrush));
|
||||
}
|
||||
|
||||
|
||||
@ -138,10 +126,6 @@ QPixmap AWDataAggregator::tooltipImage()
|
||||
// create image
|
||||
toolTipScene->clear();
|
||||
QPen pen = QPen();
|
||||
// background
|
||||
toolTipScene->setBackgroundBrush(configuration[QString("useTooltipBackground")].toBool() ?
|
||||
QBrush(QColor(configuration[QString("tooltipBackground")].toString())) :
|
||||
QBrush(Qt::NoBrush));
|
||||
bool down = false;
|
||||
foreach(QString key, requiredKeys) {
|
||||
// create frame
|
||||
@ -174,6 +158,35 @@ QPixmap AWDataAggregator::tooltipImage()
|
||||
}
|
||||
|
||||
|
||||
void AWDataAggregator::dataUpdate(QHash<QString, QString> values)
|
||||
{
|
||||
qCDebug(LOG_AW);
|
||||
|
||||
// battery update requires info is AC online or not
|
||||
setData(values[QString("ac")] == configuration[QString("acOnline")],
|
||||
QString("batTooltip"), values[QString("bat")].toFloat());
|
||||
// usual case
|
||||
setData(QString("cpuTooltip"), values[QString("cpu")].toFloat(), 90.0);
|
||||
setData(QString("cpuclTooltip"), values[QString("cpucl")].toFloat());
|
||||
setData(QString("memTooltip"), values[QString("mem")].toFloat(), 90.0);
|
||||
setData(QString("swapTooltip"), values[QString("swap")].toFloat(), 0.0);
|
||||
setData(QString("downTooltip"), values[QString("downkb")].toFloat());
|
||||
setData(QString("upTooltip"), values[QString("upkb")].toFloat());
|
||||
// additional check for network device
|
||||
[this](const QString value) {
|
||||
checkValue(QString("netdev"), currentNetworkDevice, value);
|
||||
currentNetworkDevice = value;
|
||||
}(values[QString("netdev")]);
|
||||
// additional check for GPU load
|
||||
[this](const float value) {
|
||||
checkValue(QString("gpu"), value, 90.0);
|
||||
currentGPULoad = value;
|
||||
}(values[QString("gpu")].toFloat());
|
||||
|
||||
emit(toolTipPainted(htmlImage(tooltipImage())));
|
||||
}
|
||||
|
||||
|
||||
void AWDataAggregator::checkValue(const QString source, const float value, const float extremum) const
|
||||
{
|
||||
qCDebug(LOG_AW);
|
||||
@ -181,8 +194,13 @@ void AWDataAggregator::checkValue(const QString source, const float value, const
|
||||
qCDebug(LOG_AW) << "Value" << value;
|
||||
qCDebug(LOG_AW) << "Called with extremum" << extremum;
|
||||
|
||||
if ((enablePopup) && (value > extremum) && (data[source].last() < extremum))
|
||||
return AWActions::sendNotification(QString("event"), notificationText(source, value));
|
||||
if (value >= 0.0) {
|
||||
if ((enablePopup) && (value > extremum) && (data[source].last() < extremum))
|
||||
return AWActions::sendNotification(QString("event"), notificationText(source, value));
|
||||
} else {
|
||||
if ((enablePopup) && (value < extremum) && (data[source].last() > extremum))
|
||||
return AWActions::sendNotification(QString("event"), notificationText(source, value));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -198,6 +216,20 @@ void AWDataAggregator::checkValue(const QString source, const QString current, c
|
||||
}
|
||||
|
||||
|
||||
void AWDataAggregator::initScene()
|
||||
{
|
||||
qCDebug(LOG_AW);
|
||||
|
||||
toolTipScene = new QGraphicsScene(nullptr);
|
||||
toolTipView = new QGraphicsView(toolTipScene);
|
||||
toolTipView->setStyleSheet(QString("background: transparent"));
|
||||
toolTipView->setContentsMargins(0, 0, 0, 0);
|
||||
toolTipView->setFrameShape(QFrame::NoFrame);
|
||||
toolTipView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||
toolTipView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||
}
|
||||
|
||||
|
||||
QString AWDataAggregator::notificationText(const QString source, const float value) const
|
||||
{
|
||||
qCDebug(LOG_AW);
|
||||
|
@ -32,10 +32,12 @@ class AWDataAggregator : public QObject
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit AWDataAggregator(QObject *parent = nullptr, QVariantMap settings = QVariantMap());
|
||||
explicit AWDataAggregator(QObject *parent = nullptr);
|
||||
virtual ~AWDataAggregator();
|
||||
QList<float> getData(const QString key) const;
|
||||
QSize getTooltipSize() const;
|
||||
QString htmlImage(const QPixmap source);
|
||||
QString htmlImage(const QPixmap source) const;
|
||||
void setParameters(QVariantMap settings);
|
||||
QPixmap tooltipImage();
|
||||
|
||||
signals:
|
||||
@ -50,7 +52,8 @@ private:
|
||||
QGraphicsScene *toolTipScene = nullptr;
|
||||
QGraphicsView *toolTipView = nullptr;
|
||||
void checkValue(const QString source, const float value, const 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();
|
||||
QString notificationText(const QString source, const float value) const;
|
||||
QString notificationText(const QString source, const QString value) const;
|
||||
void setData(const QString source, float value, const float extremum = -1.0);
|
||||
@ -60,7 +63,7 @@ private:
|
||||
int counts = 0;
|
||||
QVariantHash configuration;
|
||||
float currentGPULoad = 0.0;
|
||||
QString currentNetworkDevice;
|
||||
QString currentNetworkDevice = QString("lo");
|
||||
QHash<QString, float> boundaries;
|
||||
QHash<QString, QList<float>> data;
|
||||
bool enablePopup = false;
|
||||
|
@ -46,14 +46,11 @@ AWKeys::AWKeys(QObject *parent)
|
||||
qSetMessagePattern(LOG_FORMAT);
|
||||
|
||||
aggregator = new AWKeysAggregator(this);
|
||||
|
||||
// backend
|
||||
graphicalItems = new ExtItemAggregator<GraphicalItem>(nullptr, QString("desktops"));
|
||||
extQuotes = new ExtItemAggregator<ExtQuotes>(nullptr, QString("quotes"));
|
||||
extScripts = new ExtItemAggregator<ExtScript>(nullptr, QString("scripts"));
|
||||
extUpgrade = new ExtItemAggregator<ExtUpgrade>(nullptr, QString("upgrade"));
|
||||
extWeather = new ExtItemAggregator<ExtWeather>(nullptr, QString("weather"));
|
||||
dataAggregator = new AWDataAggregator(this);
|
||||
connect(this, SIGNAL(needToBeUpdated()), this, SLOT(dataUpdate()));
|
||||
// transfer signal from AWDataAggregator object to QML ui
|
||||
connect(dataAggregator, SIGNAL(toolTipPainted(QString)),
|
||||
this, SIGNAL(needToolTipToBeUpdated(QString)));
|
||||
}
|
||||
|
||||
|
||||
@ -61,14 +58,14 @@ AWKeys::~AWKeys()
|
||||
{
|
||||
qCDebug(LOG_AW);
|
||||
|
||||
if (dataAggregator != nullptr) delete dataAggregator;
|
||||
if (graphicalItems != nullptr) delete graphicalItems;
|
||||
if (extQuotes != nullptr) delete extQuotes;
|
||||
if (extScripts != nullptr) delete extScripts;
|
||||
if (extUpgrade != nullptr) delete extUpgrade;
|
||||
if (extWeather != nullptr) delete extWeather;
|
||||
|
||||
delete aggregator;
|
||||
delete graphicalItems;
|
||||
delete extQuotes;
|
||||
delete extScripts;
|
||||
delete extUpgrade;
|
||||
delete extWeather;
|
||||
delete dataAggregator;
|
||||
}
|
||||
|
||||
|
||||
@ -77,16 +74,7 @@ void AWKeys::initDataAggregator(const QVariantMap tooltipParams)
|
||||
qCDebug(LOG_AW);
|
||||
qCDebug(LOG_AW) << "Tooltip parameters" << tooltipParams;
|
||||
|
||||
if (dataAggregator != nullptr) {
|
||||
disconnect(dataAggregator, SIGNAL(toolTipPainted(QString)),
|
||||
this, SIGNAL(needToolTipToBeUpdated(QString)));
|
||||
delete dataAggregator;
|
||||
}
|
||||
|
||||
dataAggregator = new AWDataAggregator(this, tooltipParams);
|
||||
// transfer signal from AWDataAggregator object to QML ui
|
||||
connect(dataAggregator, SIGNAL(toolTipPainted(QString)),
|
||||
this, SIGNAL(needToolTipToBeUpdated(QString)));
|
||||
dataAggregator->setParameters(tooltipParams);
|
||||
}
|
||||
|
||||
|
||||
@ -134,7 +122,6 @@ void AWKeys::setWrapNewLines(const bool wrap)
|
||||
QSize AWKeys::toolTipSize() const
|
||||
{
|
||||
qCDebug(LOG_AW);
|
||||
if (dataAggregator == nullptr) return QSize();
|
||||
|
||||
return dataAggregator->getTooltipSize();
|
||||
}
|
||||
@ -418,7 +405,7 @@ void AWKeys::dataUpdate()
|
||||
calculateValues();
|
||||
calculateLambdas();
|
||||
emit(needTextToBeUpdated(parsePattern()));
|
||||
if (dataAggregator != nullptr) emit(dataAggregator->updateData(values));
|
||||
emit(dataAggregator->updateData(values));
|
||||
}
|
||||
|
||||
|
||||
@ -469,6 +456,20 @@ void AWKeys::reinitKeys()
|
||||
{
|
||||
qCDebug(LOG_AW);
|
||||
|
||||
// renew extensions
|
||||
// delete them if any
|
||||
if (graphicalItems != nullptr) delete graphicalItems;
|
||||
if (extQuotes != nullptr) delete extQuotes;
|
||||
if (extScripts != nullptr) delete extScripts;
|
||||
if (extUpgrade != nullptr) delete extUpgrade;
|
||||
if (extWeather != nullptr) delete extWeather;
|
||||
// create
|
||||
graphicalItems = new ExtItemAggregator<GraphicalItem>(nullptr, QString("desktops"));
|
||||
extQuotes = new ExtItemAggregator<ExtQuotes>(nullptr, QString("quotes"));
|
||||
extScripts = new ExtItemAggregator<ExtScript>(nullptr, QString("scripts"));
|
||||
extUpgrade = new ExtItemAggregator<ExtUpgrade>(nullptr, QString("upgrade"));
|
||||
extWeather = new ExtItemAggregator<ExtWeather>(nullptr, QString("weather"));
|
||||
|
||||
// init
|
||||
QStringList allKeys = dictKeys();
|
||||
|
||||
@ -678,9 +679,18 @@ QString AWKeys::parsePattern() const
|
||||
}(key, values[key]));
|
||||
|
||||
// bars
|
||||
foreach(QString bar, foundBars)
|
||||
parsed.replace(QString("$%1").arg(bar),
|
||||
graphicalItems->itemByTag(bar)->image(valueByKey(bar).toFloat()));
|
||||
foreach(QString bar, foundBars) {
|
||||
GraphicalItem *item = graphicalItems->itemByTag(bar);
|
||||
QString key = bar;
|
||||
key.remove(QRegExp(QString("^bar[0-9]{1,}")));
|
||||
if (item->type() == GraphicalItem::Graph)
|
||||
parsed.replace(QString("$%1").arg(bar), item->image([](const QList<float> data) {
|
||||
return QVariant::fromValue<QList<float>>(data);
|
||||
}(dataAggregator->getData(key))));
|
||||
else
|
||||
parsed.replace(QString("$%1").arg(bar), item->image(values[key]));
|
||||
}
|
||||
|
||||
|
||||
// prepare strings
|
||||
parsed.replace(QString("$\\$\\"), QString("$$"));
|
||||
|
@ -82,11 +82,11 @@ private:
|
||||
AWDataAggregator *dataAggregator = nullptr;
|
||||
bool enablePopup = false;
|
||||
bool wrapNewLines = false;
|
||||
ExtItemAggregator<GraphicalItem> *graphicalItems;
|
||||
ExtItemAggregator<ExtQuotes> *extQuotes;
|
||||
ExtItemAggregator<ExtScript> *extScripts;
|
||||
ExtItemAggregator<ExtUpgrade> *extUpgrade;
|
||||
ExtItemAggregator<ExtWeather> *extWeather;
|
||||
ExtItemAggregator<GraphicalItem> *graphicalItems = nullptr;
|
||||
ExtItemAggregator<ExtQuotes> *extQuotes = nullptr;
|
||||
ExtItemAggregator<ExtScript> *extScripts = nullptr;
|
||||
ExtItemAggregator<ExtUpgrade> *extUpgrade = nullptr;
|
||||
ExtItemAggregator<ExtWeather> *extWeather = nullptr;
|
||||
bool lock = false;
|
||||
int queue = 0;
|
||||
QString pattern;
|
||||
|
Reference in New Issue
Block a user