Skip to content

Commit 6330cc6

Browse files
committed
fix: 光标位置显示不正确的问题
1 parent 430216f commit 6330cc6

File tree

3 files changed

+27
-8
lines changed

3 files changed

+27
-8
lines changed

llcomNext/LLCOM/Models/TerminalObject.cs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -317,13 +317,18 @@ public List<List<TerminalBlock>> GetShowLines()
317317
//添加空行
318318
cacheLines.Add([]);
319319
}
320+
320321
//把当前光标位置背景和前景色反色处理
321-
if (PositionY < cacheLines.Count)
322+
323+
//实际光标在哪一行,会跟随currentLine变化
324+
var lineIndex = PositionY + CurrentLine;
325+
326+
if (PositionY < cacheLines.Count && lineIndex < cacheLines.Count)
322327
{
323328
//这里需要处理光标位置
324329
//复制一个新的行来替换掉现有的行用来展示
325330
var tempLine = new List<TerminalBlock>();
326-
foreach (var block in cacheLines[PositionY])
331+
foreach (var block in cacheLines[lineIndex])
327332
{
328333
tempLine.Add((TerminalBlock)block.Clone());
329334
}
@@ -371,7 +376,7 @@ public List<List<TerminalBlock>> GetShowLines()
371376
//优化当前这一行数据块
372377
TerminalBlock.OptimizeBlocks(tempLine);
373378
//替换掉当前行
374-
cacheLines[PositionY] = tempLine;
379+
cacheLines[lineIndex] = tempLine;
375380
}
376381

377382
return cacheLines;
@@ -381,7 +386,19 @@ public List<List<TerminalBlock>> GetShowLines()
381386
public void ChangeWindowSize(int width, int height)
382387
{
383388
_windowWidth = width;
389+
var oldHeight = _windowHeight;
384390
_windowHeight = height;
391+
392+
//高度变化后,光标位置需要重新计算
393+
if (oldHeight != _windowHeight)
394+
{
395+
PositionY += _windowHeight - oldHeight;
396+
//如果光标位置超过了最大高度,设置为最大高度
397+
if (PositionY >= _windowHeight)
398+
PositionY = _windowHeight - 1;
399+
if (PositionY < 0)
400+
PositionY = 0;
401+
}
385402
TerminalChanged();
386403
}
387404

llcomNext/LLCOM/ViewModels/DataViews/TerminalViewModel.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@ private async Task Test()
3535
{
3636
var random = new Random();
3737
var testChars = "测试Test".ToCharArray();
38-
for(int i=0; i<1000; i++)
38+
for(int i=0; i<100; i++)
3939
{
4040
lock (TerminalObject)
4141
{
42-
TerminalObject.ChangeStyle(random.Next(30,38),random.Next(30,38));
42+
//TerminalObject.ChangeStyle(random.Next(30,38),random.Next(30,38));
4343
TerminalObject.ChangePosition(random.Next(0,TerminalObject.WindowWidth), random.Next(0,TerminalObject.WindowHeight));
4444
TerminalObject.AddText([testChars[random.Next(0, testChars.Length)]]);
4545
TerminalRefreshEvent?.Invoke(this, EventArgs.Empty);

llcomNext/LLCOM/Views/DataViews/TerminalView.axaml.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public partial class TerminalView : UserControl
2323
{
2424
private readonly CancellationTokenSource _cts = new CancellationTokenSource();
2525
private readonly EventWaitHandle _dataChangeWaitHandle = new EventWaitHandle(false, EventResetMode.ManualReset);
26+
private Func<List<List<TerminalBlock>>>? _getShowLines = null;
2627

2728
public TerminalView()
2829
{
@@ -45,6 +46,7 @@ protected override void OnUnloaded(RoutedEventArgs e)
4546

4647
private void Control_OnLoaded(object? sender, RoutedEventArgs e)
4748
{
49+
_getShowLines = ((TerminalViewModel)DataContext!).GetShowLines;
4850
//搞个单独线程来更新UI,防止阻塞
4951
new Thread(() =>
5052
{
@@ -55,10 +57,10 @@ private void Control_OnLoaded(object? sender, RoutedEventArgs e)
5557
if(_cts.Token.IsCancellationRequested)
5658
break;
5759

60+
var tempLines = _getShowLines();
5861
// 执行更新逻辑
5962
Dispatcher.UIThread.Post(() =>
60-
{
61-
var tempLines = ((TerminalViewModel)DataContext!).GetShowLines();
63+
{
6264
//清空文本
6365
MainTextBlock.Inlines!.Clear();
6466
foreach (var line in tempLines)
@@ -79,7 +81,7 @@ private void Control_OnLoaded(object? sender, RoutedEventArgs e)
7981
MainTextBlock.Inlines.Add(new LineBreak());
8082
}
8183
});
82-
Thread.Sleep(150);
84+
Thread.Sleep(100);
8385
}
8486
}).Start();
8587

0 commit comments

Comments
 (0)