@@ -4,8 +4,9 @@ import com.lambda.Lambda.mc
44import com.lambda.event.EventFlow
55import com.lambda.event.events.RenderEvent
66import com.lambda.event.events.TickEvent
7- import com.lambda.event.listener.SafeListener.Companion.listener
7+ import com.lambda.event.listener.UnsafeListener
88import com.lambda.gui.api.component.core.IComponent
9+ import com.lambda.module.Module
910import com.lambda.util.KeyCode
1011import com.lambda.util.Mouse
1112import com.lambda.util.Nameable
@@ -15,82 +16,92 @@ import net.minecraft.client.gui.DrawContext
1516import net.minecraft.client.gui.screen.Screen
1617import 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}
0 commit comments