Skip to content

Commit 7fb9392

Browse files
author
Hugo Mercier
committed
Add a basic GUI for virtual layer creation and add it to the main app
1 parent f351715 commit 7fb9392

File tree

9 files changed

+946
-15
lines changed

9 files changed

+946
-15
lines changed

images/images.qrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@
128128
<file>themes/default/mActionAddWfsLayer.svg</file>
129129
<file>themes/default/mActionAddWmsLayer.svg</file>
130130
<file>themes/default/mActionAddDelimitedTextLayer.svg</file>
131+
<file>themes/default/mActionAddVirtualLayer.svg</file>
131132
<file>themes/default/mActionAlignBottom.png</file>
132133
<file>themes/default/mActionAlignHCenter.png</file>
133134
<file>themes/default/mActionAlignLeft.png</file>
Lines changed: 276 additions & 0 deletions
Loading

src/app/qgisapp.cpp

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1415,6 +1415,7 @@ void QgisApp::createActions()
14151415
connect( mActionAddWcsLayer, SIGNAL( triggered() ), this, SLOT( addWcsLayer() ) );
14161416
connect( mActionAddWfsLayer, SIGNAL( triggered() ), this, SLOT( addWfsLayer() ) );
14171417
connect( mActionAddDelimitedText, SIGNAL( triggered() ), this, SLOT( addDelimitedTextLayer() ) );
1418+
connect( mActionAddVirtualLayer, SIGNAL( triggered() ), this, SLOT( addVirtualLayer() ) );
14181419
connect( mActionOpenTable, SIGNAL( triggered() ), this, SLOT( attributeTable() ) );
14191420
connect( mActionOpenFieldCalc, SIGNAL( triggered() ), this, SLOT( fieldCalculator() ) );
14201421
connect( mActionToggleEditing, SIGNAL( triggered() ), this, SLOT( toggleEditing() ) );
@@ -3758,11 +3759,74 @@ void QgisApp::addDelimitedTextLayer()
37583759
delete dts;
37593760
} // QgisApp::addDelimitedTextLayer()
37603761

3762+
void QgisApp::addVirtualLayer()
3763+
{
3764+
// show the Delimited text dialog
3765+
QDialog *dts = dynamic_cast<QDialog*>( QgsProviderRegistry::instance()->selectWidget( "virtual", this ) );
3766+
if ( !dts )
3767+
{
3768+
QMessageBox::warning( this, tr( "Virtual layer" ), tr( "Cannot get virtual layer select dialog from provider." ) );
3769+
return;
3770+
}
3771+
connect( dts, SIGNAL( addVectorLayer( QString, QString, QString ) ),
3772+
this, SLOT( addSelectedVectorLayer( QString, QString, QString ) ) );
3773+
connect( dts, SIGNAL( replaceVectorLayer( QString, QString, QString ) ),
3774+
this, SLOT( replaceSelectedVectorLayer( QString, QString, QString ) ) );
3775+
dts->exec();
3776+
delete dts;
3777+
} // QgisApp::addVirtualLayer()
3778+
37613779
void QgisApp::addSelectedVectorLayer( const QString& uri, const QString& layerName, const QString& provider )
37623780
{
37633781
addVectorLayer( uri, layerName, provider );
37643782
} // QgisApp:addSelectedVectorLayer
37653783

3784+
void QgisApp::replaceSelectedVectorLayer( const QString& uri, const QString& layerName, const QString& provider )
3785+
{
3786+
QList<QgsMapLayer*> selected = mLayerTreeView->selectedLayers();
3787+
if ( selected.size() != 1 && selected[0]->type() != QgsMapLayer::VectorLayer )
3788+
return;
3789+
3790+
QgsVectorLayer* oldLayer = static_cast<QgsVectorLayer*>( selected[0] );
3791+
QgsVectorLayer* newLayer = new QgsVectorLayer( uri, layerName, provider );
3792+
if ( !newLayer || !newLayer->isValid() )
3793+
return;
3794+
3795+
QgsMapLayerRegistry::instance()->addMapLayer( newLayer, /*addToLegend*/ false, /*takeOwnership*/ true );
3796+
// copy symbology, if possible
3797+
if ( oldLayer->geometryType() == newLayer->geometryType() )
3798+
{
3799+
QDomImplementation DomImplementation;
3800+
QDomDocumentType documentType =
3801+
DomImplementation.createDocumentType(
3802+
"qgis", "http://mrcc.com/qgis.dtd", "SYSTEM" );
3803+
QDomDocument doc( documentType );
3804+
QDomElement rootNode = doc.createElement( "qgis" );
3805+
rootNode.setAttribute( "version", QString( "%1" ).arg( QGis::QGIS_VERSION ) );
3806+
doc.appendChild( rootNode );
3807+
QString errorMsg;
3808+
oldLayer->writeSymbology( rootNode, doc, errorMsg );
3809+
newLayer->readSymbology( rootNode, errorMsg );
3810+
}
3811+
3812+
// get the index in its parent for the current layer
3813+
QgsLayerTreeLayer* inTree = QgsProject::instance()->layerTreeRoot()->findLayer( oldLayer->id() );
3814+
int idx = 0;
3815+
foreach ( QgsLayerTreeNode* vl, inTree->parent()->children() )
3816+
{
3817+
if ( vl->nodeType() == QgsLayerTreeNode::NodeLayer && static_cast<QgsLayerTreeLayer*>( vl )->layer() == oldLayer )
3818+
{
3819+
break;
3820+
}
3821+
idx++;
3822+
}
3823+
// insert the new layer
3824+
QgsLayerTreeGroup* parent = static_cast<QgsLayerTreeGroup*>( inTree->parent() ) ? static_cast<QgsLayerTreeGroup*>( inTree->parent() ) : QgsProject::instance()->layerTreeRoot();
3825+
parent->insertLayer( idx, newLayer );
3826+
// remove the current layer
3827+
QgsMapLayerRegistry::instance()->removeMapLayer( oldLayer );
3828+
} // QgisApp:replaceSelectedVectorLayer
3829+
37663830
void QgisApp::addMssqlLayer()
37673831
{
37683832
#ifdef HAVE_MSSQL

src/app/qgisapp.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -710,6 +710,8 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
710710
void addDelimitedTextLayer();
711711
//! Add a vector layer defined by uri, layer name, data source uri
712712
void addSelectedVectorLayer( const QString& uri, const QString& layerName, const QString& provider );
713+
//! Replace the selected layer by a vector layer defined by uri, layer name, data source uri
714+
void replaceSelectedVectorLayer( const QString& uri, const QString& layerName, const QString& provider );
713715
//#ifdef HAVE_MSSQL
714716
//! Add a MSSQL layer to the map
715717
void addMssqlLayer();
@@ -718,6 +720,8 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
718720
//! Add a Oracle layer to the map
719721
void addOracleLayer();
720722
//#endif
723+
//! Add a virtual layer
724+
void addVirtualLayer();
721725
//! toggles whether the current selected layer is in overview or not
722726
void isInOverview();
723727
//! Store the position for map tool tip

0 commit comments

Comments
 (0)