aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGokul Soumya2022-06-21 16:52:08 +0000
committerGitHub2022-06-21 16:52:08 +0000
commit8e8367eea6ff146c7e1097af153398832691e078 (patch)
tree02e137d840c02eb99b926c3bb6f8349902b0946a
parentce85b9716df5e1ea804994202687f19cd711ae1b (diff)
Refactor Margin for fine grained control (#2727)
-rw-r--r--helix-term/src/commands/lsp.rs6
-rw-r--r--helix-term/src/ui/info.rs5
-rw-r--r--helix-term/src/ui/markdown.rs5
-rw-r--r--helix-term/src/ui/picker.rs5
-rw-r--r--helix-term/src/ui/popup.rs9
-rw-r--r--helix-term/src/ui/prompt.rs5
-rw-r--r--helix-tui/src/layout.rs16
-rw-r--r--helix-view/src/graphics.rs67
8 files changed, 75 insertions, 43 deletions
diff --git a/helix-term/src/commands/lsp.rs b/helix-term/src/commands/lsp.rs
index b6bea8d6..3ee3c54a 100644
--- a/helix-term/src/commands/lsp.rs
+++ b/helix-term/src/commands/lsp.rs
@@ -287,10 +287,8 @@ pub fn code_action(cx: &mut Context) {
});
picker.move_down(); // pre-select the first item
- let popup = Popup::new("code-action", picker).margin(helix_view::graphics::Margin {
- vertical: 1,
- horizontal: 1,
- });
+ let popup =
+ Popup::new("code-action", picker).margin(helix_view::graphics::Margin::all(1));
compositor.replace_or_push("code-action", popup);
},
)
diff --git a/helix-term/src/ui/info.rs b/helix-term/src/ui/info.rs
index 272244c1..cc6b7483 100644
--- a/helix-term/src/ui/info.rs
+++ b/helix-term/src/ui/info.rs
@@ -27,10 +27,7 @@ impl Component for Info {
.borders(Borders::ALL)
.border_style(popup_style);
- let margin = Margin {
- vertical: 0,
- horizontal: 1,
- };
+ let margin = Margin::horizontal(1);
let inner = block.inner(area).inner(&margin);
block.render(area, surface);
diff --git a/helix-term/src/ui/markdown.rs b/helix-term/src/ui/markdown.rs
index 037e2f13..e3ce2cd5 100644
--- a/helix-term/src/ui/markdown.rs
+++ b/helix-term/src/ui/markdown.rs
@@ -323,10 +323,7 @@ impl Component for Markdown {
.wrap(Wrap { trim: false })
.scroll((cx.scroll.unwrap_or_default() as u16, 0));
- let margin = Margin {
- vertical: 1,
- horizontal: 1,
- };
+ let margin = Margin::all(1);
par.render(area.inner(&margin), surface);
}
diff --git a/helix-term/src/ui/picker.rs b/helix-term/src/ui/picker.rs
index 95ec8405..ebff9827 100644
--- a/helix-term/src/ui/picker.rs
+++ b/helix-term/src/ui/picker.rs
@@ -200,10 +200,7 @@ impl<T: 'static> Component for FilePicker<T> {
// calculate the inner area inside the box
let inner = block.inner(preview_area);
// 1 column gap on either side
- let margin = Margin {
- vertical: 0,
- horizontal: 1,
- };
+ let margin = Margin::horizontal(1);
let inner = inner.inner(&margin);
block.render(preview_area, surface);
diff --git a/helix-term/src/ui/popup.rs b/helix-term/src/ui/popup.rs
index 185ec15d..f5b79526 100644
--- a/helix-term/src/ui/popup.rs
+++ b/helix-term/src/ui/popup.rs
@@ -27,10 +27,7 @@ impl<T: Component> Popup<T> {
Self {
contents,
position: None,
- margin: Margin {
- vertical: 0,
- horizontal: 0,
- },
+ margin: Margin::none(),
size: (0, 0),
child_size: (0, 0),
scroll: 0,
@@ -163,8 +160,8 @@ impl<T: Component> Component for Popup<T> {
self.child_size = (width, height);
self.size = (
- (width + self.margin.horizontal * 2).min(max_width),
- (height + self.margin.vertical * 2).min(max_height),
+ (width + self.margin.width()).min(max_width),
+ (height + self.margin.height()).min(max_height),
);
// re-clamp scroll offset
diff --git a/helix-term/src/ui/prompt.rs b/helix-term/src/ui/prompt.rs
index 64154bae..7744a161 100644
--- a/helix-term/src/ui/prompt.rs
+++ b/helix-term/src/ui/prompt.rs
@@ -430,10 +430,7 @@ impl Prompt {
.borders(Borders::ALL)
.border_style(background);
- let inner = block.inner(area).inner(&Margin {
- vertical: 0,
- horizontal: 1,
- });
+ let inner = block.inner(area).inner(&Margin::horizontal(1));
block.render(area, surface);
text.render(inner, surface, cx);
diff --git a/helix-tui/src/layout.rs b/helix-tui/src/layout.rs
index e6a84aa0..7c72a778 100644
--- a/helix-tui/src/layout.rs
+++ b/helix-tui/src/layout.rs
@@ -68,10 +68,7 @@ impl Default for Layout {
fn default() -> Layout {
Layout {
direction: Direction::Vertical,
- margin: Margin {
- horizontal: 0,
- vertical: 0,
- },
+ margin: Margin::none(),
constraints: Vec::new(),
}
}
@@ -87,20 +84,19 @@ impl Layout {
}
pub fn margin(mut self, margin: u16) -> Layout {
- self.margin = Margin {
- horizontal: margin,
- vertical: margin,
- };
+ self.margin = Margin::all(margin);
self
}
pub fn horizontal_margin(mut self, horizontal: u16) -> Layout {
- self.margin.horizontal = horizontal;
+ self.margin.left = horizontal;
+ self.margin.right = horizontal;
self
}
pub fn vertical_margin(mut self, vertical: u16) -> Layout {
- self.margin.vertical = vertical;
+ self.margin.top = vertical;
+ self.margin.bottom = vertical;
self
}
diff --git a/helix-view/src/graphics.rs b/helix-view/src/graphics.rs
index 6d0a9292..7033b7a4 100644
--- a/helix-view/src/graphics.rs
+++ b/helix-view/src/graphics.rs
@@ -27,8 +27,61 @@ impl Default for CursorKind {
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct Margin {
- pub vertical: u16,
- pub horizontal: u16,
+ pub left: u16,
+ pub right: u16,
+ pub top: u16,
+ pub bottom: u16,
+}
+
+impl Margin {
+ pub fn none() -> Self {
+ Self {
+ left: 0,
+ right: 0,
+ top: 0,
+ bottom: 0,
+ }
+ }
+
+ /// Set uniform margin for all sides.
+ pub fn all(value: u16) -> Self {
+ Self {
+ left: value,
+ right: value,
+ top: value,
+ bottom: value,
+ }
+ }
+
+ /// Set the margin of left and right sides to specified value.
+ pub fn horizontal(value: u16) -> Self {
+ Self {
+ left: value,
+ right: value,
+ top: 0,
+ bottom: 0,
+ }
+ }
+
+ /// Set the margin of top and bottom sides to specified value.
+ pub fn vertical(value: u16) -> Self {
+ Self {
+ left: 0,
+ right: 0,
+ top: value,
+ bottom: value,
+ }
+ }
+
+ /// Get the total width of the margin (left + right)
+ pub fn width(&self) -> u16 {
+ self.left + self.right
+ }
+
+ /// Get the total height of the margin (top + bottom)
+ pub fn height(&self) -> u16 {
+ self.top + self.bottom
+ }
}
/// A simple rectangle used in the computation of the layout and to give widgets an hint about the
@@ -141,14 +194,14 @@ impl Rect {
}
pub fn inner(self, margin: &Margin) -> Rect {
- if self.width < 2 * margin.horizontal || self.height < 2 * margin.vertical {
+ if self.width < margin.width() || self.height < margin.height() {
Rect::default()
} else {
Rect {
- x: self.x + margin.horizontal,
- y: self.y + margin.vertical,
- width: self.width - 2 * margin.horizontal,
- height: self.height - 2 * margin.vertical,
+ x: self.x + margin.left,
+ y: self.y + margin.top,
+ width: self.width - margin.width(),
+ height: self.height - margin.height(),
}
}
}