Skip to content

Commit 89e3fce

Browse files
authored
update model [vertex editor] (#9212)
* [vertex editor] update model instead of erasing/creating each time * do not save layer in model since it's already in the selected feature
1 parent 1c34329 commit 89e3fce

File tree

2 files changed

+44
-50
lines changed

2 files changed

+44
-50
lines changed

src/app/vertextool/qgsvertexeditor.cpp

+35-38
Original file line numberDiff line numberDiff line change
@@ -38,39 +38,38 @@
3838
static const int MIN_RADIUS_ROLE = Qt::UserRole + 1;
3939

4040

41-
QgsVertexEditorModel::QgsVertexEditorModel( QgsVectorLayer *layer, QgsSelectedFeature *selectedFeature, QgsMapCanvas *canvas, QObject *parent )
41+
QgsVertexEditorModel::QgsVertexEditorModel( QgsMapCanvas *canvas, QObject *parent )
4242
: QAbstractTableModel( parent )
43-
, mLayer( layer )
44-
, mSelectedFeature( selectedFeature )
4543
, mCanvas( canvas )
46-
, mHasZ( false )
47-
, mHasM( false )
48-
, mHasR( true ) //always show for now - avoids scanning whole feature for curves TODO - avoid this
49-
, mZCol( -1 )
50-
, mMCol( -1 )
51-
, mRCol( -1 )
5244
{
45+
QWidget *parentWidget = dynamic_cast< QWidget * >( parent );
46+
if ( parentWidget )
47+
mWidgetFont = parentWidget->font();
48+
}
5349

54-
QgsWkbTypes::Type layerWKBType = mLayer->wkbType();
50+
void QgsVertexEditorModel::setFeature( QgsSelectedFeature *selectedFeature )
51+
{
52+
beginResetModel();
5553

56-
mHasZ = QgsWkbTypes::hasZ( layerWKBType );
57-
mHasM = QgsWkbTypes::hasM( layerWKBType );
54+
mSelectedFeature = selectedFeature;
55+
if ( mSelectedFeature && mSelectedFeature->layer() )
56+
{
57+
QgsWkbTypes::Type layerWKBType = mSelectedFeature->layer()->wkbType();
5858

59-
if ( mHasZ )
60-
mZCol = 2;
59+
mHasZ = QgsWkbTypes::hasZ( layerWKBType );
60+
mHasM = QgsWkbTypes::hasM( layerWKBType );
6161

62-
if ( mHasM )
63-
mMCol = 2 + ( mHasZ ? 1 : 0 );
62+
if ( mHasZ )
63+
mZCol = 2;
6464

65-
if ( mHasR )
66-
mRCol = 2 + ( mHasZ ? 1 : 0 ) + ( mHasM ? 1 : 0 );
65+
if ( mHasM )
66+
mMCol = 2 + ( mHasZ ? 1 : 0 );
6767

68-
QWidget *parentWidget = dynamic_cast< QWidget * >( parent );
69-
if ( parentWidget )
70-
{
71-
mWidgetFont = parentWidget->font();
68+
if ( mHasR )
69+
mRCol = 2 + ( mHasZ ? 1 : 0 ) + ( mHasM ? 1 : 0 );
7270
}
7371

72+
endResetModel();
7473
}
7574

7675
int QgsVertexEditorModel::rowCount( const QModelIndex &parent ) const
@@ -84,7 +83,10 @@ int QgsVertexEditorModel::rowCount( const QModelIndex &parent ) const
8483
int QgsVertexEditorModel::columnCount( const QModelIndex &parent ) const
8584
{
8685
Q_UNUSED( parent );
87-
return 2 + ( mHasZ ? 1 : 0 ) + ( mHasM ? 1 : 0 ) + ( mHasR ? 1 : 0 );
86+
if ( !mSelectedFeature )
87+
return 0;
88+
else
89+
return 2 + ( mHasZ ? 1 : 0 ) + ( mHasM ? 1 : 0 ) + ( mHasR ? 1 : 0 );
8890
}
8991

9092
QVariant QgsVertexEditorModel::data( const QModelIndex &index, int role ) const
@@ -207,7 +209,7 @@ bool QgsVertexEditorModel::setData( const QModelIndex &index, const QVariant &va
207209
{
208210
return false;
209211
}
210-
if ( !mSelectedFeature || index.row() >= mSelectedFeature->vertexMap().count() )
212+
if ( !mSelectedFeature || !mSelectedFeature->layer() || index.row() >= mSelectedFeature->vertexMap().count() )
211213
{
212214
return false;
213215
}
@@ -247,10 +249,10 @@ bool QgsVertexEditorModel::setData( const QModelIndex &index, const QVariant &va
247249
double m = ( index.column() == mMCol ? value.toDouble() : mSelectedFeature->vertexMap().at( index.row() )->point().m() );
248250
QgsPoint p( QgsWkbTypes::PointZM, x, y, z, m );
249251

250-
mLayer->beginEditCommand( QObject::tr( "Moved vertices" ) );
251-
mLayer->moveVertex( p, mSelectedFeature->featureId(), index.row() );
252-
mLayer->endEditCommand();
253-
mLayer->triggerRepaint();
252+
mSelectedFeature->layer()->beginEditCommand( QObject::tr( "Moved vertices" ) );
253+
mSelectedFeature->layer()->moveVertex( p, mSelectedFeature->featureId(), index.row() );
254+
mSelectedFeature->layer()->endEditCommand();
255+
mSelectedFeature->layer()->triggerRepaint();
254256

255257
return false;
256258
}
@@ -296,6 +298,7 @@ bool QgsVertexEditorModel::calcR( int row, double &r, double &minRadius ) const
296298

297299
QgsVertexEditor::QgsVertexEditor( QgsMapCanvas *canvas )
298300
: mCanvas( canvas )
301+
, mVertexModel( new QgsVertexEditorModel( mCanvas, this ) )
299302
{
300303
setWindowTitle( tr( "Vertex Editor" ) );
301304
setObjectName( QStringLiteral( "VertexEditor" ) );
@@ -320,6 +323,8 @@ QgsVertexEditor::QgsVertexEditor( QgsMapCanvas *canvas )
320323
mTableView->setItemDelegateForColumn( 3, new CoordinateItemDelegate( this ) );
321324
mTableView->setItemDelegateForColumn( 4, new CoordinateItemDelegate( this ) );
322325
mTableView->setVisible( false );
326+
mTableView->setModel( mVertexModel );
327+
connect( mTableView->selectionModel(), &QItemSelectionModel::selectionChanged, this, &QgsVertexEditor::updateVertexSelection );
323328

324329
layout->addWidget( mTableView );
325330
layout->addWidget( mHintLabel );
@@ -329,24 +334,16 @@ QgsVertexEditor::QgsVertexEditor( QgsMapCanvas *canvas )
329334

330335
void QgsVertexEditor::updateEditor( QgsSelectedFeature *selectedFeature )
331336
{
332-
if ( mSelectedFeature )
333-
{
334-
delete mVertexModel;
335-
mVertexModel = nullptr;
336-
}
337337

338338
mSelectedFeature = selectedFeature;
339339

340+
mVertexModel->setFeature( mSelectedFeature );
341+
340342
if ( mSelectedFeature )
341343
{
342-
// TODO We really should just update the model itself.
343-
mVertexModel = new QgsVertexEditorModel( mSelectedFeature->layer(), mSelectedFeature, mCanvas, this );
344-
mTableView->setModel( mVertexModel );
345-
346344
mHintLabel->setVisible( false );
347345
mTableView->setVisible( true );
348346

349-
connect( mTableView->selectionModel(), &QItemSelectionModel::selectionChanged, this, &QgsVertexEditor::updateVertexSelection );
350347
connect( mSelectedFeature, &QgsSelectedFeature::selectionChanged, this, &QgsVertexEditor::updateTableSelection );
351348
}
352349
else

src/app/vertextool/qgsvertexeditor.h

+9-12
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
#include <QStyledItemDelegate>
2626

2727
class QgsMapCanvas;
28-
class QgsRubberBand;
2928
class QgsSelectedFeature;
3029
class QgsVectorLayer;
3130

@@ -37,9 +36,9 @@ class QgsVertexEditorModel : public QAbstractTableModel
3736
Q_OBJECT
3837
public:
3938

40-
QgsVertexEditorModel( QgsVectorLayer *layer,
41-
QgsSelectedFeature *selectedFeature,
42-
QgsMapCanvas *canvas, QObject *parent = nullptr );
39+
QgsVertexEditorModel( QgsMapCanvas *canvas, QObject *parent = nullptr );
40+
41+
void setFeature( QgsSelectedFeature *selectedFeature );
4342

4443
int rowCount( const QModelIndex &parent = QModelIndex() ) const override;
4544
int columnCount( const QModelIndex &parent = QModelIndex() ) const override;
@@ -49,18 +48,16 @@ class QgsVertexEditorModel : public QAbstractTableModel
4948
Qt::ItemFlags flags( const QModelIndex &index ) const override;
5049

5150
private:
52-
53-
QgsVectorLayer *mLayer = nullptr;
5451
QgsSelectedFeature *mSelectedFeature = nullptr;
5552
QgsMapCanvas *mCanvas = nullptr;
5653

57-
bool mHasZ;
58-
bool mHasM;
59-
bool mHasR;
54+
bool mHasZ = false;
55+
bool mHasM = false;
56+
bool mHasR = true; //always show for now - avoids scanning whole feature for curves TODO - avoid this
6057

61-
int mZCol;
62-
int mMCol;
63-
int mRCol;
58+
int mZCol = -1;
59+
int mMCol = -1;
60+
int mRCol = -1;
6461

6562
QFont mWidgetFont;
6663

0 commit comments

Comments
 (0)