Batch changes to Entry.y when removing entries

This improves performance significantly (by more than an order of
magnitude) when spamming messages.

Closes #177.
This commit is contained in:
Fingercomp 2025-08-12 16:36:51 +03:00
parent 47ea0e7d9a
commit ed6ff78956
No known key found for this signature in database
GPG Key ID: BBC71CEE45D86E37

View File

@ -21,7 +21,20 @@ abstract class LogWidget extends Widget {
val dummyEntry: Entry = new RxEntry("", nextMessageY)
override def minimumSize: Size2D = Size2D(dummyEntry.minimumSize.width + 2 * EntryMargin, nextMessageY)
private var removedOffset = 0f
private def applyRemovedOffset(): Unit = {
for (entry <- entries) {
entry.y -= removedOffset
}
removedOffset = 0
}
override def minimumSize: Size2D = Size2D(
dummyEntry.minimumSize.width + 2 * EntryMargin,
nextMessageY - removedOffset,
)
private def nextMessageY: Float = {
entries.lastOption.map(_.maxY).getOrElse(0f) + EntryMargin
@ -41,14 +54,7 @@ abstract class LogWidget extends Widget {
entries.clear()
} else {
entries.dropInPlace(count)
val offset = entries(0).y - EntryMargin
if (offset > 0) {
for (entry <- entries) {
entry.y -= offset
}
}
removedOffset = entries(0).y - EntryMargin
}
parent.get.recalculateBoundsAndRelayout()
@ -68,6 +74,8 @@ abstract class LogWidget extends Widget {
}
override def draw(g: Graphics): Unit = {
applyRemovedOffset()
val firstVisibleIdx = firstVisibleIdxSearch(parent.get.asInstanceOf[ScrollView].offset.y)
for (entry <- entries.iterator.drop(firstVisibleIdx).takeWhile(_.absoluteBounds.y <= clippedBounds.max.y)) {