fix: avoid child area overflow on split (#10620)

This commit is contained in:
Kitsu 2024-04-29 10:18:05 -03:00 committed by GitHub
parent e2594b64c0
commit 8db93013fb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -407,11 +407,13 @@ impl Tree {
} }
Layout::Vertical => { Layout::Vertical => {
let len = container.children.len(); let len = container.children.len();
let len_u16 = len as u16;
let width = area.width / len as u16;
let inner_gap = 1u16; let inner_gap = 1u16;
// let total_gap = inner_gap * (len as u16 - 1); let total_gap = inner_gap * len_u16.saturating_sub(2);
let used_area = area.width.saturating_sub(total_gap);
let width = used_area / len_u16;
let mut child_x = area.x; let mut child_x = area.x;
@ -925,13 +927,43 @@ mod test {
assert_eq!(3, tree.views().count()); assert_eq!(3, tree.views().count());
assert_eq!( assert_eq!(
vec![ vec![
tree_area_width / 3, tree_area_width / 3 - 1, // gap here
tree_area_width / 3, tree_area_width / 3 - 1, // gap here
tree_area_width / 3 - 2 // Rounding in `recalculate`. tree_area_width / 3
], ],
tree.views() tree.views()
.map(|(view, _)| view.area.width) .map(|(view, _)| view.area.width)
.collect::<Vec<_>>() .collect::<Vec<_>>()
); );
} }
#[test]
fn vsplit_gap_rounding() {
let (tree_area_width, tree_area_height) = (80, 24);
let mut tree = Tree::new(Rect {
x: 0,
y: 0,
width: tree_area_width,
height: tree_area_height,
});
let mut view = View::new(DocumentId::default(), GutterConfig::default());
view.area = Rect::new(0, 0, tree_area_width, tree_area_height);
tree.insert(view);
for _ in 0..9 {
let view = View::new(DocumentId::default(), GutterConfig::default());
tree.split(view, Layout::Vertical);
}
assert_eq!(10, tree.views().count());
assert_eq!(
std::iter::repeat(7)
.take(9)
.chain(Some(8)) // Rounding in `recalculate`.
.collect::<Vec<_>>(),
tree.views()
.map(|(view, _)| view.area.width)
.collect::<Vec<_>>()
);
}
} }