33#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();
85 mAttributesSelection->hide();
88 mSelectedOnly->hide();
94 mGeometryGroupBox->hide();
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 );
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 QWidget *control =
nullptr;
239 switch ( option->
type )
246 QSpinBox *sb =
new QSpinBox();
247 sb->setObjectName( it.key() );
248 sb->setMaximum( std::numeric_limits<int>::max() );
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() );
296 QLabel *label =
new QLabel( it.key() );
299 label->setToolTip( QStringLiteral(
"<p>%1</p>" ).arg( option->
docString.toHtmlEscaped() ) );
300 control->setToolTip( QStringLiteral(
"<p>%1</p>" ).arg( option->
docString.toHtmlEscaped() ) );
302 controls << QPair<QLabel *, QWidget *>( label, control );
313 QgsVectorFileWriter::EditionCapabilities caps =
318 msgBox.setIcon( QMessageBox::Question );
319 msgBox.setWindowTitle( tr(
"Save Vector Layer As" ) );
320 QPushButton *overwriteFileButton = msgBox.addButton( tr(
"Overwrite File" ), QMessageBox::ActionRole );
321 QPushButton *overwriteLayerButton = msgBox.addButton( tr(
"Overwrite Layer" ), QMessageBox::ActionRole );
322 QPushButton *appendToLayerButton = msgBox.addButton( tr(
"Append to Layer" ), QMessageBox::ActionRole );
323 msgBox.setStandardButtons( QMessageBox::Cancel );
324 msgBox.setDefaultButton( QMessageBox::Cancel );
325 overwriteFileButton->hide();
326 overwriteLayerButton->hide();
327 appendToLayerButton->hide();
334 msgBox.setText( tr(
"The layer already exists. Do you want to overwrite the whole file or overwrite the layer?" ) );
335 overwriteFileButton->setVisible(
true );
336 overwriteLayerButton->setVisible(
true );
340 msgBox.setText( tr(
"The file already exists. Do you want to overwrite it?" ) );
341 overwriteFileButton->setVisible(
true );
346 msgBox.setText( tr(
"The layer already exists. Do you want to overwrite the whole file, overwrite the layer or append features to the layer?" ) );
347 appendToLayerButton->setVisible(
true );
348 overwriteFileButton->setVisible(
true );
349 overwriteLayerButton->setVisible(
true );
353 msgBox.setText( tr(
"The layer already exists. Do you want to overwrite the whole file or append features to the layer?" ) );
354 appendToLayerButton->setVisible(
true );
355 overwriteFileButton->setVisible(
true );
358 int ret = msgBox.exec();
359 if ( ret == QMessageBox::Cancel )
361 if ( msgBox.clickedButton() == overwriteFileButton )
363 else if ( msgBox.clickedButton() == overwriteLayerButton )
365 else if ( msgBox.clickedButton() == appendToLayerButton )
377 if ( QMessageBox::question(
this,
378 tr(
"Save Vector Layer As" ),
379 tr(
"The file already exists. Do you want to overwrite it?" ) ) == QMessageBox::NoButton )
392 if ( QMessageBox::question(
this,
393 tr(
"Save Vector Layer As" ),
394 tr(
"The existing layer has additional fields. Do you want to add the missing fields to the layer?" ) ) == QMessageBox::Yes )
403 QStringList layerList;
404 layerList.reserve( sublayers.size() );
407 layerList.append( sublayer.name() );
409 if ( layerList.length() > 1 )
411 layerList.sort( Qt::CaseInsensitive );
413 msgBox.setIcon( QMessageBox::Warning );
414 msgBox.setWindowTitle( tr(
"Overwrite File" ) );
415 msgBox.setText( tr(
"This file contains %1 layers that will be lost!\n" ).arg( QLocale().toString( layerList.length() ) ) );
416 msgBox.setDetailedText( tr(
"The following layers will be permanently lost:\n\n%1" ).arg( layerList.join(
"\n" ) ) );
417 msgBox.setStandardButtons( QMessageBox::Ok | QMessageBox::Cancel );
418 if ( msgBox.exec() == QMessageBox::Cancel )
424 settings.
setValue( QStringLiteral(
"UI/lastVectorFileFilterDir" ), QFileInfo(
fileName() ).absolutePath() );
425 settings.
setValue( QStringLiteral(
"UI/lastVectorFormat" ),
format() );
430void QgsVectorLayerSaveAsDialog::mFormatComboBox_currentIndexChanged(
int idx )
434 mFilename->setEnabled(
true );
439 if ( !mFilename->filePath().isEmpty() )
441 const thread_local QRegularExpression rx(
"\\.(.*?)[\\s]" );
443 if ( !ext.isEmpty() )
445 QFileInfo fi( mFilename->filePath() );
446 mFilename->setFilePath( QStringLiteral(
"%1/%2.%3" ).arg( fi.path(), fi.baseName(), ext ) );
450 bool selectAllFields =
true;
455 bool isFormatForFieldsAsDisplayedValues =
false;
457 const QString sFormat(
format() );
458 if ( sFormat == QLatin1String(
"DXF" ) || sFormat == QLatin1String(
"DGN" ) )
460 mAttributesSelection->setVisible(
false );
461 selectAllFields =
false;
467 mAttributesSelection->setVisible(
true );
468 isFormatForFieldsAsDisplayedValues = ( sFormat == QLatin1String(
"CSV" ) ||
469 sFormat == QLatin1String(
"XLS" ) ||
470 sFormat == QLatin1String(
"XLSX" ) ||
471 sFormat == QLatin1String(
"ODS" ) );
478 mSymbologyExportLabel->setVisible(
true );
479 mSymbologyExportComboBox->setVisible(
true );
480 mScaleLabel->setVisible(
true );
481 mScaleWidget->setVisible(
true );
485 mSymbologyExportLabel->hide();
486 mSymbologyExportComboBox->hide();
488 mScaleWidget->hide();
491 leLayername->setEnabled( sFormat == QLatin1String(
"KML" ) ||
492 sFormat == QLatin1String(
"GPKG" ) ||
493 sFormat == QLatin1String(
"XLSX" ) ||
494 sFormat == QLatin1String(
"ODS" ) ||
495 sFormat == QLatin1String(
"FileGDB" ) ||
496 sFormat == QLatin1String(
"OpenFileGDB" ) ||
497 sFormat == QLatin1String(
"SQLite" ) ||
498 sFormat == QLatin1String(
"SpatiaLite" ) );
500 if ( sFormat == QLatin1String(
"XLSX" ) )
501 leLayername->setMaxLength( 31 );
502 else if ( leLayername->isEnabled() )
503 leLayername->setMaxLength( 32767 );
505 if ( !leLayername->isEnabled() )
506 leLayername->setText( QString() );
507 else if ( leLayername->text().isEmpty() )
509 QString
layerName = mDefaultOutputLayerNameFromInputLayerName;
510 if (
layerName.isEmpty() && !mFilename->filePath().isEmpty() )
512 layerName = QFileInfo( mFilename->filePath() ).baseName();
513 leLayername->setDefaultValue(
layerName );
522 mAttributeTable->setRowCount( mLayer->
fields().
count() );
524 QStringList horizontalHeaders = QStringList() << tr(
"Name" ) << tr(
"Export name" ) << tr(
"Type" ) << tr(
"Replace with displayed values" );
525 mAttributeTable->setColumnCount( horizontalHeaders.size() );
526 mAttributeTable->setHorizontalHeaderLabels( horizontalHeaders );
528 bool foundFieldThatCanBeExportedAsDisplayedValue =
false;
529 for (
int i = 0; i < mLayer->
fields().size(); ++i )
532 if ( setup.
type() != QLatin1String(
"TextEdit" ) &&
535 foundFieldThatCanBeExportedAsDisplayedValue =
true;
539 mAttributeTable->setColumnHidden(
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ),
540 ! foundFieldThatCanBeExportedAsDisplayedValue );
542 bool checkReplaceRawFieldValues = selectAllFields && isFormatForFieldsAsDisplayedValues;
543 const QSignalBlocker signalBlockerAttributeTable( mAttributeTable );
545 for (
int i = 0; i < mLayer->
fields().size(); ++i )
548 Qt::ItemFlags flags = mLayer->
providerType() != QLatin1String(
"oracle" ) || !fld.
typeName().contains( QLatin1String(
"SDO_GEOMETRY" ) ) ? Qt::ItemIsEnabled : Qt::NoItemFlags;
549 QTableWidgetItem *item =
nullptr;
550 item =
new QTableWidgetItem( fld.
name() );
551 item->setFlags( flags | Qt::ItemIsUserCheckable );
552 item->setCheckState( ( selectAllFields ) ? Qt::Checked : Qt::Unchecked );
553 mAttributeTable->setItem( i,
static_cast<int>( ColumnIndex::Name ), item );
555 item =
new QTableWidgetItem( fld.
name() );
556 item->setFlags( flags | Qt::ItemIsEditable );
558 mAttributeTable->setItem( i,
static_cast<int>( ColumnIndex::ExportName ), item );
560 item =
new QTableWidgetItem( fld.
typeName() );
561 item->setFlags( flags );
562 mAttributeTable->setItem( i,
static_cast<int>( ColumnIndex::Type ), item );
564 if ( foundFieldThatCanBeExportedAsDisplayedValue )
568 const QString widgetId( setup.
type() );
569 if ( flags == Qt::ItemIsEnabled &&
570 widgetId != QLatin1String(
"TextEdit" ) &&
573 item =
new QTableWidgetItem( tr(
"Use %1" ).arg( factory->
name() ) );
574 item->setFlags( ( selectAllFields ) ? ( Qt::ItemIsEnabled | Qt::ItemIsUserCheckable ) : Qt::ItemIsUserCheckable );
575 const bool checkItem = ( selectAllFields && isFormatForFieldsAsDisplayedValues &&
576 ( widgetId == QLatin1String(
"ValueMap" ) ||
577 widgetId == QLatin1String(
"ValueRelation" ) ||
578 widgetId == QLatin1String(
"CheckBox" ) ||
579 widgetId == QLatin1String(
"RelationReference" ) ) );
580 checkReplaceRawFieldValues &= checkItem;
581 item->setCheckState( checkItem ?
582 Qt::Checked : Qt::Unchecked );
583 mAttributeTable->setItem( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ), item );
587 item =
new QTableWidgetItem();
588 item->setFlags( Qt::NoItemFlags );
589 mAttributeTable->setItem( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ), item );
595 whileBlocking( mReplaceRawFieldValues )->setChecked( checkReplaceRawFieldValues );
596 mReplaceRawFieldValues->setEnabled( selectAllFields );
597 mReplaceRawFieldValues->setVisible( foundFieldThatCanBeExportedAsDisplayedValue );
599 mAttributeTable->resizeColumnsToContents();
604 while ( mDatasourceOptionsGroupBox->layout()->count() )
606 QLayoutItem *item = mDatasourceOptionsGroupBox->layout()->takeAt( 0 );
607 delete item->widget();
611 while ( mLayerOptionsGroupBox->layout()->count() )
613 QLayoutItem *item = mLayerOptionsGroupBox->layout()->takeAt( 0 );
614 delete item->widget();
618 typedef QPair<QLabel *, QWidget *> LabelControlPair;
624 mDatasourceOptionsGroupBox->setVisible(
true );
625 QList<QPair<QLabel *, QWidget *> > controls = createControls( driverMetaData.
driverOptions );
627 QFormLayout *datasourceLayout =
dynamic_cast<QFormLayout *
>( mDatasourceOptionsGroupBox->layout() );
629 const auto constControls = controls;
630 for ( LabelControlPair control : constControls )
632 datasourceLayout->addRow( control.first, control.second );
637 mDatasourceOptionsGroupBox->setVisible(
false );
642 mLayerOptionsGroupBox->setVisible(
true );
643 QList<QPair<QLabel *, QWidget *> > controls = createControls( driverMetaData.
layerOptions );
645 QFormLayout *layerOptionsLayout =
dynamic_cast<QFormLayout *
>( mLayerOptionsGroupBox->layout() );
647 const auto constControls = controls;
648 for ( LabelControlPair control : constControls )
650 layerOptionsLayout->addRow( control.first, control.second );
655 mLayerOptionsGroupBox->setVisible(
false );
660 mEncodingComboBox->setEnabled(
true );
667 mEncodingComboBox->setCurrentIndex( idx );
668 mEncodingComboBox->setDisabled(
true );
672 mEncodingComboBox->setEnabled(
true );
679 mEncodingComboBox->setEnabled(
true );
682 GDALDriverH hDriver = GDALGetDriverByName(
format().toUtf8().constData() );
685 const bool canReopen = GDALGetMetadataItem( hDriver, GDAL_DCAP_OPEN,
nullptr ) !=
nullptr;
686 if ( mAddToCanvas->isEnabled() && !canReopen )
688 mAddToCanvasStateOnOpenCompatibleDriver = mAddToCanvas->isChecked();
689 mAddToCanvas->setChecked(
false );
690 mAddToCanvas->setEnabled(
false );
692 else if ( !mAddToCanvas->isEnabled() && canReopen )
694 mAddToCanvas->setChecked( mAddToCanvasStateOnOpenCompatibleDriver );
695 mAddToCanvas->setEnabled(
true );
700void QgsVectorLayerSaveAsDialog::mUseAliasesForExportedName_stateChanged(
int state )
702 const QSignalBlocker signalBlocker( mAttributeTable );
709 bool modifiedEntries =
false;
710 for (
int i = 0; i < mAttributeTable->rowCount(); i++ )
712 if ( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportName ) )->text()
713 != mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportName ) )->data( Qt::UserRole ).toString() )
715 modifiedEntries =
true;
720 if ( modifiedEntries )
722 if ( QMessageBox::question(
this,
723 tr(
"Modified names" ),
724 tr(
"Some names were modified and will be overridden. Do you want to continue?" ) )
727 whileBlocking( mUseAliasesForExportedName )->setCheckState( Qt::PartiallyChecked );
732 for (
int i = 0; i < mAttributeTable->rowCount(); i++ )
734 mUseAliasesForExportedName->setTristate(
false );
735 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportName ) )->setText( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::Name ) )->text() );
742 bool modifiedEntries =
false;
743 for (
int i = 0; i < mAttributeTable->rowCount(); i++ )
745 if ( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportName ) )->text()
746 != mAttributeTable->item( i,
static_cast<int>( ColumnIndex::Name ) )->text() )
747 modifiedEntries =
true;
750 if ( modifiedEntries )
752 if ( QMessageBox::question(
this,
753 tr(
"Modified names" ),
754 tr(
"Some names were modified and will be overridden. Do you want to continue?" ) )
757 whileBlocking( mUseAliasesForExportedName )->setCheckState( Qt::PartiallyChecked );
762 for (
int i = 0; i < mAttributeTable->rowCount(); i++ )
764 mUseAliasesForExportedName->setTristate(
false );
765 const QString alias = mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportName ) )->data( Qt::UserRole ).toString();
766 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportName ) )->setText( alias );
770 case Qt::PartiallyChecked:
776void QgsVectorLayerSaveAsDialog::mReplaceRawFieldValues_stateChanged(
int )
778 if ( mAttributeTable->isColumnHidden(
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) ) )
781 const QSignalBlocker signalBlockerAttributeTable( mAttributeTable );
782 const QSignalBlocker signalBlockerReplaceRawFieldValues( mReplaceRawFieldValues );
784 if ( mReplaceRawFieldValues->checkState() != Qt::PartiallyChecked )
786 for (
int i = 0; i < mAttributeTable->rowCount(); i++ )
788 if ( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::Name ) )->checkState() == Qt::Checked &&
789 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) ) &&
790 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->flags() & Qt::ItemIsEnabled )
792 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->setCheckState( mReplaceRawFieldValues->checkState() );
796 mReplaceRawFieldValues->setTristate(
false );
799void QgsVectorLayerSaveAsDialog::mAttributeTable_itemChanged( QTableWidgetItem *item )
801 const QSignalBlocker signalBlockerAttributeTable( mAttributeTable );
802 const QSignalBlocker signalBlockerReplaceRawFieldValues( mReplaceRawFieldValues );
804 int row = item->row();
805 int column = item->column();
807 switch (
static_cast<ColumnIndex
>( column ) )
809 case ColumnIndex::Name:
811 if ( mAttributeTable->isColumnHidden(
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) ) ||
812 ! mAttributeTable->item( row,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) ) ||
813 !( mAttributeTable->item( row,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->flags() & Qt::ItemIsUserCheckable ) )
816 if ( mAttributeTable->item( row, column )->checkState() == Qt::Unchecked )
818 mAttributeTable->item( row,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->setCheckState( Qt::Unchecked );
819 mAttributeTable->item( row,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->setFlags( Qt::ItemIsUserCheckable );
820 bool checkBoxEnabled =
false;
821 for (
int i = 0; i < mAttributeTable->rowCount(); i++ )
823 if ( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) ) &&
824 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->flags() & Qt::ItemIsEnabled )
826 checkBoxEnabled =
true;
830 mReplaceRawFieldValues->setEnabled( checkBoxEnabled );
831 if ( !checkBoxEnabled )
832 mReplaceRawFieldValues->setCheckState( Qt::Unchecked );
834 else if ( mAttributeTable->item( row, column )->checkState() == Qt::Checked )
836 mAttributeTable->item( row,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->setFlags( Qt::ItemIsUserCheckable | Qt::ItemIsEnabled );
837 mReplaceRawFieldValues->setEnabled(
true );
841 case ColumnIndex::ExportName:
844 if ( item->text().isEmpty() )
846 QMessageBox::warning(
this,
847 tr(
"Empty export name" ),
848 tr(
"Empty export name are not allowed." ) );
854 while ( names.count( item->text() ) > 1 )
855 item->setText( QString(
"%1_2" ).arg( item->text() ) );
857 mUseAliasesForExportedName->setCheckState( Qt::PartiallyChecked );
860 case ColumnIndex::Type:
863 case ColumnIndex::ExportAsDisplayedValue:
865 if ( mAttributeTable->item( row, column )->flags() & Qt::ItemIsUserCheckable )
867 bool allChecked =
true;
868 bool allUnchecked =
true;
869 for (
int i = 0; i < mAttributeTable->rowCount(); i++ )
871 if ( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) ) &&
872 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->flags() & Qt::ItemIsEnabled )
874 if ( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->checkState() == Qt::Unchecked )
877 allUnchecked =
false;
880 mReplaceRawFieldValues->setCheckState( ( !allChecked && !allUnchecked ) ? Qt::PartiallyChecked : ( allChecked ) ? Qt::Checked : Qt::Unchecked );
890 mExtentGroupBox->setOutputCrs( mSelectedCrs );
895 return mFilename->filePath();
900 return leLayername->text();
905 return mEncodingComboBox->currentText();
910 return mFormatComboBox->currentData().toString();
926 QMap<QString, QgsVectorFileWriter::Option *>::ConstIterator it;
930 switch ( it.value()->type )
935 QSpinBox *sb = mDatasourceOptionsGroupBox->findChild<QSpinBox *>( it.key() );
937 options << QStringLiteral(
"%1=%2" ).arg( it.key() ).arg( sb->value() );
944 QComboBox *cb = mDatasourceOptionsGroupBox->findChild<QComboBox *>( it.key() );
945 if ( opt && cb && cb->itemData( cb->currentIndex() ) != opt->
defaultValue )
946 options << QStringLiteral(
"%1=%2" ).arg( it.key(), cb->currentText() );
953 QLineEdit *le = mDatasourceOptionsGroupBox->findChild<QLineEdit *>( it.key() );
955 options << QStringLiteral(
"%1=%2" ).arg( it.key(), le->text() );
963 options << QStringLiteral(
"%1=%2" ).arg( it.key(), opt->
mValue );
970 QString plainText = mOgrDatasourceOptions->toPlainText().trimmed();
971 if ( !plainText.isEmpty() )
972 options += plainText.split(
'\n' );
985 QMap<QString, QgsVectorFileWriter::Option *>::ConstIterator it;
989 switch ( it.value()->type )
994 QSpinBox *sb = mLayerOptionsGroupBox->findChild<QSpinBox *>( it.key() );
996 options << QStringLiteral(
"%1=%2" ).arg( it.key() ).arg( sb->value() );
1003 QComboBox *cb = mLayerOptionsGroupBox->findChild<QComboBox *>( it.key() );
1004 if ( opt && cb && cb->itemData( cb->currentIndex() ) != opt->
defaultValue )
1005 options << QStringLiteral(
"%1=%2" ).arg( it.key(), cb->currentText() );
1012 QLineEdit *le = mLayerOptionsGroupBox->findChild<QLineEdit *>( it.key() );
1014 options << QStringLiteral(
"%1=%2" ).arg( it.key(), le->text() );
1022 options << QStringLiteral(
"%1=%2" ).arg( it.key(), opt->
mValue );
1029 QString plainText = mOgrLayerOptions->toPlainText().trimmed();
1030 if ( !plainText.isEmpty() )
1031 options += plainText.split(
'\n' );
1040 for (
int i = 0; i < mAttributeTable->rowCount(); i++ )
1042 if ( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::Name ) )->checkState() == Qt::Checked )
1044 attributes.append( i );
1055 for (
int i = 0; i < mAttributeTable->rowCount(); i++ )
1057 if ( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::Name ) )->checkState() == Qt::Checked &&
1058 ! mAttributeTable->isColumnHidden(
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) ) &&
1059 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->checkState() == Qt::Checked )
1061 attributes.append( i );
1070 QStringList exportNames;
1071 for (
int i = 0; i < mAttributeTable->rowCount(); i++ )
1072 exportNames.append( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportName ) )->text() );
1079 return mAddToCanvas->isChecked();
1084 mAddToCanvasStateOnOpenCompatibleDriver = enabled;
1085 if ( mAddToCanvas->isEnabled() )
1086 mAddToCanvas->setChecked( enabled );
1096 return mScaleWidget->scale();
1101 mMapCanvas = canvas;
1102 mScaleWidget->setMapCanvas( canvas );
1103 mScaleWidget->setShowCurrentScaleButton(
true );
1109 return mExtentGroupBox->isChecked();
1114 return mExtentGroupBox->outputExtent();
1124 return mSelectedOnly->isChecked();
1129 return mCheckPersistMetadata->isChecked();
1134 int currentIndexData = mGeometryTypeComboBox->currentData().toInt();
1135 if ( currentIndexData == -1 )
1146 int currentIndexData = mGeometryTypeComboBox->currentData().toInt();
1147 return currentIndexData == -1;
1152 return mForceMultiCheckBox->isChecked();
1157 mForceMultiCheckBox->setChecked( checked );
1162 return mIncludeZCheckBox->isChecked();
1167 return mActionOnExistingFile;
1172 mIncludeZCheckBox->setChecked( checked );
1175void QgsVectorLayerSaveAsDialog::mSymbologyExportComboBox_currentIndexChanged(
const QString &text )
1177 bool scaleEnabled =
true;
1178 if ( text == tr(
"No symbology" ) )
1180 scaleEnabled =
false;
1182 mScaleWidget->setEnabled( scaleEnabled );
1183 mScaleLabel->setEnabled( scaleEnabled );
1186void QgsVectorLayerSaveAsDialog::mGeometryTypeComboBox_currentIndexChanged(
int )
1192 mForceMultiCheckBox->setEnabled(
true );
1193 mIncludeZCheckBox->setEnabled(
true );
1197 mForceMultiCheckBox->setEnabled(
false );
1198 mForceMultiCheckBox->setChecked(
false );
1199 mIncludeZCheckBox->setEnabled(
false );
1200 mIncludeZCheckBox->setChecked(
false );
1204void QgsVectorLayerSaveAsDialog::mSelectAllAttributes_clicked()
1206 const QSignalBlocker signalBlockerAttributeTable( mAttributeTable );
1207 const QSignalBlocker signalBlockerReplaceRawFieldValues( mReplaceRawFieldValues );
1209 for (
int i = 0; i < mAttributeTable->rowCount(); i++ )
1211 if ( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::Name ) )->flags() & Qt::ItemIsEnabled )
1213 if ( ! mAttributeTable->isColumnHidden(
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) ) &&
1214 ( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->flags() & Qt::ItemIsUserCheckable ) )
1216 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->setFlags( Qt::ItemIsUserCheckable | Qt::ItemIsEnabled );
1218 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::Name ) )->setCheckState( Qt::Checked );
1221 if ( ! mAttributeTable->isColumnHidden(
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) ) )
1223 mReplaceRawFieldValues->setEnabled(
true );
1227void QgsVectorLayerSaveAsDialog::mDeselectAllAttributes_clicked()
1229 const QSignalBlocker signalBlockerAttributeTable( mAttributeTable );
1230 const QSignalBlocker signalBlockerReplaceRawFieldValues( mReplaceRawFieldValues );
1232 for (
int i = 0; i < mAttributeTable->rowCount(); i++ )
1234 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::Name ) )->setCheckState( Qt::Unchecked );
1235 if ( ! mAttributeTable->isColumnHidden(
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) ) &&
1236 ( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->flags() & Qt::ItemIsUserCheckable ) )
1238 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->setFlags( Qt::ItemIsUserCheckable );
1239 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->setCheckState( Qt::Unchecked );
1242 if ( ! mAttributeTable->isColumnHidden(
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) ) )
1244 mReplaceRawFieldValues->setCheckState( Qt::Unchecked );
1245 mReplaceRawFieldValues->setEnabled(
false );
1249void QgsVectorLayerSaveAsDialog::showHelp()
1251 QgsHelp::openHelp( QStringLiteral(
"managing_data_source/create_layers.html#creating-new-layers-from-an-existing-layer" ) );
WkbType
The WKB type describes the number of dimensions a geometry has.
@ GeometryCollection
GeometryCollection.
FeatureSymbologyExport
Options for exporting features considering their symbology.
@ PerFeature
Keeps the number of features and export symbology per feature.
@ PerSymbolLayer
Exports one feature per symbol layer (considering symbol levels)
@ NoSymbology
Export only data.
This class represents a coordinate reference system (CRS).
QgsDatumEnsemble datumEnsemble() const
Attempts to retrieve datum ensemble details from the CRS.
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(Qgis::WkbType 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.
QgsAttributeList selectedAttributes() const
Returns a list of attributes which are selected for saving.
QgsRectangle filterExtent() const
Determines the extent to be exported.
QString format() const
Returns the selected 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
Returns the selected encoding for 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.
QString fileName() const
Returns the target filename.
void setOnlySelected(bool onlySelected)
Sets whether only selected features will be saved.
QString layerName() const
Returns the target layer name.
bool automaticGeometryType() const
Returns true if geometry type is set to automatic.
Q_DECL_DEPRECATED QgsVectorLayerSaveAsDialog(long srsid, QWidget *parent=nullptr, Qt::WindowFlags fl=Qt::WindowFlags())
Available dialog options.
bool includeZ() const
Returns true if include z dimension is checked.
@ Symbology
Show symbology options.
@ DestinationCrs
Show destination CRS (reprojection) option.
@ AddToCanvas
Show add to map option.
@ Fields
Show field customization group.
@ Extent
Show extent group.
@ SelectedOnly
Show selected features only option.
@ GeometryType
Show geometry group.
@ Metadata
Show metadata options.
QgsCoordinateReferenceSystem crs() 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.
Qgis::WkbType geometryType() const
Returns the selected flat geometry type for the export.
QgsVectorFileWriter::ActionOnExistingFile creationActionOnExistingFile() const
Returns the creation action.
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.
Qgis::FeatureSymbologyExport symbologyExport() const
Returns type of symbology export.
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(Qgis::WkbType type)
Returns a translated display string type for a WKB type, e.g., the geometry name used in WKT geometry...
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.