diff options
author | Blaž Hrastnik | 2022-01-31 04:42:32 +0000 |
---|---|---|
committer | Blaž Hrastnik | 2022-01-31 07:04:58 +0000 |
commit | 094a0aa3f9877e3b1049f262e65c8efea2b7b73e (patch) | |
tree | f1fc1ec2d3f9d2d3529d242133ffe096ba79a5ce /helix-term/src/ui | |
parent | f7f55143a1c8f8f643c4ca59d8c4beb9612ef0bb (diff) |
Render code actions as a menu, allow adding padding to popup
Diffstat (limited to 'helix-term/src/ui')
-rw-r--r-- | helix-term/src/ui/menu.rs | 15 | ||||
-rw-r--r-- | helix-term/src/ui/mod.rs | 2 | ||||
-rw-r--r-- | helix-term/src/ui/popup.rs | 24 |
3 files changed, 32 insertions, 9 deletions
diff --git a/helix-term/src/ui/menu.rs b/helix-term/src/ui/menu.rs index 9758732c..e127e09b 100644 --- a/helix-term/src/ui/menu.rs +++ b/helix-term/src/ui/menu.rs @@ -14,11 +14,18 @@ use helix_view::{graphics::Rect, Editor}; use tui::layout::Constraint; pub trait Item { - fn sort_text(&self) -> &str; - fn filter_text(&self) -> &str; - fn label(&self) -> &str; - fn row(&self) -> Row; + + fn sort_text(&self) -> &str { + self.label() + } + fn filter_text(&self) -> &str { + self.label() + } + + fn row(&self) -> Row { + Row::new(vec![Cell::from(self.label())]) + } } pub struct Menu<T: Item> { diff --git a/helix-term/src/ui/mod.rs b/helix-term/src/ui/mod.rs index 9ff9118f..5d650c65 100644 --- a/helix-term/src/ui/mod.rs +++ b/helix-term/src/ui/mod.rs @@ -2,7 +2,7 @@ mod completion; pub(crate) mod editor; mod info; mod markdown; -mod menu; +pub mod menu; mod picker; mod popup; mod prompt; diff --git a/helix-term/src/ui/popup.rs b/helix-term/src/ui/popup.rs index bf7510a2..4d319423 100644 --- a/helix-term/src/ui/popup.rs +++ b/helix-term/src/ui/popup.rs @@ -6,7 +6,7 @@ use crossterm::event::Event; use tui::buffer::Buffer as Surface; use helix_core::Position; -use helix_view::graphics::Rect; +use helix_view::graphics::{Margin, Rect}; // TODO: share logic with Menu, it's essentially Popup(render_fn), but render fn needs to return // a width/height hint. maybe Popup(Box<Component>) @@ -14,6 +14,7 @@ use helix_view::graphics::Rect; pub struct Popup<T: Component> { contents: T, position: Option<Position>, + margin: Margin, size: (u16, u16), child_size: (u16, u16), scroll: usize, @@ -25,6 +26,10 @@ impl<T: Component> Popup<T> { Self { contents, position: None, + margin: Margin { + vertical: 0, + horizontal: 0, + }, size: (0, 0), child_size: (0, 0), scroll: 0, @@ -36,6 +41,11 @@ impl<T: Component> Popup<T> { self.position = pos; } + pub fn margin(mut self, margin: Margin) -> Self { + self.margin = margin; + self + } + pub fn get_rel_position(&mut self, viewport: Rect, cx: &Context) -> (u16, u16) { let position = self .position @@ -126,13 +136,18 @@ impl<T: Component> Component for Popup<T> { let max_width = 120.min(viewport.0); let max_height = 26.min(viewport.1.saturating_sub(2)); // add some spacing in the viewport + let inner = Rect::new(0, 0, max_width, max_height).inner(&self.margin); + let (width, height) = self .contents - .required_size((max_width, max_height)) + .required_size((inner.width, inner.height)) .expect("Component needs required_size implemented in order to be embedded in a popup"); self.child_size = (width, height); - self.size = (width.min(max_width), height.min(max_height)); + self.size = ( + (width + self.margin.horizontal * 2).min(max_width), + (height + self.margin.vertical * 2).min(max_height), + ); // re-clamp scroll offset let max_offset = self.child_size.1.saturating_sub(self.size.1); @@ -156,7 +171,8 @@ impl<T: Component> Component for Popup<T> { let background = cx.editor.theme.get("ui.popup"); surface.clear_with(area, background); - self.contents.render(area, surface, cx); + let inner = area.inner(&self.margin); + self.contents.render(inner, surface, cx); } fn id(&self) -> Option<&'static str> { |