SDL中文论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4124|回复: 0
打印 上一主题 下一主题

[gui2] 列表(listbox)

[复制链接]

187

主题

346

帖子

2450

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2450
跳转到指定楼层
楼主
发表于 2017-5-7 21:09:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ancientcc 于 2018-3-5 14:16 编辑

垃圾回收算法

操作区矩形高度(valid_height)
  • 至少content.h * 2。
  • estimated_start_row < gc_next_precise_at_时,要增加“start_distance - current_gc_row->gc_distance_”。estimated_start_row是精确行时,first_at的distance就是该行的distance(不再是start_distance),一旦该行“start_distance - current_gc_row->gc_distance_”超过content.h,如果不增加会使得后面不能填满content.h。
  • 向下拖移,并且“estimated_start_row == first_at - 1”时,后续的行的高度至少还要content.h。——“estimated_start_row == first_at - 1”一般用缓慢向下拖场景,estimated_start_row是要新显示的行,但刚出来那一刻,已有行的部分还是要能填满content.h。


滚动控件的嵌套问题
列表控件上有个滚动面板控件。
1)鼠标向左移动超过一定距离后,列表会置上drag_at_ = row。
2)下一次mouse_motion到来了,滚动控件调用scrollbar_moved,并要重设所有孩子的视区,这当中自然包括列表控件。这会调用tlistbox::mini_set_content_grid_origin,这函数要确保drag_at_是twidget::npos,导致抛出诊断异常!

如何解决这问题?——当前是窗口脚本时就禁止出现滚动控件嵌套。

captured_mouse_can_to_scroll_container
captured_mouse_can_to_scroll_container:当前的mouse_foucs_是它时,是否可以把mouse_foucs_变成是它父控件的scroll_container。当前有5种控件要设置mouse_focus_。
控件captured_mouse_can_to_scroll_container
buttontrue报表控件单元是button时,要支持挪动
trackfalse原则是不能track出现在滚动控件中
text_boxtrue/false进入选择状态后,true,为完成操作,编辑框需要获得“一次”完整鼠标事件。/不在选择状态
scrollbarfalse
scroll_container(实际是content_grid_)false为什么scroll_container要拿到mouse_foucs_?为了当拖着鼠标离开自已时,还能继续挪动它的内容网格。


注1:为什么滚动控件把事件挂接向content_grid_?
content_它不是content_grid_中控件的父控件,将不能接收那些控件的事件。可以排除。
content_grid_缺点:当content_grid_不能占据整个content_,将不能接收消息。
scroll_container缺点:当scroll_container存在除content_grid_外控件,像列表中的左滑菜单grid,为支持下拉刷新引入的track,在这些控件发生的事件也会导向scroll_container。而这些事件增加干扰,使得逻辑变得复杂。在隶属关系上,附加控件和content_grid_互不关联,但它们会是scroll_container的子控件。

考虑到附加控件多样性,那会使得逻辑变得复杂,选择content_grid_。至于当content_grid_不能占据整个content_时,如何在空白处接收事件再做专门处理。

挪动滚动控件
使用的示例:scroll_panel中有一个listbox、一个report,report中有button。listbox不可挪动,report可挪动。
1、当x、y有满足门限的偏移时,就会试图把captured_mouse切到content_grid_。为什么scroll_container要拿到captured_mouse?为了当拖着鼠标离开自已时,还能继续挪动它的内容网格。
2、处理挪动的代码放在MOUSE_MOTION处理例程,挂接向child、post_child两个集合。为什么选择post_child而不是pre_child?是为了后面的设置captured_mouse首先拿到最内层滚动控件。
3、必须把captured_mouse设置在最内层滚动控件的content_grid_。原因是一旦设了captured_mouse,后续的消息只能发给它和它的那些父窗口。——让回看实例,在button按下鼠标,由于scroll_panel、report都是button的父控件,它们的post_child都要处理这down事件,具体是把first_coordinate_设为有效值,button则获得captured_mouse_。当移动鼠标超过一定距离时,如果把captured_mouse_设到scroll_panel那会导致什么结果?由于scroll_panel是最外层控件,接下mouse、up都将传给它,而不会继续传给它内里的report,这将导致report的first_coordinate处于混乱状态!
4、一次只能挪动一个滚动控件。这有两个方面。1)当正挪动的内层控动件是可以移动时,那就要阻止外层的scroll_panel,阻止的方法是让此次MOUSE_MOTION把halt设为true(这个方法会导致后面的scroll_panel收不到MOUSE_MOTION,不知将来会不会有问题?)。2)当正挪动的内层控动件是不可以移动时,不执行MOUSE_MOTION后半部分的处理代码。

scroll_container的can_scroll指示着它是否可以滚动。当前是由外界调用set_can_scroll设置,理论上应该是由tscroll_container::place自动设置。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|丽谷软件|libsdl.cn

GMT+8, 2024-5-20 02:07 , Processed in 0.060316 second(s), 19 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表