Reworked Finder/optimized event library

This commit is contained in:
Igor Timofeev 2018-12-02 22:00:24 +03:00
parent 8766921128
commit 1fa1648fc3
4 changed files with 297 additions and 283 deletions

Binary file not shown.

View File

@ -11,7 +11,13 @@ local MineOSInterface = require("MineOSInterface")
local args, options = require("shell").parse(...) local args, options = require("shell").parse(...)
------------------------------------------------------------------------------------------------------ --------------------------------------------------------------------------------
local resourcesPath = MineOSCore.getCurrentScriptDirectory()
local favouritesPath = MineOSPaths.applicationData .. "Finder/Favourites3.cfg"
local sidebarTitleColor = 0xC3C3C3
local sidebarItemColor = 0x696969
local favourites = { local favourites = {
{name = "Root", path = "/"}, {name = "Root", path = "/"},
@ -22,42 +28,42 @@ local favourites = {
{name = "Libraries", path = "/lib/"}, {name = "Libraries", path = "/lib/"},
{name = "Trash", path = MineOSPaths.trash}, {name = "Trash", path = MineOSPaths.trash},
} }
local resourcesPath = MineOSCore.getCurrentScriptDirectory()
local favouritesPath = MineOSPaths.applicationData .. "Finder/Favourites3.cfg"
local sidebarFromY = 1
local iconFieldYOffset = 2 local iconFieldYOffset = 2
local scrollTimerID local scrollTimerID
local workpathHistory = {} local workpathHistory = {}
local workpathHistoryCurrent = 0 local workpathHistoryCurrent = 0
------------------------------------------------------------------------------------------------------ --------------------------------------------------------------------------------
local mainContainer, window, menu = MineOSInterface.addWindow(GUI.filledWindow(1, 1, 88, 26, 0xF0F0F0)) local mainContainer, window, menu = MineOSInterface.addWindow(GUI.filledWindow(1, 1, 88, 26, 0xE1E1E1))
local titlePanel = window:addChild(GUI.panel(1, 1, 1, 3, 0xE1E1E1)) local titlePanel = window:addChild(GUI.panel(1, 1, 1, 3, 0x3C3C3C))
local prevButton = window:addChild(GUI.adaptiveRoundedButton(9, 2, 1, 0, 0xFFFFFF, 0x4B4B4B, 0x3C3C3C, 0xFFFFFF, "<")) local prevButton = window:addChild(GUI.adaptiveRoundedButton(9, 2, 1, 0, 0x5A5A5A, 0xC3C3C3, 0x2D2D2D, 0xE1E1E1, "<"))
prevButton.colors.disabled.background = prevButton.colors.default.background prevButton.colors.disabled.background = 0x4B4B4B
prevButton.colors.disabled.text = 0xC3C3C3 prevButton.colors.disabled.text = 0xA5A5A5
local nextButton = window:addChild(GUI.adaptiveRoundedButton(14, 2, 1, 0, 0xFFFFFF, 0x4B4B4B, 0x3C3C3C, 0xFFFFFF, ">")) local nextButton = window:addChild(GUI.adaptiveRoundedButton(14, 2, 1, 0, 0x5A5A5A, 0xC3C3C3, 0x2D2D2D, 0xE1E1E1, ">"))
nextButton.colors.disabled = prevButton.colors.disabled nextButton.colors.disabled = prevButton.colors.disabled
local FTPButton = window:addChild(GUI.adaptiveRoundedButton(20, 2, 1, 0, 0xFFFFFF, 0x4B4B4B, 0x3C3C3C, 0xFFFFFF, MineOSCore.localization.networkFTPNewConnection)) local FTPButton = window:addChild(GUI.adaptiveRoundedButton(20, 2, 1, 0, 0x5A5A5A, 0xC3C3C3, 0x2D2D2D, 0xE1E1E1, MineOSCore.localization.networkFTPNewConnection))
FTPButton.colors.disabled = prevButton.colors.disabled FTPButton.colors.disabled = prevButton.colors.disabled
FTPButton.disabled = not MineOSNetwork.internetProxy FTPButton.disabled = not MineOSNetwork.internetProxy
local sidebarContainer = window:addChild(GUI.container(1, 4, 20, 1)) local sidebarContainer = window:addChild(GUI.container(1, 4, 20, 1))
local sidebarPanel = sidebarContainer:addChild(GUI.object(1, 1, sidebarContainer.width, 1, 0xFFFFFF)) local sidebarPanel = sidebarContainer:addChild(GUI.object(1, 1, sidebarContainer.width, 1, 0xFFFFFF))
sidebarPanel.draw = function(object) sidebarPanel.draw = function(object)
buffer.drawRectangle(object.x, object.y, object.width, object.height, 0xFFFFFF, 0x0, " ", MineOSCore.properties.transparencyEnabled and 0.3) buffer.drawRectangle(object.x, object.y, object.width, object.height, 0x2D2D2D, sidebarItemColor, " ")
end end
sidebarContainer.itemsContainer = sidebarContainer:addChild(GUI.container(1, 1, sidebarContainer.width, 1)) local itemsLayout = sidebarContainer:addChild(GUI.layout(1, 1, 1, 1, 1, 1))
itemsLayout:setAlignment(1, 1, GUI.ALIGNMENT_HORIZONTAL_LEFT, GUI.ALIGNMENT_VERTICAL_TOP)
itemsLayout:setSpacing(1, 1, 0)
itemsLayout:setMargin(1, 1, 0, 0)
local searchInput = window:addChild(GUI.input(1, 2, 36, 1, 0xFFFFFF, 0x4B4B4B, 0xA5A5A5, 0xFFFFFF, 0x2D2D2D, nil, MineOSCore.localization.search, true)) local searchInput = window:addChild(GUI.input(1, 2, 36, 1, 0x4B4B4B, 0xC3C3C3, 0x878787, 0x4B4B4B, 0xE1E1E1, nil, MineOSCore.localization.search, true))
local iconField = window:addChild(MineOSInterface.iconField(1, 4, 1, 1, 2, 2, 0x3C3C3C, 0x969696, MineOSPaths.desktop)) local iconField = window:addChild(MineOSInterface.iconField(1, 4, 1, 1, 2, 2, 0x3C3C3C, 0x969696, MineOSPaths.desktop))
@ -67,12 +73,10 @@ scrollBar.eventHandler = nil
local statusBar = window:addChild(GUI.object(1, 1, 1, 1)) local statusBar = window:addChild(GUI.object(1, 1, 1, 1))
statusBar.draw = function(object) statusBar.draw = function(object)
buffer.drawRectangle(object.x, object.y, object.width, object.height, 0xFFFFFF, 0x3C3C3C, " ") buffer.drawRectangle(object.x, object.y, object.width, object.height, 0xF0F0F0, 0xA5A5A5, " ")
buffer.drawText(object.x + 1, object.y, 0x3C3C3C, string.limit(("root/" .. iconField.workpath):gsub("/+$", ""):gsub("%/+", ""), object.width - 2, "left")) buffer.drawText(object.x + 1, object.y, 0xA5A5A5, string.limit(("root/" .. iconField.workpath):gsub("/+$", ""):gsub("%/+", ""), object.width - 2, "left"))
end end
local sidebarResizer = window:addChild(GUI.resizer(1, 4, 3, 5, 0xFFFFFF, 0x0))
------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------
local function saveFavourites() local function saveFavourites()
@ -120,32 +124,56 @@ local function addWorkpath(path)
iconField:setWorkpath(path) iconField:setWorkpath(path)
end end
local function newSidebarItem(y, textColor, text, path) local function sidebarItemDraw(object)
local object = sidebarContainer.itemsContainer:addChild(GUI.object(1, y, 1, 1)) local textColor, limit = object.textColor, object.width - 2
if object.path == iconField.workpath then
textColor = 0x4B4B4B
buffer.drawRectangle(object.x, object.y, object.width, 1, 0xE1E1E1, textColor, " ")
if text then if object.onRemove then
object.draw = function(object) limit = limit - 2
object.width = sidebarContainer.itemsContainer.width buffer.drawText(object.x + object.width - 2, object.y, 0x969696, "x")
local currentTextColor = textColor
if path == iconField.workpath then
buffer.drawRectangle(object.x, object.y, object.width, 1, 0x3366CC, 0xFFFFFF, " ")
currentTextColor = 0xFFFFFF
end
buffer.drawText(object.x + 1, object.y, currentTextColor, string.limit(text, object.width - 2, "center"))
end
object.eventHandler = function(mainContainer, object, e1, ...)
if e1 == "touch" and object.onTouch then
object.onTouch(e1, ...)
end
end end
end end
buffer.drawText(object.x + 1, object.y, textColor, string.limit(object.text, limit, "center"))
end
local function sidebarItemEventHandler(mainContainer, object, e1, e2, e3, ...)
if e1 == "touch" then
if object.onRemove and e3 == object.x + object.width - 2 then
object.onRemove()
elseif object.onTouch then
object.onTouch(e1, e2, e3, ...)
end
end
end
local function addSidebarObject(textColor, text, path)
local object = itemsLayout:addChild(GUI.object(1, 1, itemsLayout.width, 1))
object.textColor = textColor
object.text = text
object.path = path
object.draw = sidebarItemDraw
object.eventHandler = sidebarItemEventHandler
return object return object
end end
local function addSidebarTitle(...)
return addSidebarObject(sidebarTitleColor, ...)
end
local function addSidebarItem(...)
return addSidebarObject(sidebarItemColor, ...)
end
local function addSidebarSeparator()
return itemsLayout:addChild(GUI.object(1, 1, itemsLayout.width, 1))
end
local function onFavouriteTouch(path) local function onFavouriteTouch(path)
if fs.exists(path) then if fs.exists(path) then
addWorkpath(path) addWorkpath(path)
@ -172,104 +200,98 @@ openFTP = function(...)
end end
updateSidebar = function() updateSidebar = function()
local y = sidebarFromY itemsLayout:removeChildren()
sidebarContainer.itemsContainer:removeChildren()
-- Favourites
addSidebarTitle(MineOSCore.localization.favourite)
newSidebarItem(y, 0x3C3C3C, MineOSCore.localization.favourite)
y = y + 1
for i = 1, #favourites do for i = 1, #favourites do
local object = newSidebarItem(y, 0x555555, " " .. fs.name(favourites[i].name), favourites[i].path) local object = addSidebarItem(" " .. fs.name(favourites[i].name), favourites[i].path)
object.onTouch = function(e1, e2, e3, e4, e5) object.onTouch = function(e1, e2, e3)
if e5 == 1 then onFavouriteTouch(favourites[i].path)
local menu = GUI.addContextMenu(mainContainer, e3, e4)
menu:addItem(MineOSCore.localization.removeFromFavourites).onTouch = function()
table.remove(favourites, i)
saveFavourites()
updateSidebar()
MineOSInterface.mainContainer:drawOnScreen()
end
mainContainer:drawOnScreen()
else
onFavouriteTouch(favourites[i].path)
end
end end
y = y + 1 object.onRemove = function()
table.remove(favourites, i)
updateSidebar()
mainContainer:drawOnScreen()
saveFavourites()
end
end end
addSidebarSeparator()
-- Modem connections
local added = false local added = false
for proxy, path in fs.mounts() do for proxy, path in fs.mounts() do
if proxy.MineOSNetworkModem then if proxy.MineOSNetworkModem then
if not added then if not added then
y = y + 1 addSidebarTitle(MineOSCore.localization.network)
newSidebarItem(y, 0x3C3C3C, MineOSCore.localization.network) added = true
y, added = y + 1, true
end end
newSidebarItem(y, 0x555555, " " .. MineOSNetwork.getModemProxyName(proxy), path .. "/").onTouch = function() addSidebarItem(" " .. MineOSNetwork.getModemProxyName(proxy), path .. "/").onTouch = function()
addWorkpath(path .. "/") addWorkpath(path .. "/")
updateFileListAndDraw() updateFileListAndDraw()
end end
y = y + 1
end end
end end
if added then
addSidebarSeparator()
end
-- FTP connections
if MineOSNetwork.internetProxy and #MineOSCore.properties.FTPConnections > 0 then if MineOSNetwork.internetProxy and #MineOSCore.properties.FTPConnections > 0 then
y = y + 1 addSidebarTitle(MineOSCore.localization.networkFTPConnections)
newSidebarItem(y, 0x3C3C3C, MineOSCore.localization.networkFTPConnections)
y = y + 1
for i = 1, #MineOSCore.properties.FTPConnections do for i = 1, #MineOSCore.properties.FTPConnections do
local connection = MineOSCore.properties.FTPConnections[i] local connection = MineOSCore.properties.FTPConnections[i]
local name = MineOSNetwork.getFTPProxyName(connection.address, connection.port, connection.user) local name = MineOSNetwork.getFTPProxyName(connection.address, connection.port, connection.user)
local mountPath = MineOSNetwork.mountPaths.FTP .. name .. "/" local mountPath = MineOSNetwork.mountPaths.FTP .. name .. "/"
newSidebarItem(y, 0x555555, " " .. name, mountPath).onTouch = function(e1, e2, e3, e4, e5) local object = addSidebarItem(" " .. name, mountPath)
if e5 == 1 then
local menu = GUI.addContextMenu(mainContainer, e3, e4)
menu:addItem(MineOSCore.localization.delete).onTouch = function() object.onTouch = function(e1, e2, e3, e4, e5)
table.remove(MineOSCore.properties.FTPConnections, i) openFTP(connection.address, connection.port, connection.user, connection.password)
MineOSCore.saveProperties()
updateSidebar()
MineOSInterface.mainContainer:drawOnScreen()
end
mainContainer:drawOnScreen()
else
openFTP(connection.address, connection.port, connection.user, connection.password)
end
end end
y = y + 1 object.onRemove = function()
table.remove(MineOSCore.properties.FTPConnections, i)
updateSidebar()
mainContainer:drawOnScreen()
MineOSCore.saveProperties()
end
end end
end end
y = y + 1 -- Mounts
newSidebarItem(y, 0x3C3C3C, MineOSCore.localization.mounts) addSidebarTitle(MineOSCore.localization.mounts)
y = y + 1
for proxy, path in fs.mounts() do for proxy, path in fs.mounts() do
if path ~= "/" and not proxy.MineOSNetworkModem and not proxy.MineOSNetworkFTP then if path ~= "/" and not proxy.MineOSNetworkModem and not proxy.MineOSNetworkFTP then
newSidebarItem(y, 0x555555, " " .. (proxy.getLabel() or fs.name(path)), path .. "/").onTouch = function() addSidebarItem(" " .. (proxy.getLabel() or fs.name(path)), path .. "/").onTouch = function()
onFavouriteTouch(path .. "/") onFavouriteTouch(path .. "/")
end end
y = y + 1
end end
end end
end end
sidebarContainer.itemsContainer.eventHandler = function(mainContainer, object, e1, e2, e3, e4, e5) itemsLayout.eventHandler = function(mainContainer, object, e1, e2, e3, e4, e5)
if e1 == "scroll" then if e1 == "scroll" then
if (e5 > 0 and sidebarFromY < 1) or (e5 < 0 and sidebarContainer.itemsContainer.children[#sidebarContainer.itemsContainer.children].localY > 1) then local cell = itemsLayout.cells[1][1]
sidebarFromY = sidebarFromY + e5 local from = 0
updateSidebar() local to = -cell.childrenHeight + 1
MineOSInterface.mainContainer:drawOnScreen()
cell.verticalMargin = cell.verticalMargin + (e5 > 0 and 1 or -1)
if cell.verticalMargin > from then
cell.verticalMargin = from
elseif cell.verticalMargin < to then
cell.verticalMargin = to
end end
mainContainer:drawOnScreen()
end end
end end
@ -434,17 +456,17 @@ iconField.updateFileList = function(...)
updateScrollBar() updateScrollBar()
end end
local function calculateSizes(width, height) window.onResize = function(width, height)
sidebarContainer.height = height - 3 sidebarContainer.height = height - 3
sidebarPanel.width = sidebarContainer.width sidebarPanel.width = sidebarContainer.width
sidebarPanel.height = sidebarContainer.height sidebarPanel.height = sidebarContainer.height
sidebarContainer.itemsContainer.width = sidebarContainer.width itemsLayout.width = sidebarContainer.width
sidebarContainer.itemsContainer.height = sidebarContainer.height itemsLayout.height = sidebarContainer.height
for i = 1, #itemsLayout.children do
sidebarResizer.localX = sidebarContainer.width - 1 itemsLayout.children[i].width = itemsLayout.width
sidebarResizer.localY = math.floor(sidebarContainer.localY + sidebarContainer.height / 2 - sidebarResizer.height / 2 - 1) end
window.backgroundPanel.width = width - sidebarContainer.width window.backgroundPanel.width = width - sidebarContainer.width
window.backgroundPanel.height = height - 4 window.backgroundPanel.height = height - 4
@ -468,24 +490,11 @@ local function calculateSizes(width, height)
scrollBar.shownValueCount = scrollBar.height - 1 scrollBar.shownValueCount = scrollBar.height - 1
window.actionButtons:moveToFront() window.actionButtons:moveToFront()
end
window.onResize = function(width, height)
calculateSizes(width, height)
MineOSInterface.mainContainer:drawOnScreen() MineOSInterface.mainContainer:drawOnScreen()
updateFileListAndDraw() updateFileListAndDraw()
end end
sidebarResizer.onResize = function(dragWidth, dragHeight)
sidebarContainer.width = sidebarContainer.width + dragWidth
sidebarContainer.width = sidebarContainer.width >= 5 and sidebarContainer.width or 5
calculateSizes(window.width, window.height)
end
sidebarResizer.onResizeFinished = function()
updateFileListAndDraw()
end
local overrideMaximize = window.actionButtons.maximize.onTouch local overrideMaximize = window.actionButtons.maximize.onTouch
window.actionButtons.maximize.onTouch = function() window.actionButtons.maximize.onTouch = function()
iconField.yOffset = iconFieldYOffset iconField.yOffset = iconFieldYOffset

323
OS.lua
View File

@ -1,10 +1,8 @@
---------------------------------------- Либсы-хуибсы ----------------------------------------
local computer = require("computer") local computer = require("computer")
local component = require("component") local component = require("component")
local unicode = require("unicode") local unicode = require("unicode")
local fs = require("filesystem") local filesystem = require("filesystem")
local keyboard = require("keyboard") local keyboard = require("keyboard")
local event = require("event") local event = require("event")
local image = require("image") local image = require("image")
@ -16,37 +14,45 @@ local MineOSCore = require("MineOSCore")
local MineOSNetwork = require("MineOSNetwork") local MineOSNetwork = require("MineOSNetwork")
local MineOSInterface = require("MineOSInterface") local MineOSInterface = require("MineOSInterface")
---------------------------------------- Всякая константная залупа ---------------------------------------- ---------------------------------------- Constants ----------------------------------------
local dockTransparency = 0.4 local dockTransparency = 0.4
local doubleTouchInterval = 0.3
local realTimestamp local mainContainer
local bootUptime = computer.uptime() local bootUptime = computer.uptime()
local dateUptime = bootUptime local dateUptime = bootUptime
local screensaverUptime = bootUptime local screensaverUptime = bootUptime
local realTimestamp
local timezoneCorrection local timezoneCorrection
local screensaversPath = MineOSPaths.system .. "Screensavers/" local doubleTouchX
local overrideGUIDropDownMenu = GUI.dropDownMenu local doubleTouchY
local doubleTouchButton
local doubleTouchUptime
local doubleTouchScreenAddress
---------------------------------------- Основные функции ---------------------------------------- ---------------------------------------- UI methods ----------------------------------------
function MineOSInterface.changeWallpaper() function MineOSInterface.changeWallpaper()
MineOSInterface.mainContainer.background.wallpaper = nil mainContainer.backgroundObject.wallpaper = nil
if MineOSCore.properties.wallpaperEnabled and MineOSCore.properties.wallpaper then if MineOSCore.properties.wallpaperEnabled and MineOSCore.properties.wallpaper then
local result, reason = image.load(MineOSCore.properties.wallpaper) local result, reason = image.load(MineOSCore.properties.wallpaper)
if result then if result then
MineOSInterface.mainContainer.background.wallpaper, result = result, nil mainContainer.backgroundObject.wallpaper, result = result, nil
-- Fit to screen size mode
if MineOSCore.properties.wallpaperMode == 1 then if MineOSCore.properties.wallpaperMode == 1 then
MineOSInterface.mainContainer.background.wallpaper = image.transform(MineOSInterface.mainContainer.background.wallpaper, MineOSInterface.mainContainer.width, MineOSInterface.mainContainer.height) mainContainer.backgroundObject.wallpaper = image.transform(mainContainer.backgroundObject.wallpaper, mainContainer.width, mainContainer.height)
MineOSInterface.mainContainer.background.wallpaperPosition.x, MineOSInterface.mainContainer.background.wallpaperPosition.y = 1, 1 mainContainer.backgroundObject.wallpaperPosition.x, mainContainer.backgroundObject.wallpaperPosition.y = 1, 1
-- Centerized mode
else else
MineOSInterface.mainContainer.background.wallpaperPosition.x = math.floor(1 + MineOSInterface.mainContainer.width / 2 - image.getWidth(MineOSInterface.mainContainer.background.wallpaper) / 2) mainContainer.backgroundObject.wallpaperPosition.x = math.floor(1 + mainContainer.width / 2 - image.getWidth(mainContainer.backgroundObject.wallpaper) / 2)
MineOSInterface.mainContainer.background.wallpaperPosition.y = math.floor(1 + MineOSInterface.mainContainer.height / 2 - image.getHeight(MineOSInterface.mainContainer.background.wallpaper) / 2) mainContainer.backgroundObject.wallpaperPosition.y = math.floor(1 + mainContainer.height / 2 - image.getHeight(mainContainer.backgroundObject.wallpaper) / 2)
end end
local backgrounds, foregrounds, r, g, b = MineOSInterface.mainContainer.background.wallpaper[3], MineOSInterface.mainContainer.background.wallpaper[4] -- Brightness adjustment
local backgrounds, foregrounds, r, g, b = mainContainer.backgroundObject.wallpaper[3], mainContainer.backgroundObject.wallpaper[4]
for i = 1, #backgrounds do for i = 1, #backgrounds do
r, g, b = color.integerToRGB(backgrounds[i]) r, g, b = color.integerToRGB(backgrounds[i])
backgrounds[i] = color.RGBToInteger( backgrounds[i] = color.RGBToInteger(
@ -68,32 +74,30 @@ function MineOSInterface.changeWallpaper()
end end
end end
---------------------------------------- Всякая параша для ОС-контейнера ----------------------------------------
function MineOSInterface.changeResolution() function MineOSInterface.changeResolution()
buffer.setResolution(table.unpack(MineOSCore.properties.resolution or {buffer.getGPUProxy().maxResolution()})) buffer.setResolution(table.unpack(MineOSCore.properties.resolution or {buffer.getGPUProxy().maxResolution()}))
MineOSInterface.mainContainer.width, MineOSInterface.mainContainer.height = buffer.getResolution() mainContainer.width, mainContainer.height = buffer.getResolution()
MineOSInterface.mainContainer.iconField.width = MineOSInterface.mainContainer.width mainContainer.iconField.width = mainContainer.width
MineOSInterface.mainContainer.iconField.height = MineOSInterface.mainContainer.height mainContainer.iconField.height = mainContainer.height
MineOSInterface.mainContainer.iconField:updateFileList() mainContainer.iconField:updateFileList()
MineOSInterface.mainContainer.dockContainer.sort() mainContainer.dockContainer.sort()
MineOSInterface.mainContainer.dockContainer.localY = MineOSInterface.mainContainer.height - MineOSInterface.mainContainer.dockContainer.height + 1 mainContainer.dockContainer.localY = mainContainer.height - mainContainer.dockContainer.height + 1
MineOSInterface.mainContainer.menu.width = MineOSInterface.mainContainer.width mainContainer.menu.width = mainContainer.width
MineOSInterface.mainContainer.menuLayout.width = MineOSInterface.mainContainer.width mainContainer.menuLayout.width = mainContainer.width
MineOSInterface.mainContainer.background.width, MineOSInterface.mainContainer.background.height = MineOSInterface.mainContainer.width, MineOSInterface.mainContainer.height mainContainer.backgroundObject.width, mainContainer.backgroundObject.height = mainContainer.width, mainContainer.height
MineOSInterface.mainContainer.windowsContainer.width, MineOSInterface.mainContainer.windowsContainer.height = MineOSInterface.mainContainer.width, MineOSInterface.mainContainer.height - 1 mainContainer.windowsContainer.width, mainContainer.windowsContainer.height = mainContainer.width, mainContainer.height - 1
end end
local function moveDockIcon(index, direction) local function moveDockIcon(index, direction)
MineOSInterface.mainContainer.dockContainer.children[index], MineOSInterface.mainContainer.dockContainer.children[index + direction] = MineOSInterface.mainContainer.dockContainer.children[index + direction], MineOSInterface.mainContainer.dockContainer.children[index] mainContainer.dockContainer.children[index], mainContainer.dockContainer.children[index + direction] = mainContainer.dockContainer.children[index + direction], mainContainer.dockContainer.children[index]
MineOSInterface.mainContainer.dockContainer.sort() mainContainer.dockContainer.sort()
MineOSInterface.mainContainer.dockContainer.saveToOSSettings() mainContainer.dockContainer.saveToOSSettings()
MineOSInterface.mainContainer:drawOnScreen() mainContainer:drawOnScreen()
end end
local function getPercentageColor(pecent) local function getPercentageColor(pecent)
@ -110,28 +114,32 @@ local function getPercentageColor(pecent)
end end
end end
function MineOSInterface.applyTransparency() local function dockIconEventHandler(mainContainer, icon, e1, e2, e3, e4, e5, e6, ...)
GUI.dropDownMenu = function(...) if e1 == "touch" then
local menu = overrideGUIDropDownMenu(...) icon.selected = true
menu.colors.transparency.background = MineOSCore.properties.transparencyEnabled and GUI.CONTEXT_MENU_BACKGROUND_TRANSPARENCY mainContainer:drawOnScreen()
menu.colors.transparency.shadow = MineOSCore.properties.transparencyEnabled and GUI.CONTEXT_MENU_SHADOW_TRANSPARENCY
return menu if e5 == 1 then
icon.onRightClick(icon, e1, e2, e3, e4, e5, e6, ...)
else
icon.onLeftClick(icon, e1, e2, e3, e4, e5, e6, ...)
end
end end
end end
function MineOSInterface.createWidgets() function MineOSInterface.createWidgets()
MineOSInterface.mainContainer:removeChildren() mainContainer:removeChildren()
MineOSInterface.mainContainer.background = MineOSInterface.mainContainer:addChild(GUI.object(1, 1, 1, 1))
MineOSInterface.mainContainer.background.wallpaperPosition = {x = 1, y = 1} mainContainer.backgroundObject = mainContainer:addChild(GUI.object(1, 1, 1, 1))
MineOSInterface.mainContainer.background.draw = function(object) mainContainer.backgroundObject.wallpaperPosition = {x = 1, y = 1}
mainContainer.backgroundObject.draw = function(object)
buffer.drawRectangle(object.x, object.y, object.width, object.height, MineOSCore.properties.backgroundColor, 0, " ") buffer.drawRectangle(object.x, object.y, object.width, object.height, MineOSCore.properties.backgroundColor, 0, " ")
if object.wallpaper then if object.wallpaper then
buffer.drawImage(object.wallpaperPosition.x, object.wallpaperPosition.y, object.wallpaper) buffer.drawImage(object.wallpaperPosition.x, object.wallpaperPosition.y, object.wallpaper)
end end
end end
MineOSInterface.mainContainer.iconField = MineOSInterface.mainContainer:addChild( mainContainer.iconField = mainContainer:addChild(
MineOSInterface.iconField( MineOSInterface.iconField(
1, 2, 1, 1, 3, 2, 1, 2, 1, 1, 3, 2,
0xFFFFFF, 0xFFFFFF,
@ -139,53 +147,46 @@ function MineOSInterface.createWidgets()
MineOSPaths.desktop MineOSPaths.desktop
) )
) )
MineOSInterface.mainContainer.iconField.iconConfigEnabled = true
MineOSInterface.mainContainer.iconField.launchers.directory = function(icon) mainContainer.iconField.iconConfigEnabled = true
MineOSInterface.safeLaunch(MineOSPaths.explorer, "-o", icon.path)
end mainContainer.iconField.launchers.directory = function(icon)
MineOSInterface.mainContainer.iconField.launchers.showContainingFolder = function(icon)
MineOSInterface.safeLaunch(MineOSPaths.explorer, "-o", fs.path(icon.shortcutPath or icon.path))
end
MineOSInterface.mainContainer.iconField.launchers.showPackageContent = function(icon)
MineOSInterface.safeLaunch(MineOSPaths.explorer, "-o", icon.path) MineOSInterface.safeLaunch(MineOSPaths.explorer, "-o", icon.path)
end end
MineOSInterface.mainContainer.dockContainer = MineOSInterface.mainContainer:addChild(GUI.container(1, 1, MineOSInterface.mainContainer.width, 7)) mainContainer.iconField.launchers.showContainingFolder = function(icon)
MineOSInterface.mainContainer.dockContainer.saveToOSSettings = function() MineOSInterface.safeLaunch(MineOSPaths.explorer, "-o", filesystem.path(icon.shortcutPath or icon.path))
end
mainContainer.iconField.launchers.showPackageContent = function(icon)
MineOSInterface.safeLaunch(MineOSPaths.explorer, "-o", icon.path)
end
mainContainer.dockContainer = mainContainer:addChild(GUI.container(1, 1, mainContainer.width, 7))
mainContainer.dockContainer.saveToOSSettings = function()
MineOSCore.properties.dockShortcuts = {} MineOSCore.properties.dockShortcuts = {}
for i = 1, #MineOSInterface.mainContainer.dockContainer.children do for i = 1, #mainContainer.dockContainer.children do
if MineOSInterface.mainContainer.dockContainer.children[i].keepInDock then if mainContainer.dockContainer.children[i].keepInDock then
table.insert(MineOSCore.properties.dockShortcuts, MineOSInterface.mainContainer.dockContainer.children[i].path) table.insert(MineOSCore.properties.dockShortcuts, mainContainer.dockContainer.children[i].path)
end end
end end
MineOSCore.saveProperties() MineOSCore.saveProperties()
end end
MineOSInterface.mainContainer.dockContainer.sort = function()
mainContainer.dockContainer.sort = function()
local x = 4 local x = 4
for i = 1, #MineOSInterface.mainContainer.dockContainer.children do for i = 1, #mainContainer.dockContainer.children do
MineOSInterface.mainContainer.dockContainer.children[i].localX = x mainContainer.dockContainer.children[i].localX = x
x = x + MineOSCore.properties.iconWidth + MineOSCore.properties.iconHorizontalSpaceBetween x = x + MineOSCore.properties.iconWidth + MineOSCore.properties.iconHorizontalSpaceBetween
end end
MineOSInterface.mainContainer.dockContainer.width = #MineOSInterface.mainContainer.dockContainer.children * (MineOSCore.properties.iconWidth + MineOSCore.properties.iconHorizontalSpaceBetween) - MineOSCore.properties.iconHorizontalSpaceBetween + 6 mainContainer.dockContainer.width = #mainContainer.dockContainer.children * (MineOSCore.properties.iconWidth + MineOSCore.properties.iconHorizontalSpaceBetween) - MineOSCore.properties.iconHorizontalSpaceBetween + 6
MineOSInterface.mainContainer.dockContainer.localX = math.floor(MineOSInterface.mainContainer.width / 2 - MineOSInterface.mainContainer.dockContainer.width / 2) mainContainer.dockContainer.localX = math.floor(mainContainer.width / 2 - mainContainer.dockContainer.width / 2)
end end
local function dockIconEventHandler(mainContainer, icon, e1, e2, e3, e4, e5, e6, ...) mainContainer.dockContainer.addIcon = function(path, window)
if e1 == "touch" then local icon = mainContainer.dockContainer:addChild(MineOSInterface.icon(1, 2, path, 0x2D2D2D, 0xFFFFFF))
icon.selected = true
MineOSInterface.mainContainer:drawOnScreen()
if e5 == 1 then
icon.onRightClick(icon, e1, e2, e3, e4, e5, e6, ...)
else
icon.onLeftClick(icon, e1, e2, e3, e4, e5, e6, ...)
end
end
end
MineOSInterface.mainContainer.dockContainer.addIcon = function(path, window)
local icon = MineOSInterface.mainContainer.dockContainer:addChild(MineOSInterface.icon(1, 2, path, 0x2D2D2D, 0xFFFFFF))
icon:analyseExtension() icon:analyseExtension()
icon:moveBackward() icon:moveBackward()
@ -200,7 +201,7 @@ function MineOSInterface.createWidgets()
icon.selected = false icon.selected = false
MineOSInterface.updateMenu() MineOSInterface.updateMenu()
MineOSInterface.mainContainer:drawOnScreen() mainContainer:drawOnScreen()
else else
MineOSInterface.iconDoubleClick(icon, ...) MineOSInterface.iconDoubleClick(icon, ...)
end end
@ -208,11 +209,11 @@ function MineOSInterface.createWidgets()
icon.onRightClick = function(icon, e1, e2, e3, e4, ...) icon.onRightClick = function(icon, e1, e2, e3, e4, ...)
local indexOf = icon:indexOf() local indexOf = icon:indexOf()
local menu = GUI.addContextMenu(MineOSInterface.mainContainer, e3, e4) local menu = GUI.addContextMenu(mainContainer, e3, e4)
menu.onMenuClosed = function() menu.onMenuClosed = function()
icon.selected = false icon.selected = false
MineOSInterface.mainContainer:drawOnScreen() mainContainer:drawOnScreen()
end end
if icon.windows then if icon.windows then
@ -224,17 +225,17 @@ function MineOSInterface.createWidgets()
for window in pairs(icon.windows) do for window in pairs(icon.windows) do
window:close() window:close()
end end
MineOSInterface.mainContainer:drawOnScreen() mainContainer:drawOnScreen()
end end
end end
menu:addItem(MineOSCore.localization.showContainingFolder).onTouch = function() menu:addItem(MineOSCore.localization.showContainingFolder).onTouch = function()
MineOSInterface.safeLaunch(MineOSPaths.explorer, "-o", fs.path(icon.shortcutPath or icon.path)) MineOSInterface.safeLaunch(MineOSPaths.explorer, "-o", filesystem.path(icon.shortcutPath or icon.path))
end end
menu:addSeparator() menu:addSeparator()
menu:addItem(MineOSCore.localization.moveRight, indexOf >= #MineOSInterface.mainContainer.dockContainer.children - 1).onTouch = function() menu:addItem(MineOSCore.localization.moveRight, indexOf >= #mainContainer.dockContainer.children - 1).onTouch = function()
moveDockIcon(indexOf, 1) moveDockIcon(indexOf, 1)
end end
@ -245,37 +246,37 @@ function MineOSInterface.createWidgets()
menu:addSeparator() menu:addSeparator()
if icon.keepInDock then if icon.keepInDock then
if #MineOSInterface.mainContainer.dockContainer.children > 1 then if #mainContainer.dockContainer.children > 1 then
menu:addItem(MineOSCore.localization.removeFromDock).onTouch = function() menu:addItem(MineOSCore.localization.removeFromDock).onTouch = function()
if icon.windows then if icon.windows then
icon.keepInDock = nil icon.keepInDock = nil
else else
icon:remove() icon:remove()
MineOSInterface.mainContainer.dockContainer.sort() mainContainer.dockContainer.sort()
end end
MineOSInterface.mainContainer.dockContainer.saveToOSSettings() mainContainer.dockContainer.saveToOSSettings()
MineOSInterface.mainContainer:drawOnScreen() mainContainer:drawOnScreen()
end end
end end
else else
if icon.windows then if icon.windows then
menu:addItem(MineOSCore.localization.keepInDock).onTouch = function() menu:addItem(MineOSCore.localization.keepInDock).onTouch = function()
icon.keepInDock = true icon.keepInDock = true
MineOSInterface.mainContainer.dockContainer.saveToOSSettings() mainContainer.dockContainer.saveToOSSettings()
end end
end end
end end
MineOSInterface.mainContainer:drawOnScreen() mainContainer:drawOnScreen()
end end
MineOSInterface.mainContainer.dockContainer.sort() mainContainer.dockContainer.sort()
return icon return icon
end end
-- Trash -- Trash
local icon = MineOSInterface.mainContainer.dockContainer.addIcon(MineOSPaths.trash) local icon = mainContainer.dockContainer.addIcon(MineOSPaths.trash)
icon.launchers.directory = function(icon) icon.launchers.directory = function(icon)
MineOSInterface.safeLaunch(MineOSPaths.explorer, "-o", icon.path) MineOSInterface.safeLaunch(MineOSPaths.explorer, "-o", icon.path)
end end
@ -289,19 +290,19 @@ function MineOSInterface.createWidgets()
end end
icon.onRightClick = function(icon, e1, e2, e3, e4) icon.onRightClick = function(icon, e1, e2, e3, e4)
local menu = GUI.addContextMenu(MineOSInterface.mainContainer, e3, e4) local menu = GUI.addContextMenu(mainContainer, e3, e4)
menu.onMenuClosed = function() menu.onMenuClosed = function()
icon.selected = false icon.selected = false
MineOSInterface.mainContainer:drawOnScreen() mainContainer:drawOnScreen()
end end
menu:addItem(MineOSCore.localization.emptyTrash).onTouch = function() menu:addItem(MineOSCore.localization.emptyTrash).onTouch = function()
local container = MineOSInterface.addBackgroundContainer(MineOSInterface.mainContainer, MineOSCore.localization.areYouSure) local container = MineOSInterface.addBackgroundContainer(mainContainer, MineOSCore.localization.areYouSure)
container.layout:addChild(GUI.button(1, 1, 30, 1, 0xE1E1E1, 0x2D2D2D, 0xA5A5A5, 0x2D2D2D, "OK")).onTouch = function() container.layout:addChild(GUI.button(1, 1, 30, 1, 0xE1E1E1, 0x2D2D2D, 0xA5A5A5, 0x2D2D2D, "OK")).onTouch = function()
for file in fs.list(MineOSPaths.trash) do for file in filesystem.list(MineOSPaths.trash) do
fs.remove(MineOSPaths.trash .. file) filesystem.remove(MineOSPaths.trash .. file)
end end
container:remove() container:remove()
computer.pushSignal("MineOSCore", "updateFileList") computer.pushSignal("MineOSCore", "updateFileList")
@ -309,22 +310,22 @@ function MineOSInterface.createWidgets()
container.panel.onTouch = function() container.panel.onTouch = function()
container:remove() container:remove()
MineOSInterface.mainContainer:drawOnScreen() mainContainer:drawOnScreen()
end end
MineOSInterface.mainContainer:drawOnScreen() mainContainer:drawOnScreen()
end end
MineOSInterface.mainContainer:drawOnScreen() mainContainer:drawOnScreen()
end end
for i = 1, #MineOSCore.properties.dockShortcuts do for i = 1, #MineOSCore.properties.dockShortcuts do
MineOSInterface.mainContainer.dockContainer.addIcon(MineOSCore.properties.dockShortcuts[i]).keepInDock = true mainContainer.dockContainer.addIcon(MineOSCore.properties.dockShortcuts[i]).keepInDock = true
end end
-- Draw dock drawDock dockDraw cyka заебался искать, блядь -- Draw dock drawDock dockDraw cyka заебался искать, блядь
local overrideDockContainerDraw = MineOSInterface.mainContainer.dockContainer.draw local overrideDockContainerDraw = mainContainer.dockContainer.draw
MineOSInterface.mainContainer.dockContainer.draw = function(dockContainer) mainContainer.dockContainer.draw = function(dockContainer)
local color, currentDockTransparency, currentDockWidth, xPos = MineOSCore.properties.dockColor, dockTransparency, dockContainer.width - 2, dockContainer.x local color, currentDockTransparency, currentDockWidth, xPos = MineOSCore.properties.dockColor, dockTransparency, dockContainer.width - 2, dockContainer.x
for y = dockContainer.y + dockContainer.height - 1, dockContainer.y + dockContainer.height - 4, -1 do for y = dockContainer.y + dockContainer.height - 1, dockContainer.y + dockContainer.height - 4, -1 do
@ -341,13 +342,13 @@ function MineOSInterface.createWidgets()
overrideDockContainerDraw(dockContainer) overrideDockContainerDraw(dockContainer)
end end
MineOSInterface.mainContainer.windowsContainer = MineOSInterface.mainContainer:addChild(GUI.container(1, 2, 1, 1)) mainContainer.windowsContainer = mainContainer:addChild(GUI.container(1, 2, 1, 1))
MineOSInterface.mainContainer.menu = MineOSInterface.mainContainer:addChild(GUI.menu(1, 1, MineOSInterface.mainContainer.width, MineOSCore.properties.menuColor, 0x696969, 0x3366CC, 0xFFFFFF)) mainContainer.menu = mainContainer:addChild(GUI.menu(1, 1, mainContainer.width, MineOSCore.properties.menuColor, 0x696969, 0x3366CC, 0xFFFFFF))
local MineOSContextMenu = MineOSInterface.mainContainer.menu:addContextMenu("MineOS", 0x000000) local MineOSContextMenu = mainContainer.menu:addContextMenu("MineOS", 0x000000)
MineOSContextMenu:addItem(MineOSCore.localization.aboutSystem).onTouch = function() MineOSContextMenu:addItem(MineOSCore.localization.aboutSystem).onTouch = function()
local container = MineOSInterface.addBackgroundContainer(MineOSInterface.mainContainer, MineOSCore.localization.aboutSystem) local container = MineOSInterface.addBackgroundContainer(mainContainer, MineOSCore.localization.aboutSystem)
container.layout:removeChildren() container.layout:removeChildren()
local lines = { local lines = {
@ -387,7 +388,7 @@ function MineOSInterface.createWidgets()
textBox:setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP) textBox:setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP)
textBox.eventHandler = container.panel.eventHandler textBox.eventHandler = container.panel.eventHandler
MineOSInterface.mainContainer:drawOnScreen() mainContainer:drawOnScreen()
end end
MineOSContextMenu:addItem(MineOSCore.localization.updates).onTouch = function() MineOSContextMenu:addItem(MineOSCore.localization.updates).onTouch = function()
@ -410,16 +411,16 @@ function MineOSInterface.createWidgets()
MineOSContextMenu:addItem(MineOSCore.localization.returnToShell).onTouch = function() MineOSContextMenu:addItem(MineOSCore.localization.returnToShell).onTouch = function()
MineOSNetwork.broadcastComputerState(false) MineOSNetwork.broadcastComputerState(false)
MineOSInterface.mainContainer:stopEventHandling() mainContainer:stopEventHandling()
MineOSInterface.clearTerminal() MineOSInterface.clearTerminal()
os.exit() os.exit()
end end
MineOSInterface.mainContainer.menuLayout = MineOSInterface.mainContainer:addChild(GUI.layout(1, 1, 1, 1, 1, 1)) mainContainer.menuLayout = mainContainer:addChild(GUI.layout(1, 1, 1, 1, 1, 1))
MineOSInterface.mainContainer.menuLayout:setDirection(1, 1, GUI.DIRECTION_HORIZONTAL) mainContainer.menuLayout:setDirection(1, 1, GUI.DIRECTION_HORIZONTAL)
MineOSInterface.mainContainer.menuLayout:setAlignment(1, 1, GUI.ALIGNMENT_HORIZONTAL_RIGHT, GUI.ALIGNMENT_VERTICAL_TOP) mainContainer.menuLayout:setAlignment(1, 1, GUI.ALIGNMENT_HORIZONTAL_RIGHT, GUI.ALIGNMENT_VERTICAL_TOP)
MineOSInterface.mainContainer.menuLayout:setMargin(1, 1, 1, 0) mainContainer.menuLayout:setMargin(1, 1, 1, 0)
MineOSInterface.mainContainer.menuLayout:setSpacing(1, 1, 2) mainContainer.menuLayout:setSpacing(1, 1, 2)
local dateWidget, dateWidgetText = MineOSInterface.addMenuWidget(MineOSInterface.menuWidget(1)) local dateWidget, dateWidgetText = MineOSInterface.addMenuWidget(MineOSInterface.menuWidget(1))
dateWidget.drawContent = function() dateWidget.drawContent = function()
@ -480,31 +481,31 @@ function MineOSInterface.createWidgets()
end end
MineOSInterface.updateFileListAndDraw = function(...) MineOSInterface.updateFileListAndDraw = function(...)
MineOSInterface.mainContainer.iconField:updateFileList() mainContainer.iconField:updateFileList()
MineOSInterface.mainContainer:drawOnScreen(...) mainContainer:drawOnScreen(...)
end end
local lastWindowHandled local lastWindowHandled
MineOSInterface.mainContainer.eventHandler = function(mainContainer, object, e1, e2, e3, e4) mainContainer.eventHandler = function(mainContainer, object, e1, e2, e3, e4)
if e1 == "key_down" then if e1 == "key_down" then
local windowsCount = #MineOSInterface.mainContainer.windowsContainer.children local windowsCount = #mainContainer.windowsContainer.children
-- Ctrl or CMD -- Ctrl or CMD
if windowsCount > 0 and not lastWindowHandled and (keyboard.isKeyDown(29) or keyboard.isKeyDown(219)) then if windowsCount > 0 and not lastWindowHandled and (keyboard.isKeyDown(29) or keyboard.isKeyDown(219)) then
-- W -- W
if e4 == 17 then if e4 == 17 then
MineOSInterface.mainContainer.windowsContainer.children[windowsCount]:close() mainContainer.windowsContainer.children[windowsCount]:close()
lastWindowHandled = true lastWindowHandled = true
mainContainer:drawOnScreen() mainContainer:drawOnScreen()
-- H -- H
elseif e4 == 35 then elseif e4 == 35 then
local lastUnhiddenWindowIndex = 1 local lastUnhiddenWindowIndex = 1
for i = 1, #MineOSInterface.mainContainer.windowsContainer.children do for i = 1, #mainContainer.windowsContainer.children do
if not MineOSInterface.mainContainer.windowsContainer.children[i].hidden then if not mainContainer.windowsContainer.children[i].hidden then
lastUnhiddenWindowIndex = i lastUnhiddenWindowIndex = i
end end
end end
MineOSInterface.mainContainer.windowsContainer.children[lastUnhiddenWindowIndex]:minimize() mainContainer.windowsContainer.children[lastUnhiddenWindowIndex]:minimize()
lastWindowHandled = true lastWindowHandled = true
mainContainer:drawOnScreen() mainContainer:drawOnScreen()
@ -519,7 +520,7 @@ function MineOSInterface.createWidgets()
MineOSInterface.updateFileListAndDraw(true) MineOSInterface.updateFileListAndDraw(true)
elseif e2 == "updateWallpaper" then elseif e2 == "updateWallpaper" then
MineOSInterface.changeWallpaper() MineOSInterface.changeWallpaper()
MineOSInterface.mainContainer:drawOnScreen() mainContainer:drawOnScreen()
end end
elseif e1 == "MineOSNetwork" then elseif e1 == "MineOSNetwork" then
if e2 == "accessDenied" then if e2 == "accessDenied" then
@ -531,7 +532,7 @@ function MineOSInterface.createWidgets()
if computer.uptime() - dateUptime >= 1 then if computer.uptime() - dateUptime >= 1 then
MineOSCore.updateTime() MineOSCore.updateTime()
MineOSInterface.mainContainer:drawOnScreen() mainContainer:drawOnScreen()
dateUptime = computer.uptime() dateUptime = computer.uptime()
end end
@ -541,9 +542,9 @@ function MineOSInterface.createWidgets()
end end
if dateUptime - screensaverUptime >= MineOSCore.properties.screensaverDelay then if dateUptime - screensaverUptime >= MineOSCore.properties.screensaverDelay then
if fs.exists(MineOSCore.properties.screensaver) then if filesystem.exists(MineOSCore.properties.screensaver) then
MineOSInterface.safeLaunch(MineOSCore.properties.screensaver) MineOSInterface.safeLaunch(MineOSCore.properties.screensaver)
MineOSInterface.mainContainer:drawOnScreen(true) mainContainer:drawOnScreen(true)
end end
screensaverUptime = computer.uptime() screensaverUptime = computer.uptime()
@ -551,26 +552,12 @@ function MineOSInterface.createWidgets()
end end
end end
MineOSInterface.menuInitialChildren = MineOSInterface.mainContainer.menu.children MineOSInterface.menuInitialChildren = mainContainer.menu.children
end end
local function updateCurrentTimestamp() ---------------------------------------- Main loop ----------------------------------------
local name = MineOSPaths.system .. "/Timestamp.tmp"
local file = io.open(name, "w")
file:close()
realTimestamp = math.floor(fs.lastModified(name) / 1000)
fs.remove(name)
end
local function createOSWindow()
MineOSInterface.mainContainer = GUI.fullScreenContainer()
MineOSInterface.createWidgets()
MineOSInterface.changeResolution()
MineOSInterface.changeWallpaper()
MineOSCore.updateTimezone()
end
-- Runs tasks before/after OS UI initialization
local function runTasks(mode) local function runTasks(mode)
for i = 1, #MineOSCore.properties.tasks do for i = 1, #MineOSCore.properties.tasks do
local task = MineOSCore.properties.tasks[i] local task = MineOSCore.properties.tasks[i]
@ -580,33 +567,65 @@ local function runTasks(mode)
end end
end end
---------------------------------------- Сама ОС ---------------------------------------- -- Creates OS main container and all its widgets
local function createWidgets()
mainContainer = GUI.fullScreenContainer()
MineOSInterface.mainContainer = mainContainer
MineOSInterface.createWidgets()
MineOSInterface.changeResolution()
MineOSInterface.changeWallpaper()
MineOSCore.updateTimezone()
end
-- "double_touch" event handler
if not event.doubleTouchHandler then
event.doubleTouchHandler = event.addHandler(
function(signalType, screenAddress, x, y, button, user)
local uptime = computer.uptime()
if doubleTouchX == x and doubleTouchY == y and doubleTouchButton == button and doubleTouchScreenAddress == screenAddress and uptime - doubleTouchUptime <= doubleTouchInterval then
event.skip("touch")
computer.pushSignal("double_touch", screenAddress, x, y, button, user)
end
doubleTouchX, doubleTouchY, doubleTouchButton, doubleTouchUptime, doubleTouchScreenAddress = x, y, button, uptime, screenAddress
end,
"touch"
)
end
-- Optaining temporary file's last modified UNIX timestamp
local temporaryPath = MineOSPaths.system .. "Timestamp.tmp"
local file = io.open(temporaryPath, "w")
file:close()
realTimestamp = math.floor(filesystem.lastModified(temporaryPath) / 1000)
filesystem.remove(temporaryPath)
-- Localization loading
MineOSCore.localization = MineOSCore.getLocalization(MineOSPaths.localizationFiles) MineOSCore.localization = MineOSCore.getLocalization(MineOSPaths.localizationFiles)
-- Tasks and UI initialization
runTasks(2) runTasks(2)
createWidgets()
MineOSInterface.applyTransparency() mainContainer:drawOnScreen()
updateCurrentTimestamp()
createOSWindow()
MineOSInterface.mainContainer:drawOnScreen()
MineOSNetwork.update() MineOSNetwork.update()
runTasks(1) runTasks(1)
-- Loops with UI regeneration after errors
while true do while true do
local success, path, line, traceback = MineOSCore.call( local success, path, line, traceback = MineOSCore.call(
MineOSInterface.mainContainer.startEventHandling, mainContainer.startEventHandling,
MineOSInterface.mainContainer, mainContainer,
0 0
) )
if success then if success then
break break
else else
createOSWindow() createWidgets()
MineOSInterface.mainContainer:drawOnScreen() mainContainer:drawOnScreen()
MineOSInterface.showErrorWindow(path, line, traceback) MineOSInterface.showErrorWindow(path, line, traceback)
MineOSInterface.mainContainer:drawOnScreen() mainContainer:drawOnScreen()
end end
end end

View File

@ -27,17 +27,17 @@ function event.addHandler(callback, signalType, times, interval)
checkArg(3, times, "number", "nil") checkArg(3, times, "number", "nil")
checkArg(4, nextTriggerTime, "number", "nil") checkArg(4, nextTriggerTime, "number", "nil")
local ID = math.random(0x7FFFFFFF) local ID
while handlers[ID] do repeat
ID = math.random(0x7FFFFFFF) ID = math.random(0x7FFFFFFF)
end until not handlers[ID]
handlers[ID] = { handlers[ID] = {
signalType = signalType, signalType = signalType,
callback = callback, callback = callback,
times = times or mathHuge, times = times or mathHuge,
interval = interval, interval = interval,
nextTriggerTime = interval and (computerUptime() + interval) or 0 nextTriggerTime = interval and computerUptime() + interval or 0
} }
return ID return ID
@ -48,6 +48,7 @@ function event.removeHandler(ID)
if handlers[ID] then if handlers[ID] then
handlers[ID] = nil handlers[ID] = nil
return true return true
else else
return false, "No registered handlers found for ID " .. ID return false, "No registered handlers found for ID " .. ID
@ -71,7 +72,7 @@ function event.listen(signalType, callback)
checkArg(2, callback, "function") checkArg(2, callback, "function")
for ID, handler in pairs(handlers) do for ID, handler in pairs(handlers) do
if handler.callback == callback then if handler.callback == callback and handler.signalType == signalType then
return false, "Callback method " .. tostring(callback) .. " is already registered" return false, "Callback method " .. tostring(callback) .. " is already registered"
end end
end end
@ -189,19 +190,4 @@ end
-------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------
local doubleTouchInterval, lastTouchX, lastTouchY, lastTouchButton, lastTouchUptime, lastTouchScreenAddress = 0.3, 0, 0, 0, 0
event.listen("touch", function(signalType, screenAddress, x, y, button, user)
local uptime = computerUptime()
if lastTouchX == x and lastTouchY == y and lastTouchButton == button and lastTouchScreenAddress == screenAddress and uptime - lastTouchUptime <= doubleTouchInterval then
event.skip("touch")
computer.pushSignal("double_touch", screenAddress, x, y, button, user)
end
lastTouchX, lastTouchY, lastTouchButton, lastTouchUptime, lastTouchScreenAddress = x, y, button, uptime, screenAddress
end)
--------------------------------------------------------------------------------------------------------
return event return event