File indexing completed on 2024-05-05 03:49:16
0001 // SPDX-License-Identifier: LGPL-2.1-or-later 0002 // 0003 // SPDX-FileCopyrightText: 2012 Dennis Nienhüser <nienhueser@kde.org> 0004 // 0005 0006 #include "MapThemeModel.h" 0007 0008 #include "MapThemeManager.h" 0009 #include "GeoSceneDocument.h" 0010 #include "GeoSceneHead.h" 0011 #include "GeoSceneZoom.h" 0012 0013 #include <QModelIndex> 0014 #include <QDebug> 0015 #include <QStandardItemModel> 0016 0017 MapThemeModel::MapThemeModel( QObject *parent ) : QSortFilterProxyModel( parent ), 0018 m_themeManager( new Marble::MapThemeManager( this ) ), m_mapThemeFilters( MapThemeModel::AnyTheme ) 0019 { 0020 setSourceModel( m_themeManager->mapThemeModel() ); 0021 handleChangedThemes(); 0022 connect( m_themeManager, SIGNAL(themesChanged()), this, SLOT(handleChangedThemes()) ); 0023 0024 QHash<int,QByteArray> roleNames; 0025 roleNames[ Qt::DisplayRole ] = "display"; 0026 roleNames[ Qt::DecorationRole ] = "icon"; 0027 roleNames[ Qt::UserRole + 1 ] = "mapThemeId"; 0028 m_roleNames = roleNames; 0029 } 0030 0031 int MapThemeModel::count() const 0032 { 0033 return rowCount(); 0034 } 0035 0036 QHash<int, QByteArray> MapThemeModel::roleNames() const 0037 { 0038 return m_roleNames; 0039 } 0040 0041 QString MapThemeModel::name( const QString &id ) const 0042 { 0043 for ( int i=0; i<rowCount(); ++i ) { 0044 if ( data( index( i, 0, QModelIndex() ), Qt::UserRole + 1 ).toString() == id ) { 0045 return data( index( i, 0, QModelIndex() ) ).toString(); 0046 } 0047 } 0048 return QString(); 0049 } 0050 0051 int MapThemeModel::indexOf( const QString &id ) const 0052 { 0053 for ( int i=0; i<rowCount(); ++i ) { 0054 if ( data( index( i, 0, QModelIndex() ), Qt::UserRole + 1 ).toString() == id ) { 0055 return i; 0056 } 0057 } 0058 return -1; 0059 } 0060 0061 MapThemeModel::MapThemeFilters MapThemeModel::mapThemeFilter() const 0062 { 0063 return m_mapThemeFilters; 0064 } 0065 0066 void MapThemeModel::setMapThemeFilter( MapThemeFilters filters ) 0067 { 0068 if ( filters != m_mapThemeFilters ) { 0069 m_mapThemeFilters = filters; 0070 emit mapThemeFilterChanged(); 0071 } 0072 } 0073 0074 bool MapThemeModel::filterAcceptsRow( int sourceRow, const QModelIndex &sourceParent ) const 0075 { 0076 QModelIndex const index = sourceModel()->index( sourceRow, 0, sourceParent ); 0077 QString const themeId = index.data( Qt::UserRole + 1 ).toString(); 0078 if ( m_mapThemeFilters & MapThemeModel::HighZoom && m_streetMapThemeIds.contains( themeId ) ) { 0079 return false; 0080 } 0081 0082 if ( m_mapThemeFilters & MapThemeModel::LowZoom && !m_streetMapThemeIds.contains( themeId ) ) { 0083 return false; 0084 } 0085 0086 if ( m_mapThemeFilters & MapThemeModel::Terrestrial && themeId.startsWith( QLatin1String( "earth/" ) ) ) { 0087 return false; 0088 } 0089 0090 if ( m_mapThemeFilters & MapThemeModel::Extraterrestrial && !themeId.startsWith( QLatin1String( "earth/" ) ) ) { 0091 return false; 0092 } 0093 0094 return true; 0095 } 0096 0097 void MapThemeModel::handleChangedThemes() 0098 { 0099 /** @todo Extend .dgml spec by categories to simplify this 0100 * The map theme model items should specify the planet and a set of 0101 * categories/tags (arbitrary strings) to simplify filtering for specific 0102 * map theme properties. 0103 * E.g. the item for earth/openstreetmap/openstreetmap.dgml should have 0104 * the planet set to earth and categories/tags like "OpenStreetMap, street map" 0105 */ 0106 0107 m_streetMapThemeIds.clear(); 0108 QStringList const themes = m_themeManager->mapThemeIds(); 0109 for( const QString &theme: themes ) { 0110 Marble::GeoSceneDocument* document = Marble::MapThemeManager::loadMapTheme( theme ); 0111 if ( document && document->head()->zoom()->maximum() > 3000 ) { 0112 m_streetMapThemeIds << document->head()->mapThemeId(); 0113 delete document; 0114 } 0115 } 0116 0117 beginResetModel(); 0118 endResetModel(); 0119 } 0120 0121 #include "moc_MapThemeModel.cpp"