Skip to content

Conversation

@Mine-diamond
Copy link
Contributor

目前,一个列表页面基类是ToolbarListPageSkin,但是并不是所有列表页面都使用,并且在很复杂的页面可能不适用?

总之,我写了个CommonListPage,主要目的是为了向DataPackListSkin这种不太好重构到ToolbarListPageSkin,但是在自己的类中写列表页面的整体样式又有一点不太好维护的页面,提供了一个新基类,他有几个特点

  1. 它在刷新时是禁用Toolbar并且SpinnerPane是在ListView处而不是整个界面,这使得刷新时闪烁不会太大(见下面的视频)
    • JavaFX ListView默认的setOnContextMenuRequested实现的我觉得略显抽象,首先,如果是什么都不选的情况下,右键他会选中然后取消选中在执行MenuRequested逻辑,如果已经选中了一个,他也会取消选中并执行MenuRequested逻辑,甚至如果同时选中多项,那么它甚至会什么都不做
    • 而该类实现了一个CellMenuRequestEvent.SINGLE_CELL和CellMenuRequestEvent.MULTIPLE_CELL
    • 对于CellMenuRequestEvent.SINGLE_CELL,不会考虑什么目前是否选中什么,右键哪个就是哪个,更不会修改目前的选中项目。
    • 对于CellMenuRequestEvent.MULTIPLE_CELL,则是在列表已经被多选时,右键触发
    • 虽然目前的数据包页面不需要这个,但是 feat: 添加数据包下载和数据包详细信息页面 #4991 需要
  2. 对于选择逻辑,该页面对选择逻辑进行了封装,使用enum SelectionType:SINGLE,MULTIPLE,NONE来快速选择选中描述,不需要调用MDListCell.setSelectable和listView.getSelectionModel().setSelectionMode
    • 选择逻辑不再是之前的左键选中,Ctrl + 左键多选或者取消选中,但问题是这个逻辑它不太容易想到,也不见得很好用,比如 [Feature] 为数据包管理添加取消选中的选项 #4661 就忘记了这个逻辑,所以我修改为左键时就在选中和未选中间切换,未选中左键选中,选中左键取消选中,此逻辑与PCL类似。
  3. ToolBar逻辑上,因为ToolbarListPageSkin中initializeToolbar有一个问题就是是一次性的,没办法(或者说很难)在构造后修改。比如ModListPageSkin/DatapackListPageSkin就需要动态修改toolbar上的元素,此页面自己就只提供getToolBar方法让子页面自己构造具体样式,自己不提供初始化方法
  4. 对于createToolbarButton2方法,我发现目前大部分是在各个方法的参数中使用,如果单独返回值再调整,80%的情况是绑定一下disableProperty,那么我添加了两个重构的方法,支持传入一个Consumer initializer或者用于绑定的BooleanProperty disableProperty

关于为什么名叫CommonListPage,首先如果叫DataPackListBasePage,那看起来好像只能DataPackListPage能用,但是实际上写的十分解构,并非只有DataPackListPage能用,比如我把WorldBackupsPage也迁移到这上面,且迁移成本非常小。但是我也不是很自信他就能变成一个"Common"的基类。只是说这个名字起的比较方便,我不会起名字。

CommonListPage:

bandicam.2026-01-19.22-37-39-879.mp4

ToolbarListPageSkin:

bandicam.2026-01-19.22-38-18-288.mp4

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant