15 #include <QStringList>
29 #include <QRegularExpression>
31 static const char *QGIS_URILIST_MIMETYPE =
"application/x-vnd.qgis.qgis.uri";
36 const QStringList decoded = decode( encData );
37 if ( decoded.size() < 4 )
45 if (
layerType == QLatin1String(
"raster" ) && decoded.size() >= 6 )
56 if ( decoded.size() > 6 )
58 if ( decoded.size() > 7 )
59 pId = decoded.at( 7 );
60 if ( decoded.size() > 8 )
63 QgsDebugMsgLevel( QStringLiteral(
"type:%1 key:%2 name:%3 uri:%4 supportedCRS:%5 supportedFormats:%6" )
70 : providerKey( layer->providerType() )
71 , name( layer->name() )
72 , uri( layer->dataProvider() ? layer->dataProvider()->dataSourceUri() : layer->source() )
73 , layerId( layer->id() )
74 , pId( QString::number( QCoreApplication::applicationPid() ) )
76 switch ( layer->
type() )
81 wkbType = qobject_cast< QgsVectorLayer *>( layer )->wkbType();
97 layerType = QStringLiteral(
"pointcloud" );
102 layerType = QStringLiteral(
"vector-tile" );
117 return encode( QStringList() << layerType << providerKey << name << uri << encode( supportedCrs ) << encode( supportedFormats ) << layerId << pId <<
QgsWkbTypes::displayString( wkbType ) );
124 if ( layerType != QLatin1String(
"vector" ) )
126 error = QObject::tr(
"%1: Not a vector layer." ).arg( name );
137 if ( providerKey == QLatin1String(
"memory" ) )
139 error = QObject::tr(
"Cannot get memory layer." );
152 if ( layerType != QLatin1String(
"raster" ) )
154 error = QObject::tr(
"%1: Not a raster layer." ).arg( name );
174 if ( layerType != QLatin1String(
"mesh" ) )
176 error = QObject::tr(
"%1: Not a mesh layer." ).arg( name );
205 return data->hasFormat( QGIS_URILIST_MIMETYPE );
210 QMimeData *mimeData =
new QMimeData();
212 mimeData->setData( QGIS_URILIST_MIMETYPE, uriListToByteArray( layers ) );
219 QByteArray encodedData = data->data( QGIS_URILIST_MIMETYPE );
220 QDataStream stream( &encodedData, QIODevice::ReadOnly );
223 while ( !stream.atEnd() )
227 list.append(
Uri( xUri ) );
239 _addLayerTreeNodeToUriList( child, uris );
258 const auto constNodes = nodes;
260 _addLayerTreeNodeToUriList( node, uris );
261 return uriListToByteArray( uris );
266 if ( uri.
pId.isEmpty() )
269 const qint64 pid = uri.
pId.toLongLong();
270 return pid == QCoreApplication::applicationPid();
273 QString QgsMimeDataUtils::encode(
const QStringList &items )
277 QRegularExpression re( QStringLiteral(
"(?<!\\\\):" ) );
278 const auto constItems = items;
279 for (
const QString &item : constItems )
282 str.replace(
'\\', QLatin1String(
"\\\\" ) );
283 str.replace( re, QStringLiteral(
"\\:" ) );
284 encoded += str +
':';
286 return encoded.left( encoded.length() - 1 );
289 QStringList QgsMimeDataUtils::decode(
const QString &encoded )
293 bool inEscape =
false;
294 const auto constEncoded = encoded;
295 for ( QChar
c : constEncoded )
297 if (
c ==
'\\' && inEscape )
301 else if (
c ==
'\\' )
305 else if (
c ==
':' && !inEscape )
307 items.append( item );
316 items.append( item );
323 QByteArray encodedData;
325 QDataStream stream( &encodedData, QIODevice::WriteOnly );
326 const auto constLayers = layers;
327 for (
const Uri &u : constLayers )
Layer tree node points to a map layer.
QgsMapLayer * layer() const
Returns the map layer associated with this node.
This class is a 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 bool isLayer(const QgsLayerTreeNode *node)
Check whether the node is a valid layer node.
static QgsLayerTreeLayer * toLayer(QgsLayerTreeNode *node)
Cast node to a layer.
static bool isGroup(QgsLayerTreeNode *node)
Check whether the node is a valid group node.
static QgsLayerTreeGroup * toGroup(QgsLayerTreeNode *node)
Cast node to a group.
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 data sets.
static Type parseType(const QString &wktStr)
Attempts to extract the WKB type from a WKT string.
static QString displayString(Type type) SIP_HOLDGIL
Returns a non-translated display string type for a WKB type, e.g., the geometry name used in WKT geom...
@ PointCloudLayer
Added in 3.18.
@ VectorTileLayer
Added in 3.14.
@ AnnotationLayer
Contains freeform, georeferenced annotations. Added in QGIS 3.16.
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.
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.
QgsWkbTypes::Type wkbType
WKB type, if associated with a vector layer, or QgsWkbTypes::Unknown if not yet known.
Uri()=default
Constructs invalid URI.
QStringList supportedFormats
QString layerType
Type of URI.
Setting options for loading vector layers.