Beispiel #1
0
        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;
                }
            }
        }
Beispiel #2
0
        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());