diff --git a/src/app/qgsjoindialog.cpp b/src/app/qgsjoindialog.cpp index c8b015393786..8dd6fe215dbb 100644 --- a/src/app/qgsjoindialog.cpp +++ b/src/app/qgsjoindialog.cpp @@ -25,7 +25,7 @@ #include -QgsJoinDialog::QgsJoinDialog( QgsVectorLayer* layer, QWidget * parent, Qt::WindowFlags f ) +QgsJoinDialog::QgsJoinDialog( QgsVectorLayer* layer, QList alreadyJoinedLayers, QWidget * parent, Qt::WindowFlags f ) : QDialog( parent, f ) , mLayer( layer ) { @@ -35,12 +35,13 @@ QgsJoinDialog::QgsJoinDialog( QgsVectorLayer* layer, QWidget * parent, Qt::Windo { return; } + // adds self layer to the joined layer (cannot join to itself) + alreadyJoinedLayers.append( layer ); mTargetFieldComboBox->setLayer( mLayer ); - mJoinLayerComboBox->setExceptedLayerList( QList() << mLayer ); + mJoinLayerComboBox->setExceptedLayerList( alreadyJoinedLayers ); connect( mJoinLayerComboBox, SIGNAL( layerChanged( QgsMapLayer* ) ), mJoinFieldComboBox, SLOT( setLayer( QgsMapLayer* ) ) ); connect( mJoinLayerComboBox, SIGNAL( layerChanged( QgsMapLayer* ) ), this, SLOT( joinedLayerChanged( QgsMapLayer* ) ) ); - connect( mJoinFieldComboBox, SIGNAL( fieldChanged( QString ) ), this, SLOT( allowAttrIndexCreation() ) ); mCacheInMemoryCheckBox->setChecked( true ); } @@ -66,14 +67,14 @@ void QgsJoinDialog::setJoinInfo( const QgsVectorJoinInfo& joinInfo ) } QStringList* lst = joinInfo.joinFieldNamesSubset(); - mUseJoinFieldsSubset->setChecked( lst->count() > 0 ); + mUseJoinFieldsSubset->setChecked( lst && lst->count() > 0 ); QAbstractItemModel* model = mJoinFieldsSubsetView->model(); if ( model ) { for ( int i = 0; i < model->rowCount(); ++i ) { QModelIndex index = model->index( i, 0 ); - if ( lst->contains( model->data( index, Qt::DisplayRole ).toString() ) ) + if ( lst && lst->contains( model->data( index, Qt::DisplayRole ).toString() ) ) { model->setData( index, Qt::Checked, Qt::CheckStateRole ); } diff --git a/src/app/qgsjoindialog.h b/src/app/qgsjoindialog.h index 8b6d3984e53a..49cb4e978f5f 100644 --- a/src/app/qgsjoindialog.h +++ b/src/app/qgsjoindialog.h @@ -27,7 +27,7 @@ class APP_EXPORT QgsJoinDialog: public QDialog, private Ui::QgsJoinDialogBase { Q_OBJECT public: - QgsJoinDialog( QgsVectorLayer* layer, QWidget * parent = 0, Qt::WindowFlags f = 0 ); + QgsJoinDialog( QgsVectorLayer* layer, QList alreadyJoinedLayers, QWidget * parent = 0, Qt::WindowFlags f = 0 ); ~QgsJoinDialog(); /** Configure the dialog for an existing join */ diff --git a/src/app/qgsvectorlayerproperties.cpp b/src/app/qgsvectorlayerproperties.cpp index bc105b2133ed..46d9ccbbba89 100644 --- a/src/app/qgsvectorlayerproperties.cpp +++ b/src/app/qgsvectorlayerproperties.cpp @@ -1031,26 +1031,33 @@ void QgsVectorLayerProperties::showListOfStylesFromDatabase() void QgsVectorLayerProperties::on_mButtonAddJoin_clicked() { - QgsJoinDialog d( layer ); + if ( !layer ) + return; + + QList joinedLayers; + const QList< QgsVectorJoinInfo >& joins = layer->vectorJoins(); + for ( int i = 0; i < joins.size(); ++i ) + { + joinedLayers.append( QgsMapLayerRegistry::instance()->mapLayer( joins[i].joinLayerId ) ); + } + + QgsJoinDialog d( layer, joinedLayers ); if ( d.exec() == QDialog::Accepted ) { QgsVectorJoinInfo info = d.joinInfo(); - if ( layer ) + //create attribute index if possible + if ( d.createAttributeIndex() ) { - //create attribute index if possible - if ( d.createAttributeIndex() ) + QgsVectorLayer* joinLayer = qobject_cast( QgsMapLayerRegistry::instance()->mapLayer( info.joinLayerId ) ); + if ( joinLayer ) { - QgsVectorLayer* joinLayer = qobject_cast( QgsMapLayerRegistry::instance()->mapLayer( info.joinLayerId ) ); - if ( joinLayer ) - { - joinLayer->dataProvider()->createAttributeIndex( joinLayer->pendingFields().indexFromName( info.joinFieldName ) ); - } + joinLayer->dataProvider()->createAttributeIndex( joinLayer->pendingFields().indexFromName( info.joinFieldName ) ); } - layer->addJoin( info ); - addJoinToTreeWidget( info ); - pbnQueryBuilder->setEnabled( layer && layer->dataProvider() && layer->dataProvider()->supportsSubsetString() && - !layer->isEditable() && layer->vectorJoins().size() < 1 ); } + layer->addJoin( info ); + addJoinToTreeWidget( info ); + pbnQueryBuilder->setEnabled( layer && layer->dataProvider() && layer->dataProvider()->supportsSubsetString() && + !layer->isEditable() && layer->vectorJoins().size() < 1 ); mFieldsPropertiesDialog->init(); } } @@ -1063,6 +1070,7 @@ void QgsVectorLayerProperties::on_mButtonEditJoin_clicked() return; } + QList joinedLayers; QString joinLayerId = currentJoinItem->data( 0, Qt::UserRole ).toString(); const QList< QgsVectorJoinInfo >& joins = layer->vectorJoins(); int j = -1; @@ -1071,7 +1079,11 @@ void QgsVectorLayerProperties::on_mButtonEditJoin_clicked() if ( joins[i].joinLayerId == joinLayerId ) { j = i; - break; + } + else + { + // remove already joined layers from possible list to be displayed in dialog + joinedLayers.append( QgsMapLayerRegistry::instance()->mapLayer( joins[i].joinLayerId ) ); } } if ( j == -1 ) @@ -1079,9 +1091,10 @@ void QgsVectorLayerProperties::on_mButtonEditJoin_clicked() return; } - QgsJoinDialog d( layer ); + QgsJoinDialog d( layer, joinedLayers ); d.setJoinInfo( joins[j] ); + if ( d.exec() == QDialog::Accepted ) { // remove old join @@ -1090,24 +1103,22 @@ void QgsVectorLayerProperties::on_mButtonEditJoin_clicked() // add the new edited QgsVectorJoinInfo info = d.joinInfo(); - if ( layer ) + + //create attribute index if possible + if ( d.createAttributeIndex() ) { - //create attribute index if possible - if ( d.createAttributeIndex() ) + QgsVectorLayer* joinLayer = qobject_cast( QgsMapLayerRegistry::instance()->mapLayer( info.joinLayerId ) ); + if ( joinLayer ) { - QgsVectorLayer* joinLayer = qobject_cast( QgsMapLayerRegistry::instance()->mapLayer( info.joinLayerId ) ); - if ( joinLayer ) - { - joinLayer->dataProvider()->createAttributeIndex( joinLayer->pendingFields().indexFromName( info.joinFieldName ) ); - } + joinLayer->dataProvider()->createAttributeIndex( joinLayer->pendingFields().indexFromName( info.joinFieldName ) ); } - layer->addJoin( info ); - addJoinToTreeWidget( info ); - - pbnQueryBuilder->setEnabled( layer && layer->dataProvider() && layer->dataProvider()->supportsSubsetString() && - !layer->isEditable() && layer->vectorJoins().size() < 1 ); - mFieldsPropertiesDialog->init(); } + layer->addJoin( info ); + addJoinToTreeWidget( info ); + + pbnQueryBuilder->setEnabled( layer && layer->dataProvider() && layer->dataProvider()->supportsSubsetString() && + !layer->isEditable() && layer->vectorJoins().size() < 1 ); + mFieldsPropertiesDialog->init(); } } diff --git a/src/gui/qgsmaplayercombobox.h b/src/gui/qgsmaplayercombobox.h index 930bd24b39af..651018372790 100644 --- a/src/gui/qgsmaplayercombobox.h +++ b/src/gui/qgsmaplayercombobox.h @@ -41,13 +41,13 @@ class GUI_EXPORT QgsMapLayerComboBox : public QComboBox explicit QgsMapLayerComboBox( QWidget *parent = 0 ); //! setFilters allows fitering according to layer type and/or geometry type. - void setFilters( QgsMapLayerProxyModel::Filters filters ) { mProxyModel->setFilters( filters ); } + void setFilters( QgsMapLayerProxyModel::Filters filters ) { mProxyModel->setFilters( filters ); } //! currently used filter on list layers QgsMapLayerProxyModel::Filters filters() const { return mProxyModel->filters(); } //! except a list of layers not to be listed - void setExceptedLayerList( QList layerList ) { mProxyModel->setExceptedLayerList( layerList ); } + void setExceptedLayerList( QList layerList ) { mProxyModel->setExceptedLayerList( layerList );} //! returns the list of excepted layers QList exceptedLayerList() const {return mProxyModel->exceptedLayerList();} diff --git a/src/ui/qgsjoindialogbase.ui b/src/ui/qgsjoindialogbase.ui index feccfe1a0549..18488858ae1d 100644 --- a/src/ui/qgsjoindialogbase.ui +++ b/src/ui/qgsjoindialogbase.ui @@ -7,49 +7,48 @@ 0 0 505 - 460 + 393 Add vector join - - + + Join layer - + + + + QgsMapLayerProxyModel::VectorLayer + + + + Join field - + + + + Target field - - - - Cache join layer in virtual memory - - + + - - - Create attribute index on join field - - - - Choose which fields are joined @@ -70,7 +69,7 @@ - + Custom field name prefix @@ -91,21 +90,14 @@ - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - + Qt::Vertical + + QSizePolicy::Expanding + 20 @@ -114,18 +106,29 @@ - - - - QgsMapLayerProxyModel::VectorLayer + + + + Cache join layer in virtual memory - - + + + + Create attribute index on join field + + - - + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + +