Полноценная оконна ось, ебать!

This commit is contained in:
Igor Timofeev 2017-05-27 02:40:46 +03:00
parent 893ffa379f
commit e385f7df3f
12 changed files with 361 additions and 255 deletions

View File

@ -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",

View File

@ -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

View File

@ -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"

View File

@ -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)

View File

@ -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",
}
}

View File

@ -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 = "Путь для сохранения",
}

View File

@ -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()

View File

@ -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))

View File

@ -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()

View File

@ -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)

View File

@ -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))

View File

@ -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)