26#include <QRegularExpression> 
   28static const char *QGIS_URILIST_MIMETYPE = 
"application/x-vnd.qgis.qgis.uri";
 
   33  const QStringList decoded = decode( encData );
 
   34  if ( decoded.size() < 4 )
 
   42  if ( 
layerType == QLatin1String( 
"raster" ) && decoded.size() >= 6 )
 
   53  if ( decoded.size() > 6 )
 
   55  if ( decoded.size() > 7 )
 
   56    pId = decoded.at( 7 );
 
   57  if ( decoded.size() > 8 )
 
   59  if ( decoded.size() > 9 )
 
   62  QgsDebugMsgLevel( QStringLiteral( 
"type:%1 key:%2 name:%3 uri:%4 supportedCRS:%5 supportedFormats:%6" )
 
 
   69  : providerKey( layer->providerType() )
 
   70  , name( layer->name() )
 
   71  , uri( layer->dataProvider() ? layer->dataProvider()->dataSourceUri() : layer->source() )
 
   72  , layerId( layer->id() )
 
   73  , pId( QString::number( QCoreApplication::applicationPid() ) )
 
   76  switch ( layer->
type() )
 
   80      wkbType = qobject_cast< QgsVectorLayer *>( layer )->wkbType();
 
 
  104  return encode( { layerType,
 
  108                   encode( supportedCrs ),
 
  109                   encode( supportedFormats ),
 
 
  121  if ( layerType != QLatin1String( 
"vector" ) )
 
  123    error = QObject::tr( 
"%1: Not a vector layer." ).arg( name );
 
  134  if ( providerKey == QLatin1String( 
"memory" ) )
 
  136    error = QObject::tr( 
"Cannot get memory layer." );
 
 
  149  if ( layerType != QLatin1String( 
"raster" ) )
 
  151    error = QObject::tr( 
"%1: Not a raster layer." ).arg( name );
 
 
  171  if ( layerType != QLatin1String( 
"mesh" ) )
 
  173    error = QObject::tr( 
"%1: Not a mesh layer." ).arg( name );
 
 
  202  return data->hasFormat( QGIS_URILIST_MIMETYPE );
 
 
  207  QMimeData *mimeData = 
new QMimeData();
 
  209  mimeData->setData( QGIS_URILIST_MIMETYPE, uriListToByteArray( layers ) );
 
 
  216  QByteArray encodedData = data->data( QGIS_URILIST_MIMETYPE );
 
  217  QDataStream stream( &encodedData, QIODevice::ReadOnly );
 
  220  while ( !stream.atEnd() )
 
  224    list.append( 
Uri( xUri ) );
 
 
  236      _addLayerTreeNodeToUriList( child, uris );
 
  255  const auto constNodes = nodes;
 
  257    _addLayerTreeNodeToUriList( node, uris );
 
  258  return uriListToByteArray( uris );
 
 
  263  if ( uri.
pId.isEmpty() )
 
  266  const qint64 pid = uri.
pId.toLongLong();
 
  267  return pid == QCoreApplication::applicationPid();
 
 
  270QString QgsMimeDataUtils::encode( 
const QStringList &items )
 
  274  const thread_local QRegularExpression re( QStringLiteral( 
"(?<!\\\\):" ) );
 
  275  const auto constItems = items;
 
  276  for ( 
const QString &item : constItems )
 
  279    str.replace( 
'\\', QLatin1String( 
"\\\\" ) );
 
  280    str.replace( re, QStringLiteral( 
"\\:" ) );
 
  281    encoded += str + 
':';
 
  283  return encoded.left( encoded.length() - 1 );
 
  286QStringList QgsMimeDataUtils::decode( 
const QString &encoded )
 
  290  bool inEscape = 
false;
 
  291  const auto constEncoded = encoded;
 
  292  for ( 
const QChar 
c : constEncoded )
 
  294    if ( 
c == 
'\\' && inEscape )
 
  298    else if ( 
c == 
'\\' )
 
  302    else if ( 
c == 
':' && !inEscape )
 
  304      items.append( item );
 
  313  items.append( item );
 
  320  QByteArray encodedData;
 
  322  QDataStream stream( &encodedData, QIODevice::WriteOnly );
 
  323  const auto constLayers = layers;
 
  324  for ( 
const Uri &u : constLayers )
 
@ Group
Composite group layer. Added in QGIS 3.24.
 
@ Plugin
Plugin based layer.
 
@ TiledScene
Tiled scene layer. Added in QGIS 3.34.
 
@ Annotation
Contains freeform, georeferenced annotations. Added in QGIS 3.16.
 
@ VectorTile
Vector tile layer. Added in QGIS 3.14.
 
@ Mesh
Mesh layer. Added in QGIS 3.2.
 
@ PointCloud
Point cloud layer. Added in QGIS 3.18.
 
Layer tree node points to a map layer.
 
QgsMapLayer * layer() const
Returns the map layer associated with this node.
 
Base class for nodes in a layer tree.
 
QList< QgsLayerTreeNode * > children()
Gets list of children of the node. Children are owned by the parent.
 
static QgsLayerTreeLayer * toLayer(QgsLayerTreeNode *node)
Cast node to a layer.
 
static bool isLayer(const QgsLayerTreeNode *node)
Check whether the node is a valid layer node.
 
static bool isGroup(QgsLayerTreeNode *node)
Check whether the node is a valid group node.
 
static QgsLayerTreeGroup * toGroup(QgsLayerTreeNode *node)
Cast node to a group.
 
static QString typeToString(Qgis::LayerType type)
Converts a map layer type to a string value.
 
Base class for all map layer types.
 
Represents a mesh layer supporting display of data on structured or unstructured meshes.
 
static QByteArray layerTreeNodesToUriList(const QList< QgsLayerTreeNode * > &nodes)
Returns encoded URI list from a list of layer tree nodes.
 
static bool isUriList(const QMimeData *data)
 
QList< QgsMimeDataUtils::Uri > UriList
 
static QMimeData * encodeUriList(const UriList &layers)
Encodes a URI list to a new QMimeData object.
 
static UriList decodeUriList(const QMimeData *data)
 
static bool hasOriginatedFromCurrentAppInstance(const QgsMimeDataUtils::Uri &uri)
Returns true if uri originated from the current QGIS application instance.
 
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.
 
QgsCoordinateTransformContext transformContext
 
Represents a raster layer.
 
Represents a vector layer which manages a vector based dataset.
 
static Qgis::WkbType parseType(const QString &wktStr)
Attempts to extract the WKB type from a WKT string.
 
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...
 
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
 
#define QgsDebugMsgLevel(str, level)
 
QgsMeshLayer * meshLayer(bool &owner, QString &error) const
Gets mesh layer from uri if possible, otherwise returns nullptr and error is set.
 
Qgis::WkbType wkbType
WKB type, if associated with a vector layer, or QgsWkbTypes::Unknown if not yet known.
 
QString filePath
Path to file, if uri is associated with a file.
 
QString uri
Identifier of the data source recognized by its providerKey.
 
QString name
Human readable name to be used e.g. in layer tree.
 
QgsMapLayer * mapLayer() const
Returns the layer from the active project corresponding to this uri (if possible),...
 
QString pId
Unique ID associated with application instance.
 
QgsRasterLayer * rasterLayer(bool &owner, QString &error) const
Gets raster layer from uri if possible, otherwise returns nullptr and error is set.
 
QString providerKey
For "vector" / "raster" type: provider id.
 
QgsVectorLayer * vectorLayer(bool &owner, QString &error) const
Gets vector layer from uri if possible, otherwise returns nullptr and error is set.
 
QString layerId
Layer ID, if uri is associated with a layer from a QgsProject.
 
QString data() const
Returns encoded representation of the object.
 
Uri()=default
Constructs invalid URI.
 
QStringList supportedFormats
 
QString layerType
Type of URI.
 
Setting options for loading vector layers.