MCPcopy Create free account
hub / github.com/bytesnake/vim-graphical-preview / draw

Method draw

src/render.rs:104–183  ·  view source on GitHub ↗
(&mut self, _: &str)

Source from the content-addressed store, hash-verified

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

Callers

nothing calls this directly

Calls 1

is_in_viewMethod · 0.80

Tested by

no test coverage detected