pub struct ViewportKeyMap {
pub page_down: Binding,
pub page_up: Binding,
pub half_page_up: Binding,
pub half_page_down: Binding,
pub down: Binding,
pub up: Binding,
pub left: Binding,
pub right: Binding,
}Expand description
Keyboard binding configuration for viewport navigation.
This struct defines all key combinations that control viewport scrolling, including line-by-line movement, page scrolling, and horizontal navigation. Each binding supports multiple key combinations and includes help text for documentation generation.
§Default Key Bindings
The default configuration provides both traditional navigation keys and Vim-style alternatives for maximum compatibility:
- Line Movement: Arrow keys (
↑↓) and Vim keys (kj) - Page Movement: Page Up/Down and Vim keys (
bf) - Half Page: Vim-style
u(up) andd(down) - Horizontal: Arrow keys (
←→) and Vim keys (hl)
§Examples
use bubbletea_widgets::viewport::{ViewportKeyMap, Model};
use bubbletea_widgets::key;
use crossterm::event::KeyCode;
// Use default key bindings
let mut viewport = Model::new(80, 24);
let keymap = viewport.keymap.clone(); // Uses ViewportKeyMap::default()
// Customize key bindings
let mut custom_keymap = ViewportKeyMap::default();
custom_keymap.page_down = key::Binding::new(vec![KeyCode::Char('n')])
.with_help("n", "next page");
custom_keymap.page_up = key::Binding::new(vec![KeyCode::Char('p')])
.with_help("p", "previous page");
viewport.keymap = custom_keymap;Integration with help system:
use bubbletea_widgets::viewport::ViewportKeyMap;
use bubbletea_widgets::key::KeyMap as KeyMapTrait;
let keymap = ViewportKeyMap::default();
// Get essential bindings for compact help
let short_help = keymap.short_help();
assert_eq!(short_help.len(), 4); // up, down, page_up, page_down
// Get all bindings organized by category
let full_help = keymap.full_help();
assert_eq!(full_help.len(), 4); // 4 categories of bindings§Customization Patterns
Common customization scenarios:
use bubbletea_widgets::viewport::ViewportKeyMap;
use bubbletea_widgets::key;
use crossterm::event::KeyCode;
let mut keymap = ViewportKeyMap::default();
// Add additional keys for page navigation
keymap.page_down = key::Binding::new(vec![
KeyCode::PageDown,
KeyCode::Char(' '), // Space bar (default)
KeyCode::Char('f'), // Vim style (default)
KeyCode::Enter, // Custom addition
]).with_help("space/f/enter", "next page");
// Game-style WASD navigation
keymap.up = key::Binding::new(vec![KeyCode::Char('w')])
.with_help("w", "move up");
keymap.down = key::Binding::new(vec![KeyCode::Char('s')])
.with_help("s", "move down");
keymap.left = key::Binding::new(vec![KeyCode::Char('a')])
.with_help("a", "move left");
keymap.right = key::Binding::new(vec![KeyCode::Char('d')])
.with_help("d", "move right");Fields§
§page_down: BindingKey binding for scrolling down one full page.
Default keys: Page Down, Space, f (Vim-style “forward”)
page_up: BindingKey binding for scrolling up one full page.
Default keys: Page Up, b (Vim-style “backward”)
half_page_up: BindingKey binding for scrolling up half a page.
Default key: u (Vim-style “up half page”)
half_page_down: BindingKey binding for scrolling down half a page.
Default key: d (Vim-style “down half page”)
down: BindingKey binding for scrolling down one line.
Default keys: Down arrow (↓), j (Vim-style)
up: BindingKey binding for scrolling up one line.
Default keys: Up arrow (↑), k (Vim-style)
left: BindingKey binding for horizontal scrolling to the left.
Default keys: Left arrow (←), h (Vim-style)
right: BindingKey binding for horizontal scrolling to the right.
Default keys: Right arrow (→), l (Vim-style)
Trait Implementations§
Source§impl Clone for ViewportKeyMap
impl Clone for ViewportKeyMap
Source§fn clone(&self) -> ViewportKeyMap
fn clone(&self) -> ViewportKeyMap
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for ViewportKeyMap
impl Debug for ViewportKeyMap
Source§impl Default for ViewportKeyMap
impl Default for ViewportKeyMap
Source§fn default() -> Self
fn default() -> Self
Creates default viewport key bindings with Vim-style alternatives.
The default configuration provides comprehensive navigation options that accommodate both traditional arrow key users and Vim enthusiasts. Each binding includes multiple key combinations for flexibility.
§Default Key Mappings
| Binding | Keys | Description |
|---|---|---|
page_down | PgDn, Space, f | Scroll down one page |
page_up | PgUp, b | Scroll up one page |
half_page_down | d | Scroll down half page |
half_page_up | u | Scroll up half page |
down | ↓, j | Scroll down one line |
up | ↑, k | Scroll up one line |
left | ←, h | Scroll left horizontally |
right | →, l | Scroll right horizontally |
§Examples
use bubbletea_widgets::viewport::ViewportKeyMap;
// Create with default bindings
let keymap = ViewportKeyMap::default();
// Verify some default key combinations
assert!(!keymap.page_down.keys().is_empty());
assert!(!keymap.up.keys().is_empty());§Design Philosophy
- Accessibility: Arrow keys work for all users
- Efficiency: Vim keys provide rapid navigation for power users
- Consistency: Key choices match common terminal application patterns
- Discoverability: Help text explains each binding clearly
Source§impl KeyMap for ViewportKeyMap
impl KeyMap for ViewportKeyMap
Source§fn short_help(&self) -> Vec<&Binding>
fn short_help(&self) -> Vec<&Binding>
Returns the most essential key bindings for compact help display.
This method provides a concise list of the most frequently used navigation keys, suitable for brief help displays or status bars.
§Returns
A vector containing bindings for: up, down, page up, page down
§Examples
use bubbletea_widgets::viewport::ViewportKeyMap;
use bubbletea_widgets::key::KeyMap as KeyMapTrait;
let keymap = ViewportKeyMap::default();
let essential_keys = keymap.short_help();
assert_eq!(essential_keys.len(), 4);
// Contains: up, down, page_up, page_downSource§fn full_help(&self) -> Vec<Vec<&Binding>>
fn full_help(&self) -> Vec<Vec<&Binding>>
Returns all key bindings organized by navigation category.
This method groups related navigation keys together for comprehensive help displays. Each group represents a logical category of movement.
§Returns
A vector of binding groups:
- Line navigation: up, down
- Horizontal navigation: left, right
- Page navigation: page up, page down
- Half-page navigation: half page up, half page down
§Examples
use bubbletea_widgets::viewport::ViewportKeyMap;
use bubbletea_widgets::key::KeyMap as KeyMapTrait;
let keymap = ViewportKeyMap::default();
let all_keys = keymap.full_help();
assert_eq!(all_keys.len(), 4); // 4 categories
assert_eq!(all_keys[0].len(), 2); // Line navigation: up, down
assert_eq!(all_keys[1].len(), 2); // Horizontal: left, right
assert_eq!(all_keys[2].len(), 2); // Page: page_up, page_down
assert_eq!(all_keys[3].len(), 2); // Half-page: half_page_up, half_page_down§Help Display Integration
This organization enables structured help displays:
Navigation:
↑/k, ↓/j line up, line down
←/h, →/l scroll left, scroll right
b/pgup, f/pgdn/space page up, page down
u, d half page up, half page downAuto Trait Implementations§
impl Freeze for ViewportKeyMap
impl RefUnwindSafe for ViewportKeyMap
impl Send for ViewportKeyMap
impl Sync for ViewportKeyMap
impl Unpin for ViewportKeyMap
impl UnwindSafe for ViewportKeyMap
Blanket Implementations§
Source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
D: AdaptFrom<S, Swp, Dwp, T>,
impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
D: AdaptFrom<S, Swp, Dwp, T>,
Source§fn adapt_into_using<M>(self, method: M) -> Dwhere
M: TransformMatrix<T>,
fn adapt_into_using<M>(self, method: M) -> Dwhere
M: TransformMatrix<T>,
Source§fn adapt_into(self) -> D
fn adapt_into(self) -> D
Source§impl<T, C> ArraysFrom<C> for Twhere
C: IntoArrays<T>,
impl<T, C> ArraysFrom<C> for Twhere
C: IntoArrays<T>,
Source§fn arrays_from(colors: C) -> T
fn arrays_from(colors: C) -> T
Source§impl<T, C> ArraysInto<C> for Twhere
C: FromArrays<T>,
impl<T, C> ArraysInto<C> for Twhere
C: FromArrays<T>,
Source§fn arrays_into(self) -> C
fn arrays_into(self) -> C
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
T: FromCam16Unclamped<WpParam, U>,
impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
T: FromCam16Unclamped<WpParam, U>,
Source§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
parameters when converting.Source§fn cam16_into_unclamped(
self,
parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>,
) -> T
fn cam16_into_unclamped( self, parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>, ) -> T
self into C, using the provided parameters.Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
impl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
Source§fn components_from(colors: C) -> T
fn components_from(colors: C) -> T
Source§impl<T> FromAngle<T> for T
impl<T> FromAngle<T> for T
Source§fn from_angle(angle: T) -> T
fn from_angle(angle: T) -> T
angle.Source§impl<T, U> FromStimulus<U> for Twhere
U: IntoStimulus<T>,
impl<T, U> FromStimulus<U> for Twhere
U: IntoStimulus<T>,
Source§fn from_stimulus(other: U) -> T
fn from_stimulus(other: U) -> T
other into Self, while performing the appropriate scaling,
rounding and clamping.Source§impl<T, U> IntoAngle<U> for Twhere
U: FromAngle<T>,
impl<T, U> IntoAngle<U> for Twhere
U: FromAngle<T>,
Source§fn into_angle(self) -> U
fn into_angle(self) -> U
T.Source§impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
T: Cam16FromUnclamped<WpParam, U>,
impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
T: Cam16FromUnclamped<WpParam, U>,
Source§type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
parameters when converting.Source§fn into_cam16_unclamped(
self,
parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>,
) -> T
fn into_cam16_unclamped( self, parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>, ) -> T
self into C, using the provided parameters.Source§impl<T, U> IntoColor<U> for Twhere
U: FromColor<T>,
impl<T, U> IntoColor<U> for Twhere
U: FromColor<T>,
Source§fn into_color(self) -> U
fn into_color(self) -> U
Source§impl<T, U> IntoColorUnclamped<U> for Twhere
U: FromColorUnclamped<T>,
impl<T, U> IntoColorUnclamped<U> for Twhere
U: FromColorUnclamped<T>,
Source§fn into_color_unclamped(self) -> U
fn into_color_unclamped(self) -> U
Source§impl<T> IntoStimulus<T> for T
impl<T> IntoStimulus<T> for T
Source§fn into_stimulus(self) -> T
fn into_stimulus(self) -> T
self into T, while performing the appropriate scaling,
rounding and clamping.Source§impl<T, C> TryComponentsInto<C> for Twhere
C: TryFromComponents<T>,
impl<T, C> TryComponentsInto<C> for Twhere
C: TryFromComponents<T>,
Source§type Error = <C as TryFromComponents<T>>::Error
type Error = <C as TryFromComponents<T>>::Error
try_into_colors fails to cast.Source§fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
Source§impl<T, U> TryIntoColor<U> for Twhere
U: TryFromColor<T>,
impl<T, U> TryIntoColor<U> for Twhere
U: TryFromColor<T>,
Source§fn try_into_color(self) -> Result<U, OutOfBounds<U>>
fn try_into_color(self) -> Result<U, OutOfBounds<U>>
OutOfBounds error is returned which contains
the unclamped color. Read more