1,307 changes: 675 additions & 632 deletions python/core/qgsvectorlayer.sip

Large diffs are not rendered by default.

56 changes: 53 additions & 3 deletions src/app/qgsattributetypedialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ QgsAttributeTypeDialog::QgsAttributeTypeDialog( QgsVectorLayer *vl )
}

connect( valueRelationLayer, SIGNAL( currentIndexChanged( int ) ), this, SLOT( updateLayerColumns( int ) ) );
connect( valueRelationFilterColumn, SIGNAL( currentIndexChanged( int ) ), this, SLOT( updateFilterColumn( int ) ) );
valueRelationLayer->setCurrentIndex( -1 );
}

Expand Down Expand Up @@ -606,6 +607,16 @@ void QgsAttributeTypeDialog::accept()
mValueRelationData.mAllowNull = valueRelationAllowNull->isChecked();
mValueRelationData.mOrderByValue = valueRelationOrderByValue->isChecked();
mValueRelationData.mAllowMulti = valueRelationAllowMulti->isChecked();
if( valueRelationFilterColumn->currentIndex() == 0 )
{
mValueRelationData.mFilterAttributeColumn = QString::null;
mValueRelationData.mFilterAttributeValue = QString::null;
}
else
{
mValueRelationData.mFilterAttributeColumn = valueRelationFilterColumn->currentText();
mValueRelationData.mFilterAttributeValue = valueRelationFilterValue->currentText();
}
break;
case 13:
mEditType = QgsVectorLayer::UuidGenerator;
Expand All @@ -631,12 +642,51 @@ void QgsAttributeTypeDialog::updateLayerColumns( int idx )
if ( !vl )
return;

foreach ( const QgsField &f, vl->pendingFields() )
valueRelationFilterColumn->addItem( tr( "No filter" ), -1 );

const QgsFieldMap &fields = vl->pendingFields();
for ( QgsFieldMap::const_iterator it = fields.begin(); it != fields.end(); ++it )
{
valueRelationKeyColumn->addItem( f.name() );
valueRelationValueColumn->addItem( f.name() );
valueRelationKeyColumn->addItem( it->name() );
valueRelationValueColumn->addItem( it->name() );
valueRelationFilterColumn->addItem( it->name(), it.key() );
}

valueRelationKeyColumn->setCurrentIndex( valueRelationKeyColumn->findText( mValueRelationData.mKey ) );
valueRelationValueColumn->setCurrentIndex( valueRelationValueColumn->findText( mValueRelationData.mValue ) );

if( mValueRelationData.mFilterAttributeColumn.isNull() )
{
valueRelationFilterColumn->setCurrentIndex( 0 );
}
else
{
valueRelationFilterColumn->setCurrentIndex( valueRelationFilterColumn->findText( mValueRelationData.mFilterAttributeColumn ) );
}
}

void QgsAttributeTypeDialog::updateFilterColumn( int idx )
{
valueRelationFilterValue->clear();
valueRelationFilterValue->setEnabled( idx > 0 );
if ( idx == 0 )
return;

QString id = valueRelationLayer->itemData( valueRelationLayer->currentIndex() ).toString();

QgsVectorLayer *vl = qobject_cast< QgsVectorLayer *>( QgsMapLayerRegistry::instance()->mapLayer( id ) );
if ( !vl )
return;

int fidx = valueRelationFilterColumn->itemData( idx ).toInt();

QList<QVariant> uniqueValues;
vl->uniqueValues( fidx, uniqueValues );

foreach( const QVariant &v, uniqueValues )
{
valueRelationFilterValue->addItem( v.toString(), v );
}

valueRelationFilterValue->setCurrentIndex( valueRelationFilterValue->findText( mValueRelationData.mFilterAttributeValue ) );
}
5 changes: 5 additions & 0 deletions src/app/qgsattributetypedialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,11 @@ class QgsAttributeTypeDialog: public QDialog, private Ui::QgsAttributeTypeDialog
*/
void updateLayerColumns( int idx );

/**
* update filter value list
*/
void updateFilterColumn( int idx );

private:

