mirror of
https://github.com/kepler155c/opus
synced 2024-11-05 08:26:16 +00:00
197 lines
4.5 KiB
Lua
197 lines
4.5 KiB
Lua
|
local class = require('class')
|
||
|
local UI = require('ui')
|
||
|
local Event = require('event')
|
||
|
local Peripheral = require('peripheral')
|
||
|
|
||
|
--[[-- Glasses device --]]--
|
||
|
local Glasses = class()
|
||
|
function Glasses:init(args)
|
||
|
|
||
|
local defaults = {
|
||
|
backgroundColor = colors.black,
|
||
|
textColor = colors.white,
|
||
|
textScale = .5,
|
||
|
backgroundOpacity = .5,
|
||
|
multiplier = 2.6665,
|
||
|
-- multiplier = 2.333,
|
||
|
}
|
||
|
defaults.width, defaults.height = term.getSize()
|
||
|
|
||
|
UI.setProperties(defaults, args)
|
||
|
UI.setProperties(self, defaults)
|
||
|
|
||
|
self.bridge = Peripheral.get({
|
||
|
type = 'openperipheral_bridge',
|
||
|
method = 'addBox',
|
||
|
})
|
||
|
self.bridge.clear()
|
||
|
|
||
|
self.setBackgroundColor = function(...) end
|
||
|
self.setTextColor = function(...) end
|
||
|
|
||
|
self.t = { }
|
||
|
for i = 1, self.height do
|
||
|
self.t[i] = {
|
||
|
text = string.rep(' ', self.width+1),
|
||
|
--text = self.bridge.addText(0, 40+i*4, string.rep(' ', self.width+1), 0xffffff),
|
||
|
bg = { },
|
||
|
textFields = { },
|
||
|
}
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function Glasses:setBackgroundBox(boxes, ax, bx, y, bgColor)
|
||
|
local colors = {
|
||
|
[ colors.black ] = 0x000000,
|
||
|
[ colors.brown ] = 0x7F664C,
|
||
|
[ colors.blue ] = 0x253192,
|
||
|
[ colors.red ] = 0xFF0000,
|
||
|
[ colors.gray ] = 0x272727,
|
||
|
[ colors.lime ] = 0x426A0D,
|
||
|
[ colors.green ] = 0x2D5628,
|
||
|
[ colors.white ] = 0xFFFFFF
|
||
|
}
|
||
|
|
||
|
local function overlap(box, ax, bx)
|
||
|
if bx < box.ax or ax > box.bx then
|
||
|
return false
|
||
|
end
|
||
|
return true
|
||
|
end
|
||
|
|
||
|
for _,box in pairs(boxes) do
|
||
|
if overlap(box, ax, bx) then
|
||
|
if box.bgColor == bgColor then
|
||
|
ax = math.min(ax, box.ax)
|
||
|
bx = math.max(bx, box.bx)
|
||
|
box.ax = box.bx + 1
|
||
|
elseif ax == box.ax then
|
||
|
box.ax = bx + 1
|
||
|
elseif ax > box.ax then
|
||
|
if bx < box.bx then
|
||
|
table.insert(boxes, { -- split
|
||
|
ax = bx + 1,
|
||
|
bx = box.bx,
|
||
|
bgColor = box.bgColor
|
||
|
})
|
||
|
box.bx = ax - 1
|
||
|
break
|
||
|
else
|
||
|
box.ax = box.bx + 1
|
||
|
end
|
||
|
elseif ax < box.ax then
|
||
|
if bx > box.bx then
|
||
|
box.ax = box.bx + 1 -- delete
|
||
|
else
|
||
|
box.ax = bx + 1
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
if bgColor ~= colors.black then
|
||
|
table.insert(boxes, {
|
||
|
ax = ax,
|
||
|
bx = bx,
|
||
|
bgColor = bgColor
|
||
|
})
|
||
|
end
|
||
|
|
||
|
local deleted
|
||
|
repeat
|
||
|
deleted = false
|
||
|
for k,box in pairs(boxes) do
|
||
|
if box.ax > box.bx then
|
||
|
if box.box then
|
||
|
box.box.delete()
|
||
|
end
|
||
|
table.remove(boxes, k)
|
||
|
deleted = true
|
||
|
break
|
||
|
end
|
||
|
if not box.box then
|
||
|
box.box = self.bridge.addBox(
|
||
|
math.floor(self.x + (box.ax - 1) * self.multiplier),
|
||
|
self.y + y * 4,
|
||
|
math.ceil((box.bx - box.ax + 1) * self.multiplier),
|
||
|
4,
|
||
|
colors[bgColor],
|
||
|
self.backgroundOpacity)
|
||
|
else
|
||
|
box.box.setX(self.x + math.floor((box.ax - 1) * self.multiplier))
|
||
|
box.box.setWidth(math.ceil((box.bx - box.ax + 1) * self.multiplier))
|
||
|
end
|
||
|
end
|
||
|
until not deleted
|
||
|
end
|
||
|
|
||
|
function Glasses:write(x, y, text, bg)
|
||
|
|
||
|
if x < 1 then
|
||
|
error(' less ', 6)
|
||
|
end
|
||
|
if y <= #self.t then
|
||
|
local line = self.t[y]
|
||
|
local str = line.text
|
||
|
str = str:sub(1, x-1) .. text .. str:sub(x + #text)
|
||
|
self.t[y].text = str
|
||
|
|
||
|
for _,tf in pairs(line.textFields) do
|
||
|
tf.delete()
|
||
|
end
|
||
|
line.textFields = { }
|
||
|
|
||
|
local function split(st)
|
||
|
local words = { }
|
||
|
local offset = 0
|
||
|
while true do
|
||
|
local b,e,w = st:find('(%S+)')
|
||
|
if not b then
|
||
|
break
|
||
|
end
|
||
|
table.insert(words, {
|
||
|
offset = b + offset - 1,
|
||
|
text = w,
|
||
|
})
|
||
|
offset = offset + e
|
||
|
st = st:sub(e + 1)
|
||
|
end
|
||
|
return words
|
||
|
end
|
||
|
|
||
|
local words = split(str)
|
||
|
for _,word in pairs(words) do
|
||
|
local tf = self.bridge.addText(self.x + word.offset * self.multiplier,
|
||
|
self.y+y*4, '', 0xffffff)
|
||
|
tf.setScale(self.textScale)
|
||
|
tf.setZ(1)
|
||
|
tf.setText(word.text)
|
||
|
table.insert(line.textFields, tf)
|
||
|
end
|
||
|
|
||
|
self:setBackgroundBox(line.bg, x, x + #text - 1, y, bg)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function Glasses:clear(bg)
|
||
|
for _,line in pairs(self.t) do
|
||
|
for _,tf in pairs(line.textFields) do
|
||
|
tf.delete()
|
||
|
end
|
||
|
line.textFields = { }
|
||
|
line.text = string.rep(' ', self.width+1)
|
||
|
-- self.t[i].text.setText('')
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function Glasses:reset()
|
||
|
self:clear()
|
||
|
self.bridge.clear()
|
||
|
self.bridge.sync()
|
||
|
end
|
||
|
|
||
|
function Glasses:sync()
|
||
|
self.bridge.sync()
|
||
|
end
|
||
|
|
||
|
return Glasses
|