第11章 GUI Page480~487 步骤二十七 “脏数据”与“新文档”状态维护

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的状态

很明显,这有点儿不合理,所以下一篇,需要代码重构

运行效果:

在重构之前,标题上的*,是根据wxMyPainterFrame的私有成员_is_dirty的值决定的

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值