Added sPhone.list function
This commit is contained in:
parent
279758a48c
commit
e4deff5856
1 changed files with 130 additions and 0 deletions
130
src/sPhone.lua
130
src/sPhone.lua
|
@ -164,6 +164,136 @@ local function kernel()
|
|||
sPhone.setDefaultApp("home","/.sPhone/apps/home")
|
||||
end
|
||||
|
||||
function sPhone.list(path, opt)
|
||||
opt = opt or {}
|
||||
opt.bg1 = opt.bg1 or sPhone.getTheme("backgroundColor")
|
||||
opt.fg1 = opt.fg1 or sPhone.getTheme("text")
|
||||
opt.fg1b = opt.fg1b or colors.lime
|
||||
opt.bg2 = opt.bg2 or sPhone.getTheme("header")
|
||||
opt.fg2 = opt.fg2 or sPhone.getTheme("headerText")
|
||||
opt.bg3 = opt.bg3 or colors.red
|
||||
opt.fg3 = opt.fg3 or sPhone.getTheme("headerText")
|
||||
opt.output = opt.output or true
|
||||
opt.list = opt.list or false
|
||||
if not path then
|
||||
path = ""
|
||||
end
|
||||
if not fs.isDir(path) and not opt.list then
|
||||
error("Invalid path")
|
||||
end
|
||||
local scroll = 0
|
||||
local items
|
||||
local w, h
|
||||
local function rebuild()
|
||||
local files, dirs = {}, {}
|
||||
items = {}
|
||||
local flist
|
||||
if not opt.list then
|
||||
flist = fs.list(path)
|
||||
else
|
||||
flist = opt.list
|
||||
end
|
||||
for i, v in ipairs(flist) do
|
||||
if fs.isDir(fs.combine(path, v)) then
|
||||
table.insert(dirs, v)
|
||||
else
|
||||
table.insert(files, v)
|
||||
end
|
||||
end
|
||||
table.sort(files)
|
||||
table.sort(dirs)
|
||||
for i, v in ipairs(dirs) do
|
||||
table.insert(items, v)
|
||||
end
|
||||
for i, v in ipairs(files) do
|
||||
table.insert(items, v)
|
||||
end
|
||||
scroll = 0
|
||||
end
|
||||
rebuild()
|
||||
local setVisible = term.current().setVisible
|
||||
or function()end
|
||||
local function redraw()
|
||||
w, h = term.getSize()
|
||||
setVisible(false)
|
||||
term.setBackgroundColor(opt.bg1)
|
||||
term.clear()
|
||||
for i = scroll + 1, h + scroll - 1 do
|
||||
local str = items[i]
|
||||
if str then
|
||||
term.setCursorPos(2, 1 + i - scroll)
|
||||
local isDir = fs.isDir(fs.combine(path, str))
|
||||
term.setTextColor(isDir and opt.fg1b or opt.fg1)
|
||||
local _w = w - (isDir and 2 or 1)
|
||||
if #str > _w then
|
||||
str = str:sub(1, _w - 2) .. ".."
|
||||
end
|
||||
if isDir then
|
||||
str = str .. "/"
|
||||
end
|
||||
term.write(str)
|
||||
end
|
||||
end
|
||||
term.setBackgroundColor(opt.bg2)
|
||||
term.setTextColor(opt.fg2)
|
||||
term.setCursorPos(1, 1)
|
||||
term.clearLine()
|
||||
local _path = path .. "/"
|
||||
if #_path > w - 2 then
|
||||
_path = ".." .. _path:sub(-w + 4)
|
||||
end
|
||||
term.write(_path)
|
||||
term.setBackgroundColor(opt.bg3)
|
||||
term.setTextColor(opt.fg3)
|
||||
term.setCursorPos(w, 1)
|
||||
term.write("X")
|
||||
term.setCursorPos(w, 2)
|
||||
term.write("^")
|
||||
term.setCursorPos(w, h)
|
||||
term.write("v")
|
||||
setVisible(true)
|
||||
end
|
||||
while true do
|
||||
redraw()
|
||||
local ev = {os.pullEventRaw()}
|
||||
if ev[1] == "terminate" then
|
||||
return nil
|
||||
elseif ev[1] == "mouse_scroll" and ev[4] > 1 then
|
||||
scroll = scroll + ev[2]
|
||||
elseif ev[1] == "mouse_click" and ev[2] == 1 then
|
||||
if ev[3] == w then
|
||||
if ev[4] == 1 then
|
||||
return nil
|
||||
elseif ev[4] == 2 then
|
||||
scroll = scroll - 1
|
||||
elseif ev[4] == h then
|
||||
scroll = scroll + 1
|
||||
end
|
||||
elseif ev[3] < w and ev[4] == 1 then
|
||||
path = fs.getDir(path)
|
||||
if path == ".." then
|
||||
path = ""
|
||||
end
|
||||
rebuild()
|
||||
elseif ev[3] < w and ev[4] > 1 then
|
||||
local item = items[ev[4] + scroll - 1]
|
||||
if item then
|
||||
local fullPath = fs.combine(path, item)
|
||||
if fs.isDir(fullPath) then
|
||||
path = fullPath
|
||||
rebuild()
|
||||
else
|
||||
if opt.output then
|
||||
return fullPath
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
scroll = math.min(math.max(0, scroll), math.max(0, #items - h + 1))
|
||||
end
|
||||
end
|
||||
|
||||
local function clear()
|
||||
term.setBackgroundColor(sPhone.theme["backgroundColor"])
|
||||
term.clear()
|
||||
|
|
Loading…
Reference in a new issue