TARGET = notificationswatchlet
TEMPLATE = lib
CONFIG += plugin
SOURCES += notificationswatchletplugin.cpp notificationswatchlet.cpp
HEADERS += notificationswatchletplugin.h notificationswatchlet.h
qml_files.files = metawatch-digital.qml icon.png
win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../libsowatch/release/ -lsowatch
else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../libsowatch/debug/ -lsowatch
pre { line-height: 125%; margin: 0; }
td.linenos pre { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
span.linenos { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
td.linenos pre.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */#include "harmaccuweather.h"
using namespace sowatch;
#define ACCUWEATHER_FILE_PATH "/home/user/.config/AccuWeather, Inc./awxapp.conf"
HarmAccuWeather::HarmAccuWeather(QObject *parent) :
WeatherNotification(parent),
_watcher(new QFileSystemWatcher(this)),
_timer(new QTimer(this)),
_lastUpdate(QDateTime::fromTime_t(0))
{
// This only works on Harmattan either way, so I guess
// hardcoding the path is OK.
_watcher->addPath(ACCUWEATHER_FILE_PATH);
connect(_watcher, SIGNAL(fileChanged(QString)), SLOT(fileChanged(QString)));
_timer->setInterval(5000);
_timer->setSingleShot(true);
connect(_timer, SIGNAL(timeout()), SLOT(update()));
// Perform an initial update
update();
}
QSettings* HarmAccuWeather::getAccuweatherData()
{
return new QSettings(ACCUWEATHER_FILE_PATH, QSettings::IniFormat);
}
Notification::Type HarmAccuWeather::type() const
{
return Notification::WeatherNotification;
}
uint HarmAccuWeather::count() const
{
return 1;
}
QDateTime HarmAccuWeather::dateTime() const
{
return _lastUpdate;
}
QString HarmAccuWeather::title() const
{
return _lastLocation;
}
QString HarmAccuWeather::body() const
{
switch (_lastWxCode) {
case 1:
case 2:
return tr("Sunny");
case 3:
case 4:
case 5:
return tr("Partly cloudy");
case 6:
return tr("Mostly cloudy");
case 7:
case 8:
return tr("Cloudy");
case 11:
return tr("Fog");
case 12:
return tr("Light rain");
case 13:
case 14:
return tr("Light rain with sun");
case 18:
case 26:
return tr("Heavy rain");
case 15:
case 16:
return tr("Thunderstorm");
case 17:
return tr("Thunderstorm with sun");
case 19:
return tr("Light snow");
case 20:
case 21:
return tr("Light snow with sun");
case 22:
return tr("Heavy snow");
case 29:
return tr("Heavy rain and snow");
case 25:
return tr("Blizzard");
case 30:
return tr("Hot");
case 31:
return tr("Cold");
case 32:
return tr("Wind");
// Night versions
case 33:
case 34:
return tr("Clear");
case 35:
return tr("Partly cloudy");
case 36:
case 37:
return tr("Mostly cloudy");
case 38:
return tr("Cloudy");
case 39:
case 40:
return tr("Light rain");
case 41:
case 42:
return tr("Thunderstorm");
case 43:
return tr("Light snow");
case 44:
return tr("Heavy snow");
default:
return QString("? %1").arg(_lastWxCode);
}
}
WeatherNotification::WeatherType HarmAccuWeather::forecast()
{
switch (_lastWxCode) {
case 1:
case 2:
return Sunny;
case 3:
case 4:
case 5:
return PartlyCloudy;
case 6:
case 7:
case 8:
return Cloudy;
case 11:
return Fog;
case 12:
case 13:
case 14:
case 18:
case 26:
return Rain;
case 15:
case 16:
case 17:
return Thunderstorm;
case 19:
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 29:
return Snow;
// Night versions
case 33:
case 34:
return Sunny;
case 35:
return PartlyCloudy;
case 36:
case 37:
case 38:
return Cloudy;
case 39:
case 40:
return Rain;
case 41:
case 42:
return Thunderstorm;
case 43:
case 44:
return Snow;
default:
return UnknownWeather;
}
}
int HarmAccuWeather::temperature()
{
return _lastTemp;
}
WeatherNotification::Unit HarmAccuWeather::temperatureUnits()
{
return _metric ? Celsius : Fahrenheit;
}
void HarmAccuWeather::activate()
{
// Launch accuweather?
}
void HarmAccuWeather::dismiss()
{
// Do nothing
}
void HarmAccuWeather::fileChanged(const QString &path)
{
Q_UNUSED(path);
qDebug() << "accuweather config file changed";
_timer->start();
}
void HarmAccuWeather::update()
{
QSettings* s = getAccuweatherData();
qDebug() << "reading accuweather config file";
QDateTime lastUpdate = s->value("LastUpdate").toDateTime();
if (lastUpdate > _lastUpdate) {
_lastUpdate = lastUpdate;
bool anythingChanged = false;
qDebug() << "reading weather info at" << _lastUpdate;
bool useMetric = s->value("useMetric").toBool();
if (useMetric != _metric) {
_metric = useMetric;
anythingChanged = true;
}
int temp = s->value("LastTemp").toInt();
if (_lastTemp != temp) {
_lastTemp = temp;
anythingChanged = true;
}
QString location = s->value("LastLocation").toString();
if (_lastLocation != location) {
_lastLocation = location;
anythingChanged = true;
}
int wxCode = s->value("LastWxCode").toInt();
if (_lastWxCode != wxCode) {
_lastWxCode = wxCode;
anythingChanged = true;
}
if (anythingChanged) {
qDebug() << "weather info changed wxcode=" << wxCode;
emit changed();
}
}
delete s;
}