|
27 | 27 |
|
28 | 28 | static const char *QGIS_URILIST_MIMETYPE = "application/x-vnd.qgis.qgis.uri";
|
29 | 29 |
|
30 |
| - |
31 | 30 | QgsMimeDataUtils::Uri::Uri()
|
32 | 31 | {
|
33 | 32 | }
|
@@ -66,6 +65,41 @@ QString QgsMimeDataUtils::Uri::data() const
|
66 | 65 | return encode( QStringList() << layerType << providerKey << name << uri << encode( supportedCrs ) << encode( supportedFormats ) );
|
67 | 66 | }
|
68 | 67 |
|
| 68 | +QgsVectorLayer *QgsMimeDataUtils::Uri::vectorLayer( bool &owner, QString &error ) const |
| 69 | +{ |
| 70 | + owner = false; |
| 71 | + if ( layerType != QLatin1String( "vector" ) ) |
| 72 | + { |
| 73 | + error = QObject::tr( "%1: Not a vector layer." ).arg( name ); |
| 74 | + return nullptr; |
| 75 | + } |
| 76 | + if ( providerKey == QLatin1String( "memory" ) ) |
| 77 | + { |
| 78 | + QUrl url = QUrl::fromEncoded( uri.toUtf8() ); |
| 79 | + if ( !url.hasQueryItem( QStringLiteral( "pid" ) ) || !url.hasQueryItem( QStringLiteral( "layerid" ) ) ) |
| 80 | + { |
| 81 | + error = QObject::tr( "Memory layer uri does not contain process or layer id." ); |
| 82 | + return nullptr; |
| 83 | + } |
| 84 | + qint64 pid = url.queryItemValue( QStringLiteral( "pid" ) ).toLongLong(); |
| 85 | + if ( pid != QCoreApplication::applicationPid() ) |
| 86 | + { |
| 87 | + error = QObject::tr( "Memory layer from another QGIS instance." ); |
| 88 | + return nullptr; |
| 89 | + } |
| 90 | + QString layerId = url.queryItemValue( QStringLiteral( "layerid" ) ); |
| 91 | + QgsVectorLayer *vectorLayer = qobject_cast< QgsVectorLayer *>( QgsProject::instance()->mapLayer( layerId ) ); |
| 92 | + if ( !vectorLayer ) |
| 93 | + { |
| 94 | + error = QObject::tr( "Cannot get memory layer." ); |
| 95 | + return nullptr; |
| 96 | + } |
| 97 | + return vectorLayer; |
| 98 | + } |
| 99 | + owner = true; |
| 100 | + return new QgsVectorLayer( uri, name, providerKey ); |
| 101 | +} |
| 102 | + |
69 | 103 | // -----
|
70 | 104 |
|
71 | 105 | bool QgsMimeDataUtils::isUriList( const QMimeData *data )
|
@@ -119,6 +153,13 @@ static void _addLayerTreeNodeToUriList( QgsLayerTreeNode *node, QgsMimeDataUtils
|
119 | 153 | if ( layer->type() == QgsMapLayer::VectorLayer )
|
120 | 154 | {
|
121 | 155 | uri.layerType = QStringLiteral( "vector" );
|
| 156 | + if ( uri.providerKey == QStringLiteral( "memory" ) ) |
| 157 | + { |
| 158 | + QUrl url = QUrl::fromEncoded( uri.uri.toUtf8() ); |
| 159 | + url.addQueryItem( QStringLiteral( "pid" ), QString::number( QCoreApplication::applicationPid() ) ); |
| 160 | + url.addQueryItem( QStringLiteral( "layerid" ), layer->id() ); |
| 161 | + uri.uri = QString( url.toEncoded() ); |
| 162 | + } |
122 | 163 | }
|
123 | 164 | else if ( layer->type() == QgsMapLayer::RasterLayer )
|
124 | 165 | {
|
|
0 commit comments