fix: 改进滚动 maxOffset 计算

使用 totalItems - visibleLines 替代 totalItems - 1
避免滚动到只剩1行内容的极端情况

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
pull/1/head
abel533 1 month ago
parent a30dfa9ad0
commit a20dffa7a0
  1. 8
      src/main/java/com/claudecode/tui/ClaudeCodeComponent.java

@ -95,6 +95,7 @@ public class ClaudeCodeComponent extends Component<ClaudeCodeComponent.TuiState>
/** 最近一次渲染的总行数(用于滚动限制) */ /** 最近一次渲染的总行数(用于滚动限制) */
private volatile int lastRenderedItemCount = 0; private volatile int lastRenderedItemCount = 0;
private volatile int lastMaxVisibleLines = 20;
/** 首次用户输入回调(用于 conversation summary) */ /** 首次用户输入回调(用于 conversation summary) */
private Consumer<String> onFirstUserInput; private Consumer<String> onFirstUserInput;
@ -287,8 +288,9 @@ public class ClaudeCodeComponent extends Component<ClaudeCodeComponent.TuiState>
)); ));
} }
// 记录总行数(供 scroll() 使用) // 记录总行数和可见行数(供 scroll() 使用)
lastRenderedItemCount = allItems.size(); lastRenderedItemCount = allItems.size();
lastMaxVisibleLines = maxLines;
// 虚拟滚动 // 虚拟滚动
List<Renderable> visibleItems; List<Renderable> visibleItems;
@ -992,7 +994,9 @@ public class ClaudeCodeComponent extends Component<ClaudeCodeComponent.TuiState>
private void scroll(TuiState s, int delta) { private void scroll(TuiState s, int delta) {
int totalItems = lastRenderedItemCount; 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)); int newOffset = Math.max(0, Math.min(s.scrollOffset + delta, maxOffset));
setState(new TuiState(s.inputText, s.messages, newOffset, s.thinking, s.thinkingText)); setState(new TuiState(s.inputText, s.messages, newOffset, s.thinking, s.thinkingText));
} }

Loading…
Cancel
Save