From 88452637c916909ce0fd7b9259e730aab149d5fb Mon Sep 17 00:00:00 2001 From: nirvn Date: Tue, 22 Jan 2019 09:02:27 +0700 Subject: [PATCH] [node editor] Always show node editor panel upon activating the node tool --- src/app/vertextool/qgsvertexeditor.cpp | 12 +++++------ src/app/vertextool/qgsvertextool.cpp | 30 ++++++++++++++++++-------- src/app/vertextool/qgsvertextool.h | 7 ++++-- 3 files changed, 32 insertions(+), 17 deletions(-) diff --git a/src/app/vertextool/qgsvertexeditor.cpp b/src/app/vertextool/qgsvertexeditor.cpp index c567acbc0cea..9c0c93ff1007 100644 --- a/src/app/vertextool/qgsvertexeditor.cpp +++ b/src/app/vertextool/qgsvertexeditor.cpp @@ -74,7 +74,7 @@ QgsVertexEditorModel::QgsVertexEditorModel( QgsVectorLayer *layer, QgsSelectedFe int QgsVertexEditorModel::rowCount( const QModelIndex &parent ) const { - if ( parent.isValid() ) + if ( parent.isValid() || !mSelectedFeature ) return 0; return mSelectedFeature->vertexMap().count(); @@ -88,7 +88,7 @@ int QgsVertexEditorModel::columnCount( const QModelIndex &parent ) const QVariant QgsVertexEditorModel::data( const QModelIndex &index, int role ) const { - if ( !index.isValid() || + if ( !index.isValid() || !mSelectedFeature || ( role != Qt::DisplayRole && role != Qt::EditRole && role != MIN_RADIUS_ROLE && role != Qt::FontRole ) ) return QVariant(); @@ -206,7 +206,7 @@ bool QgsVertexEditorModel::setData( const QModelIndex &index, const QVariant &va { return false; } - if ( index.row() >= mSelectedFeature->vertexMap().count() ) + if ( !mSelectedFeature || index.row() >= mSelectedFeature->vertexMap().count() ) { return false; } @@ -270,7 +270,7 @@ Qt::ItemFlags QgsVertexEditorModel::flags( const QModelIndex &index ) const bool QgsVertexEditorModel::calcR( int row, double &r, double &minRadius ) const { - if ( row <= 0 || row >= mSelectedFeature->vertexMap().count() - 1 ) + if ( row <= 0 || !mSelectedFeature || row >= mSelectedFeature->vertexMap().count() - 1 ) return false; const QgsVertexEntry *entry = mSelectedFeature->vertexMap().at( row ); @@ -333,7 +333,7 @@ void QgsVertexEditor::updateEditor( QgsVectorLayer *layer, QgsSelectedFeature *s void QgsVertexEditor::updateTableSelection() { - if ( mUpdatingVertexSelection ) + if ( !mSelectedFeature || mUpdatingVertexSelection ) return; mUpdatingTableSelection = true; @@ -360,7 +360,7 @@ void QgsVertexEditor::updateTableSelection() void QgsVertexEditor::updateVertexSelection( const QItemSelection &selected, const QItemSelection & ) { - if ( mUpdatingTableSelection ) + if ( !mSelectedFeature || mUpdatingTableSelection ) return; mUpdatingVertexSelection = true; diff --git a/src/app/vertextool/qgsvertextool.cpp b/src/app/vertextool/qgsvertextool.cpp index a0e42c33018c..234f2d4df527 100644 --- a/src/app/vertextool/qgsvertextool.cpp +++ b/src/app/vertextool/qgsvertextool.cpp @@ -282,6 +282,15 @@ QgsVertexTool::~QgsVertexTool() delete mEndpointMarker; } +void QgsVertexTool::activate() +{ + if ( QgisApp::instance() ) + { + showVertexEditor(); + } + QgsMapToolAdvancedDigitizing::activate(); +} + void QgsVertexTool::deactivate() { setHighlightedVertices( QList() ); @@ -1047,20 +1056,20 @@ void QgsVertexTool::onCachedGeometryDeleted( QgsFeatureId fid ) void QgsVertexTool::showVertexEditor() //#spellok { QgsPointLocator::Match m = mLastMouseMoveMatch; - if ( !m.isValid() || !m.layer() ) - return; - - mSelectedFeature.reset( new QgsSelectedFeature( m.featureId(), m.layer(), mCanvas ) ); - for ( int i = 0; i < mSelectedVertices.length(); ++i ) + if ( m.isValid() || m.layer() ) { - if ( mSelectedVertices.at( i ).layer == m.layer() && mSelectedVertices.at( i ).fid == m.featureId() ) + mSelectedFeature.reset( new QgsSelectedFeature( m.featureId(), m.layer(), mCanvas ) ); + for ( int i = 0; i < mSelectedVertices.length(); ++i ) { - mSelectedFeature->selectVertex( mSelectedVertices.at( i ).vertexId ); + if ( mSelectedVertices.at( i ).layer == m.layer() && mSelectedVertices.at( i ).fid == m.featureId() ) + { + mSelectedFeature->selectVertex( mSelectedVertices.at( i ).vertexId ); + } } } if ( !mVertexEditor ) { - mVertexEditor.reset( new QgsVertexEditor( m.layer(), mSelectedFeature.get(), mCanvas ) ); + mVertexEditor.reset( new QgsVertexEditor( m.layer() ? m.layer() : currentVectorLayer(), mSelectedFeature ? mSelectedFeature.get() : nullptr, mCanvas ) ); QgisApp::instance()->addDockWidget( Qt::LeftDockWidgetArea, mVertexEditor.get() ); connect( mVertexEditor.get(), &QgsVertexEditor::deleteSelectedRequested, this, &QgsVertexTool::deleteVertexEditorSelection ); connect( mVertexEditor.get(), &QgsVertexEditor::editorClosed, this, &QgsVertexTool::cleanupVertexEditor ); @@ -1070,7 +1079,10 @@ void QgsVertexTool::showVertexEditor() //#spellok mVertexEditor->updateEditor( m.layer(), mSelectedFeature.get() ); } - connect( mSelectedFeature->layer(), &QgsVectorLayer::featureDeleted, this, &QgsVertexTool::cleanEditor ); + if ( mSelectedFeature ) + { + connect( mSelectedFeature->layer(), &QgsVectorLayer::featureDeleted, this, &QgsVertexTool::cleanEditor ); + } } void QgsVertexTool::cleanupVertexEditor() diff --git a/src/app/vertextool/qgsvertextool.h b/src/app/vertextool/qgsvertextool.h index 1ff394792c9d..0314febe8d87 100644 --- a/src/app/vertextool/qgsvertextool.h +++ b/src/app/vertextool/qgsvertextool.h @@ -85,12 +85,17 @@ class APP_EXPORT QgsVertexTool : public QgsMapToolAdvancedDigitizing //! Start addition of a new vertex on double-click void canvasDoubleClickEvent( QgsMapMouseEvent *e ) override; + void activate() override; + void deactivate() override; void keyPressEvent( QKeyEvent *e ) override; QgsGeometry cachedGeometry( const QgsVectorLayer *layer, QgsFeatureId fid ); + //! Toggle the vertex editor + void showVertexEditor(); //#spellok + private slots: //! update geometry of our feature void onCachedGeometryChanged( QgsFeatureId fid, const QgsGeometry &geom ); @@ -99,8 +104,6 @@ class APP_EXPORT QgsVertexTool : public QgsMapToolAdvancedDigitizing void clearGeometryCache(); - void showVertexEditor(); //#spellok - void deleteVertexEditorSelection(); void validationErrorFound( const QgsGeometry::Error &e );