27   : QAbstractItemModel( parent )
 
   28   , mProject( project ? project : 
QgsProject::instance() )
 
   35   : QAbstractItemModel( parent )
 
   36   , mProject( project ? project : 
QgsProject::instance() )
 
   60   QMap<QString, Qt::CheckState>::iterator i = 
mLayersChecked.begin();
 
   72   if ( allowEmpty == mAllowEmpty )
 
   77     beginInsertRows( QModelIndex(), 0, 0 );
 
   83     beginRemoveRows( QModelIndex(), 0, 0 );
 
   95   emit dataChanged( 
index( 0, 0 ), 
index( 
rowCount() - 1, 0 ), QVector<int>() << Qt::DisplayRole );
 
  100   QList<QgsMapLayer *> layers;
 
  101   const auto constMLayers = 
mLayers;
 
  106       layers.append( layer );
 
  114   QMap<QString, Qt::CheckState>::iterator i = 
mLayersChecked.begin();
 
  123   emit dataChanged( 
index( 0, 0 ), 
index( 
rowCount() - 1, 0 ), QVector<int>() << Qt::CheckStateRole );
 
  128   int r = 
mLayers.indexOf( layer );
 
  129   if ( r >= 0 && mAllowEmpty )
 
  131   return index( r, 0 );
 
  141   if ( items == mAdditionalItems )
 
  151   if ( !mAdditionalItems.isEmpty() )
 
  153     beginRemoveRows( QModelIndex(), offset, offset + mAdditionalItems.count() - 1 );
 
  154     mAdditionalItems.clear();
 
  159   beginInsertRows( QModelIndex(), offset, offset + items.count() - 1 );
 
  160   mAdditionalItems = items;
 
  169   QStringList layerIdsToRemove;
 
  173       layerIdsToRemove << layer->id();
 
  182       const QString layerId = layer->id();
 
  201   for ( 
const QString &layerId : layerIds )
 
  203     QModelIndex startIndex = 
index( 0, 0 );
 
  204     QModelIndexList list = match( startIndex, 
LayerIdRole, layerId, 1 );
 
  205     if ( !list.isEmpty() )
 
  207       QModelIndex 
index = list[0];
 
  208       beginRemoveRows( QModelIndex(), 
index.row(), 
index.row() );
 
  218   if ( !layers.empty( ) )
 
  224     beginInsertRows( QModelIndex(), 
mLayers.count() + offset, 
mLayers.count() + layers.count() - 1  + offset );
 
  225     const auto constLayers = layers;
 
  241   if ( hasIndex( row, column, 
parent ) )
 
  244     if ( row - offset >= 0 && row - offset < 
mLayers.count() )
 
  245       layer = 
mLayers.at( row - offset );
 
  247     return createIndex( row, column, layer );
 
  250   return QModelIndex();
 
  257   return QModelIndex();
 
  266   return ( mAllowEmpty ? 1 : 0 ) + 
mLayers.length() + mAdditionalItems.count();
 
  278   if ( !
index.isValid() )
 
  281   bool isEmpty = 
index.row() == 0 && mAllowEmpty;
 
  282   int additionalIndex = 
index.row() - ( mAllowEmpty ? 1 : 0 ) - 
mLayers.count();
 
  286     case Qt::DisplayRole:
 
  289       if ( 
index.row() == 0 && mAllowEmpty )
 
  292       if ( additionalIndex >= 0 )
 
  293         return mAdditionalItems.at( additionalIndex );
 
  299       if ( !mShowCrs || !layer->
isSpatial() || role == Qt::EditRole )
 
  301         return layer->
name();
 
  305         return tr( 
"%1 [%2]" ).arg( layer->
name(), layer->
crs().
authid() );
 
  311       if ( isEmpty || additionalIndex >= 0 )
 
  315       return layer ? layer->
id() : QVariant();
 
  320       if ( isEmpty || additionalIndex >= 0 )
 
  323       return QVariant::fromValue<QgsMapLayer *>( 
mLayers.value( 
index.row() - ( mAllowEmpty ? 1 : 0 ) ) );
 
  330       return additionalIndex >= 0;
 
  332     case Qt::CheckStateRole:
 
  336         if ( isEmpty || additionalIndex >= 0 )
 
  346     case Qt::ToolTipRole:
 
  353         if ( title.isEmpty() )
 
  354           title = layer->
