19#include "moc_qgsmaplayermodel.cpp"
27 : QAbstractItemModel( parent )
28 , mProject( project ? project :
QgsProject::instance() )
35 : QAbstractItemModel( parent )
36 , mProject( project ? project :
QgsProject::instance() )
81 QMap<QString, Qt::CheckState>::iterator i =
mLayersChecked.begin();
93 if ( allowEmpty == mAllowEmpty )
98 beginInsertRows( QModelIndex(), 0, 0 );
104 beginRemoveRows( QModelIndex(), 0, 0 );
116 emit dataChanged(
index( 0, 0 ),
index(
rowCount() - 1, 0 ), QVector<int>() << Qt::DisplayRole );
121 QList<QgsMapLayer *> layers;
122 const auto constMLayers =
mLayers;
127 layers.append( layer );
135 QMap<QString, Qt::CheckState>::iterator i =
mLayersChecked.begin();
144 emit dataChanged(
index( 0, 0 ),
index(
rowCount() - 1, 0 ), QVector<int>() << Qt::CheckStateRole );
149 int r =
mLayers.indexOf( layer );
150 if ( r >= 0 && mAllowEmpty )
152 return index( r, 0 );
162 if ( items == mAdditionalItems )
172 if ( !mAdditionalItems.isEmpty() )
174 beginRemoveRows( QModelIndex(), offset, offset + mAdditionalItems.count() - 1 );
175 mAdditionalItems.clear();
180 beginInsertRows( QModelIndex(), offset, offset + items.count() - 1 );
181 mAdditionalItems = items;
190 QStringList layerIdsToRemove;
194 layerIdsToRemove << layer->id();
203 const QString layerId = layer->id();
222 for (
const QString &layerId : layerIds )
224 QModelIndex startIndex =
index( 0, 0 );
225 QModelIndexList list = match( startIndex,
static_cast< int >(
CustomRole::LayerId ), layerId, 1 );
226 if ( !list.isEmpty() )
228 QModelIndex
index = list[0];
229 beginRemoveRows( QModelIndex(),
index.row(),
index.row() );
239 if ( !layers.empty( ) )
245 beginInsertRows( QModelIndex(),
mLayers.count() + offset,
mLayers.count() + layers.count() - 1 + offset );
246 const auto constLayers = layers;
262 if ( hasIndex( row, column,
parent ) )
265 if ( row - offset >= 0 && row - offset <
mLayers.count() )
266 layer =
mLayers.at( row - offset );
268 return createIndex( row, column, layer );
271 return QModelIndex();
278 return QModelIndex();
287 return ( mAllowEmpty ? 1 : 0 ) +
mLayers.length() + mAdditionalItems.count();
299 if ( !
index.isValid() )
302 bool isEmpty =
index.row() == 0 && mAllowEmpty;
303 int additionalIndex =
index.row() - ( mAllowEmpty ? 1 : 0 ) -
mLayers.count();
307 case Qt::DisplayRole:
310 if (
index.row() == 0 && mAllowEmpty )
313 if ( additionalIndex >= 0 )
314 return mAdditionalItems.at( additionalIndex );
320 if ( !mShowCrs || !layer->
isSpatial() || role == Qt::EditRole )
322 return layer->
name();
326 return tr(
"%1 [%2]" ).arg( layer->
name(), layer->
crs().
authid() );
332 if ( isEmpty || additionalIndex >= 0 )
336 return layer ? layer->
id() : QVariant();
341 if ( isEmpty || additionalIndex >= 0 )
344 return QVariant::fromValue<QgsMapLayer *>(
mLayers.value(
index.row() - ( mAllowEmpty ? 1 : 0 ) ) );
351 return additionalIndex >= 0;
353 case Qt::CheckStateRole:
357 if ( isEmpty || additionalIndex >= 0 )
367 case Qt::ToolTipRole:
374 if ( title.isEmpty() )
375 title = layer->
name();
376 title =
"<b>" + title +
"</b>";
379 QString layerCrs = layer->
crs().
authid();
384 if (
QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( layer ) )
387 title = tr(
"%1 (%2)" ).arg( title, layerCrs );
392 if ( !abstract.isEmpty() )
393 parts <<
"<br/>" + abstract.replace( QLatin1String(
"\n" ), QLatin1String(
"<br/>" ) );
395 return parts.join( QLatin1String(
"<br/>" ) );
400 case Qt::DecorationRole:
403 return mEmptyIcon.isNull() ? QVariant() : mEmptyIcon;
405 if ( additionalIndex >= 0 )
424 QHash<int, QByteArray> roles = QAbstractItemModel::roleNames();
433 if ( !
index.isValid() )
436 return Qt::ItemIsDropEnabled;
438 return Qt::ItemFlags();
441 bool isEmpty =
index.row() == 0 && mAllowEmpty;
442 int additionalIndex =
index.row() - ( mAllowEmpty ? 1 : 0 ) -
mLayers.count();
444 Qt::ItemFlags
flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable;
446 if (
mCanReorder && !isEmpty && additionalIndex < 0 )
448 flags |= Qt::ItemIsDragEnabled;
453 flags |= Qt::ItemIsUserCheckable;
467 beginInsertRows(
parent, row, row + count - 1 );
468 for (
int i = row; i < row + count; ++i )
469 mLayers.insert( i - offset,
nullptr );
477 if (
parent.isValid() || row < 0 )
489 if ( row - offset >
mLayers.count() - 1 )
494 beginRemoveRows(
parent, row, row + count - 1 );
495 for (
int i = 0; i != count; ++i )
496 mLayers.removeAt( row - offset );
505 types << QStringLiteral(
"application/qgis.layermodeldata" );
511 if ( !
mCanReorder || action != Qt::MoveAction || !
data->hasFormat( QStringLiteral(
"application/qgis.layermodeldata" ) ) )
518 auto mimeData = std::make_unique< QMimeData >();
520 QByteArray encodedData;
521 QDataStream stream( &encodedData, QIODevice::WriteOnly );
522 QSet< QString > addedLayers;
524 for (
const QModelIndex &i : indexes )
529 if ( !addedLayers.contains(
id ) )
531 addedLayers.insert(
id );
536 mimeData->setData( QStringLiteral(
"application/qgis.layermodeldata" ), encodedData );
545 if ( action == Qt::IgnoreAction )
547 else if ( action != Qt::MoveAction )
550 QByteArray encodedData =
data->data( QStringLiteral(
"application/qgis.layermodeldata" ) );
551 QDataStream stream( &encodedData, QIODevice::ReadOnly );
552 QStringList newItems;
555 while ( !stream.atEnd() )
564 for (
const QString &text : std::as_const( newItems ) )
566 QModelIndex idx =
index( row, 0, QModelIndex() );
576 return Qt::MoveAction;
586 if ( !
index.isValid() )
589 bool isEmpty =
index.row() == 0 && mAllowEmpty;
590 int additionalIndex =
index.row() - ( mAllowEmpty ? 1 : 0 ) -
mLayers.count();
594 case Qt::CheckStateRole:
596 if ( !isEmpty && additionalIndex < 0 )
600 emit dataChanged(
index,
index, QVector< int >() << Qt::CheckStateRole );
607 if ( !isEmpty && additionalIndex < 0 )
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
double coordinateEpoch() const
Returns the coordinate epoch, as a decimal year.
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)
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
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)
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
@ Additional
True if index corresponds to an additional (non map layer) item.
@ Layer
Stores pointer to the map layer itself.
@ LayerId
Stores the map layer ID.
@ Empty
True if index corresponds to the empty (not set) value.
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
QString title() const
Returns the title 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 abstract() const
Returns the abstract of the layerused by QGIS Server in GetCapabilities request.
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...
QgsCoordinateReferenceSystem crs
QgsMapLayerServerProperties * serverProperties()
Returns QGIS Server Properties for the map layer.
QgsLayerMetadata metadata
QString publicSource(bool hidePassword=false) const
Gets a version of the internal layer definition that has sensitive bits removed (for example,...
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)
Returns a non-translated display string type for a WKB type, e.g., the geometry name used in WKT geom...
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.