more editor work

This commit is contained in:
kepler155c@gmail.com
2020-04-04 20:56:53 -06:00
parent cd58ecd861
commit 7659b81d49
8 changed files with 216 additions and 147 deletions

View File

@@ -687,31 +687,39 @@ function UI.Window:sync()
end
function UI.Window:enable(...)
self.enabled = true
if self.transitionHint then
self:addTransition(self.transitionHint)
end
if not self.enabled then
self.enabled = true
if self.transitionHint then
self:addTransition(self.transitionHint)
end
if self.modal then
self:raise()
self:capture(self)
end
if self.modal then
self:raise()
self:capture(self)
end
for child in self:eachChild() do
child:enable(...)
for child in self:eachChild() do
if not child.enabled then
child:enable(...)
end
end
end
end
function UI.Window:disable()
self.enabled = false
self.parent:dirty(true)
if self.enabled then
self.enabled = false
self.parent:dirty(true)
if self.modal then
self:release(self)
end
if self.modal then
self:release(self)
end
for child in self:eachChild() do
child:disable()
for child in self:eachChild() do
if child.enabled then
child:disable()
end
end
end
end

View File

@@ -0,0 +1,118 @@
local class = require('opus.class')
local UI = require('opus.ui')
local Util = require('opus.util')
local colors = _G.colors
local fs = _G.fs
UI.FileSelect = class(UI.Window)
UI.FileSelect.defaults = {
UIElement = 'FileSelect',
}
function UI.FileSelect:postInit()
self.grid = UI.ScrollingGrid {
x = 2, y = 2, ex = -2, ey = -4,
dir = '/',
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,
}
self.path = UI.TextEntry {
x = 2,
y = -2,
ex = -11,
limit = 256,
accelerators = {
enter = 'path_enter',
}
}
self.cancel = UI.Button {
text = 'Cancel',
x = -9,
y = -2,
event = 'select_cancel',
}
end
function UI.FileSelect:draw()
self:fillArea(1, 1, self.width, self.height, string.rep('\127', self.width), colors.black, colors.gray)
self:drawChildren()
end
function UI.FileSelect:enable(path)
self:setPath(path or '')
UI.Window.enable(self)
end
function UI.FileSelect: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 UI.FileSelect: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
self:emit({ type = 'select_file', file = '/' .. self.path.value, element = self })
end
return true
elseif event.type == 'path_enter' then
if self.path.value then
if fs.isDir(self.path.value) then
self:setPath(self.path.value)
self.grid:draw()
self.path:draw()
else
self:emit({ type = 'select_file', file = '/' .. self.path.value, element = self })
end
end
return true
end
end

View File

@@ -32,10 +32,6 @@ function UI.Page:enable()
end
end
function UI.Page:disable()
UI.Window.disable(self)
end
function UI.Page:sync()
if self.enabled then
self:checkFocus()
@@ -58,7 +54,6 @@ function UI.Page:pointToChild(x, y)
return UI.Window.pointToChild(self, x, y)
end
-- need to add offsets to this test
local function getPosition(element)
local x, y = 1, 1
repeat

View File

@@ -13,6 +13,7 @@ local _unpack = table.unpack
local _bor = bit32.bor
local _bxor = bit32.bxor
local byteArrayMT
byteArrayMT = {
__tostring = function(a) return string.char(_unpack(a)) end,
__index = {