From ef0886ec85cd9003e75c7b0b9fd1f2f0e64d43a0 Mon Sep 17 00:00:00 2001 From: "kepler155c@gmail.com" Date: Sun, 26 Apr 2020 19:39:28 -0600 Subject: [PATCH] wizard and tab rework --- ccemux/system/ccemux.lua | 2 +- common/Turtles.lua | 336 +++++++++++++------------ common/etc/apps.db | 2 +- common/multiMiner.lua | 6 +- lzwfs/system/lzwfs.lua | 2 +- milo/core/learnWizard.lua | 32 ++- milo/core/machines.lua | 396 ++++++++++++++---------------- milo/plugins/item/infoTab.lua | 2 +- milo/plugins/item/machinesTab.lua | 2 +- milo/plugins/item/manageTab.lua | 2 +- milo/plugins/item/recipeTab.lua | 2 +- milo/plugins/item/resetTab.lua | 2 +- milo/plugins/remote/autostore.lua | 4 +- milo/plugins/statsView.lua | 16 +- neural/Sensor.lua | 8 +- screenSaver/system/saver.lua | 2 +- secure/system/secure.lua | 2 +- shellex/apis/transfer.lua | 2 +- swshop/shopTab.lua | 2 +- turtle/system/turtle.lua | 2 +- 20 files changed, 398 insertions(+), 426 deletions(-) diff --git a/ccemux/system/ccemux.lua b/ccemux/system/ccemux.lua index d2f0e43..d066bab 100644 --- a/ccemux/system/ccemux.lua +++ b/ccemux/system/ccemux.lua @@ -6,7 +6,7 @@ local ccemux = _G.ccemux local sides = { 'bottom', 'top', 'back', 'front', 'right', 'left' } local tab = UI.Tab { - tabTitle = 'CCEmuX', + title = 'CCEmuX', description = 'CCEmuX peripherals', form = UI.Form { x = 2, ex = -2, y = 2, ey = 5, diff --git a/common/Turtles.lua b/common/Turtles.lua index cc48825..07d89e6 100644 --- a/common/Turtles.lua +++ b/common/Turtles.lua @@ -5,7 +5,6 @@ local Socket = require('opus.socket') local UI = require('opus.ui') local Util = require('opus.util') -local colors = _G.colors local fs = _G.fs local multishell = _ENV.multishell local network = _G.network @@ -31,7 +30,7 @@ local socket, turtle, page page = UI.Page { coords = UI.Window { - backgroundColor = colors.black, + backgroundColor = 'black', height = 3, marginTop = 1, marginLeft = 1, draw = function(self) @@ -50,156 +49,149 @@ page = UI.Page { }, tabs = UI.Tabs { x = 1, y = 4, ey = -2, - scripts = UI.ScrollingGrid { - tabTitle = 'Run', - backgroundColor = colors.cyan, - columns = { - { heading = '', key = 'label' }, + UI.Tab { + title = 'Run', + scripts = UI.ScrollingGrid { + backgroundColor = 'primary', + columns = { + { heading = '', key = 'label' }, + }, + disableHeader = true, + sortColumn = 'label', + autospace = true, + draw = function(self) + Util.clear(self.values) + local files = fs.list(SCRIPTS_PATH) + for _,path in pairs(files) do + table.insert(self.values, { label = path, path = fs.combine(SCRIPTS_PATH, path) }) + end + self:update() + UI.ScrollingGrid.draw(self) + end, + eventHandler = function(self, event) + if event.type == 'grid_select' then + page:runScript(event.selected.label) + else + return UI.ScrollingGrid.eventHandler(self, event) + end + return true + end, }, - disableHeader = true, - sortColumn = 'label', - autospace = true, - draw = function(self) - Util.clear(self.values) - local files = fs.list(SCRIPTS_PATH) - for _,path in pairs(files) do - table.insert(self.values, { label = path, path = fs.combine(SCRIPTS_PATH, path) }) - end - self:update() - UI.ScrollingGrid.draw(self) - end, - eventHandler = function(self, event) - if event.type == 'grid_select' then - page:runScript(event.selected.label) - else - return UI.ScrollingGrid.eventHandler(self, event) - end - return true - end, }, - turtles = UI.ScrollingGrid { - tabTitle = 'Select', - backgroundColor = colors.cyan, - columns = { - { heading = 'label', key = 'label' }, - { heading = 'Dist', key = 'distance' }, - { heading = 'Status', key = 'status' }, - { heading = 'Fuel', key = 'fuel' }, - }, - disableHeader = true, - sortColumn = 'label', - autospace = true, - getDisplayValues = function(_, row) - row = Util.shallowCopy(row) - if row.fuel then - row.fuel = Util.toBytes(row.fuel) - end - if row.distance then - row.distance = Util.round(row.distance, 1) - end - return row - end, - draw = function(self) - Util.clear(self.values) - for _,v in pairs(network) do - if v.fuel then - table.insert(self.values, v) + UI.Tab { + title = 'Select', + turtles = UI.ScrollingGrid { + backgroundColor = 'primary', + columns = { + { heading = 'label', key = 'label' }, + { heading = 'Dist', key = 'distance' }, + { heading = 'Status', key = 'status' }, + { heading = 'Fuel', key = 'fuel' }, + }, + disableHeader = true, + sortColumn = 'label', + autospace = true, + getDisplayValues = function(_, row) + row = Util.shallowCopy(row) + if row.fuel then + row.fuel = Util.toBytes(row.fuel) end - end - self:update() - UI.ScrollingGrid.draw(self) - end, - eventHandler = function(self, event) - if event.type == 'grid_select' then - turtle = event.selected - config.id = event.selected.id - Config.update('Turtles', config) - multishell.setTitle(multishell.getCurrent(), turtle.label) - if socket then - socket:close() - socket = nil + if row.distance then + row.distance = Util.round(row.distance, 1) end - else - return UI.ScrollingGrid.eventHandler(self, event) - end - return true - end, - }, - inventory = UI.ScrollingGrid { - backgroundColor = colors.cyan, - tabTitle = 'Inv', - columns = { - { heading = '', key = 'index', width = 2 }, - { heading = '', key = 'count', width = 2 }, - { heading = 'Inventory', key = 'key' }, - }, - disableHeader = true, - sortColumn = 'index', - getRowTextColor = function(self, row, selected) - if turtle and row.selected then - return colors.yellow - end - return UI.ScrollingGrid.getRowTextColor(self, row, selected) - end, - draw = function(self) - local t = turtle - Util.clear(self.values) - if t then - for k,v in pairs(t.inv or { }) do -- new method (less data) - local index, count = k:match('(%d+),(%d+)') - v = { - index = tonumber(index), - key = v, - count = tonumber(count), - } - table.insert(self.values, v) - end - - for _,v in pairs(t.inventory or { }) do - if v.count > 0 then + return row + end, + draw = function(self) + Util.clear(self.values) + for _,v in pairs(network) do + if v.fuel then table.insert(self.values, v) end end - - for _,v in pairs(self.values) do - if v.index == t.slotIndex then - v.selected = true + self:update() + UI.ScrollingGrid.draw(self) + end, + eventHandler = function(self, event) + if event.type == 'grid_select' then + turtle = event.selected + config.id = event.selected.id + Config.update('Turtles', config) + multishell.setTitle(multishell.getCurrent(), turtle.label) + if socket then + socket:close() + socket = nil end - if v.key then - v.key = itemDB:getName(v.key) + else + return UI.ScrollingGrid.eventHandler(self, event) + end + return true + end, + }, + }, + UI.Tab { + title = 'Inv', + inventory = UI.ScrollingGrid { + backgroundColor = 'primary', + columns = { + { heading = '', key = 'index', width = 2 }, + { heading = '', key = 'count', width = 2 }, + { heading = 'Inventory', key = 'key' }, + }, + disableHeader = true, + sortColumn = 'index', + getRowTextColor = function(self, row, selected) + if turtle and row.selected then + return 'yellow' + end + return UI.ScrollingGrid.getRowTextColor(self, row, selected) + end, + draw = function(self) + local t = turtle + Util.clear(self.values) + if t then + for k,v in pairs(t.inv or { }) do -- new method (less data) + local index, count = k:match('(%d+),(%d+)') + v = { + index = tonumber(index), + key = v, + count = tonumber(count), + } + table.insert(self.values, v) + end + + for _,v in pairs(t.inventory or { }) do + if v.count > 0 then + table.insert(self.values, v) + end + end + + for _,v in pairs(self.values) do + if v.index == t.slotIndex then + v.selected = true + end + if v.key then + v.key = itemDB:getName(v.key) + end end end - end - self:adjustWidth() - self:update() - UI.ScrollingGrid.draw(self) - end, - eventHandler = function(self, event) - if event.type == 'grid_select' then - local fn = string.format('turtle.select(%d)', event.selected.index) - page:runFunction(fn) - else - return UI.ScrollingGrid.eventHandler(self, event) - end - return true - end, - }, ---[[ - policy = UI.ScrollingGrid { - tabTitle = 'Mod', - backgroundColor = UI.TabBar.defaults.selectedBackgroundColor, - columns = { - { heading = 'label', key = 'label' }, + self:adjustWidth() + self:update() + UI.ScrollingGrid.draw(self) + end, + eventHandler = function(self, event) + if event.type == 'grid_select' then + local fn = string.format('turtle.select(%d)', event.selected.index) + page:runFunction(fn) + else + return UI.ScrollingGrid.eventHandler(self, event) + end + return true + end, }, - values = policies, - disableHeader = true, - sortColumn = 'label', - autospace = true, }, - ]] - action = UI.Window { - tabTitle = 'Action', - backgroundColor = colors.cyan, + UI.Tab { + title = 'Action', + backgroundColor = 'primary', moveUp = UI.Button { x = 5, y = 2, text = 'up', @@ -233,8 +225,41 @@ page = UI.Page { info = UI.TextArea { x = 15, y = 2, inactive = true, - } + }, + showBlocks = function(self) + local script = [[ + local function inspect(direction) + local s,b = turtle['inspect' .. (direction or '')]() + if not s then + return 'minecraft:air:0' + end + return string.format('%s:%d', b.name, b.metadata) + end + + local bu, bf, bd = inspect('Up'), inspect(), inspect('Down') + return string.format('%s\n%s\n%s', bu, bf, bd) + ]] + + local s, m = self:runFunction(script, true) + self.info:setText(s or m) + end, + eventHandler = function(self, event) + if event.type == 'button_press' then + if event.button.fn then + self:runFunction(event.button.fn, event.button.nowrap) + self:showBlocks() + end + return true + end + return UI.Tab.eventHandler(self, event) + end, }, + enable = function(self) + if config.tab then + self:selectTab(Util.find(self, 'title', config.tab)) + end + UI.Tabs.enable(self) + end }, statusBar = UI.StatusBar { values = { }, @@ -331,24 +356,6 @@ function page:runScript(scriptName) end end -function page:showBlocks() - local script = [[ - local function inspect(direction) - local s,b = turtle['inspect' .. (direction or '')]() - if not s then - return 'minecraft:air:0' - end - return string.format('%s:%d', b.name, b.metadata) - end - - local bu, bf, bd = inspect('Up'), inspect(), inspect('Down') - return string.format('%s\n%s\n%s', bu, bf, bd) - ]] - - local s, m = self:runFunction(script, true) - self.tabs.action.info:setText(s or m) -end - function page:eventHandler(event) if event.type == 'quit' then UI:quit() @@ -357,13 +364,6 @@ function page:eventHandler(event) config.tab = event.button.text Config.update('Turtles', config) - elseif event.type == 'button_press' then - if event.button.fn then - self:runFunction(event.button.fn, event.button.nowrap) - self:showBlocks() - elseif event.button.script then - self:runScript(event.button.script) - end else return UI.Page.eventHandler(self, event) end @@ -393,9 +393,5 @@ Event.onInterval(1, function() end end) -if config.tab then - page.tabs.tabBar:selectTab(config.tab) -end - UI:setPage(page) UI:start() diff --git a/common/etc/apps.db b/common/etc/apps.db index d8608bb..7580ce5 100644 --- a/common/etc/apps.db +++ b/common/etc/apps.db @@ -57,7 +57,7 @@ category = "Apps", requires = "advancedComputer", iconExt = "\030 \031 \128\030d\159\030 \031d\140\030d\031 \155\030 \0315\140\0305\031 \155\030 \128\010\030 \031d\136\145\0315\136\145\031d\153\031 \128\0315\153\010\030 \031 \128\031d\130\140\134\0315\140\134\031 \128", - run = "fileui --exec=hexedit.lua", + run = "fileui --exec=hexedit.lua --title=hexedit", }, [ "fb1c39e9f4f3c2628ad173ab401a6e4e4baf783d" ] = { title = "Sounds", diff --git a/common/multiMiner.lua b/common/multiMiner.lua index d721461..a271261 100644 --- a/common/multiMiner.lua +++ b/common/multiMiner.lua @@ -308,7 +308,7 @@ local containerText = { } local containTab = UI.Tab { - tabTitle = 'Contain', + title = 'Contain', button = UI.Button { x = 2, y = 2, text = 'Set corner', @@ -321,7 +321,7 @@ local containTab = UI.Tab { } local blocksTab = UI.Tab { - tabTitle = 'Blocks', + title = 'Blocks', grid = UI.ScrollingGrid { y = 1, columns = { @@ -333,7 +333,7 @@ local blocksTab = UI.Tab { } local turtlesTab = UI.Tab { - tabTitle = 'Turtles', + title = 'Turtles', grid = UI.ScrollingGrid { y = 1, values = pool, diff --git a/lzwfs/system/lzwfs.lua b/lzwfs/system/lzwfs.lua index 3f0a7a2..69bccee 100644 --- a/lzwfs/system/lzwfs.lua +++ b/lzwfs/system/lzwfs.lua @@ -14,7 +14,7 @@ local config = Config.load('lzwfs', { }) local tab = UI.Tab { - tabTitle = 'Compression', + title = 'Compression', description = 'Disk compression', [1] = UI.Window { x = 2, y = 2, ex = -2, ey = 6, diff --git a/milo/core/learnWizard.lua b/milo/core/learnWizard.lua index 0f8917f..5fbcc05 100644 --- a/milo/core/learnWizard.lua +++ b/milo/core/learnWizard.lua @@ -1,33 +1,29 @@ local Milo = require('milo') local UI = require('opus.ui') -local turtle = _G.turtle - local learnPage = UI.Page { titleBar = UI.TitleBar { title = 'Learn Recipe' }, wizard = UI.Wizard { y = 2, ey = -2, - pages = { - general = UI.WizardPage { - index = 1, - grid = UI.ScrollingGrid { - x = 2, ex = -2, y = 2, ey = -2, - disableHeader = true, - columns = { - { heading = 'Name', key = 'name'}, - }, - sortColumn = 'name', - }, - accelerators = { - grid_select = 'nextView', + general = UI.WizardPage { + index = 1, + grid = UI.ScrollingGrid { + x = 2, ex = -2, y = 2, ey = -2, + disableHeader = true, + columns = { + { heading = 'Name', key = 'name'}, }, + sortColumn = 'name', + }, + accelerators = { + grid_select = 'nextView', }, }, }, notification = UI.Notification { }, } -local general = learnPage.wizard.pages.general +local general = learnPage.wizard.general function general:validate() Milo:setState('learnType', self.grid:getSelected().value) @@ -37,7 +33,7 @@ end function learnPage:enable() local t = { } - for _, page in pairs(self.wizard.pages) do + for _, page in pairs(self.wizard:getPages()) do if page.validFor then t[page.validFor] = { name = page.validFor, @@ -63,7 +59,7 @@ function learnPage.wizard:getPage(index) local pages = { } table.insert(pages, general) local selected = general.grid:getSelected() - for _, page in pairs(self.pages) do + for _, page in pairs(self:getPages()) do if page.validFor and (not selected or selected.value == page.validFor) then table.insert(pages, page) end diff --git a/milo/core/machines.lua b/milo/core/machines.lua index b3779db..a336d37 100644 --- a/milo/core/machines.lua +++ b/milo/core/machines.lua @@ -35,6 +35,36 @@ local networkPage = UI.Page { }, sortColumn = 'displayName', help = 'Select Node', + getDisplayValues = function(_, row) + row = Util.shallowCopy(row) + local t = { row.name:match(':(.+)_(%d+)$') } + if #t ~= 2 then + t = { row.name:match('(.+)_(%d+)$') } + end + if t and #t == 2 then + row.name, row.suffix = table.unpack(t) + row.name = row.name .. '_' .. row.suffix + end + row.displayName = row.displayName or row.name + return row + end, + getRowTextColor = function(self, row, selected) + if not device[row.name] then + return colors.red + end + if row.mtype == 'ignore' then + return colors.lightGray + end + return UI.Grid.getRowTextColor(self, row, selected) + end, + sortCompare = function(self, a, b) + if self.sortColumn == 'displayName' then + local an = a.displayName or a.name + local bn = b.displayName or b.name + return an:lower() < bn:lower() + end + return UI.Grid.sortCompare(self, a, b) + end, }, remove = UI.Button { y = -2, x = -4, @@ -55,39 +85,6 @@ local networkPage = UI.Page { } } -function networkPage.grid:getDisplayValues(row) - row = Util.shallowCopy(row) - local t = { row.name:match(':(.+)_(%d+)$') } - if #t ~= 2 then - t = { row.name:match('(.+)_(%d+)$') } - end - if t and #t == 2 then - row.name, row.suffix = table.unpack(t) - row.name = row.name .. '_' .. row.suffix - end - row.displayName = row.displayName or row.name - return row -end - -function networkPage.grid:getRowTextColor(row, selected) - if not device[row.name] then - return colors.red - end - if row.mtype == 'ignore' then - return colors.lightGray - end - return UI.Grid:getRowTextColor(row, selected) -end - -function networkPage.grid:sortCompare(a, b) - if self.sortColumn == 'displayName' then - local an = a.displayName or a.name - local bn = b.displayName or b.name - return an:lower() < bn:lower() - end - return UI.Grid.sortCompare(self, a, b) -end - function networkPage:getList() for _, v in pairs(device) do if not context.storage.nodes[v.name] then @@ -96,7 +93,7 @@ function networkPage:getList() mtype = 'ignore', category = 'ignore', } - for _, page in pairs(nodeWizard.wizard.pages) do + for _, page in pairs(nodeWizard.wizard:getPages()) do if page.isValidType and page:isValidType(node) then context.storage.nodes[v.name] = node break @@ -191,46 +188,91 @@ nodeWizard = UI.Page { titleBar = UI.TitleBar { title = 'Configure' }, wizard = UI.Wizard { y = 2, ey = -2, - pages = { - general = UI.WizardPage { - index = 1, - form = UI.Form { - x = 2, ex = -2, y = 1, ey = 3, - manualControls = true, - [1] = UI.TextEntry { - formLabel = 'Name', formKey = 'displayName', - help = 'Set a friendly name', - limit = 64, - }, - [2] = UI.Chooser { - width = 25, - formLabel = 'Type', formKey = 'mtype', - --nochoice = 'Storage', - help = 'Select type', - }, + general = UI.WizardPage { + index = 1, + form = UI.Form { + x = 2, ex = -2, y = 1, ey = 3, + manualControls = true, + [1] = UI.TextEntry { + formLabel = 'Name', formKey = 'displayName', + help = 'Set a friendly name', + limit = 64, }, - grid = UI.ScrollingGrid { - y = 5, ey = -2, x = 2, ex = -2, - columns = { - { heading = 'Slot', key = 'slot', width = 4 }, - { heading = 'Name', key = 'displayName', }, - { heading = 'Qty', key = 'count' , width = 3 }, - }, - sortColumn = 'slot', - help = 'Contents of inventory', + [2] = UI.Chooser { + width = 25, + formLabel = 'Type', formKey = 'mtype', + --nochoice = 'Storage', + help = 'Select type', }, }, - confirmation = UI.WizardPage { - title = 'Confirm changes', - index = 2, - notice = UI.TextArea { - x = 2, ex = -2, y = 2, ey = -2, - value = + grid = UI.ScrollingGrid { + y = 5, ey = -2, x = 2, ex = -2, + columns = { + { heading = 'Slot', key = 'slot', width = 4 }, + { heading = 'Name', key = 'displayName', }, + { heading = 'Qty', key = 'count' , width = 3 }, + }, + sortColumn = 'slot', + help = 'Contents of inventory', + }, + getDisplayValues = function(_, row) + row = Util.shallowCopy(row) + row.displayName = itemDB:getName(row) + return row + end, + enable = function(self) + UI.WizardPage.enable(self) + self:focusFirst() + end, + isValidFor = function() + return false + end, + showInventory = function(self, node) + local inventory + + if device[node.name] and device[node.name].list then + pcall(function() + inventory = device[node.name].list() + for k,v in pairs(inventory) do + v.slot = k + end + end) + end + + self.grid:setValues(inventory or { }) + end, + validate = function(self) + if self.form:save() then + nodeWizard.node.category = Util.find(nodeWizard.choices, 'value', nodeWizard.node.mtype).category + + nodeWizard.nodePages = { } + table.insert(nodeWizard.nodePages, nodeWizard.wizard.general) + for _, page in pairs(nodeWizard.wizard:getPages()) do + if not page.isValidFor or page:isValidFor(nodeWizard.node) then + table.insert(nodeWizard.nodePages, page) + if page.setNode then + page:setNode(nodeWizard.node) + end + end + end + table.insert(nodeWizard.nodePages, nodeWizard.wizard.confirmation) + return true + end + end, + }, + confirmation = UI.WizardPage { + title = 'Confirm changes', + index = 2, + notice = UI.TextArea { + x = 2, ex = -2, y = 2, ey = -2, + value = [[Press accept to save the changes. The settings will take effect immediately!]], - }, }, + isValidFor = function() + return false + end, }, }, statusBar = UI.StatusBar { @@ -255,6 +297,11 @@ The settings will take effect immediately!]], accelerators = { delete = 'remove_entry', }, + getDisplayValues = function(_, row) + row = Util.shallowCopy(row) + row.displayName = itemDB:getName(row) + return row + end, }, remove = UI.Button { x = -4, y = 4, @@ -291,143 +338,76 @@ The settings will take effect immediately!]], statusBar = UI.StatusBar { backgroundColor = 'primary', }, + show = function(self, entry, callback, whitelistOnly) + self.entry = entry + self.callback = callback + + if not self.entry.filter then + self.entry.filter = { } + end + + self.form:setValues(entry) + self:resetGrid() + + self.form[3].inactive = whitelistOnly + + UI.SlideOut.show(self) + self:setFocus(self.form.scan) + + Milo:pauseCrafting({ key = 'gridInUse', msg = 'Crafting paused' }) + end, + hide = function(self) + UI.SlideOut.hide(self) + Milo:resumeCrafting({ key = 'gridInUse' }) + end, + resetGrid = function(self) + local t = { } + for k in pairs(self.entry.filter) do + table.insert(t, itemDB:splitKey(k)) + end + self.grid:setValues(t) + end, + eventHandler = function(self, event) + if event.type == 'focus_change' then + self.statusBar:setStatus(event.focused.help) + + elseif event.type == 'scan_turtle' then + local inventory = Milo:getTurtleInventory() + for _,item in pairs(inventory) do + self.entry.filter[itemDB:makeKey(item)] = true + end + self:resetGrid() + self.grid:update() + self.grid:draw() + Milo:emptyInventory() + + elseif event.type == 'remove_entry' then + local row = self.grid:getSelected() + if row then + Util.removeByValue(self.grid.values, row) + self.grid:update() + self.grid:draw() + end + + elseif event.type == 'save' then + self.form:save() + self.entry.filter = { } + for _,v in pairs(self.grid.values) do + self.entry.filter[itemDB:makeKey(v)] = true + end + self:hide() + self.callback() + + elseif event.type == 'cancel' then + self:hide() + else + return UI.SlideOut.eventHandler(self, event) + end + return true + end, }, } ---[[ Filter slide out ]] -- -function nodeWizard.filter:show(entry, callback, whitelistOnly) - self.entry = entry - self.callback = callback - - if not self.entry.filter then - self.entry.filter = { } - end - - self.form:setValues(entry) - self:resetGrid() - - self.form[3].inactive = whitelistOnly - - UI.SlideOut.show(self) - self:setFocus(self.form.scan) - - Milo:pauseCrafting({ key = 'gridInUse', msg = 'Crafting paused' }) -end - -function nodeWizard.filter:hide() - UI.SlideOut.hide(self) - Milo:resumeCrafting({ key = 'gridInUse' }) -end - -function nodeWizard.filter:resetGrid() - local t = { } - for k in pairs(self.entry.filter) do - table.insert(t, itemDB:splitKey(k)) - end - self.grid:setValues(t) -end - -function nodeWizard.filter.grid:getDisplayValues(row) - row = Util.shallowCopy(row) - row.displayName = itemDB:getName(row) - return row -end - -function nodeWizard.filter:eventHandler(event) - if event.type == 'focus_change' then - self.statusBar:setStatus(event.focused.help) - - elseif event.type == 'scan_turtle' then - local inventory = Milo:getTurtleInventory() - for _,item in pairs(inventory) do - self.entry.filter[itemDB:makeKey(item)] = true - end - self:resetGrid() - self.grid:update() - self.grid:draw() - Milo:emptyInventory() - - elseif event.type == 'remove_entry' then - local row = self.grid:getSelected() - if row then - Util.removeByValue(self.grid.values, row) - self.grid:update() - self.grid:draw() - end - - elseif event.type == 'save' then - self.form:save() - self.entry.filter = { } - for _,v in pairs(self.grid.values) do - self.entry.filter[itemDB:makeKey(v)] = true - end - self:hide() - self.callback() - - elseif event.type == 'cancel' then - self:hide() - - else - return UI.SlideOut.eventHandler(self, event) - end - return true -end - ---[[ General Page ]] -- -function nodeWizard.wizard.pages.general:enable() - UI.WizardPage.enable(self) - self:focusFirst() -end - -function nodeWizard.wizard.pages.general:isValidFor() - return false -end - -function nodeWizard.wizard.pages.general:showInventory(node) - local inventory - - if device[node.name] and device[node.name].list then - pcall(function() - inventory = device[node.name].list() - for k,v in pairs(inventory) do - v.slot = k - end - end) - end - - self.grid:setValues(inventory or { }) -end - -function nodeWizard.wizard.pages.general.grid:getDisplayValues(row) - row = Util.shallowCopy(row) - row.displayName = itemDB:getName(row) - return row -end - -function nodeWizard.wizard.pages.general:validate() - if self.form:save() then - nodeWizard.node.category = Util.find(nodeWizard.choices, 'value', nodeWizard.node.mtype).category - - nodeWizard.nodePages = { } - table.insert(nodeWizard.nodePages, nodeWizard.wizard.pages.general) - for _, page in pairs(nodeWizard.wizard.pages) do - if not page.isValidFor or page:isValidFor(nodeWizard.node) then - table.insert(nodeWizard.nodePages, page) - if page.setNode then - page:setNode(nodeWizard.node) - end - end - end - table.insert(nodeWizard.nodePages, nodeWizard.wizard.pages.confirmation) - return true - end -end - ---[[ Confirmation ]]-- -function nodeWizard.wizard.pages.confirmation:isValidFor() - return false -end - --[[ Wizard ]] -- function nodeWizard:enable(node) local adapter = node.adapter @@ -440,7 +420,7 @@ function nodeWizard:enable(node) { name = 'Ignore', value = 'ignore', category = 'ignore' }, { name = 'Hidden', value = 'hidden', category = 'ignore', help = 'Do not show in list' }, } - for _, page in pairs(self.wizard.pages) do + for _, page in pairs(self.wizard:getPages()) do if page.isValidType then local choice = page:isValidType(self.node) if choice and not Util.find(self.choices, 'value', choice.value) then @@ -448,15 +428,15 @@ function nodeWizard:enable(node) end end end - self.wizard.pages.general.form[1].shadowText = self.node.name - self.wizard.pages.general.form[2].choices = self.choices - self.wizard.pages.general.form:setValues(self.node) + self.wizard.general.form[1].shadowText = self.node.name + self.wizard.general.form[2].choices = self.choices + self.wizard.general.form:setValues(self.node) - self.wizard.pages.general:showInventory(self.node) + self.wizard.general:showInventory(self.node) self.nodePages = { } - table.insert(self.nodePages, self.wizard.pages.general) - table.insert(self.nodePages, self.wizard.pages.confirmation) + table.insert(self.nodePages, self.wizard.general) + table.insert(self.nodePages, self.wizard.confirmation) UI.Page.enable(self) end diff --git a/milo/plugins/item/infoTab.lua b/milo/plugins/item/infoTab.lua index fb96fc1..6634948 100644 --- a/milo/plugins/item/infoTab.lua +++ b/milo/plugins/item/infoTab.lua @@ -2,7 +2,7 @@ local Ansi = require('opus.ansi') local UI = require('opus.ui') local infoTab = UI.Tab { - tabTitle = 'Info', + title = 'Info', index = 4, textArea = UI.TextArea { x = 2, ex = -2, y = 2, ey = -2, diff --git a/milo/plugins/item/machinesTab.lua b/milo/plugins/item/machinesTab.lua index 8f52595..4f4e7a7 100644 --- a/milo/plugins/item/machinesTab.lua +++ b/milo/plugins/item/machinesTab.lua @@ -7,7 +7,7 @@ local colors = _G.colors local context = Milo:getContext() local machinesTab = UI.Tab { - tabTitle = 'Machine', + title = 'Machine', index = 3, grid = UI.ScrollingGrid { x = 2, ex = -2, y = 2, ey = -2, diff --git a/milo/plugins/item/manageTab.lua b/milo/plugins/item/manageTab.lua index 2df0a13..e1f49fe 100644 --- a/milo/plugins/item/manageTab.lua +++ b/milo/plugins/item/manageTab.lua @@ -7,7 +7,7 @@ local Util = require('opus.util') local context = Milo:getContext() local manageTab = UI.Tab { - tabTitle = 'Manage', + title = 'Manage', index = 1, form = UI.Form { x = 1, ex = -1, ey = -1, diff --git a/milo/plugins/item/recipeTab.lua b/milo/plugins/item/recipeTab.lua index 93e321f..591715f 100644 --- a/milo/plugins/item/recipeTab.lua +++ b/milo/plugins/item/recipeTab.lua @@ -4,7 +4,7 @@ local Milo = require('milo') local UI = require('opus.ui') local recipeTab = UI.Tab { - tabTitle = 'Recipe', + title = 'Recipe', index = 2, grid = UI.ScrollingGrid { x = 2, ex = -2, y = 2, ey = -4, diff --git a/milo/plugins/item/resetTab.lua b/milo/plugins/item/resetTab.lua index 0d9d34d..217124b 100644 --- a/milo/plugins/item/resetTab.lua +++ b/milo/plugins/item/resetTab.lua @@ -7,7 +7,7 @@ local colors = _G.colors local context = Milo:getContext() local resetTab = UI.Tab { - tabTitle = 'Reset', + title = 'Reset', index = 5, noFill = true, textArea = UI.TextArea { diff --git a/milo/plugins/remote/autostore.lua b/milo/plugins/remote/autostore.lua index 0c7272b..e7315f2 100644 --- a/milo/plugins/remote/autostore.lua +++ b/milo/plugins/remote/autostore.lua @@ -23,7 +23,7 @@ local page = UI.Page { tabs = UI.Tabs { y = 2, ey = -2, inventory = UI.Tab { - tabTitle = 'Inventory', + title = 'Inventory', grid = UI.ScrollingGrid { y = 2, ey = -2, columns = { @@ -33,7 +33,7 @@ local page = UI.Page { }, }, autostore = UI.Tab { - tabTitle = 'Deposit', + title = 'Deposit', grid = UI.ScrollingGrid { y = 2, ey = -2, columns = { diff --git a/milo/plugins/statsView.lua b/milo/plugins/statsView.lua index b6ab90c..799c1a2 100644 --- a/milo/plugins/statsView.lua +++ b/milo/plugins/statsView.lua @@ -83,7 +83,7 @@ local function createPage(node) parent = monitor, tabs = UI.Tabs { [1] = UI.Tab { - tabTitle = 'Overview', + title = 'Overview', backgroundColor = colors.black, noFill = true, onlineLabel = UI.Text { @@ -135,14 +135,14 @@ local function createPage(node) }, }, [2] = UI.Tab { - tabTitle = 'Stats', + title = 'Stats', noFill = true, textArea = UI.TextArea { y = 3, }, }, [3] = UI.Tab { - tabTitle = 'Storage', + title = 'Storage', noFill = true, grid = UI.ScrollingGrid { y = 2, @@ -157,7 +157,7 @@ local function createPage(node) }, }, [4] = UI.Tab { - tabTitle = 'Offline', + title = 'Offline', noFill = true, grid = UI.ScrollingGrid { y = 2, @@ -168,14 +168,14 @@ local function createPage(node) }, }, [5] = UI.Tab { - tabTitle = 'Activity', + title = 'Activity', noFill = true, term = UI.Embedded { --visible = true, }, }, [6] = UI.Tab { - tabTitle = 'Tasks', + title = 'Tasks', noFill = true, grid = UI.ScrollingGrid { y = 2, @@ -449,7 +449,7 @@ Unlocked Slots : %d of %d (%d%%) function page:eventHandler(event) if event.type == 'tab_activate' then local state = Milo:getState('statusState') or { } - state[node.name] = event.activated.tabTitle + state[node.name] = event.activated.title Milo:setState('statusState', state) end return UI.Page.eventHandler(self, event) @@ -472,7 +472,7 @@ Unlocked Slots : %d of %d (%d%%) -- restore active tab local tabState = Milo:getState('statusState') or { } if tabState[node.name] then - page.tabs:selectTab(Util.find(page.tabs, 'tabTitle', tabState[node.name])) + page.tabs:selectTab(Util.find(page.tabs, 'title', tabState[node.name])) end return page diff --git a/neural/Sensor.lua b/neural/Sensor.lua index 42d0b9a..dbd3c98 100644 --- a/neural/Sensor.lua +++ b/neural/Sensor.lua @@ -23,7 +23,7 @@ local config = Config.load('Sensor') local page = UI.Page { tabs = UI.Tabs { listing = UI.Tab { - tabTitle = 'Listing', + title = 'Listing', grid = UI.ScrollingGrid { columns = { { heading = 'Name', key = 'displayName' }, @@ -35,7 +35,7 @@ local page = UI.Page { }, }, summary = UI.Tab { - tabTitle = 'Summary', + title = 'Summary', grid = UI.ScrollingGrid { columns = { { heading = 'Name', key = 'displayName' }, @@ -256,7 +256,7 @@ function page:eventHandler(event) UI:quit() elseif event.type == 'tab_activate' then - config.activeTab = event.activated.tabTitle + config.activeTab = event.activated.title Config.update('Sensor', config) end @@ -264,7 +264,7 @@ function page:eventHandler(event) end if config.activeTab then - page.tabs:selectTab(Util.find(page.tabs.children, 'tabTitle', config.activeTab)) + page.tabs:selectTab(Util.find(page.tabs.children, 'title', config.activeTab)) end UI:setPage(page) diff --git a/screenSaver/system/saver.lua b/screenSaver/system/saver.lua index 7391f2d..6bf0408 100644 --- a/screenSaver/system/saver.lua +++ b/screenSaver/system/saver.lua @@ -7,7 +7,7 @@ local config = Config.load('saver', { }) return UI.Tab { - tabTitle = 'Screen Saver', + title = 'Screen Saver', description = 'Screen saver', [1] = UI.Window { x = 2, y = 2, ex = -2, ey = 5, diff --git a/secure/system/secure.lua b/secure/system/secure.lua index 9fd0137..05f1e18 100644 --- a/secure/system/secure.lua +++ b/secure/system/secure.lua @@ -7,7 +7,7 @@ local config = Config.load('secure', { }) local tab = UI.Tab { - tabTitle = 'Secure', + title = 'Secure', description = 'Secure options', [1] = UI.Window { x = 2, y = 2, ex = -2, ey = 5, diff --git a/shellex/apis/transfer.lua b/shellex/apis/transfer.lua index aeb781a..d29b730 100644 --- a/shellex/apis/transfer.lua +++ b/shellex/apis/transfer.lua @@ -172,7 +172,7 @@ function lib.recurse(fromPath, toPath, options, origin, top) end end if mv then - if fs.list(toReal)() then -- to is NOT empty + if fs.exists(toPath) then -- to is NOT empty return nil, "cannot move '" .. fromPath .. "' to '" .. toPath .. "': Directory not empty" end status(verbose, fromPath, toPath) diff --git a/swshop/shopTab.lua b/swshop/shopTab.lua index f731ebf..f098574 100644 --- a/swshop/shopTab.lua +++ b/swshop/shopTab.lua @@ -7,7 +7,7 @@ local os = _G.os local config = Config.load('shop') local shopTab = UI.Tab { - tabTitle = 'Store', + title = 'Store', index = 2, form = UI.Form { x = 2, ex = -2, y = 2, ey = -2, diff --git a/turtle/system/turtle.lua b/turtle/system/turtle.lua index a144205..172d32d 100644 --- a/turtle/system/turtle.lua +++ b/turtle/system/turtle.lua @@ -9,7 +9,7 @@ if turtle then local config = Config.load('gps') local gpsTab = UI.Tab { - tabTitle = 'Home', + title = 'Home', description = 'Turtle home location', labelText = UI.Text { x = 3, ex = -3, y = 2,