I'm developing a standalone application in pyqgis (python 3.6, qgis 3.2) for editing roads and ran into a problem connected to performing transactions. When the user of the app insert, update or delete one feature s/he often wants to perform undo or redo operation in case some wrong actions have been done. I found and tested the following
1) Creating undo stack for road layer
self.undo_stack: QUndoStack = self.trackLayer.undoStack()
2) Implementing the following functions
def perform_undo(self): self.undo_stack.undo() self.mapCanvas.refresh() self.adjust_undo_redo_buttons() def perform_redo(self): self.undo_stack.redo() self.mapCanvas.refresh() self.adjust_undo_redo_buttons() def adjust_undo_redo_buttons(self): self.action_undo_transaction.setEnabled(self.undo_stack.canUndo()) self.action_redo_transaction.setEnabled(self.undo_stack.canRedo())
For single operations (insert one feature, change the location of one vertice) that works fine. But when it comes to changing the location of the vertice that is common to (for example) three roads the user has to perform undo three times.
For example, I know how to do this in proprietary product GE Smallworld GIS
# Change area value of the selected records sel_recs << a_view.collections[:plot].all_at(32,11) _local ok? << a_view.start_lwt() _protect for rec _over sel_recs _loop rec.area +<< 20.0 _endloop # doing some changes upon some records ok? << _true _protection a_view.end_lwt(ok?, _true, "Increasing areas by 20") _endprotect
So what should I do to merge several operations on the data into one transaction in pyqgis?