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

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 "WikipediaModel.h"
0008 
0009 // Plugin
0010 #include "GeonamesParser.h"
0011 
0012 // Marble
0013 #include "GeoDataLatLonAltBox.h"
0014 #include "MarbleGlobal.h"
0015 #include "MarbleWidget.h"
0016 #include "MarbleModel.h"
0017 #include "MarbleDirs.h"
0018 #include "WikipediaItem.h"
0019 #include "MarbleLocale.h"
0020 #include "MarbleDebug.h"
0021 
0022 // Qt
0023 #include <QUrl>
0024 #include <QString>
0025 #include <QPainter>
0026 
0027 #include <QUrlQuery>
0028 
0029 using namespace Marble;
0030 
0031 WikipediaModel::WikipediaModel( const MarbleModel *marbleModel, QObject *parent )
0032     : AbstractDataPluginModel( "wikipedia", marbleModel, parent ),
0033       m_marbleWidget( nullptr ),
0034       m_wikipediaIcon(MarbleDirs::path(QStringLiteral("svg/wikipedia_shadow.svg"))),
0035       m_showThumbnail( true )
0036 {
0037     m_languageCode = MarbleLocale::languageCode();
0038 }
0039 
0040 WikipediaModel::~WikipediaModel()
0041 {
0042 }
0043 
0044 void WikipediaModel::setShowThumbnail( bool show )
0045 {
0046     m_showThumbnail = show;
0047 }
0048 
0049 void WikipediaModel::getAdditionalItems( const GeoDataLatLonAltBox& box,
0050                                          qint32 number )
0051 {
0052     // Geonames only supports wikipedia articles for earth
0053     if (marbleModel()->planetId() != QLatin1String("earth")) {
0054         return;
0055     }
0056         
0057     QUrl geonamesUrl( "http://api.geonames.org/wikipediaBoundingBox" );
0058     QUrlQuery urlQuery;
0059     urlQuery.addQueryItem( "north", QString::number( box.north( GeoDataCoordinates::Degree ) ) );
0060     urlQuery.addQueryItem( "south", QString::number( box.south( GeoDataCoordinates::Degree ) ) );
0061     urlQuery.addQueryItem( "east", QString::number( box.east( GeoDataCoordinates::Degree ) ) );
0062     urlQuery.addQueryItem( "west", QString::number( box.west( GeoDataCoordinates::Degree ) ) );
0063     urlQuery.addQueryItem( "maxRows", QString::number( number ) );
0064     urlQuery.addQueryItem( "lang", m_languageCode );
0065     urlQuery.addQueryItem( "username", "marble" );
0066     geonamesUrl.setQuery( urlQuery );
0067 
0068     downloadDescriptionFile( geonamesUrl );
0069 }
0070 
0071 void WikipediaModel::parseFile( const QByteArray& file )
0072 {
0073     QList<WikipediaItem*> list;
0074     GeonamesParser parser( m_marbleWidget, &list, this );
0075     
0076     parser.read( file );
0077     
0078     QList<AbstractDataPluginItem*> items;
0079     QList<WikipediaItem*>::const_iterator it;
0080     
0081     for ( it = list.constBegin(); it != list.constEnd(); ++it ) {
0082         if ( itemExists( (*it)->id() ) ) {
0083             delete *it;
0084             continue;
0085         }
0086 
0087         (*it)->setIcon( m_wikipediaIcon );
0088         QUrl thumbnailImageUrl = (*it)->thumbnailImageUrl();
0089         if ( m_showThumbnail && !thumbnailImageUrl.isEmpty() ) {
0090             downloadItem( thumbnailImageUrl, "thumbnail", *it );
0091         }
0092         else {
0093             items << *it;
0094         }
0095     }
0096 
0097     addItemsToList( items );
0098 }
0099 
0100 void WikipediaModel::setMarbleWidget(MarbleWidget *widget)
0101 {
0102     m_marbleWidget = widget;
0103 }
0104 
0105 #include "moc_WikipediaModel.cpp"