@@ -95,7 +95,7 @@ impl Tree {
95 self.focus = node;
95 self.focus = node;
97 // recalculate all the sizes
97 // recalculate all the sizes
98− self.traverse();
98+ self.recalculate();
@@ -126,10 +126,10 @@ impl Tree {
127 pub fn resize(&mut self, area: Rect) {
127 pub fn resize(&mut self, area: Rect) {
128 self.area = area;
128 self.area = area;
129− self.traverse();
129+ self.recalculate();
132− pub fn traverse(&mut self) {
132+ pub fn recalculate(&mut self) {
133 self.stack.push((self.root, self.area));
133 self.stack.push((self.root, self.area));
135 // take the area
135 // take the area
@@ -170,4 +170,64 @@ impl Tree {
174+ pub fn traverse(&self) -> Traverse {
178+ pub fn focus_next(&mut self) {
179+ // This function is very dumb, but that's because we don't store any parent links.
180+ // (we'd be able to go parent.next_sibling() recursively until we find something)
181+ // For now that's okay though, since it's unlikely you'll be able to open a large enough
182+ // number of splits to notice.
184+ let iter = self.traverse();
186+ let mut iter = iter.skip_while(|&(key, _view)| key != self.focus);
187+ iter.next(); // take the focused value
194+ // extremely crude, take the first item again
195+ let (key, _) = self.traverse().next().unwrap();
202+pub struct Traverse<'a> {
204+ stack: Vec<Key>, // TODO: reuse the one we use on update
207+impl<'a> Traverse<'a> {
208+ fn new(tree: &'a Tree) -> Self {
211+ stack: vec![tree.root],
216+impl<'a> Iterator for Traverse<'a> {
217+ type Item = (Key, &'a View);
219+ fn next(&mut self) -> Option<Self::Item> {
221+ let key = self.stack.pop()?;
223+ let node = &self.tree.nodes[key];
226+ Node::View(view) => return Some((key, view)),
227+ Node::Container(container) => {
228+ self.stack.extend(container.children.iter().rev());