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)
|
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 = {
|
private def nextMessageY: Float = {
|
||||||
entries.lastOption.map(_.maxY).getOrElse(0f) + EntryMargin
|
entries.lastOption.map(_.maxY).getOrElse(0f) + EntryMargin
|
||||||
@ -41,14 +54,7 @@ abstract class LogWidget extends Widget {
|
|||||||
entries.clear()
|
entries.clear()
|
||||||
} else {
|
} else {
|
||||||
entries.dropInPlace(count)
|
entries.dropInPlace(count)
|
||||||
|
removedOffset = entries(0).y - EntryMargin
|
||||||
val offset = entries(0).y - EntryMargin
|
|
||||||
|
|
||||||
if (offset > 0) {
|
|
||||||
for (entry <- entries) {
|
|
||||||
entry.y -= offset
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
parent.get.recalculateBoundsAndRelayout()
|
parent.get.recalculateBoundsAndRelayout()
|
||||||
@ -68,6 +74,8 @@ abstract class LogWidget extends Widget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override def draw(g: Graphics): Unit = {
|
override def draw(g: Graphics): Unit = {
|
||||||
|
applyRemovedOffset()
|
||||||
|
|
||||||
val firstVisibleIdx = firstVisibleIdxSearch(parent.get.asInstanceOf[ScrollView].offset.y)
|
val firstVisibleIdx = firstVisibleIdxSearch(parent.get.asInstanceOf[ScrollView].offset.y)
|
||||||
|
|
||||||
for (entry <- entries.iterator.drop(firstVisibleIdx).takeWhile(_.absoluteBounds.y <= clippedBounds.max.y)) {
|
for (entry <- entries.iterator.drop(firstVisibleIdx).takeWhile(_.absoluteBounds.y <= clippedBounds.max.y)) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user