(&mut self, _: &str)
| 102 | } |
| 103 | |
| 104 | pub fn draw(&mut self, _: &str) -> Result<usize> { |
| 105 | let mut pending = false; |
| 106 | |
| 107 | // mutable iterator of items, skipping things outside the viewport |
| 108 | let mut items = self.strcts.iter_mut() |
| 109 | .map(|(a, item)| { |
| 110 | if !item.is_in_view(&self.metadata, &self.blocks) { |
| 111 | if let FoldInner::Node((_, ref mut view)) = item { |
| 112 | *view = NodeView::Hidden; |
| 113 | } |
| 114 | } |
| 115 | |
| 116 | (a, item) |
| 117 | }) |
| 118 | .filter(|(_, item)| { |
| 119 | item.is_in_view(&self.metadata, &self.blocks) |
| 120 | }) |
| 121 | .collect::<Vec<_>>(); |
| 122 | |
| 123 | // initialize current item |
| 124 | let mut iter = items.iter_mut(); |
| 125 | let mut item = match iter.next() { |
| 126 | Some(x) => x, |
| 127 | None => return Ok(0) |
| 128 | }; |
| 129 | |
| 130 | // initialize last line and top offset, so that first iteration gives offset to first item |
| 131 | let mut last_line = self.metadata.file_range.0 as usize; |
| 132 | let mut top_offset: isize = 0; |
| 133 | |
| 134 | // perform fold skipping if folded in |
| 135 | let mut skip_to = None; |
| 136 | 'outer: loop { |
| 137 | match item.1 { |
| 138 | FoldInner::Node((id, ref mut node_view)) => { |
| 139 | let node = self.blocks.get_mut(id).unwrap(); |
| 140 | |
| 141 | // calculate new offset (this can be negative at the beginning) |
| 142 | top_offset += node.range.0 as isize - last_line as isize; |
| 143 | last_line = node.range.0; |
| 144 | |
| 145 | pending |= Render::draw_node(&self.metadata, &self.stdout, node, node_view, top_offset)?; |
| 146 | }, |
| 147 | FoldInner::Fold(ref fold) => { |
| 148 | // offset has a header of single line |
| 149 | top_offset += fold.line as isize - last_line as isize; |
| 150 | |
| 151 | if let FoldState::Folded(end) = fold.state { |
| 152 | skip_to = Some(end); |
| 153 | |
| 154 | last_line = end; |
| 155 | } else { |
| 156 | last_line = fold.line; |
| 157 | } |
| 158 | } |
| 159 | } |
| 160 | |
| 161 | // get new items and skip until line is reached |
nothing calls this directly
no test coverage detected