27 : QAbstractItemModel( parent )
28 , mProject( project ? project :
QgsProject::instance() )
35 : QAbstractItemModel( parent )
36 , mProject( project ? project :
QgsProject::instance() )
79 QMap<QString, Qt::CheckState>::iterator i =
mLayersChecked.begin();
91 if ( allowEmpty == mAllowEmpty )
96 beginInsertRows( QModelIndex(), 0, 0 );
102 beginRemoveRows( QModelIndex(), 0, 0 );
114 emit dataChanged(
index( 0, 0 ),
index(
rowCount() - 1, 0 ), QVector<int>() << Qt::DisplayRole );
119 QList<QgsMapLayer *> layers;
120 const auto constMLayers =
mLayers;
125 layers.append( layer );
133 QMap<QString, Qt::CheckState>::iterator i =
mLayersChecked.begin();
142 emit dataChanged(
index( 0, 0 ),
index(
rowCount() - 1, 0 ), QVector<int>() << Qt::CheckStateRole );
147 int r =
mLayers.indexOf( layer );
148 if ( r >= 0 && mAllowEmpty )
150 return index( r, 0 );
160 if ( items == mAdditionalItems )
170 if ( !mAdditionalItems.isEmpty() )
172 beginRemoveRows( QModelIndex(), offset, offset + mAdditionalItems.count() - 1 );
173 mAdditionalItems.clear();
178 beginInsertRows( QModelIndex(), offset, offset + items.count() - 1 );
179 mAdditionalItems = items;
188 QStringList layerIdsToRemove;
192 layerIdsToRemove << layer->id();
201 const QString layerId = layer->id();
220 for (
const QString &layerId : layerIds )
222 QModelIndex startIndex =
index( 0, 0 );
223 QModelIndexList list = match( startIndex,
LayerIdRole, layerId, 1 );
224 if ( !list.isEmpty() )
226 QModelIndex
index = list[0];
227 beginRemoveRows( QModelIndex(),
index.row(),
index.row() );
237 if ( !layers.empty( ) )
243 beginInsertRows( QModelIndex(),
mLayers.count() + offset,
mLayers.count() + layers.count() - 1 + offset );
244 const auto constLayers = layers;
260 if ( hasIndex( row, column,
parent ) )
263 if ( row - offset >= 0 && row - offset <
mLayers.count() )
264 layer =
mLayers.at( row - offset );
266 return createIndex( row, column, layer );
269 return QModelIndex();
276 return QModelIndex();
285 return ( mAllowEmpty ? 1 : 0 ) +
mLayers.length() + mAdditionalItems.count();
297 if ( !
index.isValid() )
300 bool isEmpty =
index.row() == 0 && mAllowEmpty;
301 int additionalIndex =
index.row() - ( mAllowEmpty ? 1 : 0 ) -
mLayers.count();
305 case Qt::DisplayRole:
308 if (
index.row() == 0 && mAllowEmpty )
311 if ( additionalIndex >= 0 )
312 return mAdditionalItems.at( additionalIndex );
318 if ( !mShowCrs || !layer->
isSpatial() || role == Qt::EditRole )
320 return layer->
name();
324 return tr(
"%1 [%2]" ).arg( layer->
name(), layer->
crs().
authid() );
330 if ( isEmpty || additionalIndex >= 0 )
334 return layer ? layer->
id() : QVariant();
339 if ( isEmpty || additionalIndex >= 0 )
342 return QVariant::fromValue<QgsMapLayer *>(
mLayers.value(
index.row() - ( mAllowEmpty ? 1 : 0 ) ) );
349 return additionalIndex >= 0;
351 case Qt::CheckStateRole:
355 if ( isEmpty || additionalIndex >= 0 )
365 case Qt::ToolTipRole:
372 if ( title.isEmpty() )
373 title = layer->
name();
374 title =
"<b>" + title +
"</b>";
377 if (
QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( layer ) )
380 title = tr(
"%1 (%2) " ).arg( title, layer->
crs().
authid() );
385 parts <<
"<br/>" + layer->
abstract().replace( QLatin1String(
"\n" ), QLatin1String(
"<br/>" ) );
387 return parts.join( QLatin1String(
"<br/>" ) );
392 case Qt::DecorationRole:
395 return mEmptyIcon.isNull() ? QVariant() : mEmptyIcon;
397 if ( additionalIndex >= 0 )
413 QHash<int, QByteArray> roles = QAbstractItemModel::roleNames();
422 if ( !
index.isValid() )
425 return Qt::ItemIsDropEnabled;
427 return Qt::ItemFlags();
430 bool isEmpty =
index.row() == 0 && mAllowEmpty;
431 int additionalIndex =
index.row() - ( mAllowEmpty ? 1 : 0 ) -
mLayers.count();
433 Qt::ItemFlags
flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable;
435 if (
mCanReorder && !isEmpty && additionalIndex < 0 )
437 flags |= Qt::ItemIsDragEnabled;
442 flags |= Qt::ItemIsUserCheckable;
456 beginInsertRows(
parent, row, row + count - 1 );
457 for (
int i = row; i < row + count; ++i )
458 mLayers.insert( i - offset,
nullptr );
466 if (
parent.isValid() || row < 0 )
478 if ( row - offset >
mLayers.count() - 1 )
483 beginRemoveRows(
parent, row, row + count - 1 );
484 for (
int i = 0; i != count; ++i )
485 mLayers.removeAt( row - offset );
494 types << QStringLiteral(
"application/qgis.layermodeldata" );
500 if ( !
mCanReorder || action != Qt::MoveAction || !
data->hasFormat( QStringLiteral(
"application/qgis.layermodeldata" ) ) )
507 std::unique_ptr< QMimeData >
mimeData = std::make_unique< QMimeData >();
509 QByteArray encodedData;
510 QDataStream stream( &encodedData, QIODevice::WriteOnly );
511 QSet< QString > addedLayers;
513 for (
const QModelIndex &i : indexes )
518 if ( !addedLayers.contains(
id ) )
520 addedLayers.insert(
id );
525 mimeData->setData( QStringLiteral(
"application/qgis.layermodeldata" ), encodedData );
534 if ( action == Qt::IgnoreAction )
536 else if ( action != Qt::MoveAction )
539 QByteArray encodedData =
data->data( QStringLiteral(
"application/qgis.layermodeldata" ) );
540 QDataStream stream( &encodedData, QIODevice::ReadOnly );
541 QStringList newItems;
544 while ( !stream.atEnd() )
553 for (
const QString &text : std::as_const( newItems ) )
555 QModelIndex idx =
index( row, 0, QModelIndex() );
565 return Qt::MoveAction;
575 if ( !
index.isValid() )
578 bool isEmpty =
index.row() == 0 && mAllowEmpty;
579 int additionalIndex =
index.row() - ( mAllowEmpty ? 1 : 0 ) -
mLayers.count();
583 case Qt::CheckStateRole:
585 if ( !isEmpty && additionalIndex < 0 )
589 emit dataChanged(
index,
index, QVector< int >() << Qt::CheckStateRole );
596 if ( !isEmpty && additionalIndex < 0 )
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
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
void setProject(QgsProject *project)
Sets the QgsProject from which map layers are shown.
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,...
static QgsProject * instance()
Returns the QgsProject singleton instance.
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(Qgis::WkbType type) SIP_HOLDGIL
Returns a non-translated display string type for a WKB type, e.g., the geometry name used in WKT geom...