From b699095f38b91dd03fe3f4576a85fe3958080635 Mon Sep 17 00:00:00 2001 From: arcan1s Date: Wed, 22 Jul 2015 00:44:39 +0300 Subject: [PATCH] initial support of weather --- CHANGELOG | 2 + sources/.kdev4/awesomewidgets.kdev4 | 2 +- .../3rdparty/qreplytimeout/qreplytimeout.cpp | 18 + .../3rdparty/qreplytimeout/qreplytimeout.h | 17 + .../package/contents/ui/advanced.qml | 3 - .../package/contents/ui/dataengine.qml | 17 + .../package/contents/ui/main.qml | 4 - sources/awesome-widget/plugin/CMakeLists.txt | 4 +- sources/awesome-widget/plugin/awkeys.cpp | 182 +++++- sources/awesome-widget/plugin/awkeys.h | 7 +- sources/extsysmon/CMakeLists.txt | 5 +- sources/extsysmon/extquotes.cpp | 7 +- sources/extsysmon/extquotes.h | 18 - sources/extsysmon/extscript.cpp | 3 +- sources/extsysmon/extsysmon.cpp | 66 ++- sources/extsysmon/extsysmon.h | 3 + sources/extsysmon/extupgrade.cpp | 3 +- sources/extsysmon/extweather.cpp | 539 ++++++++++++++++++ sources/extsysmon/extweather.h | 109 ++++ sources/extsysmon/extweather.ui | 271 +++++++++ sources/version.h.in | 2 + 21 files changed, 1220 insertions(+), 62 deletions(-) create mode 100644 sources/3rdparty/qreplytimeout/qreplytimeout.cpp create mode 100644 sources/3rdparty/qreplytimeout/qreplytimeout.h create mode 100644 sources/extsysmon/extweather.cpp create mode 100644 sources/extsysmon/extweather.h create mode 100644 sources/extsysmon/extweather.ui diff --git a/CHANGELOG b/CHANGELOG index d237dde..b9b8939 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,10 +1,12 @@ Ver.2.3.4: ++ add support of weather items + add support of load average (la1, la5, la15 tags) + add "drop key cache" button - fix bug with invalid network data calculation * improve work with data updating (#57) * move plugin part back to private * cast plugin as type, not signleton (#57) +* change logic in data building inside DataEngine Ver.2.3.3: * change text rendering from Qt to native diff --git a/sources/.kdev4/awesomewidgets.kdev4 b/sources/.kdev4/awesomewidgets.kdev4 index b97529b..ea73c1d 100644 --- a/sources/.kdev4/awesomewidgets.kdev4 +++ b/sources/.kdev4/awesomewidgets.kdev4 @@ -8,7 +8,7 @@ ProjectRootRelative=./ [CMake][CMake Build Directory 0] Build Directory Path=file:///home/arcanis/Documents/github/awesome-widgets/build -Build Type=Debug +Build Type=Release CMake Binary=file:///usr/bin/cmake Environment Profile= Extra Arguments= diff --git a/sources/3rdparty/qreplytimeout/qreplytimeout.cpp b/sources/3rdparty/qreplytimeout/qreplytimeout.cpp new file mode 100644 index 0000000..eb3c4ad --- /dev/null +++ b/sources/3rdparty/qreplytimeout/qreplytimeout.cpp @@ -0,0 +1,18 @@ +#include "qreplytimeout.h" + +#include + + +QReplyTimeout::QReplyTimeout(QNetworkReply *reply, const int timeout) + : QObject(reply) +{ + QTimer::singleShot(timeout, this, SLOT(timeout())); +} + + +void QReplyTimeout::timeout() +{ + QNetworkReply *reply = static_cast(parent()); + if (reply->isRunning()) + reply->close(); +} diff --git a/sources/3rdparty/qreplytimeout/qreplytimeout.h b/sources/3rdparty/qreplytimeout/qreplytimeout.h new file mode 100644 index 0000000..26c86e2 --- /dev/null +++ b/sources/3rdparty/qreplytimeout/qreplytimeout.h @@ -0,0 +1,17 @@ +// from here http://codereview.stackexchange.com/questions/30031/qnetworkreply-network-reply-timeout-helper +// no license provided + +#include +#include + + +class QReplyTimeout : public QObject +{ + Q_OBJECT + +public: + explicit QReplyTimeout(QNetworkReply *reply, const int timeout); + +public slots: + void timeout(); +}; diff --git a/sources/awesome-widget/package/contents/ui/advanced.qml b/sources/awesome-widget/package/contents/ui/advanced.qml index dccb9d9..4c4e7ce 100644 --- a/sources/awesome-widget/package/contents/ui/advanced.qml +++ b/sources/awesome-widget/package/contents/ui/advanced.qml @@ -261,9 +261,6 @@ Item { QtControls.Label { height: parent.height width: parent.width * 2 / 5 -// horizontalAlignment: Text.AlignRight -// verticalAlignment: Text.AlignVCenter -// text: i18n("Font") } QtControls.Button { id: selectFont diff --git a/sources/awesome-widget/package/contents/ui/dataengine.qml b/sources/awesome-widget/package/contents/ui/dataengine.qml index 04d8efd..4cf3331 100644 --- a/sources/awesome-widget/package/contents/ui/dataengine.qml +++ b/sources/awesome-widget/package/contents/ui/dataengine.qml @@ -275,6 +275,23 @@ Item { onClicked: awKeys.editItem("extupgrade") } } + + Row { + height: implicitHeight + width: parent.width + QtControls.Label { + height: parent.height + width: parent.width * 2 / 5 + horizontalAlignment: Text.AlignRight + verticalAlignment: Text.AlignVCenter + text: i18n("Weather") + } + QtControls.Button { + width: parent.width * 3 / 5 + text: i18n("Edit weather") + onClicked: awKeys.editItem("extweather") + } + } } Component.onCompleted: { diff --git a/sources/awesome-widget/package/contents/ui/main.qml b/sources/awesome-widget/package/contents/ui/main.qml index f20b0d2..9c13b6e 100644 --- a/sources/awesome-widget/package/contents/ui/main.qml +++ b/sources/awesome-widget/package/contents/ui/main.qml @@ -91,8 +91,6 @@ Item { onNewData: { if (debug) console.log("[main::onNewData] : Update source " + sourceName) - // FIXME: ugly workaround to make some sources working -// systemmonitorDE.interval = plasmoid.configuration.interval awKeys.setDataBySource(sourceName, data, settings) } @@ -112,8 +110,6 @@ Item { onNewData: { if (debug) console.log("[main::onNewData] : Update source " + sourceName) - // FIXME: ugly workaround to make some sources working -// extsysmonDE.interval = plasmoid.configuration.interval awKeys.setDataBySource(sourceName, data, settings) } diff --git a/sources/awesome-widget/plugin/CMakeLists.txt b/sources/awesome-widget/plugin/CMakeLists.txt index 1ef4af0..078dc83 100644 --- a/sources/awesome-widget/plugin/CMakeLists.txt +++ b/sources/awesome-widget/plugin/CMakeLists.txt @@ -21,9 +21,11 @@ include_directories (${CMAKE_SOURCE_DIR} # task source is required by extscripts file (GLOB_RECURSE SUBPROJECT_SOURCE *.cpp ${PROJECT_TRDPARTY_DIR}/fontdialog/*.cpp + ${PROJECT_TRDPARTY_DIR}/qreplytimeout/*.cpp ../../extsysmon/extquotes.cpp ../../extsysmon/extscript.cpp - ../../extsysmon/extupgrade.cpp) + ../../extsysmon/extupgrade.cpp + ../../extsysmon/extweather.cpp) file (GLOB SUBPROJECT_UI *.ui) file (GLOB SUBPROJECT_NOTIFY *.notifyrc) set (SUBPROJECT_DESKTOP ${CMAKE_CURRENT_SOURCE_DIR}/desktops) diff --git a/sources/awesome-widget/plugin/awkeys.cpp b/sources/awesome-widget/plugin/awkeys.cpp index ec9e1c6..027cdd7 100644 --- a/sources/awesome-widget/plugin/awkeys.cpp +++ b/sources/awesome-widget/plugin/awkeys.cpp @@ -39,6 +39,7 @@ #include "extquotes.h" #include "extscript.h" #include "extupgrade.h" +#include "extweather.h" #include "graphicalitem.h" #include "version.h" @@ -81,6 +82,7 @@ AWKeys::~AWKeys() graphicalItems.clear(); extScripts.clear(); extUpgrade.clear(); + extWeather.clear(); } @@ -102,6 +104,7 @@ void AWKeys::initKeys(const QString currentPattern) extQuotes = getExtQuotes(); extScripts = getExtScripts(); extUpgrade = getExtUpgrade(); + extWeather = getExtWeather(); graphicalItems = getGraphicalItems(); // update network and hdd list addKeyToCache(QString("Hdd")); @@ -305,6 +308,15 @@ QStringList AWKeys::dictKeys(const bool sorted) allKeys.append(QString("la15")); allKeys.append(QString("la5")); allKeys.append(QString("la1")); + // weather + for (int i=extWeather.count()-1; i>=0; i--) { + allKeys.append(extWeather[i]->tag(QString("weatherId"))); + allKeys.append(extWeather[i]->tag(QString("weather"))); + allKeys.append(extWeather[i]->tag(QString("humidity"))); + allKeys.append(extWeather[i]->tag(QString("pressure"))); + allKeys.append(extWeather[i]->tag(QString("temperature"))); + allKeys.append(extWeather[i]->tag(QString("timestamp"))); + } // bars QStringList graphicalItemsKeys; for (int i=0; isetToolTip(tooltip.join(QChar('\n'))); widgetDialog->addItem(item); } + } else if (type == QString("extweather")) { + requestedItem = RequestedExtWeather; + for (int i=0; ifileName()); + QStringList tooltip; + tooltip.append(i18n("Name: %1", extWeather[i]->name())); + tooltip.append(i18n("Comment: %1", extWeather[i]->comment())); + tooltip.append(i18n("City: %1", extWeather[i]->city())); + tooltip.append(i18n("Country: %1", extWeather[i]->country())); + tooltip.append(i18n("Time: %1", extWeather[i]->ts())); + item->setToolTip(tooltip.join(QChar('\n'))); + widgetDialog->addItem(item); + } } int ret = dialog->exec(); @@ -861,6 +900,9 @@ void AWKeys::editItemButtonPressed(QAbstractButton *button) case RequestedExtUpgrade: copyUpgrade(current); break; + case RequestedExtWeather: + copyWeather(current); + break; case RequestedGraphicalItem: copyBar(current); break; @@ -879,6 +921,9 @@ void AWKeys::editItemButtonPressed(QAbstractButton *button) case RequestedExtUpgrade: copyUpgrade(QString("")); break; + case RequestedExtWeather: + copyWeather(QString("")); + break; case RequestedGraphicalItem: copyBar(QString("")); break; @@ -923,6 +968,17 @@ void AWKeys::editItemButtonPressed(QAbstractButton *button) break; } break; + case RequestedExtWeather: + for (int i=0; ifileName() != current) continue; + if (extWeather[i]->tryDelete()) { + widgetDialog->takeItem(widgetDialog->row(item)); + extWeather.clear(); + extWeather = getExtWeather(); + } + break; + } + break; case RequestedGraphicalItem: for (int i=0; ifileName() != current) continue; @@ -963,6 +1019,13 @@ void AWKeys::editItemButtonPressed(QAbstractButton *button) break; } break; + case RequestedExtWeather: + for (int i=0; ifileName() != current) continue; + extWeather[i]->showConfiguration(); + break; + } + break; case RequestedGraphicalItem: for (int i=0; ifileName() != current) continue; @@ -993,7 +1056,7 @@ void AWKeys::copyBar(const QString original) QString("awesomewidgets/desktops"), QStandardPaths::LocateDirectory); bool ok; - QString name = QInputDialog::getText(0, i18n("Enter file name"), + QString name = QInputDialog::getText(nullptr, i18n("Enter file name"), i18n("File name"), QLineEdit::Normal, QString(""), &ok); if ((!ok) || (name.isEmpty())) return; @@ -1014,7 +1077,7 @@ void AWKeys::copyBar(const QString original) originalItem = i; break; } - GraphicalItem *item = new GraphicalItem(0, name, dirs, debug); + GraphicalItem *item = new GraphicalItem(nullptr, name, dirs, debug); item->setApiVersion(AWGIAPI); item->setName(QString("bar%1").arg(number)); if (originalItem != -1) { @@ -1058,7 +1121,7 @@ void AWKeys::copyQuotes(const QString original) QString("awesomewidgets/quotes"), QStandardPaths::LocateDirectory); bool ok; - QString name = QInputDialog::getText(0, i18n("Enter file name"), + QString name = QInputDialog::getText(nullptr, i18n("Enter file name"), i18n("File name"), QLineEdit::Normal, QString(""), &ok); if ((!ok) || (name.isEmpty())) return; @@ -1072,7 +1135,7 @@ void AWKeys::copyQuotes(const QString original) originalItem = i; break; } - ExtQuotes *quotes = new ExtQuotes(0, name, dirs, debug); + ExtQuotes *quotes = new ExtQuotes(nullptr, name, dirs, debug); quotes->setApiVersion(AWEQAPI); quotes->setNumber(number); if (originalItem != -1) { @@ -1115,7 +1178,7 @@ void AWKeys::copyScript(const QString original) QString("awesomewidgets/scripts"), QStandardPaths::LocateDirectory); bool ok; - QString name = QInputDialog::getText(0, i18n("Enter file name"), + QString name = QInputDialog::getText(nullptr, i18n("Enter file name"), i18n("File name"), QLineEdit::Normal, QString(""), &ok); if ((!ok) || (name.isEmpty())) return; @@ -1129,7 +1192,7 @@ void AWKeys::copyScript(const QString original) originalItem = i; break; } - ExtScript *script = new ExtScript(0, name, dirs, debug); + ExtScript *script = new ExtScript(nullptr, name, dirs, debug); script->setApiVersion(AWESAPI); script->setNumber(number); if (originalItem != -1) { @@ -1174,7 +1237,7 @@ void AWKeys::copyUpgrade(const QString original) QString("awesomewidgets/upgrade"), QStandardPaths::LocateDirectory); bool ok; - QString name = QInputDialog::getText(0, i18n("Enter file name"), + QString name = QInputDialog::getText(nullptr, i18n("Enter file name"), i18n("File name"), QLineEdit::Normal, QString(""), &ok); if ((!ok) || (name.isEmpty())) return; @@ -1188,7 +1251,7 @@ void AWKeys::copyUpgrade(const QString original) originalItem = i; break; } - ExtUpgrade *upgrade = new ExtUpgrade(0, name, dirs, debug); + ExtUpgrade *upgrade = new ExtUpgrade(nullptr, name, dirs, debug); upgrade->setApiVersion(AWEUAPI); upgrade->setNumber(number); if (originalItem != -1) { @@ -1216,6 +1279,66 @@ void AWKeys::copyUpgrade(const QString original) } +void AWKeys::copyWeather(const QString original) +{ + if (debug) qDebug() << PDEBUG; + + QList tagList; + for (int i=0; inumber()); + int number = 0; + while (tagList.contains(number)) + number++; + + QStringList dirs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, + QString("awesomewidgets/weather"), + QStandardPaths::LocateDirectory); + bool ok; + QString name = QInputDialog::getText(nullptr, i18n("Enter file name"), + i18n("File name"), QLineEdit::Normal, + QString(""), &ok); + if ((!ok) || (name.isEmpty())) return; + if (!name.endsWith(QString(".desktop"))) name += QString(".desktop"); + + int originalItem = -1; + for (int i=0; ifileName() != original) || + (extWeather[i]->fileName() != name)) + continue; + originalItem = i; + break; + } + ExtWeather *weather = new ExtWeather(nullptr, name, dirs, debug); + weather->setApiVersion(AWEUAPI); + weather->setNumber(number); + if (originalItem != -1) { + weather->setActive(extWeather[originalItem]->isActive()); + weather->setComment(extWeather[originalItem]->comment()); + weather->setName(extWeather[originalItem]->name()); + weather->setInterval(extWeather[originalItem]->interval()); + weather->setCity(extWeather[originalItem]->city()); + weather->setCountry(extWeather[originalItem]->country()); + weather->setTs(extWeather[originalItem]->ts()); + } + + if (weather->showConfiguration() == 1) { + extWeather.clear(); + extWeather = getExtWeather(); + QListWidgetItem *widgetItem = new QListWidgetItem(weather->fileName()); + QStringList tooltip; + tooltip.append(i18n("Name: %1", weather->name())); + tooltip.append(i18n("Comment: %1", weather->comment())); + tooltip.append(i18n("City: %1", weather->city())); + tooltip.append(i18n("Country: %1", weather->country())); + tooltip.append(i18n("Time: %1", weather->ts())); + widgetItem->setToolTip(tooltip.join(QChar('\n'))); + widgetDialog->addItem(widgetItem); + widgetDialog->sortItems(); + } + delete weather; +} + + void AWKeys::addKeyToCache(const QString type, const QString key) { if (debug) qDebug() << PDEBUG; @@ -1388,7 +1511,7 @@ QList AWKeys::getExtQuotes() if (names.contains(files[j])) continue; if (debug) qDebug() << PDEBUG << ":" << "Found file" << files[j] << "in" << dirs[i]; names.append(files[j]); - externalQuotes.append(new ExtQuotes(0, files[j], dirs, debug)); + externalQuotes.append(new ExtQuotes(nullptr, files[j], dirs, debug)); } } @@ -1419,7 +1542,7 @@ QList AWKeys::getExtScripts() if (names.contains(files[j])) continue; if (debug) qDebug() << PDEBUG << ":" << "Found file" << files[j] << "in" << dirs[i]; names.append(files[j]); - externalScripts.append(new ExtScript(0, files[j], dirs, debug)); + externalScripts.append(new ExtScript(nullptr, files[j], dirs, debug)); } } @@ -1450,7 +1573,7 @@ QList AWKeys::getExtUpgrade() if (names.contains(files[j])) continue; if (debug) qDebug() << PDEBUG << ":" << "Found file" << files[j] << "in" << dirs[i]; names.append(files[j]); - externalUpgrade.append(new ExtUpgrade(0, files[j], dirs, debug)); + externalUpgrade.append(new ExtUpgrade(nullptr, files[j], dirs, debug)); } } @@ -1458,6 +1581,37 @@ QList AWKeys::getExtUpgrade() } +QList AWKeys::getExtWeather() +{ + if (debug) qDebug() << PDEBUG; + + QList externalWeather; + // create directory at $HOME + QString localDir = QString("%1/awesomewidgets/weather") + .arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)); + QDir localDirectory; + if ((!localDirectory.exists(localDir)) && (localDirectory.mkpath(localDir))) + if (debug) qDebug() << PDEBUG << ":" << "Created directory" << localDir; + + QStringList dirs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, + QString("awesomewidgets/weather"), + QStandardPaths::LocateDirectory); + QStringList names; + for (int i=0; i AWKeys::getGraphicalItems() { if (debug) qDebug() << PDEBUG; @@ -1481,7 +1635,7 @@ QList AWKeys::getGraphicalItems() if (names.contains(files[j])) continue; if (debug) qDebug() << PDEBUG << ":" << "Found file" << files[j] << "in" << dirs[i]; names.append(files[j]); - items.append(new GraphicalItem(0, files[j], dirs, debug)); + items.append(new GraphicalItem(nullptr, files[j], dirs, debug)); } } diff --git a/sources/awesome-widget/plugin/awkeys.h b/sources/awesome-widget/plugin/awkeys.h index 15948ea..01cfd0a 100644 --- a/sources/awesome-widget/plugin/awkeys.h +++ b/sources/awesome-widget/plugin/awkeys.h @@ -33,6 +33,7 @@ class AWToolTip; class ExtQuotes; class ExtScript; class ExtUpgrade; +class ExtWeather; class GraphicalItem; class AWKeys : public QObject @@ -44,7 +45,8 @@ class AWKeys : public QObject RequestedGraphicalItem, RequestedExtQuotes, RequestedExtScript, - RequestedExtUpgrade + RequestedExtUpgrade, + RequestedExtWeather }; public: @@ -86,6 +88,7 @@ private slots: void copyQuotes(const QString original); void copyScript(const QString original); void copyUpgrade(const QString original); + void copyWeather(const QString original); private: // methods @@ -102,6 +105,7 @@ private: QList getExtQuotes(); QList getExtScripts(); QList getExtUpgrade(); + QList getExtWeather(); QList getGraphicalItems(); GraphicalItem *getItemByTag(const QString tag); QStringList getTimeKeys(); @@ -122,6 +126,7 @@ private: QList extQuotes; QList extScripts; QList extUpgrade; + QList extWeather; QString pattern; QStringList foundBars, foundKeys, keys; QMap values; diff --git a/sources/extsysmon/CMakeLists.txt b/sources/extsysmon/CMakeLists.txt index a5fd2fc..f944a26 100644 --- a/sources/extsysmon/CMakeLists.txt +++ b/sources/extsysmon/CMakeLists.txt @@ -29,13 +29,15 @@ include_directories (${CMAKE_SOURCE_DIR} file (GLOB SUBPROJECT_DESKTOP_IN *.desktop) file (RELATIVE_PATH SUBPROJECT_DESKTOP ${CMAKE_SOURCE_DIR} ${SUBPROJECT_DESKTOP_IN}) -file (GLOB_RECURSE SUBPROJECT_SOURCE *.cpp ${PROJECT_TRDPARTY_DIR}/task/*.cpp) +file (GLOB_RECURSE SUBPROJECT_SOURCE *.cpp ${PROJECT_TRDPARTY_DIR}/task/*.cpp + ${PROJECT_TRDPARTY_DIR}/qreplytimeout/*.cpp) set (TASK_HEADER ${PROJECT_TRDPARTY_DIR}/task/task.h) file (GLOB SUBPROJECT_UI *.ui) file (GLOB SUBPROJECT_CONF *.conf) set (SUBPROJECT_QUOTES ${CMAKE_CURRENT_SOURCE_DIR}/quotes) set (SUBPROJECT_SCRIPTS ${CMAKE_CURRENT_SOURCE_DIR}/scripts) set (SUBPROJECT_UPGRADE ${CMAKE_CURRENT_SOURCE_DIR}/upgrade) +set (SUBPROJECT_WEATHER ${CMAKE_CURRENT_SOURCE_DIR}/weather) # prepare configure_file (${SUBPROJECT_DESKTOP_IN} ${CMAKE_CURRENT_BINARY_DIR}/${SUBPROJECT_DESKTOP}) @@ -55,3 +57,4 @@ install (FILES ${SUBPROJECT_CONF} DESTINATION ${CONFIG_INSTALL_DIR}) install (DIRECTORY ${SUBPROJECT_QUOTES} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME}) install (DIRECTORY ${SUBPROJECT_SCRIPTS} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME}) install (DIRECTORY ${SUBPROJECT_UPGRADE} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME}) +install (DIRECTORY ${SUBPROJECT_WEATHER} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME}) diff --git a/sources/extsysmon/extquotes.cpp b/sources/extsysmon/extquotes.cpp index 3b5e941..9137602 100644 --- a/sources/extsysmon/extquotes.cpp +++ b/sources/extsysmon/extquotes.cpp @@ -28,11 +28,13 @@ #include #include +#include #include "version.h" -ExtQuotes::ExtQuotes(QWidget *parent, const QString quotesName, const QStringList directories, const bool debugCmd) +ExtQuotes::ExtQuotes(QWidget *parent, const QString quotesName, + const QStringList directories, const bool debugCmd) : QDialog(parent), m_fileName(quotesName), m_dirs(directories), @@ -326,6 +328,7 @@ void ExtQuotes::quotesReplyReceived(QNetworkReply *reply) if (debug) qDebug() << PDEBUG << ":" << "Return code" << reply->error(); if (debug) qDebug() << PDEBUG << ":" << "Reply error message" << reply->errorString(); + isRunning = false; QJsonParseError error; QJsonDocument jsonDoc = QJsonDocument::fromJson(reply->readAll(), &error); reply->deleteLater(); @@ -355,8 +358,6 @@ void ExtQuotes::quotesReplyReceived(QNetworkReply *reply) values[QString("pricechg")] = values[QString("price")] == 0 ? 0.0 : value - values[QString("price")]; values[QString("percpricechg")] = 100 * values[QString("pricechg")] / values[QString("price")]; values[QString("price")] = value; - - isRunning = false; } diff --git a/sources/extsysmon/extquotes.h b/sources/extsysmon/extquotes.h index 5a1ae8f..60094d9 100644 --- a/sources/extsysmon/extquotes.h +++ b/sources/extsysmon/extquotes.h @@ -26,24 +26,6 @@ #define YAHOO_URL "https://query.yahooapis.com/v1/public/yql?q=select * from yahoo.finance.quotes where symbol=\"$TICKER\"&env=store://datatables.org/alltableswithkeys&format=json" -class QReplyTimeout : public QObject -{ - Q_OBJECT - -public: - QReplyTimeout(QNetworkReply *reply, const int timeout) : QObject(reply) - { - QTimer::singleShot(timeout, this, SLOT(timeout())); - } - -public slots: - void timeout() - { - QNetworkReply *reply = static_cast(parent()); - if (reply->isRunning()) reply->close(); - } -}; - namespace Ui { class ExtQuotes; } diff --git a/sources/extsysmon/extscript.cpp b/sources/extsysmon/extscript.cpp index 1f35bbb..002c6e8 100644 --- a/sources/extsysmon/extscript.cpp +++ b/sources/extsysmon/extscript.cpp @@ -32,7 +32,8 @@ #include "version.h" -ExtScript::ExtScript(QWidget *parent, const QString scriptName, const QStringList directories, const bool debugCmd) +ExtScript::ExtScript(QWidget *parent, const QString scriptName, + const QStringList directories, const bool debugCmd) : QDialog(parent), m_fileName(scriptName), m_dirs(directories), diff --git a/sources/extsysmon/extsysmon.cpp b/sources/extsysmon/extsysmon.cpp index 890d5ca..fe6ccfa 100644 --- a/sources/extsysmon/extsysmon.cpp +++ b/sources/extsysmon/extsysmon.cpp @@ -41,6 +41,7 @@ #include "extquotes.h" #include "extscript.h" #include "extupgrade.h" +#include "extweather.h" #include "version.h" @@ -59,6 +60,7 @@ ExtendedSysMon::ExtendedSysMon(QObject* parent, const QVariantList &args) initQuotes(); initScripts(); initUpgrade(); + initWeather(); } @@ -69,6 +71,7 @@ ExtendedSysMon::~ExtendedSysMon() externalQuotes.clear(); externalScripts.clear(); externalUpgrade.clear(); + externalWeather.clear(); } @@ -148,7 +151,7 @@ void ExtendedSysMon::initQuotes() if (names.contains(files[j])) continue; if (debug) qDebug() << PDEBUG << ":" << "Found file" << files[j] << "in" << dirs[i]; names.append(files[j]); - externalQuotes.append(new ExtQuotes(0, files[j], dirs, debug)); + externalQuotes.append(new ExtQuotes(nullptr, files[j], dirs, debug)); } } } @@ -177,7 +180,7 @@ void ExtendedSysMon::initScripts() if (names.contains(files[j])) continue; if (debug) qDebug() << PDEBUG << ":" << "Found file" << files[j] << "in" << dirs[i]; names.append(files[j]); - externalScripts.append(new ExtScript(0, files[j], dirs, debug)); + externalScripts.append(new ExtScript(nullptr, files[j], dirs, debug)); } } } @@ -206,7 +209,36 @@ void ExtendedSysMon::initUpgrade() if (names.contains(files[j])) continue; if (debug) qDebug() << PDEBUG << ":" << "Found file" << files[j] << "in" << dirs[i]; names.append(files[j]); - externalUpgrade.append(new ExtUpgrade(0, files[j], dirs, debug)); + externalUpgrade.append(new ExtUpgrade(nullptr, files[j], dirs, debug)); + } + } +} + + +void ExtendedSysMon::initWeather() +{ + if (debug) qDebug() << PDEBUG; + + // create directory at $HOME and create dirs list + QString localDir = QString("%1/awesomewidgets/weather") + .arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)); + QDir localDirectory; + if ((!localDirectory.exists(localDir)) && (localDirectory.mkpath(localDir))) + if (debug) qDebug() << PDEBUG << ":" << "Created directory" << localDir; + + QStringList dirs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, + QString("awesomewidgets/weather"), + QStandardPaths::LocateDirectory); + + QStringList names; + for (int i=0; iisActive()) continue; setData(source, externalScripts[i]->tag(), externalScripts[i]->run()); + } } else if (source == QString("desktop")) { QVariantMap desktop = getCurrentDesktop(); for (int i=0; iisActive()) continue; setData(source, externalUpgrade[i]->tag(), externalUpgrade[i]->run()); + } } else if (source == QString("player")) { QVariantMap player = getPlayerInfo(configuration[QString("PLAYER")], configuration[QString("MPDADDRESS")], @@ -705,19 +742,20 @@ bool ExtendedSysMon::updateSourceEvent(const QString &source) setData(source, ps.keys()[i], ps[ps.keys()[i]]); } else if (source == QString("quotes")) { for (int i=0; iisActive()) continue; QMap data = externalQuotes[i]->run(); - setData(source, externalQuotes[i]->tag(QString("ask")), data[QString("ask")]); - setData(source, externalQuotes[i]->tag(QString("askchg")), data[QString("askchg")]); - setData(source, externalQuotes[i]->tag(QString("percaskchg")), data[QString("percaskchg")]); - setData(source, externalQuotes[i]->tag(QString("bid")), data[QString("bid")]); - setData(source, externalQuotes[i]->tag(QString("bidchg")), data[QString("bidchg")]); - setData(source, externalQuotes[i]->tag(QString("percbidchg")), data[QString("percbidchg")]); - setData(source, externalQuotes[i]->tag(QString("price")), data[QString("price")]); - setData(source, externalQuotes[i]->tag(QString("pricechg")), data[QString("pricechg")]); - setData(source, externalQuotes[i]->tag(QString("percpricechg")), data[QString("percpricechg")]); + for (int j=0; jtag(data.keys()[j]), data[data.keys()[j]]); } } else if (source == QString("update")) { setData(source, QString("value"), true); + } else if (source == QString("weather")) { + for (int i=0; iisActive()) continue; + QVariantMap data = externalWeather[i]->run(); + for (int j=0; jtag(data.keys()[j]), data[data.keys()[j]]); + } } return true; diff --git a/sources/extsysmon/extsysmon.h b/sources/extsysmon/extsysmon.h index f1f5561..68a1956 100644 --- a/sources/extsysmon/extsysmon.h +++ b/sources/extsysmon/extsysmon.h @@ -24,6 +24,7 @@ class ExtQuotes; class ExtScript; class ExtUpgrade; +class ExtWeather; class ExtendedSysMon : public Plasma::DataEngine { @@ -59,6 +60,7 @@ private: QList externalQuotes; QList externalScripts; QList externalUpgrade; + QList externalWeather; bool debug; // reread configuration QStringList allHddDevices; @@ -68,6 +70,7 @@ private: void initQuotes(); void initScripts(); void initUpgrade(); + void initWeather(); void readConfiguration(); QMap updateConfiguration(QMap rawConfig); }; diff --git a/sources/extsysmon/extupgrade.cpp b/sources/extsysmon/extupgrade.cpp index 0d9900c..54eeae7 100644 --- a/sources/extsysmon/extupgrade.cpp +++ b/sources/extsysmon/extupgrade.cpp @@ -29,7 +29,8 @@ #include "version.h" -ExtUpgrade::ExtUpgrade(QWidget *parent, const QString upgradeName, const QStringList directories, const bool debugCmd) +ExtUpgrade::ExtUpgrade(QWidget *parent, const QString upgradeName, + const QStringList directories, const bool debugCmd) : QDialog(parent), m_fileName(upgradeName), m_dirs(directories), diff --git a/sources/extsysmon/extweather.cpp b/sources/extsysmon/extweather.cpp new file mode 100644 index 0000000..1f81b64 --- /dev/null +++ b/sources/extsysmon/extweather.cpp @@ -0,0 +1,539 @@ +/*************************************************************************** + * 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 "extweather.h" +#include "ui_extweather.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "version.h" + + +ExtWeather::ExtWeather(QWidget *parent, const QString weatherName, + const QStringList directories, const bool debugCmd) + : QDialog(parent), + m_fileName(weatherName), + m_dirs(directories), + debug(debugCmd), + ui(new Ui::ExtWeather) +{ + m_name = m_fileName; + readConfiguration(); + ui->setupUi(this); + + values[QString("weatherId")] = 0; + values[QString("weather")] = QString(""); + values[QString("humidity")] = 0; + values[QString("pressure")] = 0.0; + values[QString("temperature")] = 0.0; + + manager = new QNetworkAccessManager(this); + connect(manager, SIGNAL(finished(QNetworkReply *)), + this, SLOT(weatherReplyReceived(QNetworkReply*))); +} + + +ExtWeather::~ExtWeather() +{ + if (debug) qDebug() << PDEBUG; + + disconnect(manager, SIGNAL(finished(QNetworkReply *)), + this, SLOT(weatherReplyReceived(QNetworkReply *))); + + delete manager; + delete ui; +} + + +QString ExtWeather::weatherFromInt(const int _id) +{ + if (debug) qDebug() << PDEBUG; + if (debug) qDebug() << PDEBUG << ":" << "ID" << _id; + // refer to http://openweathermap.org/weather-conditions + + QString weather; + switch (_id) { + case 800: + // 01d + weather = QString("\u2600"); + break; + case 801: + // 02d + weather = QString("\u26C5"); + break; + case 802: + case 803: + // 03d + weather = QString("\u2601"); + break; + case 804: + // 04d + weather = QString("\u2601"); + break; + case 300: + case 301: + case 302: + case 310: + case 311: + case 312: + case 313: + case 314: + case 321: + case 520: + case 521: + case 522: + case 531: + // 09d + weather = QString("\u2602"); + break; + case 500: + case 501: + case 502: + case 503: + case 504: + // 10d + weather = QString("\u2614"); + break; + case 200: + case 201: + case 202: + case 210: + case 211: + case 212: + case 221: + case 230: + case 231: + case 232: + // 11d + weather = QString("\u2608"); + break; + case 511: + case 600: + case 601: + case 602: + case 611: + case 612: + case 615: + case 616: + case 620: + case 621: + case 622: + // 13d + weather = QString("\u2603"); +// weather = QString("\u26C4"); + break; + case 701: + case 711: + case 721: + case 731: + case 741: + case 751: + case 761: + case 762: + case 771: + case 781: + // 50d + weather = QString("\u26C5"); + break; + default: + // extreme other conditions + weather = QString("\u2604"); + break; + } + + return weather; +} + + +int ExtWeather::apiVersion() +{ + if (debug) qDebug() << PDEBUG; + + return m_apiVersion; +} + + +QString ExtWeather::comment() +{ + if (debug) qDebug() << PDEBUG; + + return m_comment; +} + + +QString ExtWeather::fileName() +{ + if (debug) qDebug() << PDEBUG; + + return m_fileName; +} + + +int ExtWeather::interval() +{ + if (debug) qDebug() << PDEBUG; + + return m_interval; +} + + +bool ExtWeather::isActive() +{ + if (debug) qDebug() << PDEBUG; + + return m_active; +} + + +QString ExtWeather::name() +{ + if (debug) qDebug() << PDEBUG; + + return m_name; +} + + +int ExtWeather::number() +{ + if (debug) qDebug() << PDEBUG; + + return m_number; +} + + +QString ExtWeather::tag(const QString _type) +{ + if (debug) qDebug() << PDEBUG; + if (debug) qDebug() << PDEBUG << ":" << "Tag type" << _type; + + return QString("%1%2").arg(_type).arg(m_number); +} + + +QString ExtWeather::city() +{ + if (debug) qDebug() << PDEBUG; + + return m_city; +} + + +QString ExtWeather::country() +{ + if (debug) qDebug() << PDEBUG; + + return m_country; +} + + +int ExtWeather::ts() +{ + if (debug) qDebug() << PDEBUG; + + return m_ts; +} + + +void ExtWeather::setApiVersion(const int _apiVersion) +{ + if (debug) qDebug() << PDEBUG; + if (debug) qDebug() << PDEBUG << ":" << "Version" << _apiVersion; + + m_apiVersion = _apiVersion; +} + + +void ExtWeather::setActive(const bool _state) +{ + if (debug) qDebug() << PDEBUG; + if (debug) qDebug() << PDEBUG << ":" << "State" << _state; + + m_active = _state; +} + + +void ExtWeather::setComment(const QString _comment) +{ + if (debug) qDebug() << PDEBUG; + if (debug) qDebug() << PDEBUG << ":" << "Comment" << _comment; + + m_comment = _comment; +} + + +void ExtWeather::setInterval(const int _interval) +{ + if (debug) qDebug() << PDEBUG; + if (debug) qDebug() << PDEBUG << ":" << "Interval" << _interval; + + m_interval = _interval; +} + + +void ExtWeather::setName(const QString _name) +{ + if (debug) qDebug() << PDEBUG; + if (debug) qDebug() << PDEBUG << ":" << "Name" << _name; + + m_name = _name; +} + + +void ExtWeather::setNumber(int _number) +{ + if (debug) qDebug() << PDEBUG; + if (debug) qDebug() << PDEBUG << ":" << "Number" << _number; + if (_number == -1) { + if (debug) qDebug() << PDEBUG << ":" << "Number is empty, generate new one"; + qsrand(QTime::currentTime().msec()); + _number = qrand() % 1000; + if (debug) qDebug() << PDEBUG << ":" << "Generated number is" << _number; + } + + m_number = _number; +} + + +void ExtWeather::setCity(const QString _city) +{ + if (debug) qDebug() << PDEBUG; + if (debug) qDebug() << PDEBUG << ":" << "City" << _city; + + m_city = _city; +} + + + +void ExtWeather::setCountry(const QString _country) +{ + if (debug) qDebug() << PDEBUG; + if (debug) qDebug() << PDEBUG << ":" << "Country" << _country; + + m_country = _country; +} + + +void ExtWeather::setTs(const int _ts) +{ + if (debug) qDebug() << PDEBUG; + if (debug) qDebug() << PDEBUG << ":" << "Timestamp" << _ts; + + m_ts = _ts; +} + + +void ExtWeather::readConfiguration() +{ + if (debug) qDebug() << PDEBUG; + + for (int i=m_dirs.count()-1; i>=0; i--) { + if (!QDir(m_dirs[i]).entryList(QDir::Files).contains(m_fileName)) continue; + QSettings settings(QString("%1/%2").arg(m_dirs[i]).arg(m_fileName), QSettings::IniFormat); + + settings.beginGroup(QString("Desktop Entry")); + setName(settings.value(QString("Name"), m_name).toString()); + setComment(settings.value(QString("Comment"), m_comment).toString()); + setApiVersion(settings.value(QString("X-AW-ApiVersion"), m_apiVersion).toInt()); + setCity(settings.value(QString("X-AW-City"), m_city).toString()); + setCountry(settings.value(QString("X-AW-Country"), m_country).toString()); + setTs(settings.value(QString("X-AW-TS"), m_ts).toInt()); + setActive(settings.value(QString("X-AW-Active"), QVariant(m_active)).toString() == QString("true")); + setInterval(settings.value(QString("X-AW-Interval"), m_interval).toInt()); + setNumber(settings.value(QString("X-AW-Number"), m_number).toInt()); + settings.endGroup(); + } + + // update for current API + if ((m_apiVersion > 0) && (m_apiVersion < AWEWAPI)) { + setApiVersion(AWEWAPI); + writeConfiguration(); + } +} + + +QVariantMap ExtWeather::run() +{ + if (debug) qDebug() << PDEBUG; + if ((!m_active) || (isRunning)) return values; + + if (times == 1) { + if (debug) qDebug() << PDEBUG << ":" << "Send request"; + isRunning = true; + QNetworkReply *reply = manager->get(QNetworkRequest(QUrl(url(m_ts != 0)))); + new QReplyTimeout(reply, 1000); + } + + // update value + if (times >= m_interval) times = 0; + times++; + + return values; +} + + +int ExtWeather::showConfiguration() +{ + if (debug) qDebug() << PDEBUG; + + ui->lineEdit_name->setText(m_name); + ui->lineEdit_comment->setText(m_comment); + ui->label_numberValue->setText(QString("%1").arg(m_number)); + ui->lineEdit_city->setText(m_city); + ui->lineEdit_country->setText(m_country); + ui->spinBox_timestamp->setValue(m_ts); + ui->checkBox_active->setCheckState(m_active ? Qt::Checked : Qt::Unchecked); + ui->spinBox_interval->setValue(m_interval); + + int ret = exec(); + if (ret != 1) return ret; + setName(ui->lineEdit_name->text()); + setComment(ui->lineEdit_comment->text()); + setNumber(ui->label_numberValue->text().toInt()); + setApiVersion(AWEWAPI); + setCity(ui->lineEdit_city->text()); + setCountry(ui->lineEdit_country->text()); + setTs(ui->spinBox_timestamp->value()); + setActive(ui->checkBox_active->checkState() == Qt::Checked); + setInterval(ui->spinBox_interval->value()); + + writeConfiguration(); + return ret; +} + + +bool ExtWeather::tryDelete() +{ + if (debug) qDebug() << PDEBUG; + + for (int i=0; ierror(); + if (debug) qDebug() << PDEBUG << ":" << "Reply error message" << reply->errorString(); + + isRunning = false; + QJsonParseError error; + QJsonDocument jsonDoc = QJsonDocument::fromJson(reply->readAll(), &error); + reply->deleteLater(); + if (debug) qDebug() << PDEBUG << ":" << "Json parse error" << error.errorString(); + if ((reply->error() != QNetworkReply::NoError) || + (error.error != QJsonParseError::NoError)) { + return; + } + + // convert to map + QVariantMap json = jsonDoc.toVariant().toMap(); + if (json[QString("cod")].toInt() != 200) { + if (debug) qDebug() << PDEBUG << ":" << "Invalid return code"; + return; + } + + QVariantMap data; + if (m_ts == 0) + data = parseSingleJson(json); + else { + QVariantList list = json[QString("list")].toList(); + data = parseSingleJson(list.count() <= m_ts ? list[m_ts-1].toMap() : list.last().toMap()); + } + for (int i=0; i 0) { + int _id = weather[0].toMap()[QString("id")].toInt(); + output[QString("weatherId")] = _id; + output[QString("weather")] = weatherFromInt(_id); + } + + // main data + QVariantMap mainWeather = json[QString("main")].toMap(); + if (weather.count() > 0) { + output[QString("humidity")] = mainWeather[QString("humidity")].toFloat(); + output[QString("pressure")] = mainWeather[QString("pressure")].toFloat(); + output[QString("temperature")] = mainWeather[QString("temp")].toFloat(); + } + + return output; +} + + +QString ExtWeather::url(const bool isForecast) +{ + if (debug) qDebug() << PDEBUG; + if (debug) qDebug() << PDEBUG << "Is forecast" << isForecast; + + QString apiUrl = isForecast ? QString(OWM_FORECAST_URL) : QString(OWM_URL); + apiUrl.replace(QString("$CITY"), m_city); + apiUrl.replace(QString("$COUNTRY"), m_country); + if (debug) qDebug() << PDEBUG << ":" << "API url" << apiUrl; + + return apiUrl; +} diff --git a/sources/extsysmon/extweather.h b/sources/extsysmon/extweather.h new file mode 100644 index 0000000..d968a3d --- /dev/null +++ b/sources/extsysmon/extweather.h @@ -0,0 +1,109 @@ +/*************************************************************************** + * 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/ * + ***************************************************************************/ + +#ifndef EXTWEATHER_H +#define EXTWEATHER_H + +#include +#include +#include + +#define OWM_URL "http://api.openweathermap.org/data/2.5/weather?q=$CITY,$COUNTRY&units=metric" +#define OWM_FORECAST_URL "http://api.openweathermap.org/data/2.5/forecast?q=$CITY,$COUNTRY&units=metric" + + +namespace Ui { + class ExtWeather; +} + +class ExtWeather : public QDialog +{ + Q_OBJECT + Q_PROPERTY(int apiVersion READ apiVersion WRITE setApiVersion) + Q_PROPERTY(QString name READ name WRITE setName) + Q_PROPERTY(QString comment READ comment WRITE setComment) + Q_PROPERTY(int interval READ interval WRITE setInterval) + Q_PROPERTY(bool active READ isActive WRITE setActive) + Q_PROPERTY(int number READ number WRITE setNumber) + Q_PROPERTY(QString city READ city WRITE setCity) + Q_PROPERTY(QString country READ country WRITE setCountry) + Q_PROPERTY(int ts READ ts WRITE setTs) + +public: + explicit ExtWeather(QWidget *parent = nullptr, const QString weatherName = QString(), + const QStringList directories = QStringList(), const bool debugCmd = false); + ~ExtWeather(); + QString weatherFromInt(const int _id); + // get methods + int apiVersion(); + QString comment(); + QString fileName(); + int interval(); + bool isActive(); + QString name(); + int number(); + QString tag(const QString _type = QString("temperature")); + QString city(); + QString country(); + int ts(); + // set methods + void setApiVersion(const int _apiVersion = 0); + void setActive(const bool _state = true); + void setComment(const QString _comment = QString("empty")); + void setInterval(const int _interval = 0); + void setName(const QString _name = QString("none")); + void setNumber(int _number = -1); + void setCity(const QString _city = QString("New York")); + void setCountry(const QString _country = QString("us")); + void setTs(const int _ts = 0); + +public slots: + void readConfiguration(); + QVariantMap run(); + int showConfiguration(); + bool tryDelete(); + void writeConfiguration(); + +private slots: + void weatherReplyReceived(QNetworkReply *reply); + +private: + QString m_fileName; + QStringList m_dirs; + bool debug; + QNetworkAccessManager *manager; + bool isRunning = false; + Ui::ExtWeather *ui; + QVariantMap parseSingleJson(const QVariantMap json); + QString url(const bool isForecast = false); + // properties + int m_apiVersion = 0; + bool m_active = true; + QString m_comment = QString("empty"); + int m_interval = 3600; + QString m_name = QString("none"); + int m_number = -1; + QString m_city = QString("New York"); + QString m_country = QString("us"); + int m_ts = 0; + // values + int times = 0; + QVariantMap values; +}; + + +#endif /* EXTWEATHER_H */ diff --git a/sources/extsysmon/extweather.ui b/sources/extsysmon/extweather.ui new file mode 100644 index 0000000..27f2bd0 --- /dev/null +++ b/sources/extsysmon/extweather.ui @@ -0,0 +1,271 @@ + + + ExtWeather + + + + 0 + 0 + 420 + 301 + + + + Configuration + + + + + + + + + 0 + 0 + + + + Name + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + + + 0 + 0 + + + + Comment + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + + Tag + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + + + + + + + 0 + 0 + + + + City + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + + + 0 + 0 + + + + Country + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + + Timestamp + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + 40 + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + Active + + + + + + + + + + + Interval + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + 1 + + + 10000 + + + 10 + + + 60 + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + ExtWeather + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + ExtWeather + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/sources/version.h.in b/sources/version.h.in index 027cb6b..6e40e3c 100644 --- a/sources/version.h.in +++ b/sources/version.h.in @@ -17,6 +17,8 @@ #define AWESAPI 3 // extupgrade api version #define AWEUAPI 2 +// extweather api version +#define AWEWAPI 1 // links #define HOMEPAGE "http://arcanis.name/projects/awesome-widgets/"