public void RenderFile(string fileName) { var tree = GetTree(fileName); var text = CodeProcessor.GetText(tree); var viewPort = new DisplayTextViewPort( text: text, width: 80, height: 24); var needsRedraw = true; while (true) { if (needsRedraw) { viewPort.RenderTo(_outputView); } _outputView.MoveCursorTo(viewPort.CursorRelativeColumn, viewPort.CursorRelativeLine); var key = Console.ReadKey(intercept: true); viewPort = key.Key switch { ConsoleKey.LeftArrow => viewPort.CursorLeft(out needsRedraw), ConsoleKey.RightArrow => viewPort.CursorRight(out needsRedraw), ConsoleKey.UpArrow => viewPort.CursorUp(out needsRedraw), ConsoleKey.DownArrow => viewPort.CursorDown(out needsRedraw), ConsoleKey.Home => viewPort.CursorHome(out needsRedraw), ConsoleKey.End => viewPort.CursorEnd(out needsRedraw), ConsoleKey.PageUp => viewPort.PageUp(out needsRedraw), ConsoleKey.PageDown => viewPort.PageDown(out needsRedraw), _ => viewPort, }; if (key.Key == ConsoleKey.Q) { return; } } }
public void RenderTo(IOutputView view) { view.HideCursor(); for (var lineNumber = StartingLine; lineNumber < StartingLine + Height; lineNumber++) { view.MoveCursorTo(0, lineNumber - StartingLine); if (lineNumber >= Text.Lines.Count) { view.WriteText(new string(' ', Width)); continue; } var line = Text.Lines[lineNumber]; var startsIn = StartingColumn; foreach (var chunk in line.Chunks) { var left = Math.Max(0, startsIn); var right = Math.Min(chunk.Width, startsIn + Width); if (left < right) { view.SetStyle(chunk.Style); view.WriteText(chunk.Text[left..right].ToString());