Skip to content

Commit c5a4ea5

Browse files
committed
Add "filter fields" configuraiton option to relation reference widget
1 parent 5b5f16e commit c5a4ea5

File tree

4 files changed

+210
-11
lines changed

4 files changed

+210
-11
lines changed

src/gui/editorwidgets/qgsrelationreferenceconfigdlg.cpp

+94-9
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@
2222
#include "qgsvectorlayer.h"
2323
#include "qgsexpressionbuilderdialog.h"
2424

25+
2526
QgsRelationReferenceConfigDlg::QgsRelationReferenceConfigDlg( QgsVectorLayer* vl, int fieldIdx, QWidget* parent )
2627
: QgsEditorConfigWidget( vl, fieldIdx, parent )
28+
, mReferencedLayer( 0 )
2729
{
2830
setupUi( this );
2931
connect( mComboRelation, SIGNAL( currentIndexChanged( int ) ), this, SLOT( relationChanged( int ) ) );
@@ -58,6 +60,7 @@ void QgsRelationReferenceConfigDlg::setConfig( const QMap<QString, QVariant>& co
5860
if ( config.contains( "Relation" ) )
5961
{
6062
mComboRelation->setCurrentIndex( mComboRelation->findData( config[ "Relation" ].toString() ) );
63+
relationChanged( mComboRelation->currentIndex() );
6164
}
6265

6366
if ( config.contains( "MapIdentification" ) )
@@ -69,19 +72,47 @@ void QgsRelationReferenceConfigDlg::setConfig( const QMap<QString, QVariant>& co
6972
{
7073
mCbxReadOnly->setChecked( config[ "ReadOnly"].toBool() );
7174
}
75+
76+
if ( config.contains( "FilterFields" ) )
77+
{
78+
mFilterGroupBox->setChecked( true );
79+
Q_FOREACH ( const QString& fld, config["FilterFields"].toStringList() )
80+
{
81+
addFilterField( fld );
82+
}
83+
}
7284
}
7385

7486
void QgsRelationReferenceConfigDlg::relationChanged( int idx )
7587
{
7688
QString relName = mComboRelation->itemData( idx ).toString();
7789
QgsRelation rel = QgsProject::instance()->relationManager()->relation( relName );
7890

79-
QgsVectorLayer* referencedLayer = rel.referencedLayer();
80-
mExpressionWidget->setLayer( referencedLayer ); // set even if 0
81-
if ( referencedLayer )
91+
mReferencedLayer = rel.referencedLayer();
92+
mExpressionWidget->setLayer( mReferencedLayer ); // set even if 0
93+
if ( mReferencedLayer )
94+
{
95+
mExpressionWidget->setField( mReferencedLayer->displayExpression() );
96+
mCbxMapIdentification->setEnabled( mReferencedLayer->hasGeometryType() );
97+
}
98+
99+
loadFields();
100+
}
101+
102+
void QgsRelationReferenceConfigDlg::on_mAddFilterButton_clicked()
103+
{
104+
Q_FOREACH ( QListWidgetItem* item, mAvailableFieldsList->selectedItems() )
82105
{
83-
mExpressionWidget->setField( referencedLayer->displayExpression() );
84-
mCbxMapIdentification->setEnabled( referencedLayer->hasGeometryType() );
106+
addFilterField( item );
107+
}
108+
}
109+
110+
void QgsRelationReferenceConfigDlg::on_mRemoveFilterButton_clicked()
111+
{
112+
Q_FOREACH ( QListWidgetItem* item , mFilterFieldsList->selectedItems() )
113+
{
114+
mFilterFieldsList->takeItem( indexFromListWidgetItem( item ) );
115+
mAvailableFieldsList->addItem( item );
85116
}
86117
}
87118

@@ -95,14 +126,68 @@ QgsEditorWidgetConfig QgsRelationReferenceConfigDlg::config()
95126
myConfig.insert( "ReadOnly", mCbxReadOnly->isChecked() );
96127
myConfig.insert( "Relation", mComboRelation->itemData( mComboRelation->currentIndex() ) );
97128

98-
QString relName = mComboRelation->itemData( mComboRelation->currentIndex() ).toString();
99-
QgsRelation relation = QgsProject::instance()->relationManager()->relation( relName );
129+
if ( mFilterGroupBox->isChecked() )
130+
{
131+
QStringList filterFields;
132+
for ( int i = 0; i < mFilterFieldsList->count(); i++ )
133+
{
134+
filterFields << mFilterFieldsList->item( i )->data( Qt::UserRole ).toString();
135+
}
136+
myConfig.insert( "FilterFields", filterFields );
137+
}
100138

101-
if ( relation.isValid() )
139+
if ( mReferencedLayer )
102140
{
103-
relation.referencedLayer()->setDisplayExpression( mExpressionWidget->currentField() );
141+
mReferencedLayer->setDisplayExpression( mExpressionWidget->currentField() );
104142
}
105143

106144
return myConfig;
107145
}
108146

147+
void QgsRelationReferenceConfigDlg::loadFields()
148+
{
149+
mAvailableFieldsList->clear();
150+
mFilterFieldsList->clear();
151+
152+
if ( mReferencedLayer )
153+
{
154+
QgsVectorLayer* l = mReferencedLayer;
155+
const QgsFields& flds = l->pendingFields();
156+
for ( int i = 0; i < flds.count(); i++ )
157+
{
158+
mAvailableFieldsList->addItem( l->attributeAlias( i ).isEmpty() ? flds.at( i ).name() : l->attributeAlias( i ) );
159+
mAvailableFieldsList->item( mAvailableFieldsList->count() - 1 )->setData( Qt::UserRole, flds.at( i ).name() );
160+
}
161+
}
162+
}
163+
164+
void QgsRelationReferenceConfigDlg::addFilterField( const QString& field )
165+
{
166+
for ( int i = 0; i < mAvailableFieldsList->count(); i++ )
167+
{
168+
if ( mAvailableFieldsList->item( i )->data( Qt::UserRole ).toString() == field )
169+
{
170+
addFilterField( mAvailableFieldsList->item( i ) );
171+
break;
172+
}
173+
}
174+
}
175+
176+
void QgsRelationReferenceConfigDlg::addFilterField( QListWidgetItem* item )
177+
{
178+
mAvailableFieldsList->takeItem( indexFromListWidgetItem( item ) );
179+
mFilterFieldsList->addItem( item );
180+
}
181+
182+
int QgsRelationReferenceConfigDlg::indexFromListWidgetItem( QListWidgetItem* item )
183+
{
184+
QListWidget* lw = item->listWidget();
185+
186+
for ( int i = 0; i < lw->count(); i++ )
187+
{
188+
if ( lw->item( i ) == item )
189+
return i;
190+
}
191+
192+
return -1;
193+
}

src/gui/editorwidgets/qgsrelationreferenceconfigdlg.h

+12
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
#ifndef QGSRELATIONREFERENCECONFIGDLGBASE_H
1717
#define QGSRELATIONREFERENCECONFIGDLGBASE_H
1818

19+
#include <QListWidget>
20+
1921
#include "ui_qgsrelationreferenceconfigdlgbase.h"
2022
#include "qgseditorconfigwidget.h"
2123

@@ -28,8 +30,18 @@ class GUI_EXPORT QgsRelationReferenceConfigDlg : public QgsEditorConfigWidget, p
2830
virtual QgsEditorWidgetConfig config() override;
2931
virtual void setConfig( const QgsEditorWidgetConfig& config ) override;
3032

33+
private:
34+
void loadFields();
35+
void addFilterField( const QString& field );
36+
void addFilterField( QListWidgetItem* item );
37+
int indexFromListWidgetItem( QListWidgetItem* item );
38+
39+
QgsVectorLayer* mReferencedLayer;
40+
3141
private slots:
3242
void relationChanged( int idx );
43+
void on_mAddFilterButton_clicked();
44+
void on_mRemoveFilterButton_clicked();
3345
};
3446

3547
#endif // QGSRELATIONREFERENCECONFIGDLGBASE_H

src/gui/editorwidgets/qgsrelationreferencefactory.cpp

+25
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,18 @@ QgsEditorWidgetConfig QgsRelationReferenceFactory::readConfig( const QDomElement
4848
cfg.insert( "MapIdentification", configElement.attribute( "MapIdentification" ) == "1" );
4949
cfg.insert( "ReadOnly", configElement.attribute( "ReadOnly" ) == "1" );
5050

51+
QDomNode filterNode = configElement.elementsByTagName( "FilterFields" ).at( 0 );
52+
if ( !filterNode.isNull() )
53+
{
54+
QStringList filterFields;
55+
QDomNodeList fieldNodes = filterNode.toElement().elementsByTagName( "field" );
56+
for ( int i = 0; i < fieldNodes.size(); i++ )
57+
{
58+
QDomElement fieldElement = fieldNodes.at( i ).toElement();
59+
filterFields << fieldElement.attribute( "name" );
60+
}
61+
cfg.insert( "FilterFields", filterFields );
62+
}
5163
return cfg;
5264
}
5365

@@ -63,4 +75,17 @@ void QgsRelationReferenceFactory::writeConfig( const QgsEditorWidgetConfig& conf
6375
configElement.setAttribute( "Relation", config["Relation"].toString() );
6476
configElement.setAttribute( "MapIdentification", config["MapIdentification"].toBool() );
6577
configElement.setAttribute( "ReadOnly", config["ReadOnly"].toBool() );
78+
79+
if ( config.contains( "FilterFields" ) )
80+
{
81+
QDomElement filterFields = doc.createElement( "FilterFields" );
82+
83+
Q_FOREACH ( const QString& field, config["FilterFields"].toStringList() )
84+
{
85+
QDomElement fieldElem = doc.createElement( "field" );
86+
fieldElem.setAttribute( "name", field );
87+
filterFields.appendChild( fieldElem );
88+
}
89+
configElement.appendChild( filterFields );
90+
}
6691
}

