1
0
mirror of https://github.com/kepler155c/opus synced 2024-11-05 00:16:16 +00:00
opus/sys/apis/terminal.lua

176 lines
3.6 KiB
Lua
Raw Normal View History

local Util = require('util')
2017-10-08 21:45:01 +00:00
local colors = _G.colors
local term = _G.term
local _gsub = string.gsub
2016-12-11 19:24:52 +00:00
2017-10-08 21:45:01 +00:00
local Terminal = { }
2017-10-05 17:07:48 +00:00
2016-12-11 19:24:52 +00:00
function Terminal.scrollable(ct, size)
local w, h = ct.getSize()
2017-10-08 21:45:01 +00:00
local win = _G.window.create(ct, 1, 1, w, h + size, true)
2016-12-11 19:24:52 +00:00
local oldWin = Util.shallowCopy(win)
local scrollPos = 0
local function drawScrollbar(oldPos, newPos)
local x, y = oldWin.getCursorPos()
2017-08-09 14:19:00 +00:00
2016-12-11 19:24:52 +00:00
local pos = math.floor(oldPos / size * (h - 1))
oldWin.setCursorPos(w, oldPos + pos + 1)
oldWin.write(' ')
pos = math.floor(newPos / size * (h - 1))
oldWin.setCursorPos(w, newPos + pos + 1)
oldWin.write('#')
2017-08-09 14:19:00 +00:00
2016-12-11 19:24:52 +00:00
oldWin.setCursorPos(x, y)
end
win.setCursorPos = function(x, y)
oldWin.setCursorPos(x, y)
if y > scrollPos + h then
win.scrollTo(y - h)
elseif y < scrollPos then
win.scrollTo(y - 2)
end
end
win.scrollUp = function()
win.scrollTo(scrollPos - 1)
end
win.scrollDown = function()
win.scrollTo(scrollPos + 1)
end
win.scrollTo = function(p)
p = math.min(math.max(p, 0), size)
if p ~= scrollPos then
drawScrollbar(scrollPos, p)
scrollPos = p
2017-08-09 14:19:00 +00:00
--local w, h = win.getSize()
win.reposition(1, -scrollPos + 1, w, h + size)
2016-12-11 19:24:52 +00:00
end
end
win.clear = function()
oldWin.clear()
scrollPos = 0
end
drawScrollbar(0, 0)
return win
end
function Terminal.toGrayscale(ct)
local scolors = {
[ colors.white ] = colors.white,
[ colors.orange ] = colors.lightGray,
[ colors.magenta ] = colors.lightGray,
[ colors.lightBlue ] = colors.lightGray,
[ colors.yellow ] = colors.lightGray,
[ colors.lime ] = colors.lightGray,
[ colors.pink ] = colors.lightGray,
[ colors.gray ] = colors.gray,
[ colors.lightGray ] = colors.lightGray,
[ colors.cyan ] = colors.lightGray,
[ colors.purple ] = colors.gray,
[ colors.blue ] = colors.gray,
[ colors.brown ] = colors.gray,
[ colors.green ] = colors.lightGray,
[ colors.red ] = colors.gray,
[ colors.black ] = colors.black,
}
local methods = { 'setBackgroundColor', 'setBackgroundColour',
'setTextColor', 'setTextColour' }
for _,v in pairs(methods) do
2017-10-08 21:45:01 +00:00
local fn = ct[v]
2016-12-11 19:24:52 +00:00
ct[v] = function(c)
2017-04-09 00:06:31 +00:00
fn(scolors[c])
2016-12-11 19:24:52 +00:00
end
end
local bcolors = {
[ '1' ] = '8',
[ '2' ] = '8',
[ '3' ] = '8',
[ '4' ] = '8',
[ '5' ] = '8',
[ '6' ] = '8',
[ '9' ] = '8',
[ 'a' ] = '7',
[ 'b' ] = '7',
[ 'c' ] = '7',
[ 'd' ] = '8',
[ 'e' ] = '7',
}
local function translate(s)
if s then
2017-10-08 21:45:01 +00:00
s = _gsub(s, "%w", bcolors)
2016-12-11 19:24:52 +00:00
end
return s
end
local fn = ct.blit
ct.blit = function(text, fg, bg)
fn(text, translate(fg), translate(bg))
end
end
2016-12-18 19:38:48 +00:00
function Terminal.getNullTerm(ct)
local nt = Terminal.copy(ct)
local methods = { 'blit', 'clear', 'clearLine', 'scroll',
'setCursorBlink', 'setCursorPos', 'write' }
for _,v in pairs(methods) do
nt[v] = function() end
end
return nt
end
2017-04-09 00:06:31 +00:00
function Terminal.copy(it, ot)
ot = ot or { }
for k,v in pairs(it) do
2017-10-08 21:45:01 +00:00
if type(v) == 'function' then
ot[k] = v
end
2016-12-11 19:24:52 +00:00
end
2017-04-09 00:06:31 +00:00
return ot
2016-12-11 19:24:52 +00:00
end
function Terminal.mirror(ct, dt)
for k,f in pairs(ct) do
ct[k] = function(...)
local ret = { f(...) }
if dt[k] then
dt[k](...)
end
return unpack(ret)
end
end
end
2017-05-06 01:43:17 +00:00
function Terminal.readPassword(prompt)
if prompt then
term.write(prompt)
end
2017-05-10 10:11:25 +00:00
local fn = term.current().write
term.current().write = function() end
local s
2017-10-08 21:45:01 +00:00
pcall(function() s = _G.read(prompt) end)
2017-05-10 10:11:25 +00:00
term.current().write = fn
2017-05-06 01:43:17 +00:00
if s == '' then
return
end
return s
end
2016-12-11 19:24:52 +00:00
return Terminal