Skip to content

Commit d25e6a4

Browse files
committed
feat: Inherit glyphs
Fixes #30
1 parent 28ba078 commit d25e6a4

File tree

2 files changed

+35
-31
lines changed

2 files changed

+35
-31
lines changed

src/lib.rs

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ pub struct Tree<D: Display> {
1616
pub root: D,
1717
pub leaves: Vec<Tree<D>>,
1818
multiline: bool,
19-
glyphs: GlyphPalette,
19+
glyphs: Option<GlyphPalette>,
2020
}
2121

2222
impl<D: Display> Tree<D> {
@@ -25,7 +25,7 @@ impl<D: Display> Tree<D> {
2525
root,
2626
leaves: Vec::new(),
2727
multiline: false,
28-
glyphs: GlyphPalette::new(),
28+
glyphs: None,
2929
}
3030
}
3131

@@ -42,7 +42,7 @@ impl<D: Display> Tree<D> {
4242

4343
/// Customize the rendering of this node
4444
pub fn with_glyphs(mut self, glyphs: GlyphPalette) -> Self {
45-
self.glyphs = glyphs;
45+
self.glyphs = Some(glyphs);
4646
self
4747
}
4848
}
@@ -56,7 +56,7 @@ impl<D: Display> Tree<D> {
5656

5757
/// Customize the rendering of this node
5858
pub fn set_glyphs(&mut self, glyphs: GlyphPalette) -> &mut Self {
59-
self.glyphs = glyphs;
59+
self.glyphs = Some(glyphs);
6060
self
6161
}
6262
}
@@ -92,25 +92,27 @@ impl<D: Display> Display for Tree<D> {
9292
writeln!(f)?;
9393
let mut queue = DisplauQueue::new();
9494
let no_space = Rc::new(Vec::new());
95-
enqueue_leaves(&mut queue, self, no_space);
96-
while let Some((last, leaf, spaces)) = queue.pop_front() {
95+
let default_glyphs = GlyphPalette::new();
96+
let glyphs = self.glyphs.as_ref().unwrap_or(&default_glyphs);
97+
enqueue_leaves(&mut queue, self, &glyphs, no_space);
98+
while let Some((last, leaf, glyphs, spaces)) = queue.pop_front() {
9799
let mut prefix = (
98100
if last {
99-
leaf.glyphs.last_item
101+
glyphs.last_item
100102
} else {
101-
leaf.glyphs.middle_item
103+
glyphs.middle_item
102104
},
103-
leaf.glyphs.item_indent,
105+
glyphs.item_indent,
104106
);
105107

106108
if leaf.multiline {
107109
let rest_prefix = (
108110
if last {
109-
leaf.glyphs.last_skip
111+
glyphs.last_skip
110112
} else {
111-
leaf.glyphs.middle_skip
113+
glyphs.middle_skip
112114
},
113-
leaf.glyphs.skip_indent,
115+
glyphs.skip_indent,
114116
);
115117
debug_assert_eq!(prefix.0.chars().count(), rest_prefix.0.chars().count());
116118
debug_assert_eq!(prefix.1.chars().count(), rest_prefix.1.chars().count());
@@ -149,28 +151,30 @@ impl<D: Display> Display for Tree<D> {
149151
let s: &Vec<SpacePalette> = &spaces;
150152
let mut child_spaces = s.clone();
151153
child_spaces.push(if last {
152-
leaf.glyphs.last_space()
154+
glyphs.last_space()
153155
} else {
154-
leaf.glyphs.middle_space()
156+
glyphs.middle_space()
155157
});
156158
let child_spaces = Rc::new(child_spaces);
157-
enqueue_leaves(&mut queue, leaf, child_spaces);
159+
enqueue_leaves(&mut queue, leaf, glyphs, child_spaces);
158160
}
159161
}
160162
Ok(())
161163
}
162164
}
163165

164-
type DisplauQueue<'t, D> = VecDeque<(bool, &'t Tree<D>, Rc<Vec<SpacePalette>>)>;
166+
type DisplauQueue<'t, D> = VecDeque<(bool, &'t Tree<D>, &'t GlyphPalette, Rc<Vec<SpacePalette>>)>;
165167

166168
fn enqueue_leaves<'t, D: Display>(
167169
queue: &mut DisplauQueue<'t, D>,
168170
parent: &'t Tree<D>,
171+
parent_glyphs: &'t GlyphPalette,
169172
spaces: Rc<Vec<SpacePalette>>,
170173
) {
171174
for (i, leaf) in parent.leaves.iter().rev().enumerate() {
172175
let last = i == 0;
173-
queue.push_front((last, leaf, spaces.clone()));
176+
let glyphs = leaf.glyphs.as_ref().unwrap_or(parent_glyphs);
177+
queue.push_front((last, leaf, glyphs, spaces.clone()));
174178
}
175179
}
176180

src/tests.rs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -103,20 +103,20 @@ fn render_custom_glyphs() {
103103
format!("{}", tree),
104104
str![[r#"
105105
node 1
106-
├── node 1.1
107-
├── node 1.2
108-
├── node 1.3
109-
(mid )(indent )node 1.3.1
110-
(mid )(indent )node 1.3.2
111-
(last )(indent )node 1.3.3
112-
(lskip)(iskip )├── node 1.3.3.1
113-
(lskip)(iskip )└── node 1.3.3.2
114-
└── node 1.4
115-
├── node 1.4.1
116-
├── node 1.4.2
117-
└── node 1.4.3
118-
├── node 1.4.3.1
119-
└── node 1.4.3.2
106+
[mid ][indent ]node 1.1
107+
[mid ][indent ]node 1.2
108+
[mid ][indent ]node 1.3
109+
[mskip][iskip ](mid )(indent )node 1.3.1
110+
[mskip][iskip ](mid )(indent )node 1.3.2
111+
[mskip][iskip ](last )(indent )node 1.3.3
112+
[mskip][iskip ](lskip)(iskip )(mid )(indent )node 1.3.3.1
113+
[mskip][iskip ](lskip)(iskip )(last )(indent )node 1.3.3.2
114+
[last ][indent ]node 1.4
115+
[lskip][iskip ][mid ][indent ]node 1.4.1
116+
[lskip][iskip ][mid ][indent ]node 1.4.2
117+
[lskip][iskip ][last ][indent ]node 1.4.3
118+
[lskip][iskip ][lskip][iskip ][mid ][indent ]node 1.4.3.1
119+
[lskip][iskip ][lskip][iskip ][last ][indent ]node 1.4.3.2
120120
121121
"#]]
122122
);

0 commit comments

Comments
 (0)