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

Method draw_node

src/render.rs:184–245  ·  view source on GitHub ↗
(metadata: &Metadata, stdout: &Stdout, node: &mut Node, view: &mut NodeView, top_offset: isize)

Source from the content-addressed store, hash-verified

182 Ok(if pending { 1 } else { 0 })
183 }
184 pub fn draw_node(metadata: &Metadata, stdout: &Stdout, node: &mut Node, view: &mut NodeView, top_offset: isize) -> Result<bool> {
185 // calculate new view and height of node
186 let new_view = NodeView::new(node, metadata, top_offset);
187 let char_height = metadata.char_height;
188 let theight = node.range.1 - node.range.0;
189
190 let (pos, crop) = match (&view, &new_view) {
191 (NodeView::UpperBorder(_, _) | NodeView::LowerBorder(_, _) | NodeView::Hidden, NodeView::Visible(pos, _)) =>
192 (*pos, None),
193 (NodeView::Hidden, NodeView::LowerBorder(pos, height)) =>
194 (*pos, Some((height * char_height, 0))),
195 (NodeView::LowerBorder(_, height_old), NodeView::LowerBorder(pos, height)) if height_old < height =>
196 (*pos, Some((height * char_height, 0))),
197 (NodeView::Hidden, NodeView::UpperBorder(y, height)) =>
198 (0, Some((height * char_height, y * char_height))),
199 (NodeView::UpperBorder(y_old, _), NodeView::UpperBorder(y, height)) if y < y_old =>
200 (0, Some((height * char_height, y * char_height))),
201 _ => return Ok(false),
202 };
203
204 let dim = NodeDim {
205 height: theight * char_height,
206 crop
207 };
208
209 if let Some(buf) = node.get_sixel(dim) {
210 // bail out if an error happened during conversion
211 let mut buf = buf?;
212
213 //dbg!(&metadata.winpos.0, &metadata.winpos.1);
214 let mut wbuf = format!("\x1b[s\x1b[{};{}H", pos + metadata.winpos.0, metadata.winpos.1).into_bytes();
215 //for _ in 0..(node.range.1-node.range.0 - 1) {
216 // wbuf.extend_from_slice(b"\x1b[B\x1b[K");
217 //}
218
219 //wbuf.append(&mut format!("\x1b[{};{}H", pos + metadata.winpos.0, metadata.winpos.1).into_bytes());
220 //dbg!(&buf.len());
221 wbuf.append(&mut buf);
222 //wbuf.append(&mut format!("\x1b[{};{}H", metadata.viewport.0, metadata.winpos.1).into_bytes());
223 //wbuf.append(&mut format!("\x1b[?80h\x1bP100;1q\"1;1;2000;50\"1;1;2000;50\x1b[u\x1b\\").into_bytes());
224 //wbuf.extend_from_slice(b"\x1b[u");
225 wbuf.extend_from_slice(b"\x1b[u");
226
227 {
228 let outer_lock = stdout.lock();
229 let mut stdout = unsafe { File::from_raw_fd(1) };
230 let mut idx = 0;
231 while idx < wbuf.len() {
232 match stdout.write(&wbuf[idx..]) {
233 Ok(n) => idx += n,
234 Err(_) => {/*eprintln!("{}", err);*/},
235 }
236 }
237 std::mem::forget(stdout);
238 drop(outer_lock);
239 }
240
241 Ok(false)

Callers

nothing calls this directly

Calls 2

get_sixelMethod · 0.80
is_visibleMethod · 0.80

Tested by

no test coverage detected