31#include "qgsogrproviderutils.h" 
   39  : QDialog( parent, fl )
 
   44  connect( mAddAttributeButton, &QToolButton::clicked, 
this, &QgsNewVectorLayerDialog::mAddAttributeButton_clicked );
 
   45  connect( mRemoveAttributeButton, &QToolButton::clicked, 
this, &QgsNewVectorLayerDialog::mRemoveAttributeButton_clicked );
 
   46  connect( mFileFormatComboBox, 
static_cast<void ( QComboBox::* )( 
int )
>( &QComboBox::currentIndexChanged ), 
this, &QgsNewVectorLayerDialog::mFileFormatComboBox_currentIndexChanged );
 
   47  connect( mTypeBox, 
static_cast<void ( QComboBox::* )( 
int )
>( &QComboBox::currentIndexChanged ), 
this, &QgsNewVectorLayerDialog::mTypeBox_currentIndexChanged );
 
   48  connect( buttonBox, &QDialogButtonBox::helpRequested, 
this, &QgsNewVectorLayerDialog::showHelp );
 
   58  mWidth->setValidator( 
new QIntValidator( 1, 255, 
this ) );
 
   59  mPrecision->setValidator( 
new QIntValidator( 0, 15, 
this ) );
 
   70  for ( 
const auto type : geomTypes )
 
   72  mGeometryTypeBox->setCurrentIndex( -1 );
 
   74  mOkButton = buttonBox->button( QDialogButtonBox::Ok );
 
   75  mOkButton->setEnabled( 
false );
 
   77  mFileFormatComboBox->addItem( tr( 
"ESRI Shapefile" ), 
"ESRI Shapefile" );
 
   81  mFileFormatComboBox->addItem( tr( 
"Comma Separated Value" ), 
"Comma Separated Value" );
 
   82  mFileFormatComboBox->addItem( tr( 
"GML" ), 
"GML" );
 
   83  mFileFormatComboBox->addItem( tr( 
"Mapinfo File" ), 
"Mapinfo File" );
 
   85  if ( mFileFormatComboBox->count() == 1 )
 
   87    mFileFormatComboBox->setVisible( 
false );
 
   88    mFileFormatLabel->setVisible( 
false );
 
   91  mCrsSelector->setShowAccuracyWarnings( 
true );
 
   93  mFileFormatComboBox->setCurrentIndex( 0 );
 
   98  const QString enc = 
