34#include <QRegularExpression>
42 : QDialog( parent, fl )
50 : QDialog( parent, fl )
57 mSelectedCrs = layer->
crs();
58 mLayerExtent = layer->
extent();
65 leLayername->setDefaultValue( mDefaultOutputLayerNameFromInputLayerName );
67 if ( leLayername->isEnabled() )
68 leLayername->setText( mDefaultOutputLayerNameFromInputLayerName );
73 mSymbologyExportLabel->hide();
74 mSymbologyExportComboBox->hide();
84 if ( !( mOptions &
Fields ) )
85 mAttributesSelection->hide();
88 mSelectedOnly->hide();
94 mGeometryGroupBox->hide();
96 if ( !( mOptions &
Extent ) )
97 mExtentGroupBox->hide();
101 mCheckPersistMetadata->setChecked(
false );
102 mCheckPersistMetadata->hide();
106 mButtonBox->button( QDialogButtonBox::Ok )->setDisabled(
true );
109void QgsVectorLayerSaveAsDialog::setup()
114 connect( mFormatComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsVectorLayerSaveAsDialog::mFormatComboBox_currentIndexChanged );
116 connect( mSymbologyExportComboBox, &QComboBox::currentTextChanged,
this, &QgsVectorLayerSaveAsDialog::mSymbologyExportComboBox_currentIndexChanged );
117 connect( mGeometryTypeComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsVectorLayerSaveAsDialog::mGeometryTypeComboBox_currentIndexChanged );
118 connect( mSelectAllAttributes, &QPushButton::clicked,
this, &QgsVectorLayerSaveAsDialog::mSelectAllAttributes_clicked );
119 connect( mDeselectAllAttributes, &QPushButton::clicked,
this, &QgsVectorLayerSaveAsDialog::mDeselectAllAttributes_clicked );
120 connect( mUseAliasesForExportedName, &QCheckBox::stateChanged,
this, &QgsVectorLayerSaveAsDialog::mUseAliasesForExportedName_stateChanged );
121 connect( mReplaceRawFieldValues, &QCheckBox::stateChanged,
this, &QgsVectorLayerSaveAsDialog::mReplaceRawFieldValues_stateChanged );
122 connect( mAttributeTable, &QTableWidget::itemChanged,
this, &QgsVectorLayerSaveAsDialog::mAttributeTable_itemChanged );
125 mHelpButtonBox->setVisible(
false );
126 mButtonBox->addButton( QDialogButtonBox::Help );
127 connect( mButtonBox, &QDialogButtonBox::helpRequested,
this, &QgsVectorLayerSaveAsDialog::showHelp );
129 connect( mHelpButtonBox, &QDialogButtonBox::helpRequested,
this, &QgsVectorLayerSaveAsDialog::showHelp );
131 connect( mButtonBox, &QDialogButtonBox::accepted,
this, &QgsVectorLayerSaveAsDialog::accept );
132 connect( mButtonBox, &QDialogButtonBox::rejected,
this, &QgsVectorLayerSaveAsDialog::reject );
135 mFormatComboBox->blockSignals(
true );
138 mFormatComboBox->addItem( driver.longName, driver.driverName );
142 QString
format = settings.
value( QStringLiteral(
"UI/lastVectorFormat" ),
"GPKG" ).toString();
143 mFormatComboBox->setCurrentIndex( mFormatComboBox->findData(
format ) );
144 mFormatComboBox->blockSignals(
false );
152 mGeometryTypeComboBox->addItem( tr(
"Automatic" ), -1 );
158 mGeometryTypeComboBox->setCurrentIndex( mGeometryTypeComboBox->findData( -1 ) );
162 QString enc = settings.
value( QStringLiteral(
"UI/encoding" ),
"System" ).toString();
163 int idx = mEncodingComboBox->findText( enc );
166 mEncodingComboBox->insertItem( 0, enc );
170 mCrsSelector->setCrs( mSelectedCrs );
171 mCrsSelector->setLayerCrs( mSelectedCrs );
172 mCrsSelector->setMessage( tr(
"Select the coordinate reference system for the vector file. "
173 "The data points will be transformed from the layer coordinate reference system." ) );
175 mEncodingComboBox->setCurrentIndex( idx );
176 mFormatComboBox_currentIndexChanged( mFormatComboBox->currentIndex() );
182 mSymbologyExportComboBox_currentIndexChanged( mSymbologyExportComboBox->currentText() );
185 mExtentGroupBox->setOutputCrs( mSelectedCrs );
186 mExtentGroupBox->setOriginalExtent( mLayerExtent, mSelectedCrs );
187 mExtentGroupBox->setOutputExtentFromOriginal();
188 mExtentGroupBox->setCheckable(
true );
189 mExtentGroupBox->setChecked(
false );
190 mExtentGroupBox->setCollapsed(
true );
193 mFilename->setDialogTitle( tr(
"Save Layer As" ) );
194 mFilename->setDefaultRoot( settings.
value( QStringLiteral(
"UI/lastVectorFileFilterDir" ), QDir::homePath() ).toString() );
195 mFilename->setConfirmOverwrite(
false );
199 QFileInfo tmplFileInfo( filePath );
200 settings.
setValue( QStringLiteral(
"UI/lastVectorFileFilterDir" ), tmplFileInfo.absolutePath() );
202 const QFileInfo fileInfo( filePath );
204 if ( mDefaultOutputLayerNameFromInputLayerName.isEmpty() )
205 leLayername->setDefaultValue( suggestedLayerName );
208 if ( leLayername->text().isEmpty() && !filePath.isEmpty() && leLayername->isEnabled() )
210 leLayername->setText( suggestedLayerName );
212 mButtonBox->button( QDialogButtonBox::Ok )->setEnabled( !filePath.isEmpty() );
220 mCrsSelector->setSourceEnsemble( ensemble.
name() );
227 mCrsSelector->setShowAccuracyWarnings(
true );
230QList<QPair<QLabel *, QWidget *> > QgsVectorLayerSaveAsDialog::createControls(
const QMap<QString, QgsVectorFileWriter::Option *> &options )
232 QList<QPair<QLabel *, QWidget *> > controls;
233 QMap<QString, QgsVectorFileWriter::Option *>::ConstIterator it;
235 for ( it = options.constBegin(); it != options.constEnd(); ++it )
238 QLabel *label =
new QLabel( it.key() );
239 QWidget *control =
nullptr;
240 switch ( option->
type )
247 QSpinBox *sb =
new QSpinBox();
248 sb->setObjectName( it.key() );
260 QComboBox *cb =
new QComboBox();
261 cb->setObjectName( it.key() );
262 for (
const QString &val : std::as_const( opt->
values ) )
264 cb->addItem( val, val );
267 cb->addItem( tr(
"<Default>" ), QVariant( QVariant::String ) );
270 idx = cb->findData( QVariant( QVariant::String ) );
271 cb->setCurrentIndex( idx );
283 le->setObjectName( it.key() );
297 label->setToolTip( QStringLiteral(
"<p>%1</p>" ).arg( option->
docString.toHtmlEscaped() ) );
298 control->setToolTip( QStringLiteral(
"<p>%1</p>" ).arg( option->
docString.toHtmlEscaped() ) );
300 controls << QPair<QLabel *, QWidget *>( label, control );
307void QgsVectorLayerSaveAsDialog::accept()
311 QgsVectorFileWriter::EditionCapabilities caps =
316 msgBox.setIcon( QMessageBox::Question );
317 msgBox.setWindowTitle( tr(
"Save Vector Layer As" ) );
318 QPushButton *overwriteFileButton = msgBox.addButton( tr(
"Overwrite File" ), QMessageBox::ActionRole );
319 QPushButton *overwriteLayerButton = msgBox.addButton( tr(
"Overwrite Layer" ), QMessageBox::ActionRole );
320 QPushButton *appendToLayerButton = msgBox.addButton( tr(
"Append to Layer" ), QMessageBox::ActionRole );
321 msgBox.setStandardButtons( QMessageBox::Cancel );
322 msgBox.setDefaultButton( QMessageBox::Cancel );
323 overwriteFileButton->hide();
324 overwriteLayerButton->hide();
325 appendToLayerButton->hide();
332 msgBox.setText( tr(
"The layer already exists. Do you want to overwrite the whole file or overwrite the layer?" ) );
333 overwriteFileButton->setVisible(
true );
334 overwriteLayerButton->setVisible(
true );
338 msgBox.setText( tr(
"The file already exists. Do you want to overwrite it?" ) );
339 overwriteFileButton->setVisible(
true );
344 msgBox.setText( tr(
"The layer already exists. Do you want to overwrite the whole file, overwrite the layer or append features to the layer?" ) );
345 appendToLayerButton->setVisible(
true );
346 overwriteFileButton->setVisible(
true );
347 overwriteLayerButton->setVisible(
true );
351 msgBox.setText( tr(
"The layer already exists. Do you want to overwrite the whole file or append features to the layer?" ) );
352 appendToLayerButton->setVisible(
true );
353 overwriteFileButton->setVisible(
true );
356 int ret = msgBox.exec();
357 if ( ret == QMessageBox::Cancel )
359 if ( msgBox.clickedButton() == overwriteFileButton )
361 else if ( msgBox.clickedButton() == overwriteLayerButton )
363 else if ( msgBox.clickedButton() == appendToLayerButton )
375 if ( QMessageBox::question(
this,
376 tr(
"Save Vector Layer As" ),
377 tr(
"The file already exists. Do you want to overwrite it?" ) ) == QMessageBox::NoButton )
390 if ( QMessageBox::question(
this,
391 tr(
"Save Vector Layer As" ),
392 tr(
"The existing layer has additional fields. Do you want to add the missing fields to the layer?" ) ) == QMessageBox::Yes )
401 QStringList layerList;
402 layerList.reserve( sublayers.size() );
405 layerList.append( sublayer.name() );
407 if ( layerList.length() > 1 )
409 layerList.sort( Qt::CaseInsensitive );
411 msgBox.setIcon( QMessageBox::Warning );
412 msgBox.setWindowTitle( tr(
"Overwrite File" ) );
413 msgBox.setText( tr(
"This file contains %1 layers that will be lost!\n" ).arg( QLocale().toString( layerList.length() ) ) );
414 msgBox.setDetailedText( tr(
"The following layers will be permanently lost:\n\n%1" ).arg( layerList.join(
"\n" ) ) );
415 msgBox.setStandardButtons( QMessageBox::Ok | QMessageBox::Cancel );
416 if ( msgBox.exec() == QMessageBox::Cancel )
422 settings.
setValue( QStringLiteral(
"UI/lastVectorFileFilterDir" ), QFileInfo(
filename() ).absolutePath() );
423 settings.
setValue( QStringLiteral(
"UI/lastVectorFormat" ),
format() );
428void QgsVectorLayerSaveAsDialog::mFormatComboBox_currentIndexChanged(
int idx )
432 mFilename->setEnabled(
true );
437 if ( !mFilename->filePath().isEmpty() )
439 QRegularExpression rx(
"\\.(.*?)[\\s]" );
442 if ( !ext.isEmpty() )
444 QFileInfo fi( mFilename->filePath() );
445 mFilename->setFilePath( QStringLiteral(
"%1/%2.%3" ).arg( fi.path() ).arg( fi.baseName() ).arg( ext ) );
449 bool selectAllFields =
true;
454 bool isFormatForFieldsAsDisplayedValues =
false;
456 const QString sFormat(
format() );
457 if ( sFormat == QLatin1String(
"DXF" ) || sFormat == QLatin1String(
"DGN" ) )
459 mAttributesSelection->setVisible(
false );
460 selectAllFields =
false;
466 mAttributesSelection->setVisible(
true );
467 isFormatForFieldsAsDisplayedValues = ( sFormat == QLatin1String(
"CSV" ) ||
468 sFormat == QLatin1String(
"XLS" ) ||
469 sFormat == QLatin1String(
"XLSX" ) ||
470 sFormat == QLatin1String(
"ODS" ) );
477 mSymbologyExportLabel->setVisible(
true );
478 mSymbologyExportComboBox->setVisible(
true );
479 mScaleLabel->setVisible(
true );
480 mScaleWidget->setVisible(
true );
484 mSymbologyExportLabel->hide();
485 mSymbologyExportComboBox->hide();
487 mScaleWidget->hide();
490 leLayername->setEnabled( sFormat == QLatin1String(
"KML" ) ||
491 sFormat == QLatin1String(
"GPKG" ) ||
492 sFormat == QLatin1String(
"XLSX" ) ||
493 sFormat == QLatin1String(
"ODS" ) ||
494 sFormat == QLatin1String(
"FileGDB" ) ||
495 sFormat == QLatin1String(
"SQLite" ) ||
496 sFormat == QLatin1String(
"SpatiaLite" ) );
498 if ( sFormat == QLatin1String(
"XLSX" ) )
499 leLayername->setMaxLength( 31 );
500 else if ( leLayername->isEnabled() )
501 leLayername->setMaxLength( 32767 );
503 if ( !leLayername->isEnabled() )
504 leLayername->setText( QString() );
505 else if ( leLayername->text().isEmpty() )
507 QString layerName = mDefaultOutputLayerNameFromInputLayerName;
508 if ( layerName.isEmpty() && !mFilename->filePath().isEmpty() )
510 layerName = QFileInfo( mFilename->filePath() ).baseName();
511 leLayername->setDefaultValue( layerName );
513 if ( layerName.isEmpty() )
514 layerName = tr(
"new_layer" );
515 leLayername->setText( layerName );
520 mAttributeTable->setRowCount( mLayer->
fields().
count() );
522 QStringList horizontalHeaders = QStringList() << tr(
"Name" ) << tr(
"Export name" ) << tr(
"Type" ) << tr(
"Replace with displayed values" );
523 mAttributeTable->setColumnCount( horizontalHeaders.size() );
524 mAttributeTable->setHorizontalHeaderLabels( horizontalHeaders );
526 bool foundFieldThatCanBeExportedAsDisplayedValue =
false;
527 for (
int i = 0; i < mLayer->
fields().size(); ++i )
530 if ( setup.
type() != QLatin1String(
"TextEdit" ) &&
533 foundFieldThatCanBeExportedAsDisplayedValue =
true;
537 mAttributeTable->setColumnHidden(
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ),
538 ! foundFieldThatCanBeExportedAsDisplayedValue );
540 bool checkReplaceRawFieldValues = selectAllFields && isFormatForFieldsAsDisplayedValues;
541 const QSignalBlocker signalBlockerAttributeTable( mAttributeTable );
543 for (
int i = 0; i < mLayer->
fields().size(); ++i )
546 Qt::ItemFlags flags = mLayer->
providerType() != QLatin1String(
"oracle" ) || !fld.
typeName().contains( QLatin1String(
"SDO_GEOMETRY" ) ) ? Qt::ItemIsEnabled : Qt::NoItemFlags;
547 QTableWidgetItem *item =
nullptr;
548 item =
new QTableWidgetItem( fld.
name() );
549 item->setFlags( flags | Qt::ItemIsUserCheckable );
550 item->setCheckState( ( selectAllFields ) ? Qt::Checked : Qt::Unchecked );
551 mAttributeTable->setItem( i,
static_cast<int>( ColumnIndex::Name ), item );
553 item =
new QTableWidgetItem( fld.
name() );
554 item->setFlags( flags | Qt::ItemIsEditable );
556 mAttributeTable->setItem( i,
static_cast<int>( ColumnIndex::ExportName ), item );
558 item =
new QTableWidgetItem( fld.
typeName() );
559 item->setFlags( flags );
560 mAttributeTable->setItem( i,
static_cast<int>( ColumnIndex::Type ), item );
562 if ( foundFieldThatCanBeExportedAsDisplayedValue )
566 const QString widgetId( setup.
type() );
567 if ( flags == Qt::ItemIsEnabled &&
568 widgetId != QLatin1String(
"TextEdit" ) &&
571 item =
new QTableWidgetItem( tr(
"Use %1" ).arg( factory->
name() ) );
572 item->setFlags( ( selectAllFields ) ? ( Qt::ItemIsEnabled | Qt::ItemIsUserCheckable ) : Qt::ItemIsUserCheckable );
573 const bool checkItem = ( selectAllFields && isFormatForFieldsAsDisplayedValues &&
574 ( widgetId == QLatin1String(
"ValueMap" ) ||
575 widgetId == QLatin1String(
"ValueRelation" ) ||
576 widgetId == QLatin1String(
"CheckBox" ) ||
577 widgetId == QLatin1String(
"RelationReference" ) ) );
578 checkReplaceRawFieldValues &= checkItem;
579 item->setCheckState( checkItem ?
580 Qt::Checked : Qt::Unchecked );
581 mAttributeTable->setItem( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ), item );
585 item =
new QTableWidgetItem();
586 item->setFlags( Qt::NoItemFlags );
587 mAttributeTable->setItem( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ), item );
593 whileBlocking( mReplaceRawFieldValues )->setChecked( checkReplaceRawFieldValues );
594 mReplaceRawFieldValues->setEnabled( selectAllFields );
595 mReplaceRawFieldValues->setVisible( foundFieldThatCanBeExportedAsDisplayedValue );
597 mAttributeTable->resizeColumnsToContents();
602 while ( mDatasourceOptionsGroupBox->layout()->count() )
604 QLayoutItem *item = mDatasourceOptionsGroupBox->layout()->takeAt( 0 );
605 delete item->widget();
609 while ( mLayerOptionsGroupBox->layout()->count() )
611 QLayoutItem *item = mLayerOptionsGroupBox->layout()->takeAt( 0 );
612 delete item->widget();
616 typedef QPair<QLabel *, QWidget *> LabelControlPair;
622 mDatasourceOptionsGroupBox->setVisible(
true );
623 QList<QPair<QLabel *, QWidget *> > controls = createControls( driverMetaData.
driverOptions );
625 QFormLayout *datasourceLayout =
dynamic_cast<QFormLayout *
>( mDatasourceOptionsGroupBox->layout() );
627 const auto constControls = controls;
628 for ( LabelControlPair control : constControls )
630 datasourceLayout->addRow( control.first, control.second );
635 mDatasourceOptionsGroupBox->setVisible(
false );
640 mLayerOptionsGroupBox->setVisible(
true );
641 QList<QPair<QLabel *, QWidget *> > controls = createControls( driverMetaData.
layerOptions );
643 QFormLayout *layerOptionsLayout =
dynamic_cast<QFormLayout *
>( mLayerOptionsGroupBox->layout() );
645 const auto constControls = controls;
646 for ( LabelControlPair control : constControls )
648 layerOptionsLayout->addRow( control.first, control.second );
653 mLayerOptionsGroupBox->setVisible(
false );
658 mEncodingComboBox->setEnabled(
true );
665 mEncodingComboBox->setCurrentIndex( idx );
666 mEncodingComboBox->setDisabled(
true );
670 mEncodingComboBox->setEnabled(
true );
677 mEncodingComboBox->setEnabled(
true );
680 GDALDriverH hDriver = GDALGetDriverByName(
format().toUtf8().constData() );
683 mAddToCanvas->setEnabled( GDALGetMetadataItem( hDriver, GDAL_DCAP_OPEN,
nullptr ) !=
nullptr );
687void QgsVectorLayerSaveAsDialog::mUseAliasesForExportedName_stateChanged(
int state )
689 const QSignalBlocker signalBlocker( mAttributeTable );
696 bool modifiedEntries =
false;
697 for (
int i = 0; i < mAttributeTable->rowCount(); i++ )
699 if ( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportName ) )->text()
700 != mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportName ) )->data( Qt::UserRole ).toString() )
702 modifiedEntries =
true;
707 if ( modifiedEntries )
709 if ( QMessageBox::question(
this,
710 tr(
"Modified names" ),
711 tr(
"Some names were modified and will be overridden. Do you want to continue?" ) )
714 whileBlocking( mUseAliasesForExportedName )->setCheckState( Qt::PartiallyChecked );
719 for (
int i = 0; i < mAttributeTable->rowCount(); i++ )
721 mUseAliasesForExportedName->setTristate(
false );
722 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportName ) )->setText( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::Name ) )->text() );
729 bool modifiedEntries =
false;
730 for (
int i = 0; i < mAttributeTable->rowCount(); i++ )
732 if ( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportName ) )->text()
733 != mAttributeTable->item( i,
static_cast<int>( ColumnIndex::Name ) )->text() )
734 modifiedEntries =
true;
737 if ( modifiedEntries )
739 if ( QMessageBox::question(
this,
740 tr(
"Modified names" ),
741 tr(
"Some names were modified and will be overridden. Do you want to continue?" ) )
744 whileBlocking( mUseAliasesForExportedName )->setCheckState( Qt::PartiallyChecked );
749 for (
int i = 0; i < mAttributeTable->rowCount(); i++ )
751 mUseAliasesForExportedName->setTristate(
false );
752 const QString alias = mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportName ) )->data( Qt::UserRole ).toString();
753 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportName ) )->setText( alias );
757 case Qt::PartiallyChecked:
763void QgsVectorLayerSaveAsDialog::mReplaceRawFieldValues_stateChanged(
int )
765 if ( mAttributeTable->isColumnHidden(
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) ) )
768 const QSignalBlocker signalBlockerAttributeTable( mAttributeTable );
769 const QSignalBlocker signalBlockerReplaceRawFieldValues( mReplaceRawFieldValues );
771 if ( mReplaceRawFieldValues->checkState() != Qt::PartiallyChecked )
773 for (
int i = 0; i < mAttributeTable->rowCount(); i++ )
775 if ( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::Name ) )->checkState() == Qt::Checked &&
776 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) ) &&
777 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->flags() & Qt::ItemIsEnabled )
779 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->setCheckState( mReplaceRawFieldValues->checkState() );
783 mReplaceRawFieldValues->setTristate(
false );
786void QgsVectorLayerSaveAsDialog::mAttributeTable_itemChanged( QTableWidgetItem *item )
788 const QSignalBlocker signalBlockerAttributeTable( mAttributeTable );
789 const QSignalBlocker signalBlockerReplaceRawFieldValues( mReplaceRawFieldValues );
791 int row = item->row();
792 int column = item->column();
794 switch (
static_cast<ColumnIndex
>( column ) )
796 case ColumnIndex::Name:
798 if ( mAttributeTable->isColumnHidden(
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) ) ||
799 ! mAttributeTable->item( row,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) ) ||
800 !( mAttributeTable->item( row,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->flags() & Qt::ItemIsUserCheckable ) )
803 if ( mAttributeTable->item( row, column )->checkState() == Qt::Unchecked )
805 mAttributeTable->item( row,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->setCheckState( Qt::Unchecked );
806 mAttributeTable->item( row,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->setFlags( Qt::ItemIsUserCheckable );
807 bool checkBoxEnabled =
false;
808 for (
int i = 0; i < mAttributeTable->rowCount(); i++ )
810 if ( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) ) &&
811 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->flags() & Qt::ItemIsEnabled )
813 checkBoxEnabled =
true;
817 mReplaceRawFieldValues->setEnabled( checkBoxEnabled );
818 if ( !checkBoxEnabled )
819 mReplaceRawFieldValues->setCheckState( Qt::Unchecked );
821 else if ( mAttributeTable->item( row, column )->checkState() == Qt::Checked )
823 mAttributeTable->item( row,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->setFlags( Qt::ItemIsUserCheckable | Qt::ItemIsEnabled );
824 mReplaceRawFieldValues->setEnabled(
true );
828 case ColumnIndex::ExportName:
831 if ( item->text().isEmpty() )
833 QMessageBox::warning(
this,
834 tr(
"Empty export name" ),
835 tr(
"Empty export name are not allowed." ) );
841 while ( names.count( item->text() ) > 1 )
842 item->setText( QString(
"%1_2" ).arg( item->text() ) );
844 mUseAliasesForExportedName->setCheckState( Qt::PartiallyChecked );
847 case ColumnIndex::Type:
850 case ColumnIndex::ExportAsDisplayedValue:
852 if ( mAttributeTable->item( row, column )->flags() & Qt::ItemIsUserCheckable )
854 bool allChecked =
true;
855 bool allUnchecked =
true;
856 for (
int i = 0; i < mAttributeTable->rowCount(); i++ )
858 if ( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) ) &&
859 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->flags() & Qt::ItemIsEnabled )
861 if ( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->checkState() == Qt::Unchecked )
864 allUnchecked =
false;
867 mReplaceRawFieldValues->setCheckState( ( !allChecked && !allUnchecked ) ? Qt::PartiallyChecked : ( allChecked ) ? Qt::Checked : Qt::Unchecked );
877 mExtentGroupBox->setOutputCrs( mSelectedCrs );
882 return mFilename->filePath();
887 return leLayername->text();
892 return mEncodingComboBox->currentText();
897 return mFormatComboBox->currentData().toString();
902 return mSelectedCrs.
srsid();
918 QMap<QString, QgsVectorFileWriter::Option *>::ConstIterator it;
922 switch ( it.value()->type )
927 QSpinBox *sb = mDatasourceOptionsGroupBox->findChild<QSpinBox *>( it.key() );
929 options << QStringLiteral(
"%1=%2" ).arg( it.key() ).arg( sb->value() );
936 QComboBox *cb = mDatasourceOptionsGroupBox->findChild<QComboBox *>( it.key() );
937 if ( opt && cb && cb->itemData( cb->currentIndex() ) != opt->
defaultValue )
938 options << QStringLiteral(
"%1=%2" ).arg( it.key(), cb->currentText() );
945 QLineEdit *le = mDatasourceOptionsGroupBox->findChild<QLineEdit *>( it.key() );
947 options << QStringLiteral(
"%1=%2" ).arg( it.key(), le->text() );
955 options << QStringLiteral(
"%1=%2" ).arg( it.key(), opt->
mValue );
962 QString plainText = mOgrDatasourceOptions->toPlainText().trimmed();
963 if ( !plainText.isEmpty() )
964 options += plainText.split(
'\n' );
977 QMap<QString, QgsVectorFileWriter::Option *>::ConstIterator it;
981 switch ( it.value()->type )
986 QSpinBox *sb = mLayerOptionsGroupBox->findChild<QSpinBox *>( it.key() );
988 options << QStringLiteral(
"%1=%2" ).arg( it.key() ).arg( sb->value() );
995 QComboBox *cb = mLayerOptionsGroupBox->findChild<QComboBox *>( it.key() );
996 if ( opt && cb && cb->itemData( cb->currentIndex() ) != opt->
defaultValue )
997 options << QStringLiteral(
"%1=%2" ).arg( it.key(), cb->currentText() );
1004 QLineEdit *le = mLayerOptionsGroupBox->findChild<QLineEdit *>( it.key() );
1006 options << QStringLiteral(
"%1=%2" ).arg( it.key(), le->text() );
1014 options << QStringLiteral(
"%1=%2" ).arg( it.key(), opt->
mValue );
1021 QString plainText = mOgrLayerOptions->toPlainText().trimmed();
1022 if ( !plainText.isEmpty() )
1023 options += plainText.split(
'\n' );
1032 for (
int i = 0; i < mAttributeTable->rowCount(); i++ )
1034 if ( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::Name ) )->checkState() == Qt::Checked )
1036 attributes.append( i );
1047 for (
int i = 0; i < mAttributeTable->rowCount(); i++ )
1049 if ( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::Name ) )->checkState() == Qt::Checked &&
1050 ! mAttributeTable->isColumnHidden(
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) ) &&
1051 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->checkState() == Qt::Checked )
1053 attributes.append( i );
1062 QStringList exportNames;
1063 for (
int i = 0; i < mAttributeTable->rowCount(); i++ )
1064 exportNames.append( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportName ) )->text() );
1071 return mAddToCanvas->isChecked() && mAddToCanvas->isEnabled();
1076 mAddToCanvas->setChecked( enabled );
1081 return mSymbologyExportComboBox->currentData().toInt();
1086 return mScaleWidget->scale();
1091 mMapCanvas = canvas;
1092 mScaleWidget->setMapCanvas( canvas );
1093 mScaleWidget->setShowCurrentScaleButton(
true );
1099 return mExtentGroupBox->isChecked();
1104 return mExtentGroupBox->outputExtent();
1114 return mSelectedOnly->isChecked();
1119 return mCheckPersistMetadata->isChecked();
1124 int currentIndexData = mGeometryTypeComboBox->currentData().toInt();
1125 if ( currentIndexData == -1 )
1136 int currentIndexData = mGeometryTypeComboBox->currentData().toInt();
1137 return currentIndexData == -1;
1142 return mForceMultiCheckBox->isChecked();
1147 mForceMultiCheckBox->setChecked( checked );
1152 return mIncludeZCheckBox->isChecked();
1157 return mActionOnExistingFile;
1162 mIncludeZCheckBox->setChecked( checked );
1165void QgsVectorLayerSaveAsDialog::mSymbologyExportComboBox_currentIndexChanged(
const QString &text )
1167 bool scaleEnabled =
true;
1168 if ( text == tr(
"No symbology" ) )
1170 scaleEnabled =
false;
1172 mScaleWidget->setEnabled( scaleEnabled );
1173 mScaleLabel->setEnabled( scaleEnabled );
1176void QgsVectorLayerSaveAsDialog::mGeometryTypeComboBox_currentIndexChanged(
int index )
1178 int currentIndexData = mGeometryTypeComboBox->itemData( index ).toInt();
1182 mForceMultiCheckBox->setEnabled(
true );
1183 mIncludeZCheckBox->setEnabled(
true );
1187 mForceMultiCheckBox->setEnabled(
false );
1188 mForceMultiCheckBox->setChecked(
false );
1189 mIncludeZCheckBox->setEnabled(
false );
1190 mIncludeZCheckBox->setChecked(
false );
1194void QgsVectorLayerSaveAsDialog::mSelectAllAttributes_clicked()
1196 const QSignalBlocker signalBlockerAttributeTable( mAttributeTable );
1197 const QSignalBlocker signalBlockerReplaceRawFieldValues( mReplaceRawFieldValues );
1199 for (
int i = 0; i < mAttributeTable->rowCount(); i++ )
1201 if ( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::Name ) )->flags() & Qt::ItemIsEnabled )
1203 if ( ! mAttributeTable->isColumnHidden(
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) ) &&
1204 ( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->flags() & Qt::ItemIsUserCheckable ) )
1206 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->setFlags( Qt::ItemIsUserCheckable | Qt::ItemIsEnabled );
1208 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::Name ) )->setCheckState( Qt::Checked );
1211 if ( ! mAttributeTable->isColumnHidden(
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) ) )
1213 mReplaceRawFieldValues->setEnabled(
true );
1217void QgsVectorLayerSaveAsDialog::mDeselectAllAttributes_clicked()
1219 const QSignalBlocker signalBlockerAttributeTable( mAttributeTable );
1220 const QSignalBlocker signalBlockerReplaceRawFieldValues( mReplaceRawFieldValues );
1222 for (
int i = 0; i < mAttributeTable->rowCount(); i++ )
1224 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::Name ) )->setCheckState( Qt::Unchecked );
1225 if ( ! mAttributeTable->isColumnHidden(
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) ) &&
1226 ( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->flags() & Qt::ItemIsUserCheckable ) )
1228 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->setFlags( Qt::ItemIsUserCheckable );
1229 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->setCheckState( Qt::Unchecked );
1232 if ( ! mAttributeTable->isColumnHidden(
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) ) )
1234 mReplaceRawFieldValues->setCheckState( Qt::Unchecked );
1235 mReplaceRawFieldValues->setEnabled(
false );
1239void QgsVectorLayerSaveAsDialog::showHelp()
1241 QgsHelp::openHelp( QStringLiteral(
"managing_data_source/create_layers.html#creating-new-layers-from-an-existing-layer" ) );
This class represents a coordinate reference system (CRS).
QgsDatumEnsemble datumEnsemble() const SIP_THROW(QgsNotSupportedException)
Attempts to retrieve datum ensemble details from the CRS.
long srsid() const
Returns the internal CRS ID, if available.
Contains information about a datum ensemble.
bool isValid() const
Returns true if the datum ensemble is a valid object, or false if it is a null/invalid object.
QString name() const
Display name of datum ensemble.
Encapsulate a field in an attribute table or data source.
QString typeName() const
Gets the field type.
QString displayName() const
Returns the name to use when displaying this field.
int count() const
Returns number of items.
QgsField at(int i) const
Returns the field at particular index (must be in range 0..N-1).
@ ClearToDefault
Reset value to default value (see defaultValue() )
static QgsEditorWidgetRegistry * editorWidgetRegistry()
Returns the global editor widget registry, used for managing all known edit widget factories.
static void enableAutoGeometryRestore(QWidget *widget, const QString &key=QString())
Register the widget to allow its position to be automatically saved and restored when open and closed...
static void openHelp(const QString &key)
Opens help topic for the given help key using default system web browser.
static QIcon iconForWkbType(QgsWkbTypes::Type type)
Returns the icon for a vector layer whose geometry type is provided.
Map canvas is a class for displaying all GIS data types on a canvas.
const QgsMapSettings & mapSettings() const
Gets access to properties used for map rendering.
static QString launderLayerName(const QString &name)
Launders a layer's name, converting it into a format which is general suitable for file names or data...
QString providerType() const
Returns the provider type (provider key) for this layer.
QgsCoordinateReferenceSystem crs
QgsRectangle visibleExtent() const
Returns the actual extent derived from requested extent that takes output image size into account.
QgsCoordinateReferenceSystem destinationCrs() const
Returns the destination coordinate reference system for the map render.
Custom exception class which is raised when an operation is not supported.
QList< QgsProviderSublayerDetails > querySublayers(const QString &uri, Qgis::SublayerQueryFlags flags=Qgis::SublayerQueryFlags(), QgsFeedback *feedback=nullptr) const
Queries the specified uri and returns a list of any valid sublayers found in the dataset which can be...
static QgsProviderRegistry * instance(const QString &pluginPath=QString())
Means of accessing canonical single instance.
Contains details about a sub layer available from a dataset.
A rectangle specified with double values.
This class is a composition of two QSettings instances:
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.
static QStringList availableEncodings()
Returns a list of available encodings.
QgsVectorFileWriter::OptionType type
A convenience class for writing vector layers to disk based formats (e.g.
@ CanAppendToExistingLayer
Flag to indicate that new features can be added to an existing layer.
@ CanAddNewLayer
Flag to indicate that a new layer can be added to the dataset.
@ CanDeleteLayer
Flag to indicate that an existing layer can be deleted.
static QgsVectorFileWriter::EditionCapabilities editionCapabilities(const QString &datasetName)
Returns edition capabilities for an existing dataset name.
static bool supportsFeatureStyles(const QString &driverName)
Returns true if the specified driverName supports feature styles.
static bool targetLayerExists(const QString &datasetName, const QString &layerName)
Returns whether the target layer already exists.
static bool driverMetadata(const QString &driverName, MetaData &driverMetadata)
static QString filterForDriver(const QString &driverName)
Creates a filter for an OGR driver key.
static bool areThereNewFieldsToCreate(const QString &datasetName, const QString &layerName, QgsVectorLayer *layer, const QgsAttributeList &attributes)
Returns whether there are among the attributes specified some that do not exist yet in the layer.
static QList< QgsVectorFileWriter::DriverDetails > ogrDriverList(VectorFormatOptions options=SortRecommended)
Returns the driver list that can be used for dialogs.
ActionOnExistingFile
Combination of CanAddNewLayer, CanAppendToExistingLayer, CanAddNewFieldsToExistingLayer or CanDeleteL...
@ CreateOrOverwriteLayer
Create or overwrite layer.
@ CreateOrOverwriteFile
Create or overwrite file.
@ AppendToLayerNoNewFields
Append features to existing layer, but do not create new fields.
@ AppendToLayerAddFields
Append features to existing layer, and create new fields if needed.
bool onlySelected() const
Returns whether only selected features will be saved.
bool forceMulti() const
Returns true if force multi geometry type is checked.
QString filename() const
Returns the target filename.
QgsAttributeList selectedAttributes() const
Returns a list of attributes which are selected for saving.
QgsRectangle filterExtent() const
Determines the extent to be exported.
Q_DECL_DEPRECATED long crs() const
Returns the internal CRS ID.
QString format() const
The format in which the export should be written.
QStringList datasourceOptions() const
Returns a list of additional data source options which are passed to OGR.
bool persistMetadata() const
Returns true if the persist metadata (copy source metadata to destination layer) option is checked.
QString encoding() const
The encoding of the target file.
void setIncludeZ(bool checked)
Sets whether the include z dimension checkbox should be checked.
QStringList attributesExportNames() const
Returns a list of export names for attributes.
void setOnlySelected(bool onlySelected)
Sets whether only selected features will be saved.
@ DestinationCrs
Show destination CRS (reprojection) option.
@ AddToCanvas
Show add to map option.
@ Extent
Show extent group.
@ Symbology
Show symbology options.
@ SelectedOnly
Show selected features only option.
@ Fields
Show field customization group.
@ Metadata
Show metadata options.
@ GeometryType
Show geometry group.
bool automaticGeometryType() const
Returns true if geometry type is set to automatic.
QString layername() const
Returns the target layer name.
QgsWkbTypes::Type geometryType() const
Returns the selected flat geometry type for the export.
Q_DECL_DEPRECATED QgsVectorLayerSaveAsDialog(long srsid, QWidget *parent=nullptr, Qt::WindowFlags fl=Qt::WindowFlags())
Construct a new QgsVectorLayerSaveAsDialog.
bool includeZ() const
Returns true if include z dimension is checked.
QgsCoordinateReferenceSystem crsObject() const
Returns the CRS chosen for export.
QStringList layerOptions() const
Returns a list of additional layer options which are passed to OGR.
void setForceMulti(bool checked)
Sets whether the force multi geometry checkbox should be checked.
bool addToCanvas() const
Returns true if the "add to canvas" checkbox is checked.
void setMapCanvas(QgsMapCanvas *canvas)
Sets a map canvas to associate with the dialog.
QgsVectorFileWriter::ActionOnExistingFile creationActionOnExistingFile() const
Returns creation action.
int symbologyExport() const
Returns type of symbology export.
QgsAttributeList attributesAsDisplayedValues() const
Returns selected attributes that must be exported with their displayed values instead of their raw va...
double scale() const
Returns the specified map scale.
bool hasFilterExtent() const
Determines if filtering the export by an extent is activated.
void setAddToCanvas(bool checked)
Sets whether the "add to canvas" checkbox should be checked.
Represents a vector layer which manages a vector based data sets.
QgsFields fields() const FINAL
Returns the list of fields of this layer.
int selectedFeatureCount() const
Returns the number of features that are selected in this layer.
QgsRectangle extent() const FINAL
Returns the extent of the layer.
static QString translatedDisplayString(Type type) SIP_HOLDGIL
Returns a translated display string type for a WKB type, e.g., the geometry name used in WKT geometry...
Type
The WKB type describes the number of dimensions a geometry has.
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.
QList< int > QgsAttributeList
const QgsCoordinateReferenceSystem & crs
Details of available driver formats.