mirror of
https://github.com/kepler155c/opus
synced 2025-01-22 21:26:53 +00:00
Merge branch 'develop'
This commit is contained in:
commit
1d915ed928
@ -261,6 +261,13 @@ function page:eventHandler(event)
|
|||||||
event.focused.parent:scrollIntoView()
|
event.focused.parent:scrollIntoView()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
elseif event.type == 'tab_change' then
|
||||||
|
if event.current > event.last then
|
||||||
|
self.container:setTransition('left')
|
||||||
|
else
|
||||||
|
self.container:setTransition('right')
|
||||||
|
end
|
||||||
|
|
||||||
elseif event.type == 'refresh' then
|
elseif event.type == 'refresh' then
|
||||||
applications = { }
|
applications = { }
|
||||||
Config.load('apps', applications)
|
Config.load('apps', applications)
|
||||||
|
@ -6,23 +6,23 @@ local UI = require('ui')
|
|||||||
multishell.setTitle(multishell.getCurrent(), 'Devices')
|
multishell.setTitle(multishell.getCurrent(), 'Devices')
|
||||||
|
|
||||||
--[[ -- PeripheralsPage -- ]] --
|
--[[ -- PeripheralsPage -- ]] --
|
||||||
local peripheralsPage = UI.Page({
|
local peripheralsPage = UI.Page {
|
||||||
grid = UI.ScrollingGrid({
|
grid = UI.ScrollingGrid {
|
||||||
columns = {
|
columns = {
|
||||||
{ heading = 'Type', key = 'type' },
|
{ heading = 'Type', key = 'type' },
|
||||||
{ heading = 'Side', key = 'side' }
|
{ heading = 'Side', key = 'side' },
|
||||||
},
|
},
|
||||||
sortColumn = 'type',
|
sortColumn = 'type',
|
||||||
height = UI.term.height - 1,
|
height = UI.term.height - 1,
|
||||||
autospace = true,
|
autospace = true,
|
||||||
}),
|
},
|
||||||
statusBar = UI.StatusBar({
|
statusBar = UI.StatusBar {
|
||||||
status = 'Select peripheral'
|
status = 'Select peripheral'
|
||||||
}),
|
},
|
||||||
accelerators = {
|
accelerators = {
|
||||||
q = 'quit',
|
q = 'quit',
|
||||||
},
|
},
|
||||||
})
|
}
|
||||||
|
|
||||||
function peripheralsPage.grid:draw()
|
function peripheralsPage.grid:draw()
|
||||||
local sides = peripheral.getNames()
|
local sides = peripheral.getNames()
|
||||||
@ -40,7 +40,6 @@ function peripheralsPage.grid:draw()
|
|||||||
end
|
end
|
||||||
|
|
||||||
function peripheralsPage:updatePeripherals()
|
function peripheralsPage:updatePeripherals()
|
||||||
|
|
||||||
if UI:getCurrentPage() == self then
|
if UI:getCurrentPage() == self then
|
||||||
self.grid:draw()
|
self.grid:draw()
|
||||||
self:sync()
|
self:sync()
|
||||||
@ -59,29 +58,27 @@ function peripheralsPage:eventHandler(event)
|
|||||||
end
|
end
|
||||||
|
|
||||||
--[[ -- MethodsPage -- ]] --
|
--[[ -- MethodsPage -- ]] --
|
||||||
local methodsPage = UI.Page({
|
local methodsPage = UI.Page {
|
||||||
grid = UI.ScrollingGrid({
|
grid = UI.ScrollingGrid {
|
||||||
columns = {
|
columns = {
|
||||||
{ heading = 'Name', key = 'name', width = UI.term.width }
|
{ heading = 'Name', key = 'name', width = UI.term.width }
|
||||||
},
|
},
|
||||||
sortColumn = 'name',
|
sortColumn = 'name',
|
||||||
height = 7,
|
height = 7,
|
||||||
}),
|
},
|
||||||
container = UI.Window({
|
viewportConsole = UI.ViewportWindow {
|
||||||
y = 8,
|
y = 8,
|
||||||
height = UI.term.height-8,
|
height = UI.term.height - 8,
|
||||||
viewportConsole = UI.ViewportWindow({
|
backgroundColor = colors.brown,
|
||||||
backgroundColor = colors.brown
|
},
|
||||||
}),
|
statusBar = UI.StatusBar {
|
||||||
}),
|
|
||||||
statusBar = UI.StatusBar({
|
|
||||||
status = 'q to return',
|
status = 'q to return',
|
||||||
}),
|
},
|
||||||
accelerators = {
|
accelerators = {
|
||||||
q = 'back',
|
q = 'back',
|
||||||
backspace = 'back',
|
backspace = 'back',
|
||||||
},
|
},
|
||||||
})
|
}
|
||||||
|
|
||||||
function methodsPage:enable(p)
|
function methodsPage:enable(p)
|
||||||
|
|
||||||
@ -103,6 +100,8 @@ function methodsPage:enable(p)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
self.viewportConsole.offy = 0
|
||||||
|
|
||||||
self.grid:update()
|
self.grid:update()
|
||||||
self.grid:setIndex(1)
|
self.grid:setIndex(1)
|
||||||
|
|
||||||
@ -110,31 +109,26 @@ function methodsPage:enable(p)
|
|||||||
UI.Page.enable(self)
|
UI.Page.enable(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
function methodsPage.container.viewportConsole:draw()
|
|
||||||
if methodsPage.grid:getSelected() then
|
|
||||||
methodsPage:drawMethodInfo(self, methodsPage.grid:getSelected())
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function methodsPage:eventHandler(event)
|
function methodsPage:eventHandler(event)
|
||||||
if event.type == 'back' then
|
if event.type == 'back' then
|
||||||
UI:setPage(peripheralsPage)
|
UI:setPage(peripheralsPage)
|
||||||
return true
|
return true
|
||||||
elseif event.type == 'grid_focus_row' then
|
elseif event.type == 'grid_focus_row' then
|
||||||
self.container.viewportConsole.height = 1
|
self.viewportConsole.offy = 0
|
||||||
self.container.viewportConsole.offset = 0
|
self.viewportConsole:draw()
|
||||||
self.container.viewportConsole.y = 1
|
|
||||||
self:drawMethodInfo(self.container.viewportConsole, event.selected)
|
|
||||||
end
|
end
|
||||||
return UI.Page.eventHandler(self, event)
|
return UI.Page.eventHandler(self, event)
|
||||||
end
|
end
|
||||||
|
|
||||||
function methodsPage:drawMethodInfo(c, method)
|
function methodsPage.viewportConsole:draw()
|
||||||
|
local c = self
|
||||||
|
local method = methodsPage.grid:getSelected()
|
||||||
|
|
||||||
c:clear()
|
c:clear()
|
||||||
c:setCursorPos(1, 1)
|
c:setCursorPos(1, 1)
|
||||||
|
|
||||||
if method.noext then
|
if method.noext then
|
||||||
|
c.cursorY = 2
|
||||||
c:print('No extended Information')
|
c:print('No extended Information')
|
||||||
return 2
|
return 2
|
||||||
end
|
end
|
||||||
@ -189,10 +183,7 @@ function methodsPage:drawMethodInfo(c, method)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
c.height = c.cursorY + 1
|
c.ymax = c.cursorY + 1
|
||||||
|
|
||||||
term.setBackgroundColor(colors.black)
|
|
||||||
return y
|
|
||||||
end
|
end
|
||||||
|
|
||||||
Event.addHandler('peripheral', function()
|
Event.addHandler('peripheral', function()
|
||||||
|
@ -11,73 +11,79 @@ local env = {
|
|||||||
aliases = shell.aliases(),
|
aliases = shell.aliases(),
|
||||||
lua_path = LUA_PATH,
|
lua_path = LUA_PATH,
|
||||||
}
|
}
|
||||||
|
|
||||||
Config.load('multishell', env)
|
Config.load('multishell', env)
|
||||||
|
|
||||||
UI.TextEntry.defaults.backgroundFocusColor = colors.black
|
UI.TextEntry.defaults.backgroundFocusColor = colors.black
|
||||||
|
|
||||||
local systemPage = UI.Page({
|
local systemPage = UI.Page {
|
||||||
backgroundColor = colors.blue,
|
backgroundColor = colors.blue,
|
||||||
tabs = UI.Tabs({
|
tabs = UI.Tabs {
|
||||||
pathTab = UI.Window({
|
pathTab = UI.Window {
|
||||||
tabTitle = 'Path',
|
tabTitle = 'Path',
|
||||||
entry = UI.TextEntry({
|
entry = UI.TextEntry {
|
||||||
y = 2, x = 2, limit = 256,
|
x = 2, y = 2, rex = -2,
|
||||||
width = UI.term.width - 2,
|
limit = 256,
|
||||||
value = shell.path(),
|
value = shell.path(),
|
||||||
shadowText = 'enter system path',
|
shadowText = 'enter system path',
|
||||||
accelerators = {
|
accelerators = {
|
||||||
enter = 'update_path',
|
enter = 'update_path',
|
||||||
},
|
},
|
||||||
}),
|
},
|
||||||
grid = UI.Grid({
|
grid = UI.Grid {
|
||||||
y = 4,
|
y = 4,
|
||||||
values = paths,
|
values = paths,
|
||||||
disableHeader = true,
|
disableHeader = true,
|
||||||
columns = { { key = 'value' } },
|
columns = { { key = 'value' } },
|
||||||
autospace = true,
|
autospace = true,
|
||||||
}),
|
},
|
||||||
}),
|
},
|
||||||
|
|
||||||
aliasTab = UI.Window({
|
aliasTab = UI.Window {
|
||||||
tabTitle = 'Aliases',
|
tabTitle = 'Aliases',
|
||||||
alias = UI.TextEntry({
|
alias = UI.TextEntry {
|
||||||
y = 2, x = 2, width = UI.term.width - 2,
|
x = 2, y = 2, rex = -2,
|
||||||
limit = 32,
|
limit = 32,
|
||||||
shadowText = 'Alias',
|
shadowText = 'Alias',
|
||||||
}),
|
},
|
||||||
path = UI.TextEntry({
|
path = UI.TextEntry {
|
||||||
y = 3, x = 2, width = UI.term.width - 2, limit = 256,
|
y = 3, x = 2, rex = -2,
|
||||||
|
limit = 256,
|
||||||
shadowText = 'Program path',
|
shadowText = 'Program path',
|
||||||
accelerators = {
|
accelerators = {
|
||||||
enter = 'new_alias',
|
enter = 'new_alias',
|
||||||
},
|
},
|
||||||
}),
|
},
|
||||||
grid = UI.Grid({
|
grid = UI.Grid {
|
||||||
y = 5, values = aliases, autospace = true,
|
y = 5,
|
||||||
|
values = aliases,
|
||||||
|
autospace = true,
|
||||||
|
sortColumn = 'alias',
|
||||||
columns = {
|
columns = {
|
||||||
{ heading = 'Alias', key = 'alias' },
|
{ heading = 'Alias', key = 'alias' },
|
||||||
{ heading = 'Program', key = 'path' },
|
{ heading = 'Program', key = 'path' },
|
||||||
},
|
},
|
||||||
sortColumn = 'alias',
|
|
||||||
accelerators = {
|
accelerators = {
|
||||||
delete = 'delete_alias',
|
delete = 'delete_alias',
|
||||||
},
|
},
|
||||||
}),
|
},
|
||||||
}),
|
},
|
||||||
|
|
||||||
infoTab = UI.Window({
|
infoTab = UI.Window {
|
||||||
tabTitle = 'Info',
|
tabTitle = 'Info',
|
||||||
labelText = UI.Text({ y = 2, x = 3, value = 'Label' }),
|
labelText = UI.Text {
|
||||||
label = UI.TextEntry({
|
x = 3, y = 2,
|
||||||
y = 2, x = 9, width = UI.term.width - 12,
|
value = 'Label'
|
||||||
limit = 32, value = os.getComputerLabel(),
|
},
|
||||||
|
label = UI.TextEntry {
|
||||||
|
x = 9, y = 2, rex = -12,
|
||||||
|
limit = 32,
|
||||||
|
value = os.getComputerLabel(),
|
||||||
backgroundFocusColor = colors.black,
|
backgroundFocusColor = colors.black,
|
||||||
accelerators = {
|
accelerators = {
|
||||||
enter = 'update_label',
|
enter = 'update_label',
|
||||||
},
|
},
|
||||||
}),
|
},
|
||||||
grid = UI.ScrollingGrid({
|
grid = UI.ScrollingGrid {
|
||||||
y = 4,
|
y = 4,
|
||||||
values = {
|
values = {
|
||||||
{ name = 'CC version', value = os.version() },
|
{ name = 'CC version', value = os.version() },
|
||||||
@ -93,15 +99,14 @@ local systemPage = UI.Page({
|
|||||||
{ key = 'name', width = 12 },
|
{ key = 'name', width = 12 },
|
||||||
{ key = 'value', width = UI.term.width - 15 },
|
{ key = 'value', width = UI.term.width - 15 },
|
||||||
},
|
},
|
||||||
}),
|
},
|
||||||
}),
|
},
|
||||||
}),
|
},
|
||||||
-- statusBar = UI.StatusBar(),
|
|
||||||
notification = UI.Notification(),
|
notification = UI.Notification(),
|
||||||
accelerators = {
|
accelerators = {
|
||||||
q = 'quit',
|
q = 'quit',
|
||||||
},
|
},
|
||||||
})
|
}
|
||||||
|
|
||||||
function systemPage.tabs.pathTab.grid:draw()
|
function systemPage.tabs.pathTab.grid:draw()
|
||||||
self.values = { }
|
self.values = { }
|
||||||
@ -120,10 +125,8 @@ function systemPage.tabs.pathTab:eventHandler(event)
|
|||||||
self.grid:draw()
|
self.grid:draw()
|
||||||
Config.update('multishell', env)
|
Config.update('multishell', env)
|
||||||
systemPage.notification:success('reboot to take effect')
|
systemPage.notification:success('reboot to take effect')
|
||||||
else
|
return true
|
||||||
return UI.Window.eventHandler(self, event)
|
|
||||||
end
|
end
|
||||||
return true
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function systemPage.tabs.aliasTab.grid:draw()
|
function systemPage.tabs.aliasTab.grid:draw()
|
||||||
@ -144,6 +147,7 @@ function systemPage.tabs.aliasTab:eventHandler(event)
|
|||||||
self.grid:draw()
|
self.grid:draw()
|
||||||
Config.update('multishell', env)
|
Config.update('multishell', env)
|
||||||
systemPage.notification:success('reboot to take effect')
|
systemPage.notification:success('reboot to take effect')
|
||||||
|
return true
|
||||||
|
|
||||||
elseif event.type == 'new_alias' then
|
elseif event.type == 'new_alias' then
|
||||||
env.aliases[self.alias.value] = self.path.value
|
env.aliases[self.alias.value] = self.path.value
|
||||||
@ -153,10 +157,8 @@ function systemPage.tabs.aliasTab:eventHandler(event)
|
|||||||
self:setFocus(self.alias)
|
self:setFocus(self.alias)
|
||||||
Config.update('multishell', env)
|
Config.update('multishell', env)
|
||||||
systemPage.notification:success('reboot to take effect')
|
systemPage.notification:success('reboot to take effect')
|
||||||
else
|
return true
|
||||||
return UI.Window.eventHandler(self, event)
|
|
||||||
end
|
end
|
||||||
return true
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function systemPage.tabs.infoTab:eventHandler(event)
|
function systemPage.tabs.infoTab:eventHandler(event)
|
||||||
@ -164,21 +166,15 @@ function systemPage.tabs.infoTab:eventHandler(event)
|
|||||||
os.setComputerLabel(self.label.value)
|
os.setComputerLabel(self.label.value)
|
||||||
systemPage.notification:success('Label updated')
|
systemPage.notification:success('Label updated')
|
||||||
return true
|
return true
|
||||||
else
|
|
||||||
return UI.Window.eventHandler(self, event)
|
|
||||||
end
|
end
|
||||||
return true
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function systemPage:eventHandler(event)
|
function systemPage:eventHandler(event)
|
||||||
|
|
||||||
if event.type == 'quit' then
|
if event.type == 'quit' then
|
||||||
Event.exitPullEvents()
|
Event.exitPullEvents()
|
||||||
|
|
||||||
elseif event.type == 'tab_activate' then
|
elseif event.type == 'tab_activate' then
|
||||||
event.activated:focusFirst()
|
event.activated:focusFirst()
|
||||||
--self.statusBar:setValue('')
|
|
||||||
--self.statusBar:draw()
|
|
||||||
else
|
else
|
||||||
return UI.Page.eventHandler(self, event)
|
return UI.Page.eventHandler(self, event)
|
||||||
end
|
end
|
||||||
|
@ -811,6 +811,8 @@ local __actions = {
|
|||||||
local nx = nextWord(tLines[y], x)
|
local nx = nextWord(tLines[y], x)
|
||||||
if nx then
|
if nx then
|
||||||
x = nx
|
x = nx
|
||||||
|
elseif x < #tLines[y] + 1 then
|
||||||
|
x = #tLines[y] + 1
|
||||||
elseif y < #tLines then
|
elseif y < #tLines then
|
||||||
x = 1
|
x = 1
|
||||||
y = y + 1
|
y = y + 1
|
||||||
|
@ -455,7 +455,7 @@ end)
|
|||||||
local function startup()
|
local function startup()
|
||||||
local hasError
|
local hasError
|
||||||
|
|
||||||
local function runDir(directory, open)
|
local function runDir(directory, desc, open)
|
||||||
if not fs.exists(directory) then
|
if not fs.exists(directory) then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
@ -464,8 +464,8 @@ local function startup()
|
|||||||
table.sort(files)
|
table.sort(files)
|
||||||
|
|
||||||
for _,file in ipairs(files) do
|
for _,file in ipairs(files) do
|
||||||
print('Autorunning: ' .. file)
|
print(desc .. file)
|
||||||
|
os.sleep(0)
|
||||||
local result, err = open(directory .. '/' .. file)
|
local result, err = open(directory .. '/' .. file)
|
||||||
if not result then
|
if not result then
|
||||||
printError(err)
|
printError(err)
|
||||||
@ -474,7 +474,7 @@ local function startup()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
runDir('/sys/extensions', shell.run)
|
runDir('/sys/extensions', '[ ext ] ', shell.run)
|
||||||
|
|
||||||
local overviewId = multishell.openTab({
|
local overviewId = multishell.openTab({
|
||||||
path = '/apps/Overview.lua',
|
path = '/apps/Overview.lua',
|
||||||
@ -484,8 +484,8 @@ local function startup()
|
|||||||
})
|
})
|
||||||
overviewTab = tabs[overviewId]
|
overviewTab = tabs[overviewId]
|
||||||
|
|
||||||
runDir('/sys/services', shell.openHiddenTab)
|
runDir('/sys/services', '[ svc ] ', shell.openHiddenTab)
|
||||||
runDir('/autorun', shell.run)
|
runDir('/autorun', '[ aut ] ', shell.run)
|
||||||
|
|
||||||
if hasError then
|
if hasError then
|
||||||
error('An autorun program has errored')
|
error('An autorun program has errored')
|
||||||
|
@ -14,7 +14,7 @@ local version = "Version 1.1.6"
|
|||||||
-- Original code by Bomb Bloke
|
-- Original code by Bomb Bloke
|
||||||
-- Modified to integrate with opus os
|
-- Modified to integrate with opus os
|
||||||
|
|
||||||
local calls, recTerm, oldTerm, arg, showInput, skipLast, lastDelay, curInput, callCount, callListCount = {{["delay"] = 0}}, {}, term.current(), {...}, false, false, 2, "", 1, 2
|
local calls, recTerm, oldTerm, arg, showInput, skipLast, lastDelay, curInput, callCount, callListCount = {{["delay"] = 0}}, {}, Util.shallowCopy(multishell.term), {...}, false, false, 2, "", 1, 2
|
||||||
local curBlink, oldBlink, curCalls, tTerm, buffer, colourNum, xPos, yPos, oldXPos, oldYPos, tCol, bCol, xSize, ySize = false, false, calls[1], {}, {}, {}, 1, 1, 1, 1, colours.white, colours.black, term.getSize()
|
local curBlink, oldBlink, curCalls, tTerm, buffer, colourNum, xPos, yPos, oldXPos, oldYPos, tCol, bCol, xSize, ySize = false, false, calls[1], {}, {}, {}, 1, 1, 1, 1, colours.white, colours.black, term.getSize()
|
||||||
local greys, buttons = {["0"] = true, ["7"] = true, ["8"] = true, ["f"] = true}, {"l", "r", "m"}
|
local greys, buttons = {["0"] = true, ["7"] = true, ["8"] = true, ["f"] = true}, {"l", "r", "m"}
|
||||||
local charW, charH, chars, resp
|
local charW, charH, chars, resp
|
||||||
@ -84,8 +84,6 @@ end
|
|||||||
package = loadAPI('.recGif/package', getfenv(1))
|
package = loadAPI('.recGif/package', getfenv(1))
|
||||||
GIF = loadAPI('.recGif/GIF', getfenv(1))
|
GIF = loadAPI('.recGif/GIF', getfenv(1))
|
||||||
|
|
||||||
oldTerm = Util.shallowCopy(multishell.term)
|
|
||||||
|
|
||||||
local oldDir = shell.dir()
|
local oldDir = shell.dir()
|
||||||
shell.setDir('.recGif')
|
shell.setDir('.recGif')
|
||||||
shell.run("package get Y0eLUPtr")
|
shell.run("package get Y0eLUPtr")
|
||||||
|
@ -1,6 +1,2 @@
|
|||||||
local args = { ... }
|
local options = table.concat({ ... }, ' ')
|
||||||
local options = ''
|
shell.run('pastebin run sj4VMVJj ' .. options)
|
||||||
for _,v in pairs(args) do
|
|
||||||
options = options .. ' ' .. v
|
|
||||||
end
|
|
||||||
shell.run('pastebin run sj4VMVJj' .. options)
|
|
||||||
|
@ -15,9 +15,9 @@ return function()
|
|||||||
|
|
||||||
local selectFile = UI.Page({
|
local selectFile = UI.Page({
|
||||||
x = 3,
|
x = 3,
|
||||||
y = 3,
|
y = 2,
|
||||||
ex = -3,
|
rex = -3,
|
||||||
ey = -3,
|
rey = -3,
|
||||||
backgroundColor = colors.brown,
|
backgroundColor = colors.brown,
|
||||||
titleBar = UI.TitleBar({
|
titleBar = UI.TitleBar({
|
||||||
title = 'Select file',
|
title = 'Select file',
|
||||||
@ -27,16 +27,16 @@ return function()
|
|||||||
grid = UI.ScrollingGrid({
|
grid = UI.ScrollingGrid({
|
||||||
x = 2,
|
x = 2,
|
||||||
y = 2,
|
y = 2,
|
||||||
ex = -2,
|
rex = -2,
|
||||||
ey = -4,
|
rey = -4,
|
||||||
path = '',
|
path = '',
|
||||||
sortColumn = 'name',
|
sortColumn = 'name',
|
||||||
columns = columns,
|
columns = columns,
|
||||||
}),
|
}),
|
||||||
path = UI.TextEntry({
|
path = UI.TextEntry({
|
||||||
x = 2,
|
x = 2,
|
||||||
oy = -1,
|
ry = -1,
|
||||||
ex = -11,
|
rex = -11,
|
||||||
limit = 256,
|
limit = 256,
|
||||||
accelerators = {
|
accelerators = {
|
||||||
enter = 'path_enter',
|
enter = 'path_enter',
|
||||||
@ -44,8 +44,8 @@ return function()
|
|||||||
}),
|
}),
|
||||||
cancel = UI.Button({
|
cancel = UI.Button({
|
||||||
text = 'Cancel',
|
text = 'Cancel',
|
||||||
ox = -8,
|
rx = -8,
|
||||||
oy = -1,
|
ry = -1,
|
||||||
event = 'cancel',
|
event = 'cancel',
|
||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
|
260
sys/apis/ui.lua
260
sys/apis/ui.lua
@ -267,9 +267,6 @@ function Manager:inputEvent(parent, event)
|
|||||||
if parent:emit({ type = acc, element = parent }) then
|
if parent:emit({ type = acc, element = parent }) then
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
-- if parent:eventHandler({ type = acc, element = parent }) then
|
|
||||||
-- return true
|
|
||||||
-- end
|
|
||||||
end
|
end
|
||||||
if parent.eventHandler then
|
if parent.eventHandler then
|
||||||
if parent:eventHandler(event) then
|
if parent:eventHandler(event) then
|
||||||
@ -521,18 +518,26 @@ end
|
|||||||
function UI.Window:setParent()
|
function UI.Window:setParent()
|
||||||
self.oh, self.ow = self.height, self.width
|
self.oh, self.ow = self.height, self.width
|
||||||
|
|
||||||
if self.ox then
|
if self.rx then
|
||||||
self.x = self.parent.width + self.ox
|
if self.rx > 0 then
|
||||||
|
self.x = self.rx
|
||||||
|
else
|
||||||
|
self.x = self.parent.width + self.rx
|
||||||
|
end
|
||||||
end
|
end
|
||||||
if self.oy then
|
if self.ry then
|
||||||
self.y = self.parent.height + self.oy
|
if self.ry > 0 then
|
||||||
|
self.y = self.ry
|
||||||
|
else
|
||||||
|
self.y = self.parent.height + self.ry
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if self.ex then
|
if self.rex then
|
||||||
self.width = self.parent.width - self.x + self.ex + 2
|
self.width = self.parent.width - self.x + self.rex + 2
|
||||||
end
|
end
|
||||||
if self.ey then
|
if self.rey then
|
||||||
self.height = self.parent.height - self.y + self.ey + 2
|
self.height = self.parent.height - self.y + self.rey + 2
|
||||||
end
|
end
|
||||||
|
|
||||||
if not self.width then
|
if not self.width then
|
||||||
@ -583,21 +588,29 @@ end
|
|||||||
|
|
||||||
function UI.Window:resize()
|
function UI.Window:resize()
|
||||||
|
|
||||||
if self.ox then
|
if self.rx then
|
||||||
self.x = self.parent.width + self.ox
|
if self.rx > 0 then
|
||||||
|
self.x = self.rx
|
||||||
|
else
|
||||||
|
self.x = self.parent.width + self.rx
|
||||||
|
end
|
||||||
end
|
end
|
||||||
if self.oy then
|
if self.ry then
|
||||||
self.y = self.parent.height + self.oy
|
if self.ry > 0 then
|
||||||
|
self.y = self.ry
|
||||||
|
else
|
||||||
|
self.y = self.parent.height + self.ry
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if self.ex then
|
if self.rex then
|
||||||
self.width = self.parent.width - self.x + self.ex + 2
|
self.width = self.parent.width - self.x + self.rex + 2
|
||||||
elseif not self.ow and self.parent then
|
elseif not self.ow and self.parent then
|
||||||
self.width = self.parent.width - self.x + 1
|
self.width = self.parent.width - self.x + 1
|
||||||
end
|
end
|
||||||
|
|
||||||
if self.ey then
|
if self.rey then
|
||||||
self.oh = self.parent.height - self.y + self.ey + 2
|
self.height = self.parent.height - self.y + self.rey + 2
|
||||||
elseif not self.oh and self.parent then
|
elseif not self.oh and self.parent then
|
||||||
self.height = self.parent.height - self.y + 1
|
self.height = self.parent.height - self.y + 1
|
||||||
end
|
end
|
||||||
@ -700,11 +713,16 @@ function UI.Window:print(text, bg, fg, indent)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
for _,line in pairs(Util.split(text)) do
|
local lines = Util.split(text)
|
||||||
|
for k,line in pairs(lines) do
|
||||||
local lx = 1
|
local lx = 1
|
||||||
while true do
|
while true do
|
||||||
local word = nextWord(line, lx)
|
local word = nextWord(line, lx)
|
||||||
if not word then
|
if not word then
|
||||||
|
if lines[k + 1] then
|
||||||
|
self.cursorX = indent
|
||||||
|
self.cursorY = self.cursorY + 1
|
||||||
|
end
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
local w = word
|
local w = word
|
||||||
@ -783,6 +801,14 @@ function UI.Window:scrollIntoView()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function UI.Window:setTransition(effect, y, height)
|
||||||
|
if self.parent then
|
||||||
|
y = y or 1
|
||||||
|
height = height or self.height
|
||||||
|
self.parent:setTransition(effect, y + self.y - 1, height)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function UI.Window:emit(event)
|
function UI.Window:emit(event)
|
||||||
local parent = self
|
local parent = self
|
||||||
--debug(self.UIElement .. ' emitting ' .. event.type)
|
--debug(self.UIElement .. ' emitting ' .. event.type)
|
||||||
@ -809,6 +835,7 @@ UI.Device.defaults = {
|
|||||||
textColor = colors.white,
|
textColor = colors.white,
|
||||||
textScale = 1,
|
textScale = 1,
|
||||||
lines = { },
|
lines = { },
|
||||||
|
transitionsEnabled = true,
|
||||||
}
|
}
|
||||||
|
|
||||||
function UI.Device:init(args)
|
function UI.Device:init(args)
|
||||||
@ -834,6 +861,7 @@ end
|
|||||||
|
|
||||||
function UI.Device:resize()
|
function UI.Device:resize()
|
||||||
self.width, self.height = self.device.getSize()
|
self.width, self.height = self.device.getSize()
|
||||||
|
self.lines = { }
|
||||||
UI.Window.resize(self)
|
UI.Window.resize(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -863,14 +891,112 @@ function UI.Device:reset()
|
|||||||
self.device.setCursorPos(1, 1)
|
self.device.setCursorPos(1, 1)
|
||||||
end
|
end
|
||||||
|
|
||||||
function UI.Device:sync()
|
function UI.Device:setTransition(effect, y, height)
|
||||||
for y, line in pairs(self.lines) do
|
if not self.transition then
|
||||||
if line.dirty then
|
self.transition = effect
|
||||||
self.device.setCursorPos(1, y)
|
for i = y, y + height - 1 do
|
||||||
self.device.blit(line.text, line.fg, line.bg)
|
local line = self.lines[i]
|
||||||
line.dirty = false
|
if line then
|
||||||
|
line.transition = true
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function UI.Device:runTransition(transition)
|
||||||
|
if transition == 'left' or transition == 'right' then
|
||||||
|
for y, line in ipairs(self.lines) do
|
||||||
|
if not line.transition then
|
||||||
|
self.device.setCursorPos(1, y)
|
||||||
|
self.device.blit(line.text, line.fg, line.bg)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local c = os.clock()
|
||||||
|
local steps = math.floor(self.width * .34) -- 150 ms
|
||||||
|
|
||||||
|
for i = 1, self.width do
|
||||||
|
for y, line in pairs(self.lines) do
|
||||||
|
if line.transition then
|
||||||
|
if transition == 'left' then
|
||||||
|
local text = self.lastScreen[y].text .. line.text
|
||||||
|
local bg = self.lastScreen[y].bg .. line.bg
|
||||||
|
local fg = self.lastScreen[y].fg .. line.fg
|
||||||
|
self.device.setCursorPos(1 - i, y)
|
||||||
|
self.device.blit(text, fg, bg)
|
||||||
|
else
|
||||||
|
local text = line.text .. self.lastScreen[y].text
|
||||||
|
local bg = line.bg .. self.lastScreen[y].bg
|
||||||
|
local fg = line.fg .. self.lastScreen[y].fg
|
||||||
|
self.device.setCursorPos(-self.width + i + 1, y)
|
||||||
|
self.device.blit(text, fg, bg)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if (i + math.floor(steps / 2)) % steps == 0 then
|
||||||
|
if c == os.clock() then
|
||||||
|
os.sleep(0)
|
||||||
|
c = os.clock()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
elseif transition == 'explode' then
|
||||||
|
local half = math.floor(self.width / 2)
|
||||||
|
local c = os.clock()
|
||||||
|
local steps = math.floor(self.width * .5)
|
||||||
|
for i = 1, half do
|
||||||
|
for y, line in pairs(self.lines) do
|
||||||
|
local width = i * 2
|
||||||
|
local mid = half - i + 1
|
||||||
|
self.device.setCursorPos(mid, y)
|
||||||
|
self.device.blit(
|
||||||
|
line.text:sub(mid, mid + width),
|
||||||
|
line.fg:sub(mid, mid + width),
|
||||||
|
line.bg:sub(mid, mid + width))
|
||||||
|
end
|
||||||
|
if (i + math.floor(steps / 2)) % steps == 0 then
|
||||||
|
if c == os.clock() then
|
||||||
|
os.sleep(0)
|
||||||
|
c = os.clock()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
for y, line in ipairs(self.lines) do
|
||||||
|
line.dirty = false
|
||||||
|
line.transition = false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function UI.Device:sync()
|
||||||
|
|
||||||
|
local transition
|
||||||
|
if self.transition then
|
||||||
|
for y, line in pairs(self.lines) do
|
||||||
|
if line.dirty then
|
||||||
|
transition = self.transition
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
self.transition = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
if transition and self.transitionsEnabled then
|
||||||
|
self:runTransition(transition)
|
||||||
|
else
|
||||||
|
for y, line in pairs(self.lines) do
|
||||||
|
if line.dirty then
|
||||||
|
self.device.setCursorPos(1, y)
|
||||||
|
self.device.blit(line.text, line.fg, line.bg)
|
||||||
|
line.dirty = false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
self.lastScreen = Util.deepCopy(self.lines)
|
||||||
|
|
||||||
if self:getCursorBlink() then
|
if self:getCursorBlink() then
|
||||||
self.device.setCursorPos(self.cursorX, self.cursorY)
|
self.device.setCursorPos(self.cursorX, self.cursorY)
|
||||||
end
|
end
|
||||||
@ -1596,12 +1722,16 @@ function UI.ViewportWindow:setScrollPosition(offset)
|
|||||||
max = math.max(child.y + child.height - 1, max)
|
max = math.max(child.y + child.height - 1, max)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
self.offy = math.min(self.offy, max - self.height)
|
self.offy = math.min(self.offy, math.max(max, self.height) - self.height)
|
||||||
if self.offy ~= oldOffset then
|
if self.offy ~= oldOffset then
|
||||||
self:draw()
|
self:draw()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function UI.ViewportWindow:reset()
|
||||||
|
self.offy = 0
|
||||||
|
end
|
||||||
|
|
||||||
function UI.ViewportWindow:eventHandler(event)
|
function UI.ViewportWindow:eventHandler(event)
|
||||||
|
|
||||||
if event.type == 'scroll_down' then
|
if event.type == 'scroll_down' then
|
||||||
@ -1731,7 +1861,7 @@ function UI.MenuBar:init(args)
|
|||||||
if self.showBackButton then
|
if self.showBackButton then
|
||||||
table.insert(self.children, UI.Button({
|
table.insert(self.children, UI.Button({
|
||||||
x = UI.term.width - 2,
|
x = UI.term.width - 2,
|
||||||
width = 4,
|
width = 3,
|
||||||
backgroundColor = self.backgroundColor,
|
backgroundColor = self.backgroundColor,
|
||||||
textColor = self.textColor,
|
textColor = self.textColor,
|
||||||
text = '^-',
|
text = '^-',
|
||||||
@ -1758,7 +1888,6 @@ function UI.MenuBar:eventHandler(event)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return false
|
|
||||||
end
|
end
|
||||||
|
|
||||||
--[[-- DropMenu --]]--
|
--[[-- DropMenu --]]--
|
||||||
@ -1834,6 +1963,7 @@ function UI.DropMenu:eventHandler(event)
|
|||||||
else
|
else
|
||||||
return UI.MenuBar.eventHandler(self, event)
|
return UI.MenuBar.eventHandler(self, event)
|
||||||
end
|
end
|
||||||
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
--[[-- TabBar --]]--
|
--[[-- TabBar --]]--
|
||||||
@ -1849,17 +1979,24 @@ function UI.TabBar:init(args)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function UI.TabBar:selectTab(text)
|
function UI.TabBar:selectTab(text)
|
||||||
for _,child in pairs(self.children) do
|
local selected, lastSelected
|
||||||
if child.text == text then
|
for k,child in pairs(self.children) do
|
||||||
child.selected = true
|
if child.selected then
|
||||||
|
lastSelected = k
|
||||||
|
end
|
||||||
|
child.selected = child.text == text
|
||||||
|
if child.selected then
|
||||||
|
selected = k
|
||||||
child.backgroundColor = self.selectedBackgroundColor
|
child.backgroundColor = self.selectedBackgroundColor
|
||||||
child.backgroundFocusColor = self.selectedBackgroundColor
|
child.backgroundFocusColor = self.selectedBackgroundColor
|
||||||
else
|
else
|
||||||
child.selected = false
|
|
||||||
child.backgroundColor = self.backgroundColor
|
child.backgroundColor = self.backgroundColor
|
||||||
child.backgroundFocusColor = self.backgroundColor
|
child.backgroundFocusColor = self.backgroundColor
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
if selected and lastSelected and selected ~= lastSelected then
|
||||||
|
self:emit({ type = 'tab_change', current = selected, last = lastSelected })
|
||||||
|
end
|
||||||
UI.MenuBar.draw(self)
|
UI.MenuBar.draw(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1929,9 +2066,62 @@ function UI.Tabs:eventHandler(event)
|
|||||||
break
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return true
|
elseif event.type == 'tab_change' then
|
||||||
|
for _,tab in ipairs(self.children) do
|
||||||
|
if tab ~= self.tabBar then
|
||||||
|
if event.current > event.last then
|
||||||
|
tab:setTransition('left')
|
||||||
|
else
|
||||||
|
tab:setTransition('right')
|
||||||
|
end
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-- WindowScroller --]]--
|
||||||
|
UI.WindowScroller = class(UI.Window)
|
||||||
|
UI.WindowScroller.defaults = {
|
||||||
|
UIElement = 'WindowScroller',
|
||||||
|
children = { },
|
||||||
|
}
|
||||||
|
function UI.WindowScroller:init(args)
|
||||||
|
local defaults = UI:getDefaults(UI.WindowScroller, args)
|
||||||
|
UI.Window.init(self, defaults)
|
||||||
|
end
|
||||||
|
|
||||||
|
function UI.WindowScroller:enable()
|
||||||
|
self.enabled = true
|
||||||
|
if #self.children > 0 then
|
||||||
|
self.children[1]:enable()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function UI.WindowScroller:nextChild()
|
||||||
|
for i = 1, #self.children do
|
||||||
|
if self.children[i].enabled then
|
||||||
|
if i < #self.children then
|
||||||
|
self:setTransition('left')
|
||||||
|
self.children[i]:disable()
|
||||||
|
self.children[i + 1]:enable()
|
||||||
|
end
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function UI.WindowScroller:prevChild()
|
||||||
|
for i = 1, #self.children do
|
||||||
|
if self.children[i].enabled then
|
||||||
|
if i - 1 > 0 then
|
||||||
|
self:setTransition('right')
|
||||||
|
self.children[i]:disable()
|
||||||
|
self.children[i - 1]:enable()
|
||||||
|
end
|
||||||
|
break
|
||||||
|
end
|
||||||
end
|
end
|
||||||
return UI.Window.eventHandler(self, event)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
--[[-- Notification --]]--
|
--[[-- Notification --]]--
|
||||||
|
Loading…
Reference in New Issue
Block a user