Add Terminal GUI sort mode
This commit is contained in:
parent
404eb27e67
commit
3ebafc062f
|
@ -5,6 +5,7 @@ import net.minecraft.client.MinecraftClient
|
|||
import net.minecraft.client.gui.DrawableHelper
|
||||
import net.minecraft.client.gui.screen.ingame.HandledScreen
|
||||
import net.minecraft.client.gui.widget.AbstractButtonWidget
|
||||
import net.minecraft.client.gui.widget.AbstractPressableButtonWidget
|
||||
import net.minecraft.client.gui.widget.ButtonWidget
|
||||
import net.minecraft.client.gui.widget.TextFieldWidget
|
||||
import net.minecraft.client.util.math.MatrixStack
|
||||
|
@ -16,6 +17,7 @@ import net.minecraft.text.LiteralText
|
|||
import net.minecraft.text.Text
|
||||
import net.minecraft.util.Identifier
|
||||
import net.shadowfacts.phycon.PhysicalConnectivity
|
||||
import net.shadowfacts.phycon.util.SortMode
|
||||
import org.lwjgl.glfw.GLFW
|
||||
import java.lang.NumberFormatException
|
||||
import kotlin.math.ceil
|
||||
|
@ -73,7 +75,13 @@ class TerminalScreen(handler: TerminalScreenHandler, playerInv: PlayerInventory,
|
|||
searchBox.isVisible = true
|
||||
searchBox.setSelected(true)
|
||||
searchBox.setEditableColor(0xffffff)
|
||||
children.add(searchBox)
|
||||
addChild(searchBox)
|
||||
|
||||
val sortButton = SortButton(x + 256, y + 0, handler.sortMode, {
|
||||
handler.sortMode = it
|
||||
handler.netItemsChanged()
|
||||
}, ::renderTooltip)
|
||||
addButton(sortButton)
|
||||
|
||||
val dialogMinX = width / 2 - dialogWidth / 2
|
||||
val dialogMinY = height / 2 - dialogHeight / 2
|
||||
|
@ -343,4 +351,58 @@ class TerminalScreen(handler: TerminalScreenHandler, playerInv: PlayerInventory,
|
|||
}
|
||||
}
|
||||
|
||||
class SortButton(
|
||||
x: Int,
|
||||
y: Int,
|
||||
var mode: SortMode,
|
||||
val onChange: (SortMode) -> Unit,
|
||||
val doRenderTooltip: (MatrixStack, Text, Int, Int) -> Unit
|
||||
): AbstractPressableButtonWidget(x, y, 20, 20, LiteralText("")) {
|
||||
override fun onPress() {}
|
||||
|
||||
override fun mouseClicked(mouseX: Double, mouseY: Double, button: Int): Boolean {
|
||||
if ((button == 0 || button == 1) && clicked(mouseX, mouseY)) {
|
||||
val newVal = if (button == 0) mode.next else mode.prev
|
||||
mode = newVal
|
||||
onChange(mode)
|
||||
|
||||
playDownSound(MinecraftClient.getInstance().soundManager)
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
override fun renderButton(matrixStack: MatrixStack, mouseX: Int, mouseY: Int, delta: Float) {
|
||||
val client = MinecraftClient.getInstance()
|
||||
RenderSystem.color4f(1f, 1f, 1f, 1f)
|
||||
RenderSystem.enableBlend()
|
||||
RenderSystem.defaultBlendFunc()
|
||||
RenderSystem.enableDepthTest()
|
||||
|
||||
client.textureManager.bindTexture(WIDGETS_LOCATION)
|
||||
val k = getYImage(isHovered)
|
||||
drawTexture(matrixStack, x, y, 0, 46 + k * 20, width / 2, height)
|
||||
drawTexture(matrixStack, x + width / 2, y, 200 - width / 2, 46 + k * 20, width / 2, height)
|
||||
|
||||
client.textureManager.bindTexture(BACKGROUND)
|
||||
val u: Int = when (mode) {
|
||||
SortMode.COUNT_HIGH_FIRST -> 0
|
||||
SortMode.COUNT_LOW_FIRST -> 16
|
||||
SortMode.ALPHABETICAL -> 32
|
||||
}
|
||||
drawTexture(matrixStack, x + 2, y + 2, u, 230, 16, 16)
|
||||
|
||||
if (isHovered) {
|
||||
renderToolTip(matrixStack, mouseX, mouseY)
|
||||
}
|
||||
}
|
||||
|
||||
override fun renderToolTip(matrixStack: MatrixStack, mouseX: Int, mouseY: Int) {
|
||||
val text = LiteralText("")
|
||||
text.append("Sort by: ")
|
||||
text.append(mode.tooltip)
|
||||
doRenderTooltip(matrixStack, text, mouseX, mouseY)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -14,6 +14,7 @@ import net.shadowfacts.phycon.PhysicalConnectivity
|
|||
import net.shadowfacts.phycon.init.PhyBlocks
|
||||
import net.shadowfacts.phycon.init.PhyScreens
|
||||
import net.shadowfacts.phycon.networking.C2STerminalRequestItem
|
||||
import net.shadowfacts.phycon.util.SortMode
|
||||
import java.lang.ref.WeakReference
|
||||
import kotlin.math.ceil
|
||||
import kotlin.math.min
|
||||
|
@ -30,6 +31,7 @@ class TerminalScreenHandler(syncId: Int, playerInv: PlayerInventory, val termina
|
|||
|
||||
private val fakeInv = FakeInventory(this)
|
||||
private var searchQuery: String = ""
|
||||
var sortMode = SortMode.COUNT_HIGH_FIRST
|
||||
var itemsForDisplay = listOf<ItemStack>()
|
||||
private set
|
||||
|
||||
|
@ -67,7 +69,7 @@ class TerminalScreenHandler(syncId: Int, playerInv: PlayerInventory, val termina
|
|||
}
|
||||
|
||||
override fun netItemsChanged() {
|
||||
itemsForDisplay = terminal.cachedNetItems.object2IntEntrySet().filter {
|
||||
val filtered = terminal.cachedNetItems.object2IntEntrySet().filter {
|
||||
if (searchQuery.isBlank()) return@filter true
|
||||
if (searchQuery.startsWith('@')) {
|
||||
val unprefixed = searchQuery.drop(1)
|
||||
|
@ -77,9 +79,16 @@ class TerminalScreenHandler(syncId: Int, playerInv: PlayerInventory, val termina
|
|||
}
|
||||
}
|
||||
it.key.name.string.contains(searchQuery, true)
|
||||
}.sortedByDescending {
|
||||
it.intValue
|
||||
}.map {
|
||||
}
|
||||
|
||||
val sorted =
|
||||
when (sortMode) {
|
||||
SortMode.COUNT_HIGH_FIRST -> filtered.sortedByDescending { it.intValue }
|
||||
SortMode.COUNT_LOW_FIRST -> filtered.sortedBy { it.intValue }
|
||||
SortMode.ALPHABETICAL -> filtered.sortedBy { it.key.name.string }
|
||||
}
|
||||
|
||||
itemsForDisplay = sorted.map {
|
||||
val stack = it.key.copy()
|
||||
stack.count = it.intValue
|
||||
stack
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
package net.shadowfacts.phycon.util
|
||||
|
||||
import net.minecraft.text.LiteralText
|
||||
import net.minecraft.text.Text
|
||||
|
||||
/**
|
||||
* @author shadowfacts
|
||||
*/
|
||||
enum class SortMode {
|
||||
COUNT_HIGH_FIRST,
|
||||
COUNT_LOW_FIRST,
|
||||
ALPHABETICAL;
|
||||
|
||||
val prev: SortMode
|
||||
get() = values()[(ordinal - 1) % values().size]
|
||||
|
||||
val next: SortMode
|
||||
get() = values()[(ordinal + 1) % values().size]
|
||||
|
||||
val tooltip: Text
|
||||
get() = when (this) {
|
||||
COUNT_HIGH_FIRST -> LiteralText("Count, highest first")
|
||||
COUNT_LOW_FIRST -> LiteralText("Count, lowest first")
|
||||
ALPHABETICAL -> LiteralText("Name")
|
||||
}
|
||||
|
||||
}
|
Binary file not shown.
Before Width: | Height: | Size: 9.9 KiB After Width: | Height: | Size: 10 KiB |
Loading…
Reference in New Issue