mirror of
https://gitlab.com/cc-ru/ocelot/ocelot-desktop.git
synced 2025-12-20 02:59:19 +01:00
Add navigation through Ocelot component log history
This commit is contained in:
parent
cf088ce9f7
commit
9a3ee8e95c
@ -222,12 +222,16 @@ object LogWidget {
|
|||||||
|
|
||||||
sealed trait LogEntry
|
sealed trait LogEntry
|
||||||
|
|
||||||
|
sealed trait TextLogEntry extends LogEntry {
|
||||||
|
val message: String
|
||||||
|
}
|
||||||
|
|
||||||
object LogEntry {
|
object LogEntry {
|
||||||
|
|
||||||
/** A message received from a log source. */
|
/** A message received from a log source. */
|
||||||
case class Rx(message: String) extends LogEntry
|
case class Rx(message: String) extends TextLogEntry
|
||||||
|
|
||||||
/** A message sent to a log source. */
|
/** A message sent to a log source. */
|
||||||
case class Tx(message: String) extends LogEntry
|
case class Tx(message: String) extends TextLogEntry
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -34,7 +34,7 @@ class TextInput(val initialText: String = "") extends Widget with MouseHandler w
|
|||||||
private val prevCursorPosition = Register.sampling(cursor.position)
|
private val prevCursorPosition = Register.sampling(cursor.position)
|
||||||
|
|
||||||
// view
|
// view
|
||||||
private var isFocused = false
|
protected var isFocused = false
|
||||||
private var scroll = 0f
|
private var scroll = 0f
|
||||||
private var blinkTimer = 0f
|
private var blinkTimer = 0f
|
||||||
private var cursorOffset = 0f
|
private var cursorOffset = 0f
|
||||||
|
|||||||
@ -2,7 +2,7 @@ package ocelot.desktop.util
|
|||||||
|
|
||||||
import ocelot.desktop.entity.traits.OcelotInterface
|
import ocelot.desktop.entity.traits.OcelotInterface
|
||||||
import ocelot.desktop.ui.event.{BrainEvent, EventAware}
|
import ocelot.desktop.ui.event.{BrainEvent, EventAware}
|
||||||
import ocelot.desktop.ui.widget.LogWidget.LogEntry
|
import ocelot.desktop.ui.widget.LogWidget.{LogEntry, TextLogEntry}
|
||||||
import ocelot.desktop.ui.widget.window.Windowed
|
import ocelot.desktop.ui.widget.window.Windowed
|
||||||
import ocelot.desktop.util.OcelotInterfaceLogStorage._
|
import ocelot.desktop.util.OcelotInterfaceLogStorage._
|
||||||
import ocelot.desktop.windows.OcelotInterfaceWindow
|
import ocelot.desktop.windows.OcelotInterfaceWindow
|
||||||
@ -121,6 +121,16 @@ trait OcelotInterfaceLogStorage extends EventAware with Persistable with Windowe
|
|||||||
window.onMessagesRemoved(count)
|
window.onMessagesRemoved(count)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def getEntry(index: Int): LogEntry = _entries(index)
|
||||||
|
|
||||||
|
def findFirstTextEntry(exclude: String, start: Int): Int = {
|
||||||
|
_entries.indexWhere(it => it.isInstanceOf[TextLogEntry] && it.asInstanceOf[TextLogEntry].message != exclude, start)
|
||||||
|
}
|
||||||
|
|
||||||
|
def findLastTextEntry(exclude: String, end: Int): Int = {
|
||||||
|
_entries.lastIndexWhere(it => it.isInstanceOf[TextLogEntry] && it.asInstanceOf[TextLogEntry].message != exclude, end)
|
||||||
|
}
|
||||||
|
|
||||||
private def addEntry(entry: LogEntry): Unit = {
|
private def addEntry(entry: LogEntry): Unit = {
|
||||||
ensureFreeSpace(1)
|
ensureFreeSpace(1)
|
||||||
_entries += entry
|
_entries += entry
|
||||||
|
|||||||
@ -1,11 +1,13 @@
|
|||||||
package ocelot.desktop.windows
|
package ocelot.desktop.windows
|
||||||
|
|
||||||
import ocelot.desktop.geometry.{Padding2D, Size2D}
|
import ocelot.desktop.geometry.{Padding2D, Size2D}
|
||||||
|
import ocelot.desktop.ui.event.KeyEvent
|
||||||
import ocelot.desktop.ui.layout.{AlignItems, Layout, LinearLayout}
|
import ocelot.desktop.ui.layout.{AlignItems, Layout, LinearLayout}
|
||||||
import ocelot.desktop.ui.widget.LogWidget.LogEntry
|
import ocelot.desktop.ui.widget.LogWidget.{LogEntry, TextLogEntry}
|
||||||
import ocelot.desktop.ui.widget.window.PanelWindow
|
import ocelot.desktop.ui.widget.window.PanelWindow
|
||||||
import ocelot.desktop.ui.widget.{Button, Checkbox, Filler, Label, LogWidget, PaddingBox, TextInput, Widget}
|
import ocelot.desktop.ui.widget.{Button, Checkbox, Filler, Label, LogWidget, PaddingBox, TextInput, Widget}
|
||||||
import ocelot.desktop.util.{OcelotInterfaceLogStorage, Orientation}
|
import ocelot.desktop.util.{OcelotInterfaceLogStorage, Orientation}
|
||||||
|
import org.lwjgl.input.Keyboard
|
||||||
|
|
||||||
class OcelotInterfaceWindow(storage: OcelotInterfaceLogStorage) extends PanelWindow {
|
class OcelotInterfaceWindow(storage: OcelotInterfaceLogStorage) extends PanelWindow {
|
||||||
override protected def title: String = s"${storage.name} ${storage.ocelotInterface.node.address}"
|
override protected def title: String = s"${storage.name} ${storage.ocelotInterface.node.address}"
|
||||||
@ -21,10 +23,36 @@ class OcelotInterfaceWindow(storage: OcelotInterfaceLogStorage) extends PanelWin
|
|||||||
|
|
||||||
children :+= logWidget
|
children :+= logWidget
|
||||||
|
|
||||||
|
var historyPosition = 0
|
||||||
|
var unfinishedEntryBackup: Option[String] = None
|
||||||
|
|
||||||
children :+= new TextInput() {
|
children :+= new TextInput() {
|
||||||
|
eventHandlers += {
|
||||||
|
case event @ KeyEvent(KeyEvent.State.Press | KeyEvent.State.Repeat, Keyboard.KEY_UP | Keyboard.KEY_DOWN, _) if this.isFocused =>
|
||||||
|
val currentInput = text
|
||||||
|
val index = if (event.code == Keyboard.KEY_UP) {
|
||||||
|
storage.findLastTextEntry(currentInput, storage.entryCount - historyPosition)
|
||||||
|
} else {
|
||||||
|
storage.findFirstTextEntry(currentInput, storage.entryCount - historyPosition + 1)
|
||||||
|
}
|
||||||
|
if (index != -1) {
|
||||||
|
if (unfinishedEntryBackup.isEmpty) {
|
||||||
|
unfinishedEntryBackup = Some(currentInput)
|
||||||
|
}
|
||||||
|
historyPosition = storage.entryCount - index
|
||||||
|
text = storage.getEntry(index).asInstanceOf[TextLogEntry].message
|
||||||
|
event.consume()
|
||||||
|
} else if (event.code == Keyboard.KEY_DOWN && unfinishedEntryBackup.nonEmpty) {
|
||||||
|
text = unfinishedEntryBackup.get
|
||||||
|
unfinishedEntryBackup = None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override def onConfirm(): Unit = {
|
override def onConfirm(): Unit = {
|
||||||
pushLine(text)
|
pushLine(text)
|
||||||
text = ""
|
text = ""
|
||||||
|
unfinishedEntryBackup = None
|
||||||
|
historyPosition = 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -75,7 +103,11 @@ class OcelotInterfaceWindow(storage: OcelotInterfaceLogStorage) extends PanelWin
|
|||||||
|
|
||||||
children :+= new Button {
|
children :+= new Button {
|
||||||
override def text: String = "Clear"
|
override def text: String = "Clear"
|
||||||
override def onClick(): Unit = clear()
|
override def onClick(): Unit = {
|
||||||
|
unfinishedEntryBackup = None
|
||||||
|
historyPosition = 0
|
||||||
|
clear()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user