Show available key bindings with F1/?
This commit is contained in:
parent
a51bb60342
commit
6c1ce49236
6 changed files with 355 additions and 87 deletions
|
|
@ -1,4 +1,20 @@
|
|||
use std::convert::Infallible;
|
||||
|
||||
use crossterm::event::{KeyCode, KeyModifiers};
|
||||
use crossterm::style::{ContentStyle, Stylize};
|
||||
use toss::styled::Styled;
|
||||
|
||||
use super::widgets::background::Background;
|
||||
use super::widgets::border::Border;
|
||||
use super::widgets::empty::Empty;
|
||||
use super::widgets::float::Float;
|
||||
use super::widgets::join::{HJoin, Segment};
|
||||
use super::widgets::layer::Layer;
|
||||
use super::widgets::list::{List, ListState};
|
||||
use super::widgets::padding::Padding;
|
||||
use super::widgets::resize::Resize;
|
||||
use super::widgets::text::Text;
|
||||
use super::widgets::BoxedWidget;
|
||||
|
||||
/// A key event data type that is a bit easier to pattern match on than
|
||||
/// [`crossterm::event::KeyEvent`].
|
||||
|
|
@ -46,3 +62,62 @@ macro_rules! key {
|
|||
( Alt + $key:ident ) => { KeyEvent { code: KeyCode::$key, shift: false, ctrl: false, alt: true, } };
|
||||
}
|
||||
pub(crate) use key;
|
||||
|
||||
/// Helper wrapper around a list widget for a more consistent key binding style.
|
||||
pub struct KeyBindingsList(List<Infallible>);
|
||||
|
||||
impl KeyBindingsList {
|
||||
pub fn new(state: &ListState<Infallible>) -> Self {
|
||||
Self(state.widget())
|
||||
}
|
||||
|
||||
fn binding_style() -> ContentStyle {
|
||||
ContentStyle::default().cyan()
|
||||
}
|
||||
|
||||
pub fn widget(self) -> BoxedWidget {
|
||||
let binding_style = Self::binding_style();
|
||||
Float::new(Layer::new(vec![
|
||||
Border::new(Background::new(Padding::new(self.0).horizontal(1))).into(),
|
||||
Float::new(
|
||||
Padding::new(Text::new(
|
||||
Styled::new("jk/↓↑", binding_style)
|
||||
.then_plain(" to scroll, ")
|
||||
.then("esc", binding_style)
|
||||
.then_plain(" to close"),
|
||||
))
|
||||
.horizontal(1),
|
||||
)
|
||||
.horizontal(0.5)
|
||||
.into(),
|
||||
]))
|
||||
.horizontal(0.5)
|
||||
.vertical(0.5)
|
||||
.into()
|
||||
}
|
||||
|
||||
pub fn empty(&mut self) {
|
||||
self.0.add_unsel(Empty::new());
|
||||
}
|
||||
|
||||
pub fn heading(&mut self, name: &str) {
|
||||
self.0
|
||||
.add_unsel(Text::new((name, ContentStyle::default().bold())));
|
||||
}
|
||||
|
||||
pub fn binding(&mut self, binding: &str, description: &str) {
|
||||
let widget = HJoin::new(vec![
|
||||
Segment::new(Resize::new(Text::new((binding, Self::binding_style()))).min_width(16)),
|
||||
Segment::new(Text::new(description)),
|
||||
]);
|
||||
self.0.add_unsel(widget);
|
||||
}
|
||||
|
||||
pub fn binding_ctd(&mut self, description: &str) {
|
||||
let widget = HJoin::new(vec![
|
||||
Segment::new(Resize::new(Empty::new()).min_width(16)),
|
||||
Segment::new(Text::new(description)),
|
||||
]);
|
||||
self.0.add_unsel(widget);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue