Skip to content

Commit 78789f6

Browse files
committed
AbstractGui rework, refactor
1 parent 6e2f721 commit 78789f6

File tree

5 files changed

+103
-84
lines changed

5 files changed

+103
-84
lines changed

common/src/main/kotlin/com/lambda/gui/api/LambdaGui.kt

Lines changed: 83 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ import com.lambda.Lambda.mc
44
import com.lambda.event.EventFlow
55
import com.lambda.event.events.RenderEvent
66
import com.lambda.event.events.TickEvent
7-
import com.lambda.event.listener.SafeListener.Companion.listener
7+
import com.lambda.event.listener.UnsafeListener
88
import com.lambda.gui.api.component.core.IComponent
9+
import com.lambda.module.Module
910
import com.lambda.util.KeyCode
1011
import com.lambda.util.Mouse
1112
import com.lambda.util.Nameable
@@ -15,82 +16,92 @@ import net.minecraft.client.gui.DrawContext
1516
import net.minecraft.client.gui.screen.Screen
1617
import net.minecraft.text.Text
1718

18-
interface LambdaGui : IComponent, Nameable {
19-
fun onCloseRequest(): Boolean = true
19+
@Suppress("LeakingThis")
20+
abstract class LambdaGui(override val name: String, private val owner: Module? = null) : Screen(Text.of(name)), IComponent, Nameable {
21+
private var screenSize = Vec2d.ZERO
22+
23+
private val renderListener = UnsafeListener(0, this, false) { event ->
24+
event as RenderEvent.GUI.Scaled
25+
screenSize = event.screenSize
26+
onRender()
27+
}
28+
29+
private val tickListener = UnsafeListener(0, this, false) {
30+
onTick()
31+
}
2032

2133
/**
2234
* Shows this gui screen
2335
*
2436
* No safe context required (TODO: let user open clickgui via main menu)
2537
*/
26-
fun show() = recordRenderCall {
27-
mc.setScreen(object : Screen(Text.of(name)) {
28-
private var screenSize = Vec2d.ZERO
29-
30-
private val renderListener = listener<RenderEvent.GUI.Scaled> { event ->
31-
screenSize = event.screenSize
32-
onRender()
33-
}
34-
35-
private val tickListener = listener<TickEvent.Pre> {
36-
onTick()
37-
}
38-
39-
override fun onDisplayed() {
40-
onShow()
41-
}
42-
43-
override fun render(context: DrawContext?, mouseX: Int, mouseY: Int, delta: Float) {
44-
// Let's remove background tint
45-
}
46-
47-
override fun removed() {
48-
onHide()
49-
50-
with(EventFlow.syncListeners) {
51-
unsubscribe(renderListener)
52-
unsubscribe(tickListener)
53-
}
54-
}
55-
56-
override fun keyPressed(keyCode: Int, scanCode: Int, modifiers: Int): Boolean {
57-
onKey(KeyCode(keyCode))
58-
59-
if (keyCode == KeyCode.Escape.key && onCloseRequest()) {
60-
this.close()
61-
}
62-
63-
return true
64-
}
65-
66-
override fun charTyped(chr: Char, modifiers: Int): Boolean {
67-
onChar(chr)
68-
return true
69-
}
70-
71-
override fun mouseClicked(mouseX: Double, mouseY: Double, button: Int): Boolean {
72-
onMouseClick(Mouse.Button(button), Mouse.Action.Click, rescaleMouse(mouseX, mouseY))
73-
return true
74-
}
75-
76-
override fun mouseReleased(mouseX: Double, mouseY: Double, button: Int): Boolean {
77-
onMouseClick(Mouse.Button(button), Mouse.Action.Release, rescaleMouse(mouseX, mouseY))
78-
return true
79-
}
80-
81-
override fun mouseMoved(mouseX: Double, mouseY: Double) {
82-
onMouseMove(rescaleMouse(mouseX, mouseY))
83-
}
84-
85-
override fun shouldPause() = false
86-
87-
private fun rescaleMouse(mouseX: Double, mouseY: Double): Vec2d {
88-
val mcMouse = Vec2d(mouseX, mouseY)
89-
val mcWindow = Vec2d(mc.window.scaledWidth, mc.window.scaledHeight)
90-
91-
val uv = mcMouse / mcWindow
92-
return uv * screenSize
93-
}
94-
})
38+
fun show() {
39+
mc.currentScreen?.close()
40+
41+
recordRenderCall { // wait for previous screen to be closed
42+
mc.setScreen(this)
43+
}
44+
}
45+
46+
final override fun onDisplayed() {
47+
onShow()
48+
49+
with(EventFlow.syncListeners) {
50+
subscribe<RenderEvent.GUI.Scaled>(renderListener)
51+
subscribe<TickEvent.Pre>(tickListener)
52+
}
53+
}
54+
55+
final override fun removed() {
56+
onHide()
57+
owner?.disable()
58+
59+
with(EventFlow.syncListeners) {
60+
unsubscribe(renderListener)
61+
unsubscribe(tickListener)
62+
}
63+
}
64+
65+
final override fun render(context: DrawContext?, mouseX: Int, mouseY: Int, delta: Float) {
66+
// Let's remove background tint
67+
}
68+
69+
final override fun keyPressed(keyCode: Int, scanCode: Int, modifiers: Int): Boolean {
70+
onKey(KeyCode(keyCode))
71+
72+
if (keyCode == KeyCode.Escape.key) {
73+
close()
74+
}
75+
76+
return true
77+
}
78+
79+
final override fun charTyped(chr: Char, modifiers: Int): Boolean {
80+
onChar(chr)
81+
return true
82+
}
83+
84+
final override fun mouseClicked(mouseX: Double, mouseY: Double, button: Int): Boolean {
85+
onMouseClick(Mouse.Button(button), Mouse.Action.Click, rescaleMouse(mouseX, mouseY))
86+
return true
87+
}
88+
89+
final override fun mouseReleased(mouseX: Double, mouseY: Double, button: Int): Boolean {
90+
onMouseClick(Mouse.Button(button), Mouse.Action.Release, rescaleMouse(mouseX, mouseY))
91+
return true
92+
}
93+
94+
final override fun mouseMoved(mouseX: Double, mouseY: Double) {
95+
onMouseMove(rescaleMouse(mouseX, mouseY))
96+
}
97+
98+
final override fun shouldPause() = false
99+
100+
private fun rescaleMouse(mouseX: Double, mouseY: Double): Vec2d {
101+
val mcMouse = Vec2d(mouseX, mouseY)
102+
val mcWindow = Vec2d(mc.window.scaledWidth, mc.window.scaledHeight)
103+
104+
val uv = mcMouse / mcWindow
105+
return uv * screenSize
95106
}
96107
}

common/src/main/kotlin/com/lambda/gui/api/component/WindowComponent.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ abstract class WindowComponent <T : IRectComponent> : InteractiveComponent(), IL
2424

2525
private var isOpen = false
2626
private var dragOffset: Vec2d? = null
27-
private val padding get() = ClickGui.padding
27+
private val padding get() = ClickGui.windowPadding
2828

2929
final override val rect get() = Rect.basedOn(position, width, renderHeight + titleBarHeight)
3030
val contentRect get() = rect.shrink(padding).moveFirst(Vec2d(0.0, titleBarHeight - padding))

common/src/main/kotlin/com/lambda/gui/api/component/sub/ButtonComponent.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ abstract class ButtonComponent(private val base: WindowComponent<*>) : Interacti
4545
text = this@ButtonComponent.text
4646
scale = 1.0 - pressAnimation * 0.05
4747

48-
val x = rect.left + ClickGui.padding + interactAnimation + hoverAnimation * 0.5
48+
val x = rect.left + ClickGui.windowPadding + interactAnimation + hoverAnimation * 0.5
4949
position = Vec2d(x, rect.center.y)
5050
}
5151
}

