27 #include "qgssettings.h"
32 #include <QPushButton>
35 #include <QFileDialog>
40 dialog.
setCrs( defaultCrs );
41 if ( dialog.exec() == QDialog::Rejected )
48 QString name = dialog.
layerName().isEmpty() ? tr(
"New scratch layer" ) : dialog.
layerName();
54 : QDialog( parent, fl )
59 mNameLineEdit->setText( tr(
"New scratch layer" ) );
76 for (
const auto type : geomTypes )
78 mGeometryTypeBox->setCurrentIndex( -1 );
80 mGeometryWithZCheckBox->setEnabled(
false );
81 mGeometryWithMCheckBox->setEnabled(
false );
82 mCrsSelector->setEnabled(
false );
83 mCrsSelector->setShowAccuracyWarnings(
true );
93 mTypeBox_currentIndexChanged( 1 );
95 mWidth->setValidator(
new QIntValidator( 1, 255,
this ) );
96 mPrecision->setValidator(
new QIntValidator( 0, 30,
this ) );
98 mAddAttributeButton->setEnabled(
false );
99 mRemoveAttributeButton->setEnabled(
false );
101 mOkButton = mButtonBox->button( QDialogButtonBox::Ok );
102 mOkButton->setEnabled(
false );
104 connect( mGeometryTypeBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsNewMemoryLayerDialog::geometryTypeChanged );
105 connect( mFieldNameEdit, &QLineEdit::textChanged,
this, &QgsNewMemoryLayerDialog::fieldNameChanged );
106 connect( mTypeBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsNewMemoryLayerDialog::mTypeBox_currentIndexChanged );
107 connect( mAttributeView, &QTreeWidget::itemSelectionChanged,
this, &QgsNewMemoryLayerDialog::selectionChanged );
108 connect( mAddAttributeButton, &QToolButton::clicked,
this, &QgsNewMemoryLayerDialog::mAddAttributeButton_clicked );
109 connect( mRemoveAttributeButton, &QToolButton::clicked,
this, &QgsNewMemoryLayerDialog::mRemoveAttributeButton_clicked );
110 connect( mButtonBox, &QDialogButtonBox::helpRequested,
this, &QgsNewMemoryLayerDialog::showHelp );
117 ( mGeometryTypeBox->currentData( Qt::UserRole ).toInt() );
121 if ( mGeometryWithZCheckBox->isChecked() )
123 if ( mGeometryWithMCheckBox->isChecked() )
130 void QgsNewMemoryLayerDialog::geometryTypeChanged(
int )
133 ( mGeometryTypeBox->currentData( Qt::UserRole ).toInt() );
136 mGeometryWithZCheckBox->setEnabled( isSpatial );
137 mGeometryWithMCheckBox->setEnabled( isSpatial );
138 mCrsSelector->setEnabled( isSpatial );
140 bool ok = ( !mNameLineEdit->text().isEmpty() && mGeometryTypeBox->currentIndex() != -1 );
141 mOkButton->setEnabled( ok );
144 void QgsNewMemoryLayerDialog::mTypeBox_currentIndexChanged(
int index )
149 if ( mWidth->text().toInt() < 1 || mWidth->text().toInt() > 255 )
150 mWidth->setText( QStringLiteral(
"255" ) );
152 mPrecision->setEnabled(
false );
153 mWidth->setValidator(
new QIntValidator( 1, 255,
this ) );
156 if ( mWidth->text().toInt() < 1 || mWidth->text().toInt() > 10 )
157 mWidth->setText( QStringLiteral(
"10" ) );
159 mPrecision->setEnabled(
false );
160 mWidth->setValidator(
new QIntValidator( 1, 10,
this ) );
163 if ( mWidth->text().toInt() < 1 || mWidth->text().toInt() > 30 )
164 mWidth->setText( QStringLiteral(
"30" ) );
165 if ( mPrecision->text().toInt() < 1 || mPrecision->text().toInt() > 30 )
166 mPrecision->setText( QStringLiteral(
"6" ) );
167 mPrecision->setEnabled(
true );
168 mWidth->setValidator(
new QIntValidator( 1, 20,
this ) );
172 mWidth->setEnabled(
false );
174 mPrecision->setEnabled(
false );
178 mWidth->setEnabled(
false );
180 mPrecision->setEnabled(
false );
184 mWidth->setEnabled(
false );
186 mPrecision->setEnabled(
false );
190 mWidth->setEnabled(
false );
192 mPrecision->setEnabled(
false );
196 mWidth->setEnabled(
false );
198 mPrecision->setEnabled(
false );
202 QgsDebugMsg( QStringLiteral(
"unexpected index" ) );
209 mCrsSelector->setCrs(
crs );
214 return mCrsSelector->crs();
219 return mNameLineEdit->text();
222 void QgsNewMemoryLayerDialog::fieldNameChanged(
const QString &name )
224 mAddAttributeButton->setDisabled( name.isEmpty() || ! mAttributeView->findItems( name, Qt::MatchExactly ).isEmpty() );
227 void QgsNewMemoryLayerDialog::selectionChanged()
229 mRemoveAttributeButton->setDisabled( mAttributeView->selectedItems().isEmpty() );
236 QTreeWidgetItemIterator it( mAttributeView );
239 QString name( ( *it )->text( 0 ) );
240 QString
typeName( ( *it )->text( 1 ) );
241 int width = ( *it )->text( 2 ).toInt();
242 int precision = ( *it )->text( 3 ).toInt();
243 QVariant::Type fieldType = QVariant::Invalid;
244 if (
typeName == QLatin1String(
"string" ) )
245 fieldType = QVariant::String;
246 else if (
typeName == QLatin1String(
"integer" ) )
247 fieldType = QVariant::Int;
248 else if (
typeName == QLatin1String(
"double" ) )
249 fieldType = QVariant::Double;
250 else if (
typeName == QLatin1String(
"bool" ) )
251 fieldType = QVariant::Bool;
252 else if (
typeName == QLatin1String(
"date" ) )
253 fieldType = QVariant::Date;
254 else if (
typeName == QLatin1String(
"time" ) )
255 fieldType = QVariant::Time;
256 else if (
typeName == QLatin1String(
"datetime" ) )
257 fieldType = QVariant::DateTime;
267 void QgsNewMemoryLayerDialog::mAddAttributeButton_clicked()
269 if ( !mFieldNameEdit->text().isEmpty() )
271 QString fieldName = mFieldNameEdit->text();
272 QString fieldType = mTypeBox->currentData( Qt::UserRole ).toString();
273 QString width = mWidth->text();
275 mAttributeView->addTopLevelItem(
new QTreeWidgetItem( QStringList() << fieldName << fieldType << width <<
precision ) );
277 mFieldNameEdit->clear();
281 void QgsNewMemoryLayerDialog::mRemoveAttributeButton_clicked()
283 delete mAttributeView->currentItem();
286 void QgsNewMemoryLayerDialog::showHelp()
288 QgsHelp::openHelp( QStringLiteral(
"managing_data_source/create_layers.html#creating-a-new-temporary-scratch-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).
Encapsulate a field in an attribute table or data source.
Container of fields for a vector layer.
bool append(const QgsField &field, FieldOrigin origin=OriginProvider, int originIndex=-1)
Appends a field. The field must have unique name, otherwise it is rejected (returns false)
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 QgsVectorLayer * createMemoryLayer(const QString &name, const QgsFields &fields, QgsWkbTypes::Type geometryType=QgsWkbTypes::NoGeometry, const QgsCoordinateReferenceSystem &crs=QgsCoordinateReferenceSystem()) SIP_FACTORY
Creates a new memory layer using the specified parameters.
QgsWkbTypes::Type selectedType() const
Returns the selected geometry type.
QgsCoordinateReferenceSystem crs() const
Returns the selected CRS for the new layer.
QgsFields fields() const
Returns attributes for the new layer.
QString layerName() const
Returns the layer name.
void setCrs(const QgsCoordinateReferenceSystem &crs)
Sets the crs value for the new layer in the dialog.
static QgsVectorLayer * runAndCreateLayer(QWidget *parent=nullptr, const QgsCoordinateReferenceSystem &defaultCrs=QgsCoordinateReferenceSystem())
Runs the dialog and creates a new memory layer.
QgsNewMemoryLayerDialog(QWidget *parent=nullptr, Qt::WindowFlags fl=QgsGuiUtils::ModalDialogFlags)
New dialog constructor.
Represents a vector layer which manages a vector based data sets.
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