diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/Element.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/Element.kt index 43a0282b0..cb33a3d34 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/Element.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/Element.kt @@ -54,6 +54,8 @@ abstract class Element(val guiRenderer: GUIRenderer) : InputElement { protected open var _prefSize: Vec2i = Vec2i.EMPTY + open val canFocus: Boolean get() = false + /** * If maxSize was infinity, what size would the element have? (Excluded margin!) */ diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/input/button/ButtonElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/input/button/ButtonElement.kt index ffeb322fd..00d41b06a 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/input/button/ButtonElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/input/button/ButtonElement.kt @@ -84,6 +84,9 @@ open class ButtonElement( forceApply() } + override val canFocus: Boolean + get() = !disabled + init { size = textElement.size + Vec2i(TEXT_PADDING * 2, TEXT_PADDING * 2) 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 3b1ca1794..7dfeda33d 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 @@ -31,7 +31,6 @@ abstract class Menu( val preferredElementWidth: Int = 150, ) : Screen(guiRenderer) { private val elements: MutableList = mutableListOf() - private var focusedIndex: Int = -1 private var maxElementWidth = -1 private var totalHeight = -1 @@ -88,7 +87,6 @@ abstract class Menu( if (activeElement != element) { activeElement?.onMouseLeave() element?.onMouseEnter(delta) - focusedIndex = elements.indexOf(element) activeElement = element return } @@ -146,17 +144,35 @@ abstract class Menu( for (element in elements) { element.onClose() } - focusedIndex = -1 + activeElement?.onMouseLeave() + activeElement = null } override fun onSpecialKey(key: InputSpecialKey, type: KeyChangeTypes) { super.onSpecialKey(key, type) if (type != KeyChangeTypes.RELEASE && key == InputSpecialKey.KEY_TAB) { - focusedIndex++ - if (focusedIndex >= elements.size) { - focusedIndex = 0 + var element: Element? + var initialIndex = elements.indexOf(activeElement) + if (initialIndex == -1) { + initialIndex = 0 + } + var index = initialIndex + while (true) { + index++ + if (index >= elements.size) { + index = 0 + } + if (index == initialIndex) { + return + } + element = elements.getOrNull(index) ?: return + if (element.canFocus) { + break + } + } + if (element == null) { + return } - val element = elements.getOrNull(focusedIndex) ?: return activeElement?.onMouseLeave() element.onMouseEnter(Vec2i.EMPTY)