From 769c0d990b90017838670bf36bf394483dfb4d3d Mon Sep 17 00:00:00 2001 From: hstyi Date: Sun, 16 Mar 2025 21:38:12 +0800 Subject: [PATCH] fix: max row selection --- .../app/termora/terminal/DocumentImpl.kt | 5 ++++ .../app/termora/terminal/MarkupModelImpl.kt | 14 ++++++++++ .../termora/terminal/SelectionModelImpl.kt | 28 +++++++++++++++++++ .../termora/terminal/TerminalLineBuffer.kt | 4 +-- 4 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/app/termora/terminal/DocumentImpl.kt b/src/main/kotlin/app/termora/terminal/DocumentImpl.kt index 6193ad3..f67ca44 100644 --- a/src/main/kotlin/app/termora/terminal/DocumentImpl.kt +++ b/src/main/kotlin/app/termora/terminal/DocumentImpl.kt @@ -14,6 +14,11 @@ open class DocumentImpl(private val terminal: Terminal) : Document { companion object { private val log = LoggerFactory.getLogger(DocumentImpl::class.java) + + /** + * 超出的行数 + */ + val OverflowLines = DataKey(Int::class) } init { diff --git a/src/main/kotlin/app/termora/terminal/MarkupModelImpl.kt b/src/main/kotlin/app/termora/terminal/MarkupModelImpl.kt index beb2b79..cfba3bb 100644 --- a/src/main/kotlin/app/termora/terminal/MarkupModelImpl.kt +++ b/src/main/kotlin/app/termora/terminal/MarkupModelImpl.kt @@ -4,6 +4,20 @@ package app.termora.terminal open class MarkupModelImpl(private val terminal: Terminal) : MarkupModel { private val highlighters = mutableMapOf>() + 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) { val range = highlighter.getHighlighterRange() highlighters.getOrPut(range.start.y) { mutableListOf() }.addLast(highlighter) diff --git a/src/main/kotlin/app/termora/terminal/SelectionModelImpl.kt b/src/main/kotlin/app/termora/terminal/SelectionModelImpl.kt index c8ddc19..a99f79f 100644 --- a/src/main/kotlin/app/termora/terminal/SelectionModelImpl.kt +++ b/src/main/kotlin/app/termora/terminal/SelectionModelImpl.kt @@ -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 { val sb = StringBuilder() diff --git a/src/main/kotlin/app/termora/terminal/TerminalLineBuffer.kt b/src/main/kotlin/app/termora/terminal/TerminalLineBuffer.kt index a0d4f97..69fbab6 100644 --- a/src/main/kotlin/app/termora/terminal/TerminalLineBuffer.kt +++ b/src/main/kotlin/app/termora/terminal/TerminalLineBuffer.kt @@ -61,8 +61,8 @@ class TerminalLineBuffer( if (!resizing) { while (size > terminalModel.getMaxRows()) { removeFirst() - // 因为第一行被删除了,所以这里要删除这一行的荧光笔 - terminal.getMarkupModel().removeAllHighlightersInLine(0) + // 超出的行数,前 N 行已经被清理 + terminal.getTerminalModel().setData(DocumentImpl.OverflowLines, 1) } } }