name();
 
  355         title = 
"<b>" + title + 
"</b>";
 
  358           if ( 
QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( layer ) )
 
  361             title = tr( 
"%1 (%2) " ).arg( title, layer->
crs().
authid() );
 
  366           parts << 
"<br/>" + layer->
abstract().replace( QLatin1String( 
"\n" ), QLatin1String( 
"<br/>" ) );
 
  368         return parts.join( QLatin1String( 
"<br/>" ) );
 
  373     case Qt::DecorationRole:
 
  376         return mEmptyIcon.isNull() ? QVariant() : mEmptyIcon;
 
  378       if ( additionalIndex >= 0 )
 
  394   QHash<int, QByteArray> roles  = QAbstractItemModel::roleNames();
 
  403   if ( !
index.isValid() )
 
  406       return Qt::ItemIsDropEnabled;
 
  408       return Qt::ItemFlags();
 
  411   bool isEmpty = 
index.row() == 0 && mAllowEmpty;
 
  412   int additionalIndex = 
index.row() - ( mAllowEmpty ? 1 : 0 ) - 
mLayers.count();
 
  414   Qt::ItemFlags 
flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable;
 
  416   if ( 
mCanReorder && !isEmpty && additionalIndex < 0 )
 
  418     flags |= Qt::ItemIsDragEnabled;
 
  423     flags |= Qt::ItemIsUserCheckable;
 
  437   beginInsertRows( 
parent, row, row + count - 1 );
 
  438   for ( 
int i = row; i < row + count; ++i )
 
  439     mLayers.insert( i - offset, 
nullptr );
 
  447   if ( 
parent.isValid() || row < 0 )
 
  459   if ( row - offset > 
mLayers.count() - 1 )
 
  464   beginRemoveRows( 
parent, row, row + count - 1 );
 
  465   for ( 
int i = 0; i != count; ++i )
 
  466     mLayers.removeAt( row - offset );
 
  475   types << QStringLiteral( 
"application/qgis.layermodeldata" );
 
  481   if ( !
mCanReorder || action != Qt::MoveAction || !
data->hasFormat( QStringLiteral( 
"application/qgis.layermodeldata" ) ) )
 
  488   std::unique_ptr< QMimeData > 
mimeData = std::make_unique< QMimeData >();
 
  490   QByteArray encodedData;
 
  491   QDataStream stream( &encodedData, QIODevice::WriteOnly );
 
  492   QSet< QString > addedLayers;
 
  494   for ( 
const QModelIndex &i : indexes )
 
  499       if ( !addedLayers.contains( 
id ) )
 
  501         addedLayers.insert( 
id );
 
  506   mimeData->setData( QStringLiteral( 
"application/qgis.layermodeldata" ), encodedData );
 
  515   if ( action == Qt::IgnoreAction )
 
  517   else if ( action != Qt::MoveAction )
 
  520   QByteArray encodedData = 
data->data( QStringLiteral( 
"application/qgis.layermodeldata" ) );
 
  521   QDataStream stream( &encodedData, QIODevice::ReadOnly );
 
  522   QStringList newItems;
 
  525   while ( !stream.atEnd() )
 
  534   for ( 
const QString &text : std::as_const( newItems ) )
 
  536     QModelIndex idx = 
index( row, 0, QModelIndex() );
 
  546   return Qt::MoveAction;
 
  556   if ( !
index.isValid() )
 
  559   bool isEmpty = 
index.row() == 0 && mAllowEmpty;
 
  560   int additionalIndex = 
