QGIS API Documentation  2.10.1-Pisa
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
qgsrelationreferenceconfigdlg.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsrelationreferenceconfigdlg.cpp
3  --------------------------------------
4  Date : 21.4.2013
5  Copyright : (C) 2013 Matthias Kuhn
6  Email : matthias dot kuhn at gmx dot ch
7  ***************************************************************************
8  * *
9  * This program is free software; you can redistribute it and/or modify *
10  * it under the terms of the GNU General Public License as published by *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  ***************************************************************************/
15 
17 
18 #include "qgseditorwidgetfactory.h"
19 #include "qgsfield.h"
20 #include "qgsproject.h"
21 #include "qgsrelationmanager.h"
22 #include "qgsvectorlayer.h"
24 
25 
27  : QgsEditorConfigWidget( vl, fieldIdx, parent )
28  , mReferencedLayer( 0 )
29 {
30  setupUi( this );
31  connect( mComboRelation, SIGNAL( currentIndexChanged( int ) ), this, SLOT( relationChanged( int ) ) );
32 
33  foreach ( const QgsRelation& relation, vl->referencingRelations( fieldIdx ) )
34  {
35  mComboRelation->addItem( QString( "%1 (%2)" ).arg( relation.id(), relation.referencedLayerId() ), relation.id() );
36  if ( relation.referencedLayer() )
37  {
38  mExpressionWidget->setField( relation.referencedLayer()->displayExpression() );
39  }
40  }
41 }
42 
44 {
45  if ( config.contains( "AllowNULL" ) )
46  {
47  mCbxAllowNull->setChecked( config[ "AllowNULL" ].toBool() );
48  }
49 
50  if ( config.contains( "OrderByValue" ) )
51  {
52  mCbxOrderByValue->setChecked( config[ "OrderByValue" ].toBool() );
53  }
54 
55  if ( config.contains( "ShowForm" ) )
56  {
57  mCbxShowForm->setChecked( config[ "ShowForm" ].toBool() );
58  }
59 
60  if ( config.contains( "Relation" ) )
61  {
62  mComboRelation->setCurrentIndex( mComboRelation->findData( config[ "Relation" ].toString() ) );
63  relationChanged( mComboRelation->currentIndex() );
64  }
65 
66  if ( config.contains( "MapIdentification" ) )
67  {
68  mCbxMapIdentification->setChecked( config[ "MapIdentification"].toBool() );
69  }
70 
71  if ( config.contains( "ReadOnly" ) )
72  {
73  mCbxReadOnly->setChecked( config[ "ReadOnly"].toBool() );
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 
84  mCbxChainFilters->setChecked( config["ChainFilters"].toBool() );
85  }
86 }
87 
88 void QgsRelationReferenceConfigDlg::relationChanged( int idx )
89 {
90  QString relName = mComboRelation->itemData( idx ).toString();
92 
93  mReferencedLayer = rel.referencedLayer();
94  mExpressionWidget->setLayer( mReferencedLayer ); // set even if 0
95  if ( mReferencedLayer )
96  {
97  mExpressionWidget->setField( mReferencedLayer->displayExpression() );
98  mCbxMapIdentification->setEnabled( mReferencedLayer->hasGeometryType() );
99  }
100 
101  loadFields();
102 }
103 
104 void QgsRelationReferenceConfigDlg::on_mAddFilterButton_clicked()
105 {
106  Q_FOREACH ( QListWidgetItem* item, mAvailableFieldsList->selectedItems() )
107  {
108  addFilterField( item );
109  }
110 }
111 
112 void QgsRelationReferenceConfigDlg::on_mRemoveFilterButton_clicked()
113 {
114  Q_FOREACH ( QListWidgetItem* item , mFilterFieldsList->selectedItems() )
115  {
116  mFilterFieldsList->takeItem( indexFromListWidgetItem( item ) );
117  mAvailableFieldsList->addItem( item );
118  }
119 }
120 
122 {
123  QgsEditorWidgetConfig myConfig;
124  myConfig.insert( "AllowNULL", mCbxAllowNull->isChecked() );
125  myConfig.insert( "OrderByValue", mCbxOrderByValue->isChecked() );
126  myConfig.insert( "ShowForm", mCbxShowForm->isChecked() );
127  myConfig.insert( "MapIdentification", mCbxMapIdentification->isEnabled() && mCbxMapIdentification->isChecked() );
128  myConfig.insert( "ReadOnly", mCbxReadOnly->isChecked() );
129  myConfig.insert( "Relation", mComboRelation->itemData( mComboRelation->currentIndex() ) );
130 
131  if ( mFilterGroupBox->isChecked() )
132  {
133  QStringList filterFields;
134  for ( int i = 0; i < mFilterFieldsList->count(); i++ )
135  {
136  filterFields << mFilterFieldsList->item( i )->data( Qt::UserRole ).toString();
137  }
138  myConfig.insert( "FilterFields", filterFields );
139 
140  myConfig.insert( "ChainFilters", mCbxChainFilters->isChecked() );
141  }
142 
143  if ( mReferencedLayer )
144  {
145  mReferencedLayer->setDisplayExpression( mExpressionWidget->currentField() );
146  }
147 
148  return myConfig;
149 }
150 
151 void QgsRelationReferenceConfigDlg::loadFields()
152 {
153  mAvailableFieldsList->clear();
154  mFilterFieldsList->clear();
155 
156  if ( mReferencedLayer )
157  {
158  QgsVectorLayer* l = mReferencedLayer;
159  const QgsFields& flds = l->pendingFields();
160  for ( int i = 0; i < flds.count(); i++ )
161  {
162  mAvailableFieldsList->addItem( l->attributeAlias( i ).isEmpty() ? flds.at( i ).name() : l->attributeAlias( i ) );
163  mAvailableFieldsList->item( mAvailableFieldsList->count() - 1 )->setData( Qt::UserRole, flds.at( i ).name() );
164  }
165  }
166 }
167 
168 void QgsRelationReferenceConfigDlg::addFilterField( const QString& field )
169 {
170  for ( int i = 0; i < mAvailableFieldsList->count(); i++ )
171  {
172  if ( mAvailableFieldsList->item( i )->data( Qt::UserRole ).toString() == field )
173  {
174  addFilterField( mAvailableFieldsList->item( i ) );
175  break;
176  }
177  }
178 }
179 
180 void QgsRelationReferenceConfigDlg::addFilterField( QListWidgetItem* item )
181 {
182  mAvailableFieldsList->takeItem( indexFromListWidgetItem( item ) );
183  mFilterFieldsList->addItem( item );
184 }
185 
186 int QgsRelationReferenceConfigDlg::indexFromListWidgetItem( QListWidgetItem* item )
187 {
188  QListWidget* lw = item->listWidget();
189 
190  for ( int i = 0; i < lw->count(); i++ )
191  {
192  if ( lw->item( i ) == item )
193  return i;
194  }
195 
196  return -1;
197 }
const QString & name() const
Gets the name of the field.
Definition: qgsfield.cpp:69
virtual QgsEditorWidgetConfig config() override
Create a configuration from the current GUI state.
int field()
Returns the field for which this configuration widget applies.
void setupUi(QWidget *widget)
bool contains(const Key &key) const
This class should be subclassed for every configurable editor widget type.
QListWidget * listWidget() const
QgsVectorLayer * referencedLayer() const
Access the referenced (parent) layer.
Container of fields for a vector layer.
Definition: qgsfield.h:173
void setDisplayExpression(const QString &displayExpression)
Set the preview expression, used to create a human readable preview string.
QList< QgsRelation > referencingRelations(int idx)
Get relations, where the foreign key is on this layer.
const QString displayExpression()
Get the preview expression, used to create a human readable preview string.
virtual void setConfig(const QgsEditorWidgetConfig &config) override
Update the configuration widget to represent the given configuration.
QgsRelation relation(const QString &id) const
Get access to a relation by its id.
const QString & id() const
The id.
bool isEmpty() const
int count() const
Return number of items.
Definition: qgsfield.cpp:283
QListWidgetItem * item(int row) const
QString attributeAlias(int attributeIndex) const
Returns the alias of an attribute name or an empty string if there is no alias.
const QgsField & at(int i) const
Get field at particular index (must be in range 0..N-1)
Definition: qgsfield.cpp:303
QString referencedLayerId() const
Access the referenced (parent) layer's id.
bool hasGeometryType() const
Returns true if this is a geometry layer and false in case of NoGeometry (table only) or UnknownGeome...
static QgsProject * instance()
access to canonical QgsProject instance
Definition: qgsproject.cpp:351
iterator insert(const Key &key, const T &value)
const QgsFields & pendingFields() const
returns field list in the to-be-committed state
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
Represents a vector layer which manages a vector based data sets.
QgsRelationManager * relationManager() const
QgsRelationReferenceConfigDlg(QgsVectorLayer *vl, int fieldIdx, QWidget *parent)