Stub out KeyboardNavigation
This commit is contained in:
parent
bff1f1c78a
commit
8fde323dd0
2 changed files with 61 additions and 0 deletions
59
crates/ui/src/components/keyboard_navigation.rs
Normal file
59
crates/ui/src/components/keyboard_navigation.rs
Normal file
|
@ -0,0 +1,59 @@
|
|||
use gpui::{Focusable, actions};
|
||||
|
||||
actions!(
|
||||
keyboard_navigation,
|
||||
[NextRow, PreviousRow, NextColumn, PreviousColumn]
|
||||
);
|
||||
|
||||
/// Implement this trait to enable grid-like keyboard navigation for a layout.
|
||||
///
|
||||
/// This trait allows you to navigate through a layout of rows with mixed column
|
||||
/// lengths. In example, a layout might have rows with 5, 1 and 3 columns.
|
||||
///
|
||||
/// Moving up or down between rows will focus the first element in the next or previous row.
|
||||
/// Moving left or right between columns will focus the next or previous element in the same row.
|
||||
///
|
||||
/// Wrapping can be enabled via `vertical_wrapping` and `horizontal_wrapping` respectively.
|
||||
pub trait KeyboardNavigation: Focusable {
|
||||
fn has_focus(&self) -> bool;
|
||||
/// The focused row. Always has a value to allow for "focused inactive" states.
|
||||
fn focused_row(&self) -> usize;
|
||||
/// The focused column. Always has a value to allow for "focused inactive" states.
|
||||
fn focused_column(&self) -> usize;
|
||||
/// Focus the first focusable element in the layout.
|
||||
fn focus_first(&self);
|
||||
/// Focus the next row, wrapping back to the first row if necessary.
|
||||
///
|
||||
/// Is a no-op if wrapping is not enabled.
|
||||
fn focus_next_row(&self);
|
||||
/// Focus the previous row, wrapping back to the last row if necessary.
|
||||
///
|
||||
/// Is a no-op if wrapping is not enabled.
|
||||
fn focus_previous_row(&self);
|
||||
/// Focus the next column, wrapping back to the first column if necessary.
|
||||
///
|
||||
/// Is a no-op if wrapping is not enabled.
|
||||
fn focus_next_column(&self);
|
||||
/// Focus the previous column, wrapping back to the last column if necessary.
|
||||
///
|
||||
/// Is a no-op if wrapping is not enabled.
|
||||
fn focus_previous_column(&self);
|
||||
/// Focus the row at the given index.
|
||||
fn focus_row_index(&self, index: usize);
|
||||
/// Focus the column at the given index.
|
||||
fn focus_column_index(&self, ix: usize);
|
||||
/// When reaching the last row, should moving down wrap
|
||||
/// back to the first row, and vice versa?
|
||||
fn vertical_wrap(&self) -> bool {
|
||||
false
|
||||
}
|
||||
/// When reaching the last column, should moving right wrap
|
||||
/// back to the first column, and vice versa?
|
||||
fn horizontal_wrap(&self) -> bool {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
pub struct NavigationRow {}
|
||||
|
||||
pub struct NavigationColumn {}
|
Loading…
Add table
Add a link
Reference in a new issue