Note 1: 所有model的常用的方法,例如update, render, graphics等都在各自的model_New函数中设置。
Note 2: EventHandlerFunc函数中负责update,一个屏幕中的所有model以树状排列,一次update最大的model就可以遍历所有的model。
Note 3: update只负责设置每个model的当前值(如显示哪个state model, List 里focus哪一项),所有的画出model的方法,均在render里完成。
一、positional_update:
1) 根据position_New设置 ** CurChild
2) 运行该positional下的handler函数
3) 设置该positional的位置。
4) 合并update区域。
5) 遍历positional的孩子,判断该孩子是否显示,设置孩子的位置,update该孩子。
6) 储存ImaxPos,ImaxIndex的值。
二、List_update:
1) 根据List_New中的model->creation设置NewChildFun(与positional不同,positional的孩子设置在model->child中,因为List的孩子只有一种类型)。
2) 运行该List下的handler。
3) 读取该List的参数(array(横列或竖列),Ilinespace,indexes(可见项,是个数组),childNB,SlotNB)。
4) 若该List需refresh,则需先释放(如List里按上、下键)。
5) 设置该List的位置。
6) 合并update区域。
7) 遍历List的各项(从indexes里读可视的项,根据slot.h和slot.y计算SlotNB)。
8) 保存ImaxPos, indexes值,ImaxIndex可在handler或XML里设置。
三、state_update
1) state 与 List一样,孩子设在model->creation中(state的孩子也只能是一种类型)。
2) 运行该state下的handler里。
3) 读state的值。
4) 根据state的值决定生成哪个孩子。
5) 若state变化(与model->old_state不同),则先释放old_state孩子。
6) 计算该state的位置,合并update区域。
7)不需要保存什么(state的值存到model->old_state里,不存到hash表里)。
四、mapper_update
1) mapper没有孩子。
2) 运行该mapper下的handler函数。
3) 设置mapper位置。
4) 合并update区域。
5) 不需要保存什么。
So 1: 四种model的update基本上都完成以下动作:运行该model的handler,设置该model的位置及update区域,遍历该model的孩子。
So 2: 叶子节点一定是mapper model。
So 3: List model要注意哪些项可见。
So 4: 父结点若需要更新,则他的子结点都需更新。