MineOS/lib/MineOSCore.lua
Igor Timofeev c2a21777c2 гм
2016-06-03 12:08:06 +03:00

433 lines
17 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---------------------------------------------- Библиотеки ------------------------------------------------------------------------
local libraries = {
computer = "computer",
ecs = "ECSAPI",
component = "component",
files = "files",
fs = "filesystem",
context = "context",
buffer = "doubleBuffering",
image = "image",
GUI = "GUI",
zip = "archive"
}
for library in pairs(libraries) do if not _G[library] then _G[library] = require(libraries[library]) end end
libraries = nil
local MineOSCore = {}
-----------------------------------------------------------------------------------------------------------------------------------
MineOSCore.iconWidth = 12
MineOSCore.iconHeight = 6
MineOSCore.paths = {
localizationFile = "MineOS/System/OS/Languages/" .. _G.OSSettings.language .. ".lang",
system = "MineOS/System/",
icons = "MineOS/System/OS/Icons/",
applications = "MineOS/Applications/",
pictures = "MineOS/Pictures/",
}
MineOSCore.sortingMethods = {
type = 0,
name = 1,
date = 2,
}
MineOSCore.colors = {
background = 0x262626.
}
MineOSCore.localization = {}
-----------------------------------------------------------------------------------------------------------------------------------
function MineOSCore.loadIcon(name, path)
if not MineOSCore.icons[name] then MineOSCore.icons[name] = image.load(path) end
return MineOSCore.icons[name]
end
--Вся необходимая информация для иконок
function MineOSCore.loadStandartIcons()
MineOSCore.icons = {}
MineOSCore.loadIcon("folder", MineOSCore.paths.icons .. "Folder.pic")
MineOSCore.loadIcon("script", MineOSCore.paths.icons .. "Script.pic")
MineOSCore.loadIcon("text", MineOSCore.paths.icons .. "Text.pic")
MineOSCore.loadIcon("config", MineOSCore.paths.icons .. "Config.pic")
MineOSCore.loadIcon("lua", MineOSCore.paths.icons .. "Lua.pic")
MineOSCore.loadIcon("image", MineOSCore.paths.icons .. "Image.pic")
MineOSCore.loadIcon("pastebin", MineOSCore.paths.icons .. "Pastebin.pic")
MineOSCore.loadIcon("fileNotExists", MineOSCore.paths.icons .. "FileNotExists.pic")
MineOSCore.loadIcon("archive", MineOSCore.paths.icons .. "Archive.pic")
MineOSCore.loadIcon("model3D", MineOSCore.paths.icons .. "3DModel.pic")
end
function MineOSCore.init()
MineOSCore.localization = files.loadTableFromFile(MineOSCore.paths.localizationFile)
MineOSCore.loadStandartIcons()
end
-----------------------------------------------------------------------------------------------------------------------------------
--Отрисовка одной иконки
function MineOSCore.drawIcon(x, y, path, showFileFormat, nameColor)
local fileFormat, icon = ecs.getFileFormat(path)
if fs.isDirectory(path) then
if fileFormat == ".app" then
-- icon = "cyka"
-- MineOSCore.icons[icon] = image.load(path .. "/Resources/Icon.pic")
icon = path .. "/Resources/Icon.pic"
MineOSCore.loadIcon(icon, icon)
else
icon = "folder"
end
else
if fileFormat == ".lnk" then
MineOSCore.drawIcon(x, y, ecs.readShortcut(path), showFileFormat, nameColor)
buffer.set(x + MineOSCore.iconWidth - 3, y + MineOSCore.iconHeight - 3, 0xFFFFFF, 0x000000, "<")
return 0
elseif fileFormat == ".cfg" or fileFormat == ".config" then
icon = "config"
elseif fileFormat == ".txt" or fileFormat == ".rtf" then
icon = "text"
elseif fileFormat == ".lua" then
icon = "lua"
elseif fileFormat == ".pic" or fileFormat == ".png" then
icon = "image"
elseif fileFormat == ".paste" then
icon = "pastebin"
elseif fileFormat == ".pkg" then
icon = "archive"
elseif fileFormat == ".3dm" then
icon = "model3D"
elseif not fs.exists(path) then
icon = "fileNotExists"
else
icon = "script"
end
end
--Рисуем иконку
buffer.image(x + 2, y, MineOSCore.icons[icon])
--Делаем текст для иконки
local text = fs.name(path)
if not showFileFormat and fileFormat then text = unicode.sub(text, 1, -(unicode.len(fileFormat) + 1)) end
text = ecs.stringLimit("end", text, MineOSCore.iconWidth)
x = x + math.floor(MineOSCore.iconWidth / 2 - unicode.len(text) / 2)
--Рисуем текст под иконкой
buffer.text(x, y + MineOSCore.iconHeight - 1, nameColor or 0xffffff, text)
end
function MineOSCore.safeLaunch(command, ...)
local oldResolutionWidth, oldResolutionHeight = component.gpu.getResolution()
local loadSuccess, loadReason = loadfile(command)
if loadSuccess then
local success, reason = pcall(loadSuccess, ...)
--Ебал я автора мода в задницу, кусок ебанутого говна
--Какого хуя я должен вставлять кучу костылей в свой прекрасный код только потому, что эта ублюдочная
--скотина захотела выдавать table из pcall? Что, блядь? Где это видано, сука?
--Почему тогда во всех случаях выдается string, а при os.exit выдается {reason = "terminated"}?
--Что за ебливая сучья логика?
if not success and type(reason) ~= "table" then
reason = ecs.parseErrorMessage(reason, false)
GUI.error(reason, {title = {color = 0xFFDB40, text = MineOSCore.localization.errorWhileRunningProgram}})
end
else
component.gpu.setResolution(oldResolutionWidth, oldResolutionHeight)
GUI.error(loadReason, {title = {color = 0xFFDB40, text = MineOSCore.localization.errorWhileRunningProgram}})
end
buffer.start()
end
-- Запуск приложения
function MineOSCore.launchIcon(path, translate)
--Получаем файл формат заранее
local fileFormat = ecs.getFileFormat(path)
local isDirectory = fs.isDirectory(path)
--Если это приложение
if fileFormat == ".app" then
ecs.applicationHelp(path)
MineOSCore.safeLaunch(path .. "/" .. ecs.hideFileFormat(fs.name(path)) .. ".lua")
--Если это папка
elseif (fileFormat == "" or fileFormat == nil) and isDirectory then
MineOSCore.safeLaunch("MineOS/Applications/Finder.app/Finder.lua", "open", path)
--Если это обычный луа файл - т.е. скрипт
elseif fileFormat == ".lua" or fileFormat == nil then
buffer.clear(MineOSCore.colors.background)
ecs.prepareToExit()
MineOSCore.safeLaunch(path)
--Если это фоточка
elseif fileFormat == ".pic" then
MineOSCore.safeLaunch("MineOS/Applications/Viewer.app/Viewer.lua", "open", path)
--Если это 3D-модель
elseif fileFormat == ".3dm" then
MineOSCore.safeLaunch("MineOS/Applications/3DPrint.app/3DPrint.lua open " .. path)
--Если это текст или конфиг или языковой
elseif fileFormat == ".txt" or fileFormat == ".cfg" or fileFormat == ".MineOSCore.localization" then
ecs.prepareToExit()
MineOSCore.safeLaunch("bin/edit.lua", path)
--Если это ярлык
elseif fileFormat == ".lnk" then
local shortcutLink = ecs.readShortcut(path)
if fs.exists(shortcutLink) then
MineOSCore.launchIcon(shortcutLink)
else
GUI.error(MineOSCore.localization.shortcutIsCorrupted)
end
--Если это архив
elseif fileFormat == ".zip" then
zip.unarchive(path, (fs.path(path) or ""))
end
end
-----------------------------------------------------------------------------------------------------------------------------------
function MineOSCore.getParametersForDrawingIcons(fieldWidth, fieldHeight, xSpaceBetweenIcons, ySpaceBetweenIcons)
local xCountOfIcons, yCountOfIcons = math.floor(fieldWidth / (MineOSCore.iconWidth + xSpaceBetweenIcons)), math.floor(fieldHeight / (MineOSCore.iconHeight + ySpaceBetweenIcons))
local totalCountOfIcons = xCountOfIcons * yCountOfIcons
return xCountOfIcons, yCountOfIcons, totalCountOfIcons
end
function MineOSCore.drawIconField(x, y, xCountOfIcons, yCountOfIcons, fromIcon, totalCountOfIcons, xSpaceBetweenIcons, ySpaceBetweenIcons, path, fileList, showFileFormat, iconTextColor)
local iconObjects = {}
local xPos, yPos, iconCounter = x, y, 1
for i = fromIcon, (fromIcon + totalCountOfIcons - 1) do
if not fileList[i] then break end
local iconObject = GUI.object(xPos, yPos, MineOSCore.iconWidth, MineOSCore.iconHeight)
iconObject.path = path .. fileList[i]
table.insert(iconObjects, iconObject)
MineOSCore.drawIcon(xPos, yPos, iconObject.path, showFileFormat, iconTextColor)
xPos = xPos + MineOSCore.iconWidth + xSpaceBetweenIcons
iconCounter = iconCounter + 1
if iconCounter > xCountOfIcons then
xPos = x
yPos = yPos + MineOSCore.iconHeight + ySpaceBetweenIcons
iconCounter = 1
end
end
return iconObjects
end
-----------------------------------------------------------------------------------------------------------------------------------
local function executeMethod(methodArray)
methodArray.method(table.unpack(methodArray.arguments))
end
function MineOSCore.iconSelect(icon, selectionColor, selectionTransparency, iconTextColor)
local oldPixelsOfIcon = buffer.copy(icon.x, icon.y, MineOSCore.iconWidth, MineOSCore.iconHeight)
buffer.square(icon.x, icon.y, MineOSCore.iconWidth, MineOSCore.iconHeight, selectionColor, 0xFFFFFF, " ", selectionTransparency)
MineOSCore.drawIcon(icon.x, icon.y, icon.path, false, iconTextColor)
buffer.draw()
return oldPixelsOfIcon
end
function MineOSCore.iconLeftClick(icon, oldPixelsOfIcon, fileFormat, drawAllMethod, fullRefreshMethod, changeCurrentPathMethod)
if fs.isDirectory(icon.path) then
if fileFormat == ".app" then
MineOSCore.launchIcon(icon.path)
executeMethod(fullRefreshMethod)
else
executeMethod(changeCurrentPathMethod)
executeMethod(drawAllMethod)
end
else
MineOSCore.launchIcon(icon.path)
buffer.start()
executeMethod(fullRefreshMethod)
-- GUI.error("Скрипт выполнен успешно")
end
end
function MineOSCore.iconRightClick(icon, oldPixelsOfIcon, eventData, fileFormat, somethingCanBeAddedToDock, drawAllMethod, fullRefreshMethod, changeCurrentPathMethod)
local action
-- Разные контекстные меню
if fs.isDirectory(icon.path) then
if fileFormat == ".app" then
action = context.menu(eventData[3], eventData[4],
{MineOSCore.localization.contextMenuShowPackageContent},
"-",
{MineOSCore.localization.contextMenuCopy},
{MineOSCore.localization.contextMenuPaste, not _G.clipboard},
"-",
{MineOSCore.localization.contextMenuRename},
{MineOSCore.localization.contextMenuCreateShortcut},
"-",
{MineOSCore.localization.contextMenuUploadToPastebin, true},
"-",
{MineOSCore.localization.contextMenuAddToDock, not somethingCanBeAddedToDock},
{MineOSCore.localization.contextMenuDelete}
)
else
action = context.menu(eventData[3], eventData[4],
{MineOSCore.localization.contextMenuCopy},
{MineOSCore.localization.contextMenuRename},
{MineOSCore.localization.contextMenuCreateShortcut},
"-",
{MineOSCore.localization.contextMenuArchive},
"-",
{MineOSCore.localization.contextMenuDelete}
)
end
else
if fileFormat == ".pic" then
action = context.menu(eventData[3], eventData[4],
{MineOSCore.localization.contextMenuEdit},
{MineOSCore.localization.contextMenuEditInPhotoshop},
{MineOSCore.localization.contextMenuSetAsWallpaper},
"-",
{MineOSCore.localization.contextMenuCopy, false},
{MineOSCore.localization.contextMenuRename},
{MineOSCore.localization.contextMenuCreateShortcut},
"-",
{MineOSCore.localization.contextMenuUploadToPastebin, true},
"-",
{MineOSCore.localization.contextMenuAddToDock, not somethingCanBeAddedToDock},
{MineOSCore.localization.contextMenuDelete, false}
)
else
action = context.menu(eventData[3], eventData[4],
{MineOSCore.localization.contextMenuEdit},
-- {MineOSCore.localization.contextMenuCreateApplication},
"-",
{MineOSCore.localization.contextMenuCopy},
{MineOSCore.localization.contextMenuRename},
{MineOSCore.localization.contextMenuCreateShortcut},
"-",
{MineOSCore.localization.contextMenuUploadToPastebin, true},
"-",
{MineOSCore.localization.contextMenuAddToDock, not somethingCanBeAddedToDock},
{MineOSCore.localization.contextMenuDelete}
)
end
end
if action == MineOSCore.localization.contextMenuEdit then
ecs.prepareToExit()
MineOSCore.safeLaunch("bin/edit.lua", icon.path)
executeMethod(fullRefreshMethod)
elseif action == MineOSCore.localization.contextMenuEditInPhotoshop then
MineOSCore.safeLaunch("MineOS/Applications/Photoshop.app/Photoshop.lua", "open", icon.path)
executeMethod(fullRefreshMethod)
-- buffer.paste(1, 1, oldPixelsOfFullScreen)
-- drawAll(true)
elseif action == MineOSCore.localization.contextMenuAddToFavourites then
-- addToFavourites(fs.name(path), path)
computer.pushSignal("finderFavouriteAdded", icon.path)
executeMethod(drawAllMethod)
elseif action == MineOSCore.localization.contextMenuShowPackageContent then
executeMethod(changeCurrentPathMethod)
executeMethod(drawAllMethod)
-- changePath(path)
-- drawAll()
elseif action == MineOSCore.localization.contextMenuCopy then
_G.clipboard = icon.path
executeMethod(drawAllMethod)
elseif action == MineOSCore.localization.contextMenuPaste then
ecs.copy(_G.clipboard, fs.path(icon.path) or "")
executeMethod(drawAllMethod)
-- getFileList(workPathHistory[currentWorkPathHistoryElement])
-- drawAll()
elseif action == MineOSCore.localization.contextMenuDelete then
fs.remove(icon.path)
executeMethod(drawAllMethod)
-- getFileList(workPathHistory[currentWorkPathHistoryElement])
-- drawAll()
elseif action == MineOSCore.localization.contextMenuRename then
ecs.rename(icon.path)
executeMethod(drawAllMethod)
-- getFileList(workPathHistory[currentWorkPathHistoryElement])
-- drawAll()
elseif action == MineOSCore.localization.contextMenuCreateShortcut then
ecs.createShortCut(fs.path(icon.path).."/"..ecs.hideFileFormat(fs.name(icon.path))..".lnk", icon.path)
executeMethod(drawAllMethod)
-- getFileList(workPathHistory[currentWorkPathHistoryElement])
-- drawAll()
elseif action == MineOSCore.localization.contextMenuArchive then
-- ecs.info("auto", "auto", "", "Архивация файлов...")
archive.pack(ecs.hideFileFormat(fs.name(icon.path))..".pkg", icon.path)
executeMethod(drawAllMethod)
-- getFileList(workPathHistory[currentWorkPathHistoryElement])
-- drawAll()
elseif action == MineOSCore.localization.contextMenuUploadToPastebin then
MineOSCore.safeLaunch("MineOS/Applications/Pastebin.app/Pastebin.lua", "upload", icon.path)
executeMethod(fullRefreshMethod)
-- shell.execute("MineOS/Applications/Pastebin.app/Pastebin.lua upload " .. path)
-- getFileList(workPathHistory[currentWorkPathHistoryElement])
-- drawAll(true)
elseif action == MineOSCore.localization.contextMenuSetAsWallpaper then
--ecs.error(path)
ecs.createShortCut("MineOS/System/OS/Wallpaper.lnk", icon.path)
computer.pushSignal("OSWallpaperChanged")
return true
-- buffer.paste(1, 1, oldPixelsOfFullScreen)
-- buffer.draw()
elseif action == MineOSCore.localization.contextMenuCreateApplication then
ecs.newApplicationFromLuaFile(icon.path, fs.path(icon.path) or "")
executeMethod(drawAllMethod)
-- getFileList(workPathHistory[currentWorkPathHistoryElement])
-- drawAll()
else
buffer.paste(icon.x, icon.y, oldPixelsOfIcon)
buffer.draw()
end
end
function MineOSCore.iconClick(icon, eventData, selectionColor, selectionTransparency, iconTextColor, clickSleepDelay, somethingCanBeAddedToDock, drawAllMethod, fullRefreshMethod, changeCurrentPathMethod)
local fileFormat = ecs.getFileFormat(icon.path)
local oldPixelsOfIcon = MineOSCore.iconSelect(icon, selectionColor, selectionTransparency, iconTextColor)
local dataToReturn
if eventData[5] == 0 then
os.sleep(clickSleepDelay)
dataToReturn = MineOSCore.iconLeftClick(icon, oldPixelsOfIcon, fileFormat, drawAllMethod, fullRefreshMethod, changeCurrentPathMethod)
else
dataToReturn = MineOSCore.iconRightClick(icon, oldPixelsOfIcon, eventData, fileFormat, somethingCanBeAddedToDock, drawAllMethod, fullRefreshMethod, changeCurrentPathMethod)
end
return dataToReturn
end
function MineOSCore.emptyZoneClick(eventData, workPath, drawAllMethod, fullRefreshMethod)
local action = context.menu(eventData[3], eventData[4], {MineOSCore.localization.contextMenuNewFile}, {MineOSCore.localization.contextMenuNewFolder}, {MineOSCore.localization.contextMenuNewApplication}, "-", {MineOSCore.localization.contextMenuPaste, (_G.clipboard == nil), "^V"})
if action == MineOSCore.localization.contextMenuNewFile then
ecs.newFile(workPath)
executeMethod(fullRefreshMethod)
elseif action == MineOSCore.localization.contextMenuNewFolder then
ecs.newFolder(workPath)
executeMethod(drawAllMethod)
elseif action == MineOSCore.localization.contextMenuPaste then
ecs.copy(_G.clipboard, workPath)
executeMethod(drawAllMethod)
elseif action == MineOSCore.localization.contextMenuNewApplication then
ecs.newApplication(workPath)
executeMethod(drawAllMethod)
end
end
-----------------------------------------------------------------------------------------------------------------------------------
MineOSCore.init()
-----------------------------------------------------------------------------------------------------------------------------------
return MineOSCore