QGIS API Documentation  2.18.21-Las Palmas (9fba24a)
qgsrelationreferencewidgetwrapper.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsrelationreferencewidgetwrapper.cpp
3  --------------------------------------
4  Date : 20.4.2013
5  Copyright : (C) 2013 Matthias Kuhn
6  Email : matthias at opengis 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 
16 
18 #include "qgsproject.h"
19 #include "qgsrelationmanager.h"
20 
21 
23  : QgsEditorWidgetWrapper( vl, fieldIdx, editor, parent )
24  , mWidget( nullptr )
25  , mCanvas( canvas )
26  , mMessageBar( messageBar )
27  , mIndeterminateState( false )
28 {
29 }
30 
32 {
34  return w;
35 }
36 
38 {
39  QgsRelationReferenceWidget* w = dynamic_cast<QgsRelationReferenceWidget*>( editor );
40  if ( !w )
41  {
42  w = new QgsRelationReferenceWidget( editor );
43  }
44 
45  mWidget = w;
46 
47  mWidget->setEditorContext( context(), mCanvas, mMessageBar );
48 
49  bool showForm = config( "ShowForm", true ).toBool();
50  bool mapIdent = config( "MapIdentification", false ).toBool();
51  bool readOnlyWidget = config( "ReadOnly", false ).toBool();
52  bool orderByValue = config( "OrderByValue", false ).toBool();
53 
54  mWidget->setEmbedForm( showForm );
55  mWidget->setReadOnlySelector( readOnlyWidget );
56  mWidget->setAllowMapIdentification( mapIdent );
57  mWidget->setOrderByValue( orderByValue );
58  if ( config( "FilterFields", QVariant() ).isValid() )
59  {
60  mWidget->setFilterFields( config( "FilterFields" ).toStringList() );
61  mWidget->setChainFilters( config( "ChainFilters" ).toBool() );
62  }
63  mWidget->setAllowAddFeatures( config( "AllowAddFeatures", false ).toBool() );
64 
65  QgsRelation relation = QgsProject::instance()->relationManager()->relation( config( "Relation" ).toString() );
66 
67  // If this widget is already embedded by the same relation, reduce functionality
68  const QgsAttributeEditorContext* ctx = &context();
69  do
70  {
71  if ( ctx->relation().id() == relation.id() )
72  {
73  mWidget->setEmbedForm( false );
74  mWidget->setReadOnlySelector( true );
75  mWidget->setAllowMapIdentification( false );
76  }
77  ctx = ctx->parentContext();
78  }
79  while ( ctx );
80 
81  mWidget->setRelation( relation, config( "AllowNULL" ).toBool() );
82 
83  connect( mWidget, SIGNAL( foreignKeyChanged( QVariant ) ), this, SLOT( foreignKeyChanged( QVariant ) ) );
84 }
85 
87 {
88  if ( !mWidget )
89  return QVariant( field().type() );
90 
91  QVariant v = mWidget->foreignKey();
92 
93  if ( v.isNull() )
94  {
95  return QVariant( field().type() );
96  }
97  else
98  {
99  return v;
100  }
101 }
102 
104 {
105  return mWidget;
106 }
107 
109 {
110  if ( mWidget )
111  {
112  mWidget->showIndeterminateState();
113  }
114  mIndeterminateState = true;
115 }
116 
118 {
119  if ( !mWidget || ( !mIndeterminateState && val == value() ) )
120  return;
121 
122  mIndeterminateState = false;
123  mWidget->setForeignKey( val );
124 }
125 
127 {
128  if ( !mWidget )
129  return;
130 
131  mWidget->setRelationEditable( enabled );
132 }
133 
134 void QgsRelationReferenceWidgetWrapper::foreignKeyChanged( QVariant value )
135 {
136  if ( !value.isValid() || value.isNull() )
137  {
138  value = QVariant( field().type() );
139  }
140  emit valueChanged( value );
141 }
142 
144 {
145  if ( mWidget )
146  {
147  if ( constraintValid )
148  mWidget->setStyleSheet( QString() );
149  else
150  mWidget->setStyleSheet( ".QComboBox { background-color: #dd7777; }" );
151  }
152 }
void setEditorContext(const QgsAttributeEditorContext &context, QgsMapCanvas *canvas, QgsMessageBar *messageBar)
QVariant foreignKey() const
returns the related feature foreign key
void setStyleSheet(const QString &styleSheet)
void valueChanged()
Will call the value() method to determine the emitted value.
QgsField field() const
Access the field.
void setFilterFields(const QStringList &filterFields)
Set the fields for which filter comboboxes will be created.
This class contains context information for attribute editor widgets.
Manages an editor widget Widget and wrapper share the same parent.
void updateConstraintWidgetStatus(bool constraintValid) override
This should update the widget with a visual cue if a constraint status changed.
A bar for displaying non-blocking messages to the user.
Definition: qgsmessagebar.h:42
QgsRelationManager * relationManager() const
Map canvas is a class for displaying all GIS data types on a canvas.
Definition: qgsmapcanvas.h:109
QString id() const
A (project-wide) unique id for this relation.
void setAllowMapIdentification(bool allowMapIdentification)
void showIndeterminateState() override
Sets the widget to display in an indeterminate "mixed value" state.
void setForeignKey(const QVariant &value)
this sets the related feature using from the foreign key
void setOrderByValue(bool orderByValue)
Set if the widget will order the combobox entries by value.
bool isNull() const
virtual QVariant value() const override
Will be used to access the widget&#39;s value.
const QgsRelation & relation() const
void setRelation(const QgsRelation &relation, bool allowNullValue)
virtual QWidget * createWidget(QWidget *parent) override
This method should create a new widget with the provided parent.
const QgsAttributeEditorContext & context() const
Returns information about the context in which this widget is shown.
const QgsAttributeEditorContext * parentContext() const
void setAllowAddFeatures(bool allowAddFeatures)
Determines if a button for adding new features should be shown.
static QgsProject * instance()
Returns the QgsProject singleton instance.
Definition: qgsproject.cpp:382
void showIndeterminateState()
Sets the widget to display in an indeterminate "mixed value" state.
bool isValid() const
QgsEditorWidgetConfig config() const
Returns the whole config.
bool valid() const override
Return true if the widget has been properly initialized.
QgsRelation relation(const QString &id) const
Get access to a relation by its id.
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QObject * parent() const
Represents a vector layer which manages a vector based data sets.
QgsRelationReferenceWidgetWrapper(QgsVectorLayer *vl, int fieldIdx, QWidget *editor, QgsMapCanvas *canvas, QgsMessageBar *messageBar, QWidget *parent=nullptr)
virtual void setValue(const QVariant &value) override
void setChainFilters(bool chainFilters)
Set if filters are chained.
virtual void initWidget(QWidget *editor) override
This method should initialize the editor widget with runtime data.
virtual void setEnabled(bool enabled) override