Skip to content

Commit dbe45b8

Browse files
committedFeb 5, 2018
Modernize paste to memory layer code
1 parent 5ba69ea commit dbe45b8

File tree

2 files changed

+23
-27
lines changed

2 files changed

+23
-27
lines changed
 

‎src/app/qgisapp.cpp

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8220,18 +8220,15 @@ void QgisApp::pasteFromClipboard( QgsMapLayer *destinationLayer )
82208220
void QgisApp::pasteAsNewVector()
82218221
{
82228222

8223-
QgsVectorLayer *layer = pasteToNewMemoryVector();
8223+
std::unique_ptr< QgsVectorLayer > layer = pasteToNewMemoryVector();
82248224
if ( !layer )
82258225
return;
82268226

8227-
saveAsVectorFileGeneral( layer, false );
8228-
8229-
delete layer;
8227+
saveAsVectorFileGeneral( layer.get(), false );
82308228
}
82318229

82328230
QgsVectorLayer *QgisApp::pasteAsNewMemoryVector( const QString &layerName )
82338231
{
8234-
82358232
QString layerNameCopy = layerName;
82368233

82378234
if ( layerNameCopy.isEmpty() )
@@ -8250,36 +8247,36 @@ QgsVectorLayer *QgisApp::pasteAsNewMemoryVector( const QString &layerName )
82508247
}
82518248
}
82528249

8253-
QgsVectorLayer *layer = pasteToNewMemoryVector();
8250+
std::unique_ptr< QgsVectorLayer > layer = pasteToNewMemoryVector();
82548251
if ( !layer )
82558252
return nullptr;
82568253

82578254
layer->setName( layerNameCopy );
82588255

82598256
freezeCanvases();
82608257

8261-
QgsProject::instance()->addMapLayer( layer );
8258+
QgsVectorLayer *result = layer.get();
8259+
QgsProject::instance()->addMapLayer( layer.release() );
82628260

82638261
freezeCanvases( false );
82648262
refreshMapCanvas();
82658263

8266-
return layer;
8264+
return result;
82678265
}
82688266

8269-
QgsVectorLayer *QgisApp::pasteToNewMemoryVector()
8267+
std::unique_ptr<QgsVectorLayer> QgisApp::pasteToNewMemoryVector()
82708268
{
8271-
QgsFields fields = clipboard()->fields();
8269+
const QgsFields fields = clipboard()->fields();
82728270

82738271
// Decide geometry type from features, switch to multi type if at least one multi is found
82748272
QMap<QgsWkbTypes::Type, int> typeCounts;
8275-
QgsFeatureList features = clipboard()->copyOf( fields );
8276-
for ( int i = 0; i < features.size(); i++ )
8273+
const QgsFeatureList features = clipboard()->copyOf( fields );
8274+
for ( const QgsFeature &feature : features )
82778275
{
8278-
QgsFeature &feature = features[i];
82798276
if ( !feature.hasGeometry() )
82808277
continue;
82818278

8282-
QgsWkbTypes::Type type = feature.geometry().wkbType();
8279+
const QgsWkbTypes::Type type = feature.geometry().wkbType();
82838280

82848281
if ( type == QgsWkbTypes::Unknown || type == QgsWkbTypes::NoGeometry )
82858282
continue;
@@ -8307,7 +8304,7 @@ QgsVectorLayer *QgisApp::pasteToNewMemoryVector()
83078304
}
83088305
}
83098306

8310-
QgsWkbTypes::Type wkbType = !typeCounts.isEmpty() ? typeCounts.keys().value( 0 ) : QgsWkbTypes::NoGeometry;
8307+
const QgsWkbTypes::Type wkbType = !typeCounts.isEmpty() ? typeCounts.keys().value( 0 ) : QgsWkbTypes::NoGeometry;
83118308

