29 #include <QPushButton> 32 #include <QFileDialog> 33 #include <QMessageBox> 36 : QDialog( parent, fl )
40 connect( mAddAttributeButton, &QToolButton::clicked,
this, &QgsNewVectorLayerDialog::mAddAttributeButton_clicked );
41 connect( mRemoveAttributeButton, &QToolButton::clicked,
this, &QgsNewVectorLayerDialog::mRemoveAttributeButton_clicked );
42 connect( mFileFormatComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsNewVectorLayerDialog::mFileFormatComboBox_currentIndexChanged );
43 connect( mTypeBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsNewVectorLayerDialog::mTypeBox_currentIndexChanged );
44 connect( buttonBox, &QDialogButtonBox::helpRequested,
this, &QgsNewVectorLayerDialog::showHelp );
47 restoreGeometry( settings.
value( QStringLiteral(
"Windows/NewVectorLayer/geometry" ) ).toByteArray() );
57 mWidth->setValidator(
new QIntValidator( 1, 255,
this ) );
58 mPrecision->setValidator(
new QIntValidator( 0, 15,
this ) );
65 mOkButton = buttonBox->button( QDialogButtonBox::Ok );
66 mOkButton->setEnabled(
false );
68 mFileFormatComboBox->addItem( tr(
"ESRI Shapefile" ),
"ESRI Shapefile" );
72 mFileFormatComboBox->addItem( tr(
"Comma Separated Value" ),
"Comma Separated Value" );
73 mFileFormatComboBox->addItem( tr(
"GML" ),
"GML" );
74 mFileFormatComboBox->addItem( tr(
"Mapinfo File" ),
"Mapinfo File" );
76 if ( mFileFormatComboBox->count() == 1 )
78 mFileFormatComboBox->setVisible(
false );
79 mFileFormatLabel->setVisible(
false );
82 mFileFormatComboBox->setCurrentIndex( 0 );
87 QString enc =
QgsSettings().
value( QStringLiteral(
"/UI/encoding" ),
"System" ).toString();
91 int encindex = mFileEncoding->findText( enc );
94 mFileEncoding->insertItem( 0, enc );
97 mFileEncoding->setCurrentIndex( encindex );
99 mAttributeView->addTopLevelItem(
new QTreeWidgetItem( QStringList() << QStringLiteral(
"id" ) << QStringLiteral(
"Integer" ) << QStringLiteral(
"10" ) << QString() ) );
100 connect( mNameEdit, &QLineEdit::textChanged,
this, &QgsNewVectorLayerDialog::nameChanged );
101 connect( mAttributeView, &QTreeWidget::itemSelectionChanged,
this, &QgsNewVectorLayerDialog::selectionChanged );
103 mAddAttributeButton->setEnabled(
false );
104 mRemoveAttributeButton->setEnabled(
false );
108 mFileName->setConfirmOverwrite(
false );
109 mFileName->setDialogTitle( tr(
"Save Layer As" ) );
110 mFileName->setDefaultRoot( settings.
value( QStringLiteral(
"UI/lastVectorFileFilterDir" ), QDir::homePath() ).toString() );
114 QFileInfo tmplFileInfo( mFileName->filePath() );
115 settings.
setValue( QStringLiteral(
"UI/lastVectorFileFilterDir" ), tmplFileInfo.absolutePath() );
126 void QgsNewVectorLayerDialog::mFileFormatComboBox_currentIndexChanged(
int index )
129 if ( mFileFormatComboBox->currentText() == tr(
"ESRI Shapefile" ) )
130 mNameEdit->setMaxLength( 10 );
132 mNameEdit->setMaxLength( 32767 );
135 void QgsNewVectorLayerDialog::mTypeBox_currentIndexChanged(
int index )
141 if ( mWidth->text().toInt() < 1 || mWidth->text().toInt() > 255 )
142 mWidth->setText( QStringLiteral(
"80" ) );
143 mPrecision->setEnabled(
false );
144 mWidth->setValidator(
new QIntValidator( 1, 255,
this ) );
148 if ( mWidth->text().toInt() < 1 || mWidth->text().toInt() > 10 )
149 mWidth->setText( QStringLiteral(
"10" ) );
150 mPrecision->setEnabled(
false );
151 mWidth->setValidator(
new QIntValidator( 1, 10,
this ) );
155 if ( mWidth->text().toInt() < 1 || mWidth->text().toInt() > 20 )
156 mWidth->setText( QStringLiteral(
"20" ) );
157 mPrecision->setEnabled(
true );
158 mWidth->setValidator(
new QIntValidator( 1, 20,
this ) );
162 QgsDebugMsg( QStringLiteral(
"unexpected index" ) );
171 ( mGeometryTypeBox->currentData( Qt::UserRole ).toInt() );
173 if ( mGeometryWithZRadioButton->isChecked() )
176 if ( mGeometryWithMRadioButton->isChecked() )
184 return mCrsSelector->crs();
189 mCrsSelector->setCrs( crs );
192 void QgsNewVectorLayerDialog::mAddAttributeButton_clicked()
194 QString myName = mNameEdit->text();
195 QString myWidth = mWidth->text();
196 QString myPrecision = mPrecision->isEnabled() ? mPrecision->text() : QString();
198 QString myType = mTypeBox->currentData( Qt::UserRole ).toString();
199 mAttributeView->addTopLevelItem(
new QTreeWidgetItem( QStringList() << myName << myType << myWidth << myPrecision ) );
204 void QgsNewVectorLayerDialog::mRemoveAttributeButton_clicked()
206 delete mAttributeView->currentItem();
212 QTreeWidgetItemIterator it( mAttributeView );
215 QTreeWidgetItem *item = *it;
216 QString type = QStringLiteral(
"%1;%2;%3" ).arg( item->text( 1 ), item->text( 2 ), item->text( 3 ) );
217 at.push_back( qMakePair( item->text( 0 ), type ) );
218 QgsDebugMsg( QStringLiteral(
"appending %1//%2" ).arg( item->text( 0 ), type ) );
226 QString myType = mFileFormatComboBox->currentData( Qt::UserRole ).toString();
232 return mFileEncoding->currentText();
235 void QgsNewVectorLayerDialog::nameChanged(
const QString &name )
237 mAddAttributeButton->setDisabled( name.isEmpty() || !mAttributeView->findItems( name, Qt::MatchExactly ).isEmpty() );
240 void QgsNewVectorLayerDialog::selectionChanged()
242 mRemoveAttributeButton->setDisabled( mAttributeView->selectedItems().isEmpty() );
247 return mFileName->filePath();
252 mFileName->setFilePath( filename );
255 void QgsNewVectorLayerDialog::checkOk()
257 bool ok = ( !mFileName->filePath().isEmpty() && mAttributeView->topLevelItemCount() > 0 );
258 mOkButton->setEnabled( ok );
266 if ( res.isEmpty() && error.isEmpty() )
273 errorMessage.clear();
276 if ( !initialPath.isEmpty() )
278 if ( geomDialog.exec() == QDialog::Rejected )
283 if ( QFile::exists( geomDialog.
filename() ) && QMessageBox::warning( parent, tr(
"New ShapeFile Layer" ), tr(
"The layer already exists. Are you sure you want to overwrite the existing file?" ),
284 QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Cancel ) != QMessageBox::Yes )
290 QgsDebugMsg( QStringLiteral(
"New file format will be: %1" ).arg( fileformat ) );
296 QString fileName = geomDialog.
filename();
297 if ( fileformat == QLatin1String(
"ESRI Shapefile" ) && !fileName.endsWith( QLatin1String(
".shp" ), Qt::CaseInsensitive ) )
298 fileName += QLatin1String(
".shp" );
300 settings.
setValue( QStringLiteral(
"UI/lastVectorFileFilterDir" ), QFileInfo( fileName ).absolutePath() );
301 settings.
setValue( QStringLiteral(
"UI/encoding" ), enc );
305 QString ogrlib = pReg->
library( QStringLiteral(
"ogr" ) );
307 QLibrary *myLib =
new QLibrary( ogrlib );
308 bool loaded = myLib->load();
311 QgsDebugMsg( QStringLiteral(
"ogr provider loaded" ) );
313 typedef bool ( *createEmptyDataSourceProc )(
const QString &,
const QString &,
const QString &,
QgsWkbTypes::Type,
315 createEmptyDataSourceProc createEmptyDataSource = ( createEmptyDataSourceProc )
cast_to_fptr( myLib->resolve(
"createEmptyDataSource" ) );
316 if ( createEmptyDataSource )
320 QgsCoordinateReferenceSystem srs = geomDialog.
crs();
321 if ( !createEmptyDataSource( fileName, fileformat, enc, geometrytype, attributes, srs, errorMessage ) )
328 errorMessage = QObject::tr(
"Geometry type not recognised" );
335 errorMessage = QObject::tr(
"Resolving newEmptyDataSource(...) failed" );
347 void QgsNewVectorLayerDialog::showHelp()
349 QgsHelp::openHelp( QStringLiteral(
"managing_data_source/create_layers.html#creating-a-new-shapefile-layer" ) );
QString selectedFileEncoding() const
Returns the file format for storage.
QString selectedFileFormat() const
Returns the file format for storage.
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.
QString library(const QString &providerKey) const
Returns path for the library of the provider.
static QIcon getThemeIcon(const QString &name)
Helper to get a theme icon.
void attributes(QList< QPair< QString, QString > > &at) const
Appends the chosen attribute names and types to at.
void saveGeometry(QWidget *widget, const QString &keyName)
Save the wigget geometry into settings.
bool restoreGeometry(QWidget *widget, const QString &keyName)
Restore the wigget geometry from settings.
Type
The WKB type describes the number of dimensions a geometry has.
static QgsProviderRegistry * instance(const QString &pluginPath=QString())
Means of accessing canonical single instance.
static Type addM(Type type)
Adds the m dimension to a WKB type and returns the new type.
QString filename() const
Returns the name for the new layer.
void setFilename(const QString &filename)
Sets the initial file name to show in the dialog.
static Type addZ(Type type)
Adds the z dimension to a WKB type and returns the new type.
~QgsNewVectorLayerDialog() override
void setCrs(const QgsCoordinateReferenceSystem &crs)
Sets the crs value for the new layer in the dialog.
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.
A registry / canonical manager of data providers.
QgsNewVectorLayerDialog(QWidget *parent=nullptr, Qt::WindowFlags fl=QgsGuiUtils::ModalDialogFlags)
New dialog constructor.
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.
QgsCoordinateReferenceSystem crs() const
Returns the selected CRS for the new layer.
This class represents a coordinate reference system (CRS).
static void openHelp(const QString &key)
Opens help topic for the given help key using default system web browser.
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.
QgsWkbTypes::Type selectedType() const
Returns the selected geometry type.
static QString filterForDriver(const QString &driverName)
Creates a filter for an OGR driver key.
static QStringList availableEncodings()
Returns a list of available encodings.