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 个直接使用)

MIT/Apache

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 来水平滚动。

视图和视口

这两个为没有内置滚动的 Widgets/StatefulWidgets 提供了滚动支持。它们将小部件渲染到临时缓冲区,然后进行偏移。

这两个完全相同,但是这种重复是必要的,因为存在冲突的特性。

依赖关系

~6–12MB
~120K SLoC