30#include <QStandardItemModel>
33#include "moc_qgsjoindialog.cpp"
35using namespace Qt::StringLiterals;
38 : QDialog( parent, f )
42 connect( buttonBox, &QDialogButtonBox::helpRequested,
this, [] {
QgsHelp::openHelp( u
"working_with_vector/vector_properties.html#joins-properties"_s ); } );
49 alreadyJoinedLayers.append( layer );
51 mTargetFieldComboBox->setLayer( mLayer );
53 mDynamicFormCheckBox->setToolTip( tr(
"This option allows values of the joined fields to be automatically reloaded when the \"Target Field\" is changed" ) );
55 mEditableJoinLayer->setToolTip( tr(
"This option allows values of the joined layers to be editable if they're themselves editable" ) );
56 mUpsertOnEditCheckBox->setToolTip( tr(
"Automatically adds a matching row to the joined table, but if one already exists then update that matching row instead" ) );
57 mDeleteCascadeCheckBox->setToolTip( tr(
"Automatically delete the corresponding feature of the linked layer if one exists" ) );
60 mJoinLayerComboBox->setExceptedLayerList( alreadyJoinedLayers );
64 mCacheInMemoryCheckBox->setChecked(
true );
65 mCacheEnabled = mCacheInMemoryCheckBox->isChecked();
67 QgsMapLayer *joinLayer = mJoinLayerComboBox->currentLayer();
68 if ( joinLayer && joinLayer->
isValid() )
70 mJoinFieldComboBox->setLayer( joinLayer );
71 joinedLayerChanged( joinLayer );
77 connect( mEditableJoinLayer, &QGroupBox::toggled,
this, &QgsJoinDialog::editableJoinLayerChanged );
79 checkDefinitionValid();
84 mJoinLayerComboBox->setLayer(
joinInfo.joinLayer() );
85 mJoinFieldComboBox->setField(
joinInfo.joinFieldName() );
86 mTargetFieldComboBox->setField(
joinInfo.targetFieldName() );
88 mCacheEnabled =
joinInfo.isUsingMemoryCache();
89 mCacheInMemoryCheckBox->setChecked(
joinInfo.isUsingMemoryCache() );
91 mDynamicFormCheckBox->setChecked(
joinInfo.isDynamicFormEnabled() );
92 mEditableJoinLayer->setChecked(
joinInfo.isEditable() );
93 mUpsertOnEditCheckBox->setChecked(
joinInfo.hasUpsertOnEdit() );
94 mDeleteCascadeCheckBox->setChecked(
joinInfo.hasCascadedDelete() );
98 mUseCustomPrefix->setChecked(
false );
102 mUseCustomPrefix->setChecked(
true );
103 mCustomPrefix->setText(
joinInfo.prefix() );
106 QStringList *lst =
joinInfo.joinFieldNamesSubset();
107 mUseJoinFieldsSubset->setChecked( lst && !lst->isEmpty() );
108 QAbstractItemModel *model = mJoinFieldsSubsetView->model();
111 for (
int i = 0; i < model->rowCount(); ++i )
113 const QModelIndex index = model->index( i, 0 );
114 if ( lst && lst->contains( model->data( index, Qt::DisplayRole ).toString() ) )
116 model->setData( index, Qt::Checked, Qt::CheckStateRole );
120 model->setData( index, Qt::Unchecked, Qt::CheckStateRole );
125 editableJoinLayerChanged();
131 info.
setJoinLayer( qobject_cast<QgsVectorLayer *>( mJoinLayerComboBox->currentLayer() ) );
137 info.
setEditable( mEditableJoinLayer->isChecked() );
144 if ( mUseCustomPrefix->isChecked() )
149 if ( mUseJoinFieldsSubset->isChecked() )
152 QAbstractItemModel *model = mJoinFieldsSubsetView->model();
155 for (
int i = 0; i < model->rowCount(); ++i )
157 const QModelIndex index = model->index( i, 0 );
158 if ( model->data( index, Qt::CheckStateRole ).toInt() == Qt::Checked )
159 lst << model->data( index ).toString();
170 return mCreateIndexCheckBox->isChecked();
173void QgsJoinDialog::joinedLayerChanged(
QgsMapLayer *layer )
175 mJoinFieldComboBox->clear();
183 mUseJoinFieldsSubset->setChecked(
false );
184 QStandardItemModel *subsetModel =
new QStandardItemModel(
this );
185 const QgsFields layerFields = vLayer->
fields();
186 for (
const QgsField &field : layerFields )
188 QStandardItem *subsetItem =
new QStandardItem( field.name() );
189 subsetItem->setCheckable(
true );
191 subsetModel->appendRow( subsetItem );
193 mJoinFieldsSubsetView->setModel( subsetModel );
197 if ( canCreateAttrIndex )
199 mCreateIndexCheckBox->setEnabled(
true );
203 mCreateIndexCheckBox->setEnabled(
false );
204 mCreateIndexCheckBox->setChecked(
false );
207 if ( !mUseCustomPrefix->isChecked() )
209 mCustomPrefix->setText( layer->
name() +
'_' );
213void QgsJoinDialog::checkDefinitionValid()
215 buttonBox->button( QDialogButtonBox::Ok )->setEnabled( mJoinLayerComboBox->currentIndex() != -1 && mJoinFieldComboBox->currentIndex() != -1 && mTargetFieldComboBox->currentIndex() != -1 );
218void QgsJoinDialog::editableJoinLayerChanged()
220 if ( mEditableJoinLayer->isChecked() )
222 mCacheInMemoryCheckBox->setEnabled(
false );
223 mCacheInMemoryCheckBox->setToolTip( tr(
"Caching can not be enabled if editable join layer is enabled" ) );
224 mCacheEnabled = mCacheInMemoryCheckBox->isChecked();
225 mCacheInMemoryCheckBox->setChecked(
false );
229 mCacheInMemoryCheckBox->setEnabled(
true );
230 mCacheInMemoryCheckBox->setToolTip( QString() );
231 mCacheInMemoryCheckBox->setChecked( mCacheEnabled );
@ CreateAttributeIndex
Can create indexes on provider's fields.
void fieldChanged(const QString &fieldName)
Emitted when the currently selected field changes.
void setLayer(QgsMapLayer *layer)
Sets the layer for which fields are listed in the combobox.
static void openHelp(const QString &key)
Opens help topic for the given help key using default system web browser.
QgsJoinDialog(QgsVectorLayer *layer, QList< QgsMapLayer * > alreadyJoinedLayers, QWidget *parent=nullptr, Qt::WindowFlags f=Qt::WindowFlags())
QgsVectorLayerJoinInfo joinInfo() const
Returns the join info.
bool createAttributeIndex() const
Returns true if user wants to create an attribute index on the join field.
void setJoinInfo(const QgsVectorLayerJoinInfo &joinInfo)
Configure the dialog for an existing join.
void layerChanged(QgsMapLayer *layer)
Emitted whenever the currently selected layer changes.
Base class for all map layer types.
virtual Q_INVOKABLE Qgis::VectorProviderCapabilities capabilities() const
Returns flags containing the supported capabilities.
Defines left outer join from our vector layer to some other vector layer.
void setDynamicFormEnabled(bool enabled)
Sets whether the form has to be dynamically updated with joined fields when a feature is being create...
void setUsingMemoryCache(bool enabled)
Sets whether values from the joined layer should be cached in memory to speed up lookups.
void setEditable(bool enabled)
Sets whether the form of the target layer allows editing joined fields.
bool isEditable() const
Returns whether joined fields may be edited through the form of the target layer.
void setCascadedDelete(bool enabled)
Sets whether a feature deleted on the target layer has to impact the joined layer by deleting the cor...
void setJoinFieldName(const QString &fieldName)
Sets name of the field of joined layer that will be used for join.
void setTargetFieldName(const QString &fieldName)
Sets name of the field of our layer that will be used for join.
void setUpsertOnEdit(bool enabled)
Sets whether a feature created on the target layer has to impact the joined layer by creating a new f...
void setPrefix(const QString &prefix)
Sets prefix of fields from the joined layer. If nullptr, joined layer's name will be used.
void setJoinLayer(QgsVectorLayer *layer)
Sets weak reference to the joined layer.
void setJoinFieldNamesSubset(QStringList *fieldNamesSubset)
Sets the subset of fields to be used from joined layer.
Represents a vector layer which manages a vector based dataset.
QgsVectorDataProvider * dataProvider() final
Returns the layer's data provider, it may be nullptr.