summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClementTsang <cjhtsang@uwaterloo.ca>2021-12-12 23:14:14 -0500
committerClementTsang <cjhtsang@uwaterloo.ca>2021-12-12 23:14:14 -0500
commitc094efa74c6154440483f18cb056a9f2a7da2447 (patch)
treee07415e4855e4247e8b4c5995e9a69f09f17f942
parent86edfed892dbd0e4dc7eaae1f7ea56ac396bc4e5 (diff)
Fix offset bug
-rw-r--r--src/app.rs21
-rw-r--r--src/tuice/component/base/flex.rs40
2 files changed, 33 insertions, 28 deletions
diff --git a/src/app.rs b/src/app.rs
index 3554bef5..635cb544 100644
--- a/src/app.rs
+++ b/src/app.rs
@@ -238,11 +238,22 @@ impl Application for AppState {
use crate::tuice::FlexElement;
use crate::tuice::TextTable;
- Flex::row_with_children(vec![
- FlexElement::new(TextTable::new(vec!["A", "B", "C"])),
- FlexElement::new(TextTable::new(vec!["D", "E", "F"])),
- ])
- .into()
+ Flex::column()
+ .with_flex_child(
+ Flex::row_with_children(vec![
+ FlexElement::new(TextTable::new(vec!["A", "B", "C"])),
+ FlexElement::new(TextTable::new(vec!["D", "E", "F"])),
+ ]),
+ 1,
+ )
+ .with_flex_child(
+ Flex::row_with_children(vec![
+ FlexElement::new(TextTable::new(vec!["G", "H", "I", "J"])),
+ FlexElement::new(TextTable::new(vec!["K", "L", "M", "N"])),
+ ]),
+ 2,
+ )
+ .into()
}
fn destroy(&mut self) {
diff --git a/src/tuice/component/base/flex.rs b/src/tuice/component/base/flex.rs
index 9520dc82..439705ba 100644
--- a/src/tuice/component/base/flex.rs
+++ b/src/tuice/component/base/flex.rs
@@ -1,4 +1,3 @@
-use itertools::izip;
use tui::{backend::Backend, layout::Rect, Frame};
pub mod flex_element;
@@ -111,9 +110,8 @@ impl<'a, Message> TmpComponent<Message> for Flex<'a, Message> {
let mut remaining_bounds = bounds;
let mut children = vec![LayoutNode::default(); self.children.len()];
let mut flexible_children_indexes = vec![];
- let mut offsets = vec![];
- let mut current_x = 0;
- let mut current_y = 0;
+ let mut current_x_offset = 0;
+ let mut current_y_offset = 0;
let mut sizes = Vec::with_capacity(self.children.len());
let mut current_size = Size::default();
let mut total_flex = 0;
@@ -129,16 +127,6 @@ impl<'a, Message> TmpComponent<Message> for Flex<'a, Message> {
let size = child.child_layout(remaining_bounds, child_node);
current_size += size;
remaining_bounds.shrink_size(size);
- offsets.push((current_x, current_y));
-
- match self.alignment {
- Axis::Horizontal => {
- current_x += size.width;
- }
- Axis::Vertical => {
- current_y += size.height;
- }
- }
sizes.push(size);
} else {
@@ -161,9 +149,6 @@ impl<'a, Message> TmpComponent<Message> for Flex<'a, Message> {
let new_size =
child.ratio_layout(remaining_bounds, total_flex, child_node, self.alignment);
current_size += new_size;
- offsets.push((current_x, current_y));
- current_x += new_size.width;
-
*size = new_size;
});
@@ -181,12 +166,21 @@ impl<'a, Message> TmpComponent<Message> for Flex<'a, Message> {
// Now that we're done determining sizes, convert all children into the appropriate
// layout nodes. Remember - parents determine children, and so, we determine
// children here!
- izip!(sizes, offsets, children.iter_mut()).for_each(
- |(size, offset, child): (Size, (u16, u16), &mut LayoutNode)| {
- let rect = Rect::new(offset.0, offset.1, size.width, size.height);
- child.rect = rect;
- },
- );
+ sizes
+ .iter()
+ .zip(children.iter_mut())
+ .for_each(|(size, child)| {
+ child.rect = Rect::new(current_x_offset, current_y_offset, size.width, size.height);
+
+ match self.alignment {
+ Axis::Horizontal => {
+ current_x_offset += size.width;
+ }
+ Axis::Vertical => {
+ current_y_offset += size.height;
+ }
+ }
+ });
node.children = children;
current_size