mirror of
				https://github.com/arcan1s/awesome-widgets.git
				synced 2025-10-31 13:13:41 +00:00 
			
		
		
		
	* add preview function
* more comments inside * variables renaming * unite several lists to one hash * add build_future definition checking to source code
This commit is contained in:
		| @ -17,6 +17,7 @@ | ||||
|  | ||||
| import QtQuick 2.0 | ||||
| import QtQuick.Controls 1.3 as QtControls | ||||
| import QtQuick.Dialogs 1.2 as QtDialogs | ||||
| import org.kde.plasma.core 2.0 as PlasmaCore | ||||
|  | ||||
| import org.kde.plasma.private.awesomewidget 1.0 | ||||
| @ -42,6 +43,7 @@ Item { | ||||
|     property alias cfg_text: textPattern.text | ||||
|  | ||||
|     signal dropSource(string sourceName) | ||||
|     signal needTextUpdate(string newText) | ||||
|  | ||||
|  | ||||
|     Column { | ||||
| @ -197,7 +199,7 @@ Item { | ||||
|             height: implicitHeight | ||||
|             width: parent.width | ||||
|             QtControls.ComboBox { | ||||
|                 width: (parent.width - addTagButton.width - showValueButton.width - addLambdaButton.width) / 2 | ||||
|                 width: parent.width * 1 / 5 | ||||
|                 textRole: "label" | ||||
|                 model: [ | ||||
|                     { | ||||
| @ -262,10 +264,10 @@ Item { | ||||
|             } | ||||
|             QtControls.ComboBox { | ||||
|                 id: tags | ||||
|                 width: (parent.width - addTagButton.width - showValueButton.width - addLambdaButton.width) / 2 | ||||
|                 width: parent.width * 1 / 5 | ||||
|             } | ||||
|             QtControls.Button { | ||||
|                 id: addTagButton | ||||
|                 width: parent.width * 1 / 5 | ||||
|                 text: i18n("Add") | ||||
|  | ||||
|                 onClicked: { | ||||
| @ -278,7 +280,7 @@ Item { | ||||
|                 } | ||||
|             } | ||||
|             QtControls.Button { | ||||
|                 id: showValueButton | ||||
|                 width: parent.width * 1 / 5 | ||||
|                 text: i18n("Show value") | ||||
|  | ||||
|                 onClicked: { | ||||
| @ -293,7 +295,7 @@ Item { | ||||
|                 } | ||||
|             } | ||||
|             QtControls.Button { | ||||
|                 id: addLambdaButton | ||||
|                 width: parent.width * 1 / 5 | ||||
|                 text: i18n("Add lambda") | ||||
|  | ||||
|                 onClicked: { | ||||
| @ -310,10 +312,18 @@ Item { | ||||
|             height: implicitHeight | ||||
|             width: parent.width | ||||
|             QtControls.Button { | ||||
|                 width: parent.width | ||||
|                 width: parent.width * 3 / 5 | ||||
|                 text: i18n("Edit bars") | ||||
|                 onClicked: awKeys.editItem("graphicalitem") | ||||
|             } | ||||
|             QtControls.Button { | ||||
|                 width: parent.width * 2 / 5 | ||||
|                 text: i18n("Preview") | ||||
|                 onClicked: { | ||||
|                     awKeys.initKeys(textPattern.text) | ||||
|                     awKeys.needToBeUpdated() | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         QtControls.TextArea { | ||||
| @ -325,6 +335,12 @@ Item { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     QtDialogs.MessageDialog { | ||||
|         id: compiledText | ||||
|         modality: Qt.NonModal | ||||
|         title: i18n("Preview") | ||||
|     } | ||||
|  | ||||
|     // we need to initializate DataEngines here too | ||||
|     // because we need to get keys and values | ||||
|     PlasmaCore.DataSource { | ||||
| @ -346,6 +362,8 @@ Item { | ||||
|         interval: 5000 | ||||
|  | ||||
|         onNewData: { | ||||
|             // even after a disconnect it is possible that we'll receive an update | ||||
|             if (sourceName == "update") return | ||||
|             if (debug) console.debug("Update source", sourceName) | ||||
|             awKeys.dataUpdateReceived(sourceName, data) | ||||
|         } | ||||
| @ -369,6 +387,7 @@ Item { | ||||
|         // drop "update" source which does not required by this page | ||||
|         extsysmonDE.disconnectSource("update") | ||||
|         awKeys.dropSourceFromDataengine.connect(dropSource) | ||||
|         awKeys.needTextToBeUpdated.connect(needTextUpdate) | ||||
|         // init submodule | ||||
|         awKeys.initKeys(plasmoid.configuration.text) | ||||
|         awKeys.setAggregatorProperty("acOffline", plasmoid.configuration.acOffline) | ||||
| @ -385,4 +404,11 @@ Item { | ||||
|  | ||||
|         systemmonitorDE.disconnectSource(sourceName) | ||||
|     } | ||||
|  | ||||
|     onNeedTextUpdate: { | ||||
|         if (debug) console.debug() | ||||
|  | ||||
|         compiledText.text = newText.replace(/ /g, " ") | ||||
|         compiledText.open() | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -55,7 +55,10 @@ AWActions::~AWActions() | ||||
| void AWActions::checkUpdates(const bool showAnyway) | ||||
| { | ||||
|     qCDebug(LOG_AW); | ||||
|     qCDebug(LOG_AW) << "Show anyway" << showAnyway; | ||||
|  | ||||
|     // showAnyway options requires to show message if no updates found on direct | ||||
|     // request. In case of automatic check no message will be shown | ||||
|     QNetworkAccessManager *manager = new QNetworkAccessManager(this); | ||||
|     connect(manager, &QNetworkAccessManager::finished, | ||||
|             [showAnyway, this](QNetworkReply *reply) { | ||||
| @ -77,6 +80,7 @@ bool AWActions::dropCache() const | ||||
| } | ||||
|  | ||||
|  | ||||
| // HACK: since QML could not use QLoggingCategory I need this hack | ||||
| bool AWActions::isDebugEnabled() const | ||||
| { | ||||
|     qCDebug(LOG_AW); | ||||
| @ -85,18 +89,18 @@ bool AWActions::isDebugEnabled() const | ||||
| } | ||||
|  | ||||
|  | ||||
| void AWActions::runCmd(const QString cmd) const | ||||
| bool AWActions::runCmd(const QString cmd) const | ||||
| { | ||||
|     qCDebug(LOG_AW); | ||||
|     qCDebug(LOG_AW) << "Cmd" << cmd; | ||||
|  | ||||
|     QProcess command; | ||||
|     sendNotification(QString("Info"), i18n("Run %1", cmd)); | ||||
|  | ||||
|     command.startDetached(cmd); | ||||
|     return QProcess::startDetached(cmd); | ||||
| } | ||||
|  | ||||
|  | ||||
| // HACK: this method uses variable from version.h | ||||
| void AWActions::showReadme() const | ||||
| { | ||||
|     qCDebug(LOG_AW); | ||||
| @ -105,6 +109,7 @@ void AWActions::showReadme() const | ||||
| } | ||||
|  | ||||
|  | ||||
| // HACK: this method uses variables from version.h | ||||
| QString AWActions::getAboutText(const QString type) const | ||||
| { | ||||
|     qCDebug(LOG_AW); | ||||
| @ -184,6 +189,8 @@ QVariantMap AWActions::readDataEngineConfiguration() const | ||||
|     configuration[QString("PLAYERSYMBOLS")] = settings.value(QString("PLAYERSYMBOLS"), QString("10")); | ||||
|     settings.endGroup(); | ||||
|  | ||||
|     qCInfo(LOG_AW) << "Configuration" << configuration; | ||||
|  | ||||
|     return configuration; | ||||
| } | ||||
|  | ||||
| @ -212,6 +219,7 @@ void AWActions::writeDataEngineConfiguration(const QVariantMap configuration) co | ||||
| } | ||||
|  | ||||
|  | ||||
| // to avoid additional object definition this method is static | ||||
| void AWActions::sendNotification(const QString eventId, const QString message) | ||||
| { | ||||
|     qCDebug(LOG_AW); | ||||
| @ -259,6 +267,7 @@ void AWActions::versionReplyRecieved(QNetworkReply *reply, const bool showAnyway | ||||
|     qCDebug(LOG_AW); | ||||
|     qCDebug(LOG_AW) << "Return code" << reply->error(); | ||||
|     qCDebug(LOG_AW) << "Reply error message" << reply->errorString(); | ||||
|     qCDebug(LOG_AW) << "Show anyway" << showAnyway; | ||||
|  | ||||
|     QJsonParseError error; | ||||
|     QJsonDocument jsonDoc = QJsonDocument::fromJson(reply->readAll(), &error); | ||||
| @ -275,6 +284,7 @@ void AWActions::versionReplyRecieved(QNetworkReply *reply, const bool showAnyway | ||||
|     version.remove(QString("V.")); | ||||
|     qCInfo(LOG_AW) << "Found version" << version; | ||||
|  | ||||
|     // 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(); | ||||
|  | ||||
| @ -36,7 +36,7 @@ public: | ||||
|     Q_INVOKABLE void checkUpdates(const bool showAnyway = false); | ||||
|     Q_INVOKABLE bool dropCache() const; | ||||
|     Q_INVOKABLE bool isDebugEnabled() const; | ||||
|     Q_INVOKABLE void runCmd(const QString cmd = QString("/usr/bin/true")) const; | ||||
|     Q_INVOKABLE bool runCmd(const QString cmd = QString("/usr/bin/true")) const; | ||||
|     Q_INVOKABLE void showReadme() const; | ||||
|     // configuration slots | ||||
|     Q_INVOKABLE QString getAboutText(const QString type = QString("header")) const; | ||||
| @ -52,8 +52,6 @@ private slots: | ||||
|     void showInfo(const QString version) const; | ||||
|     void showUpdates(const QString version) const; | ||||
|     void versionReplyRecieved(QNetworkReply *reply, const bool showAnyway) const; | ||||
|  | ||||
| private: | ||||
| }; | ||||
|  | ||||
|  | ||||
|  | ||||
| @ -34,8 +34,8 @@ AWDataAggregator::AWDataAggregator(QObject *parent) | ||||
|  | ||||
|     initScene(); | ||||
|  | ||||
|     connect(this, SIGNAL(updateData(QHash<QString, QString>)), | ||||
|             this, SLOT(dataUpdate(QHash<QString, QString>))); | ||||
|     connect(this, SIGNAL(const updateData(QHash<QString, QString>)), | ||||
|             this, SLOT(const dataUpdate(QHash<QString, QString>))); | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -56,14 +56,6 @@ QList<float> AWDataAggregator::getData(const QString key) const | ||||
| } | ||||
|  | ||||
|  | ||||
| QSize AWDataAggregator::getTooltipSize() const | ||||
| { | ||||
|     qCDebug(LOG_AW); | ||||
|  | ||||
|     return size; | ||||
| } | ||||
|  | ||||
|  | ||||
| QString AWDataAggregator::htmlImage(const QPixmap source) const | ||||
| { | ||||
|     qCDebug(LOG_AW); | ||||
| @ -82,9 +74,10 @@ void AWDataAggregator::setParameters(QVariantMap settings) | ||||
|     qCDebug(LOG_AW); | ||||
|     qCDebug(LOG_AW) << "Settings" << settings; | ||||
|  | ||||
|     // cast from QVariantMap to QVariantHash without data lost | ||||
|     configuration = qvariant_cast<QVariantHash>(settings); | ||||
|  | ||||
|     enablePopup = configuration[QString("notify")].toBool(); | ||||
|     m_enablePopup = configuration[QString("notify")].toBool(); | ||||
|  | ||||
|     counts += configuration[QString("cpuTooltip")].toInt(); | ||||
|     counts += configuration[QString("cpuclTooltip")].toInt(); | ||||
| @ -92,6 +85,8 @@ void AWDataAggregator::setParameters(QVariantMap settings) | ||||
|     counts += configuration[QString("swapTooltip")].toInt(); | ||||
|     counts += configuration[QString("downTooltip")].toInt(); | ||||
|     counts += configuration[QString("batTooltip")].toInt(); | ||||
|     // resize tooltip image | ||||
|     toolTipView->resize(100.0 * counts, 105.0); | ||||
|  | ||||
|     boundaries[QString("cpuTooltip")] = 100.0; | ||||
|     boundaries[QString("cpuclTooltip")] = 4000.0; | ||||
| @ -100,8 +95,6 @@ void AWDataAggregator::setParameters(QVariantMap settings) | ||||
|     boundaries[QString("downTooltip")] = 1.0; | ||||
|     boundaries[QString("upTooltip")] = 1.0; | ||||
|     boundaries[QString("batTooltip")] = 100.0; | ||||
|     size.setHeight(105.0); | ||||
|     size.setWidth(100.0 * counts); | ||||
|  | ||||
|     if (configuration[QString("cpuTooltip")].toBool()) requiredKeys.append(QString("cpuTooltip")); | ||||
|     if (configuration[QString("cpuclTooltip")].toBool()) requiredKeys.append(QString("cpuclTooltip")); | ||||
| @ -122,10 +115,9 @@ QPixmap AWDataAggregator::tooltipImage() | ||||
| { | ||||
|     qCDebug(LOG_AW); | ||||
|  | ||||
|     toolTipView->resize(size); | ||||
|     // create image | ||||
|     toolTipScene->clear(); | ||||
|     QPen pen = QPen(); | ||||
|     QPen pen; | ||||
|     bool down = false; | ||||
|     foreach(QString key, requiredKeys) { | ||||
|         // create frame | ||||
| @ -158,7 +150,7 @@ QPixmap AWDataAggregator::tooltipImage() | ||||
| } | ||||
|  | ||||
|  | ||||
| void AWDataAggregator::dataUpdate(QHash<QString, QString> values) | ||||
| void AWDataAggregator::dataUpdate(const QHash<QString, QString> values) | ||||
| { | ||||
|     qCDebug(LOG_AW); | ||||
|  | ||||
| @ -187,7 +179,8 @@ void AWDataAggregator::dataUpdate(QHash<QString, QString> 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); | ||||
|     qCDebug(LOG_AW) << "Notification source" << source; | ||||
| @ -195,23 +188,24 @@ void AWDataAggregator::checkValue(const QString source, const float value, const | ||||
|     qCDebug(LOG_AW) << "Called with extremum" << extremum; | ||||
|  | ||||
|     if (value >= 0.0) { | ||||
|         if ((enablePopup) && (value > extremum) && (data[source].last() < extremum)) | ||||
|         if ((m_enablePopup) && (value > extremum) && (data[source].last() < extremum)) | ||||
|             return AWActions::sendNotification(QString("event"), notificationText(source, value)); | ||||
|     } else { | ||||
|         if ((enablePopup) && (value < extremum) && (data[source].last() > extremum)) | ||||
|         if ((m_enablePopup) && (value < extremum) && (data[source].last() > extremum)) | ||||
|             return AWActions::sendNotification(QString("event"), notificationText(source, 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); | ||||
|     qCDebug(LOG_AW) << "Notification source" << source; | ||||
|     qCDebug(LOG_AW) << "Current value" << current; | ||||
|     qCDebug(LOG_AW) << "Received value" << received; | ||||
|  | ||||
|     if ((enablePopup) && (current != received)) | ||||
|     if ((m_enablePopup) && (current != received)) | ||||
|         return AWActions::sendNotification(QString("event"), notificationText(source, received)); | ||||
| } | ||||
|  | ||||
| @ -238,10 +232,7 @@ QString AWDataAggregator::notificationText(const QString source, const float val | ||||
|  | ||||
|     QString output; | ||||
|     if (source == QString("batTooltip")) { | ||||
|         if (value > 0.0) | ||||
|             output = i18n("AC online"); | ||||
|         else | ||||
|             output = i18n("AC offline"); | ||||
|         output = value > 0.0 ? i18n("AC online") : i18n("AC offline"); | ||||
|     } else if (source == QString("cpuTooltip")) { | ||||
|         output = i18n("High CPU load"); | ||||
|     } else if (source == QString("memTooltip")) { | ||||
|  | ||||
| @ -35,17 +35,16 @@ public: | ||||
|     explicit AWDataAggregator(QObject *parent = nullptr); | ||||
|     virtual ~AWDataAggregator(); | ||||
|     QList<float> getData(const QString key) const; | ||||
|     QSize getTooltipSize() const; | ||||
|     QString htmlImage(const QPixmap source) const; | ||||
|     void setParameters(QVariantMap settings); | ||||
|     QPixmap tooltipImage(); | ||||
|  | ||||
| signals: | ||||
|     void updateData(QHash<QString, QString> values); | ||||
|     void toolTipPainted(QString image); | ||||
|     void updateData(const QHash<QString, QString> values); | ||||
|     void toolTipPainted(const QString image) const; | ||||
|  | ||||
| private slots: | ||||
|     void dataUpdate(QHash<QString, QString> values); | ||||
|     void dataUpdate(const QHash<QString, QString> values); | ||||
|  | ||||
| private: | ||||
|     // ui | ||||
| @ -66,9 +65,8 @@ private: | ||||
|     QString currentNetworkDevice = QString("lo"); | ||||
|     QHash<QString, float> boundaries; | ||||
|     QHash<QString, QList<float>> data; | ||||
|     bool enablePopup = false; | ||||
|     bool m_enablePopup = false; | ||||
|     QStringList requiredKeys; | ||||
|     QSize size; | ||||
| }; | ||||
|  | ||||
|  | ||||
|  | ||||
| @ -49,8 +49,8 @@ AWKeys::AWKeys(QObject *parent) | ||||
|     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))); | ||||
|     connect(dataAggregator, SIGNAL(toolTipPainted(const QString)), | ||||
|             this, SIGNAL(needToolTipToBeUpdated(const QString))); | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -84,10 +84,10 @@ void AWKeys::initKeys(const QString currentPattern) | ||||
|     qCDebug(LOG_AW) << "Pattern" << currentPattern; | ||||
|  | ||||
|     // init | ||||
|     pattern = currentPattern; | ||||
|     m_pattern = currentPattern; | ||||
|     // update network and hdd list | ||||
|     addKeyToCache(QString("Hdd")); | ||||
|     addKeyToCache(QString("Network")); | ||||
|     addKeyToCache(QString("hdd")); | ||||
|     addKeyToCache(QString("net")); | ||||
|     loadKeysFromCache(); | ||||
| } | ||||
|  | ||||
| @ -100,30 +100,12 @@ void AWKeys::setAggregatorProperty(const QString key, const QVariant value) | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| void AWKeys::setPopupEnabled(const bool popup) | ||||
| { | ||||
|     qCDebug(LOG_AW); | ||||
|     qCDebug(LOG_AW) << "Is popup enabled" << popup; | ||||
|  | ||||
|     enablePopup = popup; | ||||
| } | ||||
|  | ||||
|  | ||||
| void AWKeys::setWrapNewLines(const bool wrap) | ||||
| { | ||||
|     qCDebug(LOG_AW); | ||||
|     qCDebug(LOG_AW) << "Is wrapping enabled" << wrap; | ||||
|  | ||||
|     wrapNewLines = wrap; | ||||
| } | ||||
|  | ||||
|  | ||||
| QSize AWKeys::toolTipSize() const | ||||
| { | ||||
|     qCDebug(LOG_AW); | ||||
|  | ||||
|     return dataAggregator->getTooltipSize(); | ||||
|     m_wrapNewLines = wrap; | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -138,13 +120,13 @@ void AWKeys::addDevice(const QString source) | ||||
|     if (source.contains(diskRegexp)) { | ||||
|         QString device = source; | ||||
|         device.remove(QString("/Rate/rblk")); | ||||
|         addKeyToCache(QString("Disk"), device); | ||||
|         addKeyToCache(QString("disk"), device); | ||||
|     } else if (source.contains(mountRegexp)) { | ||||
|         QString device = source; | ||||
|         device.remove(QString("partitions")).remove(QString("/filllevel")); | ||||
|         addKeyToCache(QString("Mount"), device); | ||||
|         addKeyToCache(QString("mount"), device); | ||||
|     } else if (source.startsWith(QString("lmsensors"))) { | ||||
|         addKeyToCache(QString("Temp"), source); | ||||
|         addKeyToCache(QString("temp"), source); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -182,7 +164,7 @@ QStringList AWKeys::dictKeys(const bool sorted, const QString regexp) const | ||||
|     allKeys.append(QString("cpucl")); | ||||
|     allKeys.append(QString("cpu")); | ||||
|     // temperature | ||||
|     for (int i=tempDevices.count()-1; i>=0; i--) | ||||
|     for (int i=m_devices[QString("temp")].count()-1; i>=0; i--) | ||||
|         allKeys.append(QString("temp%1").arg(i)); | ||||
|     // gputemp | ||||
|     allKeys.append(QString("gputemp")); | ||||
| @ -207,7 +189,7 @@ QStringList AWKeys::dictKeys(const bool sorted, const QString regexp) const | ||||
|     allKeys.append(QString("swaptotgb")); | ||||
|     allKeys.append(QString("swap")); | ||||
|     // hdd | ||||
|     for (int i=mountDevices.count()-1; i>=0; i--) { | ||||
|     for (int i=m_devices[QString("mount")].count()-1; i>=0; i--) { | ||||
|         allKeys.append(QString("hddmb%1").arg(i)); | ||||
|         allKeys.append(QString("hddgb%1").arg(i)); | ||||
|         allKeys.append(QString("hddfreemb%1").arg(i)); | ||||
| @ -217,15 +199,15 @@ QStringList AWKeys::dictKeys(const bool sorted, const QString regexp) const | ||||
|         allKeys.append(QString("hdd%1").arg(i)); | ||||
|     } | ||||
|     // hdd speed | ||||
|     for (int i=diskDevices.count()-1; i>=0; i--) { | ||||
|     for (int i=m_devices[QString("disk")].count()-1; i>=0; i--) { | ||||
|         allKeys.append(QString("hddr%1").arg(i)); | ||||
|         allKeys.append(QString("hddw%1").arg(i)); | ||||
|     } | ||||
|     // hdd temp | ||||
|     for (int i=hddDevices.count()-1; i>=0; i--) | ||||
|     for (int i=m_devices[QString("hdd")].count()-1; i>=0; i--) | ||||
|         allKeys.append(QString("hddtemp%1").arg(i)); | ||||
|     // network | ||||
|     for (int i=networkDevices.count()-1; i>=0; i--) { | ||||
|     for (int i=m_devices[QString("net")].count()-1; i>=0; i--) { | ||||
|         allKeys.append(QString("downunits%1").arg(i)); | ||||
|         allKeys.append(QString("upunits%1").arg(i)); | ||||
|         allKeys.append(QString("downkb%1").arg(i)); | ||||
| @ -310,8 +292,8 @@ QStringList AWKeys::getHddDevices() const | ||||
| { | ||||
|     qCDebug(LOG_AW); | ||||
|  | ||||
|     QStringList devices = hddDevices; | ||||
|     // required by ui interface | ||||
|     QStringList devices = m_devices[QString("hdd")]; | ||||
|     // required by selector in the UI | ||||
|     devices.insert(0, QString("disable")); | ||||
|     devices.insert(0, QString("auto")); | ||||
|  | ||||
| @ -325,11 +307,14 @@ void AWKeys::dataUpdateReceived(const QString sourceName, const QVariantMap data | ||||
|     qCDebug(LOG_AW) << "Source" << sourceName; | ||||
|     qCDebug(LOG_AW) << "Data" << data; | ||||
|  | ||||
|     if (sourceName == QString("update")) return emit(needToBeUpdated()); | ||||
|  | ||||
|     // run concurrent data update | ||||
| #ifdef BUILD_FUTURE | ||||
|     QtConcurrent::run([this, sourceName, data]() { | ||||
|         return setDataBySource(sourceName, data); | ||||
|     }); | ||||
| #else /* BUILD_FUTURE */ | ||||
|     return setDataBySource(sourceName, data); | ||||
| #endif /* BUILD_FUTURE */ | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -340,35 +325,29 @@ QString AWKeys::infoByKey(QString key) const | ||||
|  | ||||
|     key.remove(QRegExp(QString("^bar[0-9]{1,}"))); | ||||
|     if (key.startsWith(QString("custom"))) | ||||
|         foreach(ExtScript *item, extScripts->items()) { | ||||
|             if (item->tag(QString("custom")) != key) continue; | ||||
|             return item->executable(); | ||||
|         } | ||||
|         return extScripts->itemByTagNumber(key.remove(QString("custom")).toInt())->uniq(); | ||||
|     else if (key.contains(QRegExp(QString("^hdd[rw]")))) | ||||
|         return QString("%1").arg(diskDevices[key.remove(QRegExp(QString("hdd[rw]"))).toInt()]); | ||||
|         return QString("%1").arg(m_devices[QString("disk")][key.remove(QRegExp(QString("hdd[rw]"))).toInt()]); | ||||
|     else if (key.contains(QRegExp(QString("^hdd([0-9]|mb|gb|freemb|freegb|totmb|totgb)")))) | ||||
|         return QString("%1").arg(mountDevices[key.remove(QRegExp(QString("^hdd([0-9]|mb|gb|freemb|freegb|totmb|totgb)"))).toInt()]); | ||||
|         return QString("%1").arg(m_devices[QString("mount")][key.remove(QRegExp(QString("^hdd([0-9]|mb|gb|freemb|freegb|totmb|totgb)"))).toInt()]); | ||||
|     else if (key.startsWith(QString("hddtemp"))) | ||||
|         return QString("%1").arg(hddDevices[key.remove(QString("hddtemp")).toInt()]); | ||||
|         return QString("%1").arg(m_devices[QString("hdd")][key.remove(QString("hddtemp")).toInt()]); | ||||
|     else if (key.contains(QRegExp(QString("^(down|up)[0-9]")))) | ||||
|         return QString("%1").arg(networkDevices[key.remove(QRegExp(QString("^(down|up)"))).toInt()]); | ||||
|         return QString("%1").arg(m_devices[QString("net")][key.remove(QRegExp(QString("^(down|up)"))).toInt()]); | ||||
|     else if (key.startsWith(QString("pkgcount"))) | ||||
|         foreach(ExtUpgrade *item, extUpgrade->items()) { | ||||
|             if (item->tag(QString("pkgcount")) != key) continue; | ||||
|             return item->executable(); | ||||
|         } | ||||
|         return extUpgrade->itemByTagNumber(key.remove(QString("pkgcount")).toInt())->uniq(); | ||||
|     else if (key.contains(QRegExp(QString("(^|perc)(ask|bid|price)(chg|)")))) | ||||
|         foreach(ExtQuotes *item, extQuotes->items()) { | ||||
|             if (item->number() != key.remove(QRegExp(QString("(^|perc)(ask|bid|price)(chg|)"))).toInt()) continue; | ||||
|             return item->ticker(); | ||||
|         } | ||||
|         return extQuotes->itemByTagNumber(key.remove(QRegExp(QString("(^|perc)(ask|bid|price)(chg|)"))).toInt())->uniq(); | ||||
|     else if (key.contains(QRegExp(QString("(weather|weatherId|humidity|pressure|temperature)")))) | ||||
|         return extWeather->itemByTagNumber(key.remove(QRegExp(QString("(weather|weatherId|humidity|pressure|temperature)"))).toInt())->uniq(); | ||||
|     else if (key.startsWith(QString("temp"))) | ||||
|         return QString("%1").arg(tempDevices[key.remove(QString("temp")).toInt()]); | ||||
|         return QString("%1").arg(m_devices[QString("temp")][key.remove(QString("temp")).toInt()]); | ||||
|  | ||||
|     return QString("(none)"); | ||||
| } | ||||
|  | ||||
|  | ||||
| // HACK this method requires to define tag value from bar from UI interface | ||||
| QString AWKeys::valueByKey(QString key) const | ||||
| { | ||||
|     qCDebug(LOG_AW); | ||||
| @ -403,8 +382,7 @@ void AWKeys::dataUpdate() | ||||
|     qCDebug(LOG_AW); | ||||
|  | ||||
|     calculateValues(); | ||||
|     calculateLambdas(); | ||||
|     emit(needTextToBeUpdated(parsePattern())); | ||||
|     emit(needTextToBeUpdated(parsePattern(m_pattern))); | ||||
|     emit(dataAggregator->updateData(values)); | ||||
| } | ||||
|  | ||||
| @ -418,35 +396,13 @@ void AWKeys::loadKeysFromCache() | ||||
|     qCInfo(LOG_AW) << "Cache file" << fileName; | ||||
|     QSettings cache(fileName, QSettings::IniFormat); | ||||
|  | ||||
|     cache.beginGroup(QString("Disk")); | ||||
|     diskDevices.clear(); | ||||
|     foreach(QString key, cache.allKeys()) | ||||
|         diskDevices.append(cache.value(key).toString()); | ||||
|     cache.endGroup(); | ||||
|  | ||||
|     cache.beginGroup(QString("Hdd")); | ||||
|     hddDevices.clear(); | ||||
|     foreach(QString key, cache.allKeys()) | ||||
|         hddDevices.append(cache.value(key).toString()); | ||||
|     cache.endGroup(); | ||||
|  | ||||
|     cache.beginGroup(QString("Mount")); | ||||
|     mountDevices.clear(); | ||||
|     foreach(QString key, cache.allKeys()) | ||||
|         mountDevices.append(cache.value(key).toString()); | ||||
|     cache.endGroup(); | ||||
|  | ||||
|     cache.beginGroup(QString("Network")); | ||||
|     networkDevices.clear(); | ||||
|     foreach(QString key, cache.allKeys()) | ||||
|         networkDevices.append(cache.value(key).toString()); | ||||
|     cache.endGroup(); | ||||
|  | ||||
|     cache.beginGroup(QString("Temp")); | ||||
|     tempDevices.clear(); | ||||
|     foreach(QString key, cache.allKeys()) | ||||
|         tempDevices.append(cache.value(key).toString()); | ||||
|     cache.endGroup(); | ||||
|     foreach(QString group, cache.childGroups()) { | ||||
|         cache.beginGroup(group); | ||||
|         m_devices.remove(group); | ||||
|         foreach(QString key, cache.allKeys()) | ||||
|             m_devices[group].append(cache.value(key).toString()); | ||||
|         cache.endGroup(); | ||||
|     } | ||||
|  | ||||
|     return reinitKeys(); | ||||
| } | ||||
| @ -474,7 +430,7 @@ void AWKeys::reinitKeys() | ||||
|     QStringList allKeys = dictKeys(); | ||||
|  | ||||
|     // not documented feature - place all available tags | ||||
|     pattern = pattern.replace(QString("$ALL"), [allKeys](){ | ||||
|     m_pattern = m_pattern.replace(QString("$ALL"), [allKeys](){ | ||||
|         QStringList strings; | ||||
|         foreach(QString tag, allKeys) | ||||
|             strings.append(QString("%1: $%1").arg(tag)); | ||||
| @ -483,7 +439,7 @@ void AWKeys::reinitKeys() | ||||
|  | ||||
|     // append lists | ||||
|     // bars | ||||
|     foundBars = [allKeys](QString pattern) { | ||||
|     m_foundBars = [allKeys](QString pattern) { | ||||
|         QStringList selectedKeys; | ||||
|         foreach(QString key, allKeys) | ||||
|             if ((key.startsWith(QString("bar"))) && | ||||
| @ -493,10 +449,10 @@ void AWKeys::reinitKeys() | ||||
|             } | ||||
|         if (selectedKeys.isEmpty()) qCWarning(LOG_AW) << "No bars found"; | ||||
|         return selectedKeys; | ||||
|     }(pattern); | ||||
|     }(m_pattern); | ||||
|  | ||||
|     // main key list | ||||
|     foundKeys = [allKeys](QString pattern) { | ||||
|     m_foundKeys = [allKeys](QString pattern) { | ||||
|         QStringList selectedKeys; | ||||
|         foreach(QString key, allKeys) | ||||
|             if ((!key.startsWith(QString("bar"))) && | ||||
| @ -506,10 +462,10 @@ void AWKeys::reinitKeys() | ||||
|             } | ||||
|         if (selectedKeys.isEmpty()) qCWarning(LOG_AW) << "No keys found"; | ||||
|         return selectedKeys; | ||||
|     }(pattern); | ||||
|     }(m_pattern); | ||||
|  | ||||
|     // lambdas | ||||
|     foundLambdas = [](QString pattern) { | ||||
|     m_foundLambdas = [](QString pattern) { | ||||
|         QStringList selectedKeys; | ||||
|         // substring inside ${{ }} (with brackets) which should not contain ${{ | ||||
|         QRegularExpression lambdaRegexp(QString("\\$\\{\\{((?!\\$\\{\\{).)*?\\}\\}")); | ||||
| @ -528,18 +484,10 @@ void AWKeys::reinitKeys() | ||||
|         } | ||||
|         if (selectedKeys.isEmpty()) qCWarning(LOG_AW) << "No lambdas found"; | ||||
|         return selectedKeys; | ||||
|     }(pattern); | ||||
|     }(m_pattern); | ||||
|  | ||||
|     // set key data to aggregator | ||||
|     aggregator->setDevices([this]() { | ||||
|         QHash<QString, QStringList> deviceList; | ||||
|         deviceList[QString("disk")] = diskDevices; | ||||
|         deviceList[QString("hdd")] = hddDevices; | ||||
|         deviceList[QString("mount")] = mountDevices; | ||||
|         deviceList[QString("net")] = networkDevices; | ||||
|         deviceList[QString("temp")] = tempDevices; | ||||
|         return deviceList; | ||||
|     }()); | ||||
|     aggregator->setDevices(m_devices); | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -558,7 +506,7 @@ void AWKeys::addKeyToCache(const QString type, const QString key) | ||||
|     foreach(QString key, cache.allKeys()) | ||||
|         cachedValues.append(cache.value(key).toString()); | ||||
|  | ||||
|     if (type == QString("Hdd")) { | ||||
|     if (type == QString("hdd")) { | ||||
|         QStringList allDevices = QDir(QString("/dev")).entryList(QDir::System, QDir::Name); | ||||
|         QStringList devices = allDevices.filter(QRegExp(QString("^[hms]d[a-z]$"))); | ||||
|         foreach(QString dev, devices) { | ||||
| @ -567,7 +515,7 @@ void AWKeys::addKeyToCache(const QString type, const QString key) | ||||
|             qCInfo(LOG_AW) << "Found new key" << device << "for type" << type; | ||||
|             cache.setValue(QString("%1").arg(cache.allKeys().count(), 3, 10, QChar('0')), device); | ||||
|         } | ||||
|     } else if (type == QString("Network")) { | ||||
|     } else if (type == QString("net")) { | ||||
|         QList<QNetworkInterface> rawInterfaceList = QNetworkInterface::allInterfaces(); | ||||
|         foreach(QNetworkInterface interface, rawInterfaceList) { | ||||
|             QString device = interface.name(); | ||||
| @ -587,29 +535,6 @@ void AWKeys::addKeyToCache(const QString type, const QString key) | ||||
| } | ||||
|  | ||||
|  | ||||
| void AWKeys::calculateLambdas() | ||||
| { | ||||
|     qCDebug(LOG_AW); | ||||
|  | ||||
|     foreach(QString key, foundLambdas) | ||||
|         values[key] = [this](QString key) { | ||||
|             QScriptEngine engine; | ||||
|             // apply $this values | ||||
|             key.replace(QString("$this"), values[key]); | ||||
|             foreach(QString lambdaKey, foundKeys) | ||||
|                 key.replace(QString("$%1").arg(lambdaKey), values[lambdaKey]); | ||||
|             qCInfo(LOG_AW) << "Expression" << key; | ||||
|             QScriptValue result = engine.evaluate(key); | ||||
|             if (engine.hasUncaughtException()) { | ||||
|                 int line = engine.uncaughtExceptionLineNumber(); | ||||
|                 qCWarning(LOG_AW) << "Uncaught exception at line" << line << ":" << result.toString(); | ||||
|                 return QString(); | ||||
|             } else | ||||
|                 return result.toString(); | ||||
|         }(key); | ||||
| } | ||||
|  | ||||
|  | ||||
| // HACK this method is required since I could not define some values by using | ||||
| // specified pattern. Usually they are values which depend on several others | ||||
| void AWKeys::calculateValues() | ||||
| @ -617,8 +542,8 @@ void AWKeys::calculateValues() | ||||
|     qCDebug(LOG_AW); | ||||
|  | ||||
|     // hddtot* | ||||
|     foreach(QString device, hddDevices) { | ||||
|         int index = hddDevices.indexOf(device); | ||||
|     foreach(QString device, m_devices[QString("mount")]) { | ||||
|         int index = m_devices[QString("mount")].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); | ||||
| @ -638,7 +563,7 @@ void AWKeys::calculateValues() | ||||
|         5, 'f', 1); | ||||
|  | ||||
|     // up, down, upkb, downkb, upunits, downunits | ||||
|     int netIndex = networkDevices.indexOf(values[QString("netdev")]); | ||||
|     int netIndex = m_devices[QString("net")].indexOf(values[QString("netdev")]); | ||||
|     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)]; | ||||
| @ -655,23 +580,41 @@ void AWKeys::calculateValues() | ||||
|     values[QString("swap")] = QString("%1").arg( | ||||
|         100.0 * values[QString("swapmb")].toFloat() / values[QString("swaptotmb")].toFloat(), | ||||
|         5, 'f', 1); | ||||
|  | ||||
|     // lambdas | ||||
|     foreach(QString key, m_foundLambdas) | ||||
|         values[key] = [this](QString key) { | ||||
|             QScriptEngine engine; | ||||
|             // apply $this values | ||||
|             key.replace(QString("$this"), values[key]); | ||||
|             foreach(QString lambdaKey, m_foundKeys) | ||||
|                 key.replace(QString("$%1").arg(lambdaKey), values[lambdaKey]); | ||||
|             qCInfo(LOG_AW) << "Expression" << key; | ||||
|             QScriptValue result = engine.evaluate(key); | ||||
|             if (engine.hasUncaughtException()) { | ||||
|                 int line = engine.uncaughtExceptionLineNumber(); | ||||
|                 qCWarning(LOG_AW) << "Uncaught exception at line" << line << ":" << result.toString(); | ||||
|                 return QString(); | ||||
|             } else | ||||
|                 return result.toString(); | ||||
|         }(key); | ||||
| } | ||||
|  | ||||
|  | ||||
| QString AWKeys::parsePattern() const | ||||
| QString AWKeys::parsePattern(QString pattern) const | ||||
| { | ||||
|     qCDebug(LOG_AW); | ||||
|  | ||||
|     QString parsed = pattern; | ||||
|     parsed.replace(QString("$$"), QString("$\\$\\")); | ||||
|     // screen sign | ||||
|     pattern.replace(QString("$$"), QString("$\\$\\")); | ||||
|  | ||||
|     // lambdas | ||||
|     foreach(QString key, foundLambdas) | ||||
|         parsed.replace(QString("${{%1}}").arg(key), values[key]); | ||||
|     foreach(QString key, m_foundLambdas) | ||||
|         pattern.replace(QString("${{%1}}").arg(key), values[key]); | ||||
|  | ||||
|     // main keys | ||||
|     foreach(QString key, foundKeys) | ||||
|         parsed.replace(QString("$%1").arg(key), [](QString key, QString value) { | ||||
|     foreach(QString 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(" ")); | ||||
| @ -679,37 +622,41 @@ QString AWKeys::parsePattern() const | ||||
|         }(key, values[key])); | ||||
|  | ||||
|     // bars | ||||
|     foreach(QString bar, foundBars) { | ||||
|     foreach(QString bar,m_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) { | ||||
|             pattern.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])); | ||||
|             pattern.replace(QString("$%1").arg(bar), item->image(values[key])); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     // prepare strings | ||||
|     parsed.replace(QString("$\\$\\"), QString("$$")); | ||||
|     if (wrapNewLines) parsed.replace(QString("\n"), QString("<br>")); | ||||
|     pattern.replace(QString("$\\$\\"), QString("$$")); | ||||
|     if (m_wrapNewLines) pattern.replace(QString("\n"), QString("<br>")); | ||||
|  | ||||
|     return parsed; | ||||
|     return pattern; | ||||
| } | ||||
|  | ||||
|  | ||||
| void AWKeys::setDataBySource(const QString sourceName, const QVariantMap data) | ||||
| { | ||||
| #ifdef BUILD_FUTURE | ||||
|     // check if data stream is locked | ||||
|     lock = ((lock) && (queue > 0)); | ||||
|     if (lock) return; | ||||
| #endif /* BUILD_FUTURE */ | ||||
|  | ||||
|     qCDebug(LOG_AW); | ||||
|     qCDebug(LOG_AW) << "Source" << sourceName; | ||||
|     qCDebug(LOG_AW) << "Data" << data; | ||||
|  | ||||
|     // update | ||||
|     if (sourceName == QString("update")) return emit(needToBeUpdated()); | ||||
|  | ||||
|     // drop if limits are reached | ||||
|     if (++queue > QUEUE_LIMIT) { | ||||
|         qCWarning(LOG_AW) << "Messages queue" << queue-- << "more than limits" << QUEUE_LIMIT << ", lock"; | ||||
| @ -718,7 +665,7 @@ void AWKeys::setDataBySource(const QString sourceName, const QVariantMap data) | ||||
|     } | ||||
|  | ||||
|     // first list init | ||||
|     QStringList tags = aggregator->keyFromSource(sourceName); | ||||
|     QStringList tags = aggregator->keysFromSource(sourceName); | ||||
|     if (tags.isEmpty()) | ||||
|         tags = aggregator->registerSource(sourceName, data[QString("units")].toString()); | ||||
|  | ||||
|  | ||||
| @ -42,12 +42,10 @@ public: | ||||
|     explicit AWKeys(QObject *parent = nullptr); | ||||
|     virtual ~AWKeys(); | ||||
|  | ||||
|     Q_INVOKABLE void initKeys(const QString currentPattern); | ||||
|     Q_INVOKABLE void initDataAggregator(const QVariantMap tooltipParams); | ||||
|     Q_INVOKABLE void initKeys(const QString currentPattern); | ||||
|     Q_INVOKABLE void setAggregatorProperty(const QString key, const QVariant value); | ||||
|     Q_INVOKABLE void setPopupEnabled(const bool popup = false); | ||||
|     Q_INVOKABLE void setWrapNewLines(const bool wrap = false); | ||||
|     Q_INVOKABLE QSize toolTipSize() const; | ||||
|     // keys | ||||
|     Q_INVOKABLE void addDevice(const QString source); | ||||
|     Q_INVOKABLE QStringList dictKeys(const bool sorted = false, | ||||
| @ -74,14 +72,12 @@ private slots: | ||||
| private: | ||||
|     // methods | ||||
|     void addKeyToCache(const QString type, const QString key = QString("")); | ||||
|     void calculateLambdas(); | ||||
|     void calculateValues(); | ||||
|     QString parsePattern() const; | ||||
|     QString parsePattern(QString pattern) const; | ||||
|     void setDataBySource(const QString sourceName, const QVariantMap data); | ||||
|     AWKeysAggregator *aggregator = nullptr; | ||||
|     AWDataAggregator *dataAggregator = nullptr; | ||||
|     bool enablePopup = false; | ||||
|     bool wrapNewLines = false; | ||||
|     bool m_wrapNewLines = false; | ||||
|     ExtItemAggregator<GraphicalItem> *graphicalItems = nullptr; | ||||
|     ExtItemAggregator<ExtQuotes> *extQuotes = nullptr; | ||||
|     ExtItemAggregator<ExtScript> *extScripts = nullptr; | ||||
| @ -89,10 +85,10 @@ private: | ||||
|     ExtItemAggregator<ExtWeather> *extWeather = nullptr; | ||||
|     bool lock = false; | ||||
|     int queue = 0; | ||||
|     QString pattern; | ||||
|     QStringList foundBars, foundKeys, foundLambdas; | ||||
|     QString m_pattern; | ||||
|     QStringList m_foundBars, m_foundKeys, m_foundLambdas; | ||||
|     QHash<QString, QString> values; | ||||
|     QStringList diskDevices, hddDevices, mountDevices, networkDevices, tempDevices; | ||||
|     QHash<QString, QStringList> m_devices; | ||||
| }; | ||||
|  | ||||
|  | ||||
|  | ||||
| @ -90,7 +90,7 @@ QString AWKeysAggregator::formater(const QVariant data, const QString key) const | ||||
|     case Quotes: | ||||
|         // first cast | ||||
|         output = QString("%1").arg(data.toDouble(), 0, 'f'); | ||||
|         output = output.leftJustified(8, QLatin1Char(' '), true); | ||||
|         output = output.rightJustified(8, QLatin1Char(' '), true); | ||||
|         break; | ||||
|     case Temperature: | ||||
|         output = QString("%1").arg(temperature(data.toFloat()), 5, 'f', 1); | ||||
| @ -140,7 +140,7 @@ QString AWKeysAggregator::formater(const QVariant data, const QString key) const | ||||
| } | ||||
|  | ||||
|  | ||||
| QStringList AWKeysAggregator::keyFromSource(const QString source) const | ||||
| QStringList AWKeysAggregator::keysFromSource(const QString source) const | ||||
| { | ||||
|     qCDebug(LOG_AW); | ||||
|     qCDebug(LOG_AW) << "Search for source" << source; | ||||
| @ -502,7 +502,7 @@ QStringList AWKeysAggregator::registerSource(const QString source, const QString | ||||
|         m_formater[key] = NoFormat; | ||||
|     } | ||||
|  | ||||
|     return keyFromSource(source); | ||||
|     return keysFromSource(source); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| @ -65,7 +65,7 @@ public: | ||||
|     virtual ~AWKeysAggregator(); | ||||
|     // get methods | ||||
|     QString formater(const QVariant data, const QString key) const; | ||||
|     QStringList keyFromSource(const QString source) const; | ||||
|     QStringList keysFromSource(const QString source) const; | ||||
|     // set methods | ||||
|     void setAcOffline(const QString inactive); | ||||
|     void setAcOnline(const QString active); | ||||
|  | ||||
| @ -8,7 +8,7 @@ msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: PACKAGE VERSION\n" | ||||
| "Report-Msgid-Bugs-To: https://github.com/arcan1s/awesome-widgets/issues\n" | ||||
| "POT-Creation-Date: 2015-09-11 22:03+0300\n" | ||||
| "POT-Creation-Date: 2015-09-14 10:03+0300\n" | ||||
| "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" | ||||
| "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" | ||||
| "Language-Team: LANGUAGE <LL@li.org>\n" | ||||
| @ -312,6 +312,9 @@ msgstr "" | ||||
| msgid "Edit bars" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Preview" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Run %1" | ||||
| msgstr "" | ||||
|  | ||||
|  | ||||
| @ -6,8 +6,8 @@ msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: \n" | ||||
| "Report-Msgid-Bugs-To: https://github.com/arcan1s/awesome-widgets/issues\n" | ||||
| "POT-Creation-Date: 2015-09-11 22:03+0300\n" | ||||
| "PO-Revision-Date: 2015-09-11 22:03+0300\n" | ||||
| "POT-Creation-Date: 2015-09-14 10:03+0300\n" | ||||
| "PO-Revision-Date: 2015-09-14 10:04+0300\n" | ||||
| "Last-Translator: Evgeniy Alekseev <esalexeev@gmail.com>\n" | ||||
| "Language-Team: English <kde-russian@lists.kde.ru>\n" | ||||
| "Language: ru\n" | ||||
| @ -317,6 +317,9 @@ msgstr "Add lambda" | ||||
| msgid "Edit bars" | ||||
| msgstr "Edit bars" | ||||
|  | ||||
| msgid "Preview" | ||||
| msgstr "Preview" | ||||
|  | ||||
| msgid "Run %1" | ||||
| msgstr "Run %1" | ||||
|  | ||||
|  | ||||
| @ -7,7 +7,7 @@ msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: \n" | ||||
| "Report-Msgid-Bugs-To: https://github.com/arcan1s/awesome-widgets/issues\n" | ||||
| "POT-Creation-Date: 2015-09-11 22:03+0300\n" | ||||
| "POT-Creation-Date: 2015-09-14 10:03+0300\n" | ||||
| "PO-Revision-Date: 2015-07-31 22:13+0300\n" | ||||
| "Last-Translator: Evgeniy Alekseev <esalexeev@gmail.com>\n" | ||||
| "Language-Team: Spanish <kde-russian@lists.kde.ru>\n" | ||||
| @ -328,6 +328,9 @@ msgstr "" | ||||
| msgid "Edit bars" | ||||
| msgstr "Editar barras" | ||||
|  | ||||
| msgid "Preview" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Run %1" | ||||
| msgstr "Ejecutar %1" | ||||
|  | ||||
|  | ||||
| @ -7,7 +7,7 @@ msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: \n" | ||||
| "Report-Msgid-Bugs-To: https://github.com/arcan1s/awesome-widgets/issues\n" | ||||
| "POT-Creation-Date: 2015-09-11 22:03+0300\n" | ||||
| "POT-Creation-Date: 2015-09-14 10:03+0300\n" | ||||
| "PO-Revision-Date: 2015-07-31 22:16+0300\n" | ||||
| "Last-Translator: Evgeniy Alekseev <esalexeev@gmail.com>\n" | ||||
| "Language-Team: French <kde-russian@lists.kde.ru>\n" | ||||
| @ -330,6 +330,9 @@ msgstr "" | ||||
| msgid "Edit bars" | ||||
| msgstr "Modifier les barres" | ||||
|  | ||||
| msgid "Preview" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Run %1" | ||||
| msgstr "Éxecuter %1" | ||||
|  | ||||
|  | ||||
| @ -8,7 +8,7 @@ msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: Awesome widgets\n" | ||||
| "Report-Msgid-Bugs-To: https://github.com/arcan1s/awesome-widgets/issues\n" | ||||
| "POT-Creation-Date: 2015-09-11 22:03+0300\n" | ||||
| "POT-Creation-Date: 2015-09-14 10:03+0300\n" | ||||
| "PO-Revision-Date: 2015-08-20 22:52+0300\n" | ||||
| "Last-Translator: Evgeniy Alekseev <esalexeev@gmail.com>\n" | ||||
| "Language-Team: Dutch <kde-i18n-nl@kde.org>\n" | ||||
| @ -329,6 +329,9 @@ msgstr "" | ||||
| msgid "Edit bars" | ||||
| msgstr "Balken bewerken" | ||||
|  | ||||
| msgid "Preview" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Run %1" | ||||
| msgstr "%1 uitvoeren" | ||||
|  | ||||
|  | ||||
| @ -6,7 +6,7 @@ msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: \n" | ||||
| "Report-Msgid-Bugs-To: https://github.com/arcan1s/awesome-widgets/issues\n" | ||||
| "POT-Creation-Date: 2015-09-11 22:03+0300\n" | ||||
| "POT-Creation-Date: 2015-09-14 10:03+0300\n" | ||||
| "PO-Revision-Date: 2015-07-31 22:21+0300\n" | ||||
| "Last-Translator: Evgeniy Alekseev <esalexeev@gmail.com>\n" | ||||
| "Language-Team: Russian <kde-russian@lists.kde.ru>\n" | ||||
| @ -328,6 +328,9 @@ msgstr "" | ||||
| msgid "Edit bars" | ||||
| msgstr "Editar barras" | ||||
|  | ||||
| msgid "Preview" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Run %1" | ||||
| msgstr "Rodar %1" | ||||
|  | ||||
|  | ||||
| @ -6,8 +6,8 @@ msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: \n" | ||||
| "Report-Msgid-Bugs-To: https://github.com/arcan1s/awesome-widgets/issues\n" | ||||
| "POT-Creation-Date: 2015-09-11 22:03+0300\n" | ||||
| "PO-Revision-Date: 2015-09-11 22:03+0300\n" | ||||
| "POT-Creation-Date: 2015-09-14 10:03+0300\n" | ||||
| "PO-Revision-Date: 2015-09-14 10:04+0300\n" | ||||
| "Last-Translator: Evgeniy Alekseev <esalexeev@gmail.com>\n" | ||||
| "Language-Team: Russian <kde-russian@lists.kde.ru>\n" | ||||
| "Language: ru\n" | ||||
| @ -317,6 +317,9 @@ msgstr "Добавить лямбду" | ||||
| msgid "Edit bars" | ||||
| msgstr "Редактировать бары" | ||||
|  | ||||
| msgid "Preview" | ||||
| msgstr "Предварительный просмотр" | ||||
|  | ||||
| msgid "Run %1" | ||||
| msgstr "Запуск %1" | ||||
|  | ||||
|  | ||||
| @ -6,7 +6,7 @@ msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: \n" | ||||
| "Report-Msgid-Bugs-To: https://github.com/arcan1s/awesome-widgets/issues\n" | ||||
| "POT-Creation-Date: 2015-09-11 22:03+0300\n" | ||||
| "POT-Creation-Date: 2015-09-14 10:03+0300\n" | ||||
| "PO-Revision-Date: 2015-07-31 22:23+0300\n" | ||||
| "Last-Translator: Evgeniy Alekseev <esalexeev@gmail.com>\n" | ||||
| "Language-Team: Ukrainian <kde-russian@lists.kde.ru>\n" | ||||
| @ -328,6 +328,9 @@ msgstr "" | ||||
| msgid "Edit bars" | ||||
| msgstr "Редагувати бари" | ||||
|  | ||||
| msgid "Preview" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Run %1" | ||||
| msgstr "Запуск %1" | ||||
|  | ||||
|  | ||||
| @ -7,7 +7,7 @@ msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: \n" | ||||
| "Report-Msgid-Bugs-To: https://github.com/arcan1s/awesome-widgets/issues\n" | ||||
| "POT-Creation-Date: 2015-09-11 22:03+0300\n" | ||||
| "POT-Creation-Date: 2015-09-14 10:03+0300\n" | ||||
| "PO-Revision-Date: 2015-07-31 22:24+0300\n" | ||||
| "Last-Translator: Evgeniy Alekseev <esalexeev@gmail.com>\n" | ||||
| "Language-Team: Russian <kde-russian@lists.kde.ru>\n" | ||||
| @ -330,6 +330,9 @@ msgstr "" | ||||
| msgid "Edit bars" | ||||
| msgstr "可编辑的" | ||||
|  | ||||
| msgid "Preview" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Run %1" | ||||
| msgstr "" | ||||
|  | ||||
|  | ||||
		Reference in New Issue
	
	Block a user