Handle click sounds in the screen
This commit is contained in:
parent
df3523347c
commit
3902b75a27
|
@ -2,8 +2,10 @@ package net.shadowfacts.cacao
|
||||||
|
|
||||||
import net.minecraft.client.gui.screen.Screen
|
import net.minecraft.client.gui.screen.Screen
|
||||||
import net.minecraft.network.chat.TextComponent
|
import net.minecraft.network.chat.TextComponent
|
||||||
|
import net.minecraft.sound.SoundEvents
|
||||||
import net.shadowfacts.cacao.geometry.Point
|
import net.shadowfacts.cacao.geometry.Point
|
||||||
import net.shadowfacts.cacao.util.MouseButton
|
import net.shadowfacts.cacao.util.MouseButton
|
||||||
|
import net.shadowfacts.cacao.util.RenderHelper
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -45,7 +47,9 @@ open class CacaoScreen: Screen(TextComponent("CacaoScreen")) {
|
||||||
|
|
||||||
override fun mouseClicked(mouseX: Double, mouseY: Double, button: Int): Boolean {
|
override fun mouseClicked(mouseX: Double, mouseY: Double, button: Int): Boolean {
|
||||||
val window = windows.lastOrNull()
|
val window = windows.lastOrNull()
|
||||||
window?.mouseClicked(Point(mouseX, mouseY), MouseButton.fromMC(button))
|
if (window?.mouseClicked(Point(mouseX, mouseY), MouseButton.fromMC(button)) == true) {
|
||||||
|
RenderHelper.playSound(SoundEvents.UI_BUTTON_CLICK)
|
||||||
|
}
|
||||||
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
|
@ -81,13 +81,15 @@ class Window {
|
||||||
*
|
*
|
||||||
* @param point The point in the window of the click.
|
* @param point The point in the window of the click.
|
||||||
* @param mouseButton The mouse button that was used to click.
|
* @param mouseButton The mouse button that was used to click.
|
||||||
|
* @return Whether the mouse click was handled by a view.
|
||||||
*/
|
*/
|
||||||
fun mouseClicked(point: Point, mouseButton: MouseButton) {
|
fun mouseClicked(point: Point, mouseButton: MouseButton): Boolean {
|
||||||
val view = viewAtPoint(point)
|
val view = viewAtPoint(point)
|
||||||
if (view != null) {
|
if (view != null) {
|
||||||
val pointInView = Point(point.x - view.frame.left, point.y - view.frame.top)
|
val pointInView = Point(point.x - view.frame.left, point.y - view.frame.top)
|
||||||
view.mouseClicked(pointInView, mouseButton)
|
return view.mouseClicked(pointInView, mouseButton)
|
||||||
}
|
}
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -258,13 +258,15 @@ open class View() {
|
||||||
*
|
*
|
||||||
* @param point The point in the coordinate system of this view that the mouse was clicked.
|
* @param point The point in the coordinate system of this view that the mouse was clicked.
|
||||||
* @param mouseButton The mouse button used to click.
|
* @param mouseButton The mouse button used to click.
|
||||||
|
* @return Whether the mouse click was handled by this view or any subviews.
|
||||||
*/
|
*/
|
||||||
open fun mouseClicked(point: Point, mouseButton: MouseButton) {
|
open fun mouseClicked(point: Point, mouseButton: MouseButton): Boolean {
|
||||||
val view = subviewAtPoint(point)
|
val view = subviewAtPoint(point)
|
||||||
if (view != null) {
|
if (view != null) {
|
||||||
val pointInView = convert(point, to = view)
|
val pointInView = convert(point, to = view)
|
||||||
view.mouseClicked(pointInView, mouseButton)
|
return view.mouseClicked(pointInView, mouseButton)
|
||||||
}
|
}
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -65,11 +65,6 @@ abstract class AbstractButton<Impl: AbstractButton<Impl>>(val content: View, val
|
||||||
*/
|
*/
|
||||||
var disabledBackground: View? = NinePatchView(DISABLED_BG)
|
var disabledBackground: View? = NinePatchView(DISABLED_BG)
|
||||||
|
|
||||||
/**
|
|
||||||
* If the button will play the Minecraft button click sound when clicked.
|
|
||||||
*/
|
|
||||||
var clickSoundEnabled = true
|
|
||||||
|
|
||||||
override fun wasAdded() {
|
override fun wasAdded() {
|
||||||
solver.dsl {
|
solver.dsl {
|
||||||
addSubview(content)
|
addSubview(content)
|
||||||
|
@ -115,8 +110,8 @@ abstract class AbstractButton<Impl: AbstractButton<Impl>>(val content: View, val
|
||||||
RenderHelper.popMatrix()
|
RenderHelper.popMatrix()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun mouseClicked(point: Point, mouseButton: MouseButton) {
|
override fun mouseClicked(point: Point, mouseButton: MouseButton): Boolean {
|
||||||
if (disabled) return
|
if (disabled) return false
|
||||||
|
|
||||||
val handler = handler
|
val handler = handler
|
||||||
if (handler != null) {
|
if (handler != null) {
|
||||||
|
@ -125,11 +120,9 @@ abstract class AbstractButton<Impl: AbstractButton<Impl>>(val content: View, val
|
||||||
// For example, an implementing class may be defined as such: `class Button: AbstractButton<Button>`
|
// For example, an implementing class may be defined as such: `class Button: AbstractButton<Button>`
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
handler(this as Impl)
|
handler(this as Impl)
|
||||||
|
}
|
||||||
|
|
||||||
if (clickSoundEnabled && !RenderHelper.disabled) {
|
return true
|
||||||
RenderHelper.playSound(SoundEvents.UI_BUTTON_CLICK)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -30,7 +30,7 @@ class EnumButton<E: Enum<E>>(initialValue: E, val localizer: (E) -> String): Abs
|
||||||
label.text = localizer(value)
|
label.text = localizer(value)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun mouseClicked(point: Point, mouseButton: MouseButton) {
|
override fun mouseClicked(point: Point, mouseButton: MouseButton): Boolean {
|
||||||
if (!disabled) {
|
if (!disabled) {
|
||||||
value = when (mouseButton) {
|
value = when (mouseButton) {
|
||||||
MouseButton.LEFT -> EnumHelper.next(value)
|
MouseButton.LEFT -> EnumHelper.next(value)
|
||||||
|
@ -39,7 +39,7 @@ class EnumButton<E: Enum<E>>(initialValue: E, val localizer: (E) -> String): Abs
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
super.mouseClicked(point, mouseButton)
|
return super.mouseClicked(point, mouseButton)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -35,12 +35,12 @@ class ToggleButton(initialState: Boolean): AbstractButton<ToggleButton>(TextureV
|
||||||
textureView.texture = if (value) ON else OFF
|
textureView.texture = if (value) ON else OFF
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun mouseClicked(point: Point, mouseButton: MouseButton) {
|
override fun mouseClicked(point: Point, mouseButton: MouseButton): Boolean {
|
||||||
if (!disabled && (mouseButton == MouseButton.LEFT || mouseButton == MouseButton.RIGHT)) {
|
if (!disabled && (mouseButton == MouseButton.LEFT || mouseButton == MouseButton.RIGHT)) {
|
||||||
state = !state
|
state = !state
|
||||||
}
|
}
|
||||||
|
|
||||||
super.mouseClicked(point, mouseButton)
|
return super.mouseClicked(point, mouseButton)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -25,11 +25,12 @@ class ViewClickTests {
|
||||||
fun testClickInsideRootView() {
|
fun testClickInsideRootView() {
|
||||||
val mouse = CompletableFuture<Point>()
|
val mouse = CompletableFuture<Point>()
|
||||||
window.addView(object: View(Rect(50.0, 50.0, 100.0, 100.0)) {
|
window.addView(object: View(Rect(50.0, 50.0, 100.0, 100.0)) {
|
||||||
override fun mouseClicked(point: Point, mouseButton: MouseButton) {
|
override fun mouseClicked(point: Point, mouseButton: MouseButton): Boolean {
|
||||||
mouse.complete(point)
|
mouse.complete(point)
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
window.mouseClicked(Point(75.0, 75.0), MouseButton.LEFT)
|
assertTrue(window.mouseClicked(Point(75.0, 75.0), MouseButton.LEFT))
|
||||||
|
|
||||||
assertEquals(Point(25.0, 25.0), mouse.getNow(null))
|
assertEquals(Point(25.0, 25.0), mouse.getNow(null))
|
||||||
}
|
}
|
||||||
|
@ -38,11 +39,12 @@ class ViewClickTests {
|
||||||
fun testClickOutsideRootView() {
|
fun testClickOutsideRootView() {
|
||||||
val clicked = CompletableFuture<Boolean>()
|
val clicked = CompletableFuture<Boolean>()
|
||||||
window.addView(object: View(Rect(50.0, 50.0, 100.0, 100.0)) {
|
window.addView(object: View(Rect(50.0, 50.0, 100.0, 100.0)) {
|
||||||
override fun mouseClicked(point: Point, mouseButton: MouseButton) {
|
override fun mouseClicked(point: Point, mouseButton: MouseButton): Boolean {
|
||||||
clicked.complete(true)
|
clicked.complete(true)
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
window.mouseClicked(Point(25.0, 25.0), MouseButton.LEFT)
|
assertFalse(window.mouseClicked(Point(25.0, 25.0), MouseButton.LEFT))
|
||||||
|
|
||||||
assertFalse(clicked.getNow(false))
|
assertFalse(clicked.getNow(false))
|
||||||
}
|
}
|
||||||
|
@ -52,11 +54,12 @@ class ViewClickTests {
|
||||||
val mouse = CompletableFuture<Point>()
|
val mouse = CompletableFuture<Point>()
|
||||||
val root = window.addView(View(Rect(50.0, 50.0, 100.0, 100.0)))
|
val root = window.addView(View(Rect(50.0, 50.0, 100.0, 100.0)))
|
||||||
root.addSubview(object: View(Rect(25.0, 25.0, 50.0, 50.0)) {
|
root.addSubview(object: View(Rect(25.0, 25.0, 50.0, 50.0)) {
|
||||||
override fun mouseClicked(point: Point, mouseButton: MouseButton) {
|
override fun mouseClicked(point: Point, mouseButton: MouseButton): Boolean {
|
||||||
mouse.complete(point)
|
mouse.complete(point)
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
window.mouseClicked(Point(100.0, 100.0), MouseButton.LEFT)
|
assertTrue(window.mouseClicked(Point(100.0, 100.0), MouseButton.LEFT))
|
||||||
|
|
||||||
assertEquals(Point(25.0, 25.0), mouse.getNow(null))
|
assertEquals(Point(25.0, 25.0), mouse.getNow(null))
|
||||||
}
|
}
|
||||||
|
@ -66,11 +69,12 @@ class ViewClickTests {
|
||||||
val clicked = CompletableFuture<Boolean>()
|
val clicked = CompletableFuture<Boolean>()
|
||||||
val root = window.addView(View(Rect(50.0, 50.0, 100.0, 100.0)))
|
val root = window.addView(View(Rect(50.0, 50.0, 100.0, 100.0)))
|
||||||
root.addSubview(object: View(Rect(25.0, 25.0, 50.0, 50.0)) {
|
root.addSubview(object: View(Rect(25.0, 25.0, 50.0, 50.0)) {
|
||||||
override fun mouseClicked(point: Point, mouseButton: MouseButton) {
|
override fun mouseClicked(point: Point, mouseButton: MouseButton): Boolean {
|
||||||
clicked.complete(true)
|
clicked.complete(true)
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
window.mouseClicked(Point(0.0, 0.0), MouseButton.LEFT)
|
assertFalse(window.mouseClicked(Point(0.0, 0.0), MouseButton.LEFT))
|
||||||
|
|
||||||
assertFalse(clicked.getNow(false))
|
assertFalse(clicked.getNow(false))
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,8 +40,8 @@ class ButtonClickTests {
|
||||||
button.topAnchor equalTo 0
|
button.topAnchor equalTo 0
|
||||||
}
|
}
|
||||||
window.layout()
|
window.layout()
|
||||||
window.mouseClicked(Point(5.0, 5.0), MouseButton.LEFT)
|
|
||||||
|
|
||||||
|
assertTrue(window.mouseClicked(Point(5.0, 5.0), MouseButton.LEFT))
|
||||||
assertTrue(clicked.getNow(false))
|
assertTrue(clicked.getNow(false))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,8 +61,8 @@ class ButtonClickTests {
|
||||||
button.topAnchor equalTo 0
|
button.topAnchor equalTo 0
|
||||||
}
|
}
|
||||||
window.layout()
|
window.layout()
|
||||||
window.mouseClicked(Point(50.0, 50.0), MouseButton.LEFT)
|
|
||||||
|
|
||||||
|
assertFalse(window.mouseClicked(Point(50.0, 50.0), MouseButton.LEFT))
|
||||||
assertFalse(clicked.getNow(false))
|
assertFalse(clicked.getNow(false))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,7 @@ class EnumButtonTests {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
window.mouseClicked(Point(5.0, 5.0), MouseButton.LEFT)
|
assertTrue(window.mouseClicked(Point(5.0, 5.0), MouseButton.LEFT))
|
||||||
assertTrue(called.getNow(false))
|
assertTrue(called.getNow(false))
|
||||||
assertEquals(MyEnum.TWO, button.value)
|
assertEquals(MyEnum.TWO, button.value)
|
||||||
}
|
}
|
||||||
|
@ -58,11 +58,11 @@ class EnumButtonTests {
|
||||||
content.frame = bounds
|
content.frame = bounds
|
||||||
})
|
})
|
||||||
|
|
||||||
window.mouseClicked(Point(5.0, 5.0), MouseButton.LEFT)
|
assertTrue(window.mouseClicked(Point(5.0, 5.0), MouseButton.LEFT))
|
||||||
assertEquals(MyEnum.TWO, button.value)
|
assertEquals(MyEnum.TWO, button.value)
|
||||||
window.mouseClicked(Point(5.0, 5.0), MouseButton.LEFT)
|
assertTrue(window.mouseClicked(Point(5.0, 5.0), MouseButton.LEFT))
|
||||||
assertEquals(MyEnum.THREE, button.value)
|
assertEquals(MyEnum.THREE, button.value)
|
||||||
window.mouseClicked(Point(5.0, 5.0), MouseButton.LEFT)
|
assertTrue(window.mouseClicked(Point(5.0, 5.0), MouseButton.LEFT))
|
||||||
assertEquals(MyEnum.ONE, button.value)
|
assertEquals(MyEnum.ONE, button.value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,9 +73,9 @@ class EnumButtonTests {
|
||||||
content.frame = Rect(0.0, 0.0, 25.0, 25.0)
|
content.frame = Rect(0.0, 0.0, 25.0, 25.0)
|
||||||
})
|
})
|
||||||
|
|
||||||
window.mouseClicked(Point(5.0, 5.0), MouseButton.LEFT)
|
assertTrue(window.mouseClicked(Point(5.0, 5.0), MouseButton.LEFT))
|
||||||
assertEquals(MyEnum.TWO, button.value)
|
assertEquals(MyEnum.TWO, button.value)
|
||||||
window.mouseClicked(Point(5.0, 5.0), MouseButton.RIGHT)
|
assertTrue(window.mouseClicked(Point(5.0, 5.0), MouseButton.RIGHT))
|
||||||
assertEquals(MyEnum.ONE, button.value)
|
assertEquals(MyEnum.ONE, button.value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,7 +86,7 @@ class EnumButtonTests {
|
||||||
content.frame = Rect(0.0, 0.0, 25.0, 25.0)
|
content.frame = Rect(0.0, 0.0, 25.0, 25.0)
|
||||||
})
|
})
|
||||||
|
|
||||||
window.mouseClicked(Point(5.0, 5.0), MouseButton.MIDDLE)
|
assertTrue(window.mouseClicked(Point(5.0, 5.0), MouseButton.MIDDLE))
|
||||||
assertEquals(MyEnum.ONE, button.value)
|
assertEquals(MyEnum.ONE, button.value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,7 @@ class ToggleButtonTests {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
window.mouseClicked(Point(5.0, 5.0), MouseButton.LEFT)
|
assertTrue(window.mouseClicked(Point(5.0, 5.0), MouseButton.LEFT))
|
||||||
assertTrue(called.getNow(false))
|
assertTrue(called.getNow(false))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,9 +52,9 @@ class ToggleButtonTests {
|
||||||
content.frame = bounds
|
content.frame = bounds
|
||||||
})
|
})
|
||||||
|
|
||||||
window.mouseClicked(Point(5.0, 5.0), MouseButton.LEFT)
|
assertTrue(window.mouseClicked(Point(5.0, 5.0), MouseButton.LEFT))
|
||||||
assertTrue(button.state)
|
assertTrue(button.state)
|
||||||
window.mouseClicked(Point(5.0, 5.0), MouseButton.LEFT)
|
assertTrue(window.mouseClicked(Point(5.0, 5.0), MouseButton.LEFT))
|
||||||
assertFalse(button.state)
|
assertFalse(button.state)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,7 +65,7 @@ class ToggleButtonTests {
|
||||||
content.frame = bounds
|
content.frame = bounds
|
||||||
})
|
})
|
||||||
|
|
||||||
window.mouseClicked(Point(5.0, 5.0), MouseButton.MIDDLE)
|
assertTrue(window.mouseClicked(Point(5.0, 5.0), MouseButton.MIDDLE))
|
||||||
assertFalse(button.state)
|
assertFalse(button.state)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue