Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'helix-view/src/info.rs')
-rw-r--r--helix-view/src/info.rs44
1 files changed, 44 insertions, 0 deletions
diff --git a/helix-view/src/info.rs b/helix-view/src/info.rs
index 3877df21..545011f9 100644
--- a/helix-view/src/info.rs
+++ b/helix-view/src/info.rs
@@ -73,3 +73,47 @@ impl Info {
infobox
}
}
+
+// term
+
+use crate::{
+ compositor::{Component, RenderContext},
+ graphics::{Margin, Rect},
+};
+use tui::widgets::{Block, Borders, Paragraph, Widget};
+
+impl Component for Info {
+ fn render(&mut self, viewport: Rect, cx: &mut RenderContext<'_>) {
+ let text_style = cx.editor.theme.get("ui.text.info");
+ let popup_style = cx.editor.theme.get("ui.popup.info");
+
+ // Calculate the area of the terminal to modify. Because we want to
+ // render at the bottom right, we use the viewport's width and height
+ // which evaluate to the most bottom right coordinate.
+ let width = self.width + 2 + 2; // +2 for border, +2 for margin
+ let height = self.height + 2; // +2 for border
+ let area = viewport.intersection(Rect::new(
+ viewport.width.saturating_sub(width),
+ viewport.height.saturating_sub(height + 2), // +2 for statusline
+ width,
+ height,
+ ));
+ cx.surface.clear_with(area, popup_style);
+
+ let block = Block::default()
+ .title(self.title.as_str())
+ .borders(Borders::ALL)
+ .border_style(popup_style);
+
+ let margin = Margin {
+ vertical: 0,
+ horizontal: 1,
+ };
+ let inner = block.inner(area).inner(&margin);
+ block.render(area, cx.surface);
+
+ Paragraph::new(self.text.as_str())
+ .style(text_style)
+ .render(inner, cx.surface);
+ }
+}