38 changes: 28 additions & 10 deletions src/gui/qgsattributeeditor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#include <qgsfieldvalidator.h>
#include <qgsmaplayerregistry.h>
#include <qgslogger.h>
#include <qgsexpression.h>

#include <QScrollArea>
#include <QPushButton>
Expand Down Expand Up @@ -208,28 +209,45 @@ 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 );
QgsExpression *e = 0;
if ( !data.mFilterExpression.isEmpty() )
{
e = new QgsExpression( data.mFilterExpression );
if ( e->hasParserError() || !e->prepare( layer->pendingFields() ) )
ki = -1;
}

if ( ki >= 0 && vi >= 0 )
{
QgsAttributeList attributes;
attributes << ki;
attributes << vi;
if ( fi >= 0 )
attributes << fi;
QSet<int> attributes;
attributes << ki << vi;

QgsFeatureRequest::Flag flags = QgsFeatureRequest::NoGeometry;

if ( e )
{
if ( e->needsGeometry() )
flags = QgsFeatureRequest::NoFlags;

foreach ( const QString &field, e->referencedColumns() )
{
int idx = layer->fieldNameIndex( field );
if ( idx < 0 )
continue;
attributes << idx;
}
}

QgsFeatureIterator fit = layer->getFeatures( QgsFeatureRequest().setFlags( QgsFeatureRequest::NoGeometry ).setSubsetOfAttributes( attributes ) );
QgsFeatureIterator fit = layer->getFeatures( QgsFeatureRequest().setFlags( flags ).setSubsetOfAttributes( attributes.toList() ) );
QgsFeature f;
while ( fit.nextFeature( f ) )
{
if ( fi >= 0 && f.attribute( fi ).toString() != data.mFilterAttributeValue )
if ( e && !e->evaluate( &f ).toBool() )
continue;

map.insert( f.attribute( ki ).toString(), f.attribute( vi ).toString() );
Expand Down
43 changes: 20 additions & 23 deletions src/ui/qgsattributetypeedit.ui
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>615</width>
<height>398</height>
<height>421</height>
</rect>
</property>
<property name="windowTitle">
Expand All @@ -23,7 +23,7 @@
</sizepolicy>
</property>
<property name="currentIndex">
<number>1</number>
<number>12</number>
</property>
<widget class="QWidget" name="lineEditPage">
<layout class="QVBoxLayout" name="verticalLayout_1">
Expand Down Expand Up @@ -552,10 +552,7 @@
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QComboBox" name="valueRelationKeyColumn"/>
</item>
<item row="10" column="0" colspan="3">
<item row="11" column="0" colspan="3">
<spacer name="verticalSpacer_10">
<property name="orientation">
<enum>Qt::Vertical</enum>
Expand All @@ -568,6 +565,9 @@
</property>
</spacer>
</item>
<item row="2" column="2">
<widget class="QComboBox" name="valueRelationKeyColumn"/>
</item>
<item row="3" column="2">
<widget class="QComboBox" name="valueRelationValueColumn"/>
</item>
Expand All @@ -578,7 +578,7 @@
</property>
</widget>
</item>
<item row="6" column="2">
<item row="5" column="2">
<widget class="QCheckBox" name="valueRelationAllowNull">
<property name="layoutDirection">
<enum>Qt::RightToLeft</enum>
Expand All @@ -588,7 +588,7 @@
</property>
</widget>
</item>
<item row="7" column="2">
<item row="6" column="2">
<widget class="QCheckBox" name="valueRelationOrderByValue">
<property name="layoutDirection">
<enum>Qt::RightToLeft</enum>
Expand All @@ -598,7 +598,7 @@
</property>
</widget>
</item>
<item row="8" column="2">
<item row="7" column="2">
<widget class="QCheckBox" name="valueRelationAllowMulti">
<property name="layoutDirection">
<enum>Qt::RightToLeft</enum>
Expand All @@ -608,9 +608,6 @@
</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">
Expand All @@ -621,29 +618,29 @@
</property>
</widget>
</item>
<item row="4" column="0">
<item row="10" column="0" colspan="3">
<widget class="QTextEdit" name="valueRelationFilterExpression"/>
</item>
<item row="9" column="0">
<widget class="QLabel" name="label_19">
<property name="text">
<string>Filter column</string>
<string>Filter expression</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>
<item row="9" column="2">
<widget class="QToolButton" name="valueRelationEditExpression">
<property name="layoutDirection">
<enum>Qt::RightToLeft</enum>
</property>
<property name="buddy">
<cstring>valueRelationValueColumn</cstring>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="5" column="2">
<widget class="QComboBox" name="valueRelationFilterValue"/>
</item>
</layout>
</widget>
<widget class="QWidget" name="uuidGenPage">
Expand Down