160 lines
4.8 KiB
Kotlin
160 lines
4.8 KiB
Kotlin
package net.shadowfacts.phycon.block.terminal
|
|
|
|
import net.minecraft.text.TranslatableText
|
|
import net.minecraft.util.math.MathHelper
|
|
import net.shadowfacts.cacao.geometry.Point
|
|
import net.shadowfacts.cacao.util.Color
|
|
import net.shadowfacts.cacao.view.Label
|
|
import net.shadowfacts.cacao.view.View
|
|
import net.shadowfacts.cacao.view.textfield.TextField
|
|
import net.shadowfacts.cacao.viewcontroller.ViewController
|
|
import net.shadowfacts.kiwidsl.dsl
|
|
import net.shadowfacts.phycon.util.SortMode
|
|
|
|
/**
|
|
* @author shadowfacts
|
|
*/
|
|
class TerminalViewController(
|
|
val screen: TerminalScreen,
|
|
val handler: TerminalScreenHandler,
|
|
val terminal: TerminalBlockEntity,
|
|
): ViewController() {
|
|
|
|
private lateinit var scrollTrack: ScrollTrackView
|
|
lateinit var sortMode: SortModeButton
|
|
private set
|
|
lateinit var searchField: TextField
|
|
private set
|
|
|
|
override fun loadView() {
|
|
view = ScrollHandlingView(this)
|
|
}
|
|
|
|
override fun viewDidLoad() {
|
|
super.viewDidLoad()
|
|
|
|
val pane = view.addLayoutGuide()
|
|
view.solver.dsl {
|
|
pane.centerXAnchor equalTo view.centerXAnchor
|
|
pane.centerYAnchor equalTo view.centerYAnchor
|
|
pane.widthAnchor equalTo screen.backgroundWidth
|
|
pane.heightAnchor equalTo screen.backgroundHeight
|
|
}
|
|
|
|
val buffer = view.addLayoutGuide()
|
|
view.solver.dsl {
|
|
buffer.leftAnchor equalTo (pane.leftAnchor + 7)
|
|
buffer.topAnchor equalTo (pane.topAnchor + 17)
|
|
buffer.widthAnchor equalTo (18 * 3)
|
|
buffer.heightAnchor equalTo (18 * 6)
|
|
}
|
|
|
|
val network = view.addLayoutGuide()
|
|
view.solver.dsl {
|
|
network.leftAnchor equalTo (pane.leftAnchor + 65)
|
|
network.topAnchor equalTo buffer.topAnchor
|
|
network.widthAnchor equalTo (18 * 9)
|
|
network.heightAnchor equalTo (18 * 6)
|
|
}
|
|
|
|
val playerInv = view.addLayoutGuide()
|
|
view.solver.dsl {
|
|
playerInv.leftAnchor equalTo network.leftAnchor
|
|
playerInv.topAnchor equalTo (pane.topAnchor + 139)
|
|
playerInv.widthAnchor equalTo (18 * 9)
|
|
playerInv.heightAnchor equalTo 76
|
|
}
|
|
|
|
val titleLabel = view.addSubview(Label(screen.title)).apply {
|
|
textColor = Color.TEXT
|
|
}
|
|
val playerInvLabel = view.addSubview(Label(handler.playerInv.displayName)).apply {
|
|
textColor = Color.TEXT
|
|
}
|
|
val bufferLabel = view.addSubview(Label(TranslatableText("gui.phycon.terminal_buffer"))).apply {
|
|
textColor = Color.TEXT
|
|
}
|
|
|
|
searchField = view.addSubview(TerminalSearchField()).apply {
|
|
handler = ::searchFieldChanged
|
|
drawBackground = false
|
|
}
|
|
searchField.becomeFirstResponder()
|
|
|
|
scrollTrack = view.addSubview(ScrollTrackView(::scrollPositionChanged))
|
|
|
|
sortMode = view.addSubview(SortModeButton(SortMode.COUNT_HIGH_FIRST)).apply {
|
|
handler = ::sortModeChanged
|
|
}
|
|
|
|
view.solver.dsl {
|
|
titleLabel.leftAnchor equalTo network.leftAnchor
|
|
titleLabel.topAnchor equalTo (pane.topAnchor + 6)
|
|
|
|
bufferLabel.leftAnchor equalTo buffer.leftAnchor
|
|
bufferLabel.topAnchor equalTo titleLabel.topAnchor
|
|
|
|
playerInvLabel.leftAnchor equalTo playerInv.leftAnchor
|
|
playerInvLabel.topAnchor equalTo (pane.bottomAnchor - 94)
|
|
|
|
searchField.leftAnchor equalTo (pane.leftAnchor + 138)
|
|
searchField.topAnchor equalTo (pane.topAnchor + 5)
|
|
searchField.widthAnchor equalTo 80
|
|
searchField.heightAnchor equalTo 9
|
|
|
|
scrollTrack.leftAnchor equalTo (pane.leftAnchor + 232)
|
|
scrollTrack.topAnchor equalTo (network.topAnchor + 1)
|
|
scrollTrack.bottomAnchor equalTo (network.bottomAnchor - 1)
|
|
scrollTrack.widthAnchor equalTo 12
|
|
|
|
sortMode.leftAnchor equalTo pane.rightAnchor + 4
|
|
sortMode.topAnchor equalTo pane.topAnchor
|
|
sortMode.widthAnchor equalTo 20
|
|
sortMode.heightAnchor equalTo 20
|
|
}
|
|
}
|
|
|
|
private fun searchFieldChanged(field: TextField) {
|
|
screen.searchQuery = field.text
|
|
screen.requestUpdatedItems()
|
|
}
|
|
|
|
private fun scrollPositionChanged(track: ScrollTrackView) {
|
|
val oldOffset = handler.currentScrollOffsetInRows()
|
|
|
|
handler.scrollPosition = track.scrollPosition.toFloat()
|
|
screen.scrollPosition = track.scrollPosition
|
|
|
|
if (handler.currentScrollOffsetInRows() != oldOffset) {
|
|
screen.requestUpdatedItems()
|
|
}
|
|
}
|
|
|
|
private fun sortModeChanged(button: SortModeButton) {
|
|
screen.sortMode = button.value
|
|
screen.requestUpdatedItems()
|
|
}
|
|
|
|
class TerminalSearchField: TextField("") {
|
|
override fun resignFirstResponder() {
|
|
// no-op
|
|
}
|
|
}
|
|
|
|
class ScrollHandlingView(val vc: TerminalViewController): View() {
|
|
override fun mouseScrolled(point: Point, amount: Double): Boolean {
|
|
var newOffsetInRows = vc.handler.currentScrollOffsetInRows() - amount.toInt()
|
|
newOffsetInRows = MathHelper.clamp(newOffsetInRows, 0, vc.handler.maxScrollOffsetInRows())
|
|
if (newOffsetInRows != vc.handler.currentScrollOffsetInRows()) {
|
|
val newScrollPosition = newOffsetInRows / vc.handler.maxScrollOffsetInRows().toDouble()
|
|
vc.screen.scrollPosition = newScrollPosition
|
|
vc.scrollTrack.scrollPosition = newScrollPosition
|
|
vc.screen.requestUpdatedItems()
|
|
}
|
|
|
|
return true
|
|
}
|
|
}
|
|
|
|
}
|