QString defaultWindowTitle();
Expand Down
8 changes: 7 additions & 1 deletion src/core/qgsvectorlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3160,7 +3160,9 @@ bool QgsVectorLayer::readSymbology( const QDomNode& node, QString& errorMessage
bool allowNull = editTypeElement.attribute( "allowNull" ) == "true";
bool orderByValue = editTypeElement.attribute( "orderByValue" ) == "true";
bool allowMulti = editTypeElement.attribute( "allowMulti", "false" ) == "true";
mValueRelations[ name ] = ValueRelationData( id, key, value, allowNull, orderByValue, allowMulti );
QString filterAttributeColumn= editTypeElement.attribute( "filterAttributeColumn", QString::null );
QString filterAttributeValue = editTypeElement.attribute( "filterAttributeValue", QString::null );
mValueRelations[ name ] = ValueRelationData( id, key, value, allowNull, orderByValue, allowMulti, filterAttributeColumn, filterAttributeValue );
}
break;

Expand Down Expand Up @@ -3382,6 +3384,10 @@ bool QgsVectorLayer::writeSymbology( QDomNode& node, QDomDocument& doc, QString&
editTypeElement.setAttribute( "allowNull", data.mAllowNull ? "true" : "false" );
editTypeElement.setAttribute( "orderByValue", data.mOrderByValue ? "true" : "false" );
editTypeElement.setAttribute( "allowMulti", data.mAllowMulti ? "true" : "false" );
if ( !data.mFilterAttributeColumn.isNull() )
editTypeElement.setAttribute( "filterAttributeColumn", data.mFilterAttributeColumn );
if ( !data.mFilterAttributeValue.isNull() )
editTypeElement.setAttribute( "filterAttributeValue", data.mFilterAttributeValue );
}
break;

Expand Down
131 changes: 81 additions & 50 deletions src/core/qgsvectorlayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,9 @@ struct CORE_EXPORT QgsVectorJoinInfo
int joinField;
/**True if the join is cached in virtual memory*/
bool memoryCache;
/**Cache for joined attributes to provide fast lookup (size is 0 if no memory caching)*/
/**Cache for joined attributes to provide fast lookup (size is 0 if no memory caching)
@note not available in python bindings
*/
QHash< QString, QgsAttributeMap> cachedAttributes;
};

