Weather plugin #38
@@ -1,9 +1,19 @@
|
|||||||
#include "weatherplugin.h"
|
#include "weatherplugin.h"
|
||||||
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
#include <QStatusBar>
|
||||||
|
|
||||||
|
#include "mainwindow.h"
|
||||||
|
|
||||||
|
#include "weatherwidget.h"
|
||||||
|
|
||||||
WeatherPlugin::WeatherPlugin(QObject *parent) :
|
WeatherPlugin::WeatherPlugin(QObject *parent) :
|
||||||
ZeiterfassungPlugin(parent)
|
ZeiterfassungPlugin(parent)
|
||||||
{
|
{
|
||||||
qDebug() << "called";
|
qDebug() << "called";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WeatherPlugin::attachTo(MainWindow &mainWindow)
|
||||||
|
{
|
||||||
|
mainWindow.statusBar()->addWidget(new WeatherWidget(mainWindow));
|
||||||
|
}
|
||||||
|
@@ -15,6 +15,7 @@ public:
|
|||||||
explicit WeatherPlugin(QObject *parent = Q_NULLPTR);
|
explicit WeatherPlugin(QObject *parent = Q_NULLPTR);
|
||||||
|
|
||||||
// ZeiterfassungPlugin interface
|
// ZeiterfassungPlugin interface
|
||||||
|
void attachTo(MainWindow &mainWindow) Q_DECL_OVERRIDE;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // WEATHERPLUGIN_H
|
#endif // WEATHERPLUGIN_H
|
||||||
|
@@ -14,8 +14,10 @@ DEPENDPATH += $$PWD/../../zeiterfassunglib
|
|||||||
|
|
||||||
DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT
|
DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT
|
||||||
|
|
||||||
HEADERS += weatherplugin.h
|
HEADERS += weatherplugin.h \
|
||||||
|
weatherwidget.h
|
||||||
|
|
||||||
SOURCES += weatherplugin.cpp
|
SOURCES += weatherplugin.cpp \
|
||||||
|
weatherwidget.cpp
|
||||||
|
|
||||||
OTHER_FILES += weatherplugin.json
|
OTHER_FILES += weatherplugin.json
|
||||||
|
92
plugins/weatherplugin/weatherwidget.cpp
Normal file
92
plugins/weatherplugin/weatherwidget.cpp
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
#include "weatherwidget.h"
|
||||||
|
|
||||||
|
#include <QNetworkAccessManager>
|
||||||
|
#include <QNetworkRequest>
|
||||||
|
#include <QUrl>
|
||||||
|
#include <QMessageBox>
|
||||||
|
#include <QStringBuilder>
|
||||||
|
#include <QJsonParseError>
|
||||||
|
#include <QJsonDocument>
|
||||||
|
#include <QJsonObject>
|
||||||
|
#include <QJsonValue>
|
||||||
|
#include <QJsonArray>
|
||||||
|
|
||||||
|
#include "mainwindow.h"
|
||||||
|
#include "zeiterfassungsettings.h"
|
||||||
|
#include "zeiterfassungapi.h"
|
||||||
|
|
||||||
|
WeatherWidget::WeatherWidget(MainWindow &mainWindow) :
|
||||||
|
QLabel(&mainWindow),
|
||||||
|
m_mainWindow(mainWindow)
|
||||||
|
{
|
||||||
|
setFrameShape(QFrame::Panel);
|
||||||
|
setFrameShadow(QFrame::Sunken);
|
||||||
|
|
||||||
|
connect(&m_mainWindow, &MainWindow::refreshEverything, this, &WeatherWidget::refresh);
|
||||||
|
|
||||||
|
refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
void WeatherWidget::refresh()
|
||||||
|
{
|
||||||
|
setText(tr("Loading..."));
|
||||||
|
|
||||||
|
auto url = m_mainWindow.settings().value(QStringLiteral("WeatherPlugin/url"),
|
||||||
|
QStringLiteral("http://api.openweathermap.org/data/2.5/weather?q=Graz,AT&units=metric&APPID=40f6c892c6162680c6c9235169dc9f83")).toString();
|
||||||
|
|
||||||
|
m_reply = std::unique_ptr<QNetworkReply>(m_mainWindow.erfassung().manager()->get(QNetworkRequest(QUrl(url))));
|
||||||
|
connect(m_reply.get(), &QNetworkReply::finished, this, &WeatherWidget::finished);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WeatherWidget::finished()
|
||||||
|
{
|
||||||
|
if(m_reply->error() != QNetworkReply::NoError)
|
||||||
|
{
|
||||||
|
qWarning() << m_reply->errorString();
|
||||||
|
setText(tr("Request failed"));
|
||||||
|
goto after;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
QJsonParseError error;
|
||||||
|
|
||||||
|
auto document = QJsonDocument::fromJson(m_reply->readAll(), &error);
|
||||||
|
if(error.error != QJsonParseError::NoError)
|
||||||
|
{
|
||||||
|
qWarning() << error.errorString();
|
||||||
|
setText(tr("Parsing failed"));
|
||||||
|
goto after;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!document.isObject())
|
||||||
|
{
|
||||||
|
setText(tr("Not an json obj"));
|
||||||
|
goto after;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto obj = document.object();
|
||||||
|
|
||||||
|
if(!obj.contains(QStringLiteral("weather")))
|
||||||
|
{
|
||||||
|
qWarning() << "no weather" << obj;
|
||||||
|
setText("No weater found");
|
||||||
|
goto after;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!obj.contains(QStringLiteral("main")))
|
||||||
|
{
|
||||||
|
qWarning() << "no main" << obj;
|
||||||
|
setText("No main found");
|
||||||
|
goto after;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto weaterObj = obj.value(QStringLiteral("weather")).toArray();
|
||||||
|
auto mainObj = obj.value(QStringLiteral("main")).toObject();
|
||||||
|
|
||||||
|
setText(tr("%0 (%1°C)").arg(weaterObj.first().toObject().value(QStringLiteral("main")).toString())
|
||||||
|
.arg(mainObj.value(QStringLiteral("temp")).toDouble()));
|
||||||
|
}
|
||||||
|
|
||||||
|
after:
|
||||||
|
m_reply = Q_NULLPTR;
|
||||||
|
}
|
28
plugins/weatherplugin/weatherwidget.h
Normal file
28
plugins/weatherplugin/weatherwidget.h
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
#ifndef WEATHERWIDGET_H
|
||||||
|
#define WEATHERWIDGET_H
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QNetworkReply>
|
||||||
|
|
||||||
|
class MainWindow;
|
||||||
|
|
||||||
|
class WeatherWidget : public QLabel
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit WeatherWidget(MainWindow &mainWindow);
|
||||||
|
|
||||||
|
private Q_SLOTS:
|
||||||
|
void refresh();
|
||||||
|
void finished();
|
||||||
|
|
||||||
|
private:
|
||||||
|
MainWindow &m_mainWindow;
|
||||||
|
|
||||||
|
std::unique_ptr<QNetworkReply> m_reply;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // WEATHERWIDGET_H
|
Reference in New Issue
Block a user