diff --git a/python/core/composer/qgscomposernodesitem.sip b/python/core/composer/qgscomposernodesitem.sip index da59396a739..bfffc54f088 100644 --- a/python/core/composer/qgscomposernodesitem.sip +++ b/python/core/composer/qgscomposernodesitem.sip @@ -87,6 +87,9 @@ class QgsComposerNodesItem: QgsComposerItem /** Method called in addNode. */ virtual bool _addNode( const int nodeIndex, const QPointF &newPoint, const double radius ) = 0; + /** Method called in removeNode. */ + virtual bool _removeNode( const int nodeIndex ) = 0; + /** Method called in paint. */ virtual void _draw( QPainter *painter ) = 0; diff --git a/python/core/composer/qgscomposerpolygon.sip b/python/core/composer/qgscomposerpolygon.sip index 4c6be2ec677..26e04d4136b 100644 --- a/python/core/composer/qgscomposerpolygon.sip +++ b/python/core/composer/qgscomposerpolygon.sip @@ -23,10 +23,10 @@ class QgsComposerPolygon: QgsComposerNodesItem protected: - /** Add the point newPoint at the given position according to some - * criteres. */ bool _addNode( const int indexPoint, const QPointF &newPoint, const double radius ); + bool _removeNode( const int indexPoint ); + /** Draw points for the current shape. */ void _draw( QPainter *painter ); diff --git a/python/core/composer/qgscomposerpolyline.sip b/python/core/composer/qgscomposerpolyline.sip index 3bd901d2fa9..365837ee250 100644 --- a/python/core/composer/qgscomposerpolyline.sip +++ b/python/core/composer/qgscomposerpolyline.sip @@ -23,10 +23,10 @@ class QgsComposerPolyline: QgsComposerNodesItem protected: - /** Add the point newPoint at the given position according to some - * criteres. */ bool _addNode( const int indexPoint, const QPointF &newPoint, const double radius ); + bool _removeNode( const int indexPoint ); + /** Draw points for the current shape. */ void _draw( QPainter *painter ); diff --git a/src/core/composer/qgscomposernodesitem.cpp b/src/core/composer/qgscomposernodesitem.cpp index 82cf11b5740..981a6b331af 100644 --- a/src/core/composer/qgscomposernodesitem.cpp +++ b/src/core/composer/qgscomposernodesitem.cpp @@ -255,27 +255,9 @@ bool QgsComposerNodesItem::nodePosition( const int index, QPointF &position ) bool QgsComposerNodesItem::removeNode( const int index ) { - bool rc( false ); - - if ( index >= 0 && index < mPolygon.size() ) - { - mPolygon.remove( index ); - - if ( mPolygon.size() < 3 ) - mPolygon.clear(); - else - { - int newSelectNode = index; - if ( index == mPolygon.size() ) - newSelectNode = 0; - setSelectedNode( newSelectNode ); - } - + bool rc = _removeNode( index ); + if ( rc ) updateSceneRect(); - - rc = true; - } - return rc; } diff --git a/src/core/composer/qgscomposernodesitem.h b/src/core/composer/qgscomposernodesitem.h index 9cbe7b036df..4e083078e19 100644 --- a/src/core/composer/qgscomposernodesitem.h +++ b/src/core/composer/qgscomposernodesitem.h @@ -128,6 +128,9 @@ class CORE_EXPORT QgsComposerNodesItem: public QgsComposerItem /** Method called in addNode. */ virtual bool _addNode( const int nodeIndex, const QPointF &newNode, const double radius ) = 0; + /** Method called in removeNode. */ + virtual bool _removeNode( const int nodeIndex ) = 0; + /** Method called in paint. */ virtual void _draw( QPainter *painter ) = 0; diff --git a/src/core/composer/qgscomposerpolygon.cpp b/src/core/composer/qgscomposerpolygon.cpp index 9b288ee06be..91b8e1a9ad9 100644 --- a/src/core/composer/qgscomposerpolygon.cpp +++ b/src/core/composer/qgscomposerpolygon.cpp @@ -120,3 +120,23 @@ void QgsComposerPolygon::_writeXMLStyle( QDomDocument &doc, QDomElement &elmt ) doc ); elmt.appendChild( pe ); } + +bool QgsComposerPolygon::_removeNode( const int index ) +{ + if ( index < 0 || index >= mPolygon.size() ) + return false; + + mPolygon.remove( index ); + + if ( mPolygon.size() < 3 ) + mPolygon.clear(); + else + { + int newSelectNode = index; + if ( index == mPolygon.size() ) + newSelectNode = 0; + setSelectedNode( newSelectNode ); + } + + return true; +} diff --git a/src/core/composer/qgscomposerpolygon.h b/src/core/composer/qgscomposerpolygon.h index d140396b533..c38b6a29906 100644 --- a/src/core/composer/qgscomposerpolygon.h +++ b/src/core/composer/qgscomposerpolygon.h @@ -69,6 +69,8 @@ class CORE_EXPORT QgsComposerPolygon: public QgsComposerNodesItem * criteres. */ bool _addNode( const int indexPoint, const QPointF &newPoint, const double radius ) override; + bool _removeNode( const int nodeIndex ) override; + /** Draw nodes for the current shape. */ void _draw( QPainter *painter ) override; diff --git a/src/core/composer/qgscomposerpolyline.cpp b/src/core/composer/qgscomposerpolyline.cpp index 1f7a82c089f..fc761b77232 100644 --- a/src/core/composer/qgscomposerpolyline.cpp +++ b/src/core/composer/qgscomposerpolyline.cpp @@ -59,6 +59,26 @@ bool QgsComposerPolyline::_addNode( const int indexPoint, return true; } +bool QgsComposerPolyline::_removeNode( const int index ) +{ + if ( index < 0 || index >= mPolygon.size() ) + return false; + + mPolygon.remove( index ); + + if ( mPolygon.size() < 2 ) + mPolygon.clear(); + else + { + int newSelectNode = index; + if ( index >= mPolygon.size() ) + newSelectNode = mPolygon.size() - 1; + setSelectedNode( newSelectNode ); + } + + return true; +} + void QgsComposerPolyline::createDefaultPolylineStyleSymbol() { QgsStringMap properties; diff --git a/src/core/composer/qgscomposerpolyline.h b/src/core/composer/qgscomposerpolyline.h index e57f90e3989..a8565a7685d 100644 --- a/src/core/composer/qgscomposerpolyline.h +++ b/src/core/composer/qgscomposerpolyline.h @@ -68,6 +68,8 @@ class CORE_EXPORT QgsComposerPolyline: public QgsComposerNodesItem * criteres. */ bool _addNode( const int indexPoint, const QPointF &newPoint, const double radius ) override; + bool _removeNode( const int nodeIndex ) override; + /** Draw nodes for the current shape. */ void _draw( QPainter *painter ) override; diff --git a/src/gui/qgscomposerview.cpp b/src/gui/qgscomposerview.cpp index 2cab673de7b..0b1c9af5eeb 100644 --- a/src/gui/qgscomposerview.cpp +++ b/src/gui/qgscomposerview.cpp @@ -1577,27 +1577,24 @@ void QgsComposerView::deleteSelectedItems() if ( mNodesItemIndex != -1 ) { composition()->beginCommand( mNodesItem, tr( "Remove item node" ) ); - bool rc = mNodesItem->removeNode( mNodesItemIndex ); - composition()->endCommand(); - - bool nodeDeleted = true; - if ( rc ) + if ( mNodesItem->removeNode( mNodesItemIndex ) ) { - mNodesItemIndex = mNodesItem->selectedNode(); - - if ( mNodesItemIndex != -1 ) + composition()->endCommand(); + if ( mNodesItem->nodesSize() > 0 ) { - nodeDeleted = false; - setSelectedNode( mNodesItem, mNodesItemIndex ); + mNodesItemIndex = mNodesItem->selectedNode(); + // setSelectedNode( mNodesItem, mNodesItemIndex ); + } + else + { + mNodesItemIndex = -1; + mNodesItem = nullptr; } - } - - if ( nodeDeleted ) - { scene()->update(); - - mNodesItemIndex = -1; - mNodesItem = nullptr; + } + else + { + composition()->cancelCommand(); } } } diff --git a/tests/src/python/test_qgscomposerpolygon.py b/tests/src/python/test_qgscomposerpolygon.py index 8f0625ef4a9..926cb5f1b09 100644 --- a/tests/src/python/test_qgscomposerpolygon.py +++ b/tests/src/python/test_qgscomposerpolygon.py @@ -139,15 +139,6 @@ class TestQgsComposerPolygon(unittest.TestCase): assert myTestResult, myMessage self.assertEqual(self.mComposerPolygon.nodesSize(), 4) - rc = self.mComposerPolygon.removeNode(3) - self.assertEqual(rc, True) - self.assertEqual(self.mComposerPolygon.nodesSize(), 3) - - checker = QgsCompositionChecker( - 'composerpolygon_removednode', self.mComposition) - checker.setControlPathPrefix("composer_polygon") - myTestResult, myMessage = checker.testComposition() - assert myTestResult, myMessage def testAddNode(self): """Test addNode method"""