From 7659b81d49d88b81b4e332f136b386fe255b45e0 Mon Sep 17 00:00:00 2001 From: "kepler155c@gmail.com" Date: Sat, 4 Apr 2020 20:56:53 -0600 Subject: [PATCH] more editor work --- sys/apps/Overview.lua | 35 ++++- sys/apps/fileui.lua | 133 ++---------------- sys/autorun/upgraded.lua | 24 ++++ sys/etc/apps.db | 5 +- sys/modules/opus/ui.lua | 42 +++--- sys/modules/opus/ui/components/FileSelect.lua | 118 ++++++++++++++++ sys/modules/opus/ui/components/Page.lua | 5 - sys/modules/opus/util.lua | 1 + 8 files changed, 216 insertions(+), 147 deletions(-) create mode 100644 sys/autorun/upgraded.lua create mode 100644 sys/modules/opus/ui/components/FileSelect.lua diff --git a/sys/apps/Overview.lua b/sys/apps/Overview.lua index a04da7c..2515fc4 100644 --- a/sys/apps/Overview.lua +++ b/sys/apps/Overview.lua @@ -171,6 +171,30 @@ local page = UI.Page { y = 6, x = 2, height = 3, width = 8, }, }, + file_open = UI.FileSelect { + modal = true, + enable = function() end, + transitionHint = 'expandUp', + show = function(self) + UI.FileSelect.enable(self) + self:focusFirst() + self:draw() + end, + disable = function(self) + UI.FileSelect.disable(self) + self.parent:focusFirst() + -- need to recapture as we are opening a modal within another modal + self.parent:capture(self.parent) + end, + eventHandler = function(self, event) + if event.type == 'select_cancel' then + self:disable() + elseif event.type == 'select_file' then + self:disable() + end + return UI.FileSelect.eventHandler(self, event) + end, + }, notification = UI.Notification(), statusBar = UI.StatusBar(), }, @@ -412,7 +436,7 @@ function page.container:setCategory(categoryName, animate) child.y = row end - self:setViewHeight(row + 3) + self:setViewHeight(row + (config.listMode and 1 or 4)) if k < count then col = col + child.width @@ -615,12 +639,11 @@ function page.editor:eventHandler(event) self:loadImage(filename) end + elseif event.type == 'select_file' then + self:loadImage(event.file) + elseif event.type == 'loadIcon' then - local success, filename = shell.run('fileui.lua') - self.parent:dirty(true) - if success and filename then - self:loadImage(filename) - end + self.file_open:show() elseif event.type == 'form_invalid' then self.notification:error(event.message) diff --git a/sys/apps/fileui.lua b/sys/apps/fileui.lua index 0269b9f..f5b1a54 100644 --- a/sys/apps/fileui.lua +++ b/sys/apps/fileui.lua @@ -1,138 +1,35 @@ 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() + fileselect = UI.FileSelect { }, + eventHandler = function(self, event) + if event.type == 'select_file' then + self.selected = event.file + UI:quit() + + elseif event.type == 'select_cancel' then + UI:quit() + end + + return UI.FileSelect.eventHandler(self, event) 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)) +if args.exec and page.selected then + shell.openForegroundTab(string.format('%s %s', args.exec, page.selected)) return end ---print('selected: ' .. tostring(selected)) -return selected +-- print('selected: ' .. tostring(selected)) +return page.selected diff --git a/sys/autorun/upgraded.lua b/sys/autorun/upgraded.lua new file mode 100644 index 0000000..cc1063d --- /dev/null +++ b/sys/autorun/upgraded.lua @@ -0,0 +1,24 @@ +local fs = _G.fs + +local function deleteIfExists(path) + if fs.exists(path) then + fs.delete(path) + print("Deleted outdated file at: "..path) + end +end +-- cleanup outdated files +deleteIfExists('sys/apps/shell') +deleteIfExists('sys/etc/app.db') +deleteIfExists('sys/extensions') +deleteIfExists('sys/network') +deleteIfExists('startup') +deleteIfExists('sys/apps/system/turtle.lua') +deleteIfExists('sys/autorun/gps.lua') +deleteIfExists('sys/autorun/gpshost.lua') +deleteIfExists('sys/apps/network/redserver.lua') +deleteIfExists('sys/apis') +deleteIfExists('sys/autorun/apps.lua') +deleteIfExists('sys/init/6.tl3.lua') + +-- remove this file +-- deleteIfExists('sys/autorun/upgraded.lua') \ No newline at end of file diff --git a/sys/etc/apps.db b/sys/etc/apps.db index e753fd1..f342709 100644 --- a/sys/etc/apps.db +++ b/sys/etc/apps.db @@ -50,7 +50,10 @@ title = "System", category = "System", icon = "\030 \0307\031f| \010\0307\031f---o\030 \031 \010\030 \009 \0307\031f| ", - iconExt = "\030 \0318\138\0308\031 \130\0318\128\031 \129\030 \0318\133\010\030 \0318\143\0308\128\0317\143\0318\128\030 \143\010\030 \0318\138\135\143\139\133", + iconExt = "22€070†b02‹4Ÿ24\ +02—7Ž704ˆ4€€€€\ +7ƒ07„1ƒ7‹24ƒƒ", + --iconExt = "\030 \0318\138\0308\031 \130\0318\128\031 \129\030 \0318\133\010\030 \0318\143\0308\128\0317\143\0318\128\030 \143\010\030 \0318\138\135\143\139\133", run = "System.lua", }, [ "2a4d562b1d9a9c90bdede6fac8ce4f7402462b86" ] = { diff --git a/sys/modules/opus/ui.lua b/sys/modules/opus/ui.lua index 7b004f1..6ec8aff 100644 --- a/sys/modules/opus/ui.lua +++ b/sys/modules/opus/ui.lua @@ -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 diff --git a/sys/modules/opus/ui/components/FileSelect.lua b/sys/modules/opus/ui/components/FileSelect.lua new file mode 100644 index 0000000..55b86b7 --- /dev/null +++ b/sys/modules/opus/ui/components/FileSelect.lua @@ -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 diff --git a/sys/modules/opus/ui/components/Page.lua b/sys/modules/opus/ui/components/Page.lua index 6b25618..1a647c4 100644 --- a/sys/modules/opus/ui/components/Page.lua +++ b/sys/modules/opus/ui/components/Page.lua @@ -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 diff --git a/sys/modules/opus/util.lua b/sys/modules/opus/util.lua index 383420e..3268777 100644 --- a/sys/modules/opus/util.lua +++ b/sys/modules/opus/util.lua @@ -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 = {