Row count controls in regular inventory

This commit is contained in:
DBotThePony 2022-09-09 18:53:34 +07:00
parent 81001a8736
commit 2dd4d60be1
Signed by: DBot
GPG Key ID: DCC23B5715498507
5 changed files with 101 additions and 49 deletions

View File

@ -20,6 +20,18 @@ fun setMousePos(x: Double, y: Double) {
GLFW.glfwSetCursorPos(minecraft.window.window, x, y) GLFW.glfwSetCursorPos(minecraft.window.window, x, y)
} }
fun setMousePosScaled(x: Double, y: Double) {
GLFW.glfwSetCursorPos(minecraft.window.window, x * minecraft.window.guiScale, y * minecraft.window.guiScale)
}
fun setMousePos(x: Float, y: Float) {
GLFW.glfwSetCursorPos(minecraft.window.window, x.toDouble(), y.toDouble())
}
fun setMousePosScaled(x: Float, y: Float) {
GLFW.glfwSetCursorPos(minecraft.window.window, x * minecraft.window.guiScale, y * minecraft.window.guiScale)
}
private val cursorXPosBuf = ByteBuffer.allocateDirect(8).also { it.order(ByteOrder.LITTLE_ENDIAN) }.asDoubleBuffer() private val cursorXPosBuf = ByteBuffer.allocateDirect(8).also { it.order(ByteOrder.LITTLE_ENDIAN) }.asDoubleBuffer()
private val cursorYPosBuf = ByteBuffer.allocateDirect(8).also { it.order(ByteOrder.LITTLE_ENDIAN) }.asDoubleBuffer() private val cursorYPosBuf = ByteBuffer.allocateDirect(8).also { it.order(ByteOrder.LITTLE_ENDIAN) }.asDoubleBuffer()

View File

@ -19,28 +19,14 @@ import yalter.mousetweaks.api.MouseTweaksDisableWheelTweak
@MouseTweaksDisableWheelTweak @MouseTweaksDisableWheelTweak
class ExoSuitInventoryScreen(menu: ExoSuitInventoryMenu) : MatteryScreen<ExoSuitInventoryMenu>(menu, TranslatableComponent("otm.gui.exosuit")) { class ExoSuitInventoryScreen(menu: ExoSuitInventoryMenu) : MatteryScreen<ExoSuitInventoryMenu>(menu, TranslatableComponent("otm.gui.exosuit")) {
var inventoryRows = 3
set(value) {
val newValue = value.coerceAtLeast(3).coerceAtMost(6)
val old = field
if (field != newValue) {
field = newValue
if (mainFrame != null) {
updateInventoryRows(old)
}
}
}
private lateinit var mainInventoryLine: EditablePanel<ExoSuitInventoryScreen> private lateinit var mainInventoryLine: EditablePanel<ExoSuitInventoryScreen>
private lateinit var scrollPanel: DiscreteScrollBarPanel<ExoSuitInventoryScreen> private lateinit var scrollPanel: DiscreteScrollBarPanel<ExoSuitInventoryScreen>
private fun updateInventoryRows(old: Int) { override fun updateInventoryRows(old: Int) {
mainFrame!!.height = FRAME_BASE_HEIGHT + inventoryRows * AbstractSlotPanel.SIZE mainFrame!!.height = FRAME_BASE_HEIGHT + inventoryRows * AbstractSlotPanel.SIZE
mainInventoryLine.height = AbstractSlotPanel.SIZE * inventoryRows mainInventoryLine.height = AbstractSlotPanel.SIZE * inventoryRows
for (i in scrollPanel.scroll until scrollPanel.scroll + old) { for (i in scrollPanel.scroll + inventoryRows until scrollPanel.scroll + old) {
getInventorySlotsRow(i).visible = false getInventorySlotsRow(i).visible = false
} }
@ -78,7 +64,7 @@ class ExoSuitInventoryScreen(menu: ExoSuitInventoryMenu) : MatteryScreen<ExoSuit
row.parent = mainInventoryLine row.parent = mainInventoryLine
} }
menu.lastScroll = new lastScroll = new
}) })
mainInventoryLine = object : EditablePanel<ExoSuitInventoryScreen>(this@ExoSuitInventoryScreen, frame, height = AbstractSlotPanel.SIZE * inventoryRows) { mainInventoryLine = object : EditablePanel<ExoSuitInventoryScreen>(this@ExoSuitInventoryScreen, frame, height = AbstractSlotPanel.SIZE * inventoryRows) {
@ -87,7 +73,7 @@ class ExoSuitInventoryScreen(menu: ExoSuitInventoryMenu) : MatteryScreen<ExoSuit
} }
} }
scrollPanel.scroll = menu.lastScroll scrollPanel.scroll = lastScroll
scrollPanel.parent = mainInventoryLine scrollPanel.parent = mainInventoryLine
mainInventoryLine.dock = Dock.BOTTOM mainInventoryLine.dock = Dock.BOTTOM
@ -177,17 +163,9 @@ class ExoSuitInventoryScreen(menu: ExoSuitInventoryMenu) : MatteryScreen<ExoSuit
setMousePos(mouseX, mouseY) setMousePos(mouseX, mouseY)
}).also { it.tooltip = TranslatableComponent("otm.gui.exosuit.go_back") } }).also { it.tooltip = TranslatableComponent("otm.gui.exosuit.go_back") }
HeightControls(this, frame, frame.width + 2f, frame.height.coerceAtMost(95f)) { makeInventoryRowsControls(frame, frame.width + 2f, frame.height.coerceAtMost(95f)) { movePixels ->
inventoryRows += if (it) 1 else -1
val movePixels = if (it) -AbstractSlotPanel.SIZE / 2f else AbstractSlotPanel.SIZE / 2f
frame.y += movePixels frame.y += movePixels
moveMousePosScaled(y = movePixels) moveMousePosScaled(y = movePixels)
HeightControls.Status.of(inventoryRows < 6, inventoryRows > 3)
}.also {
it.controlStatus = HeightControls.Status.of(inventoryRows < 6, inventoryRows > 3)
} }
return frame return frame

