88 lines
2.9 KiB
Kotlin
88 lines
2.9 KiB
Kotlin
package net.shadowfacts.phycon.plugin.rei
|
|
|
|
import dev.architectury.event.EventResult
|
|
import dev.architectury.event.events.client.ClientScreenInputEvent
|
|
import me.shedaniel.math.Rectangle
|
|
import me.shedaniel.rei.api.client.REIRuntime
|
|
import me.shedaniel.rei.api.client.plugins.REIClientPlugin
|
|
import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry
|
|
import net.fabricmc.api.ClientModInitializer
|
|
import net.minecraft.client.MinecraftClient
|
|
import net.shadowfacts.phycon.PhysicalConnectivityClient
|
|
import net.shadowfacts.phycon.block.terminal.AbstractTerminalScreen
|
|
import org.apache.logging.log4j.LogManager
|
|
import java.lang.invoke.MethodHandle
|
|
import java.lang.invoke.MethodHandles
|
|
|
|
/**
|
|
* @author shadowfacts
|
|
*/
|
|
object PhyConPluginClient: ClientModInitializer, REIClientPlugin, AbstractTerminalScreen.SearchQueryListener {
|
|
|
|
private val logger = LogManager.getLogger()
|
|
private var isHighlightingHandle: MethodHandle? = null
|
|
|
|
override fun onInitializeClient() {
|
|
ClientScreenInputEvent.MOUSE_RELEASED_PRE.register { client, screen, mouseX, mouseY, button ->
|
|
if (screen is AbstractTerminalScreen<*, *>) {
|
|
REIRuntime.getInstance().searchTextField?.also {
|
|
if (it.isFocused) {
|
|
screen.terminalVC.searchField.resignFirstResponder()
|
|
} else {
|
|
screen.terminalVC.searchField.becomeFirstResponder()
|
|
}
|
|
}
|
|
}
|
|
EventResult.pass()
|
|
}
|
|
|
|
AbstractTerminalScreen.searchQueryListener = this
|
|
try {
|
|
val clazz = Class.forName("me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchField")
|
|
isHighlightingHandle = MethodHandles.publicLookup().findStaticGetter(clazz, "isHighlighting", Boolean::class.java)
|
|
} catch (e: ReflectiveOperationException) {
|
|
logger.warn("Unable to find OverlaySearchField.isHighlighting, highlight sync will be disabled", e)
|
|
}
|
|
}
|
|
|
|
override fun registerScreens(registry: ScreenRegistry) {
|
|
registry.exclusionZones().register(AbstractTerminalScreen::class.java) {
|
|
val screen = MinecraftClient.getInstance().currentScreen as AbstractTerminalScreen<*, *>
|
|
val view = screen.terminalVC.settingsView
|
|
val rect = view.convert(view.bounds, to = null)
|
|
listOf(
|
|
Rectangle(rect.left.toInt(), rect.top.toInt(), view.bounds.width.toInt(), view.bounds.height.toInt())
|
|
)
|
|
}
|
|
}
|
|
|
|
override fun terminalSearchQueryChanged(newValue: String) {
|
|
if (shouldSync()) {
|
|
REIRuntime.getInstance().searchTextField?.text = newValue
|
|
}
|
|
}
|
|
|
|
override fun requestTerminalSearchFieldUpdate(): String? {
|
|
return if (shouldSync()) {
|
|
REIRuntime.getInstance().searchTextField?.text
|
|
} else {
|
|
null
|
|
}
|
|
}
|
|
|
|
private fun shouldSync(): Boolean {
|
|
return when (PhysicalConnectivityClient.terminalSettings[PhyConPluginCommon.REI_SYNC_KEY]) {
|
|
REISyncMode.OFF -> false
|
|
REISyncMode.ON -> true
|
|
REISyncMode.HIGHLIGHT_ONLY -> {
|
|
if (isHighlightingHandle != null) {
|
|
isHighlightingHandle!!.invoke() as Boolean
|
|
} else {
|
|
false
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|