File indexing completed on 2024-05-05 03:49:18

0001 // SPDX-License-Identifier: LGPL-2.1-or-later
0002 //
0003 // SPDX-FileCopyrightText: 2012 Dennis Nienhüser <nienhueser@kde.org>
0004 //
0005 
0006 #include "OfflineDataModel.h"
0007 #include "MarbleDirs.h"
0008 
0009 #include <QModelIndex>
0010 #include <QDir>
0011 
0012 OfflineDataModel::OfflineDataModel( QObject *parent ) : QSortFilterProxyModel( parent ),
0013     m_vehicleTypeFilter( Any )
0014 {
0015     m_newstuffModel.setTargetDirectory(Marble::MarbleDirs::localPath() + QLatin1String("/maps"));
0016     m_newstuffModel.setRegistryFile( QDir::homePath() + "/.kde/share/apps/knewstuff3/marble-offline-data.knsregistry", Marble::NewstuffModel::NameTag );
0017     m_newstuffModel.setProvider( "http://files.kde.org/marble/newstuff/maps-monav.xml" );
0018 
0019     setSourceModel( &m_newstuffModel );
0020     QHash<int,QByteArray> roleNames = m_newstuffModel.roleNames();
0021     roleNames[Qt::UserRole+17] = "continent";
0022     m_roleNames = roleNames;
0023 
0024     sort( 0 );
0025     setDynamicSortFilter( true );
0026 
0027     connect( &m_newstuffModel, SIGNAL(installationProgressed(int,qreal)), this, SLOT(handleInstallationProgress(int,qreal)) );
0028     connect( &m_newstuffModel, SIGNAL(installationFinished(int)), this, SLOT(handleInstallationFinished(int)) );
0029     connect( &m_newstuffModel, SIGNAL(installationFailed(int,QString)), this, SLOT(handleInstallationFailed(int,QString)) );
0030     connect( &m_newstuffModel, SIGNAL(uninstallationFinished(int)), this, SLOT(handleUninstallationFinished(int)) );
0031 }
0032 
0033 int OfflineDataModel::count() const
0034 {
0035     return rowCount();
0036 }
0037 
0038 QHash<int, QByteArray> OfflineDataModel::roleNames() const
0039 {
0040     return m_roleNames;
0041 }
0042 
0043 QVariant OfflineDataModel::data(const QModelIndex &index, int role) const
0044 {
0045     if ( index.isValid() && index.row() >= 0 && index.row() < rowCount() && role == Qt::DisplayRole ) {
0046         QStringList const data = QSortFilterProxyModel::data(index, role).toString().split(QLatin1Char('/'));
0047         if ( data.size() > 1 ) {
0048             QString result = data.at( 1 );
0049             for ( int i=2; i<data.size(); ++i ) {
0050                 result += QLatin1String(" / ") + data.at(i);
0051             }
0052             result.remove( QLatin1String( " (Motorcar)" ) );
0053             result.remove( QLatin1String( " (Pedestrian)" ) );
0054             result.remove( QLatin1String( " (Bicycle)" ) );
0055             return result.trimmed();
0056         }
0057     }
0058 
0059     if ( index.isValid() && index.row() >= 0 && index.row() < rowCount() && role == Qt::UserRole+17 ) {
0060         QStringList const data = QSortFilterProxyModel::data(index, Qt::DisplayRole).toString().split(QLatin1Char('/'));
0061         if ( data.size() > 1 ) {
0062             return data.first().trimmed();
0063         }
0064     }
0065 
0066     return QSortFilterProxyModel::data( index, role );
0067 }
0068 
0069 void OfflineDataModel::setVehicleTypeFilter( VehicleTypes filter )
0070 {
0071     m_vehicleTypeFilter = filter;
0072     beginResetModel();
0073     endResetModel();
0074 }
0075 
0076 void OfflineDataModel::install( int index )
0077 {
0078     m_newstuffModel.install( toSource( index ) );
0079 }
0080 
0081 void OfflineDataModel::uninstall( int index )
0082 {
0083     m_newstuffModel.uninstall( toSource( index ) );
0084 }
0085 
0086 void OfflineDataModel::cancel( int index )
0087 {
0088     m_newstuffModel.cancel( toSource( index ) );
0089 }
0090 
0091 int OfflineDataModel::fromSource( int index ) const
0092 {
0093     return mapFromSource( m_newstuffModel.index( index ) ).row();
0094 }
0095 
0096 int OfflineDataModel::toSource(int idx) const
0097 {
0098     return mapToSource( index( idx, 0 ) ).row();
0099 }
0100 
0101 void OfflineDataModel::handleInstallationProgress( int index, qreal progress )
0102 {
0103     emit installationProgressed( fromSource( index ), progress );
0104 }
0105 
0106 void OfflineDataModel::handleInstallationFinished( int index )
0107 {
0108     emit installationFinished( fromSource( index ) );
0109 }
0110 
0111 void OfflineDataModel::handleInstallationFailed( int index, const QString &error )
0112 {
0113     emit installationFailed( fromSource( index ), error );
0114 }
0115 
0116 void OfflineDataModel::handleUninstallationFinished( int index )
0117 {
0118     emit uninstallationFinished( fromSource( index ) );
0119 }
0120 
0121 bool OfflineDataModel::filterAcceptsRow( int source_row, const QModelIndex &source_parent ) const
0122 {
0123     if ( QSortFilterProxyModel::filterAcceptsRow( source_row, source_parent ) ) {
0124         QModelIndex const index = sourceModel()->index( source_row, 0, source_parent );
0125         QString const data = sourceModel()->data( index, Qt::DisplayRole ).toString();
0126         if ((m_vehicleTypeFilter & Motorcar) && data.contains(QLatin1String("(Motorcar)"))) {
0127             return true;
0128         } else if ((m_vehicleTypeFilter & Bicycle) && data.contains(QLatin1String("(Bicycle)"))) {
0129             return true;
0130         } else if ((m_vehicleTypeFilter & Pedestrian) && data.contains(QLatin1String("(Pedestrian)"))) {
0131             return true;
0132         }
0133     }
0134 
0135     return false;
0136 }
0137 
0138 #include "moc_OfflineDataModel.cpp"