wxMyPainterFrame类定义中声明新的成员:
增加一个全局变量,初始化新成员:
先实现TrySaveFile()
TrySaveFile()用来提示用户是否保存数据,如果保存的话,选择要保存的文件名
818~821,如果有新数据,则需要保存数据,TrySaveFile()返回true
827~830,如果用户选择“取消”,TrySaveFile()返回false(使用的图片是后面章节的图片)
832~835, 如果用户选择“否”,TrySaveFile()返回true (使用的图片是后面章节的图片)
839行,会弹出一个对话框,让用户选择“要保存的文件名”
842~845,如果用户没有选择要保存保存的文件名,则TrySaveFile()返回false
851行,如果TrySaveFile()中间没有返回,能够执行到851行,则调用SaveFile()
SaveFile()暂时为空实现
增加两个新的私有成员方法:
UpdateFileStatusUI() 的作用是,判断是否有新数据,有则在窗口的标题上添上*
SetDirty()的作用是,设置数据是否是“脏”的,然后调用UpdateFileStatusUI(),更改窗口标题
wxMyPainterFrame类中,修改了“_items”的几个地方
① 鼠标抬起时,添加新元素;
② 删除事件;
③ 置顶,上浮一层,下沉一层,置底四个事件中,修改了元素位置;
④ 隐藏事件中,修改了元素的可视属性。
在这几个地方,调用SetDirty(true)
添加新图元时:
删除图元时
隐藏图元时:
调整次序时:
置顶OnMenuItemTopLevelSelected(wxCommandEvent& event)
上浮OnMenuItemFowardLevelSelected(wxCommandEvent& event)
下降OnMenuItemBackLevelSelected(wxCommandEvent& event)
置底OnMenuItemBottomLevelSelected(wxCommandEvent& event)
修改基类EditAction,增加一个_is_dirty的属性
_is_dirty属性用来记录Undo/Redo操作是否会使当前的数据是否脏
修改嵌套类EmptyAction,增加一个构造函数
因为EmptyAction继承的EditAction,所以其构造函数中EditAction(false),就是将数据设为不脏,因为第一个节点是空节点,所以数据不脏
基类EditAction的IsDirty和SetDirty方法一个用于查询,一个用于修改,(查询和修改Undo/Redo操作是否使数据变脏)
但外部调用实际是通过ActionLink对象作为入口,所以需要为后者也添加类似的接口:
因为,Undo, Redo可能改变数据是否脏的状态,所以ActionLink需要增添两个接口IsDirty(), SetDirty(bool is_dirty),用于查询和设置数据是否变脏
回到主窗口的代码,当有人调用Undo或Redo之后,我们需要设置一下
Undo, Redo是否会改变数据是否脏的状态,也就788和801两行。
788和801两行调用的IsDirty()实际上是ActionLink类的IsEirty()
_iter是个二级指针,指向一个EditAction*, *_iter是一个EditAciton的指针值,它可能是指向一个AddAction,DelAction, IndexAction, 这三种操作都会改变数据是否脏的状态。
增加,删除,置顶,置底,上浮,下降,修改的是wxMyPainterFrame的_is_dirty私有成员
而ActionLink类的IsEirty()和SetDirty()修改的是EditAction类的_is_dirty私有成员,所以,我们实际上是使用wxMyPainterFrame的私有成员_is_dirty反映:增加,删除,置顶,置底,上浮,下降的操作对数据是否脏的状态的影响,
使用EditAction类的私有成员_is_dirty反映:Undo和Redo对数据是否脏的状态的影响。
所以,整个项目需要代码重构,这是下一篇博文的内容
对应的,SaveFile()操作,需要添加上ActionLink的Save操作,以便及时记录“此刻数据不脏”的状态:
862行,改变的是EditAction类的私有成员_is_dirty
864行,是根据wxMyPainterFrame的私有成员_is_dirty的值,来决定是否改变UI的状态
很明显,这有点儿不合理,所以下一篇,需要代码重构