Оптимизация event-либы и сокрытие скроллбара файндера, когда он не требуется

This commit is contained in:
Igor Timofeev 2017-10-23 11:25:54 +03:00
parent ba76620d1e
commit 5eeed4530b
4 changed files with 76 additions and 68 deletions

View File

@ -235,7 +235,7 @@
path="/lib/MineOSNetwork.lua",
url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/MineOSNetwork.lua",
type="Library",
version=1.05,
version=1.06,
},
{
path="/lib/MineOSInterface.lua",
@ -268,7 +268,7 @@
path="/lib/event.lua",
url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/event.lua",
type="Library",
version=1.08,
version=1.09,
},
{
path="/lib/ECSAPI.lua",
@ -603,7 +603,7 @@
type="Application",
icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Finder/Icon.pic",
forceDownload=true,
version=1.29,
version=1.30,
},
{
path="/MineOS/Applications/Weather",

View File

@ -204,7 +204,9 @@ window.searchInput.onInputFinished = function()
end
local function updateScrollBar()
local horizontalLines = math.ceil((#window.iconField.fileList - window.iconField.fromFile + 1) / window.iconField.iconCount.horizontal)
local shownFilesCount = #window.iconField.fileList - window.iconField.fromFile + 1
local horizontalLines = math.ceil(shownFilesCount / window.iconField.iconCount.horizontal)
local minimumOffset = 3 - (horizontalLines - 1) * (MineOSCore.properties.iconHeight + MineOSCore.properties.iconVerticalSpaceBetween) - MineOSCore.properties.iconVerticalSpaceBetween
if window.iconField.yOffset > iconFieldYOffset then
@ -213,8 +215,13 @@ local function updateScrollBar()
window.iconField.yOffset = minimumOffset
end
window.scrollBar.maximumValue = math.abs(minimumOffset)
window.scrollBar.value = math.abs(window.iconField.yOffset - iconFieldYOffset)
if shownFilesCount > window.iconField.iconCount.total then
window.scrollBar.hidden = false
window.scrollBar.maximumValue = math.abs(minimumOffset)
window.scrollBar.value = math.abs(window.iconField.yOffset - iconFieldYOffset)
else
window.scrollBar.hidden = true
end
end
local overrideUpdateFileList = window.iconField.updateFileList

View File

@ -327,7 +327,7 @@ end
function MineOSNetwork.disable()
if MineOSNetwork.eventHandlerID then
event.cancel(MineOSNetwork.eventHandlerID)
event.removeHandler(MineOSNetwork.eventHandlerID)
end
MineOSNetwork.unmountAll()
end
@ -335,8 +335,9 @@ end
function MineOSNetwork.enable()
MineOSNetwork.disable()
MineOSNetwork.eventHandlerID = event.register(function(...)
MineOSNetwork.eventHandlerID = event.addHandler(function(...)
local eventData = {...}
if eventData[1] == "component_added" or eventData[1] == "component_removed" then
MineOSNetwork.updateModemState()
elseif eventData[1] == "modem_message" and MineOSCore.properties.network.enabled and eventData[6] == "MineOSNetwork" then

View File

@ -6,9 +6,8 @@
local computer = require("computer")
local event = {
local event, handlers, interruptingKeysDown, lastInterrupt = {
push = computer.pushSignal,
handlers = {},
interruptingEnabled = true,
interruptingDelay = 1,
interruptingKeyCodes = {
@ -17,33 +16,24 @@ local event = {
[56] = true
},
onError = function(errorMessage)
-- require("GUI").error("CYKA: " .. tostring(errorMessage))
-- require("GUI").error("Event handler error: \"" .. tostring(errorMessage) .. "\"")
end
}
local lastInterrupt, interruptingKeysDown = 0, {}
}, {}, {}, 0
--------------------------------------------------------------------------------------------------------
function event.register(callback, signalType, times, interval)
function event.addHandler(callback, signalType, times, interval)
checkArg(1, callback, "function")
checkArg(2, signalType, "string", "nil")
checkArg(3, times, "number", "nil")
checkArg(4, nextTriggerTime, "number", "nil")
local newID
while not newID do
newID = math.random(1, 0x7FFFFFFF)
for ID, handler in pairs(event.handlers) do
if ID == newID then
newID = nil
break
end
end
local ID = math.random(1, 0x7FFFFFFF)
while handlers[ID] do
ID = math.random(1, 0x7FFFFFFF)
end
event.handlers[newID] = {
alive = true,
handlers[ID] = {
signalType = signalType,
callback = callback,
times = times or math.huge,
@ -51,7 +41,28 @@ function event.register(callback, signalType, times, interval)
nextTriggerTime = interval and (computer.uptime() + interval) or nil
}
return newID
return ID
end
function event.removeHandler(ID)
checkArg(1, ID, "number")
if handlers[ID] then
handlers[ID] = nil
return true
else
return false, "No registered handlers found for ID \"" .. ID .. "\""
end
end
function event.getHandler(ID)
checkArg(1, ID, "number")
if handlers[ID] then
return handlers[ID]
else
return false, "No registered handlers found for ID \"" .. ID .. "\""
end
end
--------------------------------------------------------------------------------------------------------
@ -60,13 +71,13 @@ function event.listen(signalType, callback)
checkArg(1, signalType, "string")
checkArg(2, callback, "function")
for ID, handler in pairs(event.handlers) do
for ID, handler in pairs(handlers) do
if handler.callback == callback then
return false, "Callback method " .. tostring(callback) .. " is already registered"
end
end
event.register(callback, signalType)
event.addHandler(callback, signalType)
return true
end
@ -74,9 +85,9 @@ function event.ignore(signalType, callback)
checkArg(1, signalType, "string")
checkArg(2, callback, "function")
for ID, handler in pairs(event.handlers) do
for ID, handler in pairs(handlers) do
if handler.signalType == signalType and handler.callback == callback then
handler.alive = false
handlers[ID] = nil
return true
end
end
@ -91,19 +102,10 @@ function event.timer(interval, callback, times)
checkArg(2, callback, "function")
checkArg(3, times, "number", "nil")
return event.register(callback, nil, times, interval)
return event.addHandler(callback, nil, times, interval)
end
function event.cancel(ID)
checkArg(1, ID, "number")
if event.handlers[ID] then
event.handlers[ID].alive = false
return true
else
return false, "No registered handlers found for ID \"" .. ID .. "\""
end
end
event.cancel = event.removeHandler
--------------------------------------------------------------------------------------------------------
@ -118,17 +120,6 @@ local function executeHandlerCallback(callback, ...)
end
end
local function getNearestHandlerTriggerTime()
local nearestTriggerTime
for ID, handler in pairs(event.handlers) do
if handler.nextTriggerTime then
nearestTriggerTime = math.min(nearestTriggerTime or math.huge, handler.nextTriggerTime)
end
end
return nearestTriggerTime
end
function event.skip(signalType)
event.skipSignalType = signalType
end
@ -136,37 +127,46 @@ end
function event.pull(...)
local args = {...}
local args1Type, timeout, signalType = type(args[1])
local args1Type, preferredTimeout, signalType = type(args[1])
if args1Type == "string" then
timeout, signalType = math.huge, args[1]
preferredTimeout, signalType = math.huge, args[1]
elseif args1Type == "number" then
timeout, signalType = args[1], type(args[2]) == "string" and args[2] or nil
preferredTimeout, signalType = args[1], type(args[2]) == "string" and args[2] or nil
end
local uptime, eventData = computer.uptime()
local deadline = uptime + (timeout or math.huge)
local uptime, eventData, timeout = computer.uptime()
local deadline = uptime + (preferredTimeout or math.huge)
while uptime <= deadline do
uptime = computer.uptime()
eventData = {computer.pullSignal((getNearestHandlerTriggerTime() or deadline) - computer.uptime())}
-- Determining pullSignal timeout
timeout = deadline
for ID, handler in pairs(handlers) do
if handler.nextTriggerTime then
timeout = math.min(timeout, handler.nextTriggerTime)
end
end
-- Pulling signal data
eventData = { computer.pullSignal(timeout - computer.uptime()) }
-- Handlers processing
for ID, handler in pairs(event.handlers) do
if handler.times > 0 and handler.alive then
for ID, handler in pairs(handlers) do
if handler.times > 0 then
uptime = computer.uptime()
if
(not handler.signalType or handler.signalType == eventData[1]) and
(not handler.nextTriggerTime or handler.nextTriggerTime <= uptime)
then
executeHandlerCallback(handler.callback, table.unpack(eventData))
uptime = computer.uptime()
handler.times = handler.times - 1
if handler.nextTriggerTime then
handler.nextTriggerTime = uptime + handler.interval
end
executeHandlerCallback(handler.callback, table.unpack(eventData))
end
else
event.handlers[ID] = nil
handlers[ID] = nil
end
end