83128309
if ( features.isEmpty() )
83138310
{
@@ -8325,39 +8322,38 @@ QgsVectorLayer *QgisApp::pasteToNewMemoryVector()
83258322
QgsMessageBar::INFO, messageTimeout() );
83268323
}
83278324

8328-
QgsVectorLayer *layer = QgsMemoryProviderUtils::createMemoryLayer( QStringLiteral( "pasted_features" ), QgsFields(), wkbType, clipboard()->crs() );
8325+
std::unique_ptr< QgsVectorLayer > layer( QgsMemoryProviderUtils::createMemoryLayer( QStringLiteral( "pasted_features" ), QgsFields(), wkbType, clipboard()->crs() ) );
83298326

83308327
if ( !layer->isValid() || !layer->dataProvider() )
83318328
{
8332-
delete layer;
83338329
messageBar()->pushMessage( tr( "Paste features" ),
83348330
tr( "Cannot create new layer." ),
83358331
QgsMessageBar::WARNING, messageTimeout() );
83368332
return nullptr;
83378333
}
83388334

83398335
layer->startEditing();
8340-
Q_FOREACH ( QgsField f, clipboard()->fields().toList() )
8336+
for ( const QgsField &f : clipboard()->fields() )
83418337
{
83428338
QgsDebugMsg( QString( "field %1 (%2)" ).arg( f.name(), QVariant::typeToName( f.type() ) ) );
83438339
if ( !layer->addAttribute( f ) )
83448340
{
83458341
messageBar()->pushMessage( tr( "Paste features" ),
83468342
tr( "Cannot create field %1 (%2,%3)" ).arg( f.name(), f.typeName(), QVariant::typeToName( f.type() ) ),
83478343
QgsMessageBar::WARNING, messageTimeout() );
8348-
delete layer;
83498344
return nullptr;
83508345
}
83518346
}
83528347

83538348
// Convert to multi if necessary
8354-
for ( int i = 0; i < features.size(); i++ )
8349+
QgsFeatureList convertedFeatures;
8350+
convertedFeatures.reserve( features.length() );
8351+
for ( QgsFeature feature : features )
83558352
{
8356-
QgsFeature &feature = features[i];
83578353
if ( !feature.hasGeometry() )
83588354
continue;
83598355

8360-
QgsWkbTypes::Type type = feature.geometry().wkbType();
8356+
const QgsWkbTypes::Type type = feature.geometry().wkbType();
83618357
if ( type == QgsWkbTypes::Unknown || type == QgsWkbTypes::NoGeometry )
83628358
continue;
83638359

@@ -8372,11 +8368,11 @@ QgsVectorLayer *QgisApp::pasteToNewMemoryVector()
83728368
g.convertToMultiType();
83738369
feature.setGeometry( g );
83748370
}
8371+
convertedFeatures.append( feature );
83758372
}
8376-
if ( ! layer->addFeatures( features ) || !layer->commitChanges() )
8373+
if ( ! layer->addFeatures( convertedFeatures ) || !layer->commitChanges() )
83778374
{
83788375
QgsDebugMsg( "Cannot add features or commit changes" );
8379-
delete layer;
83808376
return nullptr;
83818377
}
83828378

‎src/app/qgisapp.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1751,10 +1751,10 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
17511751

17521752
/**
17531753
* Paste features from clipboard into a new memory layer.
1754-
* If no features are in clipboard an empty layer is returned.
1755-
* \returns pointer to a new layer or 0 if failed
1754+
* If no features are in clipboard an empty layer is returned.
1755+
* Returns a new memory layer or a nullptr if the operation failed.
17561756
*/
1757-
QgsVectorLayer *pasteToNewMemoryVector();
1757+
std::unique_ptr< QgsVectorLayer > pasteToNewMemoryVector();
17581758

17591759
//! Returns all annotation items in the canvas
17601760
QList<QgsMapCanvasAnnotationItem *> annotationItems();

0 commit comments

Comments
 (0)
Please sign in to comment.