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"