QgsSettings().
value( QStringLiteral( 
"/UI/encoding" ), 
"System" ).toString();
 
  102  int encindex = mFileEncoding->findText( enc );
 
  105    mFileEncoding->insertItem( 0, enc );
 
  108  mFileEncoding->setCurrentIndex( encindex );
 
  110  mAttributeView->addTopLevelItem( 
new QTreeWidgetItem( QStringList() << QStringLiteral( 
"id" ) << QStringLiteral( 
"Integer" ) << QStringLiteral( 
"10" ) << QString() ) );
 
  111  connect( mNameEdit, &QLineEdit::textChanged, 
this, &QgsNewVectorLayerDialog::nameChanged );
 
  112  connect( mAttributeView, &QTreeWidget::itemSelectionChanged, 
this, &QgsNewVectorLayerDialog::selectionChanged );
 
  113  connect( mGeometryTypeBox, 
static_cast<void( QComboBox::* )( 
int )
>( &QComboBox::currentIndexChanged ), 
this, [ = ]( 
int )
 
  119  mAddAttributeButton->setEnabled( 
false );
 
  120  mRemoveAttributeButton->setEnabled( 
false );
 
  124  mFileName->setConfirmOverwrite( 
false );
 
  125  mFileName->setDialogTitle( tr( 
"Save Layer As" ) );
 
  127  mFileName->setDefaultRoot( settings.
value( QStringLiteral( 
"UI/lastVectorFileFilterDir" ), QDir::homePath() ).toString() );
 
  131    const QFileInfo tmplFileInfo( mFileName->filePath() );
 
  132    settings.
setValue( QStringLiteral( 
"UI/lastVectorFileFilterDir" ), tmplFileInfo.absolutePath() );
 
 
  137void QgsNewVectorLayerDialog::mFileFormatComboBox_currentIndexChanged( 
int index )
 
  140  if ( mFileFormatComboBox->currentText() == tr( 
"ESRI Shapefile" ) )
 
  141    mNameEdit->setMaxLength( 10 );
 
  143    mNameEdit->setMaxLength( 32767 );
 
  146void QgsNewVectorLayerDialog::mTypeBox_currentIndexChanged( 
int index )
 
  152      if ( mWidth->text().toInt() < 1 || mWidth->text().toInt() > 255 )
 
  153        mWidth->setText( QStringLiteral( 
"80" ) );
 
  154      mPrecision->setEnabled( 
false );
 
  155      mWidth->setValidator( 
new QIntValidator( 1, 255, 
this ) );
 
  159      if ( mWidth->text().toInt() < 1 || mWidth->text().toInt() > 10 )
 
  160        mWidth->setText( QStringLiteral( 
"10" ) );
 
  161      mPrecision->setEnabled( 
false );
 
  162      mWidth->setValidator( 
new QIntValidator( 1, 10, 
this ) );
 
  166      if ( mWidth->text().toInt() < 1 || mWidth->text().toInt() > 20 )
 
  167        mWidth->setText( QStringLiteral( 
"20" ) );
 
  168      if ( mPrecision->text().toInt() < 1 || mPrecision->text().toInt() > 15 )
 
  169        mPrecision->setText( QStringLiteral( 
"6" ) );
 
  171      mPrecision->setEnabled( 
true );
 
  172      mWidth->setValidator( 
new QIntValidator( 1, 20, 
this ) );
 
  185            ( mGeometryTypeBox->currentData( Qt::UserRole ).toInt() );
 
  187  if ( mGeometryWithZRadioButton->isChecked() )
 
  190  if ( mGeometryWithMRadioButton->isChecked() )
 
 
  198  return mCrsSelector->crs();
 
 
  203  mCrsSelector->setCrs( 
crs );
 
 
  206void QgsNewVectorLayerDialog::mAddAttributeButton_clicked()
 
  208  const QString myName = mNameEdit->text();
 
  209  const QString myWidth = mWidth->text();
 
  210  const QString myPrecision = mPrecision->isEnabled() ? mPrecision->text() : QString();
 
  212  const QString myType = mTypeBox->currentData( Qt::UserRole ).toString();
 
  213  mAttributeView->addTopLevelItem( 
new QTreeWidgetItem( QStringList() << myName << myType << myWidth << myPrecision ) );
 
  218void QgsNewVectorLayerDialog::mRemoveAttributeButton_clicked()
 
  220  delete mAttributeView->currentItem();
 
  226  QTreeWidgetItemIterator it( mAttributeView );
 
  229    QTreeWidgetItem *item = *it;
 
  230    const QString type = QStringLiteral( 
"%1;%2;%3" ).arg( item->text( 1 ), item->text( 2 ), item->text( 3 ) );
 
  231    at.push_back( qMakePair( item->text( 0 ), type ) );
 
  232    QgsDebugMsgLevel( QStringLiteral( 
"appending %1//%2" ).arg( item->text( 0 ), type ), 2 );
 
 
  240  QString myType = mFileFormatComboBox->currentData( Qt::UserRole ).toString();
 
 
  246  return mFileEncoding->currentText();
 
 
  249void QgsNewVectorLayerDialog::nameChanged( 
const QString &name )
 
  251  mAddAttributeButton->setDisabled( name.isEmpty() || !mAttributeView->findItems( name, Qt::MatchExactly ).isEmpty() );
 
  254void QgsNewVectorLayerDialog::selectionChanged()
 
  256  mRemoveAttributeButton->setDisabled( mAttributeView->selectedItems().isEmpty() );
 
  261  return mFileName->filePath();
 
 
  269void QgsNewVectorLayerDialog::checkOk()
 
  271  const bool ok = ( !mFileName->filePath().isEmpty() && mAttributeView->topLevelItemCount() > 0 && mGeometryTypeBox->currentIndex() != -1 );
 
  272  mOkButton->setEnabled( ok );
 
  280  if ( res.isEmpty() && error.isEmpty() )
 
 
  285void QgsNewVectorLayerDialog::updateExtension()
 
  290  if ( fileformat == QLatin1String( 
"ESRI Shapefile" ) )
 
  294      fileName = fileName.replace( fileName.lastIndexOf( QLatin1String( 
".dbf" ), -1, Qt::CaseInsensitive ), 4, QLatin1String( 
".shp" ) );
 
  299      fileName = fileName.replace( fileName.lastIndexOf( QLatin1String( 
".shp" ), -1, Qt::CaseInsensitive ), 4, QLatin1String( 
".dbf" ) );
 
  309  if ( !mNameEdit->text().trimmed().isEmpty() )
 
  311    const QString currentFieldName = mNameEdit->text();
 
  312    bool currentFound = 
false;
 
  313    QTreeWidgetItemIterator it( mAttributeView );
 
  316      QTreeWidgetItem *item = *it;
 
  317      if ( item->text( 0 ) == currentFieldName )
 
  327      if ( QMessageBox::question( 
this, windowTitle(),
 
  328                                  tr( 
"The field “%1” has not been added to the fields list. Are you sure you want to proceed and discard this field?" ).arg( currentFieldName ),
 
  329                                  QMessageBox::Ok | QMessageBox::Cancel ) != QMessageBox::Ok )
 
  338  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?" ),
 
  339       QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Cancel ) != QMessageBox::Yes )
 
 
  347  errorMessage.clear();
 
  350  if ( !initialPath.isEmpty() )
 
  352  if ( geomDialog.exec() == QDialog::Rejected )
 
  359  QString fileName = geomDialog.
