Skip to content

Commit d9f0bb5

Browse files
committedMar 10, 2021
Allow point clouds, mesh, vector tiles to be exported to qlr
and qml files through layer tree menu, and ensure that the styles can be reapplied to the layer Fixes #42111 Fixes #42112
1 parent 3f5b165 commit d9f0bb5

File tree

3 files changed

+125
-68
lines changed

3 files changed

+125
-68
lines changed
 

‎src/app/qgisapp.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8916,6 +8916,8 @@ void QgisApp::saveStyleFile( QgsMapLayer *layer )
89168916

89178917
case QgsMapLayerType::RasterLayer:
89188918
case QgsMapLayerType::MeshLayer:
8919+
case QgsMapLayerType::PointCloudLayer:
8920+
case QgsMapLayerType::VectorTileLayer:
89198921
{
89208922
QgsSettings settings;
89218923
QString lastUsedDir = settings.value( QStringLiteral( "style/lastStyleDir" ), QDir::homePath() ).toString();
@@ -8938,10 +8940,8 @@ void QgisApp::saveStyleFile( QgsMapLayer *layer )
89388940
break;
89398941
}
89408942

8941-
case QgsMapLayerType::VectorTileLayer:
89428943
case QgsMapLayerType::AnnotationLayer:
89438944
case QgsMapLayerType::PluginLayer:
8944-
case QgsMapLayerType::PointCloudLayer:
89458945
break;
89468946

89478947
}

‎src/app/qgsapplayertreeviewmenuprovider.cpp

Lines changed: 80 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -432,58 +432,91 @@ QMenu *QgsAppLayerTreeViewMenuProvider::createContextMenu()
432432

433433
menu->addSeparator();
434434

435-
if ( vlayer )
435+
// export menu
436+
if ( layer )
436437
{
437-
if ( vlayer->isTemporary() )
438-
{
439-
QAction *actionMakePermanent = new QAction( QgsApplication::getThemeIcon( QStringLiteral( "mActionFileSave.svg" ) ), tr( "Make Permanent…" ), menu );
440-
connect( actionMakePermanent, &QAction::triggered, QgisApp::instance(), [ = ] { QgisApp::instance()->makeMemoryLayerPermanent( vlayer ); } );
441-
menu->addAction( actionMakePermanent );
442-
}
443-
// save as vector file
444-
QMenu *menuExportVector = new QMenu( tr( "E&xport" ), menu );
445-
QAction *actionSaveAs = new QAction( tr( "Save Features &As…" ), menuExportVector );
446-
connect( actionSaveAs, &QAction::triggered, QgisApp::instance(), [ = ] { QgisApp::instance()->saveAsFile(); } );
447-
actionSaveAs->setEnabled( vlayer->isValid() );
448-
menuExportVector->addAction( actionSaveAs );
449-
QAction *actionSaveSelectedFeaturesAs = new QAction( tr( "Save &Selected Features As…" ), menuExportVector );
450-
connect( actionSaveSelectedFeaturesAs, &QAction::triggered, QgisApp::instance(), [ = ] { QgisApp::instance()->saveAsFile( nullptr, true ); } );
451-
actionSaveSelectedFeaturesAs->setEnabled( vlayer->isValid() && vlayer->selectedFeatureCount() > 0 );
452-
menuExportVector->addAction( actionSaveSelectedFeaturesAs );
453-
QAction *actionSaveAsDefinitionLayer = new QAction( tr( "Save as Layer &Definition File…" ), menuExportVector );
454-
connect( actionSaveAsDefinitionLayer, &QAction::triggered, QgisApp::instance(), &QgisApp::saveAsLayerDefinition );
455-
menuExportVector->addAction( actionSaveAsDefinitionLayer );
456-
if ( vlayer->isSpatial() )
438+
switch ( layer->type() )
457439
{
458-
QAction *actionSaveStyle = new QAction( tr( "Save as &QGIS Layer Style File…" ), menuExportVector );
459-
connect( actionSaveStyle, &QAction::triggered, QgisApp::instance(), [ = ] { QgisApp::instance()->saveStyleFile(); } );
460-
menuExportVector->addAction( actionSaveStyle );
440+
case QgsMapLayerType::VectorLayer:
441+
if ( vlayer )
442+
{
443+
if ( vlayer->isTemporary() )
444+
{
445+
QAction *actionMakePermanent = new QAction( QgsApplication::getThemeIcon( QStringLiteral( "mActionFileSave.svg" ) ), tr( "Make Permanent…" ), menu );
446+
connect( actionMakePermanent, &QAction::triggered, QgisApp::instance(), [ = ] { QgisApp::instance()->makeMemoryLayerPermanent( vlayer ); } );
447+
menu->addAction( actionMakePermanent );
448+
}
449+
// save as vector file
450+
QMenu *menuExportVector = new QMenu( tr( "E&xport" ), menu );
451+
QAction *actionSaveAs = new QAction( tr( "Save Features &As…" ), menuExportVector );
452+
connect( actionSaveAs, &QAction::triggered, QgisApp::instance(), [ = ] { QgisApp::instance()->saveAsFile(); } );
453+
actionSaveAs->setEnabled( vlayer->isValid() );
454+
menuExportVector->addAction( actionSaveAs );
455+
QAction *actionSaveSelectedFeaturesAs = new QAction( tr( "Save &Selected Features As…" ), menuExportVector );
456+
connect( actionSaveSelectedFeaturesAs, &QAction::triggered, QgisApp::instance(), [ = ] { QgisApp::instance()->saveAsFile( nullptr, true ); } );
457+
actionSaveSelectedFeaturesAs->setEnabled( vlayer->isValid() && vlayer->selectedFeatureCount() > 0 );
458+
menuExportVector->addAction( actionSaveSelectedFeaturesAs );
459+
QAction *actionSaveAsDefinitionLayer = new QAction( tr( "Save as Layer &Definition File…" ), menuExportVector );
460+
connect( actionSaveAsDefinitionLayer, &QAction::triggered, QgisApp::instance(), &QgisApp::saveAsLayerDefinition );
461+
menuExportVector->addAction( actionSaveAsDefinitionLayer );
462+
if ( vlayer->isSpatial() )
463+
{
464+
QAction *actionSaveStyle = new QAction( tr( "Save as &QGIS Layer Style File…" ), menuExportVector );
465+
connect( actionSaveStyle, &QAction::triggered, QgisApp::instance(), [ = ] { QgisApp::instance()->saveStyleFile(); } );
466+
menuExportVector->addAction( actionSaveStyle );
467+
}
468+
menu->addMenu( menuExportVector );
469+
}
470+
break;
471+
472+
case QgsMapLayerType::RasterLayer:
473+
if ( rlayer )
474+
{
475+
QMenu *menuExportRaster = new QMenu( tr( "E&xport" ), menu );
476+
QAction *actionSaveAs = new QAction( tr( "Save &As…" ), menuExportRaster );
477+
QAction *actionSaveAsDefinitionLayer = new QAction( tr( "Save as Layer &Definition File…" ), menuExportRaster );
478+
QAction *actionSaveStyle = new QAction( tr( "Save as &QGIS Layer Style File…" ), menuExportRaster );
479+
connect( actionSaveAs, &QAction::triggered, QgisApp::instance(), [ = ] { QgisApp::instance()->saveAsFile(); } );
480+
menuExportRaster->addAction( actionSaveAs );
481+
actionSaveAs->setEnabled( rlayer->isValid() );
482+
connect( actionSaveAsDefinitionLayer, &QAction::triggered, QgisApp::instance(), &QgisApp::saveAsLayerDefinition );
483+
menuExportRaster->addAction( actionSaveAsDefinitionLayer );
484+
connect( actionSaveStyle, &QAction::triggered, QgisApp::instance(), [ = ] { QgisApp::instance()->saveStyleFile(); } );
485+
menuExportRaster->addAction( actionSaveStyle );
486+
menu->addMenu( menuExportRaster );
487+
}
488+
break;
489+
490+
case QgsMapLayerType::MeshLayer:
491+
case QgsMapLayerType::VectorTileLayer:
492+
case QgsMapLayerType::PointCloudLayer:
493+
{
494+
QMenu *menuExportRaster = new QMenu( tr( "E&xport" ), menu );
495+
QAction *actionSaveAsDefinitionLayer = new QAction( tr( "Save as Layer &Definition File…" ), menuExportRaster );
496+
QAction *actionSaveStyle = new QAction( tr( "Save as &QGIS Layer Style File…" ), menuExportRaster );
497+
connect( actionSaveAsDefinitionLayer, &QAction::triggered, QgisApp::instance(), &QgisApp::saveAsLayerDefinition );
498+
menuExportRaster->addAction( actionSaveAsDefinitionLayer );
499+
connect( actionSaveStyle, &QAction::triggered, QgisApp::instance(), [ = ] { QgisApp::instance()->saveStyleFile(); } );
500+
menuExportRaster->addAction( actionSaveStyle );
501+
menu->addMenu( menuExportRaster );
502+
}
503+
break;
504+
505+
case QgsMapLayerType::AnnotationLayer:
506+
break;
507+
508+
case QgsMapLayerType::PluginLayer:
509+
if ( mView->selectedLayerNodes().count() == 1 )
510+
{
511+
// disable duplication of plugin layers
512+
duplicateLayersAction->setEnabled( false );
513+
}
514+
break;
515+
461516
}
462-
menu->addMenu( menuExportVector );
463-
}
464-
else if ( rlayer )
465-
{
466-
QMenu *menuExportRaster = new QMenu( tr( "E&xport" ), menu );
467-
QAction *actionSaveAs = new QAction( tr( "Save &As…" ), menuExportRaster );
468-
QAction *actionSaveAsDefinitionLayer = new QAction( tr( "Save as Layer &Definition File…" ), menuExportRaster );
469-
QAction *actionSaveStyle = new QAction( tr( "Save as &QGIS Layer Style File…" ), menuExportRaster );
470-
connect( actionSaveAs, &QAction::triggered, QgisApp::instance(), [ = ] { QgisApp::instance()->saveAsFile(); } );
471-
menuExportRaster->addAction( actionSaveAs );
472-
actionSaveAs->setEnabled( rlayer->isValid() );
473-
connect( actionSaveAsDefinitionLayer, &QAction::triggered, QgisApp::instance(), &QgisApp::saveAsLayerDefinition );
474-
menuExportRaster->addAction( actionSaveAsDefinitionLayer );
475-
connect( actionSaveStyle, &QAction::triggered, QgisApp::instance(), [ = ] { QgisApp::instance()->saveStyleFile(); } );
476-
menuExportRaster->addAction( actionSaveStyle );
477-
menu->addMenu( menuExportRaster );
478-
}
479-
else if ( layer && layer->type() == QgsMapLayerType::PluginLayer && mView->selectedLayerNodes().count() == 1 )
480-
{
481-
// disable duplication of plugin layers
482-
duplicateLayersAction->setEnabled( false );
517+
menu->addSeparator();
483518
}
484519

