fix: max row selection

This commit is contained in:
hstyi
2025-03-16 21:38:12 +08:00
committed by hstyi
parent 3f1ae38b61
commit 769c0d990b
4 changed files with 49 additions and 2 deletions

View File

@@ -14,6 +14,11 @@ open class DocumentImpl(private val terminal: Terminal) : Document {
companion object { companion object {
private val log = LoggerFactory.getLogger(DocumentImpl::class.java) private val log = LoggerFactory.getLogger(DocumentImpl::class.java)
/**
* 超出的行数
*/
val OverflowLines = DataKey(Int::class)
} }
init { init {

View File

@@ -4,6 +4,20 @@ package app.termora.terminal
open class MarkupModelImpl(private val terminal: Terminal) : MarkupModel { open class MarkupModelImpl(private val terminal: Terminal) : MarkupModel {
private val highlighters = mutableMapOf<Int, MutableList<Highlighter>>() private val highlighters = mutableMapOf<Int, MutableList<Highlighter>>()
init {
terminal.getTerminalModel().addDataListener(object : DataListener {
override fun onChanged(key: DataKey<*>, data: Any) {
if (key != DocumentImpl.OverflowLines) return
if (highlighters.isEmpty()) return
val row = data as Int
// 因为第 N 行被删除了,所以这里要删除这一行的荧光笔
for (i in 0 until row) {
terminal.getMarkupModel().removeAllHighlightersInLine(0)
}
}
})
}
override fun addHighlighter(highlighter: Highlighter) { override fun addHighlighter(highlighter: Highlighter) {
val range = highlighter.getHighlighterRange() val range = highlighter.getHighlighterRange()
highlighters.getOrPut(range.start.y) { mutableListOf() }.addLast(highlighter) highlighters.getOrPut(range.start.y) { mutableListOf() }.addLast(highlighter)

View File

@@ -32,6 +32,34 @@ open class SelectionModelImpl(private val terminal: Terminal) : SelectionModel {
} }
} }
init {
terminal.getTerminalModel().addDataListener(object : DataListener {
private val cols get() = terminal.getTerminalModel().getCols()
override fun onChanged(key: DataKey<*>, data: Any) {
if (key != DocumentImpl.OverflowLines) return
if (!hasSelection() || isSelectAll()) return
val row = data as Int
val startPosition = startPosition.copy(y = max(startPosition.y - row, 1))
val endPosition = endPosition.copy(y = endPosition.y - row)
if (endPosition.y < 1 || endPosition.y < startPosition.y) {
clearSelection()
return
}
// 设置新的选择区域
setSelection(startPosition, endPosition)
}
private fun isSelectAll(): Boolean {
return hasSelection() &&
startPosition.y == 1 && startPosition.x == 1 &&
endPosition.y == document.getLineCount() && endPosition.x == cols
}
})
}
override fun getSelectedText(): String { override fun getSelectedText(): String {
val sb = StringBuilder() val sb = StringBuilder()

View File

@@ -61,8 +61,8 @@ class TerminalLineBuffer(
if (!resizing) { if (!resizing) {
while (size > terminalModel.getMaxRows()) { while (size > terminalModel.getMaxRows()) {
removeFirst() removeFirst()
// 因为第一行被删除了,所以这里要删除这一行的荧光笔 // 超出的行数,前 N 行已经被清理
terminal.getMarkupModel().removeAllHighlightersInLine(0) terminal.getTerminalModel().setData(DocumentImpl.OverflowLines, 1)
} }
} }
} }