File indexing completed on 2024-05-05 17:34:02

0001 /*
0002  *   SPDX-FileCopyrightText: 2007-2009 Shawn Starr <shawn.starr@rogers.com>
0003  *   SPDX-FileCopyrightText: 2008 Marco Martin <notmart@gmail.com>
0004  *   SPDX-FileCopyrightText: 2012 Luís Gabriel Lima <lampih@gmail.com>
0005  *   SPDX-FileCopyrightText: 2017-2018 Friedrich W. H. Kossebau <kossebau@kde.org>
0006  *   SPDX-FileCopyrightText: 2022 Ismael Asensio <isma.af@gmail.com>
0007  *
0008  *   SPDX-License-Identifier: GPL-2.0-or-later
0009  */
0010 
0011 #include "weatherapplet.h"
0012 
0013 #include <Plasma/DataContainer>
0014 #include <Plasma/DataEngine>
0015 
0016 // KF
0017 #include <KConfigGroup>
0018 #include <KLocalizedString>
0019 #include <KUnitConversion/Value>
0020 
0021 using namespace KUnitConversion;
0022 
0023 WeatherApplet::WeatherApplet(QObject *parent, const KPluginMetaData &data, const QVariantList &args)
0024     : Plasma::Applet(parent, data, args)
0025 {
0026     Plasma::DataEngine *dataengine = dataEngine(QStringLiteral("weather"));
0027     const QVariantList plugins = dataengine->containerForSource(QLatin1String("ions"))->data().values();
0028     for (const QVariant &plugin : plugins) {
0029         const QStringList pluginInfo = plugin.toString().split(QLatin1Char('|'));
0030         if (pluginInfo.count() > 1) {
0031             m_providers[pluginInfo[1]] = pluginInfo[0];
0032         }
0033     }
0034     Q_EMIT providersChanged();
0035 }
0036 
0037 WeatherApplet::~WeatherApplet()
0038 {
0039 }
0040 
0041 void WeatherApplet::init()
0042 {
0043     migrateConfig();
0044     setDefaultUnits();
0045 }
0046 
0047 // Old configuration was stored via config() and without further config sub group
0048 // [Containments][18][Applets][101][Configuration]
0049 // main.xml based config storage though uses additional subgroups using the name attribute of
0050 // the <group> containers, so e.g. <group name="General"> would use
0051 // [Containments][18][Applets][101][Configuration][General]
0052 void WeatherApplet::migrateConfig()
0053 {
0054     KConfigGroup oldCfg = config();
0055 
0056     const bool isConfigMigrated = oldCfg.readEntry(QStringLiteral("configMigrated"), false);
0057     if (isConfigMigrated) {
0058         return;
0059     }
0060 
0061     const QString pluginId = pluginMetaData().pluginId();
0062 
0063     auto migrateKey = [&oldCfg, pluginId](const QString &key, const QString &group) {
0064         if (oldCfg.hasKey(key)) {
0065             qInfo() << pluginId << ": Moving config key" << key << "to group" << group;
0066             KConfigGroup newCfg = KConfigGroup(&oldCfg, group);
0067             const auto value = oldCfg.readEntry(key);
0068             newCfg.writeEntry(key, value);
0069             oldCfg.deleteEntry(key);
0070         }
0071     };
0072 
0073     qInfo() << pluginId << ": Migrate settings to plasma XML config";
0074 
0075     // Appearance
0076     migrateKey(QStringLiteral("showTemperatureInTooltip"), QStringLiteral("Appearance"));
0077     migrateKey(QStringLiteral("showWindInTooltip"), QStringLiteral("Appearance"));
0078     migrateKey(QStringLiteral("showPressureInTooltip"), QStringLiteral("Appearance"));
0079     migrateKey(QStringLiteral("showHumidityInTooltip"), QStringLiteral("Appearance"));
0080     migrateKey(QStringLiteral("showTemperatureInCompactMode"), QStringLiteral("Appearance"));
0081     // Units
0082     migrateKey(QStringLiteral("temperatureUnit"), QStringLiteral("Units"));
0083     migrateKey(QStringLiteral("speedUnit"), QStringLiteral("Units"));
0084     migrateKey(QStringLiteral("pressureUnit"), QStringLiteral("Units"));
0085     migrateKey(QStringLiteral("visibilityUnit"), QStringLiteral("Units"));
0086     // WeatherSource
0087     migrateKey(QStringLiteral("updateInterval"), QStringLiteral("WeatherStation"));
0088     migrateKey(QStringLiteral("source"), QStringLiteral("WeatherStation"));
0089 
0090     oldCfg.writeEntry(QStringLiteral("configMigrated"), true);
0091 }
0092 
0093 // Plasma XML configuration is loaded at runtime, so it's not possible to set locale aware defaults.
0094 // We set them here if the corresponding key is not already in the configuration
0095 void WeatherApplet::setDefaultUnits()
0096 {
0097     KConfigGroup cfg = config().group(QStringLiteral("Units"));
0098     const bool isMetric = (QLocale().measurementSystem() == QLocale::MetricSystem);
0099 
0100     auto setLocaleAwareDefault = [&cfg, isMetric](const QString &key, KUnitConversion::UnitId metricDefault, KUnitConversion::UnitId imperialDefault) {
0101         if (!cfg.hasKey(key)) {
0102             cfg.writeEntry(key, static_cast<int>(isMetric ? metricDefault : imperialDefault));
0103         }
0104     };
0105 
0106     setLocaleAwareDefault(QStringLiteral("temperatureUnit"), KUnitConversion::Celsius, KUnitConversion::Fahrenheit);
0107     setLocaleAwareDefault(QStringLiteral("speedUnit"), KUnitConversion::MeterPerSecond, KUnitConversion::MilePerHour);
0108     setLocaleAwareDefault(QStringLiteral("pressureUnit"), KUnitConversion::Hectopascal, KUnitConversion::InchesOfMercury);
0109     setLocaleAwareDefault(QStringLiteral("visibilityUnit"), KUnitConversion::Kilometer, KUnitConversion::Mile);
0110 }
0111 
0112 K_PLUGIN_CLASS(WeatherApplet)
0113 
0114 #include "weatherapplet.moc"