diff --git a/Applications/Finder/Icon.pic b/Applications/Finder/Icon.pic index 944f7d70..59d9e4a8 100644 Binary files a/Applications/Finder/Icon.pic and b/Applications/Finder/Icon.pic differ diff --git a/Applications/Finder/Main.lua b/Applications/Finder/Main.lua index 0991dbc9..24f119c8 100644 --- a/Applications/Finder/Main.lua +++ b/Applications/Finder/Main.lua @@ -11,7 +11,13 @@ local MineOSInterface = require("MineOSInterface") 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 = { {name = "Root", path = "/"}, @@ -22,42 +28,42 @@ local favourites = { {name = "Libraries", path = "/lib/"}, {name = "Trash", path = MineOSPaths.trash}, } -local resourcesPath = MineOSCore.getCurrentScriptDirectory() -local favouritesPath = MineOSPaths.applicationData .. "Finder/Favourites3.cfg" -local sidebarFromY = 1 local iconFieldYOffset = 2 local scrollTimerID local workpathHistory = {} 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, "<")) -prevButton.colors.disabled.background = prevButton.colors.default.background -prevButton.colors.disabled.text = 0xC3C3C3 +local prevButton = window:addChild(GUI.adaptiveRoundedButton(9, 2, 1, 0, 0x5A5A5A, 0xC3C3C3, 0x2D2D2D, 0xE1E1E1, "<")) +prevButton.colors.disabled.background = 0x4B4B4B +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 -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.disabled = not MineOSNetwork.internetProxy local sidebarContainer = window:addChild(GUI.container(1, 4, 20, 1)) local sidebarPanel = sidebarContainer:addChild(GUI.object(1, 1, sidebarContainer.width, 1, 0xFFFFFF)) 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 -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)) @@ -67,12 +73,10 @@ scrollBar.eventHandler = nil local statusBar = window:addChild(GUI.object(1, 1, 1, 1)) statusBar.draw = function(object) - buffer.drawRectangle(object.x, object.y, object.width, object.height, 0xFFFFFF, 0x3C3C3C, " ") - buffer.drawText(object.x + 1, object.y, 0x3C3C3C, string.limit(("root/" .. iconField.workpath):gsub("/+$", ""):gsub("%/+", " ► "), object.width - 2, "left")) + buffer.drawRectangle(object.x, object.y, object.width, object.height, 0xF0F0F0, 0xA5A5A5, " ") + buffer.drawText(object.x + 1, object.y, 0xA5A5A5, string.limit(("root/" .. iconField.workpath):gsub("/+$", ""):gsub("%/+", " ► "), object.width - 2, "left")) end -local sidebarResizer = window:addChild(GUI.resizer(1, 4, 3, 5, 0xFFFFFF, 0x0)) - ------------------------------------------------------------------------------------------------------ local function saveFavourites() @@ -120,32 +124,56 @@ local function addWorkpath(path) iconField:setWorkpath(path) end -local function newSidebarItem(y, textColor, text, path) - local object = sidebarContainer.itemsContainer:addChild(GUI.object(1, y, 1, 1)) - - if text then - object.draw = function(object) - object.width = sidebarContainer.itemsContainer.width +local function sidebarItemDraw(object) + 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, " ") - 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 + if object.onRemove then + limit = limit - 2 + buffer.drawText(object.x + object.width - 2, object.y, 0x969696, "x") 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 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) if fs.exists(path) then addWorkpath(path) @@ -172,104 +200,98 @@ openFTP = function(...) end updateSidebar = function() - local y = sidebarFromY - sidebarContainer.itemsContainer:removeChildren() + itemsLayout:removeChildren() - newSidebarItem(y, 0x3C3C3C, MineOSCore.localization.favourite) - y = y + 1 + -- Favourites + addSidebarTitle(MineOSCore.localization.favourite) + 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) - if e5 == 1 then - 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 + object.onTouch = function(e1, e2, e3) + onFavouriteTouch(favourites[i].path) end - y = y + 1 + object.onRemove = function() + table.remove(favourites, i) + updateSidebar() + mainContainer:drawOnScreen() + saveFavourites() + end end + addSidebarSeparator() + + -- Modem connections local added = false for proxy, path in fs.mounts() do if proxy.MineOSNetworkModem then if not added then - y = y + 1 - newSidebarItem(y, 0x3C3C3C, MineOSCore.localization.network) - y, added = y + 1, true + addSidebarTitle(MineOSCore.localization.network) + added = true end - newSidebarItem(y, 0x555555, " " .. MineOSNetwork.getModemProxyName(proxy), path .. "/").onTouch = function() + addSidebarItem(" " .. MineOSNetwork.getModemProxyName(proxy), path .. "/").onTouch = function() addWorkpath(path .. "/") updateFileListAndDraw() end - - y = y + 1 end end + if added then + addSidebarSeparator() + end + + -- FTP connections if MineOSNetwork.internetProxy and #MineOSCore.properties.FTPConnections > 0 then - y = y + 1 - newSidebarItem(y, 0x3C3C3C, MineOSCore.localization.networkFTPConnections) - y = y + 1 + addSidebarTitle(MineOSCore.localization.networkFTPConnections) for i = 1, #MineOSCore.properties.FTPConnections do local connection = MineOSCore.properties.FTPConnections[i] local name = MineOSNetwork.getFTPProxyName(connection.address, connection.port, connection.user) local mountPath = MineOSNetwork.mountPaths.FTP .. name .. "/" - newSidebarItem(y, 0x555555, " " .. name, mountPath).onTouch = function(e1, e2, e3, e4, e5) - if e5 == 1 then - local menu = GUI.addContextMenu(mainContainer, e3, e4) - - menu:addItem(MineOSCore.localization.delete).onTouch = function() - table.remove(MineOSCore.properties.FTPConnections, i) - MineOSCore.saveProperties() - updateSidebar() - MineOSInterface.mainContainer:drawOnScreen() - end - - mainContainer:drawOnScreen() - else - openFTP(connection.address, connection.port, connection.user, connection.password) - end + local object = addSidebarItem(" " .. name, mountPath) + + object.onTouch = function(e1, e2, e3, e4, e5) + openFTP(connection.address, connection.port, connection.user, connection.password) end - y = y + 1 + object.onRemove = function() + table.remove(MineOSCore.properties.FTPConnections, i) + updateSidebar() + mainContainer:drawOnScreen() + MineOSCore.saveProperties() + end end end - y = y + 1 - newSidebarItem(y, 0x3C3C3C, MineOSCore.localization.mounts) - y = y + 1 + -- Mounts + addSidebarTitle(MineOSCore.localization.mounts) + for proxy, path in fs.mounts() do 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 .. "/") end - - y = y + 1 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 (e5 > 0 and sidebarFromY < 1) or (e5 < 0 and sidebarContainer.itemsContainer.children[#sidebarContainer.itemsContainer.children].localY > 1) then - sidebarFromY = sidebarFromY + e5 - updateSidebar() - MineOSInterface.mainContainer:drawOnScreen() + local cell = itemsLayout.cells[1][1] + local from = 0 + local to = -cell.childrenHeight + 1 + + 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 + + mainContainer:drawOnScreen() end end @@ -434,17 +456,17 @@ iconField.updateFileList = function(...) updateScrollBar() end -local function calculateSizes(width, height) +window.onResize = function(width, height) sidebarContainer.height = height - 3 sidebarPanel.width = sidebarContainer.width sidebarPanel.height = sidebarContainer.height - sidebarContainer.itemsContainer.width = sidebarContainer.width - sidebarContainer.itemsContainer.height = sidebarContainer.height - - sidebarResizer.localX = sidebarContainer.width - 1 - sidebarResizer.localY = math.floor(sidebarContainer.localY + sidebarContainer.height / 2 - sidebarResizer.height / 2 - 1) + itemsLayout.width = sidebarContainer.width + itemsLayout.height = sidebarContainer.height + for i = 1, #itemsLayout.children do + itemsLayout.children[i].width = itemsLayout.width + end window.backgroundPanel.width = width - sidebarContainer.width window.backgroundPanel.height = height - 4 @@ -468,24 +490,11 @@ local function calculateSizes(width, height) scrollBar.shownValueCount = scrollBar.height - 1 window.actionButtons:moveToFront() -end -window.onResize = function(width, height) - calculateSizes(width, height) MineOSInterface.mainContainer:drawOnScreen() updateFileListAndDraw() 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 window.actionButtons.maximize.onTouch = function() iconField.yOffset = iconFieldYOffset diff --git a/OS.lua b/OS.lua index 07eff844..afec912a 100755 --- a/OS.lua +++ b/OS.lua @@ -1,10 +1,8 @@ ----------------------------------------- Либсы-хуибсы ---------------------------------------- - local computer = require("computer") local component = require("component") local unicode = require("unicode") -local fs = require("filesystem") +local filesystem = require("filesystem") local keyboard = require("keyboard") local event = require("event") local image = require("image") @@ -16,37 +14,45 @@ local MineOSCore = require("MineOSCore") local MineOSNetwork = require("MineOSNetwork") local MineOSInterface = require("MineOSInterface") ----------------------------------------- Всякая константная залупа ---------------------------------------- +---------------------------------------- Constants ---------------------------------------- local dockTransparency = 0.4 +local doubleTouchInterval = 0.3 -local realTimestamp +local mainContainer local bootUptime = computer.uptime() local dateUptime = bootUptime local screensaverUptime = bootUptime +local realTimestamp local timezoneCorrection -local screensaversPath = MineOSPaths.system .. "Screensavers/" -local overrideGUIDropDownMenu = GUI.dropDownMenu +local doubleTouchX +local doubleTouchY +local doubleTouchButton +local doubleTouchUptime +local doubleTouchScreenAddress ----------------------------------------- Основные функции ---------------------------------------- +---------------------------------------- UI methods ---------------------------------------- function MineOSInterface.changeWallpaper() - MineOSInterface.mainContainer.background.wallpaper = nil + mainContainer.backgroundObject.wallpaper = nil if MineOSCore.properties.wallpaperEnabled and MineOSCore.properties.wallpaper then local result, reason = image.load(MineOSCore.properties.wallpaper) 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 - MineOSInterface.mainContainer.background.wallpaper = image.transform(MineOSInterface.mainContainer.background.wallpaper, MineOSInterface.mainContainer.width, MineOSInterface.mainContainer.height) - MineOSInterface.mainContainer.background.wallpaperPosition.x, MineOSInterface.mainContainer.background.wallpaperPosition.y = 1, 1 + mainContainer.backgroundObject.wallpaper = image.transform(mainContainer.backgroundObject.wallpaper, mainContainer.width, mainContainer.height) + mainContainer.backgroundObject.wallpaperPosition.x, mainContainer.backgroundObject.wallpaperPosition.y = 1, 1 + -- Centerized mode else - MineOSInterface.mainContainer.background.wallpaperPosition.x = math.floor(1 + MineOSInterface.mainContainer.width / 2 - image.getWidth(MineOSInterface.mainContainer.background.wallpaper) / 2) - MineOSInterface.mainContainer.background.wallpaperPosition.y = math.floor(1 + MineOSInterface.mainContainer.height / 2 - image.getHeight(MineOSInterface.mainContainer.background.wallpaper) / 2) + mainContainer.backgroundObject.wallpaperPosition.x = math.floor(1 + mainContainer.width / 2 - image.getWidth(mainContainer.backgroundObject.wallpaper) / 2) + mainContainer.backgroundObject.wallpaperPosition.y = math.floor(1 + mainContainer.height / 2 - image.getHeight(mainContainer.backgroundObject.wallpaper) / 2) 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 r, g, b = color.integerToRGB(backgrounds[i]) backgrounds[i] = color.RGBToInteger( @@ -68,32 +74,30 @@ function MineOSInterface.changeWallpaper() end end ----------------------------------------- Всякая параша для ОС-контейнера ---------------------------------------- - function MineOSInterface.changeResolution() 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 - MineOSInterface.mainContainer.iconField.height = MineOSInterface.mainContainer.height - MineOSInterface.mainContainer.iconField:updateFileList() + mainContainer.iconField.width = mainContainer.width + mainContainer.iconField.height = mainContainer.height + mainContainer.iconField:updateFileList() - MineOSInterface.mainContainer.dockContainer.sort() - MineOSInterface.mainContainer.dockContainer.localY = MineOSInterface.mainContainer.height - MineOSInterface.mainContainer.dockContainer.height + 1 + mainContainer.dockContainer.sort() + mainContainer.dockContainer.localY = mainContainer.height - mainContainer.dockContainer.height + 1 - MineOSInterface.mainContainer.menu.width = MineOSInterface.mainContainer.width - MineOSInterface.mainContainer.menuLayout.width = MineOSInterface.mainContainer.width - MineOSInterface.mainContainer.background.width, MineOSInterface.mainContainer.background.height = MineOSInterface.mainContainer.width, MineOSInterface.mainContainer.height + mainContainer.menu.width = mainContainer.width + mainContainer.menuLayout.width = mainContainer.width + 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 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] - MineOSInterface.mainContainer.dockContainer.sort() - MineOSInterface.mainContainer.dockContainer.saveToOSSettings() - MineOSInterface.mainContainer:drawOnScreen() + mainContainer.dockContainer.children[index], mainContainer.dockContainer.children[index + direction] = mainContainer.dockContainer.children[index + direction], mainContainer.dockContainer.children[index] + mainContainer.dockContainer.sort() + mainContainer.dockContainer.saveToOSSettings() + mainContainer:drawOnScreen() end local function getPercentageColor(pecent) @@ -110,28 +114,32 @@ local function getPercentageColor(pecent) end end -function MineOSInterface.applyTransparency() - GUI.dropDownMenu = function(...) - local menu = overrideGUIDropDownMenu(...) - menu.colors.transparency.background = MineOSCore.properties.transparencyEnabled and GUI.CONTEXT_MENU_BACKGROUND_TRANSPARENCY - menu.colors.transparency.shadow = MineOSCore.properties.transparencyEnabled and GUI.CONTEXT_MENU_SHADOW_TRANSPARENCY +local function dockIconEventHandler(mainContainer, icon, e1, e2, e3, e4, e5, e6, ...) + if e1 == "touch" then + icon.selected = true + mainContainer:drawOnScreen() - 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 function MineOSInterface.createWidgets() - MineOSInterface.mainContainer:removeChildren() - MineOSInterface.mainContainer.background = MineOSInterface.mainContainer:addChild(GUI.object(1, 1, 1, 1)) - MineOSInterface.mainContainer.background.wallpaperPosition = {x = 1, y = 1} - MineOSInterface.mainContainer.background.draw = function(object) + mainContainer:removeChildren() + + mainContainer.backgroundObject = mainContainer:addChild(GUI.object(1, 1, 1, 1)) + 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, " ") if object.wallpaper then buffer.drawImage(object.wallpaperPosition.x, object.wallpaperPosition.y, object.wallpaper) end end - MineOSInterface.mainContainer.iconField = MineOSInterface.mainContainer:addChild( + mainContainer.iconField = mainContainer:addChild( MineOSInterface.iconField( 1, 2, 1, 1, 3, 2, 0xFFFFFF, @@ -139,53 +147,46 @@ function MineOSInterface.createWidgets() MineOSPaths.desktop ) ) - MineOSInterface.mainContainer.iconField.iconConfigEnabled = true - MineOSInterface.mainContainer.iconField.launchers.directory = function(icon) + + mainContainer.iconField.iconConfigEnabled = true + + mainContainer.iconField.launchers.directory = function(icon) MineOSInterface.safeLaunch(MineOSPaths.explorer, "-o", icon.path) end - MineOSInterface.mainContainer.iconField.launchers.showContainingFolder = function(icon) - MineOSInterface.safeLaunch(MineOSPaths.explorer, "-o", fs.path(icon.shortcutPath or icon.path)) + + mainContainer.iconField.launchers.showContainingFolder = function(icon) + MineOSInterface.safeLaunch(MineOSPaths.explorer, "-o", filesystem.path(icon.shortcutPath or icon.path)) end - MineOSInterface.mainContainer.iconField.launchers.showPackageContent = function(icon) + + mainContainer.iconField.launchers.showPackageContent = function(icon) MineOSInterface.safeLaunch(MineOSPaths.explorer, "-o", icon.path) end - MineOSInterface.mainContainer.dockContainer = MineOSInterface.mainContainer:addChild(GUI.container(1, 1, MineOSInterface.mainContainer.width, 7)) - MineOSInterface.mainContainer.dockContainer.saveToOSSettings = function() + mainContainer.dockContainer = mainContainer:addChild(GUI.container(1, 1, mainContainer.width, 7)) + + mainContainer.dockContainer.saveToOSSettings = function() MineOSCore.properties.dockShortcuts = {} - for i = 1, #MineOSInterface.mainContainer.dockContainer.children do - if MineOSInterface.mainContainer.dockContainer.children[i].keepInDock then - table.insert(MineOSCore.properties.dockShortcuts, MineOSInterface.mainContainer.dockContainer.children[i].path) + for i = 1, #mainContainer.dockContainer.children do + if mainContainer.dockContainer.children[i].keepInDock then + table.insert(MineOSCore.properties.dockShortcuts, mainContainer.dockContainer.children[i].path) end end MineOSCore.saveProperties() end - MineOSInterface.mainContainer.dockContainer.sort = function() + + mainContainer.dockContainer.sort = function() local x = 4 - for i = 1, #MineOSInterface.mainContainer.dockContainer.children do - MineOSInterface.mainContainer.dockContainer.children[i].localX = x + for i = 1, #mainContainer.dockContainer.children do + mainContainer.dockContainer.children[i].localX = x x = x + MineOSCore.properties.iconWidth + MineOSCore.properties.iconHorizontalSpaceBetween end - MineOSInterface.mainContainer.dockContainer.width = #MineOSInterface.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.width = #mainContainer.dockContainer.children * (MineOSCore.properties.iconWidth + MineOSCore.properties.iconHorizontalSpaceBetween) - MineOSCore.properties.iconHorizontalSpaceBetween + 6 + mainContainer.dockContainer.localX = math.floor(mainContainer.width / 2 - mainContainer.dockContainer.width / 2) end - local function dockIconEventHandler(mainContainer, icon, e1, e2, e3, e4, e5, e6, ...) - if e1 == "touch" then - 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)) + mainContainer.dockContainer.addIcon = function(path, window) + local icon = mainContainer.dockContainer:addChild(MineOSInterface.icon(1, 2, path, 0x2D2D2D, 0xFFFFFF)) icon:analyseExtension() icon:moveBackward() @@ -200,7 +201,7 @@ function MineOSInterface.createWidgets() icon.selected = false MineOSInterface.updateMenu() - MineOSInterface.mainContainer:drawOnScreen() + mainContainer:drawOnScreen() else MineOSInterface.iconDoubleClick(icon, ...) end @@ -208,11 +209,11 @@ function MineOSInterface.createWidgets() icon.onRightClick = function(icon, e1, e2, e3, e4, ...) local indexOf = icon:indexOf() - local menu = GUI.addContextMenu(MineOSInterface.mainContainer, e3, e4) + local menu = GUI.addContextMenu(mainContainer, e3, e4) menu.onMenuClosed = function() icon.selected = false - MineOSInterface.mainContainer:drawOnScreen() + mainContainer:drawOnScreen() end if icon.windows then @@ -224,17 +225,17 @@ function MineOSInterface.createWidgets() for window in pairs(icon.windows) do window:close() end - MineOSInterface.mainContainer:drawOnScreen() + mainContainer:drawOnScreen() end end 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 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) end @@ -245,37 +246,37 @@ function MineOSInterface.createWidgets() menu:addSeparator() if icon.keepInDock then - if #MineOSInterface.mainContainer.dockContainer.children > 1 then + if #mainContainer.dockContainer.children > 1 then menu:addItem(MineOSCore.localization.removeFromDock).onTouch = function() if icon.windows then icon.keepInDock = nil else icon:remove() - MineOSInterface.mainContainer.dockContainer.sort() + mainContainer.dockContainer.sort() end - MineOSInterface.mainContainer.dockContainer.saveToOSSettings() - MineOSInterface.mainContainer:drawOnScreen() + mainContainer.dockContainer.saveToOSSettings() + mainContainer:drawOnScreen() end end else if icon.windows then menu:addItem(MineOSCore.localization.keepInDock).onTouch = function() icon.keepInDock = true - MineOSInterface.mainContainer.dockContainer.saveToOSSettings() + mainContainer.dockContainer.saveToOSSettings() end end end - MineOSInterface.mainContainer:drawOnScreen() + mainContainer:drawOnScreen() end - MineOSInterface.mainContainer.dockContainer.sort() + mainContainer.dockContainer.sort() return icon end -- Trash - local icon = MineOSInterface.mainContainer.dockContainer.addIcon(MineOSPaths.trash) + local icon = mainContainer.dockContainer.addIcon(MineOSPaths.trash) icon.launchers.directory = function(icon) MineOSInterface.safeLaunch(MineOSPaths.explorer, "-o", icon.path) end @@ -289,19 +290,19 @@ function MineOSInterface.createWidgets() end 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() icon.selected = false - MineOSInterface.mainContainer:drawOnScreen() + mainContainer:drawOnScreen() end 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() - for file in fs.list(MineOSPaths.trash) do - fs.remove(MineOSPaths.trash .. file) + for file in filesystem.list(MineOSPaths.trash) do + filesystem.remove(MineOSPaths.trash .. file) end container:remove() computer.pushSignal("MineOSCore", "updateFileList") @@ -309,22 +310,22 @@ function MineOSInterface.createWidgets() container.panel.onTouch = function() container:remove() - MineOSInterface.mainContainer:drawOnScreen() + mainContainer:drawOnScreen() end - MineOSInterface.mainContainer:drawOnScreen() + mainContainer:drawOnScreen() end - MineOSInterface.mainContainer:drawOnScreen() + mainContainer:drawOnScreen() end 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 -- Draw dock drawDock dockDraw cyka заебался искать, блядь - local overrideDockContainerDraw = MineOSInterface.mainContainer.dockContainer.draw - MineOSInterface.mainContainer.dockContainer.draw = function(dockContainer) + local overrideDockContainerDraw = mainContainer.dockContainer.draw + mainContainer.dockContainer.draw = function(dockContainer) 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 @@ -341,13 +342,13 @@ function MineOSInterface.createWidgets() overrideDockContainerDraw(dockContainer) 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() - local container = MineOSInterface.addBackgroundContainer(MineOSInterface.mainContainer, MineOSCore.localization.aboutSystem) + local container = MineOSInterface.addBackgroundContainer(mainContainer, MineOSCore.localization.aboutSystem) container.layout:removeChildren() local lines = { @@ -387,7 +388,7 @@ function MineOSInterface.createWidgets() textBox:setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP) textBox.eventHandler = container.panel.eventHandler - MineOSInterface.mainContainer:drawOnScreen() + mainContainer:drawOnScreen() end MineOSContextMenu:addItem(MineOSCore.localization.updates).onTouch = function() @@ -410,16 +411,16 @@ function MineOSInterface.createWidgets() MineOSContextMenu:addItem(MineOSCore.localization.returnToShell).onTouch = function() MineOSNetwork.broadcastComputerState(false) - MineOSInterface.mainContainer:stopEventHandling() + mainContainer:stopEventHandling() MineOSInterface.clearTerminal() os.exit() end - MineOSInterface.mainContainer.menuLayout = MineOSInterface.mainContainer:addChild(GUI.layout(1, 1, 1, 1, 1, 1)) - MineOSInterface.mainContainer.menuLayout:setDirection(1, 1, GUI.DIRECTION_HORIZONTAL) - MineOSInterface.mainContainer.menuLayout:setAlignment(1, 1, GUI.ALIGNMENT_HORIZONTAL_RIGHT, GUI.ALIGNMENT_VERTICAL_TOP) - MineOSInterface.mainContainer.menuLayout:setMargin(1, 1, 1, 0) - MineOSInterface.mainContainer.menuLayout:setSpacing(1, 1, 2) + mainContainer.menuLayout = mainContainer:addChild(GUI.layout(1, 1, 1, 1, 1, 1)) + mainContainer.menuLayout:setDirection(1, 1, GUI.DIRECTION_HORIZONTAL) + mainContainer.menuLayout:setAlignment(1, 1, GUI.ALIGNMENT_HORIZONTAL_RIGHT, GUI.ALIGNMENT_VERTICAL_TOP) + mainContainer.menuLayout:setMargin(1, 1, 1, 0) + mainContainer.menuLayout:setSpacing(1, 1, 2) local dateWidget, dateWidgetText = MineOSInterface.addMenuWidget(MineOSInterface.menuWidget(1)) dateWidget.drawContent = function() @@ -480,31 +481,31 @@ function MineOSInterface.createWidgets() end MineOSInterface.updateFileListAndDraw = function(...) - MineOSInterface.mainContainer.iconField:updateFileList() - MineOSInterface.mainContainer:drawOnScreen(...) + mainContainer.iconField:updateFileList() + mainContainer:drawOnScreen(...) end 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 - local windowsCount = #MineOSInterface.mainContainer.windowsContainer.children + local windowsCount = #mainContainer.windowsContainer.children -- Ctrl or CMD if windowsCount > 0 and not lastWindowHandled and (keyboard.isKeyDown(29) or keyboard.isKeyDown(219)) then -- W if e4 == 17 then - MineOSInterface.mainContainer.windowsContainer.children[windowsCount]:close() + mainContainer.windowsContainer.children[windowsCount]:close() lastWindowHandled = true mainContainer:drawOnScreen() -- H elseif e4 == 35 then local lastUnhiddenWindowIndex = 1 - for i = 1, #MineOSInterface.mainContainer.windowsContainer.children do - if not MineOSInterface.mainContainer.windowsContainer.children[i].hidden then + for i = 1, #mainContainer.windowsContainer.children do + if not mainContainer.windowsContainer.children[i].hidden then lastUnhiddenWindowIndex = i end end - MineOSInterface.mainContainer.windowsContainer.children[lastUnhiddenWindowIndex]:minimize() + mainContainer.windowsContainer.children[lastUnhiddenWindowIndex]:minimize() lastWindowHandled = true mainContainer:drawOnScreen() @@ -519,7 +520,7 @@ function MineOSInterface.createWidgets() MineOSInterface.updateFileListAndDraw(true) elseif e2 == "updateWallpaper" then MineOSInterface.changeWallpaper() - MineOSInterface.mainContainer:drawOnScreen() + mainContainer:drawOnScreen() end elseif e1 == "MineOSNetwork" then if e2 == "accessDenied" then @@ -531,7 +532,7 @@ function MineOSInterface.createWidgets() if computer.uptime() - dateUptime >= 1 then MineOSCore.updateTime() - MineOSInterface.mainContainer:drawOnScreen() + mainContainer:drawOnScreen() dateUptime = computer.uptime() end @@ -541,9 +542,9 @@ function MineOSInterface.createWidgets() end 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.mainContainer:drawOnScreen(true) + mainContainer:drawOnScreen(true) end screensaverUptime = computer.uptime() @@ -551,26 +552,12 @@ function MineOSInterface.createWidgets() end end - MineOSInterface.menuInitialChildren = MineOSInterface.mainContainer.menu.children + MineOSInterface.menuInitialChildren = mainContainer.menu.children end -local function updateCurrentTimestamp() - 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 +---------------------------------------- Main loop ---------------------------------------- +-- Runs tasks before/after OS UI initialization local function runTasks(mode) for i = 1, #MineOSCore.properties.tasks do local task = MineOSCore.properties.tasks[i] @@ -580,33 +567,65 @@ local function runTasks(mode) 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) +-- Tasks and UI initialization runTasks(2) - -MineOSInterface.applyTransparency() -updateCurrentTimestamp() -createOSWindow() -MineOSInterface.mainContainer:drawOnScreen() +createWidgets() +mainContainer:drawOnScreen() MineOSNetwork.update() - runTasks(1) +-- Loops with UI regeneration after errors while true do local success, path, line, traceback = MineOSCore.call( - MineOSInterface.mainContainer.startEventHandling, - MineOSInterface.mainContainer, + mainContainer.startEventHandling, + mainContainer, 0 ) if success then break else - createOSWindow() - MineOSInterface.mainContainer:drawOnScreen() + createWidgets() + mainContainer:drawOnScreen() MineOSInterface.showErrorWindow(path, line, traceback) - MineOSInterface.mainContainer:drawOnScreen() + mainContainer:drawOnScreen() end end diff --git a/lib/event.lua b/lib/event.lua index e0fbe165..6471b06e 100755 --- a/lib/event.lua +++ b/lib/event.lua @@ -27,17 +27,17 @@ function event.addHandler(callback, signalType, times, interval) checkArg(3, times, "number", "nil") checkArg(4, nextTriggerTime, "number", "nil") - local ID = math.random(0x7FFFFFFF) - while handlers[ID] do + local ID + repeat ID = math.random(0x7FFFFFFF) - end + until not handlers[ID] handlers[ID] = { signalType = signalType, callback = callback, times = times or mathHuge, interval = interval, - nextTriggerTime = interval and (computerUptime() + interval) or 0 + nextTriggerTime = interval and computerUptime() + interval or 0 } return ID @@ -48,6 +48,7 @@ function event.removeHandler(ID) if handlers[ID] then handlers[ID] = nil + return true else return false, "No registered handlers found for ID " .. ID @@ -71,7 +72,7 @@ function event.listen(signalType, callback) checkArg(2, callback, "function") 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" 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