mirror of
https://gitlab.com/cc-ru/ocelot/ocelot-desktop.git
synced 2025-12-20 11:09:20 +01:00
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:
parent
47ea0e7d9a
commit
ed6ff78956
@ -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)) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user