Expand Down Expand Up @@ -99,7 +101,7 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
CheckBox, /* added in 1.4 */
FileName,
Enumeration,
Immutable, /* The attribute value should not be changed in the attribute form*/
Immutable, /* The attribute value should not be changed in the attribute form */
Hidden, /* The attribute value should not be shown in the attribute form @added in 1.4 */
TextEdit, /* multiline edit @added in 1.4*/
Calendar, /* calendar widget @added in 1.5 */
Expand All @@ -122,12 +124,25 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
struct ValueRelationData
{
ValueRelationData() {}
ValueRelationData( QString layer, QString key, QString value, bool allowNull, bool orderByValue, bool allowMulti = false )
: mLayer( layer ), mKey( key ), mValue( value ), mAllowNull( allowNull ), mOrderByValue( orderByValue ), mAllowMulti( allowMulti ) {}
ValueRelationData( QString layer, QString key, QString value, bool allowNull, bool orderByValue,
bool allowMulti = false,
QString filterAttributeColumn = QString::null,
QString filterAttributeValue = QString::null )
: mLayer( layer )
, mKey( key )
, mValue( value )
, mFilterAttributeColumn( filterAttributeColumn )
, mFilterAttributeValue( filterAttributeValue )
, mAllowNull( allowNull )
, mOrderByValue( orderByValue )
, mAllowMulti( allowMulti )
{}

QString mLayer;
QString mKey;
QString mValue;
QString mFilterAttributeColumn;
QString mFilterAttributeValue;
bool mAllowNull;
bool mOrderByValue;
bool mAllowMulti; /* allow selection of multiple keys @added in 1.9 */
Expand Down Expand Up @@ -158,7 +173,9 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
/** Returns the data provider */
QgsVectorDataProvider* dataProvider();

/** Returns the data provider in a const-correct manner */
/** Returns the data provider in a const-correct manner
@note not available in python bindings
*/
const QgsVectorDataProvider* dataProvider() const;

/** Sets the textencoding of the data provider */
Expand All @@ -184,7 +201,7 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer

const QgsLabel *label() const;

QgsAttributeAction* actions() { return mActions; }
QgsAttributeAction *actions() { return mActions; }

/** The number of features that are selected in this layer */
int selectedFeatureCount();
Expand All @@ -202,10 +219,10 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
QgsFeatureList selectedFeatures();

/** Return reference to identifiers of selected features */
const QgsFeatureIds& selectedFeaturesIds() const;
const QgsFeatureIds &selectedFeaturesIds() const;

/** Change selection to the new set of features */
void setSelectedFeatures( const QgsFeatureIds& ids );
void setSelectedFeatures( const QgsFeatureIds &ids );

/** Returns the bounding box of the selected features. If there is no selection, QgsRectangle(0,0,0,0) is returned */
QgsRectangle boundingBoxOfSelected();
Expand Down Expand Up @@ -259,7 +276,8 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
QGis::GeometryType geometryType() const;

/** Returns true if this is a geometry layer and false in case of NoGeometry (table only) or UnknownGeometry
@note added in 1.7*/
* @note added in 1.7
*/
bool hasGeometryType() const;

/**Returns the WKBType or WKBUnknown in case of error*/
Expand All @@ -279,10 +297,10 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
virtual bool writeXml( QDomNode & layer_node, QDomDocument & doc );

/** Read the symbology for the current layer from the Dom node supplied.
* @param node node that will contain the symbology definition for this layer.
* @param errorMessage reference to string that will be updated with any error messages
* @return true in case of success.
*/
* @param node node that will contain the symbology definition for this layer.
* @param errorMessage reference to string that will be updated with any error messages
* @return true in case of success.
*/
bool readSymbology( const QDomNode& node, QString& errorMessage );

/** Write the symbology for the layer into the docment provided.
Expand All @@ -308,7 +326,7 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
/** This function does nothing useful, it's kept only for compatibility.
* @todo to be removed
*/
virtual long updateFeatureCount() const;
Q_DECL_DEPRECATED virtual long updateFeatureCount() const;

/**
* Set the string (typically sql) used to define a subset of the layer
Expand Down Expand Up @@ -413,37 +431,42 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
int translateFeature( QgsFeatureId featureId, double dx, double dy );

/**Splits features cut by the given line
@param splitLine line that splits the layer features
@param topologicalEditing true if topological editing is enabled
@return 0 in case of success, 4 if there is a selection but no feature split*/
* @param splitLine line that splits the layer features
* @param topologicalEditing true if topological editing is enabled
* @return
* 0 in case of success,
* 4 if there is a selection but no feature split
*/
int splitFeatures( const QList<QgsPoint>& splitLine, bool topologicalEditing = false );

/**Changes the specified geometry such that it has no intersections with other
polygon (or multipolygon) geometries in this vector layer
@param geom geometry to modify
@return 0 in case of success*/
* polygon (or multipolygon) geometries in this vector layer
* @param geom geometry to modify
* @return 0 in case of success
*/
int removePolygonIntersections( QgsGeometry* geom );

/** Adds topological points for every vertex of the geometry.
@param geom the geometry where each vertex is added to segments of other features
@note geom is not going to be modified by the function
@return 0 in case of success
@see addTopologicalPoints
*/
* @param geom the geometry where each vertex is added to segments of other features
* @note geom is not going to be modified by the function
* @return 0 in case of success
*/
int addTopologicalPoints( QgsGeometry* geom );

/**Adds a vertex to segments which intersect point p but don't
already have a vertex there. If a feature already has a vertex at position p,
no additional vertex is inserted. This method is useful for topological
editing.
@param p position of the vertex
@return 0 in case of success*/
/** Adds a vertex to segments which intersect point p but don't
* already have a vertex there. If a feature already has a vertex at position p,
* no additional vertex is inserted. This method is useful for topological
* editing.
* @param p position of the vertex
* @return 0 in case of success
*/
int addTopologicalPoints( const QgsPoint& p );

/**Inserts vertices to the snapped segments.
This is useful for topological editing if snap to segment is enabled.
@param snapResults results collected from the snapping operation
@return 0 in case of success*/
* This is useful for topological editing if snap to segment is enabled.
* @param snapResults results collected from the snapping operation
* @return 0 in case of success
*/
int insertSegmentVerticesForSnap( const QList<QgsSnappingResult>& snapResults );

/** Set labels on */
Expand All @@ -456,26 +479,28 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
virtual bool isEditable() const;

/** Returns true if the provider is in read-only mode
* @note added in 1.6 */
* @note added in 1.6
*/
virtual bool isReadOnly() const;

/** Returns true if the provider has been modified since the last commit */
virtual bool isModified() const;

/**Snaps a point to the closest vertex if there is one within the snapping tolerance
@param point The point which is set to the position of a vertex if there is one within the snapping tolerance.
If there is no point within this tolerance, point is left unchanged.
@param tolerance The snapping tolerance
@return true if point has been snapped, false if no vertex within search tolerance*/
* @param point The point which is set to the position of a vertex if there is one within the snapping tolerance.
* If there is no point within this tolerance, point is left unchanged.
* @param tolerance The snapping tolerance
* @return true if the point has been snapped, false if no vertex within search tolerance
*/
bool snapPoint( QgsPoint& point, double tolerance );

/**Snaps to segment or vertex within given tolerance
@param startPoint point to snap (in layer coordinates)
@param snappingTolerance distance tolerance for snapping
@param snappingResults snapping results. Key is the distance between startPoint and snapping target
@param snap_to to segment / to vertex
@return 0 in case of success
*/
* @param startPoint point to snap (in layer coordinates)
* @param snappingTolerance distance tolerance for snapping
* @param snappingResults snapping results. Key is the distance between startPoint and snapping target
* @param snap_to to segment / to vertex
* @return 0 in case of success
*/
int snapWithContext( const QgsPoint& startPoint,
double snappingTolerance,
QMultiMap < double, QgsSnappingResult > &snappingResults,
Expand Down Expand Up @@ -585,7 +610,9 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
/** set string representing 'true' for a checkbox (added in 1.4) */
void setCheckedState( int idx, QString checked, QString notChecked );

/** return string representing 'true' for a checkbox (added in 1.4) */
/** return string representing 'true' for a checkbox (added in 1.4)
* @note not available in python bindings
*/
QPair<QString, QString> checkedState( int idx );

/** get edit form (added in 1.4) */
Expand Down Expand Up @@ -650,10 +677,14 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
/** Destroy active command and reverts all changes in it */
void destroyEditCommand();

/** Execute undo operation. To be called only from QgsVectorLayerUndoCommand. */
/** Execute undo operation. To be called only from QgsVectorLayerUndoCommand.
* @note not available in python bindings
*/
void undoEditCommand( QgsUndoCommand* cmd );

/** Execute redo operation. To be called only from QgsVectorLayerUndoCommand. */
/** Execute redo operation. To be called only from QgsVectorLayerUndoCommand.
* @note not available in python bindings
*/
void redoEditCommand( QgsUndoCommand* cmd );

/** Returns the index of a field name or -1 if the field does not exist
Expand Down Expand Up @@ -690,7 +721,7 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
void uniqueValues( int index, QList<QVariant> &uniqueValues, int limit = -1 );

/**Returns minimum value for an attribute column or invalid variant in case of error
@note added in 1.7*/
@note added in 1.7*/
QVariant minimumValue( int index );

/**Returns maximum value for an attribute column or invalid variant in case of error
Expand Down Expand Up @@ -755,7 +786,7 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
private: // Private methods

/** vector layers are not copyable */
QgsVectorLayer( QgsVectorLayer const & rhs );
QgsVectorLayer( const QgsVectorLayer & rhs );

/** vector layers are not copyable */
QgsVectorLayer & operator=( QgsVectorLayer const & rhs );
Expand Down
51 changes: 32 additions & 19 deletions src/gui/qgsattributeeditor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,6 @@ void QgsAttributeEditor::selectFileName()
if ( fileName.isNull() )
return;

//le->setText( fileName );
le->setText( QDir::toNativeSeparators( fileName ) );
}

Expand Down Expand Up @@ -104,7 +103,7 @@ void QgsAttributeEditor::selectDate()

QComboBox *QgsAttributeEditor::comboBox( QWidget *editor, QWidget *parent )
{
QComboBox *cb = NULL;
QComboBox *cb = 0;
if ( editor )
cb = qobject_cast<QComboBox *>( editor );
else
Expand All @@ -115,7 +114,7 @@ QComboBox *QgsAttributeEditor::comboBox( QWidget *editor, QWidget *parent )

QListWidget *QgsAttributeEditor::listWidget( QWidget *editor, QWidget *parent )
{
QListWidget *lw = NULL;
QListWidget *lw = 0;
if ( editor )
lw = qobject_cast<QListWidget *>( editor );
else
Expand All @@ -127,9 +126,9 @@ QListWidget *QgsAttributeEditor::listWidget( QWidget *editor, QWidget *parent )
QWidget *QgsAttributeEditor::createAttributeEditor( QWidget *parent, QWidget *editor, QgsVectorLayer *vl, int idx, const QVariant &value )
{
if ( !vl )
return NULL;
return 0;

QWidget *myWidget = NULL;
QWidget *myWidget = 0;
QgsVectorLayer::EditType editType = vl->editType( idx );
const QgsField &field = vl->pendingFields()[idx];
QVariant::Type myFieldType = field.type();
Expand All @@ -151,6 +150,7 @@ QWidget *QgsAttributeEditor::createAttributeEditor( QWidget *parent, QWidget *ed

myWidget = cb;
}

}
break;

Expand Down Expand Up @@ -199,20 +199,33 @@ QWidget *QgsAttributeEditor::createAttributeEditor( QWidget *parent, QWidget *ed

QgsVectorLayer *layer = qobject_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( data.mLayer ) );
QMap< QString, QString > map;

int fi = -1;
if ( layer )
{
int ki = layer->fieldNameIndex( data.mOrderByValue ? data.mValue : data.mKey );
int vi = layer->fieldNameIndex( data.mOrderByValue ? data.mKey : data.mValue );

if ( !data.mFilterAttributeColumn.isNull() )
fi = layer->fieldNameIndex( data.mFilterAttributeColumn );

if ( data.mAllowNull )
map.insert( nullValue, tr( "(no selection)" ) );

if ( ki >= 0 && vi >= 0 )
{
layer->select( QgsAttributeList() << ki << vi, QgsRectangle(), false );
QgsAttributeList attributes;
attributes << ki;
attributes << vi;
if ( fi >= 0 )
attributes << fi;
layer->select( attributes, QgsRectangle(), false );
QgsFeature f;
while ( layer->nextFeature( f ) )
{
if ( fi >= 0 && f.attributeMap()[ fi ].toString() != data.mFilterAttributeValue )
continue;

map.insert( f.attributeMap()[ ki ].toString(), f.attributeMap()[ vi ].toString() );
}
}
Expand Down Expand Up @@ -325,7 +338,7 @@ QWidget *QgsAttributeEditor::createAttributeEditor( QWidget *parent, QWidget *ed

if ( editType == QgsVectorLayer::EditRange )
{
QSpinBox *sb = NULL;
QSpinBox *sb = 0;

if ( editor )
sb = qobject_cast<QSpinBox *>( editor );
Expand All @@ -342,7 +355,7 @@ QWidget *QgsAttributeEditor::createAttributeEditor( QWidget *parent, QWidget *ed
}
else
{
QAbstractSlider *sl = NULL;
QAbstractSlider *sl = 0;

if ( editor )
{
Expand All @@ -369,7 +382,7 @@ QWidget *QgsAttributeEditor::createAttributeEditor( QWidget *parent, QWidget *ed
}
else if ( myFieldType == QVariant::Double )
{
QDoubleSpinBox *dsb = NULL;
QDoubleSpinBox *dsb = 0;
if ( editor )
dsb = qobject_cast<QDoubleSpinBox*>( editor );
else
Expand All @@ -392,7 +405,7 @@ QWidget *QgsAttributeEditor::createAttributeEditor( QWidget *parent, QWidget *ed

case QgsVectorLayer::CheckBox:
{
QCheckBox *cb = NULL;
QCheckBox *cb = 0;
if ( editor )
cb = qobject_cast<QCheckBox*>( editor );
else
Expand All @@ -413,9 +426,9 @@ QWidget *QgsAttributeEditor::createAttributeEditor( QWidget *parent, QWidget *ed
case QgsVectorLayer::UniqueValuesEditable:
case QgsVectorLayer::Immutable:
{
QLineEdit *le = NULL;
QTextEdit *te = NULL;
QPlainTextEdit *pte = NULL;
QLineEdit *le = 0;
QTextEdit *te = 0;
QPlainTextEdit *pte = 0;

if ( editor )
{
Expand Down Expand Up @@ -477,13 +490,13 @@ QWidget *QgsAttributeEditor::createAttributeEditor( QWidget *parent, QWidget *ed
break;

case QgsVectorLayer::Hidden:
myWidget = NULL;
myWidget = 0;
break;

case QgsVectorLayer::FileName:
case QgsVectorLayer::Calendar:
{
QPushButton *pb = NULL;
QPushButton *pb = 0;
QLineEdit *le = qobject_cast<QLineEdit *>( editor );
if ( le )
{
Expand Down Expand Up @@ -749,7 +762,7 @@ bool QgsAttributeEditor::setValue( QWidget *editor, QgsVectorLayer *vl, int idx,
{
QVariant v = value;
QComboBox *cb = qobject_cast<QComboBox *>( editor );
if ( cb == NULL )
if ( !cb )
return false;

if ( v.isNull() )
Expand All @@ -774,14 +787,14 @@ bool QgsAttributeEditor::setValue( QWidget *editor, QgsVectorLayer *vl, int idx,
if ( editType == QgsVectorLayer::EditRange )
{
QSpinBox *sb = qobject_cast<QSpinBox *>( editor );
if ( sb == NULL )
if ( !sb )
return false;
sb->setValue( value.toInt() );
}
else
{
QAbstractSlider *sl = qobject_cast<QAbstractSlider *>( editor );
if ( sl == NULL )
if ( !sl )
return false;
sl->setValue( value.toInt() );
}
Expand All @@ -790,7 +803,7 @@ bool QgsAttributeEditor::setValue( QWidget *editor, QgsVectorLayer *vl, int idx,
else if ( myFieldType == QVariant::Double )
{
QDoubleSpinBox *dsb = qobject_cast<QDoubleSpinBox *>( editor );
if ( dsb == NULL )
if ( !dsb )
return false;
dsb->setValue( value.toDouble() );
}
Expand Down
80 changes: 53 additions & 27 deletions src/ui/qgsattributetypeedit.ui
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@
</sizepolicy>
</property>
<property name="currentIndex">
<number>0</number>
<number>1</number>
</property>
<widget class="QWidget" name="lineEditPage">
<layout class="QVBoxLayout" name="verticalLayout_1">
Expand Down Expand Up @@ -613,7 +613,7 @@
</property>
</widget>
</item>
<item row="1" column="1">
<item row="1" column="2">
<widget class="QComboBox" name="valueRelationLayer"/>
</item>
<item row="2" column="0">
Expand All @@ -626,30 +626,10 @@
</property>
</widget>
</item>
<item row="2" column="1">
<item row="2" column="2">
<widget class="QComboBox" name="valueRelationKeyColumn"/>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Value column</string>
</property>
<property name="buddy">
<cstring>valueRelationValueColumn</cstring>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QComboBox" name="valueRelationValueColumn"/>
</item>
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="label_8">
<property name="text">
<string>Select layer, key column and value column</string>
</property>
</widget>
</item>
<item row="8" column="0" colspan="2">
<item row="10" column="0" colspan="3">
<spacer name="verticalSpacer_10">
<property name="orientation">
<enum>Qt::Vertical</enum>
Expand All @@ -662,7 +642,17 @@
</property>
</spacer>
</item>
<item row="4" column="1">
<item row="3" column="2">
<widget class="QComboBox" name="valueRelationValueColumn"/>
</item>
<item row="0" column="0" colspan="3">
<widget class="QLabel" name="label_8">
<property name="text">
<string>Select layer, key column and value column</string>
</property>
</widget>
</item>
<item row="6" column="2">
<widget class="QCheckBox" name="valueRelationAllowNull">
<property name="layoutDirection">
<enum>Qt::RightToLeft</enum>
Expand All @@ -672,7 +662,7 @@
</property>
</widget>
</item>
<item row="5" column="1">
<item row="7" column="2">
<widget class="QCheckBox" name="valueRelationOrderByValue">
<property name="layoutDirection">
<enum>Qt::RightToLeft</enum>
Expand All @@ -682,7 +672,7 @@
</property>
</widget>
</item>
<item row="6" column="1">
<item row="8" column="2">
<widget class="QCheckBox" name="valueRelationAllowMulti">
<property name="layoutDirection">
<enum>Qt::RightToLeft</enum>
Expand All @@ -692,6 +682,42 @@
</property>
</widget>
</item>
<item row="4" column="2">
<widget class="QComboBox" name="valueRelationFilterColumn"/>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Value column</string>
</property>
<property name="buddy">
<cstring>valueRelationValueColumn</cstring>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_19">
<property name="text">
<string>Filter column</string>
</property>
<property name="buddy">
<cstring>valueRelationValueColumn</cstring>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_20">
<property name="text">
<string>Filter value</string>
</property>
<property name="buddy">
<cstring>valueRelationValueColumn</cstring>
</property>
</widget>
</item>
<item row="5" column="2">
<widget class="QComboBox" name="valueRelationFilterValue"/>
</item>
</layout>
</widget>
<widget class="QWidget" name="uuidGenPage">
Expand Down