7 个版本
0.12.0 | 2024 年 7 月 3 日 |
---|---|
0.11.3 | 2024 年 6 月 24 日 |
0.11.0 | 2024 年 5 月 30 日 |
0.10.1 | 2024 年 5 月 29 日 |
#483 在 命令行界面
26 每月下载次数
用于 6 个 Crates(3 个直接使用)
65KB
1.5K SLoC
滚动
Scrolled 为需要滚动内容的小部件提供支持。
Scrolled 与 Block 类似,您可以在小部件结构上设置它。小部件可以决定支持哪种滚动,水平、垂直或两者都支持。
ScrolledState
该结构体包含滚动所需的信息,并嵌入在小部件状态中。
-
max_offset - 允许的滚动最大偏移量。此偏移量计算为
item_count - last_page_items
。两者都是抽象值,可以表示项目或列/行,具体取决于小部件的设定。以这种方式计算的最大值,滚动条可以很好地渲染,并且小部件仍然可以显示一个完整的页面。
-
overscroll_by - 最大偏移量可以超出多少。这允许在内容末尾显示一些空白空间,这对某些小部件来说可能更直观。
-
page_len - 当前显示页面的长度。此值可用于处理向上/向下翻页以及计算滚动轮使用的值。
-
scroll_by - 每次滚动事件滚动的项目数。如果没有设置,则默认为 page_len 的 1/10,这在滚动速度和迷失方向之间提供了一个合理的平衡。
-
offset - 当前用于显示的偏移量。
每个小部件都可以自行决定如何将它们暴露在表面上。
建议的名称是
- vertical_offset()/set_vertical_offset()
- vertical_page_len()
- horizontal_offset()/set_horizontal_offset()
- horizontal_page_len()
其他值在表面级别可能不太有用。如果小部件只有垂直/水平滚动,则可以省略前缀。
这两个也很有用
-
scroll() - 使用一个或两个 isize 参数进行相对滚动。ScrolledState::change_offset() 支持此功能。
-
scroll_to()/horizontal_scroll_to()/vertical_scroll_to() - 滚动到绝对偏移量。
直接调用 set_offset(),但这是添加
scroll the selection instead of the offset
功能的好位置。Remark: Before I had a Scrolled<T> container widget, which did all this. But using it this way proved very burdensome. * Widgets with non-trivial scrolling need their own support anyway, Scrolled couldn't add much to that except showing the scrollbars. * The deep layering necessitated long dotted paths all the time. * Forwarding to an event-handler for the contained widget was some untertaking with wrapped event-handler qualifiers, and multiple layers of wrapped outcome-types. * And all that for some measly two scrollbars ...
实现
-
layout_scroll() 可以在存在一个/两个 Scroll 和一个 Block 的情况下计算区域,并使所有这些对齐得很好(存在边缘情况)。
-
滚动条使用 ScrollBarOrientation 来定位。但是我不支持用于垂直滚动的水平布局滚动条以及反之亦然。在你接受 Scrolled 时,应该立即调用 override_vertical()/override_horizontal() 来修复任何错位。左侧的垂直滚动条和顶部的水平滚动条仍然可以。
-
如果你的小部件既有水平滚动又有垂直滚动,一个将两者都设置为相同滚动的 scroll() 函数会很好。
-
事件处理
- 有一个针对 ScrollState 的 MouseOnly 事件处理程序。它对滚动条区域的鼠标点击和拖动直接做出反应,并返回 ScrollOutcome::Offset。你必须将实际偏移量更改为此值,事件处理程序不会为你做这件事。原因是
scroll my selection
模式。但你也可以使用此值来设置选择。 - 有一个辅助结构体 ScrollArea,它实现了鼠标滚轮功能的 MouseOnly 事件处理程序。这个返回 ScrollOutcome::Delta,同样,这也必须由你的小部件使用。至少这样可以避免再复制 50 行代码。它使用 ScrollUp/ScrollDown 来垂直滚动,使用 ALT-ScrollUp/ScrollDown 来水平滚动。
- 有一个针对 ScrollState 的 MouseOnly 事件处理程序。它对滚动条区域的鼠标点击和拖动直接做出反应,并返回 ScrollOutcome::Offset。你必须将实际偏移量更改为此值,事件处理程序不会为你做这件事。原因是
视图和视口
这两个为没有内置滚动的 Widgets/StatefulWidgets 提供了滚动支持。它们将小部件渲染到临时缓冲区,然后进行偏移。
这两个完全相同,但是这种重复是必要的,因为存在冲突的特性。
依赖关系
~6–12MB
~120K SLoC