22
22
#include " qgsvectorlayer.h"
23
23
#include " qgsexpressionbuilderdialog.h"
24
24
25
+
25
26
QgsRelationReferenceConfigDlg::QgsRelationReferenceConfigDlg ( QgsVectorLayer* vl, int fieldIdx, QWidget* parent )
26
27
: QgsEditorConfigWidget( vl, fieldIdx, parent )
28
+ , mReferencedLayer( 0 )
27
29
{
28
30
setupUi ( this );
29
31
connect ( mComboRelation , SIGNAL ( currentIndexChanged ( int ) ), this , SLOT ( relationChanged ( int ) ) );
@@ -58,6 +60,7 @@ void QgsRelationReferenceConfigDlg::setConfig( const QMap<QString, QVariant>& co
58
60
if ( config.contains ( " Relation" ) )
59
61
{
60
62
mComboRelation ->setCurrentIndex ( mComboRelation ->findData ( config[ " Relation" ].toString () ) );
63
+ relationChanged ( mComboRelation ->currentIndex () );
61
64
}
62
65
63
66
if ( config.contains ( " MapIdentification" ) )
@@ -69,19 +72,47 @@ void QgsRelationReferenceConfigDlg::setConfig( const QMap<QString, QVariant>& co
69
72
{
70
73
mCbxReadOnly ->setChecked ( config[ " ReadOnly" ].toBool () );
71
74
}
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
+ }
72
84
}
73
85
74
86
void QgsRelationReferenceConfigDlg::relationChanged ( int idx )
75
87
{
76
88
QString relName = mComboRelation ->itemData ( idx ).toString ();
77
89
QgsRelation rel = QgsProject::instance ()->relationManager ()->relation ( relName );
78
90
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 () )
82
105
{
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 );
85
116
}
86
117
}
87
118
@@ -95,14 +126,68 @@ QgsEditorWidgetConfig QgsRelationReferenceConfigDlg::config()
95
126
myConfig.insert ( " ReadOnly" , mCbxReadOnly ->isChecked () );
96
127
myConfig.insert ( " Relation" , mComboRelation ->itemData ( mComboRelation ->currentIndex () ) );
97
128
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
+ }
100
138
101
- if ( relation . isValid () )
139
+ if ( mReferencedLayer )
102
140
{
103
- relation . referencedLayer () ->setDisplayExpression ( mExpressionWidget ->currentField () );
141
+ mReferencedLayer ->setDisplayExpression ( mExpressionWidget ->currentField () );
104
142
}
105
143
106
144
return myConfig;
107
145
}
108
146
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
+ }
0 commit comments