mirror of
https://github.com/LDDestroier/CC/
synced 2024-12-04 23:39:58 +00:00
Fixed some stuff
Transparency now works Window positions now work properly (gotta test these things beforehand...)
This commit is contained in:
parent
1ea4ec8910
commit
fe9956a65b
98
windont.lua
98
windont.lua
@ -1,11 +1,10 @@
|
||||
-- windon't
|
||||
-- enhanced windowing API by LDDestroier
|
||||
-- Windon't
|
||||
-- enhanced window API by LDDestroier
|
||||
-- intended for general use within all me new programs
|
||||
--
|
||||
-- Unique features:
|
||||
-- + Transparency within windows
|
||||
-- + Built-in window layering
|
||||
-- + Bullshit
|
||||
|
||||
local to_blit, to_colors = {}, {}
|
||||
for i = 1, 16 do
|
||||
@ -16,6 +15,11 @@ to_blit[0], to_colors["-"] = "-", 0
|
||||
|
||||
local windont = {baseTerm = term.current()}
|
||||
|
||||
local config = {
|
||||
defaultTextColor = "0", -- default text color (what " " corresponds to in term.blit's second argument)
|
||||
defaultBackColor = "f", -- default background color (what " " corresponds to in term.blit's third argument)
|
||||
}
|
||||
|
||||
windont.render = function(...)
|
||||
local windows = {...}
|
||||
local bT = windont.baseTerm
|
||||
@ -23,6 +27,7 @@ windont.render = function(...)
|
||||
local screenBuffer = {{}, {}, {}}
|
||||
local blitList = {} -- list of blit commands per line
|
||||
local c = 1 -- current blitList entry
|
||||
local cx, cy -- each window's absolute X and Y
|
||||
local buffer
|
||||
|
||||
-- check if space on screenBuffer is transparent
|
||||
@ -42,11 +47,21 @@ windont.render = function(...)
|
||||
for i = 1, #windows do
|
||||
if windows[i].meta.visible then
|
||||
buffer = windows[i].meta.buffer
|
||||
screenBuffer[1][y][x] = screenBuffer[1][y][x] or buffer[1][y][x]
|
||||
screenBuffer[2][y][x] = screenBuffer[2][y][x] or (buffer[2][y][x] ~= "-" and buffer[2][y][x])
|
||||
screenBuffer[3][y][x] = screenBuffer[3][y][x] or (buffer[3][y][x] ~= "-" and buffer[3][y][x])
|
||||
cx = x - windows[i].meta.x + 1
|
||||
cy = y - windows[i].meta.y + 1
|
||||
if type(buffer[1][cy]) == "table" then
|
||||
screenBuffer[1][y][x] = screenBuffer[1][y][x] or buffer[1][cy][cx]
|
||||
screenBuffer[2][y][x] = screenBuffer[2][y][x] or (buffer[2][cy][cx] ~= "-" and buffer[2][cy][cx])
|
||||
screenBuffer[3][y][x] = screenBuffer[3][y][x] or (buffer[3][cy][cx] ~= "-" and buffer[3][cy][cx])
|
||||
else
|
||||
screenBuffer[1][y][x] = screenBuffer[1][y][x]
|
||||
screenBuffer[2][y][x] = screenBuffer[2][y][x]
|
||||
screenBuffer[3][y][x] = screenBuffer[3][y][x]
|
||||
end
|
||||
end
|
||||
end
|
||||
screenBuffer[2][y][x] = screenBuffer[2][y][x] or config.defaultTextColor
|
||||
screenBuffer[3][y][x] = screenBuffer[3][y][x] or config.defaultBackColor
|
||||
if check(x, y) then
|
||||
if check(x - 1, y) then
|
||||
blitList[c][1] = blitList[c][1] .. screenBuffer[1][y][x]
|
||||
@ -88,19 +103,24 @@ windont.newWindow = function( x, y, width, height, misc )
|
||||
local output = {}
|
||||
misc = misc or {}
|
||||
local meta = {
|
||||
x = x or 1,
|
||||
y = y or 1,
|
||||
width = width,
|
||||
height = height,
|
||||
buffer = {},
|
||||
x = x or 1, -- x position of the window
|
||||
y = y or 1, -- y position of the window
|
||||
width = width, -- width of the buffer
|
||||
height = height, -- height of the buffer
|
||||
buffer = {}, -- stores contents of terminal in buffer[1][y][x] format
|
||||
|
||||
cursorX = misc.cursorX or 1,
|
||||
cursorY = misc.cursorY or 1,
|
||||
textColor = misc.textColor or "0",
|
||||
backColor = misc.backColor or "f",
|
||||
blink = true,
|
||||
isColor = term.isColor(),
|
||||
alwaysRender = meta.alwaysDraw,
|
||||
visible = true,
|
||||
|
||||
textColor = misc.textColor or "0", -- current text color
|
||||
backColor = misc.backColor or "f", -- current background color
|
||||
|
||||
blink = true, -- cursor blink
|
||||
isColor = term.isColor(), -- if true, then it's an advanced computer
|
||||
alwaysRender = false, -- render after every terminal operation
|
||||
visible = true, -- if false, don't render ever
|
||||
|
||||
-- make a new buffer (optionally uses an existing buffer as a reference)
|
||||
newBuffer = function(width, height, char, text, back, drawAtop)
|
||||
local output = drawAtop or {{}, {}, {}}
|
||||
for y = 1, height do
|
||||
@ -117,17 +137,11 @@ windont.newWindow = function( x, y, width, height, misc )
|
||||
end
|
||||
}
|
||||
|
||||
-- initialize the buffer
|
||||
meta.buffer = meta.newBuffer(meta.width, meta.height, " ", meta.textColor, meta.backColor)
|
||||
|
||||
output.write = function(text)
|
||||
assert(type(text) == "string", "argument must be string")
|
||||
if meta.alwaysRender then
|
||||
local limit = math.max(0, meta.width - meta.cursorX + 1)
|
||||
bT.setCursorPos(meta.x + meta.cursorX - 1, meta.y + meta.cursorY - 1)
|
||||
bT.setTextColor(to_colors[meta.textColor])
|
||||
bT.setBackgroundColor(to_colors[meta.backColor])
|
||||
bT.write(text:sub(limit, limit))
|
||||
end
|
||||
for i = 1, #text do
|
||||
if meta.cursorX >= 1 and meta.cursorX <= meta.width and meta.cursorY >= 1 and meta.cursorY <= meta.height then
|
||||
meta.buffer[1][meta.cursorY][meta.cursorX] = text:sub(i,i)
|
||||
@ -136,28 +150,37 @@ windont.newWindow = function( x, y, width, height, misc )
|
||||
meta.cursorX = meta.cursorX + 1
|
||||
end
|
||||
end
|
||||
if meta.alwaysRender then
|
||||
--local limit = math.max(0, meta.width - meta.cursorX + 1)
|
||||
bT.setCursorPos(meta.x, meta.y)
|
||||
bT.blit(
|
||||
table.unpack(meta.buffer[1][meta.cursorY]),
|
||||
table.unpack(meta.buffer[2][meta.cursorY]),
|
||||
table.unpack(meta.buffer[3][meta.cursorY])
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
output.blit = function(char, text, back)
|
||||
assert(type(char) == "string" and type(text) == "string" and type(back) == "string", "all arguments must be strings")
|
||||
assert(#char == #text and #text == #back, "arguments must be same length")
|
||||
if meta.alwaysRender then
|
||||
local limit = math.max(0, meta.width - meta.cursorX + 1)
|
||||
bT.setCursorPos(meta.x + meta.cursorX - 1, meta.y + meta.cursorY - 1)
|
||||
bT.blit(
|
||||
char:sub(limit, limit),
|
||||
text:sub(limit, limit),
|
||||
back:sub(limit, limit)
|
||||
)
|
||||
end
|
||||
for i = 1, #char do
|
||||
if meta.cursorX >= 1 and meta.cursorX <= meta.width and meta.cursorY >= 1 and meta.cursorY <= meta.height then
|
||||
meta.buffer[1][meta.cursorY][meta.cursorX] = char:sub(i,i)
|
||||
meta.buffer[2][meta.cursorY][meta.cursorX] = text:sub(i,i)
|
||||
meta.buffer[3][meta.cursorY][meta.cursorX] = back:sub(i,i)
|
||||
meta.buffer[2][meta.cursorY][meta.cursorX] = text:sub(i,i) == " " and config.defaultTextColor or text:sub(i,i)
|
||||
meta.buffer[3][meta.cursorY][meta.cursorX] = back:sub(i,i) == " " and config.defaultBackColor or back:sub(i,i)
|
||||
meta.cursorX = meta.cursorX + 1
|
||||
end
|
||||
end
|
||||
if meta.alwaysRender then
|
||||
--local limit = math.max(0, meta.width - meta.cursorX + 1)
|
||||
bT.setCursorPos(meta.x, meta.y)
|
||||
bT.blit(
|
||||
table.unpack(meta.buffer[1][meta.cursorY]),
|
||||
table.unpack(meta.buffer[2][meta.cursorY]),
|
||||
table.unpack(meta.buffer[3][meta.cursorY])
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
output.setCursorPos = function(x, y)
|
||||
@ -217,7 +240,7 @@ windont.newWindow = function( x, y, width, height, misc )
|
||||
bT.blit(
|
||||
(" "):rep(meta.width),
|
||||
(meta.textColor):rep(meta.width),
|
||||
(meta.backColor):rep(meta.width),
|
||||
(meta.backColor):rep(meta.width)
|
||||
)
|
||||
end
|
||||
end
|
||||
@ -225,9 +248,6 @@ windont.newWindow = function( x, y, width, height, misc )
|
||||
output.getLine = function(y)
|
||||
assert(type(y) == "number", "bad argument #1 (expected number, got " .. type(y) .. ")")
|
||||
return table.concat(meta.buffer[1][y]), table.concat(meta.buffer[2][y]), table.concat(meta.buffer[3][y])
|
||||
if meta.alwaysRender then
|
||||
output.redraw()
|
||||
end
|
||||
end
|
||||
|
||||
output.scroll = function(amount)
|
||||
|
Loading…
Reference in New Issue
Block a user