28#include "qgsogrprovider.h"
40 : QDialog( parent, fl )
45 connect( mAddAttributeButton, &QToolButton::clicked,
this, &QgsNewVectorLayerDialog::mAddAttributeButton_clicked );
46 connect( mRemoveAttributeButton, &QToolButton::clicked,
this, &QgsNewVectorLayerDialog::mRemoveAttributeButton_clicked );
47 connect( mFileFormatComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsNewVectorLayerDialog::mFileFormatComboBox_currentIndexChanged );
48 connect( mTypeBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsNewVectorLayerDialog::mTypeBox_currentIndexChanged );
49 connect( buttonBox, &QDialogButtonBox::helpRequested,
this, &QgsNewVectorLayerDialog::showHelp );
59 mWidth->setValidator(
new QIntValidator( 1, 255,
this ) );
60 mPrecision->setValidator(
new QIntValidator( 0, 15,
this ) );
71 for (
const auto type : geomTypes )
73 mGeometryTypeBox->setCurrentIndex( -1 );
75 mOkButton = buttonBox->button( QDialogButtonBox::Ok );
76 mOkButton->setEnabled(
false );
78 mFileFormatComboBox->addItem( tr(
"ESRI Shapefile" ),
"ESRI Shapefile" );
82 mFileFormatComboBox->addItem( tr(
"Comma Separated Value" ),
"Comma Separated Value" );
83 mFileFormatComboBox->addItem( tr(
"GML" ),
"GML" );
84 mFileFormatComboBox->addItem( tr(
"Mapinfo File" ),
"Mapinfo File" );
86 if ( mFileFormatComboBox->count() == 1 )
88 mFileFormatComboBox->setVisible(
false );
89 mFileFormatLabel->setVisible(
false );
92 mCrsSelector->setShowAccuracyWarnings(
true );
94 mFileFormatComboBox->setCurrentIndex( 0 );
99 const QString enc =
QgsSettings().
value( QStringLiteral(
"/UI/encoding" ),
"System" ).toString();
103 int encindex = mFileEncoding->findText( enc );
106 mFileEncoding->insertItem( 0, enc );
109 mFileEncoding->setCurrentIndex( encindex );
111 mAttributeView->addTopLevelItem(
new QTreeWidgetItem( QStringList() << QStringLiteral(
"id" ) << QStringLiteral(
"Integer" ) << QStringLiteral(
"10" ) << QString() ) );
112 connect( mNameEdit, &QLineEdit::textChanged,
this, &QgsNewVectorLayerDialog::nameChanged );
113 connect( mAttributeView, &QTreeWidget::itemSelectionChanged,
this, &QgsNewVectorLayerDialog::selectionChanged );
114 connect( mGeometryTypeBox,
static_cast<void( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, [ = ](
int )
120 mAddAttributeButton->setEnabled(
false );
121 mRemoveAttributeButton->setEnabled(
false );
125 mFileName->setConfirmOverwrite(
false );
126 mFileName->setDialogTitle( tr(
"Save Layer As" ) );
128 mFileName->setDefaultRoot( settings.
value( QStringLiteral(
"UI/lastVectorFileFilterDir" ), QDir::homePath() ).toString() );
132 const QFileInfo tmplFileInfo( mFileName->filePath() );
133 settings.
setValue( QStringLiteral(
"UI/lastVectorFileFilterDir" ), tmplFileInfo.absolutePath() );
138void QgsNewVectorLayerDialog::mFileFormatComboBox_currentIndexChanged(
int index )
141 if ( mFileFormatComboBox->currentText() == tr(
"ESRI Shapefile" ) )
142 mNameEdit->setMaxLength( 10 );
144 mNameEdit->setMaxLength( 32767 );
147void QgsNewVectorLayerDialog::mTypeBox_currentIndexChanged(
int index )
153 if ( mWidth->text().toInt() < 1 || mWidth->text().toInt() > 255 )
154 mWidth->setText( QStringLiteral(
"80" ) );
155 mPrecision->setEnabled(
false );
156 mWidth->setValidator(
new QIntValidator( 1, 255,
this ) );
160 if ( mWidth->text().toInt() < 1 || mWidth->text().toInt() > 10 )
161 mWidth->setText( QStringLiteral(
"10" ) );
162 mPrecision->setEnabled(
false );
163 mWidth->setValidator(
new QIntValidator( 1, 10,
this ) );
167 if ( mWidth->text().toInt() < 1 || mWidth->text().toInt() > 20 )
168 mWidth->setText( QStringLiteral(
"20" ) );
169 if ( mPrecision->text().toInt() < 1 || mPrecision->text().toInt() > 15 )
170 mPrecision->setText( QStringLiteral(
"6" ) );
172 mPrecision->setEnabled(
true );
173 mWidth->setValidator(
new QIntValidator( 1, 20,
this ) );
177 QgsDebugMsg( QStringLiteral(
"unexpected index" ) );
186 ( mGeometryTypeBox->currentData( Qt::UserRole ).toInt() );
188 if ( mGeometryWithZRadioButton->isChecked() )
191 if ( mGeometryWithMRadioButton->isChecked() )
199 return mCrsSelector->crs();
204 mCrsSelector->setCrs(
crs );
207void QgsNewVectorLayerDialog::mAddAttributeButton_clicked()
209 const QString myName = mNameEdit->text();
210 const QString myWidth = mWidth->text();
211 const QString myPrecision = mPrecision->isEnabled() ? mPrecision->text() : QString();
213 const QString myType = mTypeBox->currentData( Qt::UserRole ).toString();
214 mAttributeView->addTopLevelItem(
new QTreeWidgetItem( QStringList() << myName << myType << myWidth << myPrecision ) );
219void QgsNewVectorLayerDialog::mRemoveAttributeButton_clicked()
221 delete mAttributeView->currentItem();
227 QTreeWidgetItemIterator it( mAttributeView );
230 QTreeWidgetItem *item = *it;
231 const QString type = QStringLiteral(
"%1;%2;%3" ).arg( item->text( 1 ), item->text( 2 ), item->text( 3 ) );
232 at.push_back( qMakePair( item->text( 0 ), type ) );
233 QgsDebugMsg( QStringLiteral(
"appending %1//%2" ).arg( item->text( 0 ), type ) );
241 QString myType = mFileFormatComboBox->currentData( Qt::UserRole ).toString();
247 return mFileEncoding->currentText();
250void QgsNewVectorLayerDialog::nameChanged(
const QString &name )
252 mAddAttributeButton->setDisabled( name.isEmpty() || !mAttributeView->findItems( name, Qt::MatchExactly ).isEmpty() );
255void QgsNewVectorLayerDialog::selectionChanged()
257 mRemoveAttributeButton->setDisabled( mAttributeView->selectedItems().isEmpty() );
262 return mFileName->filePath();
270void QgsNewVectorLayerDialog::checkOk()
272 const bool ok = ( !mFileName->filePath().isEmpty() && mAttributeView->topLevelItemCount() > 0 && mGeometryTypeBox->currentIndex() != -1 );
273 mOkButton->setEnabled( ok );
281 if ( res.isEmpty() && error.isEmpty() )
286void QgsNewVectorLayerDialog::updateExtension()
291 if ( fileformat == QLatin1String(
"ESRI Shapefile" ) )
295 fileName = fileName.replace( fileName.lastIndexOf( QLatin1String(
".dbf" ), -1, Qt::CaseInsensitive ), 4, QLatin1String(
".shp" ) );
300 fileName = fileName.replace( fileName.lastIndexOf( QLatin1String(
".shp" ), -1, Qt::CaseInsensitive ), 4, QLatin1String(
".dbf" ) );
312 if ( QFile::exists(
filename() ) && QMessageBox::warning(
this, tr(
"New ShapeFile Layer" ), tr(
"The layer already exists. Are you sure you want to overwrite the existing file?" ),
313 QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Cancel ) != QMessageBox::Yes )
321 errorMessage.clear();
324 if ( !initialPath.isEmpty() )
326 if ( geomDialog.exec() == QDialog::Rejected )
333 QString fileName = geomDialog.
filename();
336 QgsDebugMsg( QStringLiteral(
"New file format will be: %1" ).arg( fileformat ) );
342 settings.
setValue( QStringLiteral(
"UI/lastVectorFileFilterDir" ), QFileInfo( fileName ).absolutePath() );
343 settings.
setValue( QStringLiteral(
"UI/encoding" ), enc );
349 const bool success = QgsOgrProviderUtils::createEmptyDataSource( fileName, fileformat, enc, geometrytype,
attributes, srs, errorMessage );
357 errorMessage = QObject::tr(
"Geometry type not recognised" );
368void QgsNewVectorLayerDialog::showHelp()
370 QgsHelp::openHelp( QStringLiteral(
"managing_data_source/create_layers.html#creating-a-new-shapefile-layer" ) );
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
This class represents a coordinate reference system (CRS).
static QIcon iconForFieldType(QVariant::Type type, QVariant::Type subType=QVariant::Type::Invalid)
Returns an icon corresponding to a field type.
static QString ensureFileNameHasExtension(const QString &fileName, const QStringList &extensions)
Ensures that a fileName ends with an extension from the provided list of extensions.
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.
static Q_DECL_DEPRECATED QString runAndCreateLayer(QWidget *parent=nullptr, QString *enc=nullptr, const QgsCoordinateReferenceSystem &crs=QgsCoordinateReferenceSystem(), const QString &initialPath=QString())
Runs the dialog and creates a layer matching the dialog parameters.
void attributes(QList< QPair< QString, QString > > &at) const
Appends the chosen attribute names and types to at.
QgsCoordinateReferenceSystem crs() const
Returns the selected CRS for the new layer.
void setCrs(const QgsCoordinateReferenceSystem &crs)
Sets the crs value for the new layer in the dialog.
QString filename() const
Returns the name for the new layer.
QString selectedFileFormat() const
Returns the file format for storage.
QString selectedFileEncoding() const
Returns the file format for storage.
QgsNewVectorLayerDialog(QWidget *parent=nullptr, Qt::WindowFlags fl=QgsGuiUtils::ModalDialogFlags)
New dialog constructor.
QgsWkbTypes::Type selectedType() const
Returns the selected geometry type.
static QString execAndCreateLayer(QString &errorMessage, QWidget *parent=nullptr, const QString &initialPath=QString(), QString *encoding=nullptr, const QgsCoordinateReferenceSystem &crs=QgsCoordinateReferenceSystem())
Runs the dialog and creates a layer matching the dialog parameters.
void setFilename(const QString &filename)
Sets the initial file name to show in the dialog.
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 QString typeToDisplayString(QVariant::Type type, QVariant::Type subType=QVariant::Type::Invalid)
Returns a user-friendly translated string representing a QVariant type.
static QStringList availableEncodings()
Returns a list of available encodings.
static QString filterForDriver(const QString &driverName)
Creates a filter for an OGR driver key.
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.
static Type addZ(Type type) SIP_HOLDGIL
Adds the z dimension to a WKB type and returns the new type.
static Type addM(Type type) SIP_HOLDGIL
Adds the m dimension to a WKB type and returns the new type.
const QgsCoordinateReferenceSystem & crs