17
17
#include " qgsmimedatautils.h"
18
18
19
19
#include " qgsdataitem.h"
20
+ #include " qgslayertree.h"
20
21
#include " qgslogger.h"
22
+ #include " qgspluginlayer.h"
23
+ #include " qgsrasterdataprovider.h"
24
+ #include " qgsrasterlayer.h"
25
+ #include " qgsvectordataprovider.h"
26
+ #include " qgsvectorlayer.h"
21
27
22
28
static const char * QGIS_URILIST_MIMETYPE = " application/x-vnd.qgis.qgis.uri" ;
23
29
@@ -70,15 +76,8 @@ bool QgsMimeDataUtils::isUriList( const QMimeData* data )
70
76
QMimeData* QgsMimeDataUtils::encodeUriList ( const QgsMimeDataUtils::UriList& layers )
71
77
{
72
78
QMimeData *mimeData = new QMimeData ();
73
- QByteArray encodedData;
74
79
75
- QDataStream stream ( &encodedData, QIODevice::WriteOnly );
76
- Q_FOREACH ( const Uri& u, layers )
77
- {
78
- stream << u.data ();
79
- }
80
-
81
- mimeData->setData ( QGIS_URILIST_MIMETYPE, encodedData );
80
+ mimeData->setData ( QGIS_URILIST_MIMETYPE, uriListToByteArray ( layers ) );
82
81
return mimeData;
83
82
}
84
83
@@ -98,6 +97,52 @@ QgsMimeDataUtils::UriList QgsMimeDataUtils::decodeUriList( const QMimeData* data
98
97
return list;
99
98
}
100
99
100
+
101
+ static void _addLayerTreeNodeToUriList ( QgsLayerTreeNode* node, QgsMimeDataUtils::UriList& uris )
102
+ {
103
+ if ( QgsLayerTree::isGroup ( node ) )
104
+ {
105
+ Q_FOREACH ( QgsLayerTreeNode* child, QgsLayerTree::toGroup ( node )->children () )
106
+ _addLayerTreeNodeToUriList ( child, uris );
107
+ }
108
+ else if ( QgsLayerTree::isLayer ( node ) )
109
+ {
110
+ QgsLayerTreeLayer* nodeLayer = QgsLayerTree::toLayer ( node );
111
+ if ( !nodeLayer->layer () )
112
+ return ;
113
+
114
+ QgsMimeDataUtils::Uri uri;
115
+ if ( QgsVectorLayer* vlayer = qobject_cast<QgsVectorLayer*>( nodeLayer->layer () ) )
116
+ {
117
+ uri.layerType = " vector" ;
118
+ uri.name = vlayer->name ();
119
+ uri.providerKey = vlayer->dataProvider ()->name ();
120
+ uri.uri = vlayer->dataProvider ()->dataSourceUri ();
121
+ }
122
+ else if ( QgsRasterLayer* rlayer = qobject_cast<QgsRasterLayer*>( nodeLayer->layer () ) )
123
+ {
124
+ uri.layerType = " raster" ;
125
+ uri.name = rlayer->name ();
126
+ uri.providerKey = rlayer->dataProvider ()->name ();
127
+ uri.uri = rlayer->dataProvider ()->dataSourceUri ();
128
+ }
129
+ else
130
+ {
131
+ // plugin layers do not have a standard way of storing their URI...
132
+ return ;
133
+ }
134
+ uris << uri;
135
+ }
136
+ }
137
+
138
+ QByteArray QgsMimeDataUtils::layerTreeNodesToUriList ( const QList<QgsLayerTreeNode *>& nodes )
139
+ {
140
+ UriList uris;
141
+ Q_FOREACH ( QgsLayerTreeNode* node, nodes )
142
+ _addLayerTreeNodeToUriList ( node, uris );
143
+ return uriListToByteArray ( uris );
144
+ }
145
+
101
146
QString QgsMimeDataUtils::encode ( const QStringList& items )
102
147
{
103
148
QString encoded;
@@ -141,3 +186,15 @@ QStringList QgsMimeDataUtils::decode( const QString& encoded )
141
186
return items;
142
187
}
143
188
189
+
190
+ QByteArray QgsMimeDataUtils::uriListToByteArray ( const QgsMimeDataUtils::UriList& layers )
191
+ {
192
+ QByteArray encodedData;
193
+
194
+ QDataStream stream ( &encodedData, QIODevice::WriteOnly );
195
+ Q_FOREACH ( const Uri& u, layers )
196
+ {
197
+ stream << u.data ();
198
+ }
199
+ return encodedData;
200
+ }
0 commit comments