File indexing completed on 2024-05-19 11:32:00
0001 // SPDX-License-Identifier: LGPL-2.1-or-later 0002 // 0003 // SPDX-FileCopyrightText: 2010 Utku Aydın <utkuaydin34@gmail.com> 0004 // SPDX-FileCopyrightText: 2012 Illya Kovalevskyy <illya.kovalevskyy@gmail.com> 0005 // 0006 0007 0008 #include "OpenDesktopModel.h" 0009 #include "OpenDesktopItem.h" 0010 #include "MarbleGlobal.h" 0011 #include "MarbleModel.h" 0012 #include "GeoDataLatLonAltBox.h" 0013 #include "GeoDataCoordinates.h" 0014 #include <QString> 0015 #include <QUrl> 0016 #include <QJsonDocument> 0017 #include <QJsonArray> 0018 #include <QJsonObject> 0019 0020 using namespace Marble; 0021 0022 0023 OpenDesktopModel::OpenDesktopModel( const MarbleModel *marbleModel, QObject *parent ) 0024 : AbstractDataPluginModel( "opendesktop", marbleModel, parent ) 0025 { 0026 // Nothing to do... 0027 } 0028 0029 OpenDesktopModel::~OpenDesktopModel() 0030 { 0031 // Nothing to do... 0032 } 0033 0034 void OpenDesktopModel::setMarbleWidget(MarbleWidget *widget) 0035 { 0036 m_marbleWidget = widget; 0037 } 0038 0039 void OpenDesktopModel::getAdditionalItems( const GeoDataLatLonAltBox& box, qint32 number ) 0040 { 0041 Q_UNUSED( number ) 0042 0043 if (marbleModel()->planetId() != QLatin1String("earth")) { 0044 return; 0045 } 0046 0047 GeoDataCoordinates coords = box.center(); 0048 0049 const QString openDesktopUrl(QLatin1String("http://api.opendesktop.org/v1/person/data") + 0050 QLatin1String("?latitude=") + QString::number(coords.latitude() * RAD2DEG) + 0051 QLatin1String("&longitude=") + QString::number(coords.longitude() * RAD2DEG) + 0052 QLatin1String("&format=json")); 0053 0054 downloadDescriptionFile( QUrl( openDesktopUrl ) ); 0055 } 0056 0057 void OpenDesktopModel::parseFile( const QByteArray& file ) 0058 { 0059 QJsonDocument jsonDoc = QJsonDocument::fromJson(file); 0060 QJsonValue dataValue = jsonDoc.object().value(QStringLiteral("data")); 0061 0062 // Parse if any result exists 0063 if (dataValue.isArray()) { 0064 // Add items to the list 0065 QList<AbstractDataPluginItem*> items; 0066 0067 QJsonArray dataArray = dataValue.toArray(); 0068 for (int index = 0; index < dataArray.size(); ++index) { 0069 QJsonObject dataObject = dataArray[index].toObject(); 0070 0071 // Convert profile's properties from JSON to appropriate types 0072 const QString personid = dataObject.value(QStringLiteral("personid")).toString(); 0073 const QString firstName = dataObject.value(QStringLiteral("firstname")).toString(); 0074 const QString lastName = dataObject.value(QStringLiteral("lastname")).toString(); 0075 const QString city = dataObject.value(QStringLiteral("city")).toString(); 0076 const QString country = dataObject.value(QStringLiteral("country")).toString(); 0077 const QString role = dataObject.value(QStringLiteral("communityrole")).toString(); 0078 const double longitude = dataObject.value(QStringLiteral("longitude")).toDouble(); 0079 const double latitude = dataObject.value(QStringLiteral("latitude")).toDouble(); 0080 const QUrl avatarUrl(dataObject.value(QStringLiteral("avatarpic")).toString()); 0081 0082 if( !itemExists( personid ) ) 0083 { 0084 // If it does not exists, create it 0085 GeoDataCoordinates coor(longitude * DEG2RAD, latitude * DEG2RAD); 0086 OpenDesktopItem *item = new OpenDesktopItem( this ); 0087 item->setMarbleWidget(m_marbleWidget); 0088 item->setId( personid ); 0089 item->setCoordinate( coor ); 0090 item->setFullName(firstName + QLatin1Char(' ') + lastName); 0091 item->setLocation(city + QLatin1String(", ") + country); 0092 item->setRole( !role.isEmpty() ? role : QString( "nothing" ) ); 0093 downloadItem( avatarUrl, "avatar", item ); 0094 items << item; 0095 } 0096 } 0097 0098 addItemsToList( items ); 0099 } 0100 } 0101 0102 #include "moc_OpenDesktopModel.cpp"