diff --git a/Applications.cfg b/Applications.cfg index 5e7f7710..0ec8eed5 100644 --- a/Applications.cfg +++ b/Applications.cfg @@ -5,7 +5,7 @@ about="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/MineOS/About/", type="Script", forceDownload=true, - version=3.62, + version=3.63, }, { path="/MineOS/Pictures/MoonTouch.pic", @@ -108,14 +108,14 @@ url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/MineOS/Localization/Russian.lang", type="Script", forceDownload=true, - version=1.25, + version=1.26, }, { path="/MineOS/System/OS/Localization/English.lang", url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/MineOS/Localization/English.lang", type="Script", forceDownload=true, - version=1.25, + version=1.26, }, ----------------------------------------------------- Системные иконки -------------------------------------------------------------------------- @@ -240,21 +240,21 @@ path="/lib/MineOSCore.lua", url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/MineOSCore.lua", type="Library", - version=1.65, + version=1.66, }, { path="/lib/advancedLua.lua", url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/advancedLua.lua", type="Library", preloadFile=true, - version=1.13, + version=1.14, }, { path="/lib/web.lua", url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/web.lua", type="Library", preloadFile=true, - version=1.01, + version=1.02, }, { path="/lib/event.lua", @@ -300,7 +300,7 @@ url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/GUI.lua", type="Library", preloadFile=true, - version=1.54, + version=1.55, }, { path="/lib/rayEngine.lua", @@ -360,7 +360,7 @@ path="/lib/palette.lua", url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/palette.lua", type="Library", - version=1.13, + version=1.14, }, { path="/lib/doubleBuffering.lua", @@ -528,7 +528,7 @@ type="Application", icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/VK/Icon.pic", createShortcut="desktop", - version=1.29, + version=1.30, resources={ { path="/VKLogo.pic", @@ -889,7 +889,7 @@ icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/AppMarket/Icon.pic", createShortcut="dock", forceDownload=true, - version=1.59, + version=1.60, resources={ { path="/Update.pic", diff --git a/Applications/AppMarket/AppMarket.lua b/Applications/AppMarket/AppMarket.lua index 4d6f4bd1..12b558c6 100755 --- a/Applications/AppMarket/AppMarket.lua +++ b/Applications/AppMarket/AppMarket.lua @@ -209,13 +209,6 @@ window.contentContainer.eventHandler = function(mainContainer, object, eventData end end -local oldResize = window.onResize -window.onResize = function(window, width, height) - window.contentContainer.width, window.contentContainer.height = width - 4, height - 3 - oldResize(window, width, height) - tabs[window.tabBar.selectedItem].onTouch() -end - local tabs = { window.tabBar:addItem(localization.applications), window.tabBar:addItem(localization.libraries), @@ -224,6 +217,13 @@ local tabs = { window.tabBar:addItem(localization.updates) } +local oldResize = window.onResize +window.onResize = function(window, width, height) + window.contentContainer.width, window.contentContainer.height = width - 4, height - 3 + oldResize(window, width, height) + tabs[window.tabBar.selectedItem].onTouch() +end + tabs[1].onTouch = function() displayApps(1, "Application") end tabs[2].onTouch = function() displayApps(1, "Library") end tabs[3].onTouch = function() displayApps(1, "Wallpaper") end diff --git a/Applications/VK/VK.lua b/Applications/VK/VK.lua index 7a61a5b5..6afbf362 100755 --- a/Applications/VK/VK.lua +++ b/Applications/VK/VK.lua @@ -490,7 +490,7 @@ local function messagesGUI() -- saveToFile("lastMessagesRequest.json", serialization.serialize(messages)) - buffer.setDrawLimit(mainZoneX, mainZoneY, mainZoneWidth, mainZoneHeight) + buffer.setDrawLimit(mainZoneX, mainZoneY, mainZoneX + mainZoneWidth - 1, mainZoneY + mainZoneHeight - 1) local y = buffer.height - 7 local xSender = mainZoneX + 2 @@ -727,7 +727,7 @@ local function userProfileGUI() whatIsOnScreen = "userProfile" drawTopBar("Страница пользователя " .. currentProfile.ID) - buffer.setDrawLimit(mainZoneX, mainZoneY, mainZoneWidth, mainZoneHeight) + buffer.setDrawLimit(mainZoneX, mainZoneY, mainZoneX + mainZoneWidth - 1, mainZoneY + mainZoneHeight - 1) local xAvatar, yAvatar = mainZoneX + 4, currentProfileY local x, y = xAvatar, yAvatar @@ -866,7 +866,7 @@ local function friendsGUI() currentFriends = {sendMessageButtons = {}, openProfileButtons = {}} whatIsOnScreen = "friends" drawTopBar("Друзья") - buffer.setDrawLimit(mainZoneX, mainZoneY, mainZoneWidth, mainZoneHeight) + buffer.setDrawLimit(mainZoneX, mainZoneY, mainZoneX + mainZoneWidth - 1, mainZoneY + mainZoneHeight - 1) local function getListName(listID) local name = "N/A" @@ -926,7 +926,7 @@ local function newsGUI() clearGUIZone() drawTopBar("Новости") whatIsOnScreen = "news" - buffer.setDrawLimit(mainZoneX, mainZoneY, mainZoneWidth, mainZoneHeight) + buffer.setDrawLimit(mainZoneX, mainZoneY, mainZoneX + mainZoneWidth - 1, mainZoneY + mainZoneHeight - 1) local function getAvatarTextAndNameForNews(source_id) local avatarText, name = "N/A", "N/A" diff --git a/Installer/Installer.lua b/Installer/Installer.lua index d21df21f..10a70de2 100644 --- a/Installer/Installer.lua +++ b/Installer/Installer.lua @@ -300,9 +300,9 @@ stages[5] = function() OSSettings.screensaverDelay = 20 OSSettings.showHelpOnApplicationStart = stageContainer.showApplicationsHelpSwitch.state OSSettings.dockShortcuts = { - {path = "/MineOS/Applications/AppMarket.app"}, - {path = "/MineOS/Applications/MineCode IDE.app"}, - {path = "/MineOS/Applications/Photoshop.app"}, + "/MineOS/Applications/AppMarket.app/", + "/MineOS/Applications/MineCode IDE.app/", + "/MineOS/Applications/Photoshop.app/", } table.toFile(paths.OSSettings, OSSettings) diff --git a/MineOS/Localization/English.lang b/MineOS/Localization/English.lang index 158481bb..1b7b27e0 100644 --- a/MineOS/Localization/English.lang +++ b/MineOS/Localization/English.lang @@ -1,4 +1,6 @@ { + keepInDock = "Keep in dock", + launchWithArguments = "Launch with arguments", dontShowAnymore = "Don't show again", applicationHelp = "About application", newName = "New name", @@ -34,25 +36,19 @@ contextMenuEditInPhotoshop = "Edit in Photoshop", contextMenuRename = "Rename", contextMenuCreateShortcut = "Create shortcut", - contextMenuUploadToPastebin = "Upload to Pastebin", contextMenuAddToDock = "Add to Dock", contextMenuRemoveFromDock = "Remove from Dock", contextMenuMoveRight = "Move right", contextMenuMoveLeft = "Move left", - contextMenuArchive = "Compress", + contextMenuArchive = "Add to archive", contextMenuDelete = "Delete", contextMenuAddToFavourites = "Add to favourites", contextMenuCreateApplication = "Create MineOS application", contextMenuSetAsWallpaper = "Set as wallpaper", contextMenuShowPackageContent = "Show package content", contextMenuShowContainingFolder = "Show containing folder", - contextMenuRemoveFromFavourites = "Remove from favourites", contextMenuFlashEEPROM = "Write file to EEPROM", - favourites = "Favourites", - disks = "HDDs", - network = "Network", - search = "Search", sortByType = "Sort by type", sortByName = "Sort by name", sortByDate = "Sort by date", @@ -109,13 +105,4 @@ yourContacts = "Your contacts", additionalInfo = "Additional information", stackTraceback = "Stack traceback", - fileDoesntExists = "File doesn't exists", - fileSuccessfullySent = "File has been successfully sent", - sendFile = "Send file", - pathToFile = "Path to file", - sendMessage = "Send message", - messageText = "Message text", - gotMessageFrom = "Got message from ", - gotFileFrom = "Got file from ", - pathToSave = "Path to save the file", -} +} \ No newline at end of file diff --git a/MineOS/Localization/Russian.lang b/MineOS/Localization/Russian.lang index 29b5a1e2..d32f000e 100644 --- a/MineOS/Localization/Russian.lang +++ b/MineOS/Localization/Russian.lang @@ -1,4 +1,6 @@ { + keepInDock = "Оставить в Dock", + launchWithArguments = "Запустить с аргументами", dontShowAnymore = "Больше не показывать", applicationHelp = "О приложении", newName = "Новое имя", @@ -34,25 +36,19 @@ contextMenuEditInPhotoshop = "Редактировать в Photoshop", contextMenuRename = "Переименовать", contextMenuCreateShortcut = "Создать ярлык", - contextMenuUploadToPastebin = "Загрузить на Pastebin", contextMenuAddToDock = "Добавить в Dock", contextMenuRemoveFromDock = "Удалить из Dock", contextMenuMoveRight = "Передвинуть правее", contextMenuMoveLeft = "Передвинуть левее", - contextMenuArchive = "Сжать", + contextMenuArchive = "Добавить в архив", contextMenuDelete = "Удалить", contextMenuAddToFavourites = "Добавить в избранное", contextMenuCreateApplication = "Создать приложение MineOS", contextMenuSetAsWallpaper = "Установить как обои", contextMenuShowPackageContent = "Показать содержимое пакета", contextMenuShowContainingFolder = "Открыть содержащую папку", - contextMenuRemoveFromFavourites = "Удалить из избранного", contextMenuFlashEEPROM = "Записать файл на EEPROM", - favourites = "Избранное", - disks = "Диски", - network = "Сеть", - search = "Поиск", sortByType = "Сортировать по типу", sortByName = "Сортировать по имени", sortByDate = "Сортировать по дате", @@ -109,13 +105,4 @@ yourContacts = "Ваши контакты", additionalInfo = "Дополнительная информация", stackTraceback = "Стек ошибки", - fileDoesntExists = "Файл не существует", - fileSuccessfullySent = "Файл успешно отправлен", - sendFile = "Отправить файл", - pathToFile = "Путь к файлу", - sendMessage = "Сообщение", - messageText = "Текст сообщения", - gotMessageFrom = "Сообщение от ", - gotFileFrom = "Принят файл от ", - pathToSave = "Путь для сохранения", } \ No newline at end of file diff --git a/MineOS/OS.lua b/MineOS/OS.lua index 206ecf82..58647148 100755 --- a/MineOS/OS.lua +++ b/MineOS/OS.lua @@ -316,103 +316,7 @@ local function updateDesktopCounters() MineOSCore.OSMainContainer.desktopCounters.localPosition.y = MineOSCore.OSMainContainer.height - sizes.heightOfDock - 2 end -local function updateDock() - local function moveDockShortcut(iconIndex, direction) - MineOSCore.OSSettings.dockShortcuts[iconIndex], MineOSCore.OSSettings.dockShortcuts[iconIndex + direction] = swap(MineOSCore.OSSettings.dockShortcuts[iconIndex], MineOSCore.OSSettings.dockShortcuts[iconIndex + direction]) - MineOSCore.saveOSSettings() - updateDock() - MineOSCore.OSMainContainer:draw() - buffer.draw() - end - - MineOSCore.OSMainContainer.dockContainer.width = (#MineOSCore.OSSettings.dockShortcuts + 1) * (MineOSCore.iconWidth + sizes.xSpaceBetweenIcons) - sizes.xSpaceBetweenIcons - MineOSCore.OSMainContainer.dockContainer.localPosition.x = math.floor(MineOSCore.OSMainContainer.width / 2 - MineOSCore.OSMainContainer.dockContainer.width / 2) - MineOSCore.OSMainContainer.dockContainer.localPosition.y = MineOSCore.OSMainContainer.height - sizes.heightOfDock + 1 - MineOSCore.OSMainContainer.dockContainer:deleteChildren() - - local xPos = 1 - for iconIndex = 1, #MineOSCore.OSSettings.dockShortcuts do - local icon = MineOSCore.createIcon(xPos, 1, MineOSCore.OSSettings.dockShortcuts[iconIndex].path, 0x262626, MineOSCore.OSSettings.showExtension, 0xFFFFFF) - - icon.onRightClick = function(icon, eventData) - local menu = GUI.contextMenu(eventData[3], eventData[4]) - menu:addItem(MineOSCore.localization.contextMenuShowContainingFolder).onTouch = function() - table.insert(workpathHistory, fs.path(icon.path)) - changeWorkpath(#workpathHistory) - MineOSCore.OSMainContainer.updateAndDraw() - end - menu:addSeparator() - menu:addItem(MineOSCore.localization.contextMenuMoveRight, iconIndex >= #MineOSCore.OSSettings.dockShortcuts).onTouch = function() - moveDockShortcut(iconIndex, 1) - end - menu:addItem(MineOSCore.localization.contextMenuMoveLeft, iconIndex <= 1).onTouch = function() - moveDockShortcut(iconIndex, -1) - end - menu:addSeparator() - menu:addItem(MineOSCore.localization.contextMenuRemoveFromDock, MineOSCore.OSSettings.dockShortcuts[iconIndex].canNotBeDeleted or #MineOSCore.OSSettings.dockShortcuts < 2).onTouch = function() - table.remove(MineOSCore.OSSettings.dockShortcuts, iconIndex) - MineOSCore.saveOSSettings() - updateDock() - MineOSCore.OSMainContainer:draw() - buffer.draw() - end - menu:show() - end - - MineOSCore.OSMainContainer.dockContainer:addChild(icon) - xPos = xPos + MineOSCore.iconWidth + sizes.xSpaceBetweenIcons - end - - local icon = MineOSCore.createIcon(xPos, 1, MineOSCore.paths.trash, 0x262626, MineOSCore.OSSettings.showExtension, 0xFFFFFF) - icon.iconImage.image = MineOSCore.icons.trash - icon.onRightClick = function(icon, eventData) - local menu = GUI.contextMenu(eventData[3], eventData[4]) - menu:addItem(MineOSCore.localization.emptyTrash).onTouch = function() - local container = MineOSCore.addUniversalContainer(MineOSCore.OSMainContainer, MineOSCore.localization.areYouSure) - - container.layout:addChild(GUI.button(1, 1, 30, 3, 0xEEEEEE, 0x262626, 0xA, 0x262626, "OK")).onTouch = function() - for file in fs.list(MineOSCore.paths.trash) do - fs.remove(MineOSCore.paths.trash .. file) - end - container:delete() - MineOSCore.OSMainContainer.updateAndDraw() - end - - container.panel.onTouch = function() - container:delete() - MineOSCore.OSMainContainer:draw() - buffer.draw() - end - - MineOSCore.OSMainContainer:draw() - buffer.draw() - end - menu:show() - end - - MineOSCore.OSMainContainer.dockContainer:addChild(icon) -end - --- Отрисовка дока -local function createDock() - MineOSCore.OSMainContainer.dockContainer = MineOSCore.OSMainContainer:addChild(GUI.container(1, 1, MineOSCore.OSMainContainer.width, sizes.heightOfDock)) - - -- Отрисовка дока - local oldDraw = MineOSCore.OSMainContainer.dockContainer.draw - MineOSCore.OSMainContainer.dockContainer.draw = function(dockContainer) - local currentDockTransparency, currentDockWidth, xPos, yPos = colors.dockBaseTransparency, dockContainer.width, dockContainer.x, dockContainer.y + 2 - local color = MineOSCore.OSSettings.interfaceColor or colors.interface - for i = 1, dockContainer.height do - buffer.text(xPos, yPos, color, "▟", currentDockTransparency) - buffer.square(xPos + 1, yPos, currentDockWidth - 2, 1, color, 0xFFFFFF, " ", currentDockTransparency) - buffer.text(xPos + currentDockWidth - 1, yPos, color, "▙", currentDockTransparency) - - currentDockTransparency, currentDockWidth, xPos, yPos = currentDockTransparency - colors.dockTransparencyAdder, currentDockWidth + 2, xPos - 1, yPos + 1 - end - - oldDraw(dockContainer) - end -end +---------------------------------------------- Всякая параша для ОС-контейнера ------------------------------------------------------------------------ local function changeResolution() currentDesktop = 1 @@ -425,12 +329,22 @@ local function changeResolution() MineOSCore.OSMainContainer.iconField.localPosition.x = math.floor(MineOSCore.OSMainContainer.width / 2 - (MineOSCore.OSMainContainer.iconField.iconCount.width * (MineOSCore.iconWidth + sizes.xSpaceBetweenIcons) - sizes.xSpaceBetweenIcons) / 2) MineOSCore.OSMainContainer.iconField.localPosition.y = 3 + MineOSCore.OSMainContainer.dockContainer.localPosition.y = MineOSCore.OSMainContainer.height - sizes.heightOfDock + 1 + MineOSCore.OSMainContainer.menu.width = MineOSCore.OSMainContainer.width MineOSCore.OSMainContainer.background.width, MineOSCore.OSMainContainer.background.height = MineOSCore.OSMainContainer.width, MineOSCore.OSMainContainer.height MineOSCore.OSMainContainer.windowsContainer.width, MineOSCore.OSMainContainer.windowsContainer.height = MineOSCore.OSMainContainer.width, MineOSCore.OSMainContainer.height - 1 end +local function moveDockIcon(index, direction) + MineOSCore.OSMainContainer.dockContainer.children[index], MineOSCore.OSMainContainer.dockContainer.children[index + direction] = MineOSCore.OSMainContainer.dockContainer.children[index + direction], MineOSCore.OSMainContainer.dockContainer.children[index] + MineOSCore.OSMainContainer.dockContainer.sort() + MineOSCore.OSMainContainer.dockContainer.saveToOSSettings() + MineOSCore.OSMainContainer:draw() + buffer.draw() +end + local function createOSWindow() MineOSCore.OSMainContainer = GUI.fullScreenContainer() @@ -459,17 +373,148 @@ local function createOSWindow() sizes.xSpaceBetweenIcons, sizes.ySpaceBetweenIcons, 0xFFFFFF, - MineOSCore.OSSettings.showExtension or true, - MineOSCore.OSSettings.showHiddenFiles or true, + MineOSCore.OSSettings.showExtension, + MineOSCore.OSSettings.showHiddenFiles, MineOSCore.OSSettings.sortingMethod or "type", "/", 0xFFFFFF ) ) - createDock() + -- Dock + MineOSCore.OSMainContainer.dockContainer = MineOSCore.OSMainContainer:addChild(GUI.container(1, 1, MineOSCore.OSMainContainer.width, sizes.heightOfDock)) + MineOSCore.OSMainContainer.dockContainer.saveToOSSettings = function() + MineOSCore.OSSettings.dockShortcuts = {} + for i = 1, #MineOSCore.OSMainContainer.dockContainer.children do + if MineOSCore.OSMainContainer.dockContainer.children[i].keepInDock then + table.insert(MineOSCore.OSSettings.dockShortcuts, MineOSCore.OSMainContainer.dockContainer.children[i].path) + end + end + MineOSCore.saveOSSettings() + end + MineOSCore.OSMainContainer.dockContainer.sort = function() + local x = 1 + for i = 1, #MineOSCore.OSMainContainer.dockContainer.children do + MineOSCore.OSMainContainer.dockContainer.children[i].localPosition.x = x + x = x + MineOSCore.iconWidth + sizes.xSpaceBetweenIcons + end + + MineOSCore.OSMainContainer.dockContainer.width = (#MineOSCore.OSMainContainer.dockContainer.children) * (MineOSCore.iconWidth + sizes.xSpaceBetweenIcons) - sizes.xSpaceBetweenIcons + MineOSCore.OSMainContainer.dockContainer.localPosition.x = math.floor(MineOSCore.OSMainContainer.width / 2 - MineOSCore.OSMainContainer.dockContainer.width / 2) + end + + MineOSCore.OSMainContainer.dockContainer.addIcon = function(path, window) + local icon = MineOSCore.OSMainContainer.dockContainer:addChild(MineOSCore.createIcon(1, 1, path, 0x262626, MineOSCore.OSSettings.showExtension, 0xFFFFFF)) + icon:moveBackward() + icon.window = window + + icon.onLeftClick = function(icon, eventData) + if icon.window then + icon.window.hidden = false + icon.window:moveToFront() + else + MineOSCore.iconLeftClick(icon, eventData) + end + end + + icon.onRightClick = function(icon, eventData) + local indexOf = icon:indexOf() + + local menu = GUI.contextMenu(eventData[3], eventData[4]) + menu:addItem(MineOSCore.localization.contextMenuShowContainingFolder).onTouch = function() + table.insert(workpathHistory, fs.path(icon.path)) + changeWorkpath(#workpathHistory) + MineOSCore.OSMainContainer.updateAndDraw() + end + menu:addSeparator() + menu:addItem(MineOSCore.localization.contextMenuMoveRight, indexOf >= #MineOSCore.OSMainContainer.dockContainer.children - 1).onTouch = function() + moveDockIcon(indexOf, 1) + end + menu:addItem(MineOSCore.localization.contextMenuMoveLeft, indexOf <= 1).onTouch = function() + moveDockIcon(indexOf, -1) + end + menu:addSeparator() + if icon.keepInDock then + if #MineOSCore.OSMainContainer.dockContainer.children > 1 then + menu:addItem(MineOSCore.localization.contextMenuRemoveFromDock).onTouch = function() + if icon.window then + icon.keepInDock = nil + else + icon:delete() + MineOSCore.OSMainContainer.dockContainer.sort() + end + MineOSCore.OSMainContainer.dockContainer.saveToOSSettings() + MineOSCore.OSMainContainer:draw() + buffer.draw() + end + end + else + if icon.window then + menu:addItem(MineOSCore.localization.keepInDock).onTouch = function() + icon.keepInDock = true + MineOSCore.OSMainContainer.dockContainer.saveToOSSettings() + end + end + end + + menu:show() + end + + MineOSCore.OSMainContainer.dockContainer.sort() + + return icon + end + + -- Trash + local icon = MineOSCore.OSMainContainer.dockContainer.addIcon(MineOSCore.paths.trash) + icon.image = MineOSCore.icons.trash + icon.onRightClick = function(icon, eventData) + local menu = GUI.contextMenu(eventData[3], eventData[4]) + menu:addItem(MineOSCore.localization.emptyTrash).onTouch = function() + local container = MineOSCore.addUniversalContainer(MineOSCore.OSMainContainer, MineOSCore.localization.areYouSure) + + container.layout:addChild(GUI.button(1, 1, 30, 3, 0xEEEEEE, 0x262626, 0xA, 0x262626, "OK")).onTouch = function() + for file in fs.list(MineOSCore.paths.trash) do + fs.remove(MineOSCore.paths.trash .. file) + end + container:delete() + MineOSCore.OSMainContainer.updateAndDraw() + end + + container.panel.onTouch = function() + container:delete() + MineOSCore.OSMainContainer:draw() + buffer.draw() + end + + MineOSCore.OSMainContainer:draw() + buffer.draw() + end + menu:show() + end + + for i = 1, #MineOSCore.OSSettings.dockShortcuts do + MineOSCore.OSMainContainer.dockContainer.addIcon(MineOSCore.OSSettings.dockShortcuts[i]).keepInDock = true + end + + MineOSCore.OSMainContainer.dockContainer.draw = function(dockContainer) + local color, currentDockTransparency, currentDockWidth, xPos, yPos = MineOSCore.OSSettings.interfaceColor or colors.interface, colors.dockBaseTransparency, dockContainer.width, dockContainer.x, dockContainer.y + 2 + + for i = 1, dockContainer.height do + buffer.text(xPos, yPos, color, "▟", currentDockTransparency) + buffer.square(xPos + 1, yPos, currentDockWidth - 2, 1, color, 0xFFFFFF, " ", currentDockTransparency) + buffer.text(xPos + currentDockWidth - 1, yPos, color, "▙", currentDockTransparency) + + currentDockTransparency, currentDockWidth, xPos, yPos = currentDockTransparency - colors.dockTransparencyAdder, currentDockWidth + 2, xPos - 1, yPos + 1 + end + + GUI.drawContainerContent(dockContainer) + end + + -- Windows MineOSCore.OSMainContainer.windowsContainer = MineOSCore.OSMainContainer:addChild(GUI.container(1, 2, 1, 1)) + -- Menu MineOSCore.OSMainContainer.menu = MineOSCore.OSMainContainer:addChild(GUI.menu(1, 1, MineOSCore.OSMainContainer.width, MineOSCore.OSSettings.interfaceColor or colors.interface, 0x444444, 0x3366CC, 0xFFFFFF, colors.topBarTransparency)) local item1 = MineOSCore.OSMainContainer.menu:addItem("MineOS", 0x000000) item1.onTouch = function() @@ -640,7 +685,6 @@ local function createOSWindow() MineOSCore.OSMainContainer.update = function() MineOSCore.OSMainContainer.iconField.fromFile = (currentDesktop - 1) * MineOSCore.OSMainContainer.iconField.iconCount.total + 1 MineOSCore.OSMainContainer.iconField:updateFileList() - updateDock() updateDesktopCounters() end @@ -715,12 +759,13 @@ while true do if success then break else + createOSWindow() changeResolution() - MineOSCore.OSMainContainer.windowsContainer:deleteChildren() - -- MineOSCore.OSMainContainer:draw() - -- buffer.draw() + changeWorkpath(1) + changeWallpaper() + MineOSCore.OSMainContainer.updateAndDraw() - -- MineOSCore.showErrorWindow(path, line, traceback) + MineOSCore.showErrorWindow(path, line, traceback) MineOSCore.OSMainContainer:draw() buffer.draw() diff --git a/lib/GUI.lua b/lib/GUI.lua index 104a4c2a..a1b35f3d 100755 --- a/lib/GUI.lua +++ b/lib/GUI.lua @@ -169,14 +169,16 @@ local function containerObjectMoveForward(object) if objectIndex < #object.parent.children then object.parent.children[index], object.parent.children[index + 1] = swap(object.parent.children[index], object.parent.children[index + 1]) end + return object end -- Move container's object "more far out" of our eyes local function containerObjectMoveBackward(object) local objectIndex = object:indexOf() if objectIndex > 1 then - object.parent.children[index], object.parent.children[index - 1] = swap(object.parent.children[index], object.parent.children[index - 1]) + object.parent.children[objectIndex], object.parent.children[objectIndex - 1] = swap(object.parent.children[objectIndex], object.parent.children[objectIndex - 1]) end + return object end -- Move container's object to front of all objects @@ -184,6 +186,7 @@ local function containerObjectMoveToFront(object) local objectIndex = object:indexOf() table.insert(object.parent.children, object) table.remove(object.parent.children, objectIndex) + return object end -- Move container's object to back of all objects @@ -191,6 +194,7 @@ local function containerObjectMoveToBack(object) local objectIndex = object:indexOf() table.insert(object.parent.children, 1, object) table.remove(object.parent.children, objectIndex + 1) + return object end local function containerGetFirstParent(object) @@ -210,7 +214,7 @@ local function selfDelete(object) end -- Add any object as children to parent container -function GUI.addChildToContainer(container, object) +function GUI.addChildToContainer(container, object, atIndex) object.indexOf = containerObjectIndexOf object.moveToFront = containerObjectMoveToFront object.moveToBack = containerObjectMoveToBack @@ -2195,7 +2199,7 @@ end -------------------------------------------------------------------------------------------------------------------------------- -buffer.start() +-- buffer.start() -- local mainContainer = GUI.fullScreenContainer() -- mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0xFF8888)) diff --git a/lib/MineOSCore.lua b/lib/MineOSCore.lua index 12e6368b..fd4b9fe2 100755 --- a/lib/MineOSCore.lua +++ b/lib/MineOSCore.lua @@ -202,6 +202,14 @@ function MineOSCore.init() MineOSCore.loadStandartIcons() end +function MineOSCore.clearTerminal() + gpu.setBackground(0x1D1D1D) + gpu.setForeground(0xFFFFFF) + local width, height = gpu.getResolution() + gpu.fill(1, 1, width, height, " ") + require("term").setCursor(1, 1) +end + function MineOSCore.waitForPressingAnyKey() print(" ") print(MineOSCore.localization.pressAnyKeyToContinue) @@ -228,7 +236,7 @@ local function launchEditor(icon) end local function launchLua(icon) - ecs.prepareToExit() + MineOSCore.clearTerminal() if MineOSCore.safeLaunch(icon.path) then MineOSCore.waitForPressingAnyKey() end @@ -261,14 +269,14 @@ function MineOSCore.analyzeIconExtension(icon) if icon.isDirectory then if icon.extension == ".app" then if MineOSCore.showApplicationIcons then - icon.iconImage.image = image.load(icon.path .. "/Resources/Icon.pic") + icon.image = image.load(icon.path .. "/Resources/Icon.pic") else - icon.iconImage.image = MineOSCore.icons.application + icon.image = MineOSCore.icons.application end icon.launch = launchApp else - icon.iconImage.image = MineOSCore.icons.folder + icon.image = MineOSCore.icons.folder icon.launch = launchDirectory end else @@ -285,34 +293,34 @@ function MineOSCore.analyzeIconExtension(icon) iconImage = icon.iconImage }) - icon.iconImage.image = shortcutIcon.iconImage.image + icon.image = shortcutIcon.image icon.shortcutLaunch = shortcutIcon.launch icon.launch = launchLnk shortcutIcon = nil elseif icon.extension == ".cfg" or icon.extension == ".config" then - icon.iconImage.image = MineOSCore.icons.config + icon.image = MineOSCore.icons.config icon.launch = launchEditor elseif icon.extension == ".txt" or icon.extension == ".rtf" then - icon.iconImage.image = MineOSCore.icons.text + icon.image = MineOSCore.icons.text icon.launch = launchEditor elseif icon.extension == ".lua" then - icon.iconImage.image = MineOSCore.icons.lua + icon.image = MineOSCore.icons.lua icon.launch = launchLua elseif icon.extension == ".pic" or icon.extension == ".png" then - icon.iconImage.image = MineOSCore.icons.image + icon.image = MineOSCore.icons.image icon.launch = launchImage elseif icon.extension == ".pkg" then - icon.iconImage.image = MineOSCore.icons.archive + icon.image = MineOSCore.icons.archive icon.launch = launchPackage elseif icon.extension == ".3dm" then - icon.iconImage.image = MineOSCore.icons.model3D + icon.image = MineOSCore.icons.model3D icon.launch = launch3DPrint elseif not fs.exists(icon.path) then - icon.iconImage.image = MineOSCore.icons.fileNotExists + icon.image = MineOSCore.icons.fileNotExists icon.launch = launchCorrupted else - icon.iconImage.image = MineOSCore.icons.script + icon.image = MineOSCore.icons.script icon.launch = launchLua end end @@ -326,9 +334,38 @@ function MineOSCore.getParametersForDrawingIcons(fieldWidth, fieldHeight, xSpace return xCountOfIcons, yCountOfIcons, totalCountOfIcons end -function MineOSCore.createIcon(x, y, path, textColor, showExtension, selectionColor) - local icon = GUI.container(x, y, MineOSCore.iconWidth, MineOSCore.iconHeight) +local function iconDraw(icon) + if icon.isSelected then + buffer.square(icon.x, icon.y, icon.width, icon.height, icon.colors.selection, 0x000000, " ", 50) + end + + buffer.image(icon.x + 2, icon.y, icon.image) + + local text + if icon.showExtension then + text = string.limit(fs.name(icon.path), icon.width, "center") + else + text = string.limit(fs.hideExtension(fs.name(icon.path)), icon.width, "center") + end + buffer.text(math.floor(icon.x + icon.width / 2 - unicode.len(text) / 2), icon.y + icon.height - 1, icon.colors.text, text) + + if icon.isShortcut then + buffer.set(icon.x + 9, icon.y + 3, 0xFFFFFF, 0x000000, "<") + end + + if icon.window then + buffer.text(icon.x + 5, icon.y + 4, 0x66DBFF, "╺╸") + end +end + +function MineOSCore.createIcon(x, y, path, textColor, showExtension, selectionColor) + local icon = GUI.object(x, y, MineOSCore.iconWidth, MineOSCore.iconHeight) + + icon.colors = { + text = textColor, + selection = selectionColor, + } icon.path = path icon.size = fs.size(icon.path) icon.isDirectory = fs.isDirectory(icon.path) @@ -337,27 +374,14 @@ function MineOSCore.createIcon(x, y, path, textColor, showExtension, selectionCo icon.isShortcut = false icon.isSelected = false - icon.iconImage = icon:addChild(GUI.image(3, 1, {8, 4})) - icon.textLabel = icon:addChild(GUI.label(1, MineOSCore.iconHeight, MineOSCore.iconWidth, 1, textColor, fs.name(icon.path))):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top) - - local oldDraw = icon.draw - icon.draw = function(icon) - if icon.isSelected then buffer.square(icon.x, icon.y, icon.width, icon.height, selectionColor, 0x000000, " ", 50) end - if icon.showExtension then - icon.textLabel.text = string.limit(fs.name(icon.path), icon.textLabel.width, "center") - else - icon.textLabel.text = string.limit(fs.hideExtension(fs.name(icon.path)), icon.textLabel.width, "center") - end - oldDraw(icon) - if icon.isShortcut then buffer.set(icon.iconImage.x + icon.iconImage.width - 1, icon.iconImage.y + icon.iconImage.height - 1, 0xFFFFFF, 0x000000, "<") end - end + icon.draw = iconDraw -- Поддержка изменяемых извне функций правого и левого кликов icon.onLeftClick = MineOSCore.iconLeftClick icon.onRightClick = MineOSCore.iconRightClick -- Обработка клика непосредственно на иконку - icon.iconImage.eventHandler = function(mainContainer, object, eventData) + icon.eventHandler = function(mainContainer, object, eventData) if eventData[1] == "touch" then icon.isSelected = true MineOSCore.OSDraw() @@ -505,8 +529,6 @@ function MineOSCore.showErrorWindow(path, errorLine, reason) local success, reason = component.internet.request(url) if success then success:close() - else - ecs.error(reason) end sendToDeveloperButton.text = MineOSCore.localization.sendedFeedback @@ -582,7 +604,6 @@ function MineOSCore.safeLaunch(path, ...) component.screen.setPrecise(false) buffer.setResolution(oldResolutionWidth, oldResolutionHeight) - MineOSCore.OSDraw() if not finalSuccess then MineOSCore.showErrorWindow(finalPath, finalLine, finalTraceback) @@ -594,6 +615,7 @@ end ----------------------------------------------------------------------------------------------------------------------------------- function MineOSCore.iconLeftClick(icon, eventData) + MineOSCore.lastLaunchPath = icon.path icon:launch() computer.pushSignal("MineOSCore", "updateFileList") end @@ -609,26 +631,24 @@ function MineOSCore.iconRightClick(icon, eventData) {MineOSCore.localization.contextMenuCut}, {MineOSCore.localization.contextMenuCopy}, {MineOSCore.localization.contextMenuRename}, + {MineOSCore.localization.contextMenuDelete}, {MineOSCore.localization.contextMenuCreateShortcut, icon.extension == ".lnk"}, - "-", {MineOSCore.localization.contextMenuArchive}, - {MineOSCore.localization.contextMenuAddToDock}, "-", - {MineOSCore.localization.contextMenuProperties}, - {MineOSCore.localization.contextMenuDelete} + {MineOSCore.localization.contextMenuAddToDock}, + {MineOSCore.localization.contextMenuProperties} ):show() else action = GUI.contextMenu(eventData[3], eventData[4], {MineOSCore.localization.contextMenuCut}, {MineOSCore.localization.contextMenuCopy}, {MineOSCore.localization.contextMenuRename}, + {MineOSCore.localization.contextMenuDelete}, {MineOSCore.localization.contextMenuCreateShortcut, icon.extension == ".lnk"}, - "-", {MineOSCore.localization.contextMenuArchive}, - {MineOSCore.localization.contextMenuAddToDock}, "-", - {MineOSCore.localization.contextMenuProperties}, - {MineOSCore.localization.contextMenuDelete} + {MineOSCore.localization.contextMenuAddToDock}, + {MineOSCore.localization.contextMenuProperties} ):show() end else @@ -640,10 +660,10 @@ function MineOSCore.iconRightClick(icon, eventData) {MineOSCore.localization.contextMenuCut}, {MineOSCore.localization.contextMenuCopy}, {MineOSCore.localization.contextMenuRename}, + {MineOSCore.localization.contextMenuDelete}, "-", {MineOSCore.localization.contextMenuAddToDock}, - {MineOSCore.localization.contextMenuProperties}, - {MineOSCore.localization.contextMenuDelete} + {MineOSCore.localization.contextMenuProperties} ):show() elseif icon.extension == ".pic" then action = GUI.contextMenu(eventData[3], eventData[4], @@ -652,31 +672,26 @@ function MineOSCore.iconRightClick(icon, eventData) {MineOSCore.localization.contextMenuCut}, {MineOSCore.localization.contextMenuCopy}, {MineOSCore.localization.contextMenuRename}, + {MineOSCore.localization.contextMenuDelete}, {MineOSCore.localization.contextMenuCreateShortcut, icon.extension == ".lnk"}, "-", - -- {MineOSCore.localization.contextMenuArchive}, {MineOSCore.localization.contextMenuAddToDock}, - "-", - {MineOSCore.localization.contextMenuProperties}, - {MineOSCore.localization.contextMenuDelete} + {MineOSCore.localization.contextMenuProperties} ):show() elseif icon.extension == ".lua" then action = GUI.contextMenu(eventData[3], eventData[4], {MineOSCore.localization.contextMenuEdit}, + {MineOSCore.localization.launchWithArguments}, {MineOSCore.localization.contextMenuFlashEEPROM, (not component.isAvailable("eeprom") or icon.size > 4096)}, "-", {MineOSCore.localization.contextMenuCut}, {MineOSCore.localization.contextMenuCopy}, {MineOSCore.localization.contextMenuRename}, + {MineOSCore.localization.contextMenuDelete}, {MineOSCore.localization.contextMenuCreateShortcut, icon.extension == ".lnk"}, - -- "-", - -- {MineOSCore.localization.contextMenuUploadToPastebin, true}, "-", - -- {MineOSCore.localization.contextMenuArchive}, {MineOSCore.localization.contextMenuAddToDock}, - "-", - {MineOSCore.localization.contextMenuProperties}, - {MineOSCore.localization.contextMenuDelete} + {MineOSCore.localization.contextMenuProperties} ):show() else action = GUI.contextMenu(eventData[3], eventData[4], @@ -685,13 +700,11 @@ function MineOSCore.iconRightClick(icon, eventData) {MineOSCore.localization.contextMenuCut}, {MineOSCore.localization.contextMenuCopy}, {MineOSCore.localization.contextMenuRename}, + {MineOSCore.localization.contextMenuDelete}, {MineOSCore.localization.contextMenuCreateShortcut, icon.extension == ".lnk"}, "-", - -- {MineOSCore.localization.contextMenuArchive}, {MineOSCore.localization.contextMenuAddToDock}, - "-", - {MineOSCore.localization.contextMenuProperties}, - {MineOSCore.localization.contextMenuDelete} + {MineOSCore.localization.contextMenuProperties} ):show() end end @@ -746,9 +759,10 @@ function MineOSCore.iconRightClick(icon, eventData) file:close() computer.beep(1500, 0.2) elseif action == MineOSCore.localization.contextMenuAddToDock then - table.insert(MineOSCore.OSSettings.dockShortcuts, {path = icon.path}) - MineOSCore.saveOSSettings() - computer.pushSignal("MineOSCore", "updateFileList") + MineOSCore.OSMainContainer.dockContainer.addIcon(icon.path).keepInDock = true + MineOSCore.OSMainContainer.dockContainer.saveToOSSettings() + elseif action == MineOSCore.localization.launchWithArguments then + MineOSCore.launchWithArguments(MineOSCore.OSMainContainer, icon.path) end end @@ -796,7 +810,14 @@ local function addUniversalContainerWithInputTextBoxes(parentWindow, path, text, container.inputTextBox = container.layout:addChild(GUI.inputTextBox(1, 1, 36, 3, 0xEEEEEE, 0x666666, 0xEEEEEE, 0x262626, text, placeholder, false)) container.label = container.layout:addChild(GUI.label(1, 1, 36, 3, 0xFF4940, " ")):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top) - + container.panel.eventHandler = function(mainContainer, object, eventData) + if eventData[1] == "touch" then + container:delete() + mainContainer:draw() + buffer.draw() + end + end + parentWindow:draw() buffer.draw() @@ -867,6 +888,27 @@ function MineOSCore.rename(parentWindow, path) end end +function MineOSCore.launchWithArguments(parentWindow, path) + local container = addUniversalContainerWithInputTextBoxes(parentWindow, path, nil, MineOSCore.localization.launchWithArguments) + + container.inputTextBox.onInputFinished = function() + local args = {} + if container.inputTextBox.text then + for arg in container.inputTextBox.text:gmatch("[^%s]+") do + table.insert(args, arg) + end + end + container:delete() + + MineOSCore.clearTerminal() + if MineOSCore.safeLaunch(path, table.unpack(args)) then + MineOSCore.waitForPressingAnyKey() + end + + MineOSCore.OSDraw(true) + end +end + function MineOSCore.applicationHelp(parentWindow, path) local pathToAboutFile = path .. "/resources/About/" .. MineOSCore.OSSettings.language .. ".txt" if MineOSCore.OSSettings.showHelpOnApplicationStart and fs.exists(pathToAboutFile) then @@ -927,47 +969,69 @@ local function windowResize(window, width, height) return window end -local function windowMinimize(window) - window.localPosition.x, window.localPosition.y = window.oldGeometry.x, window.oldGeometry.y - window:resize(window.oldGeometry.width, window.oldGeometry.height) - MineOSCore.OSDraw() -end - -local function windowMaximize(window) - window.localPosition.x, window.localPosition.y = 1, 1 - if window.width ~= window.parent.width or window.height ~= window.parent.height then - window.oldGeometry.x, window.oldGeometry.y, window.oldGeometry.width, window.oldGeometry.height = window.localPosition.x, window.localPosition.y, window.width, window.height - window:resize(window.parent.width, window.parent.height) - end - MineOSCore.OSDraw() -end - -local function windowClose(window) - window:delete() - MineOSCore.OSDraw() -end - function MineOSCore.addWindow(window) window.x = window.x or math.floor(MineOSCore.OSMainContainer.windowsContainer.width / 2 - window.width / 2) window.y = window.y or math.floor(MineOSCore.OSMainContainer.windowsContainer.height / 2 - window.height / 2) MineOSCore.OSMainContainer.windowsContainer:addChild(window) - + + -- Dock + local dockPath = MineOSCore.lastLaunchPath or "/lib/MineOSCore.lua" + MineOSCore.lastLaunchPath = nil + + local dockIcon + for i = 1, #MineOSCore.OSMainContainer.dockContainer.children do + if MineOSCore.OSMainContainer.dockContainer.children[i].path == dockPath then + dockIcon = MineOSCore.OSMainContainer.dockContainer.children[i] + break + end + end + dockIcon = dockIcon or MineOSCore.OSMainContainer.dockContainer.addIcon(dockPath, window) + dockIcon.window = dockIcon.window or window + window.resize = windowResize window.onResize = onWindowResize - window.close = windowClose + window.close = function(window) + local sameIconExists = false + for i = 1, #MineOSCore.OSMainContainer.dockContainer.children do + if MineOSCore.OSMainContainer.dockContainer.children[i].path == dockPath and MineOSCore.OSMainContainer.dockContainer.children[i].window and MineOSCore.OSMainContainer.dockContainer.children[i].window ~= window then + sameIconExists = true + break + end + end + + if not sameIconExists then + dockIcon.window = nil + if not dockIcon.keepInDock then + dockIcon:delete() + MineOSCore.OSMainContainer.dockContainer.sort() + end + end + + window:delete() + MineOSCore.OSDraw() + end + + window.maximize = function(window) + window.localPosition.x, window.localPosition.y = 1, 1 + window:resize(window.parent.width, window.parent.height) + MineOSCore.OSDraw() + end + + window.minimize = function(window) + window.hidden = true + MineOSCore.OSDraw() + end if window.actionButtons then - window.oldGeometry = {x = window.x, y = window.y, width = window.width, height = window.height} - window.actionButtons.close.onTouch = function() - windowClose(window) + window.close(window) end window.actionButtons.maximize.onTouch = function() - windowMaximize(window) + window.maximize(window) end window.actionButtons.minimize.onTouch = function() - windowMinimize(window) + window.minimize(window) end end @@ -985,7 +1049,7 @@ function MineOSCore.propertiesWindow(x, y, width, icon) local mainContainer, window = MineOSCore.addWindow(GUI.titledWindow(x, y, width, 1, package.loaded.MineOSCore.localization.contextMenuProperties)) window.backgroundPanel.colors.transparency = 25 - window:addChild(GUI.image(2, 3, icon.iconImage.image)) + window:addChild(GUI.image(2, 3, icon.image)) local x, y = 11, 3 addKeyAndValue(window, x, y, package.loaded.MineOSCore.localization.type, icon.extension and icon.extension or (icon.isDirectory and package.loaded.MineOSCore.localization.folder or package.loaded.MineOSCore.localization.unknown)); y = y + 1 @@ -996,6 +1060,7 @@ function MineOSCore.propertiesWindow(x, y, width, icon) local lines = string.wrap(icon.path, window.width - 18) local textBox = window:addChild(GUI.textBox(17, y, window.width - 18, #lines, nil, 0x555555, lines, 1)) window:resize(window.width, textBox.y + textBox.height) + textBox.eventHandler = nil mainContainer:draw() buffer.draw() diff --git a/lib/advancedLua.lua b/lib/advancedLua.lua index 7769d947..e4ba1a72 100755 --- a/lib/advancedLua.lua +++ b/lib/advancedLua.lua @@ -410,6 +410,23 @@ function table.size(t) return size end +function table.contains(t, object) + for key in pairs(t) do + if t[key] == object then + return true + end + end + return false +end + +function table.indexOf(t, object) + for i = 1, #t do + if t[i] == object then + return i + end + end +end + -------------------------------------------------- String extensions -------------------------------------------------- function string.readUnicodeChar(file) diff --git a/lib/palette.lua b/lib/palette.lua index 6f6ad36c..af6c16cd 100755 --- a/lib/palette.lua +++ b/lib/palette.lua @@ -121,6 +121,7 @@ function palette.window(x, y, startColor) buffer.draw() end end + window.bigCrest.eventHandler = window.bigRainbow.eventHandler window.miniRainbow = window:addChild(GUI.image(53, 1, image.create(3, 25))) window.miniCrest = window:addChild(GUI.object(52, 1, 5, 1)) diff --git a/lib/web.lua b/lib/web.lua index 6e9fcd23..0d55ee02 100755 --- a/lib/web.lua +++ b/lib/web.lua @@ -97,7 +97,7 @@ function web.downloadMineOSApplication(application, language) local file, reason = io.open(path, "w") if file then - file:write("return \"" .. application.path .. ".app" .. "\"") + file:write("return \"" .. application.path .. ".app/" .. "\"") file:close() else print(reason)