Skip to content

Commit 48f9d5f

Browse files
uclaroswonder-sk
authored andcommitted
Enable point cloud layer editing in the gui
1 parent d2aaa9c commit 48f9d5f

File tree

4 files changed

+177
-23
lines changed

4 files changed

+177
-23
lines changed

src/app/pointcloud/qgspointcloudlayerproperties.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ void QgsPointCloudLayerProperties::syncToLayer()
185185
txtSubsetSQL->setReadOnly( true );
186186
txtSubsetSQL->setCaretWidth( 0 );
187187
txtSubsetSQL->setCaretLineVisible( false );
188-
pbnQueryBuilder->setEnabled( mLayer->dataProvider() && mLayer->dataProvider()->supportsSubsetString() );
188+
pbnQueryBuilder->setEnabled( mLayer->dataProvider() && mLayer->dataProvider()->supportsSubsetString() && !mLayer->isEditable() );
189189

190190
for ( QgsMapLayerConfigWidget *w : std::as_const( mConfigWidgets ) )
191191
w->syncToLayer( mLayer );

src/app/qgisapp.cpp

+153-13
Original file line numberDiff line numberDiff line change
@@ -10609,11 +10609,12 @@ bool QgisApp::toggleEditing( QgsMapLayer *layer, bool allowCancel )
1060910609
return toggleEditingVectorLayer( qobject_cast<QgsVectorLayer *>( layer ), allowCancel );
1061010610
case Qgis::LayerType::Mesh:
1061110611
return toggleEditingMeshLayer( qobject_cast<QgsMeshLayer *>( layer ), allowCancel );
10612+
case Qgis::LayerType::PointCloud:
10613+
return toggleEditingPointCloudLayer( qobject_cast<QgsPointCloudLayer *>( layer ), allowCancel );
1061210614
case Qgis::LayerType::Raster:
1061310615
case Qgis::LayerType::Plugin:
1061410616
case Qgis::LayerType::VectorTile:
1061510617
case Qgis::LayerType::Annotation:
10616-
case Qgis::LayerType::PointCloud:
1061710618
case Qgis::LayerType::Group:
1061810619
case Qgis::LayerType::TiledScene:
1061910620
break;
@@ -10912,6 +10913,89 @@ bool QgisApp::toggleEditingMeshLayer( QgsMeshLayer *mlayer, bool allowCancel )
1091210913
return res;
1091310914
}
1091410915

10916+
bool QgisApp::toggleEditingPointCloudLayer( QgsPointCloudLayer *pclayer, bool allowCancel )
10917+
{
10918+
if ( !pclayer )
10919+
return false;
10920+
10921+
if ( !pclayer->supportsEditing() )
10922+
return false;
10923+
10924+
bool res = false;
10925+
10926+
if ( !pclayer->isEditable() )
10927+
{
10928+
res = pclayer->startEditing();
10929+
10930+
if ( !res )
10931+
{
10932+
visibleMessageBar()->pushWarning(
10933+
tr( "Start editing failed" ),
10934+
tr( "Provider cannot be opened for editing" )
10935+
);
10936+
}
10937+
10938+
mActionToggleEditing->setChecked( res );
10939+
}
10940+
else if ( pclayer->isModified() )
10941+
{
10942+
QMessageBox::StandardButtons buttons = QMessageBox::Save | QMessageBox::Discard;
10943+
if ( allowCancel )
10944+
buttons = buttons | QMessageBox::Cancel;
10945+
switch ( QMessageBox::question( nullptr, tr( "Stop Editing" ), tr( "Do you want to save the changes to layer %1?" ).arg( pclayer->name() ), buttons ) )
10946+
{
10947+
case QMessageBox::Cancel:
10948+
res = false;
10949+
break;
10950+
10951+
case QMessageBox::Save:
10952+
{
10953+
QgsTemporaryCursorOverride waitCursor( Qt::WaitCursor );
10954+
QgsCanvasRefreshBlocker refreshBlocker;
10955+
if ( !pclayer->commitChanges( true ) )
10956+
{
10957+
visibleMessageBar()->pushWarning(
10958+
tr( "Stop editing" ),
10959+
tr( "Unable to save editing for layer \"%1\"" ).arg( pclayer->name() )
10960+
);
10961+
res = false;
10962+
}
10963+
}
10964+
break;
10965+
case QMessageBox::Discard:
10966+
{
10967+
QgsTemporaryCursorOverride waitCursor( Qt::WaitCursor );
10968+
QgsCanvasRefreshBlocker refreshBlocker;
10969+
if ( !pclayer->rollBack() )
10970+
{
10971+
visibleMessageBar()->pushMessage( tr( "Error" ), tr( "Problems during roll back" ), Qgis::MessageLevel::Critical );
10972+
res = false;
10973+
}
10974+
break;
10975+
}
10976+
10977+
default:
10978+
break;
10979+
}
10980+
}
10981+
else //layer not modified
10982+
{
10983+
QgsTemporaryCursorOverride waitCursor( Qt::WaitCursor );
10984+
QgsCanvasRefreshBlocker refreshBlocker;
10985+
pclayer->rollBack();
10986+
}
10987+
10988+
if ( !res && pclayer == activeLayer() )
10989+
{
10990+
// while also called when layer sends editingStarted/editingStopped signals,
10991+
// this ensures correct restoring of gui state if toggling was canceled
10992+
// or layer commit/rollback functions failed
10993+
activateDeactivateLayerRelatedActions( pclayer );
10994+
}
10995+
10996+
return res;
10997+
}
10998+
1091510999
void QgisApp::saveActiveLayerEdits()
1091611000
{
1091711001
saveEdits( activeLayer(), true, true );
@@ -10928,11 +11012,12 @@ void QgisApp::saveEdits( QgsMapLayer *layer, bool leaveEditable, bool triggerRep
1092811012
return saveVectorLayerEdits( layer, leaveEditable, triggerRepaint );
1092911013
case Qgis::LayerType::Mesh:
1093011014
return saveMeshLayerEdits( layer, leaveEditable, triggerRepaint );
11015+
case Qgis::LayerType::PointCloud:
11016+
return savePointCloudLayerEdits( layer, leaveEditable, triggerRepaint );
1093111017
case Qgis::LayerType::Raster:
1093211018
case Qgis::LayerType::Plugin:
1093311019
case Qgis::LayerType::VectorTile:
1093411020
case Qgis::LayerType::Annotation:
10935-
case Qgis::LayerType::PointCloud:
1093611021
case Qgis::LayerType::Group:
1093711022
case Qgis::LayerType::TiledScene:
1093811023
break;
@@ -10986,6 +11071,29 @@ void QgisApp::saveMeshLayerEdits( QgsMapLayer *layer, bool leaveEditable, bool t
1098611071
}
1098711072
}
1098811073

11074+
void QgisApp::savePointCloudLayerEdits( QgsMapLayer *layer, bool leaveEditable, bool triggerRepaint )
11075+
{
11076+
QgsPointCloudLayer *pclayer = qobject_cast<QgsPointCloudLayer *>( layer );
11077+
if ( !pclayer || !pclayer->isEditable() || !pclayer->isModified() )
11078+
return;
11079+
11080+
if ( pclayer == activeLayer() )
11081+
mSaveRollbackInProgress = true;
11082+
11083+
QgsCanvasRefreshBlocker refreshBlocker;
11084+
11085+
if ( !pclayer->commitChanges( !leaveEditable ) )
11086+
visibleMessageBar()->pushWarning(
11087+
tr( "Save edits" ),
11088+
tr( "Unable to save editing for layer \"%1\"" ).arg( pclayer->name() )
11089+
);
11090+
11091+
if ( triggerRepaint )
11092+
{
11093+
pclayer->triggerRepaint();
11094+
}
11095+
}
11096+
1098911097
void QgisApp::cancelEdits( QgsMapLayer *layer, bool leaveEditable, bool triggerRepaint )
1099011098
{
1099111099
if ( !layer )
@@ -10997,11 +11105,12 @@ void QgisApp::cancelEdits( QgsMapLayer *layer, bool leaveEditable, bool triggerR
1099711105
return cancelVectorLayerEdits( layer, leaveEditable, triggerRepaint );
1099811106
case Qgis::LayerType::Mesh:
1099911107
return cancelMeshLayerEdits( layer, leaveEditable, triggerRepaint );
11108+
case Qgis::LayerType::PointCloud:
11109+
return cancelPointCloudLayerEdits( layer, leaveEditable, triggerRepaint );
1100011110
case Qgis::LayerType::Raster:
1100111111
case Qgis::LayerType::Plugin:
1100211112
case Qgis::LayerType::VectorTile:
1100311113
case Qgis::LayerType::Annotation:
11004-
case Qgis::LayerType::PointCloud:
1100511114
case Qgis::LayerType::Group:
1100611115
case Qgis::LayerType::TiledScene:
1100711116
break;
@@ -11058,6 +11167,32 @@ void QgisApp::cancelMeshLayerEdits( QgsMapLayer *layer, bool leaveEditable, bool
1105811167
}
1105911168
}
1106011169

11170+
void QgisApp::cancelPointCloudLayerEdits( QgsMapLayer *layer, bool leaveEditable, bool triggerRepaint )
11171+
{
11172+
QgsPointCloudLayer *pclayer = qobject_cast<QgsPointCloudLayer *>( layer );
11173+
if ( !pclayer || !pclayer->isEditable() )
11174+
return;
11175+
11176+
if ( pclayer == activeLayer() && leaveEditable )
11177+
mSaveRollbackInProgress = true;
11178+
11179+
QgsCanvasRefreshBlocker refreshBlocker;
11180+
11181+
if ( !pclayer->rollBack() )
11182+
{
11183+
mSaveRollbackInProgress = false;
11184+
QMessageBox::warning( nullptr, tr( "Error" ), tr( "Could not %1 changes to layer %2" ).arg( leaveEditable ? tr( "rollback" ) : tr( "cancel" ), pclayer->name() ) );
11185+
}
11186+
11187+
if ( leaveEditable )
11188+
{
11189+
pclayer->startEditing();
11190+
}
11191+
if ( triggerRepaint )
11192+
{
11193+
pclayer->triggerRepaint();
11194+
}
11195+
}
1106111196
void QgisApp::enableMeshEditingTools( bool enable )
1106211197
{
1106311198
if ( !mMapTools )
@@ -11196,16 +11331,15 @@ void QgisApp::updateLayerModifiedActions()
1119611331
}
1119711332
break;
1119811333
case Qgis::LayerType::Mesh:
11334+
case Qgis::LayerType::PointCloud:
1119911335
{
11200-
QgsMeshLayer *mlayer = qobject_cast<QgsMeshLayer *>( currentLayer );
11201-
enableSaveLayerEdits = ( mlayer->isEditable() && mlayer->isModified() );
11336+
enableSaveLayerEdits = currentLayer->isEditable() && currentLayer->isModified();
1120211337
}
1120311338
break;
1120411339
case Qgis::LayerType::Raster:
1120511340
case Qgis::LayerType::Plugin:
1120611341
case Qgis::LayerType::VectorTile:
1120711342
case Qgis::LayerType::Annotation:
11208-
case Qgis::LayerType::PointCloud:
1120911343
case Qgis::LayerType::Group:
1121011344
case Qgis::LayerType::TiledScene:
1121111345
break;
@@ -15371,7 +15505,12 @@ void QgisApp::activateDeactivateLayerRelatedActions( QgsMapLayer *layer )
1537115505

1537215506
case Qgis::LayerType::PointCloud:
1537315507
{
15508+
QgsPointCloudLayer *pcLayer = qobject_cast<QgsPointCloudLayer *>( layer );
1537415509
const QgsDataProvider *dprovider = layer->dataProvider();
15510+
15511+
const bool isEditable = pcLayer->isEditable();
15512+
const bool canSupportEditing = pcLayer->supportsEditing();
15513+
1537515514
mActionLocalHistogramStretch->setEnabled( false );
1537615515
mActionFullHistogramStretch->setEnabled( false );
1537715516
mActionLocalCumulativeCutStretch->setEnabled( false );
@@ -15382,7 +15521,7 @@ void QgisApp::activateDeactivateLayerRelatedActions( QgsMapLayer *layer )
1538215521
mActionDecreaseContrast->setEnabled( false );
1538315522
mActionIncreaseGamma->setEnabled( false );
1538415523
mActionDecreaseGamma->setEnabled( false );
15385-
mActionLayerSubsetString->setEnabled( dprovider && dprovider->supportsSubsetString() );
15524+
mActionLayerSubsetString->setEnabled( !isEditable && dprovider && dprovider->supportsSubsetString() );
1538615525
mActionFeatureAction->setEnabled( false );
1538715526
mActionSelectFeatures->setEnabled( false );
1538815527
mActionSelectPolygon->setEnabled( false );
@@ -15401,12 +15540,12 @@ void QgisApp::activateDeactivateLayerRelatedActions( QgsMapLayer *layer )
1540115540
mActionSelectByExpression->setEnabled( false );
1540215541
mActionSelectByForm->setEnabled( false );
1540315542
mActionOpenFieldCalc->setEnabled( false );
15404-
mActionToggleEditing->setEnabled( false );
15405-
mActionToggleEditing->setChecked( false );
15406-
mActionSaveLayerEdits->setEnabled( false );
15407-
mUndoDock->widget()->setEnabled( false );
15408-
mActionUndo->setEnabled( false );
15409-
mActionRedo->setEnabled( false );
15543+
mActionToggleEditing->setEnabled( canSupportEditing );
15544+
mActionToggleEditing->setChecked( canSupportEditing && isEditable );
15545+
mActionSaveLayerEdits->setEnabled( canSupportEditing && isEditable && pcLayer->isModified() );
15546+
mUndoDock->widget()->setEnabled( canSupportEditing && isEditable );
15547+
mActionUndo->setEnabled( canSupportEditing && isEditable );
15548+
mActionRedo->setEnabled( canSupportEditing && isEditable );
1541015549
mActionSaveLayerDefinition->setEnabled( true );
1541115550
mActionLayerSaveAs->setEnabled( false );
1541215551
mActionAddFeature->setEnabled( false );
@@ -15437,6 +15576,7 @@ void QgisApp::activateDeactivateLayerRelatedActions( QgsMapLayer *layer )
1543715576
mActionIdentify->setEnabled( true );
1543815577
mDigitizingTechniqueManager->enableDigitizingTechniqueActions( false );
1543915578
enableMeshEditingTools( false );
15579+
updateUndoActions();
1544015580
break;
1544115581
}
1544215582
case Qgis::LayerType::Plugin:

src/app/qgisapp.h

+19
Original file line numberDiff line numberDiff line change
@@ -2378,6 +2378,11 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
23782378
*/
23792379
bool toggleEditingMeshLayer( QgsMeshLayer *vlayer, bool allowCancel = true );
23802380

2381+
/**
2382+
* Starts/stops for a point cloud layer \a pclayer
2383+
*/
2384+
bool toggleEditingPointCloudLayer( QgsPointCloudLayer *pclayer, bool allowCancel = true );
2385+
23812386
/**
23822387
* Saves edits of a vector layer
23832388
* \param leaveEditable leave the layer in editing mode when done
@@ -2392,6 +2397,13 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
23922397
*/
23932398
void saveMeshLayerEdits( QgsMapLayer *layer, bool leaveEditable = true, bool triggerRepaint = true );
23942399

2400+
/**
2401+
* Saves edits of a point cloud layer
2402+
* \param leaveEditable leave the layer in editing mode when done
2403+
* \param triggerRepaint send layer signal to repaint canvas when done
2404+
*/
2405+
void savePointCloudLayerEdits( QgsMapLayer *layer, bool leaveEditable = true, bool triggerRepaint = true );
2406+
23952407
/**
23962408
* Cancels edits of a vector layer
23972409
* \param leaveEditable leave the layer in editing mode when done
@@ -2406,6 +2418,13 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
24062418
*/
24072419
void cancelMeshLayerEdits( QgsMapLayer *layer, bool leaveEditable = true, bool triggerRepaint = true );
24082420

2421+
/**
2422+
* Cancels edits of a point cloud layer
2423+
* \param leaveEditable leave the layer in editing mode when done
2424+
* \param triggerRepaint send layer signal to repaint canvas when done
2425+
*/
2426+
void cancelPointCloudLayerEdits( QgsMapLayer *layer, bool leaveEditable = true, bool triggerRepaint = true );
2427+
24092428
/**
24102429
* Enables/Disables mesh frame editing tools
24112430
*/

src/app/qgsapplayertreeviewmenuprovider.cpp

+4-9
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,7 @@ QMenu *QgsAppLayerTreeViewMenuProvider::createContextMenu()
377377

378378
menu->addSeparator();
379379

380-
if ( vlayer || meshLayer )
380+
if ( vlayer || meshLayer || pcLayer )
381381
{
382382
QAction *toggleEditingAction = QgisApp::instance()->actionToggleEditing();
383383
QAction *saveLayerEditsAction = QgisApp::instance()->actionSaveActiveLayerEdits();
@@ -410,17 +410,12 @@ QMenu *QgsAppLayerTreeViewMenuProvider::createContextMenu()
410410

411411
if ( allEditsAction->isEnabled() )
412412
menu->addAction( allEditsAction );
413-
414-
if ( vlayer && vlayer->dataProvider() && vlayer->dataProvider()->supportsSubsetString() )
415-
{
416-
QAction *action = menu->addAction( tr( "&Filter…" ), QgisApp::instance(), qOverload<>( &QgisApp::layerSubsetString ) );
417-
action->setEnabled( !vlayer->isEditable() );
418-
}
419413
}
420414

421-
if ( ( rlayer && rlayer->dataProvider() && rlayer->dataProvider()->supportsSubsetString() ) || ( pcLayer && pcLayer->dataProvider() && pcLayer->dataProvider()->supportsSubsetString() ) )
415+
if ( layer && layer->dataProvider() && layer->dataProvider()->supportsSubsetString() )
422416
{
423-
menu->addAction( tr( "&Filter…" ), QgisApp::instance(), qOverload<>( &QgisApp::layerSubsetString ) );
417+
QAction *action = menu->addAction( tr( "&Filter…" ), QgisApp::instance(), qOverload<>( &QgisApp::layerSubsetString ) );
418+
action->setEnabled( !layer->isEditable() );
424419
}
425420

426421
// change data source is only supported for vectors, rasters, point clouds, mesh, some vector tile layers

0 commit comments

Comments
 (0)