29 #include <QPushButton> 32 #include <QFileDialog> 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 ) );
64 mOkButton = buttonBox->button( QDialogButtonBox::Ok );
65 mOkButton->setEnabled(
false );
67 mFileFormatComboBox->addItem( tr(
"ESRI Shapefile" ),
"ESRI Shapefile" );
71 mFileFormatComboBox->addItem( tr(
"Comma Separated Value" ),
"Comma Separated Value" );
72 mFileFormatComboBox->addItem( tr(
"GML" ),
"GML" );
73 mFileFormatComboBox->addItem( tr(
"Mapinfo File" ),
"Mapinfo File" );
75 if ( mFileFormatComboBox->count() == 1 )
77 mFileFormatComboBox->setVisible(
false );
78 mFileFormatLabel->setVisible(
false );
81 mFileFormatComboBox->setCurrentIndex( 0 );
86 QString enc =
QgsSettings().
value( QStringLiteral(
"/UI/encoding" ),
"System" ).toString();
90 int encindex = mFileEncoding->findText( enc );
93 mFileEncoding->insertItem( 0, enc );
96 mFileEncoding->setCurrentIndex( encindex );
98 mAttributeView->addTopLevelItem(
new QTreeWidgetItem( QStringList() << QStringLiteral(
"id" ) << QStringLiteral(
"Integer" ) << QStringLiteral(
"10" ) << QLatin1String(
"" ) ) );
99 connect( mNameEdit, &QLineEdit::textChanged,
this, &QgsNewVectorLayerDialog::nameChanged );
100 connect( mAttributeView, &QTreeWidget::itemSelectionChanged,
this, &QgsNewVectorLayerDialog::selectionChanged );
102 mAddAttributeButton->setEnabled(
false );
103 mRemoveAttributeButton->setEnabled(
false );
107 mFileName->setDialogTitle( tr(
"Save Layer As" ) );
108 mFileName->setDefaultRoot( settings.
value( QStringLiteral(
"UI/lastVectorFileFilterDir" ), QDir::homePath() ).toString() );
112 QFileInfo tmplFileInfo( mFileName->filePath() );
113 settings.
setValue( QStringLiteral(
"UI/lastVectorFileFilterDir" ), tmplFileInfo.absolutePath() );
124 void QgsNewVectorLayerDialog::mFileFormatComboBox_currentIndexChanged(
int index )
127 if ( mFileFormatComboBox->currentText() == tr(
"ESRI Shapefile" ) )
128 mNameEdit->setMaxLength( 10 );
130 mNameEdit->setMaxLength( 32767 );
133 void QgsNewVectorLayerDialog::mTypeBox_currentIndexChanged(
int index )
139 if ( mWidth->text().toInt() < 1 || mWidth->text().toInt() > 255 )
140 mWidth->setText( QStringLiteral(
"80" ) );
141 mPrecision->setEnabled(
false );
142 mWidth->setValidator(
new QIntValidator( 1, 255,
this ) );
146 if ( mWidth->text().toInt() < 1 || mWidth->text().toInt() > 10 )
147 mWidth->setText( QStringLiteral(
"10" ) );
148 mPrecision->setEnabled(
false );
149 mWidth->setValidator(
new QIntValidator( 1, 10,
this ) );
153 if ( mWidth->text().toInt() < 1 || mWidth->text().toInt() > 20 )
154 mWidth->setText( QStringLiteral(
"20" ) );
155 mPrecision->setEnabled(
true );
156 mWidth->setValidator(
new QIntValidator( 1, 20,
this ) );
169 ( mGeometryTypeBox->currentData( Qt::UserRole ).toInt() );
171 if ( mGeometryWithZCheckBox->isChecked() )
174 if ( mGeometryWithMCheckBox->isChecked() )
182 return mCrsSelector->crs();
187 mCrsSelector->setCrs( crs );
190 void QgsNewVectorLayerDialog::mAddAttributeButton_clicked()
192 QString myName = mNameEdit->text();
193 QString myWidth = mWidth->text();
194 QString myPrecision = mPrecision->isEnabled() ? mPrecision->text() : QLatin1String(
"" );
196 QString myType = mTypeBox->currentData( Qt::UserRole ).toString();
197 mAttributeView->addTopLevelItem(
new QTreeWidgetItem( QStringList() << myName << myType << myWidth << myPrecision ) );
202 void QgsNewVectorLayerDialog::mRemoveAttributeButton_clicked()
204 delete mAttributeView->currentItem();
210 QTreeWidgetItemIterator it( mAttributeView );
213 QTreeWidgetItem *item = *it;
214 QString type = QStringLiteral(
"%1;%2;%3" ).arg( item->text( 1 ), item->text( 2 ), item->text( 3 ) );
215 at.push_back( qMakePair( item->text( 0 ), type ) );
216 QgsDebugMsg( QString(
"appending %1//%2" ).arg( item->text( 0 ), type ) );
224 QString myType = mFileFormatComboBox->currentData( Qt::UserRole ).toString();
230 return mFileEncoding->currentText();
233 void QgsNewVectorLayerDialog::nameChanged(
const QString &name )
235 mAddAttributeButton->setDisabled( name.isEmpty() || !mAttributeView->findItems( name, Qt::MatchExactly ).isEmpty() );
238 void QgsNewVectorLayerDialog::selectionChanged()
240 mRemoveAttributeButton->setDisabled( mAttributeView->selectedItems().isEmpty() );
245 return mFileName->filePath();
248 void QgsNewVectorLayerDialog::checkOk()
250 bool ok = ( !mFileName->filePath().isEmpty() && mAttributeView->topLevelItemCount() > 0 );
251 mOkButton->setEnabled( ok );
259 if ( geomDialog.exec() == QDialog::Rejected )
261 return QLatin1String(
"" );
267 QgsDebugMsg( QString(
"New file format will be: %1" ).arg( fileformat ) );
273 QString fileName = geomDialog.
filename();
274 if ( fileformat == QLatin1String(
"ESRI Shapefile" ) && !fileName.endsWith( QLatin1String(
".shp" ), Qt::CaseInsensitive ) )
275 fileName += QLatin1String(
".shp" );
277 settings.
setValue( QStringLiteral(
"UI/lastVectorFileFilterDir" ), QFileInfo( fileName ).absolutePath() );
278 settings.
setValue( QStringLiteral(
"UI/encoding" ), enc );
282 QString ogrlib = pReg->
library( QStringLiteral(
"ogr" ) );
284 QLibrary *myLib =
new QLibrary( ogrlib );
285 bool loaded = myLib->load();
290 typedef bool ( *createEmptyDataSourceProc )(
const QString &,
const QString &,
const QString &,
QgsWkbTypes::Type,
292 createEmptyDataSourceProc createEmptyDataSource = ( createEmptyDataSourceProc )
cast_to_fptr( myLib->resolve(
"createEmptyDataSource" ) );
293 if ( createEmptyDataSource )
298 if ( !createEmptyDataSource( fileName, fileformat, enc, geometrytype, attributes, srs ) )
311 QgsDebugMsg(
"Resolving newEmptyDataSource(...) failed" );
322 void QgsNewVectorLayerDialog::showHelp()
324 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.
static Type addZ(Type type)
Adds the z dimension to a WKB type and returns the new type.
~QgsNewVectorLayerDialog() override
static QString runAndCreateLayer(QWidget *parent=nullptr, QString *enc=nullptr, const QgsCoordinateReferenceSystem &crs=QgsCoordinateReferenceSystem())
Runs the dialog and creates a layer matching the dialog parameters.
void setCrs(const QgsCoordinateReferenceSystem &crs)
Sets the crs value for the new layer in the dialog.
A registry / canonical manager of data providers.
QgsNewVectorLayerDialog(QWidget *parent=nullptr, Qt::WindowFlags fl=QgsGuiUtils::ModalDialogFlags)
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.
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.