/*
* Copyright (C) 2023 Linnea Gräf
*
* This file is part of NotEnoughUpdates.
*
* NotEnoughUpdates is free software: you can redistribute it
* and/or modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation, either
* version 3 of the License, or (at your option) any later version.
*
* NotEnoughUpdates is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with NotEnoughUpdates. If not, see .
*/
package io.github.moulberry.notenoughupdates.events
import io.github.moulberry.notenoughupdates.events.ButtonExclusionZoneEvent.PushDirection.*
import io.github.moulberry.notenoughupdates.util.Rectangle
import net.minecraft.client.gui.GuiScreen
import java.util.*
class ButtonExclusionZoneEvent(
val gui: GuiScreen,
val guiBaseRect: Rectangle,
) : NEUEvent() {
enum class PushDirection {
TOWARDS_RIGHT,
TOWARDS_LEFT,
TOWARDS_TOP,
TOWARDS_BOTTOM,
}
data class ExclusionZone(
val area: Rectangle,
val pushDirection: PushDirection,
)
val occupiedRects = mutableListOf()
fun blockArea(area: Rectangle, direction: PushDirection) {
occupiedRects.add(ExclusionZone(area, direction))
}
@JvmOverloads
fun findButtonPosition(button: Rectangle, margin: Int = 0): Rectangle {
val processedAreas = IdentityHashMap()
var buttonPosition = button
while (true) {
val overlappingExclusionZone =
occupiedRects.find { it !in processedAreas && it.area.intersects(buttonPosition) } ?: break
buttonPosition = when (overlappingExclusionZone.pushDirection) {
TOWARDS_RIGHT -> buttonPosition.copy(x = overlappingExclusionZone.area.right + margin)
TOWARDS_LEFT -> buttonPosition.copy(x = overlappingExclusionZone.area.left - buttonPosition.width - margin)
TOWARDS_TOP -> buttonPosition.copy(y = overlappingExclusionZone.area.top - buttonPosition.height - margin)
TOWARDS_BOTTOM -> buttonPosition.copy(y = overlappingExclusionZone.area.bottom + margin)
}
processedAreas[overlappingExclusionZone] = Unit
}
return buttonPosition
}
}