mirror of
https://github.com/kepler155c/opus
synced 2024-11-15 13:14:49 +00:00
139 lines
2.7 KiB
Lua
139 lines
2.7 KiB
Lua
|
local UI = require('opus.ui')
|
||
|
local Util = require('opus.util')
|
||
|
|
||
|
local colors = _G.colors
|
||
|
local fs = _G.fs
|
||
|
local shell = _ENV.shell
|
||
|
|
||
|
local selected
|
||
|
|
||
|
-- fileui [--path=path] [--exec=filename]
|
||
|
|
||
|
local page = UI.Page {
|
||
|
title = 'Select File',
|
||
|
-- x = 3, ex = -3, y = 2, ey = -2,
|
||
|
grid = UI.ScrollingGrid {
|
||
|
x = 2, y = 2, ex = -2, ey = -4,
|
||
|
path = '',
|
||
|
sortColumn = 'name',
|
||
|
columns = {
|
||
|
{ heading = 'Name', key = 'name' },
|
||
|
{ heading = 'Size', key = 'size', width = 5 }
|
||
|
},
|
||
|
getDisplayValues = function(_, row)
|
||
|
if row.size then
|
||
|
row = Util.shallowCopy(row)
|
||
|
row.size = Util.toBytes(row.size)
|
||
|
end
|
||
|
return row
|
||
|
end,
|
||
|
getRowTextColor = function(_, file)
|
||
|
if file.isDir then
|
||
|
return colors.cyan
|
||
|
end
|
||
|
if file.isReadOnly then
|
||
|
return colors.pink
|
||
|
end
|
||
|
return colors.white
|
||
|
end,
|
||
|
sortCompare = function(self, a, b)
|
||
|
if self.sortColumn == 'size' then
|
||
|
return a.size < b.size
|
||
|
end
|
||
|
if a.isDir == b.isDir then
|
||
|
return a.name:lower() < b.name:lower()
|
||
|
end
|
||
|
return a.isDir
|
||
|
end,
|
||
|
draw = function(self)
|
||
|
local files = fs.listEx(self.dir)
|
||
|
if #self.dir > 0 then
|
||
|
table.insert(files, {
|
||
|
name = '..',
|
||
|
isDir = true,
|
||
|
})
|
||
|
end
|
||
|
self:setValues(files)
|
||
|
self:setIndex(1)
|
||
|
UI.Grid.draw(self)
|
||
|
end,
|
||
|
},
|
||
|
path = UI.TextEntry {
|
||
|
x = 2,
|
||
|
y = -2,
|
||
|
ex = -11,
|
||
|
limit = 256,
|
||
|
accelerators = {
|
||
|
enter = 'path_enter',
|
||
|
}
|
||
|
},
|
||
|
cancel = UI.Button {
|
||
|
text = 'Cancel',
|
||
|
x = -9,
|
||
|
y = -2,
|
||
|
event = 'cancel',
|
||
|
},
|
||
|
draw = function(self)
|
||
|
self:fillArea(1, 1, self.width, self.height, string.rep('\127', self.width), colors.black, colors.gray)
|
||
|
self:drawChildren()
|
||
|
end,
|
||
|
}
|
||
|
|
||
|
function page:enable(path)
|
||
|
self:setPath(path or shell.dir())
|
||
|
UI.Page.enable(self)
|
||
|
end
|
||
|
|
||
|
function page:setPath(path)
|
||
|
self.grid.dir = path
|
||
|
while not fs.isDir(self.grid.dir) do
|
||
|
self.grid.dir = fs.getDir(self.grid.dir)
|
||
|
end
|
||
|
|
||
|
self.path.value = self.grid.dir
|
||
|
end
|
||
|
|
||
|
function page:eventHandler(event)
|
||
|
if event.type == 'grid_select' then
|
||
|
self.grid.dir = fs.combine(self.grid.dir, event.selected.name)
|
||
|
self.path.value = self.grid.dir
|
||
|
if event.selected.isDir then
|
||
|
self.grid:draw()
|
||
|
self.path:draw()
|
||
|
else
|
||
|
selected = self.path.value
|
||
|
UI:quit()
|
||
|
end
|
||
|
|
||
|
elseif event.type == 'path_enter' then
|
||
|
if fs.isDir(self.path.value) then
|
||
|
self:setPath(self.path.value)
|
||
|
self.grid:draw()
|
||
|
self.path:draw()
|
||
|
else
|
||
|
selected = self.path.value
|
||
|
UI:quit()
|
||
|
end
|
||
|
|
||
|
elseif event.type == 'cancel' then
|
||
|
UI:quit()
|
||
|
else
|
||
|
return UI.Page.eventHandler(self, event)
|
||
|
end
|
||
|
return true
|
||
|
end
|
||
|
|
||
|
local _, args = Util.parse(...)
|
||
|
|
||
|
UI:setPage(page, args.path)
|
||
|
UI:start()
|
||
|
UI.term:setCursorBlink(false)
|
||
|
|
||
|
if args.exec and selected then
|
||
|
shell.openForegroundTab(string.format('%s %s', args.exec, selected))
|
||
|
return
|
||
|
end
|
||
|
|
||
|
--print('selected: ' .. tostring(selected))
|
||
|
return selected
|