29 #include <QMessageBox>
30 #include <QFileDialog>
33 #include <QRegularExpression>
41 : QDialog( parent, fl )
49 : QDialog( parent, fl )
56 mSelectedCrs = layer->
crs();
57 mLayerExtent = layer->
extent();
63 mSymbologyExportLabel->hide();
64 mSymbologyExportComboBox->hide();
74 if ( !( mOptions &
Fields ) )
75 mAttributesSelection->hide();
78 mSelectedOnly->hide();
84 mGeometryGroupBox->hide();
86 if ( !( mOptions &
Extent ) )
87 mExtentGroupBox->hide();
91 mCheckPersistMetadata->setChecked(
false );
92 mCheckPersistMetadata->hide();
96 mButtonBox->button( QDialogButtonBox::Ok )->setDisabled(
true );
99 void QgsVectorLayerSaveAsDialog::setup()
104 connect( mFormatComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsVectorLayerSaveAsDialog::mFormatComboBox_currentIndexChanged );
106 connect( mSymbologyExportComboBox, &QComboBox::currentTextChanged,
this, &QgsVectorLayerSaveAsDialog::mSymbologyExportComboBox_currentIndexChanged );
107 connect( mGeometryTypeComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsVectorLayerSaveAsDialog::mGeometryTypeComboBox_currentIndexChanged );
108 connect( mSelectAllAttributes, &QPushButton::clicked,
this, &QgsVectorLayerSaveAsDialog::mSelectAllAttributes_clicked );
109 connect( mDeselectAllAttributes, &QPushButton::clicked,
this, &QgsVectorLayerSaveAsDialog::mDeselectAllAttributes_clicked );
110 connect( mUseAliasesForExportedName, &QCheckBox::stateChanged,
this, &QgsVectorLayerSaveAsDialog::mUseAliasesForExportedName_stateChanged );
111 connect( mReplaceRawFieldValues, &QCheckBox::stateChanged,
this, &QgsVectorLayerSaveAsDialog::mReplaceRawFieldValues_stateChanged );
112 connect( mAttributeTable, &QTableWidget::itemChanged,
this, &QgsVectorLayerSaveAsDialog::mAttributeTable_itemChanged );
115 mHelpButtonBox->setVisible(
false );
116 mButtonBox->addButton( QDialogButtonBox::Help );
117 connect( mButtonBox, &QDialogButtonBox::helpRequested,
this, &QgsVectorLayerSaveAsDialog::showHelp );
119 connect( mHelpButtonBox, &QDialogButtonBox::helpRequested,
this, &QgsVectorLayerSaveAsDialog::showHelp );
121 connect( mButtonBox, &QDialogButtonBox::accepted,
this, &QgsVectorLayerSaveAsDialog::accept );
122 connect( mButtonBox, &QDialogButtonBox::rejected,
this, &QgsVectorLayerSaveAsDialog::reject );
125 mFormatComboBox->blockSignals(
true );
128 mFormatComboBox->addItem( driver.longName, driver.driverName );
132 QString
format = settings.
value( QStringLiteral(
"UI/lastVectorFormat" ),
"GPKG" ).toString();
133 mFormatComboBox->setCurrentIndex( mFormatComboBox->findData(
format ) );
134 mFormatComboBox->blockSignals(
false );
142 mGeometryTypeComboBox->addItem( tr(
"Automatic" ), -1 );
148 mGeometryTypeComboBox->setCurrentIndex( mGeometryTypeComboBox->findData( -1 ) );
152 QString enc = settings.
value( QStringLiteral(
"UI/encoding" ),
"System" ).toString();
153 int idx = mEncodingComboBox->findText( enc );
156 mEncodingComboBox->insertItem( 0, enc );
160 mCrsSelector->setCrs( mSelectedCrs );
161 mCrsSelector->setLayerCrs( mSelectedCrs );
162 mCrsSelector->setMessage( tr(
"Select the coordinate reference system for the vector file. "
163 "The data points will be transformed from the layer coordinate reference system." ) );
165 mEncodingComboBox->setCurrentIndex( idx );
166 mFormatComboBox_currentIndexChanged( mFormatComboBox->currentIndex() );
172 mSymbologyExportComboBox_currentIndexChanged( mSymbologyExportComboBox->currentText() );
175 mExtentGroupBox->setOutputCrs( mSelectedCrs );
176 mExtentGroupBox->setOriginalExtent( mLayerExtent, mSelectedCrs );
177 mExtentGroupBox->setOutputExtentFromOriginal();
178 mExtentGroupBox->setCheckable(
true );
179 mExtentGroupBox->setChecked(
false );
180 mExtentGroupBox->setCollapsed(
true );
183 mFilename->setDialogTitle( tr(
"Save Layer As" ) );
184 mFilename->setDefaultRoot( settings.
value( QStringLiteral(
"UI/lastVectorFileFilterDir" ), QDir::homePath() ).toString() );
185 mFilename->setConfirmOverwrite(
false );
189 QFileInfo tmplFileInfo( filePath );
190 settings.
setValue( QStringLiteral(
"UI/lastVectorFileFilterDir" ), tmplFileInfo.absolutePath() );
191 if ( !filePath.isEmpty() && leLayername->isEnabled() )
193 QFileInfo fileInfo( filePath );
194 leLayername->setText( fileInfo.completeBaseName() );
196 mButtonBox->button( QDialogButtonBox::Ok )->setEnabled( !filePath.isEmpty() );
204 mCrsSelector->setSourceEnsemble( ensemble.
name() );
211 mCrsSelector->setShowAccuracyWarnings(
true );
214 QList<QPair<QLabel *, QWidget *> > QgsVectorLayerSaveAsDialog::createControls(
const QMap<QString, QgsVectorFileWriter::Option *> &options )
216 QList<QPair<QLabel *, QWidget *> > controls;
217 QMap<QString, QgsVectorFileWriter::Option *>::ConstIterator it;
219 for ( it = options.constBegin(); it != options.constEnd(); ++it )
222 QLabel *label =
new QLabel( it.key() );
223 QWidget *control =
nullptr;
224 switch ( option->
type )
231 QSpinBox *sb =
new QSpinBox();
232 sb->setObjectName( it.key() );
244 QComboBox *cb =
new QComboBox();
245 cb->setObjectName( it.key() );
246 for (
const QString &val : std::as_const( opt->
values ) )
248 cb->addItem( val, val );
251 cb->addItem( tr(
"<Default>" ), QVariant( QVariant::String ) );
254 idx = cb->findData( QVariant( QVariant::String ) );
255 cb->setCurrentIndex( idx );
267 le->setObjectName( it.key() );
281 label->setToolTip( QStringLiteral(
"<p>%1</p>" ).arg( option->
docString.toHtmlEscaped() ) );
282 control->setToolTip( QStringLiteral(
"<p>%1</p>" ).arg( option->
docString.toHtmlEscaped() ) );
284 controls << QPair<QLabel *, QWidget *>( label, control );
291 void QgsVectorLayerSaveAsDialog::accept()
295 QgsVectorFileWriter::EditionCapabilities caps =
300 msgBox.setIcon( QMessageBox::Question );
301 msgBox.setWindowTitle( tr(
"Save Vector Layer As" ) );
302 QPushButton *overwriteFileButton = msgBox.addButton( tr(
"Overwrite File" ), QMessageBox::ActionRole );
303 QPushButton *overwriteLayerButton = msgBox.addButton( tr(
"Overwrite Layer" ), QMessageBox::ActionRole );
304 QPushButton *appendToLayerButton = msgBox.addButton( tr(
"Append to Layer" ), QMessageBox::ActionRole );
305 msgBox.setStandardButtons( QMessageBox::Cancel );
306 msgBox.setDefaultButton( QMessageBox::Cancel );
307 overwriteFileButton->hide();
308 overwriteLayerButton->hide();
309 appendToLayerButton->hide();
316 msgBox.setText( tr(
"The layer already exists. Do you want to overwrite the whole file or overwrite the layer?" ) );
317 overwriteFileButton->setVisible(
true );
318 overwriteLayerButton->setVisible(
true );
322 msgBox.setText( tr(
"The file already exists. Do you want to overwrite it?" ) );
323 overwriteFileButton->setVisible(
true );
328 msgBox.setText( tr(
"The layer already exists. Do you want to overwrite the whole file, overwrite the layer or append features to the layer?" ) );
329 appendToLayerButton->setVisible(
true );
330 overwriteFileButton->setVisible(
true );
331 overwriteLayerButton->setVisible(
true );
335 msgBox.setText( tr(
"The layer already exists. Do you want to overwrite the whole file or append features to the layer?" ) );
336 appendToLayerButton->setVisible(
true );
337 overwriteFileButton->setVisible(
true );
340 int ret = msgBox.exec();
341 if ( ret == QMessageBox::Cancel )
343 if ( msgBox.clickedButton() == overwriteFileButton )
345 else if ( msgBox.clickedButton() == overwriteLayerButton )
347 else if ( msgBox.clickedButton() == appendToLayerButton )
359 if ( QMessageBox::question(
this,
360 tr(
"Save Vector Layer As" ),
361 tr(
"The file already exists. Do you want to overwrite it?" ) ) == QMessageBox::NoButton )
374 if ( QMessageBox::question(
this,
375 tr(
"Save Vector Layer As" ),
376 tr(
"The existing layer has additional fields. Do you want to add the missing fields to the layer?" ) ) == QMessageBox::Yes )
385 QStringList layerList;
386 layerList.reserve( sublayers.size() );
389 layerList.append( sublayer.name() );
391 if ( layerList.length() > 1 )
393 layerList.sort( Qt::CaseInsensitive );
395 msgBox.setIcon( QMessageBox::Warning );
396 msgBox.setWindowTitle( tr(
"Overwrite File" ) );
397 msgBox.setText( tr(
"This file contains %1 layers that will be lost!\n" ).arg( QLocale().toString( layerList.length() ) ) );
398 msgBox.setDetailedText( tr(
"The following layers will be permanently lost:\n\n%1" ).arg( layerList.join(
"\n" ) ) );
399 msgBox.setStandardButtons( QMessageBox::Ok | QMessageBox::Cancel );
400 if ( msgBox.exec() == QMessageBox::Cancel )
406 settings.
setValue( QStringLiteral(
"UI/lastVectorFileFilterDir" ), QFileInfo(
filename() ).absolutePath() );
407 settings.
setValue( QStringLiteral(
"UI/lastVectorFormat" ),
format() );
412 void QgsVectorLayerSaveAsDialog::mFormatComboBox_currentIndexChanged(
int idx )
416 mFilename->setEnabled(
true );
421 if ( !mFilename->filePath().isEmpty() )
423 QRegularExpression rx(
"\\.(.*?)[\\s]" );
426 if ( !ext.isEmpty() )
428 QFileInfo fi( mFilename->filePath() );
429 mFilename->setFilePath( QStringLiteral(
"%1/%2.%3" ).arg( fi.path() ).arg( fi.baseName() ).arg( ext ) );
433 bool selectAllFields =
true;
438 bool isFormatForFieldsAsDisplayedValues =
false;
440 const QString sFormat(
format() );
441 if ( sFormat == QLatin1String(
"DXF" ) || sFormat == QLatin1String(
"DGN" ) )
443 mAttributesSelection->setVisible(
false );
444 selectAllFields =
false;
450 mAttributesSelection->setVisible(
true );
451 isFormatForFieldsAsDisplayedValues = ( sFormat == QLatin1String(
"CSV" ) ||
452 sFormat == QLatin1String(
"XLS" ) ||
453 sFormat == QLatin1String(
"XLSX" ) ||
454 sFormat == QLatin1String(
"ODS" ) );
461 mSymbologyExportLabel->setVisible(
true );
462 mSymbologyExportComboBox->setVisible(
true );
463 mScaleLabel->setVisible(
true );
464 mScaleWidget->setVisible(
true );
468 mSymbologyExportLabel->hide();
469 mSymbologyExportComboBox->hide();
471 mScaleWidget->hide();
474 leLayername->setEnabled( sFormat == QLatin1String(
"KML" ) ||
475 sFormat == QLatin1String(
"GPKG" ) ||
476 sFormat == QLatin1String(
"XLSX" ) ||
477 sFormat == QLatin1String(
"ODS" ) ||
478 sFormat == QLatin1String(
"FileGDB" ) ||
479 sFormat == QLatin1String(
"SQLite" ) ||
480 sFormat == QLatin1String(
"SpatiaLite" ) );
482 if ( sFormat == QLatin1String(
"XLSX" ) )
483 leLayername->setMaxLength( 31 );
484 else if ( leLayername->isEnabled() )
485 leLayername->setMaxLength( 32767 );
487 if ( !leLayername->isEnabled() )
488 leLayername->setText( QString() );
489 else if ( leLayername->text().isEmpty() &&
490 !mFilename->filePath().isEmpty() )
492 QString layerName = QFileInfo( mFilename->filePath() ).baseName();
493 leLayername->setText( layerName );
498 mAttributeTable->setRowCount( mLayer->
fields().
count() );
500 QStringList horizontalHeaders = QStringList() << tr(
"Name" ) << tr(
"Export name" ) << tr(
"Type" ) << tr(
"Replace with displayed values" );
501 mAttributeTable->setColumnCount( horizontalHeaders.size() );
502 mAttributeTable->setHorizontalHeaderLabels( horizontalHeaders );
504 bool foundFieldThatCanBeExportedAsDisplayedValue =
false;
505 for (
int i = 0; i < mLayer->
fields().size(); ++i )
508 if ( setup.
type() != QLatin1String(
"TextEdit" ) &&
511 foundFieldThatCanBeExportedAsDisplayedValue =
true;
515 mAttributeTable->setColumnHidden(
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ),
516 ! foundFieldThatCanBeExportedAsDisplayedValue );
518 bool checkReplaceRawFieldValues = selectAllFields && isFormatForFieldsAsDisplayedValues;
519 const QSignalBlocker signalBlockerAttributeTable( mAttributeTable );
521 for (
int i = 0; i < mLayer->
fields().size(); ++i )
524 Qt::ItemFlags flags = mLayer->
providerType() != QLatin1String(
"oracle" ) || !fld.
typeName().contains( QLatin1String(
"SDO_GEOMETRY" ) ) ? Qt::ItemIsEnabled : Qt::NoItemFlags;
525 QTableWidgetItem *item =
nullptr;
526 item =
new QTableWidgetItem( fld.
name() );
527 item->setFlags( flags | Qt::ItemIsUserCheckable );
528 item->setCheckState( ( selectAllFields ) ? Qt::Checked : Qt::Unchecked );
529 mAttributeTable->setItem( i,
static_cast<int>( ColumnIndex::Name ), item );
531 item =
new QTableWidgetItem( fld.
name() );
532 item->setFlags( flags | Qt::ItemIsEditable );
534 mAttributeTable->setItem( i,
static_cast<int>( ColumnIndex::ExportName ), item );
536 item =
new QTableWidgetItem( fld.
typeName() );
537 item->setFlags( flags );
538 mAttributeTable->setItem( i,
static_cast<int>( ColumnIndex::Type ), item );
540 if ( foundFieldThatCanBeExportedAsDisplayedValue )
544 const QString widgetId( setup.
type() );
545 if ( flags == Qt::ItemIsEnabled &&
546 widgetId != QLatin1String(
"TextEdit" ) &&
549 item =
new QTableWidgetItem( tr(
"Use %1" ).arg( factory->
name() ) );
550 item->setFlags( ( selectAllFields ) ? ( Qt::ItemIsEnabled | Qt::ItemIsUserCheckable ) : Qt::ItemIsUserCheckable );
551 const bool checkItem = ( selectAllFields && isFormatForFieldsAsDisplayedValues &&
552 ( widgetId == QLatin1String(
"ValueMap" ) ||
553 widgetId == QLatin1String(
"ValueRelation" ) ||
554 widgetId == QLatin1String(
"CheckBox" ) ||
555 widgetId == QLatin1String(
"RelationReference" ) ) );
556 checkReplaceRawFieldValues &= checkItem;
557 item->setCheckState( checkItem ?
558 Qt::Checked : Qt::Unchecked );
559 mAttributeTable->setItem( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ), item );
563 item =
new QTableWidgetItem();
564 item->setFlags( Qt::NoItemFlags );
565 mAttributeTable->setItem( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ), item );
571 whileBlocking( mReplaceRawFieldValues )->setChecked( checkReplaceRawFieldValues );
572 mReplaceRawFieldValues->setEnabled( selectAllFields );
573 mReplaceRawFieldValues->setVisible( foundFieldThatCanBeExportedAsDisplayedValue );
575 mAttributeTable->resizeColumnsToContents();
580 while ( mDatasourceOptionsGroupBox->layout()->count() )
582 QLayoutItem *item = mDatasourceOptionsGroupBox->layout()->takeAt( 0 );
583 delete item->widget();
587 while ( mLayerOptionsGroupBox->layout()->count() )
589 QLayoutItem *item = mLayerOptionsGroupBox->layout()->takeAt( 0 );
590 delete item->widget();
594 typedef QPair<QLabel *, QWidget *> LabelControlPair;
600 mDatasourceOptionsGroupBox->setVisible(
true );
601 QList<QPair<QLabel *, QWidget *> > controls = createControls( driverMetaData.
driverOptions );
603 QFormLayout *datasourceLayout =
dynamic_cast<QFormLayout *
>( mDatasourceOptionsGroupBox->layout() );
605 const auto constControls = controls;
606 for ( LabelControlPair control : constControls )
608 datasourceLayout->addRow( control.first, control.second );
613 mDatasourceOptionsGroupBox->setVisible(
false );
618 mLayerOptionsGroupBox->setVisible(
true );
619 QList<QPair<QLabel *, QWidget *> > controls = createControls( driverMetaData.
layerOptions );
621 QFormLayout *layerOptionsLayout =
dynamic_cast<QFormLayout *
>( mLayerOptionsGroupBox->layout() );
623 const auto constControls = controls;
624 for ( LabelControlPair control : constControls )
626 layerOptionsLayout->addRow( control.first, control.second );
631 mLayerOptionsGroupBox->setVisible(
false );
636 mEncodingComboBox->setEnabled(
true );
643 mEncodingComboBox->setCurrentIndex( idx );
644 mEncodingComboBox->setDisabled(
true );
648 mEncodingComboBox->setEnabled(
true );
655 mEncodingComboBox->setEnabled(
true );
658 GDALDriverH hDriver = GDALGetDriverByName(
format().toUtf8().constData() );
661 mAddToCanvas->setEnabled( GDALGetMetadataItem( hDriver, GDAL_DCAP_OPEN,
nullptr ) !=
nullptr );
665 void QgsVectorLayerSaveAsDialog::mUseAliasesForExportedName_stateChanged(
int state )
667 const QSignalBlocker signalBlocker( mAttributeTable );
674 bool modifiedEntries =
false;
675 for (
int i = 0; i < mAttributeTable->rowCount(); i++ )
677 if ( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportName ) )->text()
678 != mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportName ) )->data( Qt::UserRole ).toString() )
680 modifiedEntries =
true;
685 if ( modifiedEntries )
687 if ( QMessageBox::question(
this,
688 tr(
"Modified names" ),
689 tr(
"Some names were modified and will be overridden. Do you want to continue?" ) )
692 whileBlocking( mUseAliasesForExportedName )->setCheckState( Qt::PartiallyChecked );
697 for (
int i = 0; i < mAttributeTable->rowCount(); i++ )
699 mUseAliasesForExportedName->setTristate(
false );
700 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportName ) )->setText( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::Name ) )->text() );
707 bool modifiedEntries =
false;
708 for (
int i = 0; i < mAttributeTable->rowCount(); i++ )
710 if ( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportName ) )->text()
711 != mAttributeTable->item( i,
static_cast<int>( ColumnIndex::Name ) )->text() )
712 modifiedEntries =
true;
715 if ( modifiedEntries )
717 if ( QMessageBox::question(
this,
718 tr(
"Modified names" ),
719 tr(
"Some names were modified and will be overridden. Do you want to continue?" ) )
722 whileBlocking( mUseAliasesForExportedName )->setCheckState( Qt::PartiallyChecked );
727 for (
int i = 0; i < mAttributeTable->rowCount(); i++ )
729 mUseAliasesForExportedName->setTristate(
false );
730 const QString alias = mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportName ) )->data( Qt::UserRole ).toString();
731 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportName ) )->setText( alias );
735 case Qt::PartiallyChecked:
741 void QgsVectorLayerSaveAsDialog::mReplaceRawFieldValues_stateChanged(
int )
743 if ( mAttributeTable->isColumnHidden(
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) ) )
746 const QSignalBlocker signalBlockerAttributeTable( mAttributeTable );
747 const QSignalBlocker signalBlockerReplaceRawFieldValues( mReplaceRawFieldValues );
749 if ( mReplaceRawFieldValues->checkState() != Qt::PartiallyChecked )
751 for (
int i = 0; i < mAttributeTable->rowCount(); i++ )
753 if ( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::Name ) )->checkState() == Qt::Checked &&
754 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) ) &&
755 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->flags() & Qt::ItemIsEnabled )
757 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->setCheckState( mReplaceRawFieldValues->checkState() );
761 mReplaceRawFieldValues->setTristate(
false );
764 void QgsVectorLayerSaveAsDialog::mAttributeTable_itemChanged( QTableWidgetItem *item )
766 const QSignalBlocker signalBlockerAttributeTable( mAttributeTable );
767 const QSignalBlocker signalBlockerReplaceRawFieldValues( mReplaceRawFieldValues );
769 int row = item->row();
770 int column = item->column();
772 switch (
static_cast<ColumnIndex
>( column ) )
774 case ColumnIndex::Name:
776 if ( mAttributeTable->isColumnHidden(
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) ) ||
777 ! mAttributeTable->item( row,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) ) ||
778 !( mAttributeTable->item( row,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->flags() & Qt::ItemIsUserCheckable ) )
781 if ( mAttributeTable->item( row, column )->checkState() == Qt::Unchecked )
783 mAttributeTable->item( row,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->setCheckState( Qt::Unchecked );
784 mAttributeTable->item( row,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->setFlags( Qt::ItemIsUserCheckable );
785 bool checkBoxEnabled =
false;
786 for (
int i = 0; i < mAttributeTable->rowCount(); i++ )
788 if ( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) ) &&
789 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->flags() & Qt::ItemIsEnabled )
791 checkBoxEnabled =
true;
795 mReplaceRawFieldValues->setEnabled( checkBoxEnabled );
796 if ( !checkBoxEnabled )
797 mReplaceRawFieldValues->setCheckState( Qt::Unchecked );
799 else if ( mAttributeTable->item( row, column )->checkState() == Qt::Checked )
801 mAttributeTable->item( row,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->setFlags( Qt::ItemIsUserCheckable | Qt::ItemIsEnabled );
802 mReplaceRawFieldValues->setEnabled(
true );
806 case ColumnIndex::ExportName:
809 if ( item->text().isEmpty() )
811 QMessageBox::warning(
this,
812 tr(
"Empty export name" ),
813 tr(
"Empty export name are not allowed." ) );
819 while ( names.count( item->text() ) > 1 )
820 item->setText( QString(
"%1_2" ).arg( item->text() ) );
822 mUseAliasesForExportedName->setCheckState( Qt::PartiallyChecked );
825 case ColumnIndex::Type:
828 case ColumnIndex::ExportAsDisplayedValue:
830 if ( mAttributeTable->item( row, column )->flags() & Qt::ItemIsUserCheckable )
832 bool allChecked =
true;
833 bool allUnchecked =
true;
834 for (
int i = 0; i < mAttributeTable->rowCount(); i++ )
836 if ( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) ) &&
837 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->flags() & Qt::ItemIsEnabled )
839 if ( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->checkState() == Qt::Unchecked )
842 allUnchecked =
false;
845 mReplaceRawFieldValues->setCheckState( ( !allChecked && !allUnchecked ) ? Qt::PartiallyChecked : ( allChecked ) ? Qt::Checked : Qt::Unchecked );
855 mExtentGroupBox->setOutputCrs( mSelectedCrs );
860 return mFilename->filePath();
865 return leLayername->text();
870 return mEncodingComboBox->currentText();
875 return mFormatComboBox->currentData().toString();
880 return mSelectedCrs.
srsid();
896 QMap<QString, QgsVectorFileWriter::Option *>::ConstIterator it;
900 switch ( it.value()->type )
905 QSpinBox *sb = mDatasourceOptionsGroupBox->findChild<QSpinBox *>( it.key() );
907 options << QStringLiteral(
"%1=%2" ).arg( it.key() ).arg( sb->value() );
914 QComboBox *cb = mDatasourceOptionsGroupBox->findChild<QComboBox *>( it.key() );
915 if ( opt && cb && cb->itemData( cb->currentIndex() ) != opt->
defaultValue )
916 options << QStringLiteral(
"%1=%2" ).arg( it.key(), cb->currentText() );
923 QLineEdit *le = mDatasourceOptionsGroupBox->findChild<QLineEdit *>( it.key() );
925 options << QStringLiteral(
"%1=%2" ).arg( it.key(), le->text() );
933 options << QStringLiteral(
"%1=%2" ).arg( it.key(), opt->
mValue );
940 QString plainText = mOgrDatasourceOptions->toPlainText().trimmed();
941 if ( !plainText.isEmpty() )
942 options += plainText.split(
'\n' );
955 QMap<QString, QgsVectorFileWriter::Option *>::ConstIterator it;
959 switch ( it.value()->type )
964 QSpinBox *sb = mLayerOptionsGroupBox->findChild<QSpinBox *>( it.key() );
966 options << QStringLiteral(
"%1=%2" ).arg( it.key() ).arg( sb->value() );
973 QComboBox *cb = mLayerOptionsGroupBox->findChild<QComboBox *>( it.key() );
974 if ( opt && cb && cb->itemData( cb->currentIndex() ) != opt->
defaultValue )
975 options << QStringLiteral(
"%1=%2" ).arg( it.key(), cb->currentText() );
982 QLineEdit *le = mLayerOptionsGroupBox->findChild<QLineEdit *>( it.key() );
984 options << QStringLiteral(
"%1=%2" ).arg( it.key(), le->text() );
992 options << QStringLiteral(
"%1=%2" ).arg( it.key(), opt->
mValue );
999 QString plainText = mOgrLayerOptions->toPlainText().trimmed();
1000 if ( !plainText.isEmpty() )
1001 options += plainText.split(
'\n' );
1010 for (
int i = 0; i < mAttributeTable->rowCount(); i++ )
1012 if ( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::Name ) )->checkState() == Qt::Checked )
1014 attributes.append( i );
1025 for (
int i = 0; i < mAttributeTable->rowCount(); i++ )
1027 if ( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::Name ) )->checkState() == Qt::Checked &&
1028 ! mAttributeTable->isColumnHidden(
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) ) &&
1029 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->checkState() == Qt::Checked )
1031 attributes.append( i );
1040 QStringList exportNames;
1041 for (
int i = 0; i < mAttributeTable->rowCount(); i++ )
1042 exportNames.append( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportName ) )->text() );
1049 return mAddToCanvas->isChecked() && mAddToCanvas->isEnabled();
1054 mAddToCanvas->setChecked( enabled );
1059 return mSymbologyExportComboBox->currentData().toInt();
1064 return mScaleWidget->scale();
1069 mMapCanvas = canvas;
1070 mScaleWidget->setMapCanvas( canvas );
1071 mScaleWidget->setShowCurrentScaleButton(
true );
1077 return mExtentGroupBox->isChecked();
1082 return mExtentGroupBox->outputExtent();
1092 return mSelectedOnly->isChecked();
1097 return mCheckPersistMetadata->isChecked();
1102 int currentIndexData = mGeometryTypeComboBox->currentData().toInt();
1103 if ( currentIndexData == -1 )
1114 int currentIndexData = mGeometryTypeComboBox->currentData().toInt();
1115 return currentIndexData == -1;
1120 return mForceMultiCheckBox->isChecked();
1125 mForceMultiCheckBox->setChecked( checked );
1130 return mIncludeZCheckBox->isChecked();
1135 return mActionOnExistingFile;
1140 mIncludeZCheckBox->setChecked( checked );
1143 void QgsVectorLayerSaveAsDialog::mSymbologyExportComboBox_currentIndexChanged(
const QString &text )
1145 bool scaleEnabled =
true;
1146 if ( text == tr(
"No symbology" ) )
1148 scaleEnabled =
false;
1150 mScaleWidget->setEnabled( scaleEnabled );
1151 mScaleLabel->setEnabled( scaleEnabled );
1154 void QgsVectorLayerSaveAsDialog::mGeometryTypeComboBox_currentIndexChanged(
int index )
1156 int currentIndexData = mGeometryTypeComboBox->itemData( index ).toInt();
1160 mForceMultiCheckBox->setEnabled(
true );
1161 mIncludeZCheckBox->setEnabled(
true );
1165 mForceMultiCheckBox->setEnabled(
false );
1166 mForceMultiCheckBox->setChecked(
false );
1167 mIncludeZCheckBox->setEnabled(
false );
1168 mIncludeZCheckBox->setChecked(
false );
1172 void QgsVectorLayerSaveAsDialog::mSelectAllAttributes_clicked()
1174 const QSignalBlocker signalBlockerAttributeTable( mAttributeTable );
1175 const QSignalBlocker signalBlockerReplaceRawFieldValues( mReplaceRawFieldValues );
1177 for (
int i = 0; i < mAttributeTable->rowCount(); i++ )
1179 if ( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::Name ) )->flags() & Qt::ItemIsEnabled )
1181 if ( ! mAttributeTable->isColumnHidden(
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) ) &&
1182 ( mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->flags() & Qt::ItemIsUserCheckable ) )
1184 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->setFlags( Qt::ItemIsUserCheckable | Qt::ItemIsEnabled );
1186 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::Name ) )->setCheckState( Qt::Checked );
1189 if ( ! mAttributeTable->isColumnHidden(
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) ) )
1191 mReplaceRawFieldValues->setEnabled(
true );
1195 void QgsVectorLayerSaveAsDialog::mDeselectAllAttributes_clicked()
1197 const QSignalBlocker signalBlockerAttributeTable( mAttributeTable );
1198 const QSignalBlocker signalBlockerReplaceRawFieldValues( mReplaceRawFieldValues );
1200 for (
int i = 0; i < mAttributeTable->rowCount(); i++ )
1202 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::Name ) )->setCheckState( Qt::Unchecked );
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 );
1207 mAttributeTable->item( i,
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) )->setCheckState( Qt::Unchecked );
1210 if ( ! mAttributeTable->isColumnHidden(
static_cast<int>( ColumnIndex::ExportAsDisplayedValue ) ) )
1212 mReplaceRawFieldValues->setCheckState( Qt::Unchecked );
1213 mReplaceRawFieldValues->setEnabled(
false );
1217 void QgsVectorLayerSaveAsDialog::showHelp()
1219 QgsHelp::openHelp( QStringLiteral(
"managing_data_source/create_layers.html#creating-new-layers-from-an-existing-layer" ) );