27#include "moc_qgsmaplayermodel.cpp"
29using namespace Qt::StringLiterals;
32 : QAbstractItemModel(
parent )
40 : QAbstractItemModel(
parent )
86 QMap<QString, Qt::CheckState>::iterator i =
mLayersChecked.begin();
98 if ( allowEmpty == mAllowEmpty )
103 beginInsertRows( QModelIndex(), 0, 0 );
109 beginRemoveRows( QModelIndex(), 0, 0 );
121 emit dataChanged(
index( 0, 0 ),
index(
rowCount() - 1, 0 ), QVector<int>() << Qt::DisplayRole );
126 QList<QgsMapLayer *> layers;
127 const auto constMLayers =
mLayers;
132 layers.append( layer );
140 QMap<QString, Qt::CheckState>::iterator i =
mLayersChecked.begin();
149 emit dataChanged(
index( 0, 0 ),
index(
rowCount() - 1, 0 ), QVector<int>() << Qt::CheckStateRole );
154 int r =
mLayers.indexOf( layer );
155 if ( r >= 0 && mAllowEmpty )
157 return index( r, 0 );
167 if ( items == mAdditionalItems )
177 if ( !mAdditionalItems.isEmpty() )
179 beginRemoveRows( QModelIndex(), offset, offset + mAdditionalItems.count() - 1 );
180 mAdditionalItems.clear();
185 beginInsertRows( QModelIndex(), offset, offset + items.count() - 1 );
186 mAdditionalItems = items;
195 QStringList layerIdsToRemove;
199 layerIdsToRemove << layer->id();
208 const QString layerId = layer->id();
227 for (
const QString &layerId : layerIds )
229 QModelIndex startIndex =
index( 0, 0 );
230 QModelIndexList list = match( startIndex,
static_cast< int >(
CustomRole::LayerId ), layerId, 1 );
231 if ( !list.isEmpty() )
233 QModelIndex
index = list[0];
234 beginRemoveRows( QModelIndex(),
index.row(),
index.row() );
244 if ( !layers.empty( ) )
250 beginInsertRows( QModelIndex(),
mLayers.count() + offset,
mLayers.count() + layers.count() - 1 + offset );
251 const auto constLayers = layers;
267 if ( hasIndex( row, column,
parent ) )
270 if ( row - offset >= 0 && row - offset <
mLayers.count() )
271 layer =
mLayers.at( row - offset );
273 return createIndex( row, column, layer );
276 return QModelIndex();
283 return QModelIndex();
292 return ( mAllowEmpty ? 1 : 0 ) +
mLayers.length() + mAdditionalItems.count();
304 if ( !
index.isValid() )
307 bool isEmpty =
index.row() == 0 && mAllowEmpty;
308 int additionalIndex =
index.row() - ( mAllowEmpty ? 1 : 0 ) -
mLayers.count();
312 case Qt::DisplayRole:
315 if (
index.row() == 0 && mAllowEmpty )
318 if ( additionalIndex >= 0 )
319 return mAdditionalItems.at( additionalIndex );
325 if ( !mShowCrs || !layer->
isSpatial() || role == Qt::EditRole )
327 return layer->
name();
331 return tr(
"%1 [%2]" ).arg( layer->
name(), layer->
crs().
authid() );
337 if ( isEmpty || additionalIndex >= 0 )
341 return layer ? layer->
id() : QVariant();
346 if ( isEmpty || additionalIndex >= 0 )
349 return QVariant::fromValue<QgsMapLayer *>(
mLayers.value(
index.row() - ( mAllowEmpty ? 1 : 0 ) ) );
356 return additionalIndex >= 0;
358 case Qt::CheckStateRole:
362 if ( isEmpty || additionalIndex >= 0 )
372 case Qt::ToolTipRole:
379 if ( title.isEmpty() )
380 title = layer->
name();
381 title =
"<b>" + title +
"</b>";
384 QString layerCrs = layer->
crs().
authid();
389 if (
QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( layer ) )
392 title = tr(
"%1 (%2)" ).arg( title, layerCrs );
397 if ( !abstract.isEmpty() )
398 parts <<
"<br/>" + abstract.replace(
"\n"_L1,
"<br/>"_L1 );
400 return parts.join(
"<br/>"_L1 );
405 case Qt::DecorationRole:
408 return mEmptyIcon.isNull() ? QVariant() : mEmptyIcon;
410 if ( additionalIndex >= 0 )
429 QHash<int, QByteArray> roles = QAbstractItemModel::roleNames();
438 if ( !
index.isValid() )
441 return Qt::ItemIsDropEnabled;
443 return Qt::ItemFlags();
446 bool isEmpty =
index.row() == 0 && mAllowEmpty;
447 int additionalIndex =
index.row() - ( mAllowEmpty ? 1 : 0 ) -
mLayers.count();
449 Qt::ItemFlags
flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable;
451 if (
mCanReorder && !isEmpty && additionalIndex < 0 )
453 flags |= Qt::ItemIsDragEnabled;
458 flags |= Qt::ItemIsUserCheckable;
472 beginInsertRows(
parent, row, row + count - 1 );
473 for (
int i = row; i < row + count; ++i )
474 mLayers.insert( i - offset,
nullptr );
482 if (
parent.isValid() || row < 0 )
494 if ( row - offset >
mLayers.count() - 1 )
499 beginRemoveRows(
parent, row, row + count - 1 );
500 for (
int i = 0; i != count; ++i )
501 mLayers.removeAt( row - offset );
510 types << u
"application/qgis.layermodeldata"_s;
516 if ( !
mCanReorder || action != Qt::MoveAction || !
data->hasFormat( u
"application/qgis.layermodeldata"_s ) )
523 auto mimeData = std::make_unique< QMimeData >();
525 QByteArray encodedData;
526 QDataStream stream( &encodedData, QIODevice::WriteOnly );
527 QSet< QString > addedLayers;
529 for (
const QModelIndex &i : indexes )
534 if ( !addedLayers.contains(
id ) )
536 addedLayers.insert(
id );
541 mimeData->setData( u
"application/qgis.layermodeldata"_s, encodedData );
550 if ( action == Qt::IgnoreAction )
552 else if ( action != Qt::MoveAction )
555 QByteArray encodedData =
data->data( u
"application/qgis.layermodeldata"_s );
556 QDataStream stream( &encodedData, QIODevice::ReadOnly );
557 QStringList newItems;
560 while ( !stream.atEnd() )
569 for (
const QString &text : std::as_const( newItems ) )
571 QModelIndex idx =
index( row, 0, QModelIndex() );
581 return Qt::MoveAction;
591 if ( !
index.isValid() )
594 bool isEmpty =
index.row() == 0 && mAllowEmpty;
595 int additionalIndex =
index.row() - ( mAllowEmpty ? 1 : 0 ) -
mLayers.count();
599 case Qt::CheckStateRole:
601 if ( !isEmpty && additionalIndex < 0 )
605 emit dataChanged(
index,
index, QVector< int >() << Qt::CheckStateRole );
612 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.
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.
Represents a vector layer which manages a vector based dataset.
static Q_INVOKABLE 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.