@@ -423,14 +423,14 @@ void QgsLegendLayer::addToPopupMenu( QMenu& theMenu, QAction* toggleEditingActio
423423 }
424424 }
425425
426- // save as shapefile
427- theMenu.addAction ( tr ( " Save as shapefile ..." ), this , SLOT ( saveAsShapefile () ) );
426+ // save as vector file
427+ theMenu.addAction ( tr ( " Save as..." ), this , SLOT ( saveAsVectorFile () ) );
428428
429- // save selection as shapefile
430- QAction* saveSelectionAction = theMenu.addAction ( tr ( " Save selection as shapefile ..." ), this , SLOT ( saveSelectionAsShapefile () ) );
429+ // save selection as vector file
430+ QAction* saveSelectionAsAction = theMenu.addAction ( tr ( " Save selection as..." ), this , SLOT ( saveSelectionAsVectorFile () ) );
431431 if ( vlayer->selectedFeatureCount () == 0 )
432432 {
433- saveSelectionAction ->setEnabled ( false );
433+ saveSelectionAsAction ->setEnabled ( false );
434434 }
435435
436436 theMenu.addSeparator ();
@@ -460,6 +460,16 @@ void QgsLegendLayer::saveSelectionAsShapefile()
460460 saveAsShapefileGeneral ( TRUE );
461461}
462462
463+ void QgsLegendLayer::saveAsVectorFile ()
464+ {
465+ saveAsVectorFileGeneral ( false );
466+ }
467+
468+ void QgsLegendLayer::saveSelectionAsVectorFile ()
469+ {
470+ saveAsVectorFileGeneral ( true );
471+ }
472+
463473// ////////
464474
465475void QgsLegendLayer::setVisible ( bool visible )
@@ -492,7 +502,81 @@ void QgsLegendLayer::showInOverview()
492502 legend ()->updateOverview ();
493503}
494504
505+ void QgsLegendLayer::saveAsVectorFileGeneral ( bool saveOnlySelection )
506+ {
507+ if ( mLyr .layer ()->type () != QgsMapLayer::VectorLayer )
508+ return ;
509+
510+ QgsVectorLayer* vlayer = qobject_cast<QgsVectorLayer *>( mLyr .layer () );
495511
512+ // get output name and format
513+ QSettings settings;
514+ QString filter = QString ( " Shapefiles (*.shp)" );
515+ QString dirName = settings.value ( " /UI/lastVectorfileDir" , " ." ).toString ();
516+ QString filterString = QgsVectorFileWriter::fileFilterString ();
517+ QString selectedFilter = settings.value ( " /UI/lastVectorFilter" , " [OGR] ESRI Shapefiles (*.shp *.SHP)" ).toString ();
518+ QString outputFile = QFileDialog::getSaveFileName ( 0 , tr ( " Save layer as..." ), dirName, filterString, &selectedFilter );
519+ if ( outputFile.isNull () )
520+ {
521+ return ; // cancelled
522+ }
523+
524+ settings.setValue ( " /UI/lastVectorfileDir" , QFileInfo ( outputFile ).absolutePath () );
525+ settings.setValue ( " /UI/lastVectorFilter" , selectedFilter );
526+
527+ QMap< QString, QString> filterDriverMap = QgsVectorFileWriter::supportedFiltersAndFormats ();
528+ QMap< QString, QString>::const_iterator it = filterDriverMap.find ( selectedFilter + " ;;" );
529+ if ( it == filterDriverMap.constEnd () )
530+ {
531+ return ; // unknown format
532+ }
533+
534+ QString driverKey = *it;
535+
536+ // output CRS
537+ QgsCoordinateReferenceSystem destCRS = vlayer->srs ();
538+ // Find out if we have projections enabled or not
539+ if ( QgisApp::instance ()->mapCanvas ()->mapRenderer ()->hasCrsTransformEnabled () )
540+ {
541+ destCRS = QgisApp::instance ()->mapCanvas ()->mapRenderer ()->destinationSrs ();
542+ }
543+
544+ QgsGenericProjectionSelector * mySelector = new QgsGenericProjectionSelector ();
545+ mySelector->setSelectedCrsId ( destCRS.srsid () );
546+ mySelector->setMessage ( tr ( " Select the coordinate reference system for the saved shapefile. "
547+ " The data points will be transformed from the layer coordinate reference system." ) );
548+
549+ if ( mySelector->exec () )
550+ {
551+ QgsCoordinateReferenceSystem srs ( mySelector->selectedCrsId (), QgsCoordinateReferenceSystem::InternalCrsId );
552+ destCRS = srs;
553+ // destCRS->createFromId(mySelector->selectedCrsId(), QgsCoordinateReferenceSystem::InternalCrsId)
554+ }
555+ else
556+ {
557+ // Aborted CS selection, don't save.
558+ delete mySelector;
559+ return ;
560+ }
561+ delete mySelector;
562+
563+ // overwrite the file - user will already have been prompted
564+ // to verify they want to overwrite by the file dialog above
565+ // might not even exists in the given case.
566+ if ( driverKey == " ESRI Shapefile" )
567+ {
568+ // add the extension if not present
569+ if ( !outputFile.endsWith ( " .shp" , Qt::CaseInsensitive ) )
570+ {
571+ outputFile += " .shp" ;
572+ }
573+ QgsVectorFileWriter::deleteShapeFile ( outputFile );
574+ }
575+
576+ QString errorMessage;
577+ QgsVectorFileWriter::WriterError error;
578+ error = QgsVectorFileWriter::writeAsVectorFormat ( vlayer, outputFile, " utf-8" , &destCRS, driverKey, saveOnlySelection, &errorMessage );
579+ }
496580
497581
498582void QgsLegendLayer::saveAsShapefileGeneral ( bool saveOnlySelection )
0 commit comments