Skip to content

Commit 7c25a8d

Browse files
committed
add: 加几个命令处理
1 parent 721b16a commit 7c25a8d

File tree

1 file changed

+73
-9
lines changed

1 file changed

+73
-9
lines changed

llcomNext/LLCOM/Models/TerminalObject.cs

Lines changed: 73 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,26 +25,25 @@ private void TerminalChanged()
2525
TerminalChangedEvent?.Invoke(this, EventArgs.Empty);
2626
}
2727

28-
//用于存放终端数据的缓存
28+
/// 用于存放终端数据的缓存
2929
private List<List<TerminalBlock>> CacheLines { get; } = [];
3030

3131
//当前光标位置
32-
//X从0开始,最大可到达窗口宽度(再增加就需要换行了)
33-
//Y从0开始,最大可到达窗口高度-1
32+
/// X从0开始,最大可到达窗口宽度(再增加就需要换行了)
3433
private int PositionX { get; set; } = 0;
34+
/// Y从0开始,最大可到达窗口高度-1
3535
private int PositionY { get; set; } = 0;
3636

37-
//当前的颜色、字体等信息,存到TerminalBlock中
37+
/// 当前的颜色、字体等信息,存到TerminalBlock中
3838
private TerminalBlock CurrentState { get; set; } = new(String.Empty);
3939

40-
//MaxCacheLines表示终端缓存的行数,超过这个行数后会删除最上面的行
40+
/// MaxCacheLines表示终端缓存的行数,超过这个行数后会删除最上面的行
4141
private readonly int _maxCacheLines = Utils.Setting.TerminalBufferLines;
4242

43-
//可视范围内的宽高
43+
/// 可视范围内的宽
4444
private int _windowWidth;
45-
public int WindowWidth => _windowWidth;
45+
/// 可视范围内的高
4646
private int _windowHeight;
47-
public int WindowHeight => _windowHeight;
4847

4948
//添加新的一行上去
5049
private void AddLine()
@@ -469,6 +468,8 @@ public void AddChars(ReadOnlySpan<char> chars)
469468
ptr += len;
470469
}
471470

471+
//当前的样式备份一下
472+
var lastState = CurrentState;
472473
//匹配对应命令
473474
switch (cmd)
474475
{
@@ -486,7 +487,6 @@ public void AddChars(ReadOnlySpan<char> chars)
486487
PositionX = _windowWidth - 1; //挪到行尾
487488
}
488489
//样式恢复默认
489-
var lastState = CurrentState;
490490
CurrentState = new TerminalBlock("");
491491
//加一个空格来覆盖掉当前字符
492492
AddText(new[] { ' ' });
@@ -503,20 +503,84 @@ public void AddChars(ReadOnlySpan<char> chars)
503503
}
504504
break;
505505
case TerminalCommand.Ht:
506+
//水平制表符,光标往后挪到下一个制表符位置,制表符位置是8的倍数
507+
//计算一下需要几个空格
508+
var nextTabStop = (PositionX / 8 + 1) * 8;
509+
//如果下一个制表符位置超过了窗口宽度,就直接挪到窗口宽度
510+
if (nextTabStop >= _windowWidth)
511+
nextTabStop = _windowWidth - 1;
512+
//添加空格
513+
var spaces = nextTabStop - PositionX;
514+
if (spaces > 0)
515+
{
516+
//添加空格
517+
AddText(new string(' ', spaces).ToCharArray());
518+
//光标位置往后挪
519+
PositionX += spaces;
520+
}
506521
break;
507522
case TerminalCommand.Lf:
523+
//换行,光标往下一行挪
524+
PositionY++;
525+
if(PositionY >= _windowHeight)
526+
{
527+
//如果超过了最大高度,添加新行
528+
AddLine();
529+
PositionY = _windowHeight - 1; //光标位置挪到最后一行
530+
}
508531
break;
509532
case TerminalCommand.Cr:
533+
//回车,光标位置挪到行首
534+
PositionX = 0;
510535
break;
511536
case TerminalCommand.Hide:
537+
//隐藏光标,TODO
512538
break;
513539
case TerminalCommand.Show:
540+
//显示光标,TODO
514541
break;
515542
case TerminalCommand.ClearLineEnd:
543+
//清除光标到行尾
544+
//样式恢复默认
545+
CurrentState = new TerminalBlock("");
546+
//添加空格到行尾
547+
var spacesToEnd = _windowWidth - PositionX;
548+
if (spacesToEnd > 0)
549+
{
550+
AddText(new string(' ', spacesToEnd).ToCharArray());
551+
}
552+
//样式恢复到上一个状态
553+
CurrentState = lastState;
516554
break;
517555
case TerminalCommand.ClearLineStart:
556+
//清除光标到行首
557+
//样式恢复默认
558+
CurrentState = new TerminalBlock("");
559+
//存一下上次的光标位置
560+
var oldXLineStartCmd = PositionX;
561+
//光标位置挪到行首
562+
PositionX = 0;
563+
//添加空格到行首
564+
if (oldXLineStartCmd > 0)
565+
{
566+
AddText(new string(' ', oldXLineStartCmd).ToCharArray());
567+
}
568+
//样式恢复到上一个状态
569+
CurrentState = lastState;
518570
break;
519571
case TerminalCommand.ClearLine:
572+
//清除当前行
573+
//样式恢复默认
574+
CurrentState = new TerminalBlock("");
575+
//移动光标到行首
576+
PositionX = 0;
577+
//添加一行空格
578+
if (_windowWidth > 0)
579+
{
580+
AddText(new string(' ', _windowWidth).ToCharArray());
581+
}
582+
//样式恢复到上一个状态
583+
CurrentState = lastState;
520584
break;
521585
case TerminalCommand.ClearScreenEnd:
522586
break;

0 commit comments

Comments
 (0)