From ac6c1312123b6b1a7cc09b3f58988ceea889de78 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Tue, 5 Dec 2017 14:04:41 +1000 Subject: [PATCH] Fix crash when reopening existing layouts --- python/gui/layout/qgslayoutviewtoolselect.sip | 1 + src/app/layout/qgslayoutdesignerdialog.cpp | 1 + src/gui/layout/qgslayoutmousehandles.cpp | 3 +++ src/gui/layout/qgslayoutviewtoolselect.cpp | 7 +++++++ src/gui/layout/qgslayoutviewtoolselect.h | 1 + 5 files changed, 13 insertions(+) diff --git a/python/gui/layout/qgslayoutviewtoolselect.sip b/python/gui/layout/qgslayoutviewtoolselect.sip index 8f79f7798dd..2a9449a0d71 100644 --- a/python/gui/layout/qgslayoutviewtoolselect.sip +++ b/python/gui/layout/qgslayoutviewtoolselect.sip @@ -25,6 +25,7 @@ class QgsLayoutViewToolSelect : QgsLayoutViewTool %Docstring Constructor for QgsLayoutViewToolSelect. %End + ~QgsLayoutViewToolSelect(); virtual void layoutPressEvent( QgsLayoutViewMouseEvent *event ); diff --git a/src/app/layout/qgslayoutdesignerdialog.cpp b/src/app/layout/qgslayoutdesignerdialog.cpp index 61e16f2014a..71aaaa51543 100644 --- a/src/app/layout/qgslayoutdesignerdialog.cpp +++ b/src/app/layout/qgslayoutdesignerdialog.cpp @@ -617,6 +617,7 @@ QgsLayout *QgsLayoutDesignerDialog::currentLayout() void QgsLayoutDesignerDialog::setCurrentLayout( QgsLayout *layout ) { + layout->deselectAll(); mLayout = layout; connect( mLayout, &QgsLayout::destroyed, this, &QgsLayoutDesignerDialog::close ); diff --git a/src/gui/layout/qgslayoutmousehandles.cpp b/src/gui/layout/qgslayoutmousehandles.cpp index 7a1ba237773..e2a1d116d67 100644 --- a/src/gui/layout/qgslayoutmousehandles.cpp +++ b/src/gui/layout/qgslayoutmousehandles.cpp @@ -311,6 +311,9 @@ bool QgsLayoutMouseHandles::selectionRotation( double &rotation ) const double QgsLayoutMouseHandles::rectHandlerBorderTolerance() { + if ( !mView ) + return 0; + //calculate size for resize handles //get view scale factor double viewScaleFactor = mView->transform().m11(); diff --git a/src/gui/layout/qgslayoutviewtoolselect.cpp b/src/gui/layout/qgslayoutviewtoolselect.cpp index 055e3443dd9..b0923a859a6 100644 --- a/src/gui/layout/qgslayoutviewtoolselect.cpp +++ b/src/gui/layout/qgslayoutviewtoolselect.cpp @@ -30,6 +30,12 @@ QgsLayoutViewToolSelect::QgsLayoutViewToolSelect( QgsLayoutView *view ) mRubberBand->setPen( QPen( QBrush( QColor( 254, 58, 29, 100 ) ), 0, Qt::DotLine ) ); } +QgsLayoutViewToolSelect::~QgsLayoutViewToolSelect() +{ + if ( mMouseHandles ) + mMouseHandles->deleteLater(); +} + void QgsLayoutViewToolSelect::layoutPressEvent( QgsLayoutViewMouseEvent *event ) { if ( mMouseHandles->shouldBlockEvent( event ) ) @@ -276,6 +282,7 @@ QgsLayoutMouseHandles *QgsLayoutViewToolSelect::mouseHandles() void QgsLayoutViewToolSelect::setLayout( QgsLayout *layout ) { // existing handles are owned by previous layout + mMouseHandles->deleteLater(); //add mouse selection handles to layout, and initially hide mMouseHandles = new QgsLayoutMouseHandles( layout, view() ); diff --git a/src/gui/layout/qgslayoutviewtoolselect.h b/src/gui/layout/qgslayoutviewtoolselect.h index e965ed58e79..19dc1ea2cc2 100644 --- a/src/gui/layout/qgslayoutviewtoolselect.h +++ b/src/gui/layout/qgslayoutviewtoolselect.h @@ -40,6 +40,7 @@ class GUI_EXPORT QgsLayoutViewToolSelect : public QgsLayoutViewTool * Constructor for QgsLayoutViewToolSelect. */ QgsLayoutViewToolSelect( QgsLayoutView *view SIP_TRANSFERTHIS ); + ~QgsLayoutViewToolSelect(); void layoutPressEvent( QgsLayoutViewMouseEvent *event ) override; void layoutMoveEvent( QgsLayoutViewMouseEvent *event ) override;