local UI = require('opus.ui') local settings = _G.settings local transform = { string = tostring, number = tonumber, } return settings and UI.Tab { tabTitle = 'Settings', description = 'Computercraft settings', grid = UI.Grid { x = 2, y = 2, ex = -2, ey = -2, sortColumn = 'name', columns = { { heading = 'Setting', key = 'name' }, { heading = 'Value', key = 'value' }, }, }, editor = UI.SlideOut { y = -6, height = 6, titleBar = UI.TitleBar { event = 'slide_hide', title = 'Enter value', }, form = UI.Form { y = 2, value = UI.TextEntry { limit = 256, formIndex = 1, formLabel = 'Value', formKey = 'value', }, validateField = function(self, entry) if entry.value then return transform[self.type](entry.value) end return true end, }, accelerators = { form_cancel = 'slide_hide', }, show = function(self, entry) self.form.type = type(entry.value) or 'string' self.form:setValues(entry) self.titleBar.title = entry.name UI.SlideOut.show(self) end, eventHandler = function(self, event) if event.type == 'form_complete' then if not event.values.value then settings.unset(event.values.name) self.parent:reload() else event.values.value = transform[self.form.type](event.values.value) settings.set(event.values.name, event.values.value) end self.parent.grid:draw() self:hide() settings.save('.settings') end return UI.SlideOut.eventHandler(self, event) end, }, reload = function(self) local values = { } for _,v in pairs(settings.getNames()) do table.insert(values, { name = v, value = settings.get(v) or false, }) end self.grid:setValues(values) self.grid:setIndex(1) end, enable = function(self) self:reload() UI.Tab.enable(self) end, eventHandler = function(self, event) if event.type == 'grid_select' then if type(event.selected.value) == 'boolean' then event.selected.value = not event.selected.value settings.set(event.selected.name, event.selected.value) settings.save('.settings') self.grid:draw() else self.editor:show(event.selected) end return true end end, }