
## Problem statement I want to add keyboard navigation support to SSH modal. Doing so is possible in current landscape, but not particularly ergonomic; `gpui::ScrollHandle` has `scroll_to_item` API that takes an index of the item you want to scroll to. The problem is, however, that it only works with it's immediate children - thus in order to support scrolling via keyboard you have to bend your UI to have a particular layout. Even when your list of items is perfectly flat, having decorations inbetween items is problematic as they are also children of the list, which means that you either have to maintain the mapping to devise a correct index of an item that you want to scroll to, or you have to make the decoration a part of the list item itself, which might render the scrolling imprecise (you might e.g. not want to scroll to a header, but to a button beneath it). ## The solution This PR adds `ScrollAnchor`, a new kind of handle to the gpui. It has a similar role to that of a ScrollHandle, but instead of tracking how far along an item has been scrolled, it tracks position of an element relative to the parent to which a given scroll handle belongs. In short, it allows us to persist the position of an element in a list of items and scroll to it even if it's not an immediate children of a container whose scroll position is tracked via an associated scroll handle. Additionally this PR adds a new kind of the container to the UI crate that serves as a convenience wrapper for using ScrollAnchors. This container provides handlers for `menu::SelectNext` and `menu::SelectPrev` and figures out which item should be focused next. Release Notes: - Improve keyboard navigation in ssh modal
69 lines
1.2 KiB
Rust
69 lines
1.2 KiB
Rust
mod avatar;
|
|
mod button;
|
|
mod checkbox;
|
|
mod context_menu;
|
|
mod disclosure;
|
|
mod divider;
|
|
mod dropdown_menu;
|
|
mod facepile;
|
|
mod icon;
|
|
mod image;
|
|
mod indent_guides;
|
|
mod indicator;
|
|
mod keybinding;
|
|
mod label;
|
|
mod list;
|
|
mod modal;
|
|
mod navigable;
|
|
mod numeric_stepper;
|
|
mod popover;
|
|
mod popover_menu;
|
|
mod radio;
|
|
mod right_click_menu;
|
|
mod scrollbar;
|
|
mod settings_container;
|
|
mod settings_group;
|
|
mod stack;
|
|
mod tab;
|
|
mod tab_bar;
|
|
mod tool_strip;
|
|
mod tooltip;
|
|
|
|
#[cfg(feature = "stories")]
|
|
mod stories;
|
|
|
|
pub use avatar::*;
|
|
pub use button::*;
|
|
pub use checkbox::*;
|
|
pub use context_menu::*;
|
|
pub use disclosure::*;
|
|
pub use divider::*;
|
|
pub use dropdown_menu::*;
|
|
pub use facepile::*;
|
|
pub use icon::*;
|
|
pub use image::*;
|
|
pub use indent_guides::*;
|
|
pub use indicator::*;
|
|
pub use keybinding::*;
|
|
pub use label::*;
|
|
pub use list::*;
|
|
pub use modal::*;
|
|
pub use navigable::*;
|
|
pub use numeric_stepper::*;
|
|
pub use popover::*;
|
|
pub use popover_menu::*;
|
|
pub use radio::*;
|
|
pub use right_click_menu::*;
|
|
pub use scrollbar::*;
|
|
pub use settings_container::*;
|
|
pub use settings_group::*;
|
|
pub use stack::*;
|
|
pub use tab::*;
|
|
pub use tab_bar::*;
|
|
pub use tool_strip::*;
|
|
pub use tooltip::*;
|
|
|
|
#[cfg(feature = "stories")]
|
|
pub use image::story::*;
|
|
#[cfg(feature = "stories")]
|
|
pub use stories::*;
|