1.基本实现思路
实现一个文件的撤销重做最简单的思想就是,在每个撤销重做节点处保存一份文件的内容,撤销重做时,分别替换对应节点处的文件内容即可。这种做法开销太大,每个节点处都需要保存一份完整的文档内容,每次撤销重做时都需要替换全部的文档内容。
如果每个撤销重做节点处只保存此节点相对于上一节点改变的内容,每次撤销重做时只修改两个节点间差异的内容,可以有效的降低撤销重做的开销。FreeCAD的撤销重做机制就是基于这种思想实现的。
节点和节点之间的修改可以总结为三种情况:增加、删除、改变。撤销重做机制的主要内容就是记录这三种情况下的修改,并复原这三种情况的修改。
2.FreeCAD撤销重做对象
FreeCAD撤销重做机制的对象是Document对象,也就是说,Document对象的修改可以被撤销重做,其他的不可以撤销重做。
3.FreeCAD撤销重做相关类
App::Document类中包含了一系列Transaction类的容器,可以看出,Transaction类其实是App::Document撤销重做节点的表示类。
分析Transaction类的成员: