mirror of
https://github.com/MightyPirates/OpenComputers.git
synced 2025-09-17 19:25:20 -04:00
mouse scroll event for tier two and three screens and supporting it in the editor
This commit is contained in:
parent
cea0875795
commit
0b1f4464d9
@ -48,9 +48,11 @@ end
|
||||
|
||||
local function setCursor(nbx, nby)
|
||||
local w, h = getSize()
|
||||
nby = math.max(1, math.min(#buffer, nby))
|
||||
|
||||
local ncy = nby - scrollY
|
||||
if ncy > h then
|
||||
term.setCursorBlink(false)
|
||||
local sy = nby - h
|
||||
local dy = math.abs(scrollY - sy)
|
||||
scrollY = sy
|
||||
@ -60,6 +62,7 @@ local function setCursor(nbx, nby)
|
||||
component.gpu.set(1, by - scrollY, str)
|
||||
end
|
||||
elseif ncy < 1 then
|
||||
term.setCursorBlink(false)
|
||||
local sy = nby - 1
|
||||
local dy = math.abs(scrollY - sy)
|
||||
scrollY = sy
|
||||
@ -69,9 +72,12 @@ local function setCursor(nbx, nby)
|
||||
component.gpu.set(1, by - scrollY, str)
|
||||
end
|
||||
end
|
||||
term.setCursor(term.getCursor(), nby - scrollY)
|
||||
|
||||
nbx = math.max(1, math.min(unicode.len(line()) + 1, nbx))
|
||||
local ncx = nbx - scrollX
|
||||
if ncx > w then
|
||||
term.setCursorBlink(false)
|
||||
local sx = nbx - w
|
||||
local dx = math.abs(scrollX - sx)
|
||||
scrollX = sx
|
||||
@ -82,6 +88,7 @@ local function setCursor(nbx, nby)
|
||||
component.gpu.set(1 + (w - dx), by - scrollY, str)
|
||||
end
|
||||
elseif ncx < 1 then
|
||||
term.setCursorBlink(false)
|
||||
local sx = nbx - 1
|
||||
local dx = math.abs(scrollX - sx)
|
||||
scrollX = sx
|
||||
@ -92,8 +99,8 @@ local function setCursor(nbx, nby)
|
||||
component.gpu.set(1, by - scrollY, str)
|
||||
end
|
||||
end
|
||||
|
||||
term.setCursor(nbx - scrollX, nby - scrollY)
|
||||
|
||||
component.gpu.set(w - 9, h + 1, text.padLeft(string.format("%d,%d", nby, nbx), 10))
|
||||
end
|
||||
|
||||
@ -124,7 +131,7 @@ local function right(n)
|
||||
local cbx, cby = getCursor()
|
||||
local be = unicode.len(line()) + 1
|
||||
if cbx < be then
|
||||
setCursor(math.min(be, cbx + n), cby)
|
||||
setCursor(cbx + n, cby)
|
||||
elseif cby < #buffer then
|
||||
setCursor(1, cby + 1)
|
||||
end
|
||||
@ -134,7 +141,7 @@ local function up(n)
|
||||
n = n or 1
|
||||
local cbx, cby = getCursor()
|
||||
if cby > 1 then
|
||||
setCursor(cbx, math.max(cby - n, 1))
|
||||
setCursor(cbx, cby - n)
|
||||
if getCursor() > unicode.len(line()) then
|
||||
ende()
|
||||
end
|
||||
@ -145,7 +152,7 @@ local function down(n)
|
||||
n = n or 1
|
||||
local cbx, cby = getCursor()
|
||||
if cby < #buffer then
|
||||
setCursor(cbx, math.min(cby + n, #buffer))
|
||||
setCursor(cbx, cby + n)
|
||||
if getCursor() > unicode.len(line()) then
|
||||
ende()
|
||||
end
|
||||
@ -157,6 +164,7 @@ local function delete()
|
||||
local cbx, cby = getCursor()
|
||||
local w, h = getSize()
|
||||
if cbx <= unicode.len(line()) then
|
||||
term.setCursorBlink(false)
|
||||
buffer[cby] = unicode.sub(line(), 1, cbx - 1) ..
|
||||
unicode.sub(line(), cbx + 1)
|
||||
component.gpu.copy(cx + 1, cy, w - cx, 1, -1, 0)
|
||||
@ -167,6 +175,7 @@ local function delete()
|
||||
end
|
||||
component.gpu.set(w, cy, char)
|
||||
elseif cby < #buffer then
|
||||
term.setCursorBlink(false)
|
||||
local append = table.remove(buffer, cby + 1)
|
||||
buffer[cby] = buffer[cby] .. append
|
||||
component.gpu.set(cx, cy, append)
|
||||
@ -179,6 +188,10 @@ local function delete()
|
||||
end
|
||||
|
||||
local function insert(value)
|
||||
if not value or unicode.len(value) < 1 then
|
||||
return
|
||||
end
|
||||
term.setCursorBlink(false)
|
||||
local cx, cy = term.getCursor()
|
||||
local cbx, cby = getCursor()
|
||||
local w, h = getSize()
|
||||
@ -213,7 +226,6 @@ local function enter()
|
||||
end
|
||||
|
||||
local function onKeyDown(char, code)
|
||||
term.setCursorBlink(false)
|
||||
if code == keyboard.keys.back and not readonly then
|
||||
if left() then
|
||||
delete()
|
||||
@ -275,12 +287,9 @@ local function onKeyDown(char, code)
|
||||
elseif not keyboard.isControl(char) and not readonly then
|
||||
insert(unicode.char(char))
|
||||
end
|
||||
term.setCursorBlink(true)
|
||||
term.setCursorBlink(true) -- force toggle to caret
|
||||
end
|
||||
|
||||
local function onClipboard(value)
|
||||
term.setCursorBlink(false)
|
||||
local cbx, cby = getCursor()
|
||||
local start = 1
|
||||
local l = value:find("\n", 1, true)
|
||||
@ -293,18 +302,15 @@ local function onClipboard(value)
|
||||
until not l
|
||||
end
|
||||
insert(string.sub(value, start))
|
||||
term.setCursorBlink(true)
|
||||
term.setCursorBlink(true) -- force toggle to caret
|
||||
end
|
||||
|
||||
local function onClick(x, y)
|
||||
local w, h = getSize()
|
||||
x = math.max(1, math.min(w, x))
|
||||
y = math.max(1, math.min(h, #buffer, y))
|
||||
setCursor(x, y)
|
||||
if getCursor() > unicode.len(line()) then
|
||||
ende()
|
||||
end
|
||||
setCursor(x + scrollX, y + scrollY)
|
||||
end
|
||||
|
||||
local function onScroll(direction)
|
||||
local cbx, cby = getCursor()
|
||||
setCursor(cbx, cby - direction * 12)
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
@ -337,14 +343,23 @@ do
|
||||
end
|
||||
|
||||
while running do
|
||||
local event, address, arg1, arg2 = event.pull()
|
||||
local event, address, arg1, arg2, arg3 = event.pull()
|
||||
if type(address) == "string" and component.isPrimary(address) then
|
||||
local blink = true
|
||||
if event == "key_down" then
|
||||
onKeyDown(arg1, arg2)
|
||||
elseif event == "clipboard" then
|
||||
onClipboard(arg1)
|
||||
elseif event == "touch" or event == "drag" then
|
||||
onClick(arg1, arg2)
|
||||
elseif event == "scroll" then
|
||||
onScroll(arg3)
|
||||
else
|
||||
blink = false
|
||||
end
|
||||
if blink then
|
||||
term.setCursorBlink(true)
|
||||
term.setCursorBlink(true) -- force toggle to caret
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -48,13 +48,25 @@ object PacketSender {
|
||||
|
||||
def sendMouseClick(t: Buffer, x: Int, y: Int, drag: Boolean) =
|
||||
if (t.tier > 0) {
|
||||
val pb = new PacketBuilder(PacketType.MouseClick)
|
||||
val pb = new PacketBuilder(PacketType.MouseClickOrDrag)
|
||||
|
||||
pb.writeTileEntity(t)
|
||||
pb.writeInt(x)
|
||||
pb.writeInt(y)
|
||||
pb.writeBoolean(drag)
|
||||
|
||||
pb.sendToServer()
|
||||
}
|
||||
|
||||
def sendMouseScroll(t: Buffer, x: Int, y: Int, scroll: Int) =
|
||||
if (t.tier > 0) {
|
||||
val pb = new PacketBuilder(PacketType.MouseScroll)
|
||||
|
||||
pb.writeTileEntity(t)
|
||||
pb.writeInt(x)
|
||||
pb.writeInt(y)
|
||||
pb.writeByte(scroll)
|
||||
|
||||
pb.sendToServer()
|
||||
}
|
||||
}
|
@ -5,6 +5,7 @@ import li.cil.oc.client.renderer.MonospaceFontRenderer
|
||||
import li.cil.oc.client.renderer.gui.BufferRenderer
|
||||
import li.cil.oc.common.tileentity
|
||||
import li.cil.oc.util.RenderState
|
||||
import org.lwjgl.input.Mouse
|
||||
import org.lwjgl.opengl.GL11
|
||||
|
||||
class Screen(val screen: tileentity.Screen) extends Buffer {
|
||||
@ -16,6 +17,21 @@ class Screen(val screen: tileentity.Screen) extends Buffer {
|
||||
|
||||
private var mx, my = 0
|
||||
|
||||
override def handleMouseInput() {
|
||||
super.handleMouseInput()
|
||||
if (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) / MonospaceFontRenderer.fontWidth + 1
|
||||
val by = (mouseY - y - bufferMargin) / MonospaceFontRenderer.fontHeight + 1
|
||||
val (bw, bh) = screen.buffer.resolution
|
||||
if (bx > 0 && by > 0 && bx <= bw && by <= bh) {
|
||||
val scroll = math.signum(Mouse.getEventDWheel)
|
||||
PacketSender.sendMouseScroll(buffer.owner, bx, by, scroll)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override protected def mouseClicked(mouseX: Int, mouseY: Int, button: Int) {
|
||||
super.mouseClicked(mouseX, mouseY, button)
|
||||
if (screen.tier > 0) {
|
||||
|
@ -29,5 +29,6 @@ object PacketType extends Enumeration {
|
||||
KeyDown,
|
||||
KeyUp,
|
||||
Clipboard,
|
||||
MouseClick = Value
|
||||
MouseClickOrDrag,
|
||||
MouseScroll = Value
|
||||
}
|
@ -18,7 +18,8 @@ class PacketHandler extends CommonPacketHandler {
|
||||
case PacketType.KeyDown => onKeyDown(p)
|
||||
case PacketType.KeyUp => onKeyUp(p)
|
||||
case PacketType.Clipboard => onClipboard(p)
|
||||
case PacketType.MouseClick => onMouseClick(p)
|
||||
case PacketType.MouseClickOrDrag => onMouseClick(p)
|
||||
case PacketType.MouseScroll => onMouseScroll(p)
|
||||
case _ => // Invalid packet.
|
||||
}
|
||||
|
||||
@ -76,4 +77,17 @@ class PacketHandler extends CommonPacketHandler {
|
||||
}
|
||||
case _ => // Invalid packet.
|
||||
}
|
||||
|
||||
def onMouseScroll(p: PacketParser) =
|
||||
p.readTileEntity[Buffer]() match {
|
||||
case Some(s: Screen) => p.player match {
|
||||
case player: EntityPlayer =>
|
||||
val x = p.readInt()
|
||||
val y = p.readInt()
|
||||
val scroll = p.readByte()
|
||||
s.origin.node.sendToReachable("computer.checked_signal", player, "scroll", Int.box(x), Int.box(y), Int.box(scroll), player.getCommandSenderName)
|
||||
case _ =>
|
||||
}
|
||||
case _ => // Invalid packet.
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user