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

57 lines
1.8 KiB
Kotlin

package net.shadowfacts.cacao
import net.minecraft.client.gui.screen.Screen
import net.minecraft.network.chat.TextComponent
import net.minecraft.sound.SoundEvents
import net.shadowfacts.cacao.geometry.Point
import net.shadowfacts.cacao.util.MouseButton
import net.shadowfacts.cacao.util.RenderHelper
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
*/
open class CacaoScreen: Screen(TextComponent("CacaoScreen")) {
// _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.
*/
fun addWindow(window: Window, index: Int = _windows.size) {
_windows.add(index, window)
}
override fun render(mouseX: Int, mouseY: Int, delta: Float) {
renderBackground()
val mouse = Point(mouseX, mouseY)
windows.forEach {
it.draw(mouse, delta)
}
}
override fun mouseClicked(mouseX: Double, mouseY: Double, button: Int): Boolean {
val window = windows.lastOrNull()
if (window?.mouseClicked(Point(mouseX, mouseY), MouseButton.fromMC(button)) == true) {
RenderHelper.playSound(SoundEvents.UI_BUTTON_CLICK)
}
return false
}
}