mirror of
https://github.com/20kdc/OC-KittenOS.git
synced 2024-11-27 04:48:05 +11:00
Finish flash, replace pass with control (handles all the control things), slight adjustments here & there
This commit is contained in:
parent
8e0c74c41b
commit
8fc441299b
@ -114,10 +114,13 @@ local windows = 1
|
||||
local primarySearchTx = ""
|
||||
local primaryPage = 1
|
||||
local primaryList = {}
|
||||
local primaryNextMinus = false
|
||||
|
||||
-- package
|
||||
local packageLock = nil
|
||||
local packageId = "FIXME"
|
||||
|
||||
|
||||
local function describe(pkg)
|
||||
local weHave = claw.getInfo(pkg, "local")
|
||||
local theyHave = claw.getInfo(pkg, "local")
|
||||
@ -135,13 +138,14 @@ local function describe(pkg)
|
||||
end
|
||||
|
||||
local function primaryWindowRegenCore()
|
||||
return neoux.tcwindow(25, 12, genCurrent(), function (w)
|
||||
local gen, gens = genCurrent()
|
||||
return 25, 12, "claw", neoux.tcwindow(25, 12, gen, function (w)
|
||||
w.close()
|
||||
windows = windows - 1
|
||||
end, 0xFF8F00, 0)
|
||||
end, 0xFF8F00, 0, gens)
|
||||
end
|
||||
local function primaryWindowRegen()
|
||||
primaryWindow.reset(25, 12, primaryWindowRegenCore())
|
||||
primaryWindow.reset(primaryWindowRegenCore())
|
||||
end
|
||||
|
||||
-- Use all non-primary filesystems
|
||||
@ -174,6 +178,8 @@ primaryList = claw.getList()
|
||||
-- Sections
|
||||
|
||||
function genPrimary()
|
||||
local minus = (primaryNextMinus and 3) or nil
|
||||
primaryNextMinus = false
|
||||
local pgs = 10
|
||||
local pages = math.ceil(#primaryList / pgs)
|
||||
local elems = {
|
||||
@ -186,6 +192,7 @@ function genPrimary()
|
||||
neoux.tcrawview(4, 1, {neoux.pad(primaryPage .. " / " .. pages, 19, true, true)}),
|
||||
neoux.tcbutton(1, 1, "-", function (w)
|
||||
if primaryPage > 1 then
|
||||
primaryNextMinus = true
|
||||
primaryPage = primaryPage - 1
|
||||
primaryWindowRegen()
|
||||
end
|
||||
@ -221,7 +228,7 @@ function genPrimary()
|
||||
primaryList = n
|
||||
primaryWindowRegen()
|
||||
end))
|
||||
return elems
|
||||
return elems, minus
|
||||
end
|
||||
|
||||
--
|
||||
@ -325,7 +332,7 @@ end
|
||||
--
|
||||
|
||||
genCurrent = genPrimary
|
||||
primaryWindow = neoux.create(25, 12, "claw", primaryWindowRegenCore())
|
||||
primaryWindow = neoux.create(primaryWindowRegenCore())
|
||||
|
||||
while windows > 0 do
|
||||
event.pull()
|
||||
|
233
code/apps/app-control.lua
Normal file
233
code/apps/app-control.lua
Normal file
@ -0,0 +1,233 @@
|
||||
-- This is released into the public domain.
|
||||
-- No warranty is provided, implied or otherwise.
|
||||
|
||||
-- app-control: Settings changer
|
||||
local settings = neo.requireAccess("x.neo.sys.manage", "management")
|
||||
local globals = neo.requireAccess("x.neo.pub.globals", "gbm")
|
||||
|
||||
local event = require("event")(neo)
|
||||
local neoux, err = require("neoux")
|
||||
if not neoux then error(err) end
|
||||
neoux = neoux(event, neo)
|
||||
|
||||
local running = true
|
||||
|
||||
local mainGen
|
||||
local currentGen
|
||||
local window
|
||||
|
||||
local function returner()
|
||||
currentGen = mainGen
|
||||
window.reset(currentGen())
|
||||
end
|
||||
|
||||
local function scrGen()
|
||||
local tx = {}
|
||||
local elems = {
|
||||
}
|
||||
local y = 1
|
||||
for k, v in ipairs(globals.getKnownMonitors()) do
|
||||
table.insert(tx, v[1]:sub(1, 16) .. "..." )
|
||||
table.insert(tx, "")
|
||||
table.insert(elems, neoux.tcbutton(21, y, "max", function (w)
|
||||
globals.changeMonitorSetup(v[1], 320, 200, 32, v[6])
|
||||
globals.forceRescan()
|
||||
end))
|
||||
local cw, ch = v[3], v[4]
|
||||
table.insert(elems, neoux.tcfield(1, y + 1, 5, function (tx)
|
||||
if tx then cw = math.max(0, math.floor(tonumber(tx) or 0)) end
|
||||
return tostring(cw)
|
||||
end))
|
||||
table.insert(elems, neoux.tcfield(6, y + 1, 5, function (tx)
|
||||
if tx then ch = math.max(0, math.floor(tonumber(tx) or 0)) end
|
||||
return tostring(ch)
|
||||
end))
|
||||
table.insert(elems, neoux.tcbutton(12, y + 1, "set", function (w)
|
||||
globals.changeMonitorSetup(v[1], math.max(cw, 1), math.max(ch, 1), v[5], v[6])
|
||||
globals.forceRescan()
|
||||
end))
|
||||
local nx = 8
|
||||
if v[5] == 8 then
|
||||
nx = 4
|
||||
elseif v[5] == 4 then
|
||||
nx = 1
|
||||
end
|
||||
table.insert(elems, neoux.tcbutton(18, y + 1, v[5] .. "b", function (w)
|
||||
globals.changeMonitorSetup(v[1], v[3], v[4], nx, v[6])
|
||||
globals.forceRescan()
|
||||
end))
|
||||
local tm = "ti"
|
||||
local to = "yes"
|
||||
if v[6] == "yes" then
|
||||
tm = "TI"
|
||||
to = "no"
|
||||
end
|
||||
table.insert(elems, neoux.tcbutton(22, y + 1, tm, function (w)
|
||||
globals.changeMonitorSetup(v[1], v[3], v[4], v[5], to)
|
||||
globals.forceRescan()
|
||||
end))
|
||||
y = y + 2
|
||||
end
|
||||
table.insert(elems, neoux.tcrawview(1, 1, tx))
|
||||
return 25, #tx, nil, neoux.tcwindow(25, #tx, elems, returner, 0xFFFFFF, 0)
|
||||
end
|
||||
local function logGen()
|
||||
local computer = neo.requireAccess("k.computer", "user management")
|
||||
local tx = {
|
||||
"Password:",
|
||||
" (Keep blank to disable.)",
|
||||
"MC Usernames Allowed:"
|
||||
}
|
||||
local users = table.pack(computer.users())
|
||||
for k, v in ipairs(users) do
|
||||
tx[k + 3] = " " .. v
|
||||
end
|
||||
local workingName = ""
|
||||
return 25, #tx + 1, nil, neoux.tcwindow(25, #tx + 1, {
|
||||
neoux.tcrawview(1, 1, tx),
|
||||
neoux.tcfield(11, 1, 15, function (str)
|
||||
if str then
|
||||
settings.setSetting("password", str)
|
||||
end
|
||||
return settings.getSetting("password")
|
||||
end),
|
||||
neoux.tcfield(1, #tx + 1, 19, function (str)
|
||||
workingName = str or workingName
|
||||
return workingName
|
||||
end),
|
||||
neoux.tcbutton(20, #tx + 1, "+", function (w)
|
||||
local ok, err = computer.addUser(workingName)
|
||||
if not ok then
|
||||
neoux.startDialog(err)
|
||||
end
|
||||
w.reset(logGen())
|
||||
end),
|
||||
neoux.tcbutton(23, #tx + 1, "-", function (w)
|
||||
computer.removeUser(workingName)
|
||||
w.reset(logGen())
|
||||
end),
|
||||
}, returner, 0xFFFFFF, 0)
|
||||
end
|
||||
|
||||
local advPage = 1
|
||||
local advPlusH = false
|
||||
|
||||
local function advAsker(info, def, r, parent)
|
||||
return function ()
|
||||
return 25, 2, nil, neoux.tcwindow(25, 2, {
|
||||
neoux.tcrawview(1, 1, {
|
||||
unicode.safeTextFormat(info)
|
||||
}),
|
||||
neoux.tcfield(1, 2, 25, function (tx)
|
||||
def = tx or def
|
||||
return def
|
||||
end)
|
||||
}, function (w)
|
||||
r(def)
|
||||
currentGen = parent
|
||||
w.reset(parent())
|
||||
end, 0xFFFFFF, 0)
|
||||
end
|
||||
end
|
||||
|
||||
local function advGen()
|
||||
local set = settings.listSettings()
|
||||
table.sort(set)
|
||||
|
||||
-- things get complicated here...
|
||||
local pages = math.max(1, math.ceil(#set / 7))
|
||||
advPage = math.max(1, math.min(advPage, pages))
|
||||
local elems = {
|
||||
neoux.tcbutton(23, 1, "+", function (w)
|
||||
advPage = advPage + 1
|
||||
w.reset(advGen())
|
||||
end),
|
||||
neoux.tcrawview(4, 1, {neoux.pad(advPage .. " / " .. pages, 14, true, true)}),
|
||||
neoux.tcbutton(1, 1, "-", function (w)
|
||||
advPage = advPage - 1
|
||||
advPlusH = true
|
||||
w.reset(advGen())
|
||||
end),
|
||||
neoux.tcbutton(18, 1, "add", function (w)
|
||||
currentGen = advAsker("setting ID", "my.setting", function (r)
|
||||
settings.setSetting(r, "")
|
||||
end, currentGen)
|
||||
w.reset(advGen())
|
||||
end),
|
||||
}
|
||||
local ofs = (advPage - 1) * 7
|
||||
for i = 1, 7 do
|
||||
local s = set[i + ofs]
|
||||
if s then
|
||||
local tx = s .. "=" .. (settings.getSetting(s) or "")
|
||||
table.insert(elems, neoux.tcbutton(1, i + 1, unicode.sub(unicode.safeTextFormat(tx), 1, 20), function (w)
|
||||
currentGen = advAsker(s .. ":", settings.getSetting(s) or "", function (r)
|
||||
settings.setSetting(s, r)
|
||||
end, currentGen)
|
||||
w.reset(currentGen())
|
||||
end))
|
||||
table.insert(elems, neoux.tcbutton(23, i + 1, "-", function (w)
|
||||
settings.delSetting(s)
|
||||
end))
|
||||
end
|
||||
end
|
||||
local ph
|
||||
if advPlusH then
|
||||
advPlusH = false
|
||||
ph = 3
|
||||
end
|
||||
return 25, 8, nil, neoux.tcwindow(25, 8, elems, returner, 0xFFFFFF, 0, ph)
|
||||
end
|
||||
|
||||
function mainGen()
|
||||
return 25, 8, nil, neoux.tcwindow(25, 8, {
|
||||
neoux.tcbutton(1, 1, "Screens", function (window)
|
||||
currentGen = scrGen
|
||||
window.reset(currentGen())
|
||||
end),
|
||||
neoux.tcrawview(2, 2, {
|
||||
"Size, depth, touchmode."
|
||||
}),
|
||||
neoux.tcbutton(1, 3, "Login & Access", function (window)
|
||||
currentGen = logGen
|
||||
window.reset(currentGen())
|
||||
end),
|
||||
neoux.tcrawview(2, 4, {
|
||||
"Allowed users, password."
|
||||
}),
|
||||
neoux.tcbutton(1, 5, "Advanced Settings", function (window)
|
||||
advPage = 1
|
||||
currentGen = advGen
|
||||
window.reset(currentGen())
|
||||
end),
|
||||
neoux.tcrawview(2, 6, {
|
||||
"The raw settings data."
|
||||
}),
|
||||
neoux.tchdivider(1, 7, 25),
|
||||
neoux.tcbutton(1, 8, "Relog", function (window)
|
||||
neo.requireAccess("x.neo.sys.session", "Everest session").endSession(true)
|
||||
end),
|
||||
neoux.tcbutton(8, 8, "Reboot", function (window)
|
||||
settings.shutdown(true)
|
||||
end),
|
||||
neoux.tcbutton(16, 8, "Shutdown", function (window)
|
||||
settings.shutdown(false)
|
||||
end),
|
||||
}, function ()
|
||||
window.close()
|
||||
running = false
|
||||
end, 0xFFFFFF, 0)
|
||||
end
|
||||
|
||||
currentGen = mainGen
|
||||
|
||||
window = neoux.create(currentGen())
|
||||
|
||||
while running do
|
||||
local src, id, k, v = event.pull()
|
||||
if src == "x.neo.sys.manage" then
|
||||
if id == "set_setting" then
|
||||
window.reset(currentGen())
|
||||
end
|
||||
end
|
||||
end
|
@ -4,10 +4,86 @@
|
||||
local event = require("event")(neo)
|
||||
local neoux = require("neoux")(event, neo)
|
||||
|
||||
local eeprom = neo.requireAccess("c.eeprom")
|
||||
|
||||
-- note: fun coincidence makes this exactly the right size
|
||||
-- 1234567890123456789012345
|
||||
-- ABCDEF12 Lua BIOS
|
||||
-- <get><set> <data> <label>
|
||||
-- 21FEDCBA Nuclear Disk
|
||||
-- <get><set> <data> <label>
|
||||
|
||||
local running = true
|
||||
|
||||
local busy = false
|
||||
|
||||
local regenCore
|
||||
|
||||
local function regenLabeller(set, get, wd)
|
||||
return wd, 2, nil, neoux.tcwindow(wd, 1, {
|
||||
neoux.tcfield(1, 1, wd, function (nt)
|
||||
if nt then
|
||||
set(nt)
|
||||
end
|
||||
return get()
|
||||
end)
|
||||
}, function (w)
|
||||
busy = false
|
||||
w.reset(regenCore())
|
||||
end, 0xFFFFFF, 0)
|
||||
end
|
||||
|
||||
function regenCore()
|
||||
local elems = {}
|
||||
local l = 1
|
||||
for v in eeprom.list() do
|
||||
local lbl = unicode.safeTextFormat(v.getLabel())
|
||||
table.insert(elems, neoux.tcrawview(1, l, {
|
||||
v.address:sub(1, 8) .. " " .. lbl
|
||||
}))
|
||||
table.insert(elems, neoux.tcbutton(1, l + 1, "get", function (window)
|
||||
if busy then return end
|
||||
busy = true
|
||||
local fd = neoux.fileDialog(true)
|
||||
if not fd then busy = false return end
|
||||
fd.write(v.get())
|
||||
fd.close()
|
||||
busy = false
|
||||
neoux.startDialog("Got the data!", nil, true)
|
||||
end))
|
||||
table.insert(elems, neoux.tcbutton(6, l + 1, "set", function (window)
|
||||
if busy then return end
|
||||
busy = true
|
||||
local fd = neoux.fileDialog(false)
|
||||
if not fd then busy = false return end
|
||||
local eepromCode = fd.read("*a")
|
||||
fd.close()
|
||||
local wasOk, report = v.set(eepromCode)
|
||||
report = (wasOk and tostring(report)) or "Flash successful.\nI recommend relabelling the EEPROM."
|
||||
busy = false
|
||||
neoux.startDialog(report, nil, true)
|
||||
end))
|
||||
local function dHandler(set, get, wd)
|
||||
local setter = v[set]
|
||||
local getter = v[get]
|
||||
return function (window)
|
||||
if busy then return end
|
||||
busy = true
|
||||
window.reset(regenLabeller(setter, getter, wd))
|
||||
end
|
||||
end
|
||||
table.insert(elems, neoux.tcbutton(12, l + 1, "data", dHandler("setData", "getData", 38)))
|
||||
table.insert(elems, neoux.tcbutton(19, l + 1, "label", dHandler("setLabel", "getLabel", 18)))
|
||||
l = l + 2
|
||||
end
|
||||
return 25, l - 1, nil, neoux.tcwindow(25, l - 1, elems, function (w)
|
||||
w.close()
|
||||
running = false
|
||||
end, 0xFFFFFF, 0)
|
||||
end
|
||||
|
||||
local window = neoux.create(regenCore())
|
||||
|
||||
while running do
|
||||
event.pull()
|
||||
end
|
||||
|
@ -1,47 +0,0 @@
|
||||
-- This is released into the public domain.
|
||||
-- No warranty is provided, implied or otherwise.
|
||||
|
||||
-- app-pass: The password setter
|
||||
local settings = neo.requestAccess("x.neo.sys.manage")
|
||||
if not settings then error("no management") return end
|
||||
|
||||
local event = require("event")(neo)
|
||||
local neoux, err = require("neoux")
|
||||
if not neoux then error(err) end
|
||||
neoux = neoux(event, neo)
|
||||
|
||||
local running = true
|
||||
|
||||
local pw = settings.getSetting("password")
|
||||
neoux.create(20, 2, nil, neoux.tcwindow(20, 2, {
|
||||
neoux.tcfield(1, 1, 12, function (set)
|
||||
if not set then
|
||||
return pw
|
||||
end
|
||||
pw = set
|
||||
end),
|
||||
neoux.tcbutton(13, 1, "set PW", function (w)
|
||||
settings.setSetting("password", pw)
|
||||
w.close()
|
||||
running = false
|
||||
end),
|
||||
neoux.tcbutton(1, 2, "log out", function (w)
|
||||
w.close()
|
||||
running = false
|
||||
local session = neo.requestAccess("x.neo.sys.session")
|
||||
if not session then return end
|
||||
session.endSession(true)
|
||||
end),
|
||||
neoux.tcbutton(11, 2, "shutdown", function (w)
|
||||
w.close()
|
||||
running = false
|
||||
settings.shutdown(false)
|
||||
end)
|
||||
}, function (w)
|
||||
w.close()
|
||||
running = false
|
||||
end, 0xFFFFFF, 0))
|
||||
|
||||
while running do
|
||||
event.pull()
|
||||
end
|
@ -62,6 +62,15 @@ local lIM = 1
|
||||
local shuttingDown = false
|
||||
|
||||
local savingThrow = neo.requestAccess("x.neo.sys.manage")
|
||||
|
||||
local function suggestAppsStop()
|
||||
for k, v in ipairs(surfaces) do
|
||||
for i = 1, 4 do
|
||||
v[6]("close")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function dying()
|
||||
local primary = (monitors[1] or {})[2] or ""
|
||||
for _, v in ipairs(monitors) do
|
||||
@ -77,6 +86,7 @@ local function dying()
|
||||
pcall(v[6], "line", 1)
|
||||
pcall(v[6], "line", 2)
|
||||
end
|
||||
surfaces = {}
|
||||
end
|
||||
if savingThrow then
|
||||
savingThrow.registerForShutdownEvent()
|
||||
@ -185,7 +195,7 @@ local function updateRegion(monitorId, x, y, w, h, surfaceSpanCache)
|
||||
end
|
||||
|
||||
local function updateStatus()
|
||||
statusLine = "Λ-¶: menu (launch 'pass' to logout)"
|
||||
statusLine = "Λ-¶: menu (launch 'control' to logout)"
|
||||
if surfaces[1] then
|
||||
if #monitors > 1 then
|
||||
-- 123456789X123456789X123456789X123456789X123456789X
|
||||
@ -254,8 +264,8 @@ local function moveSurface(surface, m, x, y, w, h, force)
|
||||
if ox == x and oy == y and not force then
|
||||
return
|
||||
end
|
||||
-- note: this doesn't always work due to WC support
|
||||
if renderingAllowed() then
|
||||
-- note: this doesn't always work due to WC support, and due to resize-to-repaint
|
||||
if renderingAllowed() and not force then
|
||||
local cb, b = monitors[m][1]()
|
||||
if b then
|
||||
monitorResetBF(b)
|
||||
@ -384,6 +394,7 @@ everestProvider(function (pkg, pid, sendSig)
|
||||
local lid = 0
|
||||
return function (w, h, title)
|
||||
if neo.dead then error("everest died") end
|
||||
if shuttingDown or waitingShutdownCallback then error("system shutting down") end
|
||||
w = math.floor(math.max(w, 8))
|
||||
h = math.floor(math.max(h, 1)) + 1
|
||||
if type(title) ~= "string" then
|
||||
@ -516,6 +527,7 @@ everestSessionProvider(function (pkg, pid, sendSig)
|
||||
endSession = function (gotoBristol)
|
||||
shuttingDown = true
|
||||
if gotoBristol then
|
||||
suggestAppsStop()
|
||||
dying()
|
||||
end
|
||||
end
|
||||
@ -699,9 +711,7 @@ while not shuttingDown do
|
||||
if s[1] == "x.neo.sys.manage" then
|
||||
if s[2] == "shutdown" then
|
||||
waitingShutdownCallback = s[4]
|
||||
for k, v in ipairs(surfaces) do
|
||||
v[6]("close")
|
||||
end
|
||||
suggestAppsStop()
|
||||
checkWSC()
|
||||
end
|
||||
end
|
||||
|
@ -335,17 +335,20 @@ glacierDCProvider(function (pkg, pid, sendSig)
|
||||
tbl[k] = {v.address, false, getMonitorSettings(v.address)}
|
||||
end
|
||||
for k, v in pairs(monitorClaims) do
|
||||
table.insert(tbl, {k, true, getMonitorSettings(v.address)})
|
||||
table.insert(tbl, {k, true, getMonitorSettings(k)})
|
||||
end
|
||||
return tbl
|
||||
end,
|
||||
changeMonitorSetup = function (ma, w, h, d)
|
||||
changeMonitorSetup = function (ma, w, h, d, t)
|
||||
neo.ensureType(ma, "string")
|
||||
neo.ensureType(w, "number")
|
||||
neo.ensureType(h, "number")
|
||||
neo.ensureType(d, "number")
|
||||
neo.ensureType(t, "string")
|
||||
w = math.floor(w)
|
||||
h = math.floor(h)
|
||||
d = math.floor(d)
|
||||
if t ~= "yes" then t = "no" end
|
||||
if w < 1 then error("Invalid width") end
|
||||
if h < 1 then error("Invalid height") end
|
||||
if d < 1 then error("Invalid depth") end
|
||||
@ -353,9 +356,11 @@ glacierDCProvider(function (pkg, pid, sendSig)
|
||||
settings["scr.w." .. ma] = w
|
||||
settings["scr.h." .. ma] = h
|
||||
settings["scr.d." .. ma] = d
|
||||
settings["scr.t." .. ma] = t
|
||||
sRattle("scr.w." .. ma, w)
|
||||
sRattle("scr.h." .. ma, h)
|
||||
sRattle("scr.d." .. ma, d)
|
||||
sRattle("scr.t." .. ma, t)
|
||||
pcall(saveSettings)
|
||||
end,
|
||||
forceRescan = rescanDevs,
|
||||
|
@ -86,7 +86,8 @@ return {
|
||||
"libs"
|
||||
},
|
||||
files = {
|
||||
"libs/sys-secpolicy.lua"
|
||||
"libs/sys-secpolicy.lua",
|
||||
"libs/sys-criticals.lua"
|
||||
}
|
||||
},
|
||||
["neo-coreapps"] = {
|
||||
@ -100,7 +101,7 @@ return {
|
||||
},
|
||||
files = {
|
||||
"apps/app-textedit.lua",
|
||||
"apps/app-pass.lua",
|
||||
"apps/app-control.lua",
|
||||
"apps/app-taskmgr.lua"
|
||||
}
|
||||
},
|
||||
|
@ -9,6 +9,7 @@
|
||||
-- drag(window, update, x, y, button)
|
||||
-- drop(window, update, x, y, button)
|
||||
-- scroll(window, update, x, y, button)
|
||||
-- clipboard(window, update, contents)
|
||||
-- get(window, x, y, bg, fg, selected) -> r,g,b (REQUIRED)
|
||||
-- REMINDER:
|
||||
-- 03
|
||||
@ -82,22 +83,14 @@ end
|
||||
local function packRGB(r, g, b)
|
||||
return (r * 65536) + (g * 256) + b
|
||||
end
|
||||
heldRef = neo.wrapMeta({
|
||||
new = function (x, y, w, h, cbs, colour)
|
||||
local control
|
||||
control = {
|
||||
x = x,
|
||||
y = y,
|
||||
w = w,
|
||||
h = h,
|
||||
selectable = cbs.selectable,
|
||||
key = cbs.key,
|
||||
touch = cbs.touch and cTransform(cbs.touch),
|
||||
drag = cbs.drag and cTransform(cbs.drag),
|
||||
drop = cbs.drop and cTransform(cbs.drop),
|
||||
scroll = cbs.scroll and cTransform(cbs.scroll),
|
||||
line = function (window, x, y, iy, bg, fg, selected)
|
||||
local colour = (window.getDepth() > 1) and colour
|
||||
-- span is a NeoUX-like span function (x, y, str, bg, fg)
|
||||
-- x, y are character-cell start coordinates for this.
|
||||
-- w is character-cell count.
|
||||
-- colour is nil to disable colour,
|
||||
-- otherwise the colour-change threshold (best 0)
|
||||
-- get is a function r,g,b = get(xo, yo)
|
||||
-- NOTE: xo/yo are 0-based!
|
||||
local function calcLine(x, y, w, span, get, colour)
|
||||
local str = ""
|
||||
local bgR = 0
|
||||
local bgG = 0
|
||||
@ -105,21 +98,20 @@ heldRef = neo.wrapMeta({
|
||||
local fgR = 255
|
||||
local fgG = 255
|
||||
local fgB = 255
|
||||
bg = 0
|
||||
fg = 0xFFFFFF
|
||||
local bg = 0
|
||||
local fg = 0xFFFFFF
|
||||
local ca = 0
|
||||
for p = 1, control.w do
|
||||
for p = 1, w do
|
||||
local i = 0x2800
|
||||
local xb = (p * 2) - 1
|
||||
local yb = (iy * 4) - 3
|
||||
local dot0R, dot0G, dot0B = cbs.get(window, xb, yb, bg, fg, selected, colour)
|
||||
local dot1R, dot1G, dot1B = cbs.get(window, xb, yb + 1, bg, fg, selected, colour)
|
||||
local dot2R, dot2G, dot2B = cbs.get(window, xb, yb + 2, bg, fg, selected, colour)
|
||||
local dot3R, dot3G, dot3B = cbs.get(window, xb + 1, yb, bg, fg, selected, colour)
|
||||
local dot4R, dot4G, dot4B = cbs.get(window, xb + 1, yb + 1, bg, fg, selected, colour)
|
||||
local dot5R, dot5G, dot5B = cbs.get(window, xb + 1, yb + 2, bg, fg, selected, colour)
|
||||
local dot6R, dot6G, dot6B = cbs.get(window, xb, yb + 3, bg, fg, selected, colour)
|
||||
local dot7R, dot7G, dot7B = cbs.get(window, xb + 1, yb + 3, bg, fg, selected, colour)
|
||||
local xb = (p - 1) * 2
|
||||
local dot0R, dot0G, dot0B = get(xb + 0, 0)
|
||||
local dot1R, dot1G, dot1B = get(xb + 0, 1)
|
||||
local dot2R, dot2G, dot2B = get(xb + 0, 2)
|
||||
local dot3R, dot3G, dot3B = get(xb + 1, 0)
|
||||
local dot4R, dot4G, dot4B = get(xb + 1, 1)
|
||||
local dot5R, dot5G, dot5B = get(xb + 1, 2)
|
||||
local dot6R, dot6G, dot6B = get(xb + 0, 3)
|
||||
local dot7R, dot7G, dot7B = get(xb + 1, 3)
|
||||
if colour then
|
||||
local obgR, obgG, obgB = colourize(nil,
|
||||
{dot0R, dot0G, dot0B},
|
||||
@ -146,7 +138,7 @@ heldRef = neo.wrapMeta({
|
||||
((dotDist(ofgR, ofgG, ofgB, bgR, bgG, bgB) > colour) and
|
||||
(dotDist(ofgR, ofgG, ofgB, fgR, fgG, fgB) > colour)) then
|
||||
if ca ~= 0 then
|
||||
window.span(x, y, str, bg, fg)
|
||||
span(x, y, str, bg, fg)
|
||||
str = ""
|
||||
end
|
||||
x = x + ca
|
||||
@ -168,7 +160,31 @@ heldRef = neo.wrapMeta({
|
||||
str = str .. unicode.char(i)
|
||||
ca = ca + 1
|
||||
end
|
||||
window.span(x, y, str, bg, fg)
|
||||
if str ~= "" then
|
||||
span(x, y, str, bg, fg)
|
||||
end
|
||||
end
|
||||
heldRef = neo.wrapMeta({
|
||||
calcLine = calcLine,
|
||||
new = function (x, y, w, h, cbs, colour)
|
||||
local control
|
||||
control = {
|
||||
x = x,
|
||||
y = y,
|
||||
w = w,
|
||||
h = h,
|
||||
selectable = cbs.selectable,
|
||||
key = cbs.key,
|
||||
clipboard = cbs.clipboard,
|
||||
touch = cbs.touch and cTransform(cbs.touch),
|
||||
drag = cbs.drag and cTransform(cbs.drag),
|
||||
drop = cbs.drop and cTransform(cbs.drop),
|
||||
scroll = cbs.scroll and cTransform(cbs.scroll),
|
||||
line = function (window, x, y, iy, bg, fg, selected)
|
||||
local colour = ((window.getDepth() <= 1) or nil) and colour
|
||||
calcLine(x, y, control.w, window.span, function (xb, yb)
|
||||
return cbs.get(window, xb + 1, yb + (iy * 4) - 3, bg, fg, selected, colour)
|
||||
end, colour)
|
||||
end,
|
||||
}
|
||||
return control
|
||||
|
@ -12,6 +12,7 @@
|
||||
-- drag(window, update, x, y, xI, yI, button)
|
||||
-- drop(window, update, x, y, xI, yI, button)
|
||||
-- scroll(window, update, x, y, xI, yI, amount)
|
||||
-- clipboard(window, update, contents)
|
||||
|
||||
-- Global forces reference. Otherwise, nasty duplication happens.
|
||||
newNeoux = function (event, neo)
|
||||
@ -102,9 +103,10 @@ newNeoux = function (event, neo)
|
||||
local k = #windows + 1
|
||||
table.insert(windows, windowCore)
|
||||
pushWindowToEverest(k)
|
||||
window.reset = function (w, h, cb)
|
||||
-- API convenience: args compatible with .create
|
||||
window.reset = function (nw, nh, _, cb)
|
||||
callback = cb
|
||||
if mw or nh then
|
||||
if nw or nh then
|
||||
windowCore[2] = nw
|
||||
windowCore[3] = nh
|
||||
end
|
||||
@ -210,11 +212,7 @@ newNeoux = function (event, neo)
|
||||
return {neoux.pad(text, w)}
|
||||
end
|
||||
-- UI FRAMEWORK --
|
||||
neoux.tcwindow = function (w, h, controls, closing, bg, fg)
|
||||
local selIndex = #controls
|
||||
if #controls == 0 then
|
||||
selIndex = 1
|
||||
end
|
||||
neoux.tcwindow = function (w, h, controls, closing, bg, fg, selIndex)
|
||||
local function rotateSelIndex()
|
||||
local original = selIndex
|
||||
while true do
|
||||
@ -232,7 +230,13 @@ newNeoux = function (event, neo)
|
||||
end
|
||||
end
|
||||
end
|
||||
if not selIndex then
|
||||
selIndex = #controls
|
||||
if #controls == 0 then
|
||||
selIndex = 1
|
||||
end
|
||||
rotateSelIndex()
|
||||
end
|
||||
local function moveIndex(vertical, negative)
|
||||
if not controls[selIndex] then return end
|
||||
local currentMA, currentOA = controls[selIndex].y, controls[selIndex].x
|
||||
@ -374,6 +378,12 @@ newNeoux = function (event, neo)
|
||||
controls[selIndex].key(window, function () doZone(window, controls[selIndex]) end, a, b, c)
|
||||
end
|
||||
end
|
||||
elseif ev == "clipboard" then
|
||||
if controls[selIndex] then
|
||||
if controls[selIndex].clipboard then
|
||||
controls[selIndex].clipboard(window, function () doZone(window, controls[selIndex]) end, a)
|
||||
end
|
||||
end
|
||||
elseif ev == "line" then
|
||||
doLine(window, a)
|
||||
elseif ev == "close" then
|
||||
|
Loading…
Reference in New Issue
Block a user