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"