23#include <QDialogButtonBox>
27#include "moc_qgsfielddomainwidget.cpp"
29using namespace Qt::StringLiterals;
52 mMinSpinBox->setMinimum( std::numeric_limits<double>::lowest() );
53 mMinSpinBox->setMaximum( std::numeric_limits<double>::max() );
54 mMinSpinBox->setValue( 0 );
55 mMinSpinBox->setDecimals( 6 );
57 mMaxSpinBox->setMinimum( std::numeric_limits<double>::lowest() );
58 mMaxSpinBox->setMaximum( std::numeric_limits<double>::max() );
60 mMaxSpinBox->setValue( 100 );
61 mMaxSpinBox->setDecimals( 6 );
63 mMinInclusiveCheckBox->setChecked(
true );
64 mMaxInclusiveCheckBox->setChecked(
true );
79 mMinSpinBox->setValue( rangeDomain->
minimum().toDouble() );
80 mMaxSpinBox->setValue( rangeDomain->
maximum().toDouble() );
88 mNameEdit->setEnabled( editable );
93 mComboSplitPolicy->setEnabled( editable );
94 mComboMergePolicy->setEnabled( editable );
99 return new QgsRangeFieldDomain( name, description, fieldType, mMinSpinBox->value(), mMinInclusiveCheckBox->isChecked(), mMaxSpinBox->value(), mMaxInclusiveCheckBox->isChecked() );
104 return mMinSpinBox->value() <= mMaxSpinBox->value();
125 mEditGlob->setText( globDomain->
glob() );
130 mWidget->setNameEditable( editable );
135 mWidget->setPoliciesEditable( editable );
145 return !mEditGlob->text().trimmed().isEmpty();
158 mValuesTable->setModel( mModel );
160 connect( mButtonAddRow, &QToolButton::clicked,
this, [
this] { mModel->insertRow( mModel->rowCount() ); } );
161 connect( mButtonRemoveRow, &QToolButton::clicked,
this, [
this] {
162 QItemSelectionModel *selectionModel = mValuesTable->selectionModel();
163 const QModelIndexList selectedRows = selectionModel->selectedIndexes();
164 if ( !selectedRows.empty() )
166 mModel->removeRow( selectedRows.first().row() );
200 : QAbstractTableModel( parent )
205 return mValues.count();
215 if ( index.row() < 0 || index.row() >= mValues.count() || index.column() < 0 || index.column() >= 2 )
221 case Qt::DisplayRole:
223 case Qt::ToolTipRole:
225 switch ( index.column() )
230 return value.
value();
243 if ( index.row() < 0 || index.row() >= mValues.count() || index.column() < 0 || index.column() >= 2 )
251 switch ( index.column() )
256 mValues.replace( index.row(), newValue );
257 emit dataChanged( index, index );
264 mValues.replace( index.row(), newValue );
265 emit dataChanged( index, index );
280 if ( index.row() < 0 || index.row() >= mValues.size() || index.column() < 0 || index.column() >=
columnCount() )
281 return QAbstractTableModel::flags( index );
283 return Qt::ItemFlag::ItemIsEnabled | Qt::ItemFlag::ItemIsSelectable | Qt::ItemFlag::ItemIsEditable;
288 switch ( orientation )
293 case Qt::DisplayRole:
294 case Qt::ToolTipRole:
301 return tr(
"Value" );
320 if ( parent.isValid() )
323 beginInsertRows( QModelIndex(), row, row + count - 1 );
324 for (
int i = row; i < row + count; ++i )
334 if ( row < 0 || row >= mValues.count() )
337 if ( parent.isValid() )
340 for (
int i = row + count - 1; i >= row; --i )
342 beginRemoveRows( parent, i, i );
343 mValues.removeAt( i );
388 mFieldTypeCombo->setCurrentIndex( mFieldTypeCombo->findData(
static_cast<int>( QMetaType::Type::QString ) ) );
393 mFieldTypeCombo->setCurrentIndex( mFieldTypeCombo->findData(
static_cast<int>( QMetaType::Type::Double ) ) );
398 mFieldTypeCombo->setCurrentIndex( mFieldTypeCombo->findData(
static_cast<int>( QMetaType::Type::QString ) ) );
402 mStackedWidget->addWidget( mDomainWidget );
403 mStackedWidget->setCurrentWidget( mDomainWidget );
415 mNameEdit->setText( domain->
name() );
416 mDescriptionEdit->setText( domain->
description() );
417 mComboMergePolicy->setCurrentIndex( mComboMergePolicy->findData(
static_cast<int>( domain->
mergePolicy() ) ) );
418 mComboSplitPolicy->setCurrentIndex( mComboSplitPolicy->findData(
static_cast<int>( domain->
splitPolicy() ) ) );
419 mFieldTypeCombo->setCurrentIndex( mFieldTypeCombo->findData(
static_cast<int>( domain->
fieldType() ) ) );
422 mDomainWidget->setFieldDomain( domain );
427 if ( !mDomainWidget )
430 std::unique_ptr<QgsFieldDomain> res( mDomainWidget->createFieldDomain( mNameEdit->text(), mDescriptionEdit->text(),
static_cast<QMetaType::Type
>( mFieldTypeCombo->currentData().toInt() ) ) );
434 return res.release();
439 if ( mNameEdit->text().trimmed().isEmpty() )
442 return mDomainWidget && mDomainWidget->isValid();
450 : QDialog( parent, flags )
452 setObjectName( u
"QgsFieldDomainDialog"_s );
454 QVBoxLayout *vLayout =
new QVBoxLayout();
456 vLayout->addWidget( mWidget, 1 );
458 mButtonBox =
new QDialogButtonBox( QDialogButtonBox::StandardButton::Cancel | QDialogButtonBox::StandardButton::Help | QDialogButtonBox::StandardButton::Ok );
459 connect( mButtonBox, &QDialogButtonBox::accepted,
this, &QDialog::accept );
460 connect( mButtonBox, &QDialogButtonBox::rejected,
this, &QDialog::reject );
461 connect( mButtonBox, &QDialogButtonBox::helpRequested,
this, [] {
QgsHelp::openHelp( u
"managing_data_source/supported_data.rst#field-domain"_s ); } );
462 vLayout->addWidget( mButtonBox );
464 setLayout( vLayout );
466 validityChanged( mWidget->isValid() );
473 mWidget->setFieldDomain( domain );
478 return mWidget->createFieldDomain();
483 if ( !mWidget->isValid() )
489void QgsFieldDomainDialog::validityChanged(
bool isValid )
491 mButtonBox->button( QDialogButtonBox::Ok )->setEnabled( isValid );
FieldDomainMergePolicy
Merge policy for field domains.
@ GeometryWeighted
New values are computed as the weighted average of the source values.
@ DefaultValue
Use default field value.
FieldDomainSplitPolicy
Split policy for field domains.
@ GeometryRatio
New values are computed by the ratio of their area/length compared to the area/length of the original...
@ DefaultValue
Use default field value.
@ Duplicate
Duplicate original value.
FieldDomainType
Types of field domain.
@ Coded
Coded field domain.
@ Range
Numeric range field domain (min/max).
@ Glob
Glob string pattern field domain.
void changed()
Emitted whenever the field domain configuration in the widget changes.
~QgsAbstractFieldDomainWidget() override
QgsAbstractFieldDomainWidget(QWidget *parent=nullptr)
Constructor for QgsAbstractFieldDomainWidget, with the specified parent widget.
A widget for configuration of the extended properties of a QgsCodedFieldDomain.
QgsFieldDomain * createFieldDomain(const QString &name, const QString &description, QMetaType::Type fieldType) const override
Creates a new field domain using the properties from the widget.
void setFieldDomain(const QgsFieldDomain *domain) override
Sets the current field domain to show properties for in the widget.
QgsCodedFieldDomainWidget(QWidget *parent=nullptr)
Constructor for QgsCodedFieldDomainWidget, with the specified parent widget.
bool isValid() const override
Returns true if the widget currently represents a valid field domain configuration.
Definition of a coded / enumerated field domain.
void setValues(const QList< QgsCodedValue > &values)
Sets the enumeration as QgsCodedValue values.
QList< QgsCodedValue > values() const
Returns the enumeration as QgsCodedValue values.
A table model for representing the values in a QgsCodedValue list.
bool insertRows(int row, int count, const QModelIndex &parent=QModelIndex()) override
QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const override
int rowCount(const QModelIndex &parent=QModelIndex()) const override
QgsCodedValueTableModel(QObject *parent)
Constructor for QgsCodedValueTableModel, with the specified parent object.
int columnCount(const QModelIndex &parent=QModelIndex()) const override
bool removeRows(int row, int count, const QModelIndex &parent=QModelIndex()) override
Qt::ItemFlags flags(const QModelIndex &index) const override
void setValues(const QList< QgsCodedValue > &values)
Sets the values to show in the model.
QList< QgsCodedValue > values() const
Returns the values from the model.
bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole) override
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const override
Associates a code and a value.
QVariant code() const
Returns the associated code, which is the underlying value stored in fields.
QString value() const
Returns the associated value, which is the user-friendly string representation.
void setFieldDomain(const QgsFieldDomain *domain)
Sets the current field domain to show properties for in the dialog.
void setNameEditable(bool editable)
Sets if name of the field domain is editable.
QgsFieldDomain * createFieldDomain() const
Creates a new field domain using the properties from the dialog.
QgsFieldDomainDialog(Qgis::FieldDomainType type, QWidget *parent=nullptr, Qt::WindowFlags flags=Qt::WindowFlags())
Constructor for QgsFieldDomainDialog for the given domain type, with the specified parent widget and ...
void setPoliciesEditable(bool editable)
Sets if merge and split policies are editable.
A widget for configuration of the properties of a QgsFieldDomain.
QgsFieldDomainWidget(Qgis::FieldDomainType type, QWidget *parent=nullptr)
Constructor for QgsFieldDomainWidget for the given domain type, with the specified parent widget.
void setPoliciesEditable(bool editable)
Sets if merge and split policies are editable.
QgsFieldDomain * createFieldDomain() const
Creates a new field domain using the properties from the widget.
void setNameEditable(bool editable)
Sets if name of the field domain is editable.
void setFieldDomain(const QgsFieldDomain *domain)
Sets the current field domain to show properties for in the widget.
bool isValid() const
Returns true if the widget currently represents a valid field domain configuration.
void validityChanged(bool isValid)
Emitted whenever the validity of the field domain configuration in the widget changes.
Base class for field domains.
Qgis::FieldDomainMergePolicy mergePolicy() const
Returns the merge policy.
Qgis::FieldDomainSplitPolicy splitPolicy() const
Returns the split policy.
QMetaType::Type fieldType() const
Returns the associated field type.
QString name() const
Returns the name of the field domain.
QString description() const
Returns the description of the field domain.
A widget for configuration of the extended properties of a QgsGlobFieldDomain.
QgsGlobDomainWidget(QWidget *parent=nullptr)
Constructor for QgsGlobDomainWidget, with the specified parent widget.
void setFieldDomain(const QgsFieldDomain *domain) override
Sets the current field domain to show properties for in the widget.
QgsFieldDomain * createFieldDomain(const QString &name, const QString &description, QMetaType::Type fieldType) const override
Creates a new field domain using the properties from the widget.
bool isValid() const override
Returns true if the widget currently represents a valid field domain configuration.
Definition of a field domain for field content validated by a glob.
QString glob() const
Returns the glob expression.
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.
A widget for configuration of the extended properties of a QgsRangeFieldDomain.
void setFieldDomain(const QgsFieldDomain *domain) override
Sets the current field domain to show properties for in the widget.
bool isValid() const override
Returns true if the widget currently represents a valid field domain configuration.
QgsRangeDomainWidget(QWidget *parent=nullptr)
Constructor for QgsRangeDomainWidget, with the specified parent widget.
QgsFieldDomain * createFieldDomain(const QString &name, const QString &description, QMetaType::Type fieldType) const override
Creates a new field domain using the properties from the widget.
Definition of a numeric field domain with a range of validity for values.
QVariant minimum() const
Returns the minimum value.
bool maximumIsInclusive() const
Returns true if the maximum value is inclusive.
bool minimumIsInclusive() const
Returns true if the minimum value is inclusive.
QVariant maximum() const
Returns the maximum value.
static QString typeToDisplayString(QMetaType::Type type, QMetaType::Type subType=QMetaType::Type::UnknownType)
Returns a user-friendly translated string representing a QVariant type.