ui: popup: scroll documentation popups with c-u/c-d.

pull/8/head
Blaž Hrastnik 3 years ago
parent ddcf5156c0
commit 8fe4590666

@ -60,7 +60,11 @@ impl Application {
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 @@ impl Application {
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 @@ use helix_view::{Editor, View};
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 @@ impl Component for Markdown {
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 @@ impl Popup {
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 @@ impl Component for Popup {
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 @@ impl Component for Popup {
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…
Cancel
Save