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 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.