aboutsummaryrefslogtreecommitdiff
path: root/helix-term/src/ui
diff options
context:
space:
mode:
authorGokul Soumya2021-08-21 05:21:20 +0000
committerGitHub2021-08-21 05:21:20 +0000
commitf9375f449c8b7bbf792c88b89903fe38d524f2e5 (patch)
tree71a2313a7a7cebc071dffd9e3423f407eb4192e0 /helix-term/src/ui
parentac8bc541087f815a026b4c664c069d8806b9c5de (diff)
Refactor new Rect construction (#575)
* Refactor new Rect construction Introduces methods that can be chained to construct new Rects out of pre-existing ones * Clamp x and y to edges in Rect chop methods * Rename Rect clipping functions
Diffstat (limited to 'helix-term/src/ui')
-rw-r--r--helix-term/src/ui/editor.rs24
-rw-r--r--helix-term/src/ui/markdown.rs9
-rw-r--r--helix-term/src/ui/menu.rs8
-rw-r--r--helix-term/src/ui/picker.rs37
4 files changed, 32 insertions, 46 deletions
diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs
index b0e6de3e..d01d08e8 100644
--- a/helix-term/src/ui/editor.rs
+++ b/helix-term/src/ui/editor.rs
@@ -108,13 +108,11 @@ impl EditorView {
self.render_diagnostics(doc, view, inner, surface, theme);
- let area = Rect::new(
- view.area.x,
- view.area.y + view.area.height.saturating_sub(1),
- view.area.width,
- 1,
- );
- self.render_statusline(doc, view, area, surface, theme, is_focused);
+ let statusline_area = view
+ .area
+ .clip_top(view.area.height.saturating_sub(1))
+ .clip_bottom(1); // -1 from bottom to remove commandline
+ self.render_statusline(doc, view, statusline_area, surface, theme, is_focused);
}
/// Get syntax highlights for a document in a view represented by the first line
@@ -528,12 +526,7 @@ impl EditorView {
let width = 80.min(viewport.width);
let height = 15.min(viewport.height);
paragraph.render(
- Rect::new(
- viewport.right() - width,
- viewport.y as u16 + 1,
- width,
- height,
- ),
+ Rect::new(viewport.right() - width, viewport.y + 1, width, height),
surface,
);
}
@@ -572,7 +565,7 @@ impl EditorView {
theme.get("ui.statusline.inactive")
};
// statusline
- surface.set_style(Rect::new(viewport.x, viewport.y, viewport.width, 1), style);
+ surface.set_style(viewport.with_height(1), style);
if is_focused {
surface.set_string(viewport.x + 1, viewport.y, mode, style);
}
@@ -1001,8 +994,7 @@ impl Component for EditorView {
surface.set_style(area, cx.editor.theme.get("ui.background"));
// if the terminal size suddenly changed, we need to trigger a resize
- cx.editor
- .resize(Rect::new(area.x, area.y, area.width, area.height - 1)); // - 1 to account for commandline
+ cx.editor.resize(area.clip_bottom(1)); // -1 from bottom for commandline
for (view, is_focused) in cx.editor.tree.views() {
let doc = cx.editor.document(view.doc).unwrap();
diff --git a/helix-term/src/ui/markdown.rs b/helix-term/src/ui/markdown.rs
index b7e29f21..28542cdc 100644
--- a/helix-term/src/ui/markdown.rs
+++ b/helix-term/src/ui/markdown.rs
@@ -13,7 +13,7 @@ use helix_core::{
Rope,
};
use helix_view::{
- graphics::{Color, Rect, Style},
+ graphics::{Color, Margin, Rect, Style},
Theme,
};
@@ -207,8 +207,11 @@ impl Component for Markdown {
.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);
+ let margin = Margin {
+ vertical: 1,
+ horizontal: 1,
+ };
+ par.render(area.inner(&margin), surface);
}
fn required_size(&mut self, viewport: (u16, u16)) -> Option<(u16, u16)> {
diff --git a/helix-term/src/ui/menu.rs b/helix-term/src/ui/menu.rs
index 3e63db35..a56cf19b 100644
--- a/helix-term/src/ui/menu.rs
+++ b/helix-term/src/ui/menu.rs
@@ -304,14 +304,6 @@ impl<T: Item + 'static> Component for Menu<T> {
},
);
- // // TODO: set bg for the whole row if selected
- // if line == self.cursor {
- // surface.set_style(
- // Rect::new(area.x, area.y + i as u16, area.width - 1, 1),
- // selected,
- // )
- // }
-
for (i, _) in (scroll..(scroll + win_height).min(len)).enumerate() {
let is_marked = i >= scroll_line && i < scroll_line + scroll_height;
diff --git a/helix-term/src/ui/picker.rs b/helix-term/src/ui/picker.rs
index 2cc25c24..ecf9d528 100644
--- a/helix-term/src/ui/picker.rs
+++ b/helix-term/src/ui/picker.rs
@@ -19,7 +19,7 @@ use helix_core::Position;
use helix_view::{
document::canonicalize_path,
editor::Action,
- graphics::{Color, CursorKind, Rect, Style},
+ graphics::{Color, CursorKind, Margin, Rect, Style},
Document, Editor,
};
@@ -90,23 +90,26 @@ impl<T: 'static> Component for FilePicker<T> {
area.width
};
- let picker_area = Rect::new(area.x, area.y, picker_width, area.height);
+ let picker_area = area.with_width(picker_width);
self.picker.render(picker_area, surface, cx);
if !render_preview {
return;
}
- let preview_area = Rect::new(area.x + picker_width, area.y, area.width / 2, area.height);
+ let preview_area = area.clip_left(picker_width);
// don't like this but the lifetime sucks
let block = Block::default().borders(Borders::ALL);
// calculate the inner area inside the box
- let mut inner = block.inner(preview_area);
+ let inner = block.inner(preview_area);
// 1 column gap on either side
- inner.x += 1;
- inner.width = inner.width.saturating_sub(2);
+ let margin = Margin {
+ vertical: 1,
+ horizontal: 0,
+ };
+ let inner = inner.inner(&margin);
block.render(preview_area, surface);
@@ -282,15 +285,11 @@ impl<T> Picker<T> {
// - score all the names in relation to input
fn inner_rect(area: Rect) -> Rect {
- let padding_vertical = area.height * 10 / 100;
- let padding_horizontal = area.width * 10 / 100;
-
- Rect::new(
- area.x + padding_horizontal,
- area.y + padding_vertical,
- area.width - padding_horizontal * 2,
- area.height - padding_vertical * 2,
- )
+ let margin = Margin {
+ vertical: area.height * 10 / 100,
+ horizontal: area.width * 10 / 100,
+ };
+ area.inner(&margin)
}
impl<T: 'static> Component for Picker<T> {
@@ -410,7 +409,7 @@ impl<T: 'static> Component for Picker<T> {
// -- Render the input bar:
- let area = Rect::new(inner.x + 1, inner.y, inner.width - 1, 1);
+ let area = inner.clip_left(1).with_height(1);
let count = format!("{}/{}", self.matches.len(), self.options.len());
surface.set_stringn(
@@ -434,8 +433,8 @@ impl<T: 'static> Component for Picker<T> {
}
// -- Render the contents:
- // subtract the area of the prompt (-2) and current item marker " > " (-3)
- let inner = Rect::new(inner.x + 3, inner.y + 2, inner.width - 3, inner.height - 2);
+ // subtract area of prompt from top and current item marker " > " from left
+ let inner = inner.clip_top(2).clip_left(3);
let selected = cx.editor.theme.get("ui.text.focus");
@@ -474,7 +473,7 @@ impl<T: 'static> Component for Picker<T> {
let inner = block.inner(area);
// prompt area
- let area = Rect::new(inner.x + 1, inner.y, inner.width - 1, 1);
+ let area = inner.clip_left(1).with_height(1);
self.prompt.cursor(area, editor)
}