blob: d58f601ad2a9341fe2651d1a2059ef2db49235d0 [file] [log] [blame] [raw]
package li.cil.oc.client.gui
import li.cil.oc.api
import li.cil.oc.client.renderer.TextBufferRenderCache
import li.cil.oc.client.renderer.gui.BufferRenderer
import li.cil.oc.util.RenderState
import org.lwjgl.input.Mouse
import org.lwjgl.opengl.GL11
class Screen(val buffer: api.component.TextBuffer, val hasMouse: Boolean, val hasKeyboardCallback: () => Boolean, val hasPower: () => Boolean) extends TextBuffer {
override protected def hasKeyboard = hasKeyboardCallback()
override protected def bufferX = 8 + x
override protected def bufferY = 8 + y
private val bufferMargin = BufferRenderer.margin + BufferRenderer.innerMargin
private var didDrag = false
private var x, y = 0
private var mx, my = 0
override def handleMouseInput() {
super.handleMouseInput()
if (hasMouse && Mouse.hasWheel && Mouse.getEventDWheel != 0) {
val mouseX = Mouse.getEventX * width / mc.displayWidth
val mouseY = height - Mouse.getEventY * height / mc.displayHeight - 1
val bx = (mouseX - x - bufferMargin) / TextBufferRenderCache.renderer.charRenderWidth + 1
val by = (mouseY - y - bufferMargin) / TextBufferRenderCache.renderer.charRenderHeight + 1
val bw = buffer.getWidth
val bh = buffer.getHeight
if (bx > 0 && by > 0 && bx <= bw && by <= bh) {
val scroll = math.signum(Mouse.getEventDWheel)
buffer.mouseScroll(bx, by, scroll, null)
}
}
}
override protected def mouseClicked(mouseX: Int, mouseY: Int, button: Int) {
super.mouseClicked(mouseX, mouseY, button)
if (hasMouse) {
if (button == 0 || button == 1) {
clickOrDrag(mouseX, mouseY, button)
}
}
}
protected override def mouseClickMove(mouseX: Int, mouseY: Int, button: Int, timeSinceLast: Long) {
super.mouseClickMove(mouseX, mouseY, button, timeSinceLast)
if (hasMouse && timeSinceLast > 10) {
if (button == 0 || button == 1) {
clickOrDrag(mouseX, mouseY, button)
}
}
}
protected override def mouseMovedOrUp(mouseX: Int, mouseY: Int, button: Int) {
super.mouseMovedOrUp(mouseX, mouseY, button)
if (hasMouse && button >= 0) {
if (didDrag) {
val bx = ((mouseX - x - bufferMargin) / scale / TextBufferRenderCache.renderer.charRenderWidth).toInt + 1
val by = ((mouseY - y - bufferMargin) / scale / TextBufferRenderCache.renderer.charRenderHeight).toInt + 1
val bw = buffer.getWidth
val bh = buffer.getHeight
if (bx > 0 && by > 0 && bx <= bw && by <= bh) {
buffer.mouseUp(bx, by, button, null)
}
else {
buffer.mouseUp(-1, -1, button, null)
}
}
didDrag = false
mx = 0
my = 0
}
}
private def clickOrDrag(mouseX: Int, mouseY: Int, button: Int) {
val bx = ((mouseX - x - bufferMargin) / scale / TextBufferRenderCache.renderer.charRenderWidth).toInt + 1
val by = ((mouseY - y - bufferMargin) / scale / TextBufferRenderCache.renderer.charRenderHeight).toInt + 1
val bw = buffer.getWidth
val bh = buffer.getHeight
if (bx > 0 && by > 0 && bx <= bw && by <= bh) {
if (bx != mx || by != my) {
if (mx > 0 && my > 0) buffer.mouseDrag(bx, by, button, null)
else buffer.mouseDown(bx, by, button, null)
didDrag = mx > 0 && my > 0
mx = bx
my = by
}
}
}
override def drawScreen(mouseX: Int, mouseY: Int, dt: Float): Unit = {
super.drawScreen(mouseX, mouseY, dt)
drawBufferLayer()
}
override def drawBuffer() {
GL11.glTranslatef(x, y, 0)
BufferRenderer.drawBackground()
if (hasPower()) {
GL11.glTranslatef(bufferMargin, bufferMargin, 0)
GL11.glScaled(scale, scale, 1)
RenderState.makeItBlend()
BufferRenderer.drawText(buffer)
}
}
override protected def changeSize(w: Double, h: Double, recompile: Boolean) = {
val bw = buffer.renderWidth
val bh = buffer.renderHeight
val scaleX = math.min(width / (bw + bufferMargin * 2.0), 1)
val scaleY = math.min(height / (bh + bufferMargin * 2.0), 1)
val scale = math.min(scaleX, scaleY)
val innerWidth = (bw * scale).toInt
val innerHeight = (bh * scale).toInt
x = (width - (innerWidth + bufferMargin * 2)) / 2
y = (height - (innerHeight + bufferMargin * 2)) / 2
if (recompile) {
BufferRenderer.compileBackground(innerWidth, innerHeight)
}
scale
}
}