1. 两者都是mvc的模式,但是shutter的model是二维数组,blind的model是树型的,它和jface的treeviewer是类似的
2. 两者都是一些常见组件和自定义组件的合成。shutter用了coolbutton和scrolllist。blind用了slat和qtree。实际上,slat是coolbutton的精简版本(删了一些不常用的功能和少量的修改),只是名字不同。并且blind在这方面比shutter灵活,因为shutter的内容区域只能是scrolllist,blind的内容区可以是composite。
3. shutter没有item的概念,blind参照了treeviewer的实现,使用了item来对应model,也就是在qtree中使用了自定义的item对象qitem。
4. shutter把model直接映射为一个coolbutton,所以好友一多,效率就低。qtree则是纯绘制的。所以当时看了swt的一些代码,设计了qtree的重绘算法。在绘画事件的时候,qtree会检查哪些item需要重画(当然不是最优的,基本上凑合了一下),然后把绘画事件转发给qitem,由qitem自己来重绘自己。所以blind的速度自然就快了。
5. 在布局上,shutter使用的是自定义的sortlayout,blind用的是swt自带的gridlayout。从3.0的时候开始,griddata有了一个exclude属性,blind就利用这个实现内容区的显示和隐藏
6. qq里面,好友头像旁边可以显示摄像头图标,显示手机图标,等等。shutter不支持这些小特性。所以qtree在设计的时候考虑了这些,主要反映在qitem的实现中。主要有这么几个概念需要说明一下:
a) 摄像头图标,手机图标,这些东西都是显示在头像旁边的,我把它叫做附件(attachment)。附件有最大个数限制,目前代码里面是最多4个附件,你可以修改源代码调整最大个数。附件放在什么地方,是在重画算法里面计算的,保证了附件按一定规律摆放,不会重叠
b) 离开状态的图标,就是那个n/a字样的图标,它是显示在头像的右下角,和头像是重叠的,我把这种叫做装饰(decoration)。装饰最多4个,可以分别装饰在头像的4个角
所以呢,qtree就可以支持这些小特性了,你看我自己添加了一个qq没有的“好友置顶”的功能,置顶的好友会添加一个大头针的附件图标,就是这样的来由了。
7. shutter和blind都有标签编辑的功能,但是由于shutter把model映射为coolbutton,所以编辑功能是在coolbutton里面提供的,实现起来容易一些。qtree是一个纯绘制的组件,为了实现item的标签编辑,我实现了一个controleditor的子类。具体细节就不说了,反正也就是看看swt的代码,琢磨了一下,如今细节也不太记得了。大致的原理很简单,你要编辑item标签的时候,就新建一个text控件,然后把text定位到标签的位置,然后要监视text的focusevent和keyevent,同时要注意在卷滚条滚动的时候调整text的位置,编辑完了就释放这个text。像这样的功能,可能不实践一下你觉得它很神奇,做过之后就发现原来就是这么简单。
8. 头像的跳动和闪烁这样的功能,coolbutton和qtree都有,但是qtree更灵活一些,qtree的动画实现很简单,用一个列表保存哪些item正在显示动画,然后在重画的时候就画下一帧就可以了。不过下一帧到底画什么是可以自定义的,可以通过实现ieffect接口来自定义动画方式,所以说qtree比coolbutton灵活一些。
9. 由于blind是树型的,所以还考虑了最大层数,每层的缩进量,每层的图标大小等功能。本来开始想能够设置每个item的这些细节,但是太烦,后来想了想,觉得也没什么意义,还是针对每层设置算了。
闽公网安备 35060202000074号