ui: popup: scroll documentation popups with c-u/c-d.
This commit is contained in:
parent
ddcf5156c0
commit
8fe4590666
|
@ -60,7 +60,11 @@ fn render(&mut self) {
|
||||||
let editor = &mut self.editor;
|
let editor = &mut self.editor;
|
||||||
let compositor = &mut self.compositor;
|
let compositor = &mut self.compositor;
|
||||||
|
|
||||||
let mut cx = crate::compositor::Context { editor, executor };
|
let mut cx = crate::compositor::Context {
|
||||||
|
editor,
|
||||||
|
executor,
|
||||||
|
scroll: None,
|
||||||
|
};
|
||||||
|
|
||||||
compositor.render(&mut cx);
|
compositor.render(&mut cx);
|
||||||
}
|
}
|
||||||
|
@ -91,6 +95,7 @@ pub fn handle_terminal_events(&mut self, event: Option<Result<Event, crossterm::
|
||||||
let mut cx = crate::compositor::Context {
|
let mut cx = crate::compositor::Context {
|
||||||
editor: &mut self.editor,
|
editor: &mut self.editor,
|
||||||
executor: &self.executor,
|
executor: &self.executor,
|
||||||
|
scroll: None,
|
||||||
};
|
};
|
||||||
// Handle key events
|
// Handle key events
|
||||||
let should_redraw = match event {
|
let should_redraw = match event {
|
||||||
|
|
|
@ -29,6 +29,7 @@ pub enum EventResult {
|
||||||
pub struct Context<'a> {
|
pub struct Context<'a> {
|
||||||
pub editor: &'a mut Editor,
|
pub editor: &'a mut Editor,
|
||||||
pub executor: &'static smol::Executor<'static>,
|
pub executor: &'static smol::Executor<'static>,
|
||||||
|
pub scroll: Option<usize>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait Component {
|
pub trait Component {
|
||||||
|
|
|
@ -112,8 +112,9 @@ fn to_span(text: pulldown_cmark::CowStr) -> Span {
|
||||||
|
|
||||||
let contents = Text::from(lines);
|
let contents = Text::from(lines);
|
||||||
|
|
||||||
let par = Paragraph::new(contents).wrap(Wrap { trim: false });
|
let par = Paragraph::new(contents)
|
||||||
// .scroll(x, y) offsets
|
.wrap(Wrap { trim: false })
|
||||||
|
.scroll((cx.scroll.unwrap_or_default() as u16, 0));
|
||||||
|
|
||||||
let area = Rect::new(area.x + 1, area.y + 1, area.width - 2, area.height - 2);
|
let area = Rect::new(area.x + 1, area.y + 1, area.width - 2, area.height - 2);
|
||||||
par.render(area, surface);
|
par.render(area, surface);
|
||||||
|
|
|
@ -19,6 +19,7 @@ pub struct Popup {
|
||||||
contents: Box<dyn Component>,
|
contents: Box<dyn Component>,
|
||||||
position: Option<Position>,
|
position: Option<Position>,
|
||||||
size: (u16, u16),
|
size: (u16, u16),
|
||||||
|
scroll: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Popup {
|
impl Popup {
|
||||||
|
@ -29,12 +30,21 @@ pub fn new(contents: Box<dyn Component>) -> Self {
|
||||||
contents,
|
contents,
|
||||||
position: None,
|
position: None,
|
||||||
size: (0, 0),
|
size: (0, 0),
|
||||||
|
scroll: 0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_position(&mut self, pos: Option<Position>) {
|
pub fn set_position(&mut self, pos: Option<Position>) {
|
||||||
self.position = pos;
|
self.position = pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn scroll(&mut self, offset: usize, direction: bool) {
|
||||||
|
if direction {
|
||||||
|
self.scroll += offset;
|
||||||
|
} else {
|
||||||
|
self.scroll = self.scroll.saturating_sub(offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Component for Popup {
|
impl Component for Popup {
|
||||||
|
@ -64,6 +74,21 @@ fn handle_event(&mut self, event: Event, cx: &mut Context) -> EventResult {
|
||||||
code: KeyCode::Char('c'),
|
code: KeyCode::Char('c'),
|
||||||
modifiers: KeyModifiers::CONTROL,
|
modifiers: KeyModifiers::CONTROL,
|
||||||
} => close_fn,
|
} => close_fn,
|
||||||
|
|
||||||
|
KeyEvent {
|
||||||
|
code: KeyCode::Char('d'),
|
||||||
|
modifiers: KeyModifiers::CONTROL,
|
||||||
|
} => {
|
||||||
|
self.scroll(self.size.1 as usize / 2, true);
|
||||||
|
return EventResult::Consumed(None);
|
||||||
|
}
|
||||||
|
KeyEvent {
|
||||||
|
code: KeyCode::Char('u'),
|
||||||
|
modifiers: KeyModifiers::CONTROL,
|
||||||
|
} => {
|
||||||
|
self.scroll(self.size.1 as usize / 2, false);
|
||||||
|
return EventResult::Consumed(None);
|
||||||
|
}
|
||||||
_ => self.contents.handle_event(event, cx),
|
_ => self.contents.handle_event(event, cx),
|
||||||
}
|
}
|
||||||
// for some events, we want to process them but send ignore, specifically all input except
|
// for some events, we want to process them but send ignore, specifically all input except
|
||||||
|
@ -85,6 +110,8 @@ fn render(&self, viewport: Rect, surface: &mut Surface, cx: &mut Context) {
|
||||||
use tui::text::Text;
|
use tui::text::Text;
|
||||||
use tui::widgets::{Paragraph, Widget, Wrap};
|
use tui::widgets::{Paragraph, Widget, Wrap};
|
||||||
|
|
||||||
|
cx.scroll = Some(self.scroll);
|
||||||
|
|
||||||
let position = self
|
let position = self
|
||||||
.position
|
.position
|
||||||
.or_else(|| cx.editor.cursor_position())
|
.or_else(|| cx.editor.cursor_position())
|
||||||
|
|
Loading…
Reference in a new issue