@@ -10609,11 +10609,12 @@ bool QgisApp::toggleEditing( QgsMapLayer *layer, bool allowCancel )
10609
10609
return toggleEditingVectorLayer( qobject_cast<QgsVectorLayer *>( layer ), allowCancel );
10610
10610
case Qgis::LayerType::Mesh:
10611
10611
return toggleEditingMeshLayer( qobject_cast<QgsMeshLayer *>( layer ), allowCancel );
10612
+ case Qgis::LayerType::PointCloud:
10613
+ return toggleEditingPointCloudLayer( qobject_cast<QgsPointCloudLayer *>( layer ), allowCancel );
10612
10614
case Qgis::LayerType::Raster:
10613
10615
case Qgis::LayerType::Plugin:
10614
10616
case Qgis::LayerType::VectorTile:
10615
10617
case Qgis::LayerType::Annotation:
10616
- case Qgis::LayerType::PointCloud:
10617
10618
case Qgis::LayerType::Group:
10618
10619
case Qgis::LayerType::TiledScene:
10619
10620
break;
@@ -10912,6 +10913,89 @@ bool QgisApp::toggleEditingMeshLayer( QgsMeshLayer *mlayer, bool allowCancel )
10912
10913
return res;
10913
10914
}
10914
10915
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
+
10915
10999
void QgisApp::saveActiveLayerEdits()
10916
11000
{
10917
11001
saveEdits( activeLayer(), true, true );
@@ -10928,11 +11012,12 @@ void QgisApp::saveEdits( QgsMapLayer *layer, bool leaveEditable, bool triggerRep
10928
11012
return saveVectorLayerEdits( layer, leaveEditable, triggerRepaint );
10929
11013
case Qgis::LayerType::Mesh:
10930
11014
return saveMeshLayerEdits( layer, leaveEditable, triggerRepaint );
11015
+ case Qgis::LayerType::PointCloud:
11016
+ return savePointCloudLayerEdits( layer, leaveEditable, triggerRepaint );
10931
11017
case Qgis::LayerType::Raster:
10932
11018
case Qgis::LayerType::Plugin:
10933
11019
case Qgis::LayerType::VectorTile:
10934
11020
case Qgis::LayerType::Annotation:
10935
- case Qgis::LayerType::PointCloud:
10936
11021
case Qgis::LayerType::Group:
10937
11022
case Qgis::LayerType::TiledScene:
10938
11023
break;
@@ -10986,6 +11071,29 @@ void QgisApp::saveMeshLayerEdits( QgsMapLayer *layer, bool leaveEditable, bool t
10986
11071
}
10987
11072
}
10988
11073
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
+
10989
11097
void QgisApp::cancelEdits( QgsMapLayer *layer, bool leaveEditable, bool triggerRepaint )
10990
11098
{
10991
11099
if ( !layer )
@@ -10997,11 +11105,12 @@ void QgisApp::cancelEdits( QgsMapLayer *layer, bool leaveEditable, bool triggerR
10997
11105
return cancelVectorLayerEdits( layer, leaveEditable, triggerRepaint );
10998
11106
case Qgis::LayerType::Mesh:
10999
11107
return cancelMeshLayerEdits( layer, leaveEditable, triggerRepaint );
11108
+ case Qgis::LayerType::PointCloud:
11109
+ return cancelPointCloudLayerEdits( layer, leaveEditable, triggerRepaint );
11000
11110
case Qgis::LayerType::Raster:
11001
11111
case Qgis::LayerType::Plugin:
11002
11112
case Qgis::LayerType::VectorTile:
11003
11113
case Qgis::LayerType::Annotation:
11004
- case Qgis::LayerType::PointCloud:
11005
11114
case Qgis::LayerType::Group:
11006
11115
case Qgis::LayerType::TiledScene:
11007
11116
break;
@@ -11058,6 +11167,32 @@ void QgisApp::cancelMeshLayerEdits( QgsMapLayer *layer, bool leaveEditable, bool
11058
11167
}
11059
11168
}
11060
11169
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
+ }
11061
11196
void QgisApp::enableMeshEditingTools( bool enable )
11062
11197
{
11063
11198
if ( !mMapTools )
@@ -11196,16 +11331,15 @@ void QgisApp::updateLayerModifiedActions()
11196
11331
}
11197
11332
break;
11198
11333
case Qgis::LayerType::Mesh:
11334
+ case Qgis::LayerType::PointCloud:
11199
11335
{
11200
- QgsMeshLayer *mlayer = qobject_cast<QgsMeshLayer *>( currentLayer );
11201
- enableSaveLayerEdits = ( mlayer->isEditable() && mlayer->isModified() );
11336
+ enableSaveLayerEdits = currentLayer->isEditable() && currentLayer->isModified();
11202
11337
}
11203
11338
break;
11204
11339
case Qgis::LayerType::Raster:
11205
11340
case Qgis::LayerType::Plugin:
11206
11341
case Qgis::LayerType::VectorTile:
11207
11342
case Qgis::LayerType::Annotation:
11208
- case Qgis::LayerType::PointCloud:
11209
11343
case Qgis::LayerType::Group:
11210
11344
case Qgis::LayerType::TiledScene:
11211
11345
break;
@@ -15371,7 +15505,12 @@ void QgisApp::activateDeactivateLayerRelatedActions( QgsMapLayer *layer )
15371
15505
15372
15506
case Qgis::LayerType::PointCloud:
15373
15507
{
15508
+ QgsPointCloudLayer *pcLayer = qobject_cast<QgsPointCloudLayer *>( layer );
15374
15509
const QgsDataProvider *dprovider = layer->dataProvider();
15510
+
15511
+ const bool isEditable = pcLayer->isEditable();
15512
+ const bool canSupportEditing = pcLayer->supportsEditing();
15513
+
15375
15514
mActionLocalHistogramStretch->setEnabled( false );
15376
15515
mActionFullHistogramStretch->setEnabled( false );
15377
15516
mActionLocalCumulativeCutStretch->setEnabled( false );
@@ -15382,7 +15521,7 @@ void QgisApp::activateDeactivateLayerRelatedActions( QgsMapLayer *layer )
15382
15521
mActionDecreaseContrast->setEnabled( false );
15383
15522
mActionIncreaseGamma->setEnabled( false );
15384
15523
mActionDecreaseGamma->setEnabled( false );
15385
- mActionLayerSubsetString->setEnabled( dprovider && dprovider->supportsSubsetString() );
15524
+ mActionLayerSubsetString->setEnabled( !isEditable && dprovider && dprovider->supportsSubsetString() );
15386
15525
mActionFeatureAction->setEnabled( false );
15387
15526
mActionSelectFeatures->setEnabled( false );
15388
15527
mActionSelectPolygon->setEnabled( false );
@@ -15401,12 +15540,12 @@ void QgisApp::activateDeactivateLayerRelatedActions( QgsMapLayer *layer )
15401
15540
mActionSelectByExpression->setEnabled( false );
15402
15541
mActionSelectByForm->setEnabled( false );
15403
15542
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 );
15410
15549
mActionSaveLayerDefinition->setEnabled( true );
15411
15550
mActionLayerSaveAs->setEnabled( false );
15412
15551
mActionAddFeature->setEnabled( false );
@@ -15437,6 +15576,7 @@ void QgisApp::activateDeactivateLayerRelatedActions( QgsMapLayer *layer )
15437
15576
mActionIdentify->setEnabled( true );
15438
15577
mDigitizingTechniqueManager->enableDigitizingTechniqueActions( false );
15439
15578
enableMeshEditingTools( false );
15579
+ updateUndoActions();
15440
15580
break;
15441
15581
}
15442
15582
case Qgis::LayerType::Plugin:
0 commit comments