26#include "moc_qgsmaplayermodel.cpp"
29 : QAbstractItemModel(
parent )
37 : QAbstractItemModel(
parent )
83 QMap<QString, Qt::CheckState>::iterator i =
mLayersChecked.begin();
95 if ( allowEmpty == mAllowEmpty )
100 beginInsertRows( QModelIndex(), 0, 0 );
106 beginRemoveRows( QModelIndex(), 0, 0 );
118 emit dataChanged(
index( 0, 0 ),
index(
rowCount() - 1, 0 ), QVector<int>() << Qt::DisplayRole );
123 QList<QgsMapLayer *> layers;
124 const auto constMLayers =
mLayers;
129 layers.append( layer );
137 QMap<QString, Qt::CheckState>::iterator i =
mLayersChecked.begin();
146 emit dataChanged(
index( 0, 0 ),
index(
rowCount() - 1, 0 ), QVector<int>() << Qt::CheckStateRole );
151 int r =
mLayers.indexOf( layer );
152 if ( r >= 0 && mAllowEmpty )
154 return index( r, 0 );
164 if ( items == mAdditionalItems )
174 if ( !mAdditionalItems.isEmpty() )
176 beginRemoveRows( QModelIndex(), offset, offset + mAdditionalItems.count() - 1 );
177 mAdditionalItems.clear();
182 beginInsertRows( QModelIndex(), offset, offset + items.count() - 1 );
183 mAdditionalItems = items;
192 QStringList layerIdsToRemove;
196 layerIdsToRemove << layer->id();
205 const QString layerId = layer->id();
224 for (
const QString &layerId : layerIds )
226 QModelIndex startIndex =
index( 0, 0 );
227 QModelIndexList list = match( startIndex,
static_cast< int >(
CustomRole::LayerId ), layerId, 1 );
228 if ( !list.isEmpty() )
230 QModelIndex
index = list[0];
231 beginRemoveRows( QModelIndex(),
index.row(),
index.row() );
241 if ( !layers.empty( ) )
247 beginInsertRows( QModelIndex(),
mLayers.count() + offset,
mLayers.count() + layers.count() - 1 + offset );
248 const auto constLayers = layers;
264 if ( hasIndex( row, column,
parent ) )
267 if ( row - offset >= 0 && row - offset <
mLayers.count() )
268 layer =
mLayers.at( row - offset );
270 return createIndex( row, column, layer );
273 return QModelIndex();
280 return QModelIndex();
289 return ( mAllowEmpty ? 1 : 0 ) +
mLayers.length() + mAdditionalItems.count();
301 if ( !
index.isValid() )
304 bool isEmpty =
index.row() == 0 && mAllowEmpty;
305 int additionalIndex =
index.row() - ( mAllowEmpty ? 1 : 0 ) -
mLayers.count();
309 case Qt::DisplayRole:
312 if (
index.row() == 0 && mAllowEmpty )
315 if ( additionalIndex >= 0 )
316 return mAdditionalItems.at( additionalIndex );
322 if ( !mShowCrs || !layer->
isSpatial() || role == Qt::EditRole )
324 return layer->
name();
328 return tr(
"%1 [%2]" ).arg( layer->
name(), layer->
crs().
authid() );
334 if ( isEmpty || additionalIndex >= 0 )
338 return layer ? layer->
id() : QVariant();
343 if ( isEmpty || additionalIndex >= 0 )
346 return QVariant::fromValue<QgsMapLayer *>(
mLayers.value(
index.row() - ( mAllowEmpty ? 1 : 0 ) ) );
353 return additionalIndex >= 0;
355 case Qt::CheckStateRole:
359 if ( isEmpty || additionalIndex >= 0 )
369 case Qt::ToolTipRole:
376 if ( title.isEmpty() )
377 title = layer->
name();
378 title =
"<b>" + title +
"</b>";
381 QString layerCrs = layer->
crs().
authid();
386 if (
QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( layer ) )
389 title = tr(
"%1 (%2)" ).arg( title, layerCrs );
394 if ( !abstract.isEmpty() )
395 parts <<
"<br/>" + abstract.replace( QLatin1String(
"\n" ), QLatin1String(
"<br/>" ) );
397 return parts.join( QLatin1String(
"<br/>" ) );
402 case Qt::DecorationRole:
405 return mEmptyIcon.isNull() ? QVariant() : mEmptyIcon;
407 if ( additionalIndex >= 0 )
426 QHash<int, QByteArray> roles = QAbstractItemModel::roleNames();
435 if ( !
index.isValid() )
438 return Qt::ItemIsDropEnabled;
440 return Qt::ItemFlags();
443 bool isEmpty =
index.row() == 0 && mAllowEmpty;
444 int additionalIndex =
index.row() - ( mAllowEmpty ? 1 : 0 ) -
mLayers.count();
446 Qt::ItemFlags
flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable;
448 if (
mCanReorder && !isEmpty && additionalIndex < 0 )
450 flags |= Qt::ItemIsDragEnabled;
455 flags |= Qt::ItemIsUserCheckable;
469 beginInsertRows(
parent, row, row + count - 1 );
470 for (
int i = row; i < row + count; ++i )
471 mLayers.insert( i - offset,
nullptr );
479 if (
parent.isValid() || row < 0 )
491 if ( row - offset >
mLayers.count() - 1 )
496 beginRemoveRows(
parent, row, row + count - 1 );
497 for (
int i = 0; i != count; ++i )
498 mLayers.removeAt( row - offset );
507 types << QStringLiteral(
"application/qgis.layermodeldata" );
513 if ( !
mCanReorder || action != Qt::MoveAction || !
data->hasFormat( QStringLiteral(
"application/qgis.layermodeldata" ) ) )
520 auto mimeData = std::make_unique< QMimeData >();
522 QByteArray encodedData;
523 QDataStream stream( &encodedData, QIODevice::WriteOnly );
524 QSet< QString > addedLayers;
526 for (
const QModelIndex &i : indexes )
531 if ( !addedLayers.contains(
id ) )
533 addedLayers.insert(
id );
538 mimeData->setData( QStringLiteral(
"application/qgis.layermodeldata" ), encodedData );
547 if ( action == Qt::IgnoreAction )
549 else if ( action != Qt::MoveAction )
552 QByteArray encodedData =
data->data( QStringLiteral(
"application/qgis.layermodeldata" ) );
553 QDataStream stream( &encodedData, QIODevice::ReadOnly );
554 QStringList newItems;
557 while ( !stream.atEnd() )
566 for (
const QString &text : std::as_const( newItems ) )
568 QModelIndex idx =
index( row, 0, QModelIndex() );
578 return Qt::MoveAction;
588 if ( !
index.isValid() )
591 bool isEmpty =
index.row() == 0 && mAllowEmpty;
592 int additionalIndex =
index.row() - ( mAllowEmpty ? 1 : 0 ) -
mLayers.count();
596 case Qt::CheckStateRole:
598 if ( !isEmpty && additionalIndex < 0 )
602 emit dataChanged(
index,
index, QVector< int >() << Qt::CheckStateRole );
609 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.