mirror of
https://github.com/arcan1s/awesome-widgets.git
synced 2025-04-24 23:47:20 +00:00
I suppose the better way is to move weather adaptor to another open weather engine despite the fact that OWM has provided me a special FOSS permissions. I've changed weather provider to Yahoo! Weather because there is no good way to provide my own API key to end-users except for being compiled to the source code. In other hand this solution leads to the fact that humidity and atmosphere pressure is not available for forecast more. And moreover pressure units has been changed for current weather. + fix possible memory leak in dataengine aggregator + add "special thanks" group to acknoledgment tab
266 lines
9.9 KiB
C++
266 lines
9.9 KiB
C++
/***************************************************************************
|
|
* 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 "awactions.h"
|
|
|
|
#include <KI18n/KLocalizedString>
|
|
#include <KNotifications/KNotification>
|
|
|
|
#include <QDesktopServices>
|
|
#include <QJsonDocument>
|
|
#include <QJsonParseError>
|
|
#include <QMessageBox>
|
|
#include <QNetworkAccessManager>
|
|
#include <QNetworkRequest>
|
|
#include <QNetworkReply>
|
|
#include <QProcess>
|
|
#include <QProcessEnvironment>
|
|
#include <QStandardPaths>
|
|
|
|
#include <fontdialog/fontdialog.h>
|
|
|
|
#include "awdebug.h"
|
|
#include "version.h"
|
|
|
|
|
|
AWActions::AWActions(QObject *parent)
|
|
: QObject(parent)
|
|
{
|
|
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
|
|
}
|
|
|
|
|
|
AWActions::~AWActions()
|
|
{
|
|
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
|
|
}
|
|
|
|
|
|
void AWActions::checkUpdates(const bool showAnyway)
|
|
{
|
|
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(nullptr);
|
|
connect(manager, &QNetworkAccessManager::finished,
|
|
[showAnyway, this](QNetworkReply *reply) {
|
|
return versionReplyRecieved(reply, showAnyway);
|
|
});
|
|
|
|
manager->get(QNetworkRequest(QUrl(VERSION_API)));
|
|
}
|
|
|
|
|
|
// HACK: since QML could not use QLoggingCategory I need this hack
|
|
bool AWActions::isDebugEnabled() const
|
|
{
|
|
return LOG_AW().isDebugEnabled();
|
|
}
|
|
|
|
|
|
bool AWActions::runCmd(const QString cmd) const
|
|
{
|
|
qCDebug(LOG_AW) << "Cmd" << cmd;
|
|
|
|
sendNotification(QString("Info"), i18n("Run %1", cmd));
|
|
|
|
return QProcess::startDetached(cmd);
|
|
}
|
|
|
|
|
|
// HACK: this method uses variable from version.h
|
|
void AWActions::showReadme() const
|
|
{
|
|
QDesktopServices::openUrl(QString(HOMEPAGE));
|
|
}
|
|
|
|
|
|
// HACK: this method uses variables from version.h
|
|
QString AWActions::getAboutText(const QString type) const
|
|
{
|
|
qCDebug(LOG_AW) << "Type" << type;
|
|
|
|
QString text;
|
|
if (type == QString("header")) {
|
|
text = QString(NAME);
|
|
} else if (type == QString("version")) {
|
|
text = i18n("Version %1 (build date %2)", QString(VERSION),
|
|
QString(BUILD_DATE));
|
|
if (!QString(COMMIT_SHA).isEmpty())
|
|
text += QString(" (%1)").arg(QString(COMMIT_SHA));
|
|
} else if (type == QString("description")) {
|
|
text = i18n("A set of minimalistic plasmoid widgets");
|
|
} else if (type == QString("links")) {
|
|
text = i18n("Links:") + QString("<br>")
|
|
+ QString("<a href=\"%1\">%2</a><br>")
|
|
.arg(QString(HOMEPAGE))
|
|
.arg(i18n("Homepage"))
|
|
+ QString("<a href=\"%1\">%2</a><br>")
|
|
.arg(QString(REPOSITORY))
|
|
.arg(i18n("Repository"))
|
|
+ QString("<a href=\"%1\">%2</a><br>")
|
|
.arg(QString(BUGTRACKER))
|
|
.arg(i18n("Bugtracker"))
|
|
+ QString("<a href=\"%1\">%2</a><br>")
|
|
.arg(QString(TRANSLATION))
|
|
.arg(i18n("Translation issue"))
|
|
+ QString("<a href=\"%1\">%2</a><br>")
|
|
.arg(QString(AUR_PACKAGES))
|
|
.arg(i18n("AUR packages"))
|
|
+ QString("<a href=\"%1\">%2</a>")
|
|
.arg(QString(OPENSUSE_PACKAGES))
|
|
.arg(i18n("openSUSE packages"));
|
|
} else if (type == QString("copy")) {
|
|
text = QString("<small>© %1 <a href=\"mailto:%2\">%3</a><br>")
|
|
.arg(QString(DATE))
|
|
.arg(QString(EMAIL))
|
|
.arg(QString(AUTHOR))
|
|
+ i18n("This software is licensed under %1", QString(LICENSE))
|
|
+ QString("</small>");
|
|
} else if (type == QString("translators")) {
|
|
text = i18n("Translators: %1", QString(TRANSLATORS));
|
|
} else if (type == QString("3rdparty")) {
|
|
QStringList trdPartyList
|
|
= QString(TRDPARTY_LICENSE)
|
|
.split(QChar(';'), QString::SkipEmptyParts);
|
|
for (int i = 0; i < trdPartyList.count(); i++)
|
|
trdPartyList[i] = QString("<a href=\"%3\">%1</a> (%2 license)")
|
|
.arg(trdPartyList.at(i).split(QChar(','))[0])
|
|
.arg(trdPartyList.at(i).split(QChar(','))[1])
|
|
.arg(trdPartyList.at(i).split(QChar(','))[2]);
|
|
text = i18n("This software uses: %1", trdPartyList.join(QString(", ")));
|
|
} else if (type == QString("thanks")) {
|
|
QStringList thanks = QString(SPECIAL_THANKS)
|
|
.split(QChar(';'), QString::SkipEmptyParts);
|
|
for (int i = 0; i < thanks.count(); i++)
|
|
thanks[i] = QString("<a href=\"%2\">%1</a>")
|
|
.arg(thanks.at(i).split(QChar(','))[0])
|
|
.arg(thanks.at(i).split(QChar(','))[1]);
|
|
text = i18n("Special thanks to %1", thanks.join(QString(", ")));
|
|
}
|
|
|
|
return text;
|
|
}
|
|
|
|
|
|
QVariantMap AWActions::getFont(const QVariantMap defaultFont) const
|
|
{
|
|
qCDebug(LOG_AW) << "Default font is" << defaultFont;
|
|
|
|
QVariantMap fontMap;
|
|
CFont defaultCFont = CFont(defaultFont[QString("family")].toString(),
|
|
defaultFont[QString("size")].toInt(), 400, false,
|
|
defaultFont[QString("color")].toString());
|
|
CFont font
|
|
= CFontDialog::getFont(i18n("Select font"), defaultCFont, false, false);
|
|
fontMap[QString("color")] = font.color().name();
|
|
fontMap[QString("family")] = font.family();
|
|
fontMap[QString("size")] = font.pointSize();
|
|
|
|
return fontMap;
|
|
}
|
|
|
|
|
|
// to avoid additional object definition this method is static
|
|
void AWActions::sendNotification(const QString eventId, const QString message)
|
|
{
|
|
qCDebug(LOG_AW) << "Event" << eventId;
|
|
qCDebug(LOG_AW) << "Message" << message;
|
|
|
|
KNotification *notification = KNotification::event(
|
|
eventId, QString("Awesome Widget ::: %1").arg(eventId), message);
|
|
notification->setComponentName(
|
|
QString("plasma-applet-org.kde.plasma.awesome-widget"));
|
|
}
|
|
|
|
|
|
void AWActions::showInfo(const QString version) const
|
|
{
|
|
qCDebug(LOG_AW) << "Version" << version;
|
|
|
|
QString text = i18n("You are using the actual version %1", version);
|
|
if (!QString(COMMIT_SHA).isEmpty())
|
|
text += QString(" (%1)").arg(QString(COMMIT_SHA));
|
|
QMessageBox::information(nullptr, i18n("No new version found"), text);
|
|
}
|
|
|
|
|
|
void AWActions::showUpdates(const QString version) const
|
|
{
|
|
qCDebug(LOG_AW) << "Version" << version;
|
|
|
|
QString text;
|
|
text += i18n("Current version : %1", QString(VERSION));
|
|
text += QString(COMMIT_SHA).isEmpty()
|
|
? QString("\n")
|
|
: QString(" (%1)\n").arg(QString(COMMIT_SHA));
|
|
text += i18n("New version : %1", version) + QString("\n\n");
|
|
text += i18n("Click \"Ok\" to download");
|
|
|
|
int select
|
|
= QMessageBox::information(nullptr, i18n("There are updates"), text,
|
|
QMessageBox::Ok | QMessageBox::Cancel);
|
|
switch (select) {
|
|
case QMessageBox::Ok:
|
|
QDesktopServices::openUrl(QString(RELEASES) + version);
|
|
break;
|
|
case QMessageBox::Cancel:
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
void AWActions::versionReplyRecieved(QNetworkReply *reply,
|
|
const bool showAnyway) const
|
|
{
|
|
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);
|
|
reply->deleteLater();
|
|
if ((reply->error() != QNetworkReply::NoError)
|
|
|| (error.error != QJsonParseError::NoError)) {
|
|
qCWarning(LOG_AW) << "Parse error" << error.errorString();
|
|
return;
|
|
}
|
|
|
|
// convert to map
|
|
QVariantMap firstRelease = jsonDoc.toVariant().toList().first().toMap();
|
|
QString version = firstRelease[QString("tag_name")].toString();
|
|
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();
|
|
int new_major = QString(version).split(QChar('.')).at(0).toInt();
|
|
int new_minor = QString(version).split(QChar('.')).at(1).toInt();
|
|
int new_patch = QString(version).split(QChar('.')).at(2).toInt();
|
|
if ((old_major < new_major)
|
|
|| ((old_major == new_major) && (old_minor < new_minor))
|
|
|| ((old_major == new_major) && (old_minor == new_minor)
|
|
&& (old_patch < new_patch)))
|
|
return showUpdates(version);
|
|
else if (showAnyway)
|
|
return showInfo(version);
|
|
}
|