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.DrawableHelper
|
||||||
import net.minecraft.client.gui.screen.ingame.HandledScreen
|
import net.minecraft.client.gui.screen.ingame.HandledScreen
|
||||||
import net.minecraft.client.gui.widget.AbstractButtonWidget
|
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.ButtonWidget
|
||||||
import net.minecraft.client.gui.widget.TextFieldWidget
|
import net.minecraft.client.gui.widget.TextFieldWidget
|
||||||
import net.minecraft.client.util.math.MatrixStack
|
import net.minecraft.client.util.math.MatrixStack
|
||||||
|
@ -16,6 +17,7 @@ import net.minecraft.text.LiteralText
|
||||||
import net.minecraft.text.Text
|
import net.minecraft.text.Text
|
||||||
import net.minecraft.util.Identifier
|
import net.minecraft.util.Identifier
|
||||||
import net.shadowfacts.phycon.PhysicalConnectivity
|
import net.shadowfacts.phycon.PhysicalConnectivity
|
||||||
|
import net.shadowfacts.phycon.util.SortMode
|
||||||
import org.lwjgl.glfw.GLFW
|
import org.lwjgl.glfw.GLFW
|
||||||
import java.lang.NumberFormatException
|
import java.lang.NumberFormatException
|
||||||
import kotlin.math.ceil
|
import kotlin.math.ceil
|
||||||
|
@ -73,7 +75,13 @@ class TerminalScreen(handler: TerminalScreenHandler, playerInv: PlayerInventory,
|
||||||
searchBox.isVisible = true
|
searchBox.isVisible = true
|
||||||
searchBox.setSelected(true)
|
searchBox.setSelected(true)
|
||||||
searchBox.setEditableColor(0xffffff)
|
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 dialogMinX = width / 2 - dialogWidth / 2
|
||||||
val dialogMinY = height / 2 - dialogHeight / 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.PhyBlocks
|
||||||
import net.shadowfacts.phycon.init.PhyScreens
|
import net.shadowfacts.phycon.init.PhyScreens
|
||||||
import net.shadowfacts.phycon.networking.C2STerminalRequestItem
|
import net.shadowfacts.phycon.networking.C2STerminalRequestItem
|
||||||
|
import net.shadowfacts.phycon.util.SortMode
|
||||||
import java.lang.ref.WeakReference
|
import java.lang.ref.WeakReference
|
||||||
import kotlin.math.ceil
|
import kotlin.math.ceil
|
||||||
import kotlin.math.min
|
import kotlin.math.min
|
||||||
|
@ -30,6 +31,7 @@ class TerminalScreenHandler(syncId: Int, playerInv: PlayerInventory, val termina
|
||||||
|
|
||||||
private val fakeInv = FakeInventory(this)
|
private val fakeInv = FakeInventory(this)
|
||||||
private var searchQuery: String = ""
|
private var searchQuery: String = ""
|
||||||
|
var sortMode = SortMode.COUNT_HIGH_FIRST
|
||||||
var itemsForDisplay = listOf<ItemStack>()
|
var itemsForDisplay = listOf<ItemStack>()
|
||||||
private set
|
private set
|
||||||
|
|
||||||
|
@ -67,7 +69,7 @@ class TerminalScreenHandler(syncId: Int, playerInv: PlayerInventory, val termina
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun netItemsChanged() {
|
override fun netItemsChanged() {
|
||||||
itemsForDisplay = terminal.cachedNetItems.object2IntEntrySet().filter {
|
val filtered = terminal.cachedNetItems.object2IntEntrySet().filter {
|
||||||
if (searchQuery.isBlank()) return@filter true
|
if (searchQuery.isBlank()) return@filter true
|
||||||
if (searchQuery.startsWith('@')) {
|
if (searchQuery.startsWith('@')) {
|
||||||
val unprefixed = searchQuery.drop(1)
|
val unprefixed = searchQuery.drop(1)
|
||||||
|
@ -77,9 +79,16 @@ class TerminalScreenHandler(syncId: Int, playerInv: PlayerInventory, val termina
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
it.key.name.string.contains(searchQuery, true)
|
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()
|
val stack = it.key.copy()
|
||||||
stack.count = it.intValue
|
stack.count = it.intValue
|
||||||
stack
|
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