From 4a4b897498bf5f54d1c0a44e2e072186abab96c7 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Fri, 21 Jan 2022 22:19:46 +0100 Subject: [PATCH] menu: button hovering --- .../gui/rendering/gui/gui/GUIManager.kt | 2 +- .../gui/rendering/gui/gui/screen/menu/Menu.kt | 33 +++++++++++++++++-- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/gui/GUIManager.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/gui/GUIManager.kt index 6ae43e5e3..2b56573dd 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/gui/GUIManager.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/gui/GUIManager.kt @@ -66,7 +66,7 @@ class GUIManager( fun onMatrixChange() { for (element in elements) { if (element is LayoutedGUIElement<*>) { - element.elementLayout.silentApply() + element.elementLayout.forceSilentApply() } element.apply() } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/gui/screen/menu/Menu.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/gui/screen/menu/Menu.kt index dbc820ec4..10cdc1946 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/gui/screen/menu/Menu.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/gui/screen/menu/Menu.kt @@ -23,12 +23,13 @@ import glm_.vec2.Vec2i abstract class Menu(guiRenderer: GUIRenderer) : Screen(guiRenderer) { private val buttons: MutableList = mutableListOf() + private var lastMouseMove: ButtonElement? = null private var buttonWidth = -1 private var totalHeight = -1 override fun forceSilentApply() { - buttonWidth = _size.x / 3 // 1 left and right + buttonWidth = size.x / 3 // 1 left and right var totalHeight = 0 for (button in buttons) { @@ -62,11 +63,37 @@ abstract class Menu(guiRenderer: GUIRenderer) : Screen(guiRenderer) { } override fun onMouseMove(position: Vec2i) { - buttons.getOrNull(0)?.onMouseMove(position) + val (delta, button) = getButtonAndPositionAt(position) + + lastMouseMove?.onMouseMove(delta) + button?.onMouseMove(delta) + lastMouseMove = button } override fun onChildChange(child: Element) { - cacheUpToDate = false + forceSilentApply() + } + + fun getButtonAndPositionAt(position: Vec2i): Pair { + var delta = position + var button: ButtonElement? = null + if (position.x in buttonWidth..buttonWidth * 2) { + // x matches + val yStart = (size.y - totalHeight) / 2 + var yOffset = position.y - yStart + for (buttonEntry in buttons) { + val buttonSize = buttonEntry.size + if (yOffset < buttonSize.y) { + button = buttonEntry + break + } + yOffset -= buttonSize.y + yOffset -= BUTTON_Y_MARGIN + } + delta = Vec2i(position.x - buttonWidth, yOffset) + } + + return Pair(delta, button) } private companion object {