diff --git a/sys/apps/Lua.lua b/sys/apps/Lua.lua index 3ddcc17..8063b11 100644 --- a/sys/apps/Lua.lua +++ b/sys/apps/Lua.lua @@ -58,10 +58,16 @@ local page = UI.Page { }, [2] = UI.Tab { tabTitle = 'Output', + backgroundColor = colors.black, output = UI.Embedded { + y = 2, maxScroll = 1000, backgroundColor = colors.black, }, + draw = function(self) + self:write(1, 1, string.rep('\131', self.width), colors.black, UI.colors.primary) + self:drawChildren() + end, }, }, } diff --git a/sys/apps/Network.lua b/sys/apps/Network.lua index d8db622..215967d 100644 --- a/sys/apps/Network.lua +++ b/sys/apps/Network.lua @@ -56,6 +56,31 @@ local page = UI.Page { columns = gridColumns, sortColumn = 'label', autospace = true, + getRowTextColor = function(self, row, selected) + if not row.active then + return colors.lightGray + end + return UI.Grid.getRowTextColor(self, row, selected) + end, + getDisplayValues = function(_, row) + row = Util.shallowCopy(row) + if row.uptime then + if row.uptime < 60 then + row.uptime = string.format("%ds", math.floor(row.uptime)) + elseif row.uptime < 3600 then + row.uptime = string.format("%sm", math.floor(row.uptime / 60)) + else + row.uptime = string.format("%sh", math.floor(row.uptime / 3600)) + end + end + if row.fuel then + row.fuel = row.fuel > 0 and Util.toBytes(row.fuel) or '' + end + if row.distance then + row.distance = Util.toBytes(Util.round(row.distance, 1)) + end + return row + end, }, ports = UI.SlideOut { titleBar = UI.TitleBar { @@ -72,6 +97,12 @@ local page = UI.Page { sortColumn = 'port', autospace = true, }, + eventHandler = function(self, event) + if event.type == 'grid_select' then + shell.openForegroundTab('Sniff ' .. event.selected.port) + end + return UI.SlideOut.eventHandler(self, event) + end, }, help = UI.SlideOut { x = 5, ex = -5, height = 8, y = -8, @@ -125,13 +156,6 @@ local function sendCommand(host, command) end end -function page.ports:eventHandler(event) - if event.type == 'grid_select' then - shell.openForegroundTab('Sniff ' .. event.selected.port) - end - return UI.SlideOut.eventHandler(self, event) -end - function page.ports.grid:update() local transport = network:getTransport() @@ -241,33 +265,6 @@ function page.menuBar:getActive(menuItem) return menuItem.noCheck or not not t end -function page.grid:getRowTextColor(row, selected) - if not row.active then - return colors.lightGray - end - return UI.Grid.getRowTextColor(self, row, selected) -end - -function page.grid:getDisplayValues(row) - row = Util.shallowCopy(row) - if row.uptime then - if row.uptime < 60 then - row.uptime = string.format("%ds", math.floor(row.uptime)) - elseif row.uptime < 3600 then - row.uptime = string.format("%sm", math.floor(row.uptime / 60)) - else - row.uptime = string.format("%sh", math.floor(row.uptime / 3600)) - end - end - if row.fuel then - row.fuel = row.fuel > 0 and Util.toBytes(row.fuel) or '' - end - if row.distance then - row.distance = Util.toBytes(Util.round(row.distance, 1)) - end - return row -end - Event.onInterval(1, function() page.grid:update() page.grid:draw() diff --git a/sys/apps/Overview.lua b/sys/apps/Overview.lua index 222ae84..05c1ede 100644 --- a/sys/apps/Overview.lua +++ b/sys/apps/Overview.lua @@ -102,20 +102,18 @@ local page = UI.Page { }, tray = UI.Window { y = -1, width = 8, - backgroundColor = colors.lightGray, - newApp = UI.Button { + backgroundColor = UI.colors.tertiary, + newApp = UI.FlatButton { + x = 2, text = '+', event = 'new', - backgroundFocusColor = colors.lightGray, }, - mode = UI.Button { - x = 3, + mode = UI.FlatButton { + x = 4, text = '=', event = 'display_mode', - backgroundFocusColor = colors.lightGray, }, - help = UI.Button { - x = 5, + help = UI.FlatButton { + x = 6, text = '?', event = 'help', - backgroundFocusColor = colors.lightGray, }, }, editor = UI.SlideOut { diff --git a/sys/apps/fileui.lua b/sys/apps/fileui.lua index f5b1a54..1f95f5e 100644 --- a/sys/apps/fileui.lua +++ b/sys/apps/fileui.lua @@ -2,8 +2,9 @@ local UI = require('opus.ui') local Util = require('opus.util') local shell = _ENV.shell +local multishell = _ENV.multishell --- fileui [--path=path] [--exec=filename] +-- fileui [--path=path] [--exec=filename] [--title=title] local page = UI.Page { fileselect = UI.FileSelect { }, @@ -22,6 +23,10 @@ local page = UI.Page { local _, args = Util.parse(...) +if args.title and multishell then + multishell.setTitle(multishell.getCurrent(), args.title) +end + UI:setPage(page, args.path) UI:start() UI.term:setCursorBlink(false) @@ -31,5 +36,4 @@ if args.exec and page.selected then return end --- print('selected: ' .. tostring(selected)) return page.selected diff --git a/sys/apps/system/shell.lua b/sys/apps/system/shell.lua index c0aa8ff..8ca32fe 100644 --- a/sys/apps/system/shell.lua +++ b/sys/apps/system/shell.lua @@ -28,7 +28,7 @@ local defaults = { local _colors = config.color or Util.shallowCopy(defaults) local allSettings = { } -for k, v in pairs(defaults) do +for k in pairs(defaults) do table.insert(allSettings, { name = k }) end @@ -112,7 +112,7 @@ return UI.Tab { self.grid2:draw() elseif event.type == 'grid_select' and event.element == self.grid2 then - _colors[tab.grid1:getSelected().name] = event.selected.value + _colors[self.grid1:getSelected().name] = event.selected.value self.display:draw() self.grid2:draw() diff --git a/sys/apps/system/theme.lua b/sys/apps/system/theme.lua new file mode 100644 index 0000000..b9d4ed4 --- /dev/null +++ b/sys/apps/system/theme.lua @@ -0,0 +1,89 @@ +local Config = require('opus.config') +local UI = require('opus.ui') +local Util = require('opus.util') + +local colors = _G.colors + +local allColors = { } +for k,v in pairs(colors) do + if type(v) == 'number' then + table.insert(allColors, { name = k, value = v }) + end +end + +local allSettings = { } +for k,v in pairs(UI.colors) do + allSettings[k] = { name = k, value = v } +end + +return UI.Tab { + tabTitle = 'Theme', + description = 'Theme colors', + grid1 = UI.ScrollingGrid { + y = 2, ey = -10, x = 2, ex = -17, + disableHeader = true, + columns = { { key = 'name' } }, + values = allSettings, + sortColumn = 'name', + }, + grid2 = UI.ScrollingGrid { + y = 2, ey = -10, x = -14, ex = -2, + disableHeader = true, + columns = { { key = 'name' } }, + values = allColors, + sortColumn = 'name', + getRowTextColor = function(self, row) + local selected = self.parent.grid1:getSelected() + if selected.value == row.value then + return colors.yellow + end + return UI.Grid.getRowTextColor(self, row) + end + }, + button = UI.Button { + x = -9, y = -2, + text = 'Update', + event = 'update', + }, + display = UI.Window { + x = 2, ex = -2, y = -8, height = 5, + textColor = colors.black, + backgroundColor = colors.black, + draw = function(self) + self:clear() + + self:write(1, 1, Util.widthify(' Local Global Device', self.width), + allSettings.secondary.value) + + self:write(2, 2, 'enter command ', + colors.black, colors.gray) + + self:write(1, 3, ' Formatted ', + allSettings.primary.value) + + self:write(12, 3, Util.widthify(' Output ', self.width - 11), + allSettings.tertiary.value) + + self:write(1, 4, Util.widthify(' Key', self.width), + allSettings.primary.value) + end, + }, + eventHandler = function(self, event) + if event.type == 'grid_focus_row' and event.element == self.grid1 then + self.grid2:draw() + + elseif event.type == 'grid_select' and event.element == self.grid2 then + self.grid1:getSelected().value = event.selected.value + self.display:draw() + self.grid2:draw() + + elseif event.type == 'update' then + local config = Config.load('ui.theme', { colors = { } }) + for k,v in pairs(allSettings) do + config.colors[k] = v.value + end + Config.update('ui.theme', config) + end + return UI.Tab.eventHandler(self, event) + end +} diff --git a/sys/modules/opus/input.lua b/sys/modules/opus/input.lua index 95298ef..956e0ba 100644 --- a/sys/modules/opus/input.lua +++ b/sys/modules/opus/input.lua @@ -165,7 +165,7 @@ function input:translate(event, code, p1, p2) self.mch = 'mouse_up' self.mfired = input:toCode(self.mch, 255) end - _syslog(self.mfired) + return { code = self.mfired, button = code, diff --git a/sys/modules/opus/ui.lua b/sys/modules/opus/ui.lua index 3a1657e..93a3837 100644 --- a/sys/modules/opus/ui.lua +++ b/sys/modules/opus/ui.lua @@ -209,6 +209,15 @@ end function Manager:generateTheme(filename) local t = { } + + local function getName(d) + for c, n in pairs(colors) do + if n == d then + return 'colors.' .. c + end + end + end + for k,v in pairs(self) do if type(v) == 'table' then if v._preload then @@ -221,17 +230,17 @@ function Manager:generateTheme(filename) if not t[k] then t[k] = { } end - for c, n in pairs(colors) do - if n == d then - t[k][p] = 'colors.' .. c - break - end - end + t[k][p] = getName(d) end end end end end + t.colors = { + primary = getName(self.colors.primary), + secondary = getName(self.colors.secondary), + tertiary = getName(self.colors.tertiary), + } Util.writeFile(filename, textutils.serialize(t):gsub('(")', '')) end @@ -409,8 +418,8 @@ end Manager.colors = { primary = colors.cyan, - secondary = colors.blue, - tertiary = colors.blue, + secondary = colors.lightGray, + tertiary = colors.gray, } Manager.exitPullEvents = Event.exitPullEvents @@ -652,7 +661,7 @@ function UI.Window:setCursorPos(x, y) end function UI.Window:setCursorBlink(blink) - self.parent:setCursorBlink(blink) + self.cursorBlink = blink end UI.Window.docs.draw = [[draw(VOID) @@ -1072,7 +1081,6 @@ end function UI.Device:setCursorBlink(blink) self.cursorBlink = blink - self.device.setCursorBlink(blink) end function UI.Device:setTextScale(textScale) @@ -1130,9 +1138,7 @@ function UI.Device:sync() local transitions = self.effectsEnabled and self.transitions self.transitions = nil - if self:getCursorBlink() then - self.device.setCursorBlink(false) - end + self.device.setCursorBlink(false) if transitions then self:runTransitions(transitions) @@ -1182,6 +1188,7 @@ end loadComponents() UI:loadTheme('usr/config/ui.theme') Util.merge(UI.Window.defaults, UI.theme.Window) +Util.merge(UI.colors, UI.theme.colors) UI:setDefaultDevice(UI.Device({ device = term.current() })) return UI diff --git a/sys/modules/opus/ui/components/Embedded.lua b/sys/modules/opus/ui/components/Embedded.lua index 03a4c88..d530e33 100644 --- a/sys/modules/opus/ui/components/Embedded.lua +++ b/sys/modules/opus/ui/components/Embedded.lua @@ -21,6 +21,9 @@ function UI.Embedded:layout() if not self.win then function self.render() self:sync() + if self.focused then + self:setCursorPos(self.win.getCursorPos()) + end end self.win = Terminal.window(UI.term.device, self.x, self.y, self.width, self.height, false) self.win.canvas = self @@ -38,6 +41,9 @@ end function UI.Embedded:focus() -- allow scrolling + if self.focused then + self:setCursorBlink(self.win.getCursorBlink()) + end end function UI.Embedded:enable() @@ -67,6 +73,7 @@ function UI.Embedded.example() local term = _G.term return UI.Embedded { + y = 2, x = 2, ex = -2, ey = -2, enable = function (self) UI.Embedded.enable(self) Event.addRoutine(function() @@ -75,10 +82,11 @@ function UI.Embedded.example() term.redirect(oterm) end) end, - eventHandler = function(_, event) + eventHandler = function(self, event) if event.type == 'key' then return true end + return UI.Embedded.eventHandler(self, event) end } end diff --git a/sys/modules/opus/ui/components/FlatButton.lua b/sys/modules/opus/ui/components/FlatButton.lua new file mode 100644 index 0000000..222b001 --- /dev/null +++ b/sys/modules/opus/ui/components/FlatButton.lua @@ -0,0 +1,18 @@ +local class = require('opus.class') +local UI = require('opus.ui') + +local colors = _G.colors + +UI.FlatButton = class(UI.Button) +UI.FlatButton.defaults = { + UIElement = 'FlatButton', + textColor = colors.black, + textFocusColor = colors.white, + noPadding = true, +} +function UI.FlatButton:setParent() + self.backgroundColor = self.parent:getProperty('backgroundColor') + self.backgroundFocusColor = self.backgroundColor + + UI.Button.setParent(self) +end diff --git a/sys/modules/opus/ui/components/Grid.lua b/sys/modules/opus/ui/components/Grid.lua index 49780eb..313bb67 100644 --- a/sys/modules/opus/ui/components/Grid.lua +++ b/sys/modules/opus/ui/components/Grid.lua @@ -60,7 +60,7 @@ UI.Grid.defaults = { textSelectedColor = colors.white, backgroundColor = colors.black, backgroundSelectedColor = colors.gray, - headerBackgroundColor = UI.colors.tertiary, + headerBackgroundColor = UI.colors.primary, headerTextColor = colors.white, headerSortColor = colors.yellow, unfocusedTextSelectedColor = colors.white, diff --git a/sys/modules/opus/ui/components/MenuBar.lua b/sys/modules/opus/ui/components/MenuBar.lua index 8f7ef44..663886e 100644 --- a/sys/modules/opus/ui/components/MenuBar.lua +++ b/sys/modules/opus/ui/components/MenuBar.lua @@ -8,7 +8,7 @@ UI.MenuBar.defaults = { UIElement = 'MenuBar', buttons = { }, height = 1, - backgroundColor = colors.lightGray, + backgroundColor = UI.colors.secondary, textColor = colors.black, spacing = 2, lastx = 1, diff --git a/sys/modules/opus/ui/components/MenuItem.lua b/sys/modules/opus/ui/components/MenuItem.lua index 57f3b31..b43f4c0 100644 --- a/sys/modules/opus/ui/components/MenuItem.lua +++ b/sys/modules/opus/ui/components/MenuItem.lua @@ -1,11 +1,8 @@ local class = require('opus.class') local UI = require('opus.ui') -local colors = _G.colors - -UI.MenuItem = class(UI.Button) +UI.MenuItem = class(UI.FlatButton) UI.MenuItem.defaults = { UIElement = 'MenuItem', - textFocusColor = colors.white, - backgroundFocusColor = colors.lightGray, + noPadding = false, } diff --git a/sys/modules/opus/ui/components/Page.lua b/sys/modules/opus/ui/components/Page.lua index 1a647c4..a7e38ce 100644 --- a/sys/modules/opus/ui/components/Page.lua +++ b/sys/modules/opus/ui/components/Page.lua @@ -24,17 +24,10 @@ function UI.Page:postInit() self.__target = self end -function UI.Page:enable() - UI.Window.enable(self) - - if not self.focused or not self.focused.enabled then - self:focusFirst() - end -end - function UI.Page:sync() if self.enabled then self:checkFocus() + self.parent:setCursorBlink(self.focused and self.focused.cursorBlink) self.parent:sync() end end @@ -137,15 +130,7 @@ end function UI.Page:checkFocus() if not self.focused or not self.focused.enabled then - local el = self.__target - while el do - local focusables = el:getFocusables() - if focusables[1] then - self:setFocus(focusables[1]) - break - end - el = el.parent - end + self.__target:focusFirst() end end diff --git a/sys/modules/opus/ui/components/TabBar.lua b/sys/modules/opus/ui/components/TabBar.lua index 27f7e59..a82fdfd 100644 --- a/sys/modules/opus/ui/components/TabBar.lua +++ b/sys/modules/opus/ui/components/TabBar.lua @@ -2,14 +2,13 @@ local class = require('opus.class') local UI = require('opus.ui') local Util = require('opus.util') -local colors = _G.colors - UI.TabBar = class(UI.MenuBar) UI.TabBar.defaults = { UIElement = 'TabBar', buttonClass = 'TabBarMenuItem', - selectedBackgroundColor = UI.colors.secondary, - unselectedBackgroundColor = colors.lightGray, + backgroundColor = UI.colors.tertiary, + selectedBackgroundColor = UI.colors.primary, + unselectedBackgroundColor = UI.colors.tertiary, } function UI.TabBar:enable() UI.MenuBar.enable(self) diff --git a/sys/modules/opus/ui/components/TextEntry.lua b/sys/modules/opus/ui/components/TextEntry.lua index e638338..0af4499 100644 --- a/sys/modules/opus/ui/components/TextEntry.lua +++ b/sys/modules/opus/ui/components/TextEntry.lua @@ -28,6 +28,7 @@ UI.TextEntry.defaults = { backgroundFocusColor = colors.black, --lightGray, height = 1, limit = 6, + cursorBlink = true, accelerators = { [ 'control-c' ] = 'copy', } @@ -114,11 +115,6 @@ end function UI.TextEntry:focus() self:draw() - if self.focused then - self:setCursorBlink(true) - else - self:setCursorBlink(false) - end end function UI.TextEntry:eventHandler(event)