mirror of
https://github.com/IgorTimofeev/MineOS.git
synced 2025-12-20 19:19:21 +01:00
433 lines
17 KiB
Lua
433 lines
17 KiB
Lua
---------------------------------------------- Библиотеки ------------------------------------------------------------------------
|
||
|
||
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
|
||
|
||
|
||
|
||
|
||
|