485-
menu->addSeparator();
486-
487520
// style-related actions
488521
if ( layer && mView->selectedLayerNodes().count() == 1 )
489522
{

‎src/core/qgslayerdefinition.cpp

Lines changed: 43 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@
3030
#include "qgsvectorlayer.h"
3131
#include "qgsvectortilelayer.h"
3232
#include "qgsapplication.h"
33+
#include "qgsmaplayerfactory.h"
34+
#include "qgsmeshlayer.h"
35+
#include "qgspointcloudlayer.h"
36+
#include "qgsannotationlayer.h"
3337

3438
bool QgsLayerDefinition::loadLayerDefinition( const QString &path, QgsProject *project, QgsLayerTreeGroup *rootGroup, QString &errorMessage )
3539
{
@@ -294,26 +298,42 @@ QList<QgsMapLayer *> QgsLayerDefinition::loadLayerDefinitionLayersInternal( QDom
294298
const QString type = layerElem.attribute( QStringLiteral( "type" ) );
295299
QgsMapLayer *layer = nullptr;
296300

297-
if ( type == QLatin1String( "vector" ) )
301+
bool ok = false;
302+
const QgsMapLayerType layerType = QgsMapLayerFactory::typeFromString( type, ok );
303+
if ( ok )
298304
{
299-
layer = new QgsVectorLayer( );
300-
}
301-
else if ( type == QLatin1String( "raster" ) )
302-
{
303-
layer = new QgsRasterLayer;
304-
}
305-
else if ( type == QLatin1String( "vector-tile" ) )
306-
{
307-
layer = new QgsVectorTileLayer;
308-
}
309-
else if ( type == QLatin1String( "plugin" ) )
310-
{
311-
QString typeName = layerElem.attribute( QStringLiteral( "name" ) );
312-
layer = QgsApplication::pluginLayerRegistry()->createLayer( typeName );
313-
}
314-
else
315-
{
316-
errorMessage = QObject::tr( "Unsupported layer type: %1" ).arg( type );
305+
switch ( layerType )
306+
{
307+
case QgsMapLayerType::VectorLayer:
308+
layer = new QgsVectorLayer();
309+
break;
310+
311+
case QgsMapLayerType::RasterLayer:
312+
layer = new QgsRasterLayer();
313+
break;
314+
315+
case QgsMapLayerType::PluginLayer:
316+
{
317+
QString typeName = layerElem.attribute( QStringLiteral( "name" ) );
318+
layer = QgsApplication::pluginLayerRegistry()->createLayer( typeName );
319+
break;
320+
}
321+
322+
case QgsMapLayerType::MeshLayer:
323+
layer = new QgsMeshLayer();
324+
break;
325+
326+
case QgsMapLayerType::VectorTileLayer:
327+
layer = new QgsVectorTileLayer;
328+
break;
329+
330+
case QgsMapLayerType::PointCloudLayer:
331+
layer = new QgsPointCloudLayer();
332+
break;
333+
334+
case QgsMapLayerType::AnnotationLayer:
335+
break;
336+
}
317337
}
318338

319339
if ( layer )
@@ -323,6 +343,10 @@ QList<QgsMapLayer *> QgsLayerDefinition::loadLayerDefinitionLayersInternal( QDom
323343
layer->readLayerXml( layerElem, context );
324344
layers << layer;
325345
}
346+
else
347+
{
348+
errorMessage = QObject::tr( "Unsupported layer type: %1" ).arg( type );
349+
}
326350
layerElem = layerElem.nextSiblingElement( QStringLiteral( "maplayer" ) );
327351
}
328352
return layers;

0 commit comments

Comments
 (0)
Please sign in to comment.