one more optimization

The previous versions stored values as string, so any (even if they are
not used) values being converted into string, and then (if required)
being converted back to float/int/etc. I've changed the mechanism, so
they are stored as QVariant (native value).

Please note that it is possible that this rewrite may cause crash in
some cases (if I've missed smth).
This commit is contained in:
Evgenii Alekseev 2016-02-10 10:51:01 +03:00
parent d856fa8e97
commit 5c474e822b
6 changed files with 83 additions and 66 deletions

View File

@ -36,11 +36,11 @@ AWDataAggregator::AWDataAggregator(QObject *parent)
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
// required by signals
qRegisterMetaType<QHash<QString, QString>>("QHash<QString, QString>");
// qRegisterMetaType<QHash<QString, QString>>("QHash<QString, QString>");
initScene();
connect(this, SIGNAL(updateData(const QHash<QString, QString> &)), this,
SLOT(dataUpdate(const QHash<QString, QString> &)));
connect(this, SIGNAL(updateData(const QVariantHash &)), this,
SLOT(dataUpdate(const QVariantHash &)));
}
@ -168,7 +168,7 @@ QPixmap AWDataAggregator::tooltipImage()
}
void AWDataAggregator::dataUpdate(const QHash<QString, QString> &values)
void AWDataAggregator::dataUpdate(const QVariantHash &values)
{
// do not log these arguments
setData(values);
@ -254,11 +254,12 @@ QString AWDataAggregator::notificationText(const QString source,
}
void AWDataAggregator::setData(const QHash<QString, QString> &values)
void AWDataAggregator::setData(const QVariantHash &values)
{
// do not log these arguments
// battery update requires info is AC online or not
setData(values[QString("ac")] == configuration[QString("acOnline")],
setData(values[QString("ac")].toString()
== configuration[QString("acOnline")],
QString("batTooltip"), values[QString("bat")].toFloat());
// usual case
setData(QString("cpuTooltip"), values[QString("cpu")].toFloat(), 90.0);
@ -271,7 +272,7 @@ void AWDataAggregator::setData(const QHash<QString, QString> &values)
[this](const QString value) {
checkValue(QString("netdev"), currentNetworkDevice, value);
currentNetworkDevice = value;
}(values[QString("netdev")]);
}(values[QString("netdev")].toString());
// additional check for GPU load
[this](const float value) {
checkValue(QString("gpu"), value, 90.0);
@ -302,7 +303,7 @@ void AWDataAggregator::setData(const QString &source, float value,
QList<float> netValues
= data[QString("downkbTooltip")] + data[QString("upkbTooltip")];
boundaries[QString("downkbTooltip")]
= 1.2 * *std::max_element(netValues.cbegin(), netValues.cend());
= 1.2f * *std::max_element(netValues.cbegin(), netValues.cend());
boundaries[QString("upkbTooltip")]
= boundaries[QString("downkbTooltip")];
}

View File

@ -41,11 +41,11 @@ public:
QPixmap tooltipImage();
signals:
void updateData(const QHash<QString, QString> &values);
void updateData(const QVariantHash &values);
void toolTipPainted(const QString image) const;
public slots:
void dataUpdate(const QHash<QString, QString> &values);
void dataUpdate(const QVariantHash &values);
private:
// ui
@ -59,9 +59,9 @@ private:
QString notificationText(const QString source, const float value) const;
QString notificationText(const QString source, const QString value) const;
// main method
void setData(const QHash<QString, QString> &values);
void setData(const QVariantHash &values);
void setData(const QString &source, float value,
const float extremum = -1.0);
const float extremum = -1.0f);
// different signature for battery device
void setData(const bool dontInvert, const QString &source, float value);
// variables

View File

@ -167,8 +167,8 @@ QString AWKeys::valueByKey(QString key) const
{
qCDebug(LOG_AW) << "Requested value for key" << key;
return values.value(key.remove(QRegExp(QString("^bar[0-9]{1,}"))),
QString(""));
key.remove(QRegExp(QString("^bar[0-9]{1,}")));
return aggregator->formater(values[key], key);
}
@ -236,34 +236,26 @@ void AWKeys::calculateValues()
QStringList mountDevices = keyOperator->devices(QString("mount"));
for (auto device : mountDevices) {
int index = mountDevices.indexOf(device);
values[QString("hddtotmb%1").arg(index)] = QString("%1").arg(
values[QString("hddfreemb%1").arg(index)].toFloat()
+ values[QString("hddmb%1").arg(index)].toFloat(),
5, 'f', 0);
values[QString("hddtotgb%1").arg(index)] = QString("%1").arg(
values[QString("hddfreegb%1").arg(index)].toFloat()
+ values[QString("hddgb%1").arg(index)].toFloat(),
5, 'f', 1);
values[QString("hddtotmb%1").arg(index)]
= values[QString("hddfreemb%1").arg(index)].toFloat()
+ values[QString("hddmb%1").arg(index)].toFloat();
values[QString("hddtotgb%1").arg(index)]
= values[QString("hddfreegb%1").arg(index)].toFloat()
+ values[QString("hddgb%1").arg(index)].toFloat();
}
// memtot*
values[QString("memtotmb")]
= QString("%1").arg(values[QString("memusedmb")].toInt()
+ values[QString("memfreemb")].toInt(),
5);
values[QString("memtotgb")]
= QString("%1").arg(values[QString("memusedgb")].toFloat()
+ values[QString("memfreegb")].toFloat(),
5, 'f', 1);
values[QString("memtotmb")] = values[QString("memusedmb")].toInt()
+ values[QString("memfreemb")].toInt();
values[QString("memtotgb")] = values[QString("memusedgb")].toFloat()
+ values[QString("memfreegb")].toFloat();
// mem
values[QString("mem")]
= QString("%1").arg(100.0 * values[QString("memmb")].toFloat()
/ values[QString("memtotmb")].toFloat(),
5, 'f', 1);
values[QString("mem")] = 100.0f * values[QString("memmb")].toFloat()
/ values[QString("memtotmb")].toFloat();
// up, down, upkb, downkb, upunits, downunits
int netIndex = keyOperator->devices(QString("net"))
.indexOf(values[QString("netdev")]);
.indexOf(values[QString("netdev")].toString());
values[QString("down")] = values[QString("down%1").arg(netIndex)];
values[QString("downkb")] = values[QString("downkb%1").arg(netIndex)];
values[QString("downunits")] = values[QString("downunits%1").arg(netIndex)];
@ -272,28 +264,23 @@ void AWKeys::calculateValues()
values[QString("upunits")] = values[QString("upunits%1").arg(netIndex)];
// swaptot*
values[QString("swaptotmb")]
= QString("%1").arg(values[QString("swapmb")].toInt()
+ values[QString("swapfreemb")].toInt(),
5);
values[QString("swaptotgb")]
= QString("%1").arg(values[QString("swapgb")].toFloat()
+ values[QString("swapfreegb")].toFloat(),
5, 'f', 1);
values[QString("swaptotmb")] = values[QString("swapmb")].toInt()
+ values[QString("swapfreemb")].toInt();
values[QString("swaptotgb")] = values[QString("swapgb")].toFloat()
+ values[QString("swapfreegb")].toFloat();
// swap
values[QString("swap")]
= QString("%1").arg(100.0 * values[QString("swapmb")].toFloat()
/ values[QString("swaptotmb")].toFloat(),
5, 'f', 1);
values[QString("swap")] = 100.0f * values[QString("swapmb")].toFloat()
/ values[QString("swaptotmb")].toFloat();
// lambdas
for (auto key : m_foundLambdas)
values[key] = [this](QString key) {
QJSEngine engine;
// apply $this values
key.replace(QString("$this"), values[key]);
key.replace(QString("$this"), values[key].toString());
for (auto lambdaKey : m_foundKeys)
key.replace(QString("$%1").arg(lambdaKey), values[lambdaKey]);
key.replace(QString("$%1").arg(lambdaKey),
aggregator->formater(values[lambdaKey], lambdaKey));
qCInfo(LOG_AW) << "Expression" << key;
QJSValue result = engine.evaluate(key);
if (result.isError()) {
@ -315,16 +302,17 @@ QString AWKeys::parsePattern(QString pattern) const
// lambdas
for (auto key : m_foundLambdas)
pattern.replace(QString("${{%1}}").arg(key), values[key]);
pattern.replace(QString("${{%1}}").arg(key), values[key].toString());
// main keys
for (auto key : m_foundKeys)
pattern.replace(QString("$%1").arg(key),
[](QString key, QString value) {
if ((!key.startsWith(QString("custom")))
&& (!key.startsWith(QString("weather"))))
value.replace(QString(" "), QString("&nbsp;"));
return value;
pattern.replace(QString("$%1").arg(key), [this](const QString &tag,
const QVariant &value) {
QString strValue = aggregator->formater(value, tag);
if ((!tag.startsWith(QString("custom")))
&& (!tag.startsWith(QString("weather"))))
strValue.replace(QString(" "), QString("&nbsp;"));
return strValue;
}(key, values[key]));
// bars
@ -338,7 +326,8 @@ QString AWKeys::parsePattern(QString pattern) const
return QVariant::fromValue<QList<float>>(data);
}(dataAggregator->getData(key))));
else
pattern.replace(QString("$%1").arg(bar), item->image(values[key]));
pattern.replace(QString("$%1").arg(bar),
item->image(values[key].toFloat()));
}
// prepare strings
@ -368,10 +357,11 @@ void AWKeys::setDataBySource(const QString &sourceName, const QVariantMap &data)
m_mutex.lock();
// HACK workaround for time values which are stored in the different path
QVariant value = sourceName == QString("Local") ? data[QString("DateTime")]
std::for_each(tags.cbegin(), tags.cend(),
[this, &data, &sourceName](const QString &tag) {
values[tag] = sourceName == QString("Local")
? data[QString("DateTime")]
: data[QString("value")];
std::for_each(tags.cbegin(), tags.cend(), [this, value](const QString tag) {
values[tag] = aggregator->formater(value, tag);
});
m_mutex.unlock();
}

View File

@ -86,7 +86,7 @@ private:
// variables
QVariantMap m_tooltipParams;
QStringList m_foundBars, m_foundKeys, m_foundLambdas, m_requiredKeys;
QHash<QString, QString> values;
QVariantHash values;
bool m_optimize = false;
bool m_wrapNewLines = false;
// multithread features

View File

@ -30,6 +30,23 @@ AWKeysAggregator::AWKeysAggregator(QObject *parent)
: QObject(parent)
{
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
// default formaters
// memory
m_formater[QString("mem")] = Float;
m_formater[QString("memtotmb")] = IntegerFive;
m_formater[QString("memtotgb")] = Float;
// network
m_formater[QString("down")] = NetSmartFormat;
m_formater[QString("downkb")] = Integer;
m_formater[QString("downunits")] = NetSmartUnits;
m_formater[QString("up")] = NetSmartFormat;
m_formater[QString("upkb")] = Integer;
m_formater[QString("upunits")] = NetSmartUnits;
// swap
m_formater[QString("swap")] = Float;
m_formater[QString("swaptotmb")] = IntegerFive;
m_formater[QString("swaptotgb")] = Float;
}
@ -57,6 +74,9 @@ QString AWKeysAggregator::formater(const QVariant &data,
case Integer:
output = QString("%1").arg(data.toFloat(), 4, 'f', 0);
break;
case IntegerFive:
output = QString("%1").arg(data.toFloat(), 5, 'f', 0);
break;
case IntegerThree:
output = QString("%1").arg(data.toFloat(), 3, 'f', 0);
break;
@ -137,9 +157,11 @@ QString AWKeysAggregator::formater(const QVariant &data,
static_cast<int>(data.toFloat()));
break;
case NoFormat:
default:
output = data.toString();
break;
default:
output = QString();
break;
}
return output;
@ -315,6 +337,9 @@ QStringList AWKeysAggregator::registerSource(const QString &source,
QString key = QString("hdd%1").arg(index);
m_map[source] = key;
m_formater[key] = Float;
// additional keys
m_formater[QString("hddtotmb%1").arg(index)] = IntegerFive;
m_formater[QString("hddtotgb%1").arg(index)] = Float;
}
} else if (source.contains(mountFreeRegExp)) {
// free space

View File

@ -42,6 +42,7 @@ class AWKeysAggregator : public QObject
Float,
FloatTwoSymbols,
Integer,
IntegerFive,
IntegerThree,
List,
// unit specific formaters
@ -78,7 +79,7 @@ public:
public slots:
QStringList registerSource(const QString &source, const QString &units,
const QStringList &keys = QStringList());
const QStringList &keys);
private:
float temperature(const float temp) const;