@@ -84,6 +84,65 @@ void QgsAfsRootItem::newConnection()
84
84
85
85
// /////////////////////////////////////////////////////////////////////////////
86
86
87
+ void addFolderItems ( QVector< QgsDataItem * > &items, const QVariantMap &serviceData, const QString &baseUrl, const QString &authcfg, QgsDataItem *parent )
88
+ {
89
+ QgsArcGisRestUtils::visitFolderItems ( [parent, &baseUrl, &items, authcfg]( const QString & name, const QString & url )
90
+ {
91
+ std::unique_ptr< QgsAfsFolderItem > folderItem = qgis::make_unique< QgsAfsFolderItem >( parent, name, url, baseUrl, authcfg );
92
+ items.append ( folderItem.release () );
93
+ }, serviceData, baseUrl );
94
+ }
95
+
96
+ void addServiceItems ( QVector< QgsDataItem * > &items, const QVariantMap &serviceData, const QString &baseUrl, const QString &authcfg, QgsDataItem *parent,
97
+ const QString &parentName )
98
+ {
99
+ QgsArcGisRestUtils::visitServiceItems (
100
+ [&items, parent, authcfg]( const QString & name, const QString & url )
101
+ {
102
+ std::unique_ptr< QgsAfsServiceItem > serviceItem = qgis::make_unique< QgsAfsServiceItem >( parent, name, url, url, authcfg );
103
+ items.append ( serviceItem.release () );
104
+ }, serviceData, baseUrl, parentName );
105
+ }
106
+
107
+ void addLayerItems ( QVector< QgsDataItem * > &items, const QVariantMap &serviceData, const QString &parentUrl, const QString &authcfg, QgsDataItem *parent )
108
+ {
109
+ QMap< QString, QgsDataItem * > layerItems;
110
+ QMap< QString, QString > parents;
111
+
112
+ QgsArcGisRestUtils::addLayerItems ( [parent, &layerItems, &parents, authcfg]( const QString & parentLayerId, const QString & id, const QString & name, const QString & description, const QString & url, bool isParent, const QString & authid )
113
+ {
114
+ Q_UNUSED ( description );
115
+
116
+ if ( !parentLayerId.isEmpty () )
117
+ parents.insert ( id, parentLayerId );
118
+
119
+ if ( isParent )
120
+ {
121
+ std::unique_ptr< QgsAfsParentLayerItem > layerItem = qgis::make_unique< QgsAfsParentLayerItem >( parent, name, url, authcfg );
122
+ layerItems.insert ( id, layerItem.release () );
123
+ }
124
+ else
125
+ {
126
+ std::unique_ptr< QgsAfsLayerItem > layerItem = qgis::make_unique< QgsAfsLayerItem >( parent, name, url, name, authid, authcfg );
127
+ layerItems.insert ( id, layerItem.release () );
128
+ }
129
+
130
+ }, serviceData, parentUrl );
131
+
132
+ // create groups
133
+ for ( auto it = layerItems.constBegin (); it != layerItems.constEnd (); ++it )
134
+ {
135
+ const QString id = it.key ();
136
+ QgsDataItem *item = it.value ();
137
+ const QString parentId = parents.value ( id );
138
+
139
+ if ( QgsDataItem *layerParent = parentId.isEmpty () ? nullptr : layerItems.value ( parentId ) )
140
+ layerParent->addChildItem ( item );
141
+ else
142
+ items.append ( item );
143
+ }
144
+ }
145
+
87
146
QgsAfsConnectionItem::QgsAfsConnectionItem ( QgsDataItem *parent, const QString &name, const QString &path, const QString &connectionName )
88
147
: QgsDataCollectionItem( parent, name, path )
89
148
, mConnName( connectionName )
@@ -98,7 +157,7 @@ QVector<QgsDataItem *> QgsAfsConnectionItem::createChildren()
98
157
const QString url = connection.uri ().param ( QStringLiteral ( " url" ) );
99
158
const QString authcfg = connection.uri ().param ( QStringLiteral ( " authcfg" ) );
100
159
101
- QVector<QgsDataItem *> layers ;
160
+ QVector<QgsDataItem *> items ;
102
161
QString errorTitle, errorMessage;
103
162
const QVariantMap serviceData = QgsArcGisRestUtils::getServiceInfo ( url, authcfg, errorTitle, errorMessage );
104
163
if ( serviceData.isEmpty () )
@@ -107,29 +166,17 @@ QVector<QgsDataItem *> QgsAfsConnectionItem::createChildren()
107
166
{
108
167
std::unique_ptr< QgsErrorItem > error = qgis::make_unique< QgsErrorItem >( this , tr ( " Connection failed: %1" ).arg ( errorTitle ), mPath + " /error" );
109
168
error->setToolTip ( errorMessage );
110
- layers .append ( error.release () );
169
+ items .append ( error.release () );
111
170
QgsDebugMsg ( " Connection failed - " + errorMessage );
112
171
}
113
- return layers ;
172
+ return items ;
114
173
}
115
- const QString authid = QgsArcGisRestUtils::parseSpatialReference ( serviceData.value ( QStringLiteral ( " spatialReference" ) ).toMap () ).authid ();
116
174
117
- const QVariantList layerInfoList = serviceData[QStringLiteral ( " layers" )].toList ();
118
- for ( const QVariant &layerInfo : layerInfoList )
119
- {
120
- const QVariantMap layerInfoMap = layerInfo.toMap ();
121
- if ( !layerInfoMap.value ( QStringLiteral ( " subLayerIds" ) ).toList ().empty () )
122
- {
123
- // group layer - do not show as it is not possible to load
124
- // TODO - show nested groups
125
- continue ;
126
- }
127
- const QString id = layerInfoMap.value ( QStringLiteral ( " id" ) ).toString ();
128
- QgsAfsLayerItem *layer = new QgsAfsLayerItem ( this , mName , url + ' /' + id, layerInfoMap.value ( QStringLiteral ( " name" ) ).toString (), authid, authcfg );
129
- layers.append ( layer );
130
- }
175
+ addFolderItems ( items, serviceData, url, authcfg, this );
176
+ addServiceItems ( items, serviceData, url, authcfg, this , QString () );
177
+ addLayerItems ( items, serviceData, url, authcfg, this );
131
178
132
- return layers ;
179
+ return items ;
133
180
}
134
181
135
182
bool QgsAfsConnectionItem::equal ( const QgsDataItem *other )
@@ -199,18 +246,117 @@ void QgsAfsConnectionItem::refreshConnection()
199
246
}
200
247
#endif
201
248
202
- // /////////////////////////////////////////////////////////////////////////////
203
249
204
- QgsAfsLayerItem::QgsAfsLayerItem ( QgsDataItem *parent, const QString &name, const QString &url, const QString &title, const QString &authid, const QString &authcfg )
205
- : QgsLayerItem( parent, title, parent->path () + "/" + name, QString(), QgsLayerItem::Vector, QStringLiteral( " arcgisfeatureserver" ) )
250
+ QgsAfsFolderItem::QgsAfsFolderItem ( QgsDataItem *parent, const QString &name, const QString &path, const QString &baseUrl, const QString &authcfg )
251
+ : QgsDataCollectionItem( parent, name, path )
252
+ , mBaseUrl( baseUrl )
253
+ , mAuthCfg( authcfg )
254
+ {
255
+ mIconName = QStringLiteral ( " mIconDbSchema.svg" );
256
+ mCapabilities |= Collapse;
257
+ setToolTip ( path );
258
+ }
259
+
260
+
261
+ QVector<QgsDataItem *> QgsAfsFolderItem::createChildren ()
262
+ {
263
+ const QString url = mPath ;
264
+
265
+ QVector<QgsDataItem *> items;
266
+ QString errorTitle, errorMessage;
267
+ const QVariantMap serviceData = QgsArcGisRestUtils::getServiceInfo ( url, mAuthCfg , errorTitle, errorMessage );
268
+ if ( serviceData.isEmpty () )
269
+ {
270
+ if ( !errorMessage.isEmpty () )
271
+ {
272
+ std::unique_ptr< QgsErrorItem > error = qgis::make_unique< QgsErrorItem >( this , tr ( " Connection failed: %1" ).arg ( errorTitle ), mPath + " /error" );
273
+ error->setToolTip ( errorMessage );
274
+ items.append ( error.release () );
275
+ QgsDebugMsg ( " Connection failed - " + errorMessage );
276
+ }
277
+ return items;
278
+ }
279
+
280
+ addFolderItems ( items, serviceData, mBaseUrl , mAuthCfg , this );
281
+ addServiceItems ( items, serviceData, mBaseUrl , mAuthCfg , this , mName );
282
+ addLayerItems ( items, serviceData, mPath , mAuthCfg , this );
283
+ return items;
284
+ }
285
+
286
+ bool QgsAfsFolderItem::equal ( const QgsDataItem *other )
287
+ {
288
+ const QgsAfsFolderItem *o = qobject_cast<const QgsAfsFolderItem *>( other );
289
+ return ( type () == other->type () && o && mPath == o->mPath && mName == o->mName );
290
+ }
291
+
292
+ QgsAfsServiceItem::QgsAfsServiceItem ( QgsDataItem *parent, const QString &name, const QString &path, const QString &baseUrl, const QString &authcfg )
293
+ : QgsDataCollectionItem( parent, name, path )
294
+ , mBaseUrl( baseUrl )
295
+ , mAuthCfg( authcfg )
296
+ {
297
+ mIconName = QStringLiteral ( " mIconDbSchema.svg" );
298
+ mCapabilities |= Collapse;
299
+ setToolTip ( path );
300
+ }
301
+
302
+ QVector<QgsDataItem *> QgsAfsServiceItem::createChildren ()
303
+ {
304
+ const QString url = mPath ;
305
+
306
+ QVector<QgsDataItem *> items;
307
+ QString errorTitle, errorMessage;
308
+ const QVariantMap serviceData = QgsArcGisRestUtils::getServiceInfo ( url, mAuthCfg , errorTitle, errorMessage );
309
+ if ( serviceData.isEmpty () )
310
+ {
311
+ if ( !errorMessage.isEmpty () )
312
+ {
313
+ std::unique_ptr< QgsErrorItem > error = qgis::make_unique< QgsErrorItem >( this , tr ( " Connection failed: %1" ).arg ( errorTitle ), mPath + " /error" );
314
+ error->setToolTip ( errorMessage );
315
+ items.append ( error.release () );
316
+ QgsDebugMsg ( " Connection failed - " + errorMessage );
317
+ }
318
+ return items;
319
+ }
320
+
321
+ addFolderItems ( items, serviceData, mBaseUrl , mAuthCfg , this );
322
+ addServiceItems ( items, serviceData, mBaseUrl , mAuthCfg , this , mName );
323
+ addLayerItems ( items, serviceData, mPath , mAuthCfg , this );
324
+ return items;
325
+ }
326
+
327
+ bool QgsAfsServiceItem::equal ( const QgsDataItem *other )
328
+ {
329
+ const QgsAfsServiceItem *o = qobject_cast<const QgsAfsServiceItem *>( other );
330
+ return ( type () == other->type () && o && mPath == o->mPath && mName == o->mName );
331
+ }
332
+
333
+ QgsAfsLayerItem::QgsAfsLayerItem ( QgsDataItem *parent, const QString &, const QString &url, const QString &title, const QString &authid, const QString &authcfg )
334
+ : QgsLayerItem( parent, title, url, QString(), QgsLayerItem::Vector, QStringLiteral( " arcgisfeatureserver" ) )
206
335
{
207
336
mUri = QStringLiteral ( " crs='%1' url='%2'" ).arg ( authid, url );
208
337
if ( !authcfg.isEmpty () )
209
338
mUri += QStringLiteral ( " authcfg='%1'" ).arg ( authcfg );
210
339
setState ( Populated );
211
340
mIconName = QStringLiteral ( " mIconAfs.svg" );
341
+ setToolTip ( url );
342
+ }
343
+
344
+ QgsAfsParentLayerItem::QgsAfsParentLayerItem ( QgsDataItem *parent, const QString &name, const QString &path, const QString &authcfg )
345
+ : QgsDataItem( QgsDataItem::Collection, parent, name, path )
346
+ , mAuthCfg( authcfg )
347
+ {
348
+ mCapabilities |= Fast;
349
+ mIconName = QStringLiteral ( " mIconDbSchema.svg" );
350
+ setToolTip ( path );
212
351
}
213
352
353
+ bool QgsAfsParentLayerItem::equal ( const QgsDataItem *other )
354
+ {
355
+ const QgsAfsParentLayerItem *o = qobject_cast<const QgsAfsParentLayerItem *>( other );
356
+ return ( type () == other->type () && o && mPath == o->mPath && mName == o->mName );
357
+ }
358
+
359
+
214
360
//
215
361
// QgsAfsDataItemProvider
216
362
//
0 commit comments