filename();
 
  362  QgsDebugMsgLevel( QStringLiteral( 
"New file format will be: %1" ).arg( fileformat ), 2 );
 
  368  settings.
setValue( QStringLiteral( 
"UI/lastVectorFileFilterDir" ), QFileInfo( fileName ).absolutePath() );
 
  369  settings.
setValue( QStringLiteral( 
"UI/encoding" ), enc );
 
  375    const bool success = QgsOgrProviderUtils::createEmptyDataSource( fileName, fileformat, enc, geometrytype, 
attributes, srs, errorMessage );
 
  383    errorMessage = QObject::tr( 
"Geometry type not recognised" );
 
 
  394void QgsNewVectorLayerDialog::showHelp()
 
  396  QgsHelp::openHelp( QStringLiteral( 
"managing_data_source/create_layers.html#creating-a-new-shapefile-layer" ) );
 
WkbType
The WKB type describes the number of dimensions a geometry has.
 
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(QMetaType::Type type, QMetaType::Type subType=QMetaType::Type::UnknownType, const QString &typeString=QString())
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(Qgis::WkbType 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.
 
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.
 
Qgis::WkbType selectedType() const
Returns the selected geometry type.
 
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(QMetaType::Type type, QMetaType::Type subType=QMetaType::Type::UnknownType)
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(Qgis::WkbType type)
Returns a translated display string type for a WKB type, e.g., the geometry name used in WKT geometry...
 
static Qgis::WkbType addM(Qgis::WkbType type)
Adds the m dimension to a WKB type and returns the new type.
 
static Qgis::WkbType addZ(Qgis::WkbType type)
Adds the z dimension to a WKB type and returns the new type.
 
#define QgsDebugMsgLevel(str, level)
 
#define QgsDebugError(str)
 
const QgsCoordinateReferenceSystem & crs