dockGravity

This commit is contained in:
DBotThePony 2024-11-05 17:43:10 +07:00
parent 56e2e70a5c
commit 868cd753d5
Signed by: DBot
GPG Key ID: DCC23B5715498507
2 changed files with 62 additions and 13 deletions

View File

@ -213,7 +213,7 @@ abstract class MatteryScreen<T : MatteryMenu>(menu: T, inventory: Inventory, tit
if (menu.playerInventorySlots.isNotEmpty() && menu.autoCreateInventoryFrame) {
val deviceControls: DeviceControls<MatteryScreen<*>>
if (menu.player.matteryPlayer?.hasExopack != true) {
if (!menu.player.matteryPlayer.hasExopack) {
inventoryFrame = FramePanel<MatteryScreen<*>>(this, null, 0f, 0f, INVENTORY_FRAME_WIDTH, INVENTORY_FRAME_HEIGHT, inventory.displayName).also(this::addPanel)
inventoryFrame!!.makeHelpButton().addSlotFiltersHelp()
@ -669,6 +669,13 @@ abstract class MatteryScreen<T : MatteryMenu>(menu: T, inventory: Inventory, tit
panels.forEach { it.tickHovered1() }
panels.forEach { it.tickHovered2() }
// EMI workaround for not rendering itself properly, the way JEI does
graphics.pose().pushPose()
graphics.pose().translate(guiLeft.toFloat(), guiTop.toFloat(), 0f)
NeoForge.EVENT_BUS.post(ContainerScreenEvent.Render.Background(this, graphics, mouseX, mouseY))
graphics.pose().popPose()
RenderSystem.disableDepthTest()
RenderSystem.defaultBlendFunc()
RenderSystem.enableBlend()
RenderSystem.enableDepthTest()
@ -683,11 +690,6 @@ abstract class MatteryScreen<T : MatteryMenu>(menu: T, inventory: Inventory, tit
panelsReversed.any { it.updateCursor1() }
RenderSystem.depthFunc(GL11.GL_LESS)
graphics.pose().pushPose()
graphics.pose().translate(guiLeft.toFloat(), guiTop.toFloat(), 0f)
NeoForge.EVENT_BUS.post(ContainerScreenEvent.Render.Background(this, graphics, mouseX, mouseY))
graphics.pose().popPose()
RenderSystem.disableDepthTest()
// Screen.super.render
for (widget in renderables) {
@ -696,6 +698,8 @@ abstract class MatteryScreen<T : MatteryMenu>(menu: T, inventory: Inventory, tit
// /Screen.super.render
RenderSystem.disableDepthTest()
// EMI workaround for not rendering itself properly, the way JEI does
graphics.pose().pushPose()
graphics.pose().translate(guiLeft.toFloat(), guiTop.toFloat(), 0f)
NeoForge.EVENT_BUS.post(ContainerScreenEvent.Render.Foreground(this, graphics, mouseX, mouseY))

View File

@ -20,6 +20,7 @@ import ru.dbotthepony.mc.otm.client.CursorType
import ru.dbotthepony.mc.otm.client.render.MGUIGraphics
import ru.dbotthepony.mc.otm.client.minecraft
import ru.dbotthepony.mc.otm.client.moveMousePosScaled
import ru.dbotthepony.mc.otm.client.render.RenderGravity
import ru.dbotthepony.mc.otm.client.render.currentScissorRect
import ru.dbotthepony.mc.otm.client.render.popScissorRect
import ru.dbotthepony.mc.otm.client.render.pushScissorRect
@ -320,14 +321,32 @@ open class EditablePanel<out S : Screen>(
}
}
// Позволяет смещать потомков на эту координату
/**
* Specifies how to offset ("scroll") children panels on X coordinate
*/
var xOffset = 0f
/**
* Specifies how to offset ("scroll") children panels on Y coordinate
*/
var yOffset = 0f
// Обрезать отрисовку потомков?
/**
* Push scissor to scissor stack when rendering this panel?
*
* Useful for when panel calls rendering code which can exceed panel's bounds and this outcome is undesired
*/
var scissor = false
var scissorLock = false
/**
* Extends or shrinks scissor bounds when [scissor] is true
*/
var scissorPadding = DockProperty.EMPTY
/**
* Automatic panel docking to one of sides
*/
var dock = Dock.NONE
set(value) {
if (field != value) {
@ -335,6 +354,12 @@ open class EditablePanel<out S : Screen>(
parent?.layoutInvalidated = true
}
}
/**
* Allows to specify how to resize panel while docking
*
* If a side does not get resized, panel gets repositioned according to [dockGravity]
*/
var dockResize = DockResizeMode.ALL
set(value) {
if (field != value) {
@ -342,6 +367,23 @@ open class EditablePanel<out S : Screen>(
parent?.layoutInvalidated = true
}
}
/**
* Specifies how to handle panel repositioning if there are gaps due to [dockResize] not being [DockResizeMode.ALL]
*/
var dockGravity = RenderGravity.CENTER_CENTER
set(value) {
if (field != value) {
field = value
if (dockResize != DockResizeMode.ALL)
parent?.layoutInvalidated = true
}
}
/**
* Positioning of this panel against docking edges
*/
var dockMargin = DockProperty.EMPTY
set(value) {
if (field != value) {
@ -386,6 +428,9 @@ open class EditablePanel<out S : Screen>(
}
}
/**
* Positioning of children panels against this panel's edges
*/
var dockPadding = DockProperty.EMPTY
set(value) {
if (field != value) {
@ -1219,7 +1264,7 @@ open class EditablePanel<out S : Screen>(
if (child.dockResize.changeHeight)
child.height = child.dockedHeight
else if (child.height != child.dockedHeight)
child.y += (child.dockedHeight / 2f - child.height / 2f).roundToInt().toFloat()
child.y += dockGravity.repositionY(child.dockedHeight, child.height).roundToInt().toFloat()
}
Dock.RIGHT -> {
@ -1233,7 +1278,7 @@ open class EditablePanel<out S : Screen>(
if (child.dockResize.changeHeight)
child.height = child.dockedHeight
else if (child.height != child.dockedHeight)
child.y += (child.dockedHeight / 2f - child.height / 2f).roundToInt().toFloat()
child.y += dockGravity.repositionY(child.dockedHeight, child.height).roundToInt().toFloat()
}
Dock.TOP -> {
@ -1261,7 +1306,7 @@ open class EditablePanel<out S : Screen>(
if (child.dockResize.changeWidth)
child.width = child.dockedWidth
else if (child.width != child.dockedWidth)
child.x += (child.dockedWidth / 2f - child.width / 2f).roundToInt().toFloat()
child.x += dockGravity.repositionX(child.dockedWidth, child.width).roundToInt().toFloat()
}
}
}
@ -1284,12 +1329,12 @@ open class EditablePanel<out S : Screen>(
if (child.dockResize.changeHeight)
child.height = child.dockedHeight
else if (child.height != child.dockedHeight)
child.y += child.dockedHeight / 2f - child.height / 2f
child.y += dockGravity.repositionY(child.dockedHeight, child.height).roundToInt().toFloat()
if (child.dockResize.changeWidth)
child.width = child.dockedWidth
else if (child.width != child.dockedWidth)
child.x += child.dockedWidth / 2f - child.width / 2f
child.x += dockGravity.repositionX(child.dockedWidth, child.width).roundToInt().toFloat()
}
}