View File

@ -16,7 +16,7 @@ import net.minecraftforge.client.event.ContainerScreenEvent.Render.Foreground
import net.minecraftforge.common.MinecraftForge import net.minecraftforge.common.MinecraftForge
import org.lwjgl.opengl.GL11 import org.lwjgl.opengl.GL11
import org.lwjgl.opengl.GL13 import org.lwjgl.opengl.GL13
import ru.dbotthepony.mc.otm.capability.matteryPlayer import ru.dbotthepony.mc.otm.client.moveMousePosScaled
import ru.dbotthepony.mc.otm.client.screen.panels.* import ru.dbotthepony.mc.otm.client.screen.panels.*
import ru.dbotthepony.mc.otm.menu.MatteryMenu import ru.dbotthepony.mc.otm.menu.MatteryMenu
@ -34,8 +34,8 @@ abstract class MatteryScreen<T : MatteryMenu>(menu: T, inventory: Inventory, tit
protected val panels = ArrayDeque<EditablePanel<*>>() protected val panels = ArrayDeque<EditablePanel<*>>()
var inventoryFrame: FramePanel<out MatteryScreen<*>>? = null var inventoryFrame: FramePanel<MatteryScreen<*>>? = null
var mainFrame: FramePanel<out MatteryScreen<*>>? = null var mainFrame: FramePanel<MatteryScreen<*>>? = null
private var madeMainFrame = false private var madeMainFrame = false
var itemRenderer: ItemRenderer var itemRenderer: ItemRenderer
@ -52,6 +52,53 @@ abstract class MatteryScreen<T : MatteryMenu>(menu: T, inventory: Inventory, tit
val isQuickCrafting get() = isQuickCrafting val isQuickCrafting get() = isQuickCrafting
private val inventorySlotsRows = Int2ObjectAVLTreeMap<EditablePanel<MatteryScreen<*>>>() private val inventorySlotsRows = Int2ObjectAVLTreeMap<EditablePanel<MatteryScreen<*>>>()
private lateinit var slotListCanvas: EditablePanel<MatteryScreen<*>>
private lateinit var inventoryScrollbar: DiscreteScrollBarPanel<MatteryScreen<*>>
var inventoryRows = lastRows
set(value) {
val newValue = value.coerceAtLeast(MIN_ROWS).coerceAtMost(MAX_ROWS)
val old = field
if (field != newValue) {
field = newValue
updateInventoryRows(old)
lastRows = newValue
}
}
protected open fun updateInventoryRows(old: Int) {
if (inventoryFrame == null) {
return
}
slotListCanvas.height = AbstractSlotPanel.SIZE * inventoryRows
inventoryFrame!!.height = BASE_INVENTORY_FRAME_HEIGHT + slotListCanvas.height
for (i in inventoryScrollbar.scroll + inventoryRows until inventoryScrollbar.scroll + old) {
getInventorySlotsRow(i).visible = false
}
for (i in inventoryScrollbar.scroll until inventoryScrollbar.scroll + inventoryRows) {
getInventorySlotsRow(i).also {
it.visible = true
it.parent = slotListCanvas
it.y = (i - inventoryScrollbar.scroll) * AbstractSlotPanel.SIZE
}
}
inventoryScrollbar.scroll = inventoryScrollbar.scroll
}
protected fun makeInventoryRowsControls(parent: EditablePanel<*>, x: Float, y: Float, callback: (Float) -> Unit): HeightControls<*> {
return HeightControls(this, parent, x, y) {
inventoryRows += if (it) 1 else -1
callback.invoke(if (it) -AbstractSlotPanel.SIZE / 2f else AbstractSlotPanel.SIZE / 2f)
HeightControls.Status.of(inventoryRows < 6, inventoryRows > 3)
}.also {
it.controlStatus = HeightControls.Status.of(inventoryRows < 6, inventoryRows > 3)
}
}
init { init {
if (menu.playerInventorySlots.isNotEmpty() && menu.autoCreateInventoryFrame) { if (menu.playerInventorySlots.isNotEmpty() && menu.autoCreateInventoryFrame) {
@ -77,18 +124,16 @@ abstract class MatteryScreen<T : MatteryMenu>(menu: T, inventory: Inventory, tit
} }
} }
} else { } else {
inventoryFrame = FramePanel<MatteryScreen<*>>(this, null, 0f, 0f, INVENTORY_FRAME_WIDTH_EXTENDED, INVENTORY_FRAME_HEIGHT, inventory.displayName).also(this::addPanel) inventoryFrame = FramePanel<MatteryScreen<*>>(this, null, 0f, 0f, INVENTORY_FRAME_WIDTH_EXTENDED, BASE_INVENTORY_FRAME_HEIGHT + AbstractSlotPanel.SIZE * inventoryRows, inventory.displayName).also(this::addPanel)
var slotListCanvas: EditablePanel<MatteryScreen<*>>? = null inventoryScrollbar = DiscreteScrollBarPanel(this, inventoryFrame, { ((menu.playerCombinedInventorySlots.size - inventoryRows * 9) + 8) / 9 }, {
val scrollbar = DiscreteScrollBarPanel(this, inventoryFrame, { ((menu.playerCombinedInventorySlots.size - 27) + 8) / 9 }, {
_, old, new -> _, old, new ->
for (i in old .. old + 2) { for (i in old until old + inventoryRows) {
getInventorySlotsRow(i).visible = false getInventorySlotsRow(i).visible = false
} }
for (i in new .. new + 2) { for (i in new until new + inventoryRows) {
getInventorySlotsRow(i).also { getInventorySlotsRow(i).also {
it.visible = true it.visible = true
it.parent = slotListCanvas it.parent = slotListCanvas
@ -96,12 +141,12 @@ abstract class MatteryScreen<T : MatteryMenu>(menu: T, inventory: Inventory, tit
} }
} }
menu.ply.matteryPlayer?.exoSuitMenu?.lastScroll = new lastScroll = new
}) })
slotListCanvas = object : EditablePanel<MatteryScreen<*>>(this@MatteryScreen, inventoryFrame, height = AbstractSlotPanel.SIZE * 3f) { slotListCanvas = object : EditablePanel<MatteryScreen<*>>(this@MatteryScreen, inventoryFrame, height = AbstractSlotPanel.SIZE * inventoryRows) {
override fun mouseScrolledInner(x: Double, y: Double, scroll: Double): Boolean { override fun mouseScrolledInner(x: Double, y: Double, scroll: Double): Boolean {
scrollbar.mouseScrolledInner(x, y, scroll) inventoryScrollbar.mouseScrolledInner(x, y, scroll)
return true return true
} }
} }
@ -115,17 +160,23 @@ abstract class MatteryScreen<T : MatteryMenu>(menu: T, inventory: Inventory, tit
SlotPanel(this, hotbarStrip, slot).also { it.dock = Dock.LEFT } SlotPanel(this, hotbarStrip, slot).also { it.dock = Dock.LEFT }
} }
scrollbar.parent = slotListCanvas inventoryScrollbar.parent = slotListCanvas
scrollbar.dock = Dock.RIGHT inventoryScrollbar.dock = Dock.RIGHT
scrollbar.scroll = menu.ply.matteryPlayer?.exoSuitMenu?.lastScroll ?: 0 inventoryScrollbar.scroll = lastScroll
for (i in scrollbar.scroll .. scrollbar.scroll + 2) { for (i in inventoryScrollbar.scroll until inventoryScrollbar.scroll + inventoryRows) {
getInventorySlotsRow(i).also { getInventorySlotsRow(i).also {
it.parent = slotListCanvas it.parent = slotListCanvas
it.y = (i - scrollbar.scroll) * AbstractSlotPanel.SIZE it.y = (i - inventoryScrollbar.scroll) * AbstractSlotPanel.SIZE
} }
} }
makeInventoryRowsControls(inventoryFrame!!, inventoryFrame!!.width + 2f, 0f) { movePixels ->
mainFrame?.let { it.y += movePixels }
inventoryFrame?.let { it.y += movePixels }
moveMousePosScaled(y = movePixels)
}
} }
} }
} }
@ -170,7 +221,7 @@ abstract class MatteryScreen<T : MatteryMenu>(menu: T, inventory: Inventory, tit
movePanels() movePanels()
} }
fun addPanel(panel: EditablePanel<out MatteryScreen<*>>): Boolean { fun addPanel(panel: EditablePanel<MatteryScreen<*>>): Boolean {
if (!panels.contains(panel)) { if (!panels.contains(panel)) {
panels.addFirst(panel) panels.addFirst(panel)
return true return true
@ -179,7 +230,7 @@ abstract class MatteryScreen<T : MatteryMenu>(menu: T, inventory: Inventory, tit
return false return false
} }
fun removePanel(panel: EditablePanel<out MatteryScreen<*>>): Boolean { fun removePanel(panel: EditablePanel<MatteryScreen<*>>): Boolean {
val indexOf = panels.indexOf(panel) val indexOf = panels.indexOf(panel)
if (indexOf != -1) { if (indexOf != -1) {
@ -195,7 +246,7 @@ abstract class MatteryScreen<T : MatteryMenu>(menu: T, inventory: Inventory, tit
* *
* @param panel panel to be pushed up * @param panel panel to be pushed up
*/ */
fun popup(panel: EditablePanel<out MatteryScreen<*>>) { fun popup(panel: EditablePanel<MatteryScreen<*>>) {
val indexOf = panels.indexOf(panel) val indexOf = panels.indexOf(panel)
require(indexOf != -1) { "No such panel $panel" } require(indexOf != -1) { "No such panel $panel" }
@ -215,7 +266,7 @@ abstract class MatteryScreen<T : MatteryMenu>(menu: T, inventory: Inventory, tit
* *
* @return FramePanel created, or null * @return FramePanel created, or null
*/ */
protected open fun makeMainFrame(): FramePanel<out MatteryScreen<*>>? { protected open fun makeMainFrame(): FramePanel<MatteryScreen<*>>? {
return FramePanel(this, null, 0f, 0f, DEFAULT_FRAME_WIDTH, DEFAULT_FRAME_HEIGHT, getTitle()) return FramePanel(this, null, 0f, 0f, DEFAULT_FRAME_WIDTH, DEFAULT_FRAME_HEIGHT, getTitle())
} }
@ -473,6 +524,7 @@ abstract class MatteryScreen<T : MatteryMenu>(menu: T, inventory: Inventory, tit
const val INVENTORY_FRAME_WIDTH = DEFAULT_FRAME_WIDTH const val INVENTORY_FRAME_WIDTH = DEFAULT_FRAME_WIDTH
const val INVENTORY_FRAME_WIDTH_EXTENDED = DEFAULT_FRAME_WIDTH + ScrollBarConstants.WIDTH + 2f const val INVENTORY_FRAME_WIDTH_EXTENDED = DEFAULT_FRAME_WIDTH + ScrollBarConstants.WIDTH + 2f
const val INVENTORY_FRAME_HEIGHT = 3f * AbstractSlotPanel.SIZE + AbstractSlotPanel.SIZE + 24f const val INVENTORY_FRAME_HEIGHT = 3f * AbstractSlotPanel.SIZE + AbstractSlotPanel.SIZE + 24f
const val BASE_INVENTORY_FRAME_HEIGHT = AbstractSlotPanel.SIZE + 24f
const val GAUGE_TOP_WITH_SLOT = 17f const val GAUGE_TOP_WITH_SLOT = 17f
const val GAUGE_TOP_WITHOUT_SLOT = 26f const val GAUGE_TOP_WITHOUT_SLOT = 26f
@ -480,5 +532,11 @@ abstract class MatteryScreen<T : MatteryMenu>(menu: T, inventory: Inventory, tit
const val PROGRESS_ARROW_TOP = 42f const val PROGRESS_ARROW_TOP = 42f
const val PROGRESS_SLOT_TOP = 41f const val PROGRESS_SLOT_TOP = 41f
const val LEFT_MARGIN = 8f const val LEFT_MARGIN = 8f
const val MIN_ROWS = 3
const val MAX_ROWS = 6
var lastScroll = 0
var lastRows = 3
} }
} }

View File

@ -11,6 +11,7 @@ import net.minecraft.network.chat.Component
import net.minecraft.world.inventory.Slot import net.minecraft.world.inventory.Slot
import org.apache.logging.log4j.LogManager import org.apache.logging.log4j.LogManager
import ru.dbotthepony.mc.otm.client.minecraft import ru.dbotthepony.mc.otm.client.minecraft
import ru.dbotthepony.mc.otm.client.moveMousePosScaled
import ru.dbotthepony.mc.otm.client.render.popScissorRect import ru.dbotthepony.mc.otm.client.render.popScissorRect
import ru.dbotthepony.mc.otm.client.render.pushScissorRect import ru.dbotthepony.mc.otm.client.render.pushScissorRect
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen import ru.dbotthepony.mc.otm.client.screen.MatteryScreen
@ -1207,4 +1208,8 @@ open class EditablePanel<out S : Screen> @JvmOverloads constructor(
setDockMargin(0f, 0f, 0f, 0f) setDockMargin(0f, 0f, 0f, 0f)
return grid return grid
} }
fun mouseToCenter() {
moveMousePosScaled(absoluteX + width / 2f, absoluteY + height / 2f)
}
} }

View File

@ -16,7 +16,6 @@ import ru.dbotthepony.mc.otm.network.ExoSuitSlotPacket
import ru.dbotthepony.mc.otm.network.MatteryPlayerNetworkChannel import ru.dbotthepony.mc.otm.network.MatteryPlayerNetworkChannel
class ExoSuitInventoryMenu(val capability: MatteryPlayerCapability) : MatteryMenu(null, CONTAINER_ID, capability.ply.inventory) { class ExoSuitInventoryMenu(val capability: MatteryPlayerCapability) : MatteryMenu(null, CONTAINER_ID, capability.ply.inventory) {
var lastScroll = 0
override val storageSlots: Collection<Slot> get() = listOf() override val storageSlots: Collection<Slot> get() = listOf()
val craftingGrid: CraftingContainer val craftingGrid: CraftingContainer