1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
package at.hannibal2.skyhanni.utils.guide
import at.hannibal2.skyhanni.test.command.ErrorManager
import at.hannibal2.skyhanni.utils.RenderUtils
import at.hannibal2.skyhanni.utils.renderables.Renderable
import at.hannibal2.skyhanni.utils.renderables.RenderableUtils.renderXYAligned
import net.minecraft.client.gui.GuiScreen
import net.minecraft.client.renderer.GlStateManager
import net.minecraft.item.ItemStack
const val SELECTED_COLOR = 0x50000000
const val NOT_SELECTED_COLOR = 0x50303030
const val TAB_SPACING = 5
const val TAB_SHORT_SIDE = 25
const val TAB_LONG_SIDE = 28
abstract class GuideGUI<pageEnum : Enum<*>>(defaultScreen: pageEnum) : GuiScreen() {
abstract val sizeX: Int
abstract val sizeY: Int
lateinit var pageList: Map<pageEnum, GuidePage>
lateinit var horizontalTabs: List<GuideTab>
lateinit var verticalTabs: List<GuideTab>
protected var currentPage: pageEnum = defaultScreen
set(value) {
pageList[field]?.onLeave()
pageList[value]?.onEnter()
field = value
}
val lastVerticalTabWrapper = object : tabWrapper {
override var tab: GuideTab? = null
}
val lastHorizontalTabWrapper = object : tabWrapper {
override var tab: GuideTab? = null
}
fun hTab(item: ItemStack, tip: Renderable, onClick: (GuideTab) -> Unit) =
GuideTab(item, tip, false, lastHorizontalTabWrapper, onClick)
fun vTab(item: ItemStack, tip: Renderable, onClick: (GuideTab) -> Unit) =
GuideTab(item, tip, true, lastVerticalTabWrapper, onClick)
interface tabWrapper {
var tab: GuideTab?
}
fun refreshPage() {
pageList[currentPage]?.refresh()
}
private fun renderHorizontalTabs() {
var offset = Pair(TAB_SPACING.toFloat() * 3f, -TAB_LONG_SIDE.toFloat())
GlStateManager.translate(offset.first, offset.second, 0f)
for (tab in horizontalTabs) {
tab.render(offset.first.toInt(), offset.second.toInt())
val xShift = (TAB_SHORT_SIDE + TAB_SPACING).toFloat()
offset = offset.first + xShift to offset.second
GlStateManager.translate(xShift, 0f, 0f)
}
GlStateManager.translate(-offset.first, -offset.second, 0f)
}
private fun renderVerticalTabs() {
var offset = Pair(-TAB_LONG_SIDE.toFloat(), TAB_SPACING.toFloat() * 3f)
GlStateManager.translate(offset.first, offset.second, 0f)
for (tab in verticalTabs) {
tab.render(offset.first.toInt(), offset.second.toInt())
val yShift = (TAB_SHORT_SIDE + TAB_SPACING).toFloat()
offset = offset.first to offset.second + yShift
GlStateManager.translate(0f, yShift, 0f)
}
GlStateManager.translate(-offset.first, -offset.second, 0f)
}
override fun drawScreen(mouseX: Int, mouseY: Int, partialTicks: Float) = try {
super.drawScreen(mouseX, mouseY, partialTicks)
drawDefaultBackground()
val guiLeft = (width - sizeX) / 2
val guiTop = (height - sizeY) / 2
/*
val mouseX = Mouse.getX() * width / Minecraft.getMinecraft().displayWidth
val mouseY = height - Mouse.getY() * height / Minecraft.getMinecraft().displayHeight - 1
*/
val relativeMouseX = mouseX - guiLeft
val relativeMouseY = mouseY - guiTop
GlStateManager.pushMatrix()
GlStateManager.translate(guiLeft.toFloat(), guiTop.toFloat(), 0f)
drawRect(0, 0, sizeX, sizeY, 0x50000000)
Renderable.withMousePosition(relativeMouseX, relativeMouseY) {
renderHorizontalTabs()
renderVerticalTabs()
Renderable.string(
"§7SkyHanni ",
horizontalAlign = RenderUtils.HorizontalAlignment.RIGHT,
verticalAlign = RenderUtils.VerticalAlignment.BOTTOM
).renderXYAligned(0, 0, sizeX, sizeY)
val page = pageList[currentPage]
page?.drawPage(relativeMouseX, relativeMouseY)
GlStateManager.translate(-guiLeft.toFloat(), -guiTop.toFloat(), 0f)
}
GlStateManager.popMatrix()
} catch (e: Exception) {
GlStateManager.popMatrix()
ErrorManager.logErrorWithData(
e, "Something broke in GuideGUI",
"Guide" to this.javaClass.typeName,
"Page" to currentPage.name
)
}
}
|