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"