@@ -26,6 +26,9 @@ email : hugo dot mercier at oslandia dot com
26
26
#include < layertree/qgslayertreemodel.h>
27
27
#include < layertree/qgslayertreegroup.h>
28
28
#include < layertree/qgslayertreelayer.h>
29
+ #include < qgsproviderregistry.h>
30
+
31
+ #include " qgsembeddedlayerselectdialog.h"
29
32
30
33
#include < QUrl>
31
34
#include < Qsci/qscilexer.h>
@@ -40,6 +43,22 @@ QgsVirtualLayerSourceSelect::QgsVirtualLayerSourceSelect( QWidget* parent, Qt::W
40
43
41
44
QObject::connect ( mTestButton , SIGNAL ( clicked () ), this , SLOT ( onTestQuery () ) );
42
45
QObject::connect ( mBrowseCRSBtn , SIGNAL ( clicked () ), this , SLOT ( onBrowseCRS () ) );
46
+ QObject::connect ( mAddLayerBtn , SIGNAL ( clicked () ), this , SLOT ( onAddLayer () ) );
47
+ QObject::connect ( mRemoveLayerBtn , SIGNAL ( clicked () ), this , SLOT ( onRemoveLayer () ) );
48
+ QObject::connect ( mImportLayerBtn , SIGNAL ( clicked () ), this , SLOT ( onImportLayer () ) );
49
+ QObject::connect ( mLayersTable ->selectionModel (), SIGNAL ( currentRowChanged ( const QModelIndex&, const QModelIndex& ) ), this , SLOT ( onTableRowChanged ( const QModelIndex&, const QModelIndex& ) ) );
50
+
51
+ // prepare provider list
52
+ Q_FOREACH ( QString pk, QgsProviderRegistry::instance ()->providerList () )
53
+ {
54
+ // we cannot know before trying to actually load a dataset
55
+ // if the provider is raster or vector
56
+ // so we manually exclude well-known raster providers
57
+ if ( pk != " gdal" && pk != " ows" && pk != " wcs" && pk != " wms" )
58
+ {
59
+ mProviderList << pk;
60
+ }
61
+ }
43
62
44
63
QgsLayerTreeView* treeView = parent->findChild <QgsLayerTreeView*>( " theLayerTreeView" );
45
64
if ( treeView )
@@ -104,10 +123,9 @@ QgsVirtualLayerSourceSelect::QgsVirtualLayerSourceSelect( QWidget* parent, Qt::W
104
123
mQueryEdit ->lexer ()->setAPIs ( apis );
105
124
106
125
mQueryEdit ->setWrapMode ( QsciScintilla::WrapWord );
107
- }
108
126
109
- QgsVirtualLayerSourceSelect::~QgsVirtualLayerSourceSelect ()
110
- {
127
+ // prepare embedded layer selection dialog
128
+ mEmbeddedSelectionDialog = new QgsEmbeddedLayerSelectDialog ( this , treeView );
111
129
}
112
130
113
131
void QgsVirtualLayerSourceSelect::onLayerComboChanged ( int idx )
@@ -145,6 +163,15 @@ void QgsVirtualLayerSourceSelect::onLayerComboChanged( int idx )
145
163
mGeometryType ->setCurrentIndex ( static_cast <long >( def.geometryWkbType () ) - 1 );
146
164
mGeometryField ->setText ( def.geometryField () );
147
165
}
166
+
167
+ // add embedded layers
168
+ Q_FOREACH ( const QgsVirtualLayerDefinition::SourceLayer& l, def.sourceLayers () )
169
+ {
170
+ if ( ! l.isReferenced () )
171
+ {
172
+ addEmbeddedLayer ( l.name (), l.provider (), l.encoding (), l.source () );
173
+ }
174
+ }
148
175
}
149
176
150
177
void QgsVirtualLayerSourceSelect::onBrowseCRS ()
@@ -184,6 +211,17 @@ QgsVirtualLayerDefinition QgsVirtualLayerSourceSelect::getVirtualLayerDef()
184
211
def.setGeometryField ( mGeometryField ->text () );
185
212
def.setGeometrySrid ( mSrid );
186
213
}
214
+
215
+ // add embedded layers
216
+ for ( int i = 0 ; i < mLayersTable ->rowCount (); i++ )
217
+ {
218
+ QString name = mLayersTable ->item ( i, 0 )->text ();
219
+ QString provider = static_cast <QComboBox*>( mLayersTable ->cellWidget ( i, 1 ) )->currentText ();
220
+ QString encoding = static_cast <QComboBox*>( mLayersTable ->cellWidget ( i, 2 ) )->currentText ();
221
+ QString source = mLayersTable ->item ( i, 3 )->text ();
222
+ def.addSource ( name, source, provider, encoding );
223
+ }
224
+
187
225
return def;
188
226
}
189
227
@@ -202,6 +240,67 @@ void QgsVirtualLayerSourceSelect::onTestQuery()
202
240
}
203
241
}
204
242
243
+ void QgsVirtualLayerSourceSelect::onAddLayer ()
244
+ {
245
+ mLayersTable ->insertRow ( mLayersTable ->rowCount () );
246
+
247
+ mLayersTable ->setItem ( mLayersTable ->rowCount () - 1 , 0 , new QTableWidgetItem () );
248
+ mLayersTable ->setItem ( mLayersTable ->rowCount () - 1 , 3 , new QTableWidgetItem () );
249
+
250
+ QComboBox* providerCombo = new QComboBox ();
251
+ providerCombo->addItems ( mProviderList );
252
+ mLayersTable ->setCellWidget ( mLayersTable ->rowCount () - 1 , 1 , providerCombo );
253
+
254
+ QComboBox* encodingCombo = new QComboBox ();
255
+ encodingCombo->addItems ( QgsVectorDataProvider::availableEncodings () );
256
+ QString defaultEnc = QSettings ().value ( " /UI/encoding" , " System" ).toString ();
257
+ encodingCombo->setCurrentIndex ( encodingCombo->findText ( defaultEnc ) );
258
+ mLayersTable ->setCellWidget ( mLayersTable ->rowCount () - 1 , 2 , encodingCombo );
259
+ }
260
+
261
+ void QgsVirtualLayerSourceSelect::onRemoveLayer ()
262
+ {
263
+ int currentRow = mLayersTable ->selectionModel ()->currentIndex ().row ();
264
+ if ( currentRow != -1 )
265
+ mLayersTable ->removeRow ( currentRow );
266
+ }
267
+
268
+ void QgsVirtualLayerSourceSelect::onTableRowChanged ( const QModelIndex& current, const QModelIndex& previous )
269
+ {
270
+ Q_UNUSED ( previous );
271
+ mRemoveLayerBtn ->setEnabled ( current.row () != -1 );
272
+ }
273
+
274
+ void QgsVirtualLayerSourceSelect::addEmbeddedLayer ( QString name, QString provider, QString encoding, QString source )
275
+ {
276
+ // insert a new row
277
+ onAddLayer ();
278
+ const int n = mLayersTable ->rowCount () - 1 ;
279
+ // local name
280
+ mLayersTable ->item ( n, 0 )->setText ( name );
281
+ // source
282
+ mLayersTable ->item ( n, 3 )->setText ( source );
283
+ // provider
284
+ QComboBox* providerCombo = static_cast <QComboBox*>( mLayersTable ->cellWidget ( n, 1 ) );
285
+ providerCombo->setCurrentIndex ( providerCombo->findText ( provider ) );
286
+ // encoding
287
+ QComboBox* encodingCombo = static_cast <QComboBox*>( mLayersTable ->cellWidget ( n, 2 ) );
288
+ encodingCombo->setCurrentIndex ( encodingCombo->findText ( encoding ) );
289
+ }
290
+
291
+ void QgsVirtualLayerSourceSelect::onImportLayer ()
292
+ {
293
+ if ( mEmbeddedSelectionDialog ->exec () == QDialog::Accepted )
294
+ {
295
+ QStringList ids = mEmbeddedSelectionDialog ->layers ();
296
+ Q_FOREACH ( QString id, ids )
297
+ {
298
+ QgsVectorLayer *vl = static_cast <QgsVectorLayer*>( QgsMapLayerRegistry::instance ()->mapLayer ( id ) );
299
+ addEmbeddedLayer ( vl->name (), vl->providerType (), vl->dataProvider ()->encoding (), vl->source () );
300
+ }
301
+ }
302
+ }
303
+
205
304
void QgsVirtualLayerSourceSelect::on_buttonBox_accepted ()
206
305
{
207
306
QString layerName = " virtual_layer" ;
0 commit comments