index.row() - ( mAllowEmpty ? 1 : 0 ) - 
mLayers.count();
 
  564     case Qt::CheckStateRole:
 
  566       if ( !isEmpty && additionalIndex < 0 )
 
  570         emit dataChanged( 
index, 
index, QVector< int >() << Qt::CheckStateRole );
 
  577       if ( !isEmpty && additionalIndex < 0 )
 
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
QString authid() const
Returns the authority identifier for the CRS.
static QIcon iconForLayer(const QgsMapLayer *layer)
Returns the icon corresponding to a specified map layer.
QList< QPointer< QgsMapLayer > > mAdditionalLayers
void setShowCrs(bool showCrs)
Sets whether the CRS of layers is also included in the model's display role.
void setItemsCanBeReordered(bool allow)
Sets whether items in the model can be reordered via drag and drop.
QHash< int, QByteArray > roleNames() const override
Returns strings for all roles supported by this model.
Qt::ItemFlags flags(const QModelIndex &index) const override
bool canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) const override
int rowCount(const QModelIndex &parent=QModelIndex()) const override
QList< QgsMapLayer * > layersChecked(Qt::CheckState checkState=Qt::Checked)
layersChecked returns the list of layers which are checked (or unchecked)
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const override
bool insertRows(int row, int count, const QModelIndex &parent=QModelIndex()) override
QModelIndex parent(const QModelIndex &child) const override
bool removeRows(int row, int count, const QModelIndex &parent=QModelIndex()) override
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const override
@ EmptyRole
True if index corresponds to the empty (not set) value.
@ LayerIdRole
Stores the map layer ID.
@ LayerRole
Stores pointer to the map layer itself.
@ AdditionalRole
True if index corresponds to an additional (non map layer) item.
QModelIndex indexFromLayer(QgsMapLayer *layer) const
indexFromLayer returns the model index for a given layer
void setAllowEmptyLayer(bool allowEmpty, const QString &text=QString(), const QIcon &icon=QIcon())
Sets whether an optional empty layer ("not set") option is present in the model.
void setAdditionalItems(const QStringList &items)
Sets a list of additional (non map layer) items to include at the end of the model.
QList< QgsMapLayer * > additionalLayers() const
Returns the list of additional layers added to the model.
int columnCount(const QModelIndex &parent=QModelIndex()) const override
void setItemsCheckable(bool checkable)
setItemsCheckable defines if layers should be selectable in the widget
static QIcon iconForLayer(QgsMapLayer *layer)
Returns the icon corresponding to a specified map layer.
bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole) override
QgsMapLayer * layerFromIndex(const QModelIndex &index) const
Returns the map layer corresponding to the specified index.
Qt::DropActions supportedDropActions() const override
void setLayersChecked(const QList< QgsMapLayer * > &layers)
Sets which layers are checked in the model.
void checkAll(Qt::CheckState checkState)
checkAll changes the checkstate for all the layers
void removeLayers(const QStringList &layerIds)
QStringList mimeTypes() const override
bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override
bool itemsCanBeReordered() const
Returns true if items in the model can be reordered via drag and drop.
QMap< QString, Qt::CheckState > mLayersChecked
QgsMapLayerModel(QObject *parent=nullptr, QgsProject *project=nullptr)
QgsMapLayerModel creates a model to display layers in widgets.
QList< QgsMapLayer * > mLayers
void setAdditionalLayers(const QList< QgsMapLayer * > &layers)
Sets a list of additional layers to include in the model.
void addLayers(const QList< QgsMapLayer * > &layers)
QMimeData * mimeData(const QModelIndexList &indexes) const override
Base class for all map layer types.
virtual bool isSpatial() const
Returns true if the layer is considered a spatial layer, ie it has some form of geometry associated w...
QString publicSource() const
Gets a version of the internal layer definition that has sensitive bits removed (for example,...
QgsCoordinateReferenceSystem crs
QString id() const
Returns the layer's unique ID, which is used to access this layer from QgsProject.
QString abstract() const
Returns the abstract of the layer used by QGIS Server in GetCapabilities request.
QString shortName() const
Returns the short name of the layer used by QGIS Server to identify the layer.
QString title() const
Returns the title of the layer used by QGIS Server in GetCapabilities request.
void willBeDeleted()
Emitted in the destructor when the layer is about to be deleted, but it is still in a perfectly valid...
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
Q_INVOKABLE QgsMapLayer * mapLayer(const QString &layerId) const
Retrieve a pointer to a registered layer by layer ID.
void layersWillBeRemoved(const QStringList &layerIds)
Emitted when one or more layers are about to be removed from the registry.
void layersAdded(const QList< QgsMapLayer * > &layers)
Emitted when one or more layers were added to the registry.
QMap< QString, QgsMapLayer * > mapLayers(const bool validOnly=false) const
Returns a map of all registered layers by layer ID.
Represents a vector layer which manages a vector based data sets.
static QString displayString(Type type) SIP_HOLDGIL
Returns a non-translated display string type for a WKB type, e.g., the geometry name used in WKT geom...