fix: 改进滚动 maxOffset 计算
使用 totalItems - visibleLines 替代 totalItems - 1 避免滚动到只剩1行内容的极端情况 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -95,6 +95,7 @@ public class ClaudeCodeComponent extends Component<ClaudeCodeComponent.TuiState>
|
||||
|
||||
/** 最近一次渲染的总行数(用于滚动限制) */
|
||||
private volatile int lastRenderedItemCount = 0;
|
||||
private volatile int lastMaxVisibleLines = 20;
|
||||
|
||||
/** 首次用户输入回调(用于 conversation summary) */
|
||||
private Consumer<String> onFirstUserInput;
|
||||
@@ -287,8 +288,9 @@ public class ClaudeCodeComponent extends Component<ClaudeCodeComponent.TuiState>
|
||||
));
|
||||
}
|
||||
|
||||
// 记录总行数(供 scroll() 使用)
|
||||
// 记录总行数和可见行数(供 scroll() 使用)
|
||||
lastRenderedItemCount = allItems.size();
|
||||
lastMaxVisibleLines = maxLines;
|
||||
|
||||
// 虚拟滚动
|
||||
List<Renderable> visibleItems;
|
||||
@@ -992,7 +994,9 @@ public class ClaudeCodeComponent extends Component<ClaudeCodeComponent.TuiState>
|
||||
|
||||
private void scroll(TuiState s, int delta) {
|
||||
int totalItems = lastRenderedItemCount;
|
||||
int maxOffset = Math.max(0, totalItems - 1);
|
||||
int visibleLines = lastMaxVisibleLines;
|
||||
// 最大偏移 = 超出可见范围的行数
|
||||
int maxOffset = Math.max(0, totalItems - visibleLines);
|
||||
int newOffset = Math.max(0, Math.min(s.scrollOffset + delta, maxOffset));
|
||||
setState(new TuiState(s.inputText, s.messages, newOffset, s.thinking, s.thinkingText));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user