From a6219cd4c5de634f2e28bb1f26060e888ea97bfd Mon Sep 17 00:00:00 2001 From: Igor Timofeev Date: Mon, 5 Mar 2018 10:30:49 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=98=D0=A2=D0=A0=D0=9E=D0=93=D0=90?= =?UTF-8?q?=D0=99=D0=A2=D0=98=20=D0=9C=D0=9E=D0=99=20=D0=A4=D0=90=D0=99?= =?UTF-8?q?=D0=9D=D0=94=D0=95=D0=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Applications/Finder/Main.lua | 324 +++++++++++++++++------------------ 1 file changed, 162 insertions(+), 162 deletions(-) diff --git a/Applications/Finder/Main.lua b/Applications/Finder/Main.lua index c5295946..f1d30494 100644 --- a/Applications/Finder/Main.lua +++ b/Applications/Finder/Main.lua @@ -13,46 +13,98 @@ local args, options = require("shell").parse(...) ------------------------------------------------------------------------------------------------------ -local mainContainer, window = MineOSInterface.addWindow(MineOSInterface.filledWindow(1, 1, 88, 26, 0xF0F0F0)) - -local iconFieldYOffset = 2 -local scrollTimerID - local favourites = { {text = "Root", path = "/"}, {text = "Desktop", path = MineOSPaths.desktop}, {text = "Applications", path = MineOSPaths.applications}, {text = "Pictures", path = MineOSPaths.pictures}, {text = "System", path = MineOSPaths.system}, + {text = "Libraries", path = "/lib/"}, {text = "Trash", path = MineOSPaths.trash}, } local resourcesPath = MineOSCore.getCurrentScriptDirectory() -local favouritesPath = MineOSPaths.applicationData .. "Finder/Favourites.cfg" +local favouritesPath = MineOSPaths.applicationData .. "Finder/Favourites2.cfg" + +local iconFieldYOffset = 2 +local scrollTimerID + +local workpathHistory = {} +local workpathHistoryCurrent = 0 + +------------------------------------------------------------------------------------------------------ + +local mainContainer, window = MineOSInterface.addWindow(MineOSInterface.filledWindow(1, 1, 88, 26, 0xF0F0F0)) + +local titlePanel = window:addChild(GUI.panel(1, 1, 1, 3, 0xE1E1E1)) + +local prevButton = window:addChild(GUI.adaptiveRoundedButton(9, 2, 1, 0, 0xFFFFFF, 0x3C3C3C, 0x3C3C3C, 0xFFFFFF, "<")) +prevButton.onTouch = function() + prevOrNextWorkpath(false) +end +prevButton.colors.disabled.background = prevButton.colors.default.background +prevButton.colors.disabled.text = 0xC3C3C3 + +local nextButton = window:addChild(GUI.adaptiveRoundedButton(14, 2, 1, 0, 0xFFFFFF, 0x3C3C3C, 0x3C3C3C, 0xFFFFFF, ">")) +nextButton.onTouch = function() + prevOrNextWorkpath(true) +end +nextButton.colors.disabled = prevButton.colors.disabled + +local sidebarContainer = window:addChild(GUI.container(1, 4, 20, 1)) +sidebarContainer.panel = sidebarContainer:addChild(GUI.panel(1, 1, sidebarContainer.width, 1, 0xFFFFFF, MineOSCore.properties.transparencyEnabled and 0.24)) +sidebarContainer.itemsContainer = sidebarContainer:addChild(GUI.container(1, 1, sidebarContainer.width, 1)) + +local searchInput = window:addChild(GUI.input(1, 2, 36, 1, 0xFFFFFF, 0x696969, 0xA5A5A5, 0xFFFFFF, 0x2D2D2D, nil, MineOSCore.localization.search, true)) +searchInput.onInputFinished = function() + iconField.filenameMatcher = searchInput.text + iconField.fromFile = 1 + iconField.yOffset = iconFieldYOffset + + updateFileListAndDraw() +end + +local iconField = window:addChild( + MineOSInterface.iconField( + 1, 4, 1, 1, 2, 2, 0x3C3C3C, 0x3C3C3C, + MineOSPaths.desktop + ) +) + +local scrollBar = window:addChild(GUI.scrollBar(1, 4, 1, 1, 0xC3C3C3, 0x444444, iconFieldYOffset, 1, 1, 1, 1, true)) + +local statusBar = window:addChild(GUI.object(1, 1, 1, 1)) +statusBar.draw = function(object) + buffer.square(object.x, object.y, object.width, object.height, 0xFFFFFF, 0x3C3C3C, " ") + buffer.text(object.x + 1, object.y, 0x3C3C3C, string.limit(("root/" .. iconField.workpath):gsub("/+$", ""):gsub("%/+", " ► "), object.width - 1, "start")) +end +statusBar.eventHandler = function(mainContainer, object, eventData) + if (eventData[1] == "component_added" or eventData[1] == "component_removed") and eventData[3] == "filesystem" then + updateSidebar() + MineOSInterface.OSDraw() + elseif eventData[1] == "MineOSNetwork" then + if eventData[2] == "updateProxyList" or eventData[2] == "timeout" then + updateSidebar() + MineOSInterface.OSDraw() + end + end +end + +local sidebarResizer = window:addChild(GUI.resizer(1, 4, 3, 5, 0xFFFFFF, 0x0)) + +------------------------------------------------------------------------------------------------------ local function saveFavourites() table.toFile(favouritesPath, favourites) end -if fs.exists(favouritesPath) then - favourites = table.fromFile(favouritesPath) -else - saveFavourites() -end - ------------------------------------------------------------------------------------------------------- - -local workpathHistory = {} -local workpathHistoryCurrent = 0 - local function updateFileListAndDraw() - window.iconField:updateFileList() - mainContainer:draw() - buffer.draw() + iconField:updateFileList() + MineOSInterface.OSDraw() end local function workpathHistoryButtonsUpdate() - window.prevButton.disabled = workpathHistoryCurrent <= 1 - window.nextButton.disabled = workpathHistoryCurrent >= #workpathHistory + prevButton.disabled = workpathHistoryCurrent <= 1 + nextButton.disabled = workpathHistoryCurrent >= #workpathHistory end local function addWorkpath(path) @@ -63,9 +115,9 @@ local function addWorkpath(path) end workpathHistoryButtonsUpdate() - window.searchInput.text = "" - window.iconField.yOffset = iconFieldYOffset - window.iconField:setWorkpath(path) + searchInput.text = "" + iconField.yOffset = iconFieldYOffset + iconField:setWorkpath(path) end local function prevOrNextWorkpath(next) @@ -80,8 +132,8 @@ local function prevOrNextWorkpath(next) end workpathHistoryButtonsUpdate() - window.iconField.yOffset = iconFieldYOffset - window.iconField:setWorkpath(workpathHistory[workpathHistoryCurrent]) + iconField.yOffset = iconFieldYOffset + iconField:setWorkpath(workpathHistory[workpathHistoryCurrent]) updateFileListAndDraw() end @@ -89,10 +141,10 @@ end ------------------------------------------------------------------------------------------------------ local function newSidebarItem(textColor, text, path) - local object = window.sidebarContainer.itemsContainer:addChild( + local object = sidebarContainer.itemsContainer:addChild( GUI.object( 1, - #window.sidebarContainer.itemsContainer.children > 0 and window.sidebarContainer.itemsContainer.children[#window.sidebarContainer.itemsContainer.children].localY + 1 or 1, + #sidebarContainer.itemsContainer.children > 0 and sidebarContainer.itemsContainer.children[#sidebarContainer.itemsContainer.children].localY + 1 or 1, 1, 1 ) @@ -104,12 +156,14 @@ local function newSidebarItem(textColor, text, path) object.path = path object.draw = function(object) - object.width = window.sidebarContainer.itemsContainer.width + object.width = sidebarContainer.itemsContainer.width - if object.path == window.iconField.workpath then + if object.path == iconField.workpath then buffer.square(object.x, object.y, object.width, 1, 0x3366CC, 0xFFFFFF, " ") buffer.text(object.x + 1, object.y, 0xFFFFFF, string.limit(object.text, object.width - 4, "center")) - buffer.text(object.x + object.width - 2, object.y, 0xCCFFFF, "x") + if object.favouriteIndex and object.favouriteIndex > 1 then + buffer.text(object.x + object.width - 2, object.y, 0xCCFFFF, "x") + end else buffer.text(object.x + 1, object.y, object.textColor, string.limit(object.text, object.width - 2, "center")) end @@ -118,16 +172,14 @@ local function newSidebarItem(textColor, text, path) object.eventHandler = function(mainContainer, object, eventData) if eventData[1] == "touch" then - if eventData[3] == object.x + object.width - 2 and object.favouriteIndex then + if object.favouriteIndex and object.favouriteIndex > 1 and eventData[3] == object.x + object.width - 2 then table.remove(favourites, object.favouriteIndex) saveFavourites() computer.pushSignal("Finder", "updateFavourites") elseif fs.isDirectory(object.path) then addWorkpath(object.path) - - mainContainer:draw() - buffer.draw() + MineOSInterface.OSDraw() updateFileListAndDraw() end @@ -139,107 +191,82 @@ local function newSidebarItem(textColor, text, path) end local function updateSidebar() - window.sidebarContainer.itemsContainer:deleteChildren() + sidebarContainer.itemsContainer:deleteChildren() - window.sidebarContainer.itemsContainer:addChild(newSidebarItem(0x3C3C3C, MineOSCore.localization.favourite)) + sidebarContainer.itemsContainer:addChild(newSidebarItem(0x3C3C3C, MineOSCore.localization.favourite)) for i = 1, #favourites do - local object = window.sidebarContainer.itemsContainer:addChild(newSidebarItem(0x555555, " " .. fs.name(favourites[i].text), favourites[i].path)) + local object = sidebarContainer.itemsContainer:addChild(newSidebarItem(0x555555, " " .. fs.name(favourites[i].text), favourites[i].path)) object.favouriteIndex = i end if MineOSCore.properties.network.enabled and MineOSNetwork.getProxyCount() > 0 then - window.sidebarContainer.itemsContainer:addChild(newSidebarItem(0x3C3C3C)) - window.sidebarContainer.itemsContainer:addChild(newSidebarItem(0x3C3C3C, MineOSCore.localization.network)) + sidebarContainer.itemsContainer:addChild(newSidebarItem(0x3C3C3C)) + sidebarContainer.itemsContainer:addChild(newSidebarItem(0x3C3C3C, MineOSCore.localization.network)) for proxy, path in fs.mounts() do if proxy.network then - window.sidebarContainer.itemsContainer:addChild(newSidebarItem(0x555555, " " .. MineOSNetwork.getProxyName(proxy), path .. "/")) + sidebarContainer.itemsContainer:addChild(newSidebarItem(0x555555, " " .. MineOSNetwork.getProxyName(proxy), path .. "/")) end end end - window.sidebarContainer.itemsContainer:addChild(newSidebarItem(0x3C3C3C)) + sidebarContainer.itemsContainer:addChild(newSidebarItem(0x3C3C3C)) - window.sidebarContainer.itemsContainer:addChild(newSidebarItem(0x3C3C3C, MineOSCore.localization.mounts)) + sidebarContainer.itemsContainer:addChild(newSidebarItem(0x3C3C3C, MineOSCore.localization.mounts)) for proxy, path in fs.mounts() do if path ~= "/" and not proxy.network then - window.sidebarContainer.itemsContainer:addChild(newSidebarItem(0x555555, " " .. (proxy.getLabel() or fs.name(path)), path .. "/")) + sidebarContainer.itemsContainer:addChild(newSidebarItem(0x555555, " " .. (proxy.getLabel() or fs.name(path)), path .. "/")) end end end -window.titlePanel = window:addChild(GUI.panel(1, 1, 1, 3, 0xE1E1E1)) - -window.prevButton = window:addChild(GUI.adaptiveRoundedButton(9, 2, 1, 0, 0xFFFFFF, 0x3C3C3C, 0x3C3C3C, 0xFFFFFF, "<")) -window.prevButton.onTouch = function() - prevOrNextWorkpath(false) -end -window.prevButton.colors.disabled.background = window.prevButton.colors.default.background -window.prevButton.colors.disabled.text = 0xC3C3C3 - -window.nextButton = window:addChild(GUI.adaptiveRoundedButton(14, 2, 1, 0, 0xFFFFFF, 0x3C3C3C, 0x3C3C3C, 0xFFFFFF, ">")) -window.nextButton.onTouch = function() - prevOrNextWorkpath(true) -end -window.nextButton.colors.disabled = window.prevButton.colors.disabled - -window.sidebarContainer = window:addChild(GUI.container(1, 4, 20, 1)) -window.sidebarContainer.panel = window.sidebarContainer:addChild(GUI.panel(1, 1, window.sidebarContainer.width, 1, 0xFFFFFF, MineOSCore.properties.transparencyEnabled and 0.24)) -window.sidebarContainer.itemsContainer = window.sidebarContainer:addChild(GUI.container(1, 1, window.sidebarContainer.width, 1)) - -window.iconField = window:addChild( - MineOSInterface.iconField( - 1, 4, 1, 1, 2, 2, 0x3C3C3C, 0x3C3C3C, - MineOSPaths.desktop - ) -) - local function updateScrollBar() - local shownFilesCount = #window.iconField.fileList - window.iconField.fromFile + 1 + local shownFilesCount = #iconField.fileList - iconField.fromFile + 1 - local horizontalLines = math.ceil(shownFilesCount / window.iconField.iconCount.horizontal) + local horizontalLines = math.ceil(shownFilesCount / iconField.iconCount.horizontal) local minimumOffset = 3 - (horizontalLines - 1) * (MineOSCore.properties.iconHeight + MineOSCore.properties.iconVerticalSpaceBetween) - MineOSCore.properties.iconVerticalSpaceBetween - if window.iconField.yOffset > iconFieldYOffset then - window.iconField.yOffset = iconFieldYOffset - elseif window.iconField.yOffset < minimumOffset then - window.iconField.yOffset = minimumOffset + if iconField.yOffset > iconFieldYOffset then + iconField.yOffset = iconFieldYOffset + elseif iconField.yOffset < minimumOffset then + iconField.yOffset = minimumOffset end - 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) + if shownFilesCount > iconField.iconCount.total then + scrollBar.hidden = false + scrollBar.maximumValue = math.abs(minimumOffset) + scrollBar.value = math.abs(iconField.yOffset - iconFieldYOffset) else - window.scrollBar.hidden = true + scrollBar.hidden = true end end -window.iconField.eventHandler = function(mainContainer, object, eventData) +iconField.eventHandler = function(mainContainer, object, eventData) if eventData[1] == "scroll" then - window.iconField.yOffset = window.iconField.yOffset + eventData[5] * 2 + iconField.yOffset = iconField.yOffset + eventData[5] * 2 updateScrollBar() - local delta = window.iconField.yOffset - window.iconField.iconsContainer.children[1].localY - for i = 1, #window.iconField.iconsContainer.children do - window.iconField.iconsContainer.children[i].localY = window.iconField.iconsContainer.children[i].localY + delta + local delta = iconField.yOffset - iconField.iconsContainer.children[1].localY + for i = 1, #iconField.iconsContainer.children do + iconField.iconsContainer.children[i].localY = iconField.iconsContainer.children[i].localY + delta end - mainContainer:draw() - buffer.draw() + MineOSInterface.OSDraw() if scrollTimerID then event.cancel(scrollTimerID) scrollTimerID = nil end - scrollTimerID = event.timer(0.3, function() - computer.pushSignal("Finder", "updateFileList") - end, 1) + scrollTimerID = event.timer(0.3, function() + computer.pushSignal("Finder", "updateFileList") + end, 1) elseif eventData[1] == "MineOSCore" or eventData[1] == "Finder" then if eventData[2] == "updateFileList" then - window.iconField.yOffset = iconFieldYOffset + if eventData[1] == "MineOSCore" then + iconField.yOffset = iconFieldYOffset + end updateFileListAndDraw() elseif eventData[2] == "updateFavourites" then if eventData[3] then @@ -248,120 +275,87 @@ window.iconField.eventHandler = function(mainContainer, object, eventData) saveFavourites() updateSidebar() - mainContainer:draw() - buffer.draw() + MineOSInterface.OSDraw() end end end -window.iconField.launchers.directory = function(icon) +iconField.launchers.directory = function(icon) addWorkpath(icon.path) updateFileListAndDraw() end -window.iconField.launchers.showPackageContent = function(icon) +iconField.launchers.showPackageContent = function(icon) addWorkpath(icon.path) updateFileListAndDraw() end -window.iconField.launchers.showContainingFolder = function(icon) +iconField.launchers.showContainingFolder = function(icon) addWorkpath(fs.path(MineOSCore.readShortcut(icon.path))) updateFileListAndDraw() end -window.scrollBar = window:addChild(GUI.scrollBar(1, 4, 1, 1, 0xC3C3C3, 0x444444, iconFieldYOffset, 1, 1, 1, 1, true)) - -window.searchInput = window:addChild(GUI.input(1, 2, 36, 1, 0xFFFFFF, 0x696969, 0xA5A5A5, 0xFFFFFF, 0x2D2D2D, nil, MineOSCore.localization.search, true)) -window.searchInput.onInputFinished = function() - window.iconField.filenameMatcher = window.searchInput.text - window.iconField.fromFile = 1 - window.iconField.yOffset = iconFieldYOffset - - updateFileListAndDraw() -end - -local overrideUpdateFileList = window.iconField.updateFileList -window.iconField.updateFileList = function(...) +local overrideUpdateFileList = iconField.updateFileList +iconField.updateFileList = function(...) overrideUpdateFileList(...) updateScrollBar() end -window.statusBar = window:addChild(GUI.object(1, 1, 1, 1)) -window.statusBar.draw = function(object) - buffer.square(object.x, object.y, object.width, object.height, 0xFFFFFF, 0x3C3C3C, " ") - buffer.text(object.x + 1, object.y, 0x3C3C3C, string.limit(("root/" .. window.iconField.workpath):gsub("/+$", ""):gsub("%/+", " ► "), object.width - 1, "start")) -end -window.statusBar.eventHandler = function(mainContainer, object, eventData) - if (eventData[1] == "component_added" or eventData[1] == "component_removed") and eventData[3] == "filesystem" then - updateSidebar() - - mainContainer:draw() - buffer.draw() - elseif eventData[1] == "MineOSNetwork" then - if eventData[2] == "updateProxyList" or eventData[2] == "timeout" then - updateSidebar() - - mainContainer:draw() - buffer.draw() - end - end -end -window.sidebarResizer = window:addChild(GUI.resizer(1, 4, 3, 5, 0xFFFFFF, 0x0)) - local function calculateSizes(width, height) - window.sidebarContainer.height = height - 3 + sidebarContainer.height = height - 3 - window.sidebarContainer.panel.width = window.sidebarContainer.width - window.sidebarContainer.panel.height = window.sidebarContainer.height + sidebarContainer.panel.width = sidebarContainer.width + sidebarContainer.panel.height = sidebarContainer.height - window.sidebarContainer.itemsContainer.width = window.sidebarContainer.width - window.sidebarContainer.itemsContainer.height = window.sidebarContainer.height + sidebarContainer.itemsContainer.width = sidebarContainer.width + sidebarContainer.itemsContainer.height = sidebarContainer.height - window.sidebarResizer.localX = window.sidebarContainer.width - 1 - window.sidebarResizer.localY = math.floor(window.sidebarContainer.localY + window.sidebarContainer.height / 2 - window.sidebarResizer.height / 2 - 1) + sidebarResizer.localX = sidebarContainer.width - 1 + sidebarResizer.localY = math.floor(sidebarContainer.localY + sidebarContainer.height / 2 - sidebarResizer.height / 2 - 1) - window.backgroundPanel.width = width - window.sidebarContainer.width + window.backgroundPanel.width = width - sidebarContainer.width window.backgroundPanel.height = height - 4 - window.backgroundPanel.localX = window.sidebarContainer.width + 1 + window.backgroundPanel.localX = sidebarContainer.width + 1 window.backgroundPanel.localY = 4 - window.statusBar.localX = window.sidebarContainer.width + 1 - window.statusBar.localY = height - window.statusBar.width = window.backgroundPanel.width + statusBar.localX = sidebarContainer.width + 1 + statusBar.localY = height + statusBar.width = window.backgroundPanel.width - window.titlePanel.width = width - window.searchInput.width = math.floor(width * 0.25) - window.searchInput.localX = width - window.searchInput.width - 1 + titlePanel.width = width + searchInput.width = math.floor(width * 0.25) + searchInput.localX = width - searchInput.width - 1 - window.iconField.width = window.backgroundPanel.width - window.iconField.height = height + 4 - window.iconField.localX = window.backgroundPanel.localX + iconField.width = window.backgroundPanel.width + iconField.height = height + 4 + iconField.localX = window.backgroundPanel.localX - window.scrollBar.localX = window.width - window.scrollBar.height = window.backgroundPanel.height - window.scrollBar.shownValueCount = window.scrollBar.height - 1 + scrollBar.localX = window.width + scrollBar.height = window.backgroundPanel.height + scrollBar.shownValueCount = scrollBar.height - 1 window.actionButtons:moveToFront() end window.onResize = function(width, height) calculateSizes(width, height) - window.iconField:updateFileList() + MineOSInterface.OSDraw() + updateFileListAndDraw() end -window.sidebarResizer.onResize = function(mainContainer, object, eventData, dragWidth, dragHeight) - window.sidebarContainer.width = window.sidebarContainer.width + dragWidth - window.sidebarContainer.width = window.sidebarContainer.width >= 5 and window.sidebarContainer.width or 5 +sidebarResizer.onResize = function(mainContainer, object, eventData, dragWidth, dragHeight) + sidebarContainer.width = sidebarContainer.width + dragWidth + sidebarContainer.width = sidebarContainer.width >= 5 and sidebarContainer.width or 5 calculateSizes(window.width, window.height) end -window.sidebarResizer.onResizeFinished = function() - window.iconField:updateFileList() +sidebarResizer.onResizeFinished = function() + updateFileListAndDraw() end local overrideMaximize = window.actionButtons.maximize.onTouch window.actionButtons.maximize.onTouch = function() - window.iconField.yOffset = iconFieldYOffset + iconField.yOffset = iconFieldYOffset overrideMaximize() end @@ -371,7 +365,13 @@ end ------------------------------------------------------------------------------------------------------ -if options.o and args[1] and fs.isDirectory(args[1]) then +if fs.exists(favouritesPath) then + favourites = table.fromFile(favouritesPath) +else + saveFavourites() +end + +if (options.o or options.open) and args[1] and fs.isDirectory(args[1]) then addWorkpath(args[1]) else addWorkpath("/")