LCOV - code coverage report
Current view: top level - core - qgsmaplayermodel.cpp (source / functions) Hit Total Coverage
Test: coverage.info.cleaned Lines: 0 345 0.0 %
Date: 2021-04-10 08:29:14 Functions: 0 0 -
Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : /***************************************************************************
       2                 :            :    qgsmaplayermodel.cpp
       3                 :            :     --------------------------------------
       4                 :            :    Date                 : 01.04.2014
       5                 :            :    Copyright            : (C) 2014 Denis Rouzaud
       6                 :            :    Email                : denis.rouzaud@gmail.com
       7                 :            : ***************************************************************************
       8                 :            : *                                                                         *
       9                 :            : *   This program is free software; you can redistribute it and/or modify  *
      10                 :            : *   it under the terms of the GNU General Public License as published by  *
      11                 :            : *   the Free Software Foundation; either version 2 of the License, or     *
      12                 :            : *   (at your option) any later version.                                   *
      13                 :            : *                                                                         *
      14                 :            : ***************************************************************************/
      15                 :            : 
      16                 :            : #include <QIcon>
      17                 :            : 
      18                 :            : #include "qgsdataitem.h"
      19                 :            : #include "qgsmaplayermodel.h"
      20                 :            : #include "qgsproject.h"
      21                 :            : #include "qgsapplication.h"
      22                 :            : #include "qgsvectorlayer.h"
      23                 :            : 
      24                 :          0 : QgsMapLayerModel::QgsMapLayerModel( const QList<QgsMapLayer *> &layers, QObject *parent, QgsProject *project )
      25                 :          0 :   : QAbstractItemModel( parent )
      26                 :          0 :   , mProject( project ? project : QgsProject::instance() )
      27                 :          0 : {
      28                 :          0 :   connect( mProject, static_cast < void ( QgsProject::* )( const QStringList & ) >( &QgsProject::layersWillBeRemoved ), this, &QgsMapLayerModel::removeLayers );
      29                 :          0 :   addLayers( layers );
      30                 :          0 : }
      31                 :            : 
      32                 :          0 : QgsMapLayerModel::QgsMapLayerModel( QObject *parent, QgsProject *project )
      33                 :          0 :   : QAbstractItemModel( parent )
      34                 :          0 :   , mProject( project ? project : QgsProject::instance() )
      35                 :          0 : {
      36                 :          0 :   connect( mProject, &QgsProject::layersAdded, this, &QgsMapLayerModel::addLayers );
      37                 :          0 :   connect( mProject, static_cast < void ( QgsProject::* )( const QStringList & ) >( &QgsProject::layersWillBeRemoved ), this, &QgsMapLayerModel::removeLayers );
      38                 :          0 :   addLayers( mProject->mapLayers().values() );
      39                 :          0 : }
      40                 :            : 
      41                 :          0 : void QgsMapLayerModel::setItemsCheckable( bool checkable )
      42                 :            : {
      43                 :          0 :   mItemCheckable = checkable;
      44                 :          0 : }
      45                 :            : 
      46                 :          0 : void QgsMapLayerModel::setItemsCanBeReordered( bool allow )
      47                 :            : {
      48                 :          0 :   mCanReorder = allow;
      49                 :          0 : }
      50                 :            : 
      51                 :          0 : bool QgsMapLayerModel::itemsCanBeReordered() const
      52                 :            : {
      53                 :          0 :   return mCanReorder;
      54                 :            : }
      55                 :            : 
      56                 :          0 : void QgsMapLayerModel::checkAll( Qt::CheckState checkState )
      57                 :            : {
      58                 :          0 :   QMap<QString, Qt::CheckState>::iterator i = mLayersChecked.begin();
      59                 :          0 :   for ( ; i != mLayersChecked.end(); ++i )
      60                 :            :   {
      61                 :          0 :     *i = checkState;
      62                 :          0 :   }
      63                 :          0 :   emit dataChanged( index( 0, 0 ), index( rowCount() - 1, 0 ) );
      64                 :          0 : }
      65                 :            : 
      66                 :          0 : void QgsMapLayerModel::setAllowEmptyLayer( bool allowEmpty, const QString &text, const QIcon &icon )
      67                 :            : {
      68                 :          0 :   mEmptyText = text;
      69                 :          0 :   mEmptyIcon = icon;
      70                 :          0 :   if ( allowEmpty == mAllowEmpty )
      71                 :          0 :     return;
      72                 :            : 
      73                 :          0 :   if ( allowEmpty )
      74                 :            :   {
      75                 :          0 :     beginInsertRows( QModelIndex(), 0, 0 );
      76                 :          0 :     mAllowEmpty = true;
      77                 :          0 :     endInsertRows();
      78                 :          0 :   }
      79                 :            :   else
      80                 :            :   {
      81                 :          0 :     beginRemoveRows( QModelIndex(), 0, 0 );
      82                 :          0 :     mAllowEmpty = false;
      83                 :          0 :     endRemoveRows();
      84                 :            :   }
      85                 :          0 : }
      86                 :            : 
      87                 :          0 : void QgsMapLayerModel::setShowCrs( bool showCrs )
      88                 :            : {
      89                 :          0 :   if ( mShowCrs == showCrs )
      90                 :          0 :     return;
      91                 :            : 
      92                 :          0 :   mShowCrs = showCrs;
      93                 :          0 :   emit dataChanged( index( 0, 0 ), index( rowCount() - 1, 0 ), QVector<int>() << Qt::DisplayRole );
      94                 :          0 : }
      95                 :            : 
      96                 :          0 : QList<QgsMapLayer *> QgsMapLayerModel::layersChecked( Qt::CheckState checkState )
      97                 :            : {
      98                 :          0 :   QList<QgsMapLayer *> layers;
      99                 :          0 :   const auto constMLayers = mLayers;
     100                 :          0 :   for ( QgsMapLayer *layer : constMLayers )
     101                 :            :   {
     102                 :          0 :     if ( mLayersChecked[layer->id()] == checkState )
     103                 :            :     {
     104                 :          0 :       layers.append( layer );
     105                 :          0 :     }
     106                 :            :   }
     107                 :          0 :   return layers;
     108                 :          0 : }
     109                 :            : 
     110                 :          0 : void QgsMapLayerModel::setLayersChecked( const QList<QgsMapLayer *> &layers )
     111                 :            : {
     112                 :          0 :   QMap<QString, Qt::CheckState>::iterator i = mLayersChecked.begin();
     113                 :          0 :   for ( ; i != mLayersChecked.end(); ++i )
     114                 :            :   {
     115                 :          0 :     *i = Qt::Unchecked;
     116                 :          0 :   }
     117                 :          0 :   for ( const QgsMapLayer *layer : layers )
     118                 :            :   {
     119                 :          0 :     mLayersChecked[ layer->id() ] = Qt::Checked;
     120                 :            :   }
     121                 :          0 :   emit dataChanged( index( 0, 0 ), index( rowCount() - 1, 0 ), QVector<int>() << Qt::CheckStateRole );
     122                 :          0 : }
     123                 :            : 
     124                 :          0 : QModelIndex QgsMapLayerModel::indexFromLayer( QgsMapLayer *layer ) const
     125                 :            : {
     126                 :          0 :   int r = mLayers.indexOf( layer );
     127                 :          0 :   if ( r >= 0 && mAllowEmpty )
     128                 :          0 :     r++;
     129                 :          0 :   return index( r, 0 );
     130                 :            : }
     131                 :            : 
     132                 :          0 : QgsMapLayer *QgsMapLayerModel::layerFromIndex( const QModelIndex &index ) const
     133                 :            : {
     134                 :          0 :   return mProject->mapLayer( index.data( LayerIdRole ).toString() );
     135                 :          0 : }
     136                 :            : 
     137                 :          0 : void QgsMapLayerModel::setAdditionalItems( const QStringList &items )
     138                 :            : {
     139                 :          0 :   if ( items == mAdditionalItems )
     140                 :          0 :     return;
     141                 :            : 
     142                 :          0 :   int offset = 0;
     143                 :          0 :   if ( mAllowEmpty )
     144                 :          0 :     offset++;
     145                 :            : 
     146                 :          0 :   offset += mLayers.count();
     147                 :            : 
     148                 :            :   //remove existing
     149                 :          0 :   if ( !mAdditionalItems.isEmpty() )
     150                 :            :   {
     151                 :          0 :     beginRemoveRows( QModelIndex(), offset, offset + mAdditionalItems.count() - 1 );
     152                 :          0 :     mAdditionalItems.clear();
     153                 :          0 :     endRemoveRows();
     154                 :          0 :   }
     155                 :            : 
     156                 :            :   //add new
     157                 :          0 :   beginInsertRows( QModelIndex(), offset, offset + items.count() - 1 );
     158                 :          0 :   mAdditionalItems = items;
     159                 :          0 :   endInsertRows();
     160                 :          0 : }
     161                 :            : 
     162                 :          0 : void QgsMapLayerModel::removeLayers( const QStringList &layerIds )
     163                 :            : {
     164                 :          0 :   int offset = 0;
     165                 :          0 :   if ( mAllowEmpty )
     166                 :          0 :     offset++;
     167                 :            : 
     168                 :          0 :   for ( const QString &layerId : layerIds )
     169                 :            :   {
     170                 :          0 :     QModelIndex startIndex = index( 0, 0 );
     171                 :          0 :     QModelIndexList list = match( startIndex, LayerIdRole, layerId, 1 );
     172                 :          0 :     if ( !list.isEmpty() )
     173                 :            :     {
     174                 :          0 :       QModelIndex index = list[0];
     175                 :          0 :       beginRemoveRows( QModelIndex(), index.row(), index.row() );
     176                 :          0 :       mLayersChecked.remove( layerId );
     177                 :          0 :       mLayers.removeAt( index.row() - offset );
     178                 :          0 :       endRemoveRows();
     179                 :          0 :     }
     180                 :          0 :   }
     181                 :          0 : }
     182                 :            : 
     183                 :          0 : void QgsMapLayerModel::addLayers( const QList<QgsMapLayer *> &layers )
     184                 :            : {
     185                 :          0 :   if ( !layers.empty( ) )
     186                 :            :   {
     187                 :          0 :     int offset = 0;
     188                 :          0 :     if ( mAllowEmpty )
     189                 :          0 :       offset++;
     190                 :            : 
     191                 :          0 :     beginInsertRows( QModelIndex(), mLayers.count() + offset, mLayers.count() + layers.count() - 1  + offset );
     192                 :          0 :     const auto constLayers = layers;
     193                 :          0 :     for ( QgsMapLayer *layer : constLayers )
     194                 :            :     {
     195                 :          0 :       mLayers.append( layer );
     196                 :          0 :       mLayersChecked.insert( layer->id(), Qt::Unchecked );
     197                 :            :     }
     198                 :          0 :     endInsertRows();
     199                 :          0 :   }
     200                 :          0 : }
     201                 :            : 
     202                 :          0 : QModelIndex QgsMapLayerModel::index( int row, int column, const QModelIndex &parent ) const
     203                 :            : {
     204                 :          0 :   int offset = 0;
     205                 :          0 :   if ( mAllowEmpty )
     206                 :          0 :     offset++;
     207                 :            : 
     208                 :          0 :   if ( hasIndex( row, column, parent ) )
     209                 :          0 :   {
     210                 :          0 :     QgsMapLayer *layer = nullptr;
     211                 :          0 :     if ( row - offset >= 0 && row - offset < mLayers.count() )
     212                 :          0 :       layer = mLayers.at( row - offset );
     213                 :            : 
     214                 :          0 :     return createIndex( row, column, layer );
     215                 :            :   }
     216                 :          0 : 
     217                 :          0 :   return QModelIndex();
     218                 :            : 
     219                 :          0 : }
     220                 :            : 
     221                 :          0 : QModelIndex QgsMapLayerModel::parent( const QModelIndex &child ) const
     222                 :            : {
     223                 :          0 :   Q_UNUSED( child )
     224                 :          0 :   return QModelIndex();
     225                 :            : }
     226                 :            : 
     227                 :            : 
     228                 :          0 : int QgsMapLayerModel::rowCount( const QModelIndex &parent ) const
     229                 :            : {
     230                 :          0 :   if ( parent.isValid() )
     231                 :          0 :     return 0;
     232                 :            : 
     233                 :          0 :   return ( mAllowEmpty ? 1 : 0 ) + mLayers.length() + mAdditionalItems.count();
     234                 :          0 : }
     235                 :            : 
     236                 :          0 : int QgsMapLayerModel::columnCount( const QModelIndex &parent ) const
     237                 :            : {
     238                 :          0 :   Q_UNUSED( parent )
     239                 :          0 :   return 1;
     240                 :            : }
     241                 :            : 
     242                 :            : 
     243                 :          0 : QVariant QgsMapLayerModel::data( const QModelIndex &index, int role ) const
     244                 :            : {
     245                 :          0 :   if ( !index.isValid() )
     246                 :          0 :     return QVariant();
     247                 :            : 
     248                 :          0 :   bool isEmpty = index.row() == 0 && mAllowEmpty;
     249                 :          0 :   int additionalIndex = index.row() - ( mAllowEmpty ? 1 : 0 ) - mLayers.count();
     250                 :            : 
     251                 :          0 :   switch ( role )
     252                 :            :   {
     253                 :            :     case Qt::DisplayRole:
     254                 :            :     case Qt::EditRole:
     255                 :            :     {
     256                 :          0 :       if ( index.row() == 0 && mAllowEmpty )
     257                 :          0 :         return mEmptyText;
     258                 :            : 
     259                 :          0 :       if ( additionalIndex >= 0 )
     260                 :          0 :         return mAdditionalItems.at( additionalIndex );
     261                 :            : 
     262                 :          0 :       QgsMapLayer *layer = mLayers.value( index.row() - ( mAllowEmpty ? 1 : 0 ) );
     263                 :          0 :       if ( !layer )
     264                 :          0 :         return QVariant();
     265                 :            : 
     266                 :          0 :       if ( !mShowCrs || !layer->isSpatial() || role == Qt::EditRole )
     267                 :            :       {
     268                 :          0 :         return layer->name();
     269                 :            :       }
     270                 :            :       else
     271                 :            :       {
     272                 :          0 :         return tr( "%1 [%2]" ).arg( layer->name(), layer->crs().authid() );
     273                 :            :       }
     274                 :            :     }
     275                 :            : 
     276                 :            :     case LayerIdRole:
     277                 :            :     {
     278                 :          0 :       if ( isEmpty || additionalIndex >= 0 )
     279                 :          0 :         return QVariant();
     280                 :            : 
     281                 :          0 :       QgsMapLayer *layer = mLayers.value( index.row() - ( mAllowEmpty ? 1 : 0 ) );
     282                 :          0 :       return layer ? layer->id() : QVariant();
     283                 :            :     }
     284                 :            : 
     285                 :            :     case LayerRole:
     286                 :            :     {
     287                 :          0 :       if ( isEmpty || additionalIndex >= 0 )
     288                 :          0 :         return QVariant();
     289                 :            : 
     290                 :          0 :       return QVariant::fromValue<QgsMapLayer *>( mLayers.value( index.row() - ( mAllowEmpty ? 1 : 0 ) ) );
     291                 :            :     }
     292                 :            : 
     293                 :            :     case EmptyRole:
     294                 :          0 :       return isEmpty;
     295                 :            : 
     296                 :            :     case AdditionalRole:
     297                 :          0 :       return additionalIndex >= 0;
     298                 :            : 
     299                 :            :     case Qt::CheckStateRole:
     300                 :            :     {
     301                 :          0 :       if ( mItemCheckable )
     302                 :            :       {
     303                 :          0 :         if ( isEmpty || additionalIndex >= 0 )
     304                 :          0 :           return QVariant();
     305                 :            : 
     306                 :          0 :         QgsMapLayer *layer = mLayers.value( index.row() - ( mAllowEmpty ? 1 : 0 ) );
     307                 :          0 :         return layer ? mLayersChecked[layer->id()] : QVariant();
     308                 :            :       }
     309                 :            : 
     310                 :          0 :       return QVariant();
     311                 :            :     }
     312                 :            : 
     313                 :            :     case Qt::ToolTipRole:
     314                 :            :     {
     315                 :          0 :       QgsMapLayer *layer = mLayers.value( index.row() - ( mAllowEmpty ? 1 : 0 ) );
     316                 :          0 :       if ( layer )
     317                 :            :       {
     318                 :          0 :         QStringList parts;
     319                 :          0 :         QString title = layer->title().isEmpty() ? layer->shortName() : layer->title();
     320                 :          0 :         if ( title.isEmpty() )
     321                 :          0 :           title = layer->name();
     322                 :          0 :         title = "<b>" + title + "</b>";
     323                 :          0 :         if ( layer->isSpatial() && layer->crs().isValid() )
     324                 :            :         {
     325                 :          0 :           if ( QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( layer ) )
     326                 :          0 :             title = tr( "%1 (%2 - %3)" ).arg( title, QgsWkbTypes::displayString( vl->wkbType() ), layer->crs().authid() );
     327                 :            :           else
     328                 :          0 :             title = tr( "%1 (%2) " ).arg( title, layer->crs().authid() );
     329                 :          0 :         }
     330                 :          0 :         parts << title;
     331                 :            : 
     332                 :          0 :         if ( !layer->abstract().isEmpty() )
     333                 :          0 :           parts << "<br/>" + layer->abstract().replace( QLatin1String( "\n" ), QLatin1String( "<br/>" ) );
     334                 :          0 :         parts << "<i>" + layer->publicSource() + "</i>";
     335                 :          0 :         return parts.join( QLatin1String( "<br/>" ) );
     336                 :          0 :       }
     337                 :          0 :       return QVariant();
     338                 :            :     }
     339                 :            : 
     340                 :            :     case Qt::DecorationRole:
     341                 :            :     {
     342                 :          0 :       if ( isEmpty )
     343                 :          0 :         return mEmptyIcon.isNull() ? QVariant() : mEmptyIcon;
     344                 :            : 
     345                 :          0 :       if ( additionalIndex >= 0 )
     346                 :          0 :         return QVariant();
     347                 :            : 
     348                 :          0 :       QgsMapLayer *layer = mLayers.value( index.row() - ( mAllowEmpty ? 1 : 0 ) );
     349                 :          0 :       if ( !layer )
     350                 :          0 :         return QVariant();
     351                 :            : 
     352                 :          0 :       return iconForLayer( layer );
     353                 :            :     }
     354                 :            :   }
     355                 :            : 
     356                 :          0 :   return QVariant();
     357                 :          0 : }
     358                 :            : 
     359                 :          0 : QHash<int, QByteArray> QgsMapLayerModel::roleNames() const
     360                 :            : {
     361                 :          0 :   QHash<int, QByteArray> roles  = QAbstractItemModel::roleNames();
     362                 :          0 :   roles[LayerIdRole]  = "layerId";
     363                 :          0 :   roles[LayerRole] = "layer";
     364                 :            : 
     365                 :          0 :   return roles;
     366                 :          0 : }
     367                 :            : 
     368                 :          0 : Qt::ItemFlags QgsMapLayerModel::flags( const QModelIndex &index ) const
     369                 :            : {
     370                 :          0 :   if ( !index.isValid() )
     371                 :            :   {
     372                 :          0 :     if ( mCanReorder )
     373                 :          0 :       return Qt::ItemIsDropEnabled;
     374                 :            :     else
     375                 :          0 :       return Qt::ItemFlags();
     376                 :            :   }
     377                 :            : 
     378                 :          0 :   bool isEmpty = index.row() == 0 && mAllowEmpty;
     379                 :          0 :   int additionalIndex = index.row() - ( mAllowEmpty ? 1 : 0 ) - mLayers.count();
     380                 :            : 
     381                 :          0 :   Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable;
     382                 :            : 
     383                 :          0 :   if ( mCanReorder && !isEmpty && additionalIndex < 0 )
     384                 :            :   {
     385                 :          0 :     flags |= Qt::ItemIsDragEnabled;
     386                 :          0 :   }
     387                 :            : 
     388                 :          0 :   if ( mItemCheckable && !isEmpty && additionalIndex < 0 )
     389                 :            :   {
     390                 :          0 :     flags |= Qt::ItemIsUserCheckable;
     391                 :          0 :   }
     392                 :          0 :   return flags;
     393                 :          0 : }
     394                 :            : 
     395                 :          0 : bool QgsMapLayerModel::insertRows( int row, int count, const QModelIndex &parent )
     396                 :            : {
     397                 :          0 :   if ( parent.isValid() )
     398                 :          0 :     return false;
     399                 :            : 
     400                 :          0 :   int offset = 0;
     401                 :          0 :   if ( mAllowEmpty )
     402                 :          0 :     offset++;
     403                 :            : 
     404                 :          0 :   beginInsertRows( parent, row, row + count - 1 );
     405                 :          0 :   for ( int i = row; i < row + count; ++i )
     406                 :          0 :     mLayers.insert( i - offset, nullptr );
     407                 :          0 :   endInsertRows();
     408                 :            : 
     409                 :          0 :   return true;
     410                 :          0 : }
     411                 :            : 
     412                 :          0 : bool QgsMapLayerModel::removeRows( int row, int count, const QModelIndex &parent )
     413                 :            : {
     414                 :          0 :   if ( parent.isValid() || row < 0 )
     415                 :          0 :     return false;
     416                 :            : 
     417                 :          0 :   int offset = 0;
     418                 :          0 :   if ( mAllowEmpty )
     419                 :            :   {
     420                 :          0 :     if ( row == 0 )
     421                 :          0 :       return false;
     422                 :            : 
     423                 :          0 :     offset++;
     424                 :          0 :   }
     425                 :            : 
     426                 :          0 :   if ( row - offset > mLayers.count() - 1 )
     427                 :            :   {
     428                 :          0 :     return false;
     429                 :            :   }
     430                 :            : 
     431                 :          0 :   beginRemoveRows( parent, row, row + count - 1 );
     432                 :          0 :   for ( int i = 0; i != count; ++i )
     433                 :          0 :     mLayers.removeAt( row - offset );
     434                 :          0 :   endRemoveRows();
     435                 :            : 
     436                 :          0 :   return true;
     437                 :          0 : }
     438                 :            : 
     439                 :          0 : QStringList QgsMapLayerModel::mimeTypes() const
     440                 :            : {
     441                 :          0 :   QStringList types;
     442                 :          0 :   types << QStringLiteral( "application/qgis.layermodeldata" );
     443                 :          0 :   return types;
     444                 :          0 : }
     445                 :            : 
     446                 :          0 : bool QgsMapLayerModel::canDropMimeData( const QMimeData *data, Qt::DropAction action, int, int, const QModelIndex & ) const
     447                 :            : {
     448                 :          0 :   if ( !mCanReorder || action != Qt::MoveAction || !data->hasFormat( QStringLiteral( "application/qgis.layermodeldata" ) ) )
     449                 :          0 :     return false;
     450                 :          0 :   return true;
     451                 :          0 : }
     452                 :            : 
     453                 :          0 : QMimeData *QgsMapLayerModel::mimeData( const QModelIndexList &indexes ) const
     454                 :            : {
     455                 :          0 :   std::unique_ptr< QMimeData > mimeData = std::make_unique< QMimeData >();
     456                 :            : 
     457                 :          0 :   QByteArray encodedData;
     458                 :          0 :   QDataStream stream( &encodedData, QIODevice::WriteOnly );
     459                 :          0 :   QSet< QString > addedLayers;
     460                 :            : 
     461                 :          0 :   for ( const QModelIndex &i : indexes )
     462                 :            :   {
     463                 :          0 :     if ( i.isValid() )
     464                 :            :     {
     465                 :          0 :       const QString id = data( index( i.row(), 0, i.parent() ), LayerIdRole ).toString();
     466                 :          0 :       if ( !addedLayers.contains( id ) )
     467                 :            :       {
     468                 :          0 :         addedLayers.insert( id );
     469                 :          0 :         stream << id;
     470                 :          0 :       }
     471                 :          0 :     }
     472                 :            :   }
     473                 :          0 :   mimeData->setData( QStringLiteral( "application/qgis.layermodeldata" ), encodedData );
     474                 :          0 :   return mimeData.release();
     475                 :          0 : }
     476                 :            : 
     477                 :          0 : bool QgsMapLayerModel::dropMimeData( const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent )
     478                 :            : {
     479                 :          0 :   if ( !canDropMimeData( data, action, row, column, parent ) || row < 0 )
     480                 :          0 :     return false;
     481                 :            : 
     482                 :          0 :   if ( action == Qt::IgnoreAction )
     483                 :          0 :     return true;
     484                 :          0 :   else if ( action != Qt::MoveAction )
     485                 :          0 :     return false;
     486                 :            : 
     487                 :          0 :   QByteArray encodedData = data->data( QStringLiteral( "application/qgis.layermodeldata" ) );
     488                 :          0 :   QDataStream stream( &encodedData, QIODevice::ReadOnly );
     489                 :          0 :   QStringList newItems;
     490                 :          0 :   int rows = 0;
     491                 :            : 
     492                 :          0 :   while ( !stream.atEnd() )
     493                 :            :   {
     494                 :          0 :     QString text;
     495                 :          0 :     stream >> text;
     496                 :          0 :     newItems << text;
     497                 :          0 :     ++rows;
     498                 :          0 :   }
     499                 :            : 
     500                 :          0 :   insertRows( row, rows, QModelIndex() );
     501                 :          0 :   for ( const QString &text : std::as_const( newItems ) )
     502                 :            :   {
     503                 :          0 :     QModelIndex idx = index( row, 0, QModelIndex() );
     504                 :          0 :     setData( idx, text, LayerIdRole );
     505                 :          0 :     row++;
     506                 :            :   }
     507                 :            : 
     508                 :          0 :   return true;
     509                 :          0 : }
     510                 :            : 
     511                 :          0 : Qt::DropActions QgsMapLayerModel::supportedDropActions() const
     512                 :            : {
     513                 :          0 :   return Qt::MoveAction;
     514                 :            : }
     515                 :            : 
     516                 :          0 : QIcon QgsMapLayerModel::iconForLayer( QgsMapLayer *layer )
     517                 :            : {
     518                 :          0 :   switch ( layer->type() )
     519                 :            :   {
     520                 :            :     case QgsMapLayerType::RasterLayer:
     521                 :            :     {
     522                 :          0 :       return QgsLayerItem::iconRaster();
     523                 :            :     }
     524                 :            : 
     525                 :            :     case QgsMapLayerType::MeshLayer:
     526                 :            :     {
     527                 :          0 :       return QgsLayerItem::iconMesh();
     528                 :            :     }
     529                 :            : 
     530                 :            :     case QgsMapLayerType::VectorTileLayer:
     531                 :            :     {
     532                 :          0 :       return QgsLayerItem::iconVectorTile();
     533                 :            :     }
     534                 :            : 
     535                 :            :     case QgsMapLayerType::PointCloudLayer:
     536                 :            :     {
     537                 :          0 :       return QgsLayerItem::iconPointCloud();
     538                 :            :     }
     539                 :            : 
     540                 :            :     case QgsMapLayerType::VectorLayer:
     541                 :            :     {
     542                 :          0 :       QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( layer );
     543                 :          0 :       if ( !vl )
     544                 :            :       {
     545                 :          0 :         return QIcon();
     546                 :            :       }
     547                 :          0 :       QgsWkbTypes::GeometryType geomType = vl->geometryType();
     548                 :          0 :       switch ( geomType )
     549                 :            :       {
     550                 :            :         case QgsWkbTypes::PointGeometry:
     551                 :            :         {
     552                 :          0 :           return QgsLayerItem::iconPoint();
     553                 :            :         }
     554                 :            :         case QgsWkbTypes::PolygonGeometry :
     555                 :            :         {
     556                 :          0 :           return QgsLayerItem::iconPolygon();
     557                 :            :         }
     558                 :            :         case QgsWkbTypes::LineGeometry :
     559                 :            :         {
     560                 :          0 :           return QgsLayerItem::iconLine();
     561                 :            :         }
     562                 :            :         case QgsWkbTypes::NullGeometry :
     563                 :            :         {
     564                 :          0 :           return QgsLayerItem::iconTable();
     565                 :            :         }
     566                 :            :         default:
     567                 :            :         {
     568                 :          0 :           return QIcon();
     569                 :            :         }
     570                 :            :       }
     571                 :            :     }
     572                 :            : 
     573                 :            :     default:
     574                 :            :     {
     575                 :          0 :       return QIcon();
     576                 :            :     }
     577                 :            :   }
     578                 :          0 : }
     579                 :            : 
     580                 :            : 
     581                 :          0 : bool QgsMapLayerModel::setData( const QModelIndex &index, const QVariant &value, int role )
     582                 :            : {
     583                 :          0 :   if ( !index.isValid() )
     584                 :          0 :     return false;
     585                 :            : 
     586                 :          0 :   bool isEmpty = index.row() == 0 && mAllowEmpty;
     587                 :          0 :   int additionalIndex = index.row() - ( mAllowEmpty ? 1 : 0 ) - mLayers.count();
     588                 :            : 
     589                 :          0 :   switch ( role )
     590                 :            :   {
     591                 :            :     case Qt::CheckStateRole:
     592                 :            :     {
     593                 :          0 :       if ( !isEmpty && additionalIndex < 0 )
     594                 :            :       {
     595                 :          0 :         QgsMapLayer *layer = static_cast<QgsMapLayer *>( index.internalPointer() );
     596                 :          0 :         mLayersChecked[layer->id()] = ( Qt::CheckState )value.toInt();
     597                 :          0 :         emit dataChanged( index, index, QVector< int >() << Qt::CheckStateRole );
     598                 :          0 :         return true;
     599                 :            :       }
     600                 :          0 :       break;
     601                 :            :     }
     602                 :            : 
     603                 :            :     case LayerIdRole:
     604                 :          0 :       if ( !isEmpty && additionalIndex < 0 )
     605                 :            :       {
     606                 :          0 :         mLayers[index.row() - ( mAllowEmpty ? 1 : 0 )] = mProject->mapLayer( value.toString() );
     607                 :          0 :         emit dataChanged( index, index );
     608                 :          0 :         return true;
     609                 :            :       }
     610                 :          0 :       break;
     611                 :            :   }
     612                 :            : 
     613                 :          0 :   return false;
     614                 :          0 : }

Generated by: LCOV version 1.14