aboutsummaryrefslogtreecommitdiff
path: root/helix-term/src/ui
diff options
context:
space:
mode:
authorBlaž Hrastnik2021-03-08 08:32:13 +0000
committerBlaž Hrastnik2021-03-08 08:32:13 +0000
commit8fe459066605a794f8dceedaf872f71ffd4c750a (patch)
tree0d3f10b3668dbfc8aa7805d1974f89ed1333b60d /helix-term/src/ui
parentddcf5156c0260debc522b0420f93e0c523697eb4 (diff)
ui: popup: scroll documentation popups with c-u/c-d.
Diffstat (limited to 'helix-term/src/ui')
-rw-r--r--helix-term/src/ui/markdown.rs5
-rw-r--r--helix-term/src/ui/popup.rs27
2 files changed, 30 insertions, 2 deletions
diff --git a/helix-term/src/ui/markdown.rs b/helix-term/src/ui/markdown.rs
index 976d00fa..3040e1ca 100644
--- a/helix-term/src/ui/markdown.rs
+++ b/helix-term/src/ui/markdown.rs
@@ -112,8 +112,9 @@ impl Component for Markdown {
let contents = Text::from(lines);
- let par = Paragraph::new(contents).wrap(Wrap { trim: false });
- // .scroll(x, y) offsets
+ let par = Paragraph::new(contents)
+ .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);
par.render(area, surface);
diff --git a/helix-term/src/ui/popup.rs b/helix-term/src/ui/popup.rs
index 4ca70c50..0dbb3a24 100644
--- a/helix-term/src/ui/popup.rs
+++ b/helix-term/src/ui/popup.rs
@@ -19,6 +19,7 @@ pub struct Popup {
contents: Box<dyn Component>,
position: Option<Position>,
size: (u16, u16),
+ scroll: usize,
}
impl Popup {
@@ -29,12 +30,21 @@ impl Popup {
contents,
position: None,
size: (0, 0),
+ scroll: 0,
}
}
pub fn set_position(&mut self, pos: Option<Position>) {
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 {
@@ -64,6 +74,21 @@ impl Component for Popup {
code: KeyCode::Char('c'),
modifiers: KeyModifiers::CONTROL,
} => 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),
}
// 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::widgets::{Paragraph, Widget, Wrap};
+ cx.scroll = Some(self.scroll);
+
let position = self
.position
.or_else(|| cx.editor.cursor_position())