src/ui/editorwidgets/qgsrelationreferenceconfigdlgbase.ui

+79-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<x>0</x>
88
<y>0</y>
99
<width>470</width>
10-
<height>240</height>
10+
<height>481</height>
1111
</rect>
1212
</property>
1313
<property name="windowTitle">
@@ -72,6 +72,75 @@
7272
</property>
7373
</widget>
7474
</item>
75+
<item row="11" column="0" colspan="2">
76+
<widget class="QgsCollapsibleGroupBox" name="mFilterGroupBox">
77+
<property name="title">
78+
<string>Filters</string>
79+
</property>
80+
<property name="checkable">
81+
<bool>true</bool>
82+
</property>
83+
<property name="checked">
84+
<bool>false</bool>
85+
</property>
86+
<layout class="QGridLayout" name="gridLayout">
87+
<item row="4" column="1">
88+
<spacer name="verticalSpacer_2">
89+
<property name="orientation">
90+
<enum>Qt::Vertical</enum>
91+
</property>
92+
<property name="sizeHint" stdset="0">
93+
<size>
94+
<width>20</width>
95+
<height>40</height>
96+
</size>
97+
</property>
98+
</spacer>
99+
</item>
100+
<item row="2" column="1">
101+
<widget class="QToolButton" name="mAddFilterButton">
102+
<property name="text">
103+
<string>...</string>
104+
</property>
105+
<property name="icon">
106+
<iconset resource="../../../images/images.qrc">
107+
<normaloff>:/images/themes/default/mActionSignPlus.png</normaloff>:/images/themes/default/mActionSignPlus.png</iconset>
108+
</property>
109+
</widget>
110+
</item>
111+
<item row="3" column="1">
112+
<widget class="QToolButton" name="mRemoveFilterButton">
113+
<property name="text">
114+
<string>...</string>
115+
</property>
116+
<property name="icon">
117+
<iconset resource="../../../images/images.qrc">
118+
<normaloff>:/images/themes/default/mActionSignMinus.png</normaloff>:/images/themes/default/mActionSignMinus.png</iconset>
119+
</property>
120+
</widget>
121+
</item>
122+
<item row="1" column="1">
123+
<spacer name="verticalSpacer">
124+
<property name="orientation">
125+
<enum>Qt::Vertical</enum>
126+
</property>
127+
<property name="sizeHint" stdset="0">
128+
<size>
129+
<width>20</width>
130+
<height>40</height>
131+
</size>
132+
</property>
133+
</spacer>
134+
</item>
135+
<item row="1" column="2" rowspan="4">
136+
<widget class="QListWidget" name="mFilterFieldsList"/>
137+
</item>
138+
<item row="1" column="0" rowspan="4">
139+
<widget class="QListWidget" name="mAvailableFieldsList"/>
140+
</item>
141+
</layout>
142+
</widget>
143+
</item>
75144
</layout>
76145
</widget>
77146
<customwidgets>
@@ -81,7 +150,15 @@
81150
<header location="global">qgsfieldexpressionwidget.h</header>
82151
<container>1</container>
83152
</customwidget>
153+
<customwidget>
154+
<class>QgsCollapsibleGroupBox</class>
155+
<extends>QGroupBox</extends>
156+
<header>qgscollapsiblegroupbox.h</header>
157+
<container>1</container>
158+
</customwidget>
84159
</customwidgets>
85-
<resources/>
160+
<resources>
161+
<include location="../../../images/images.qrc"/>
162+
</resources>
86163
<connections/>
87164
</ui>

0 commit comments

Comments
 (0)