From 55f86d5dfad2deddbd3e75509add91e4305c40d0 Mon Sep 17 00:00:00 2001 From: Matthias Kuhn Date: Mon, 22 Sep 2014 22:42:09 +0200 Subject: [PATCH] Fix re-initialization of dual view --- .../attributetable/qgsattributetableview.cpp | 11 +++++++- .../attributetable/qgsattributetableview.h | 3 ++ src/gui/attributetable/qgsdualview.cpp | 28 ++++++++++--------- src/gui/attributetable/qgsdualview.h | 1 + .../qgsrelationwidgetwrapper.cpp | 2 +- 5 files changed, 30 insertions(+), 15 deletions(-) diff --git a/src/gui/attributetable/qgsattributetableview.cpp b/src/gui/attributetable/qgsattributetableview.cpp index 95a7fec17f4..6e007d99fd9 100644 --- a/src/gui/attributetable/qgsattributetableview.cpp +++ b/src/gui/attributetable/qgsattributetableview.cpp @@ -118,8 +118,10 @@ void QgsAttributeTableView::setModel( QgsAttributeTableFilterModel* filterModel mFilterModel = filterModel; QTableView::setModel( filterModel ); + connect( mFilterModel, SIGNAL( destroyed() ), this, SLOT( modelDeleted() ) ); + delete mFeatureSelectionModel; - mFeatureSelectionModel = NULL; + mFeatureSelectionModel = 0; if ( filterModel ) { @@ -255,6 +257,13 @@ void QgsAttributeTableView::_q_selectRow( int row ) selectRow( row, false ); } +void QgsAttributeTableView::modelDeleted() +{ + mFilterModel = 0; + mFeatureSelectionManager = 0; + mFeatureSelectionModel = 0; +} + void QgsAttributeTableView::selectRow( int row, bool anchor ) { if ( selectionBehavior() == QTableView::SelectColumns diff --git a/src/gui/attributetable/qgsattributetableview.h b/src/gui/attributetable/qgsattributetableview.h index 93f55aa0c6b..218a86ae271 100644 --- a/src/gui/attributetable/qgsattributetableview.h +++ b/src/gui/attributetable/qgsattributetableview.h @@ -137,6 +137,9 @@ class GUI_EXPORT QgsAttributeTableView : public QTableView virtual void selectRow( int row ); virtual void _q_selectRow( int row ); + private slots: + void modelDeleted(); + private: void selectRow( int row, bool anchor ); QgsAttributeTableModel* mMasterModel; diff --git a/src/gui/attributetable/qgsdualview.cpp b/src/gui/attributetable/qgsdualview.cpp index 9544c8982e8..4c972b64694 100644 --- a/src/gui/attributetable/qgsdualview.cpp +++ b/src/gui/attributetable/qgsdualview.cpp @@ -37,6 +37,8 @@ QgsDualView::QgsDualView( QWidget* parent ) : QStackedWidget( parent ) , mEditorContext() , mMasterModel( 0 ) + , mFilterModel( 0 ) + , mFeatureListModel( 0 ) , mAttributeForm( 0 ) , mLayerCache( 0 ) , mProgressDlg( 0 ) @@ -78,7 +80,9 @@ void QgsDualView::init( QgsVectorLayer* layer, QgsMapCanvas* mapCanvas, const Qg connect( mAttributeForm, SIGNAL( attributeChanged( QString, QVariant ) ), this, SLOT( featureFormAttributeChanged() ) ); - if ( !mFeatureListPreviewButton->actions().count() ) + if ( mFeatureListPreviewButton->defaultAction() ) + mFeatureList->setDisplayExpression( mDisplayExpression ); + else columnBoxInit(); } @@ -143,21 +147,10 @@ void QgsDualView::columnBoxInit() } } - // now initialise the menu - QList< QAction* > previewActions = mFeatureListPreviewButton->actions(); - foreach ( QAction* a, previewActions ) - { - if ( a != mActionExpressionPreview ) - { - mPreviewActionMapper->removeMappings( a ); - delete a; - } - } - mFeatureListPreviewButton->addAction( mActionExpressionPreview ); mFeatureListPreviewButton->addAction( mActionPreviewColumnsMenu ); - foreach ( const QgsField& field, fields ) + Q_FOREACH( const QgsField& field, fields ) { if ( mLayerCache->layer()->editorWidgetV2( mLayerCache->layer()->fieldNameIndex( field.name() ) ) != "Hidden" ) { @@ -182,6 +175,7 @@ void QgsDualView::columnBoxInit() { mFeatureList->setDisplayExpression( displayExpression ); mFeatureListPreviewButton->setDefaultAction( mActionExpressionPreview ); + mDisplayExpression = mFeatureList->displayExpression(); } else { @@ -223,6 +217,10 @@ void QgsDualView::initLayerCache( QgsVectorLayer* layer ) void QgsDualView::initModels( QgsMapCanvas* mapCanvas, const QgsFeatureRequest& request ) { + delete mFeatureListModel; + delete mFilterModel; + delete mMasterModel; + mMasterModel = new QgsAttributeTableModel( mLayerCache, this ); mMasterModel->setRequest( request ); mMasterModel->setEditorContext( mEditorContext ); @@ -282,6 +280,8 @@ void QgsDualView::previewExpressionBuilder() mFeatureListPreviewButton->setDefaultAction( mActionExpressionPreview ); mFeatureListPreviewButton->setPopupMode( QToolButton::MenuButtonPopup ); } + + mDisplayExpression = mFeatureList->displayExpression(); } void QgsDualView::previewColumnChanged( QObject* action ) @@ -306,6 +306,8 @@ void QgsDualView::previewColumnChanged( QObject* action ) } } + mDisplayExpression = mFeatureList->displayExpression(); + Q_ASSERT( previewAction ); } diff --git a/src/gui/attributetable/qgsdualview.h b/src/gui/attributetable/qgsdualview.h index f8b79dd8ad4..298ebeb4380 100644 --- a/src/gui/attributetable/qgsdualview.h +++ b/src/gui/attributetable/qgsdualview.h @@ -232,6 +232,7 @@ class GUI_EXPORT QgsDualView : public QStackedWidget, private Ui::QgsDualViewBas QProgressDialog* mProgressDlg; QgsIFeatureSelectionManager* mFeatureSelectionManager; QgsDistanceArea mDistanceArea; + QString mDisplayExpression; friend class TestQgsDualView; }; diff --git a/src/gui/editorwidgets/qgsrelationwidgetwrapper.cpp b/src/gui/editorwidgets/qgsrelationwidgetwrapper.cpp index 1926feb50ba..cc93113ca10 100644 --- a/src/gui/editorwidgets/qgsrelationwidgetwrapper.cpp +++ b/src/gui/editorwidgets/qgsrelationwidgetwrapper.cpp @@ -34,7 +34,7 @@ QWidget* QgsRelationWidgetWrapper::createWidget( QWidget* parent ) void QgsRelationWidgetWrapper::setFeature( const QgsFeature& feature ) { - if ( mWidget ) + if ( mWidget && mRelation.isValid() ) mWidget->setRelationFeature( mRelation, feature ); }