File indexing completed on 2024-05-12 15:31:21

0001 // SPDX-License-Identifier: LGPL-2.1-or-later
0002 //
0003 // SPDX-FileCopyrightText: 2009 Bastian Holst <bastianholst@gmx.de>
0004 //
0005 
0006 // Self
0007 #include "WeatherPlugin.h"
0008 
0009 // Marble
0010 #include "ui_WeatherConfigWidget.h"
0011 #include "WeatherData.h"
0012 #include "WeatherModel.h"
0013 #include "MarbleWidget.h"
0014 #include "MarbleDirs.h"
0015 #include "MarbleLocale.h"
0016 #include "MarbleGlobal.h"
0017 #include "weatherGlobal.h"
0018 #include "MarbleDebug.h"
0019 
0020 // Qt
0021 #include <QDialog>
0022 #include <QPushButton>
0023 
0024 using namespace Marble;
0025 /* TRANSLATOR Marble::WeatherPlugin */
0026 
0027 const quint32 numberOfStationsPerFetch = 20;
0028 
0029 WeatherPlugin::WeatherPlugin()
0030     : AbstractDataPlugin( nullptr ),
0031       m_configDialog( nullptr ),
0032       ui_configWidget( nullptr )
0033 {
0034 }
0035 
0036 WeatherPlugin::WeatherPlugin( const MarbleModel *marbleModel )
0037     : AbstractDataPlugin( marbleModel ),
0038       m_updateInterval( 0 ),
0039       m_icon(MarbleDirs::path(QStringLiteral("weather/weather-clear.png"))),
0040       m_configDialog( nullptr ),
0041       ui_configWidget( nullptr ),
0042       m_settings()
0043 {
0044     // Plugin is enabled by default
0045     setEnabled( true );
0046     // Plugin is not visible by default
0047     setVisible( false );
0048 
0049     connect( this, SIGNAL(settingsChanged(QString)),
0050              this, SLOT(updateItemSettings()) );
0051 
0052     setSettings( QHash<QString,QVariant>() );
0053 }
0054 
0055 WeatherPlugin::~WeatherPlugin()
0056 {
0057     delete m_configDialog;
0058     delete ui_configWidget;
0059 }
0060 
0061 void WeatherPlugin::initialize()
0062 {
0063     readSettings();
0064 
0065     WeatherModel *model = new WeatherModel( marbleModel(), this );
0066 
0067     setModel( model );
0068     updateSettings();
0069     updateItemSettings();
0070 }
0071 
0072 QString WeatherPlugin::name() const
0073 {
0074     return tr( "Weather" );
0075 }
0076 
0077 QString WeatherPlugin::guiString() const
0078 {
0079     return tr( "&Weather" );
0080 }
0081 
0082 QString WeatherPlugin::nameId() const
0083 {
0084     return QStringLiteral("weather");
0085 }
0086 
0087 QString WeatherPlugin::version() const
0088 {
0089     return QStringLiteral("1.1");
0090 }
0091 
0092 QString WeatherPlugin::description() const
0093 {
0094     return tr( "Download weather information from many weather stations all around the world" );
0095 }
0096 
0097 QString WeatherPlugin::copyrightYears() const
0098 {
0099     return QStringLiteral("2009, 2011");
0100 }
0101 
0102 QVector<PluginAuthor> WeatherPlugin::pluginAuthors() const
0103 {
0104     return QVector<PluginAuthor>()
0105             << PluginAuthor(QStringLiteral("Bastian Holst"), QStringLiteral("bastianholst@gmx.de"))
0106             << PluginAuthor(QStringLiteral("Valery Kharitonov"), QStringLiteral("kharvd@gmail.com"));
0107 }
0108 
0109 QString WeatherPlugin::aboutDataText() const
0110 {
0111     return tr( "Supported by backstage.bbc.co.uk.\nWeather data from UK MET Office" );
0112 }
0113 
0114 QIcon WeatherPlugin::icon() const
0115 {
0116     return m_icon;
0117 }
0118 
0119 QDialog *WeatherPlugin::configDialog()
0120 {
0121     if ( !m_configDialog ) {
0122         // Initializing configuration dialog
0123         m_configDialog = new QDialog();
0124         ui_configWidget = new Ui::WeatherConfigWidget;
0125         ui_configWidget->setupUi( m_configDialog );
0126         readSettings();
0127         connect( ui_configWidget->m_buttonBox, SIGNAL(accepted()),
0128                                               SLOT(writeSettings()) );
0129         connect( ui_configWidget->m_buttonBox, SIGNAL(rejected()),
0130                                               SLOT(readSettings()) );
0131         QPushButton *applyButton = ui_configWidget->m_buttonBox->button( QDialogButtonBox::Apply );
0132         connect( applyButton, SIGNAL(clicked()),
0133                  this,        SLOT(writeSettings()) );
0134     }
0135     return m_configDialog;
0136 }
0137 
0138 QHash<QString,QVariant> WeatherPlugin::settings() const
0139 {
0140     QHash<QString, QVariant> result = AbstractDataPlugin::settings();
0141 
0142     typedef QHash<QString, QVariant>::ConstIterator Iterator;
0143     Iterator end = m_settings.constEnd();
0144     for ( Iterator iter = m_settings.constBegin(); iter != end; ++iter ) {
0145         result.insert( iter.key(), iter.value() );
0146     }
0147 
0148     return result;
0149 }
0150 
0151 void WeatherPlugin::setSettings( const QHash<QString,QVariant> &settings )
0152 {
0153     AbstractDataPlugin::setSettings( settings );
0154 
0155     m_settings.insert(QStringLiteral("showCondition"), settings.value(QStringLiteral("showCondition"), showConditionDefault));
0156     m_settings.insert(QStringLiteral("showTemperature"), settings.value(QStringLiteral("showTemperature"), showTemperatureDefault));
0157     m_settings.insert(QStringLiteral("showWindDirection"), settings.value(QStringLiteral("showWindDirection"), showWindDirectionDefault));
0158     m_settings.insert(QStringLiteral("showWindSpeed"), settings.value(QStringLiteral("showWindSpeed"), showWindSpeedDefault));
0159 
0160     // Units
0161     // The default units depend on the global measure system.
0162     const MarbleLocale *locale = MarbleGlobal::getInstance()->locale();
0163 
0164     int temperatureUnit;
0165     if ( locale->measurementSystem() == MarbleLocale::MetricSystem ) {
0166         temperatureUnit = WeatherData::Celsius;
0167     }
0168     else {
0169         temperatureUnit = WeatherData::Fahrenheit;
0170     }
0171     m_settings.insert(QStringLiteral("temperatureUnit"), settings.value(QStringLiteral("temperatureUnit"), temperatureUnit));
0172 
0173     int windSpeedUnit;
0174     if ( locale->measurementSystem() == MarbleLocale::MetricSystem ) {
0175         windSpeedUnit = WeatherData::kph;
0176     }
0177     else {
0178         windSpeedUnit = WeatherData::mph;
0179     }
0180     m_settings.insert(QStringLiteral("windSpeedUnit"), settings.value(QStringLiteral("windSpeedUnit"), windSpeedUnit));
0181 
0182     int pressureUnit;
0183     if ( locale->measurementSystem() == MarbleLocale::MetricSystem ) {
0184         pressureUnit = WeatherData::HectoPascal;
0185     }
0186     else {
0187         pressureUnit = WeatherData::inchHg;
0188     }
0189     m_settings.insert(QStringLiteral("pressureUnit"), settings.value(QStringLiteral("pressureUnit"), pressureUnit));
0190 
0191     readSettings();
0192 
0193     emit settingsChanged( nameId() );
0194     updateSettings();
0195 }
0196 
0197 bool WeatherPlugin::eventFilter(QObject *object, QEvent *event)
0198 {
0199     if ( isInitialized() ) {
0200         WeatherModel *weatherModel = qobject_cast<WeatherModel*>( model() );
0201         Q_ASSERT(weatherModel);
0202         MarbleWidget* widget = qobject_cast<MarbleWidget*>( object );
0203         if ( widget ) {
0204             weatherModel->setMarbleWidget(widget);
0205         }
0206     }
0207 
0208     return AbstractDataPlugin::eventFilter( object, event );
0209 }
0210 
0211 void WeatherPlugin::readSettings()
0212 {
0213     if ( !m_configDialog ) {
0214         return;
0215     }
0216     
0217     // Information
0218     if (m_settings.value(QStringLiteral("showCondition")).toBool())
0219         ui_configWidget->m_weatherConditionBox->setCheckState( Qt::Checked );
0220     else
0221         ui_configWidget->m_weatherConditionBox->setCheckState( Qt::Unchecked );
0222 
0223     if (m_settings.value(QStringLiteral("showTemperature")).toBool())
0224         ui_configWidget->m_temperatureBox->setCheckState( Qt::Checked );
0225     else
0226         ui_configWidget->m_temperatureBox->setCheckState( Qt::Unchecked );
0227 
0228     if (m_settings.value(QStringLiteral("showWindDirection")).toBool())
0229         ui_configWidget->m_windDirectionBox->setCheckState( Qt::Checked );
0230     else
0231         ui_configWidget->m_windDirectionBox->setCheckState( Qt::Unchecked );
0232 
0233     if (m_settings.value(QStringLiteral("showWindSpeed")).toBool())
0234         ui_configWidget->m_windSpeedBox->setCheckState( Qt::Checked );
0235     else
0236         ui_configWidget->m_windSpeedBox->setCheckState( Qt::Unchecked );
0237 
0238     if (m_settings.value(QStringLiteral("onlyFavorites")).toBool())
0239         ui_configWidget->m_onlyFavoritesBox->setCheckState( Qt::Checked );
0240     else
0241         ui_configWidget->m_onlyFavoritesBox->setCheckState( Qt::Unchecked );
0242 
0243     // Units
0244     ui_configWidget->m_temperatureComboBox
0245         ->setCurrentIndex(m_settings.value(QStringLiteral("temperatureUnit")).toInt());
0246     
0247     ui_configWidget->m_windSpeedComboBox
0248         ->setCurrentIndex(m_settings.value(QStringLiteral("windSpeedUnit")).toInt());
0249 
0250     ui_configWidget->m_pressureComboBox
0251         ->setCurrentIndex(m_settings.value(QStringLiteral("pressureUnit")).toInt());
0252 
0253     // Misc
0254     ui_configWidget->m_updateIntervalBox
0255         ->setValue(m_settings.value(QStringLiteral("updateInterval"), 3).toInt());
0256 }
0257 
0258 void WeatherPlugin::writeSettings()
0259 {
0260     // Information
0261     m_settings.insert(QStringLiteral("showCondition"),
0262                        ui_configWidget->m_weatherConditionBox->checkState() == Qt::Checked );
0263     m_settings.insert(QStringLiteral("showTemperature"),
0264                        ui_configWidget->m_temperatureBox->checkState() == Qt::Checked );
0265     m_settings.insert(QStringLiteral("showWindDirection"),
0266                        ui_configWidget->m_windDirectionBox->checkState() == Qt::Checked );
0267     m_settings.insert(QStringLiteral("showWindSpeed"),
0268                        ui_configWidget->m_windSpeedBox->checkState() == Qt::Checked );
0269 
0270     // Units
0271     m_settings.insert(QStringLiteral("temperatureUnit"), ui_configWidget->m_temperatureComboBox->currentIndex());
0272     m_settings.insert(QStringLiteral("windSpeedUnit"), ui_configWidget->m_windSpeedComboBox->currentIndex());
0273     m_settings.insert(QStringLiteral("pressureUnit"), ui_configWidget->m_pressureComboBox->currentIndex());
0274 
0275     // Misc
0276     bool onlyFavorites = ( ui_configWidget->m_onlyFavoritesBox->checkState() == Qt::Checked );
0277     m_settings.insert(QStringLiteral("onlyFavorites"), onlyFavorites);
0278 
0279     m_updateInterval = ui_configWidget->m_updateIntervalBox->value();
0280     m_settings.insert(QStringLiteral("updateInterval"), m_updateInterval);
0281 
0282     emit settingsChanged( nameId() );
0283     updateSettings();
0284 }
0285 
0286 void WeatherPlugin::updateSettings()
0287 {
0288     if ( model() ) {
0289         bool favoritesOnly = m_settings.value(QStringLiteral("onlyFavorites"), false).toBool();
0290         QList<QString> favoriteItems = m_settings.value(QStringLiteral("favoriteItems")).toString()
0291                 .split(QLatin1Char(','), QString::SkipEmptyParts);
0292 
0293         model()->setFavoriteItems( favoriteItems );
0294         setNumberOfItems( favoritesOnly ? favoriteItems.size() : numberOfStationsPerFetch );
0295         model()->setFavoriteItemsOnly( favoritesOnly );
0296     }
0297 }
0298 
0299 void WeatherPlugin::updateItemSettings()
0300 {
0301     AbstractDataPluginModel *abstractModel = model();
0302     if( abstractModel != nullptr ) {
0303         abstractModel->setItemSettings( m_settings );
0304     }
0305 }
0306 
0307 void WeatherPlugin::favoriteItemsChanged( const QStringList& favoriteItems )
0308 {
0309     m_settings[QStringLiteral("favoriteItems")] = favoriteItems.join(QLatin1Char(','));
0310     emit settingsChanged( nameId() );
0311     updateSettings();
0312 }
0313 
0314 #include "moc_WeatherPlugin.cpp"