common/src/main/kotlin/com/lambda/gui/impl/clickgui/LambdaClickGui.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@ import com.lambda.gui.api.LambdaGui
44
import com.lambda.gui.api.component.WindowComponent
55
import com.lambda.gui.api.component.core.IListComponent
66
import com.lambda.gui.api.component.sub.ButtonComponent
7+
import com.lambda.module.Module
78
import com.lambda.module.ModuleRegistry
89
import com.lambda.module.modules.client.ClickGui
910
import com.lambda.util.Mouse
1011
import com.lambda.util.math.Vec2d
1112

12-
class LambdaClickGui : LambdaGui, IListComponent<WindowComponent<ButtonComponent>> {
13-
override val name = "Lambda ClickGui"
13+
class LambdaClickGui : LambdaGui("Lambda ClickGui", ClickGui), IListComponent<WindowComponent<ButtonComponent>> {
1414
override val children = mutableListOf<WindowComponent<ButtonComponent>>()
1515

1616
init {
@@ -25,7 +25,7 @@ class LambdaClickGui : LambdaGui, IListComponent<WindowComponent<ButtonComponent
2525
ModuleRegistry.modules.forEach { module ->
2626
children.add(object : ButtonComponent(component) {
2727
override val position = Vec2d(0.0, buh)
28-
override val size get() = Vec2d(FILL_PARENT, 11.0)
28+
override val size get() = Vec2d(FILL_PARENT, ClickGui.buttonHeight)
2929

3030
override val text: String get() = module.name
3131
override val active: Boolean get() = module.isEnabled

common/src/main/kotlin/com/lambda/module/modules/client/ClickGui.kt

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.lambda.module.modules.client
22

3-
import com.lambda.event.events.TickEvent
4-
import com.lambda.event.listener.SafeListener.Companion.listener
3+
import com.lambda.event.events.ClientEvent
4+
import com.lambda.event.listener.UnsafeListener.Companion.unsafeListener
55
import com.lambda.gui.impl.clickgui.LambdaClickGui
66
import com.lambda.module.Module
77
import com.lambda.module.tag.ModuleTag
@@ -17,7 +17,8 @@ object ClickGui : Module(
1717

1818
// General
1919
val windowRadius by setting("Window Radius", 2.0, 0.0..10.0, 0.1)
20-
val padding by setting("Padding", 2.0, 0.0..10.0, 0.1)
20+
val windowPadding by setting("Window Padding", 2.0, 0.0..10.0, 0.1)
21+
val buttonHeight by setting("Button Height", 11.0, 8.0..20.0, 0.1)
2122

2223
// Colors
2324
val mainColor by setting("Main Color", Color(110, 0, 40), visibility = { page == Page.Colors })
@@ -34,12 +35,19 @@ object ClickGui : Module(
3435

3536
init {
3637
onEnable {
37-
mc.currentScreen?.close()
38-
gui.show()
38+
if (mc.currentScreen != gui) {
39+
gui.show()
40+
}
3941
}
4042

41-
listener<TickEvent.Pre> {
42-
if (mc.currentScreen?.title?.literalString != gui.name) disable()
43+
onDisable {
44+
if (mc.currentScreen == gui) {
45+
gui.close()
46+
}
47+
}
48+
49+
unsafeListener<ClientEvent.Shutdown> {
50+
disable()
4351
}
4452
}
4553
}

0 commit comments

Comments
 (0)