ASMR/src/main/kotlin/net/shadowfacts/cacao/CacaoScreen.kt

100 lines
3.0 KiB
Kotlin
Raw Normal View History

2019-06-22 20:08:00 +00:00
package net.shadowfacts.cacao
2019-06-26 23:54:23 +00:00
import net.minecraft.client.MinecraftClient
2019-06-22 20:08:00 +00:00
import net.minecraft.client.gui.screen.Screen
2019-06-24 02:34:12 +00:00
import net.minecraft.sound.SoundEvents
2019-08-08 19:41:40 +00:00
import net.minecraft.text.LiteralText
2019-06-22 20:08:00 +00:00
import net.shadowfacts.cacao.geometry.Point
2019-06-23 15:41:32 +00:00
import net.shadowfacts.cacao.util.MouseButton
2019-06-24 02:34:12 +00:00
import net.shadowfacts.cacao.util.RenderHelper
2019-06-26 23:54:23 +00:00
import net.shadowfacts.kiwidsl.dsl
2019-06-22 20:08:00 +00:00
import java.util.*
/**
* This class serves as the bridge between Cacao and a Minecraft [Screen]. It renders Cacao [Window]s in Minecraft and
* sends input events from Minecraft back to Cacao objects.
*
* @author shadowfacts
*/
2019-08-08 19:41:40 +00:00
open class CacaoScreen: Screen(LiteralText("CacaoScreen")) {
2019-06-22 20:08:00 +00:00
// _windows is the internal, mutable object, since we only want it to by mutated by the add/removeWindow methods.
private val _windows = LinkedList<Window>()
/**
* The list of windows that belong to this screen.
* This list should never be modified directly, only by using the [addWindow]/[removeWindow] methods.
*/
val windows: List<Window> = _windows
/**
* Adds the given window to this screen's window list.
* By default, the new window is added at the tail of the window list, making it the active window.
* Only the active window will receive input events.
*
* @param window The Window to add to this screen.
* @param index The index to insert the window into the window list at.
2019-06-26 01:52:17 +00:00
* @return The window that was added, as a convenience.
2019-06-22 20:08:00 +00:00
*/
2019-06-26 01:52:17 +00:00
fun <T: Window> addWindow(window: T, index: Int = _windows.size): T {
2019-06-22 20:08:00 +00:00
_windows.add(index, window)
2019-06-26 01:52:17 +00:00
window.screen = this
window.wasAdded()
2019-06-27 23:12:35 +00:00
window.resize(width, height)
2019-06-26 01:52:17 +00:00
return window
}
/**
* Removes the given window from this screen's window list.
*/
fun removeWindow(window: Window) {
_windows.remove(window)
2019-06-22 20:08:00 +00:00
}
2019-06-26 23:54:23 +00:00
override fun init() {
super.init()
windows.forEach {
it.resize(width, height)
}
}
2019-06-22 20:08:00 +00:00
override fun render(mouseX: Int, mouseY: Int, delta: Float) {
2019-06-26 01:52:17 +00:00
if (minecraft != null) {
// workaround this.minecraft sometimes being null causing a crash
renderBackground()
}
2019-06-23 22:23:59 +00:00
2019-06-22 20:08:00 +00:00
val mouse = Point(mouseX, mouseY)
windows.forEach {
it.draw(mouse, delta)
}
}
2019-06-23 15:41:32 +00:00
override fun mouseClicked(mouseX: Double, mouseY: Double, button: Int): Boolean {
val window = windows.lastOrNull()
2019-06-26 01:52:17 +00:00
val result = window?.mouseClicked(Point(mouseX, mouseY), MouseButton.fromMC(button))
2019-06-27 23:15:12 +00:00
return if (result == true) {
RenderHelper.playSound(SoundEvents.UI_BUTTON_CLICK)
true
} else {
false
2019-06-24 02:34:12 +00:00
}
2019-06-23 15:41:32 +00:00
}
override fun mouseDragged(mouseX: Double, mouseY: Double, button: Int, deltaX: Double, deltaY: Double): Boolean {
val window = windows.lastOrNull()
val startPoint = Point(mouseX, mouseY)
val delta = Point(deltaX, deltaY)
val result = window?.mouseDragged(startPoint, delta, MouseButton.fromMC(button))
return result == true
}
override fun mouseReleased(mouseX: Double, mouseY: Double, button: Int): Boolean {
val window = windows.lastOrNull()
val result = window?.mouseReleased(Point(mouseX, mouseY), MouseButton.fromMC(button))
return result == true
}
2019-06-22 20:08:00 +00:00
}