2015-08-25 01:21:08 +03:00

819 lines
28 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 copyright = [[
Тут можно было бы написать кучу текста, мол,
вы не имеете прав на использование этой хуйни в
коммерческих целях и прочую чушь, навеянную нам
западной культурой. Но я же не пидор какой-то, верно?
Просто помни, сука, что эту ОСь накодил Тимофеев Игорь,
ссылка на ВК: vk.com/id7799889
]]
local component = require("component")
local event = require("event")
local term = require("term")
local unicode = require("unicode")
local ecs = require("ECSAPI")
local fs = require("filesystem")
local shell = require("shell")
local context = require("context")
local computer = require("computer")
local keyboard = require("keyboard")
local image = require("image")
local config = require("config")
local gpu = component.gpu
------------------------------------------------------------------------------------------------------------------------
local xSize, ySize = gpu.getResolution()
local icons = {}
local workPath = ""
local workPathHistory = {}
local clipboard
local currentFileList
local currentDesktop = 1
local countOfDesktops
--ЗАГРУЗКА ИКОНОК
icons["folder"] = image.load("System/OS/Icons/Folder.png")
icons["script"] = image.load("System/OS/Icons/Script.png")
icons["text"] = image.load("System/OS/Icons/Text.png")
icons["config"] = image.load("System/OS/Icons/Config.png")
icons["lua"] = image.load("System/OS/Icons/Lua.png")
icons["image"] = image.load("System/OS/Icons/Image.png")
--ПЕРЕМЕННЫЕ ДЛЯ ДОКА
local dockColor = 0xcccccc
local heightOfDock = 4
local background = 0x262626
local currentCountOfIconsInDock = 4
local pathOfDockShortcuts = "System/OS/Dock/"
--ПЕРЕМЕННЫЕ, КАСАЮЩИЕСЯ ИКОНОК
local widthOfIcon = 12
local heightOfIcon = 6
local xSpaceBetweenIcons = 2
local ySpaceBetweenIcons = 1
local xCountOfIcons = math.floor(xSize / (widthOfIcon + xSpaceBetweenIcons))
local yCountOfIcons = math.floor((ySize - (heightOfDock + 6)) / (heightOfIcon + ySpaceBetweenIcons))
local totalCountOfIcons = xCountOfIcons * yCountOfIcons
local iconsSelectionColor = ecs.colors.lightBlue
--local yPosOfIcons = math.floor((ySize - heightOfDock - 2) / 2 - (yCountOfIcons * (heightOfIcon + ySpaceBetweenIcons) - ySpaceBetweenIcons * 2) / 2)
local yPosOfIcons = 3
local xPosOfIcons = math.floor(xSize / 2 - (xCountOfIcons * (widthOfIcon + xSpaceBetweenIcons) - xSpaceBetweenIcons*4) / 2)
local dockCountOfIcons = xCountOfIcons - 1
--ПЕРЕМЕННЫЕ ДЛЯ ТОП БАРА
local topBarColor = 0xdddddd
local showHiddenFiles = false
local showSystemFiles = false
local showFileFormat = false
------------------------------------------------------------------------------------------------------------------------
--СОЗДАНИЕ ОБЪЕКТОВ
local obj = {}
local function newObj(class, name, ...)
obj[class] = obj[class] or {}
obj[class][name] = {...}
end
--Создать ярлык для конкретной проги
local function createShortCut(path, pathToProgram)
fs.remove(path)
fs.makeDirectory(fs.path(path))
local file = io.open(path, "w")
file:write("return ", "\"", pathToProgram, "\"")
file:close()
end
--ПОЛУЧИТЬ ДАННЫЕ О ФАЙЛЕ ИЗ ЯРЛЫКА
local function readShortcut(path)
local success, filename = pcall(loadfile(path))
if success then
return filename
else
error("Ошибка чтения файла ярлыка. Вероятно, он создан криво, либо не существует в папке " .. path)
end
end
--ОТРИСОВКА ТЕКСТА ПОД ИКОНКОЙ
local function drawIconText(xIcons, yIcons, path)
local text = fs.name(path)
if not showFileFormat then
local fileFormat = ecs.getFileFormat(text)
if fileFormat then
text = unicode.sub(text, 1, -(unicode.len(fileFormat) + 1))
end
end
text = ecs.stringLimit("end", text, widthOfIcon)
local textPos = xIcons + math.floor(widthOfIcon / 2 - unicode.len(text) / 2) - 2
ecs.adaptiveText(textPos, yIcons + heightOfIcon - 1, text, 0xffffff)
end
--ОТРИСОВКА КОНКРЕТНОЙ ОДНОЙ ИКОНКИ
local function drawIcon(xIcons, yIcons, path)
--НАЗНАЧЕНИЕ ВЕРНОЙ ИКОНКИ
local icon
local fileFormat = ecs.getFileFormat(path)
if fs.isDirectory(path) then
if fileFormat == ".app" then
icon = path .. "/Resources/Icon.png"
icons[icon] = image.load(icon)
else
icon = "folder"
end
else
if fileFormat == ".lnk" then
local shortcutLink = readShortcut(path)
drawIcon(xIcons, yIcons, shortcutLink)
ecs.colorTextWithBack(xIcons + widthOfIcon - 6, yIcons + heightOfIcon - 3, 0x000000, 0xffffff, "")
drawIconText(xIcons, yIcons, path)
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 == ".png" then
icon = "image"
else
icon = "script"
end
end
--ОТРИСОВКА ИКОНКИ
image.draw(xIcons, yIcons, icons[icon] or icons["script"])
--ОТРИСОВКА ТЕКСТА
drawIconText(xIcons, yIcons, path)
end
--НАРИСОВАТЬ ВЫДЕЛЕНИЕ ИКОНКИ
local function drawIconSelection(x, y, nomer)
if obj["DesktopIcons"][nomer][6] == true then
ecs.square(x - 2, y, widthOfIcon, heightOfIcon, iconsSelectionColor)
elseif obj["DesktopIcons"][nomer][6] == false then
ecs.square(x - 2, y, widthOfIcon, heightOfIcon, background)
end
end
local function deselectAll(mode)
for key, val in pairs(obj["DesktopIcons"]) do
if not mode then
if obj["DesktopIcons"][key][6] == true then
obj["DesktopIcons"][key][6] = false
end
else
if obj["DesktopIcons"][key][6] == false then
obj["DesktopIcons"][key][6] = nil
end
end
end
end
------------------------------------------------------------------------------------------------
local systemFiles = {
"bin/",
"lib/",
"OS.lua",
"autorun.lua",
"init.lua",
"tmp/",
"usr/",
"mnt/",
"etc/",
"boot/",
--"System/",
}
local function reorganizeFilesAndFolders(massivSudaPihay, showHiddenFiles, showSystemFiles)
local massiv = {}
for i = 1, #massivSudaPihay do
if ecs.isFileHidden(massivSudaPihay[i]) and showHiddenFiles then
table.insert(massiv, massivSudaPihay[i])
end
end
for i = 1, #massivSudaPihay do
local cyka = massivSudaPihay[i]
if fs.isDirectory(cyka) and not ecs.isFileHidden(cyka) and ecs.getFileFormat(cyka) ~= ".app" then
table.insert(massiv, cyka)
end
cyka = nil
end
for i = 1, #massivSudaPihay do
local cyka = massivSudaPihay[i]
if (not fs.isDirectory(cyka) and not ecs.isFileHidden(cyka)) or (fs.isDirectory(cyka) and not ecs.isFileHidden(cyka) and ecs.getFileFormat(cyka) == ".app") then
table.insert(massiv, cyka)
end
cyka = nil
end
if not showSystemFiles then
if workPath == "" or workPath == "/" then
--ecs.error("Сработало!")
local i = 1
while i <= #massiv do
for j = 1, #systemFiles do
--ecs.error("massiv[i] = " .. massiv[i] .. ", systemFiles[j] = "..systemFiles[j])
if massiv[i] == systemFiles[j] then
--ecs.error("Удалено! massiv[i] = " .. massiv[i] .. ", systemFiles[j] = "..systemFiles[j])
table.remove(massiv, i)
i = i - 1
break
end
end
i = i + 1
end
end
end
return massiv
end
------------------------------------------------------------------------------------------------
--ОТРИСОВКА ИКОНОК НА РАБОЧЕМ СТОЛЕ ПО ТЕКУЩЕЙ ПАПКЕ
local function drawDesktop(x, y)
currentFileList = ecs.getFileList(workPath)
currentFileList = reorganizeFilesAndFolders(currentFileList, showHiddenFiles, showSystemFiles)
--ОЧИСТКА СТОЛА
ecs.square(1, y, xSize, yCountOfIcons * (heightOfIcon + ySpaceBetweenIcons) - ySpaceBetweenIcons, background)
--ОЧИСТКА ОБЪЕКТОВ ИКОНОК
obj["DesktopIcons"] = {}
--ОТРИСОВКА КНОПОЧЕК ПЕРЕМЕЩЕНИЯ
countOfDesktops = math.ceil(#currentFileList / totalCountOfIcons)
local xButtons, yButtons = math.floor(xSize / 2 - ((countOfDesktops + 1) * 3 - 3) / 2), ySize - heightOfDock - 3
ecs.square(1, yButtons, xSize, 1, background)
for i = 1, countOfDesktops do
local color = 0xffffff
if i == 1 then
if #workPathHistory == 0 then color = color - 0x444444 end
ecs.colorTextWithBack(xButtons, yButtons, 0x262626, color, " <")
newObj("DesktopButtons", 0, xButtons, yButtons, xButtons + 1, yButtons)
xButtons = xButtons + 3
end
if i == currentDesktop then
color = ecs.colors.green
else
color = 0xffffff
end
ecs.colorTextWithBack(xButtons, yButtons, 0x000000, color, " ")
newObj("DesktopButtons", i, xButtons, yButtons, xButtons + 1, yButtons)
xButtons = xButtons + 3
end
--ОТРИСОВКА ИКОНОК ПО ФАЙЛ ЛИСТУ
local counter = currentDesktop * totalCountOfIcons - totalCountOfIcons + 1
local xIcons, yIcons = x, y
for i = 1, yCountOfIcons do
for j = 1, xCountOfIcons do
if not currentFileList[counter] then break end
--ОТРИСОВКА КОНКРЕТНОЙ ИКОНКИ
local path = workPath .. currentFileList[counter]
--drawIconSelection(xIcons, yIcons, counter)
drawIcon(xIcons, yIcons, path)
--СОЗДАНИЕ ОБЪЕКТА ИКОНКИ
newObj("DesktopIcons", counter, xIcons, yIcons, xIcons + widthOfIcon - 1, yIcons + heightOfIcon - 1, path, nil)
xIcons = xIcons + widthOfIcon + xSpaceBetweenIcons
counter = counter + 1
end
xIcons = x
yIcons = yIcons + heightOfIcon + ySpaceBetweenIcons
end
end
--ОТРИСОВКА ДОКА
local function drawDock()
--Очистка объектов дока
obj["DockIcons"] = {}
--ПОЛУЧИТЬ СПИСОК ЯРЛЫКОВ НА ДОКЕ
local dockShortcuts = ecs.getFileList(pathOfDockShortcuts)
currentCountOfIconsInDock = #dockShortcuts
--ПОДСЧИТАТЬ РАЗМЕР ДОКА И ПРОЧЕЕ
local widthOfDock = (currentCountOfIconsInDock * (widthOfIcon + xSpaceBetweenIcons) - xSpaceBetweenIcons) + heightOfDock * 2 + 2
local xDock, yDock = math.floor(xSize / 2 - widthOfDock / 2) + 1, ySize - heightOfDock
--Закрасить все фоном
ecs.square(1, yDock - 1, xSize, heightOfDock + 2, background)
--НАРИСОВАТЬ ПОДЛОЖКУ
local color = dockColor
for i = 1, heightOfDock do
ecs.square(xDock + i, ySize - i + 1, widthOfDock - i * 2, 1, color)
color = color - 0x181818
end
--НАРИСОВАТЬ ЯРЛЫКИ НА ДОКЕ
if currentCountOfIconsInDock > 0 then
local xIcons = math.floor(xSize / 2 - ((widthOfIcon + xSpaceBetweenIcons) * currentCountOfIconsInDock - xSpaceBetweenIcons * 4) / 2 )
local yIcons = ySize - heightOfDock - 1
for i = 1, currentCountOfIconsInDock do
drawIcon(xIcons, yIcons, pathOfDockShortcuts..dockShortcuts[i])
newObj("DockIcons", dockShortcuts[i], xIcons - 2, yIcons, xIcons + widthOfIcon - 1, yIcons + heightOfIcon - 1)
xIcons = xIcons + xSpaceBetweenIcons + widthOfIcon
end
end
end
--РИСОВАТЬ ВРЕМЯ СПРАВА
local function drawTime()
local time = " " .. unicode.sub(os.date("%T"), 1, -4) .. " "
local sTime = unicode.len(time)
ecs.colorTextWithBack(xSize - sTime, 1, 0x000000, topBarColor, time)
end
--РИСОВАТЬ ВЕСЬ ТОПБАР
local function drawTopBar()
--Элементы топбара
local topBarElements = { "MineOS", "Вид" }
--Белая горизонтальная линия
ecs.square(1, 1, xSize, 1, topBarColor)
--Рисуем элементы и создаем объекты
local xPos = 2
gpu.setForeground(0x000000)
for i = 1, #topBarElements do
if i > 1 then gpu.setForeground(0x666666) end
local length = unicode.len(topBarElements[i])
gpu.set(xPos + 1, 1, topBarElements[i])
newObj("TopBarButtons", topBarElements[i], xPos, 1, xPos + length + 1, 1)
xPos = xPos + length + 2
end
--Рисуем время
drawTime()
end
--РИСОВАТЬ ВАЩЕ ВСЕ СРАЗУ
local function drawAll()
ecs.clearScreen(background)
drawTopBar()
drawDock()
drawDesktop(xPosOfIcons, yPosOfIcons)
end
--ПЕРЕРИСОВАТЬ ВЫДЕЛЕННЫЕ ИКОНКИ
local function redrawSelectedIcons()
for key, value in pairs(obj["DesktopIcons"]) do
if obj["DesktopIcons"][key][6] ~= nil then
local path = currentFileList[key]
local x = obj["DesktopIcons"][key][1]
local y = obj["DesktopIcons"][key][2]
drawIconSelection(x, y, key)
drawIcon(x, y, obj["DesktopIcons"][key][5])
end
end
end
--ВЫБРАТЬ ИКОНКУ И ВЫДЕЛИТЬ ЕЕ
local function selectIcon(nomer)
if keyboard.isControlDown() and not obj["DesktopIcons"][nomer][6] then
obj["DesktopIcons"][nomer][6] = true
redrawSelectedIcons()
elseif keyboard.isControlDown() and obj["DesktopIcons"][nomer][6] then
obj["DesktopIcons"][nomer][6] = false
redrawSelectedIcons()
elseif not keyboard.isControlDown() then
deselectAll()
obj["DesktopIcons"][nomer][6] = true
redrawSelectedIcons()
deselectAll(true)
end
end
--ЗАПУСТИТЬ ПРОГУ
local function launchIcon(path, arguments)
--Запоминаем, какое разрешение было
local oldWidth, oldHeight = gpu.getResolution()
--Создаем нормальные аргументы для Шелла
if arguments then arguments = " " .. arguments else arguments = "" end
--Получаем файл формат заранее
local fileFormat = ecs.getFileFormat(path)
--Если это приложение
if fileFormat == ".app" then
ecs.prepareToExit()
local cyka = path .. "/" .. ecs.hideFileFormat(fs.name(path)) .. ".lua"
local success, reason = shell.execute(cyka)
ecs.prepareToExit()
if not success then ecs.displayCompileMessage(1, reason, true) end
--Если это обычный луа файл - т.е. скрипт
elseif fileFormat == ".lua" or fileFormat == nil then
ecs.prepareToExit()
local success, reason = shell.execute(path .. arguments)
ecs.prepareToExit()
if success then
print("Программа выполнена успешно! Нажмите любую клавишу, чтобы продолжить.")
else
ecs.displayCompileMessage(1, reason, true)
end
--Если это фоточка
elseif fileFormat == ".png" then
shell.execute("Photoshop.app/Photoshop.lua open "..path)
--Если это текст или конфиг или языковой
elseif fileFormat == ".txt" or fileFormat == ".cfg" or fileFormat == ".lang" then
ecs.prepareToExit()
shell.execute("edit "..path)
--Если это ярлык
elseif fileFormat == ".lnk" then
local shortcutLink = readShortcut(path)
if fs.exists(shortcutLink) then
launchIcon(shortcutLink)
else
ecs.error("Ярлык ссылается на несуществующий файл.")
end
end
--Ставим старое разрешение
gpu.setResolution(oldWidth, oldHeight)
end
--Перейти в какую-то папку
local function changePath(path)
table.insert(workPathHistory, workPath)
workPath = path
currentDesktop = 1
drawDesktop(xPosOfIcons, yPosOfIcons)
end
--Биометрический сканер
local function biometry()
local users
local path = "System/OS/Users.cfg"
if fs.exists(path) then
users = config.readFile(path)
local width = 80
local height = 25
local x, y = math.floor(xSize / 2 - width / 2), math.floor(ySize / 2 - height / 2)
local Finger = image.load("System/OS/Icons/Finger.png")
local OK = image.load("System/OS/Installer/OK.png")
local OC
local function okno(color, textColor, text, images)
ecs.square(x, y, width, height, color)
ecs.windowShadow(x, y, width, height)
image.draw(math.floor(xSize / 2 - 15), y + 2, images)
gpu.setBackground(color)
gpu.setForeground(textColor)
ecs.centerText("x", y + height - 5, text)
end
okno(ecs.windowColors.background, ecs.windowColors.usualText, "Прислоните палец для идентификации", Finger)
local exit
while true do
if exit then break end
local e = {event.pull()}
if e[1] == "touch" then
for _, val in pairs(users) do
if e[6] == val then
okno(ecs.windowColors.background, ecs.windowColors.usualText, "С возвращением, "..e[6], OK)
os.sleep(1.5)
exit = true
break
end
end
if not exit then
okno(0xaa0000, 0xffffff, "Доступ запрещен!", Finger)
os.sleep(1.5)
okno(ecs.windowColors.background, ecs.windowColors.usualText, "Прислоните палец для идентификации", Finger)
end
end
end
Finger = nil
users = nil
end
end
--Запустить конфигуратор ОС, если еще не запускался
local function launchConfigurator(force)
if not fs.exists("System/OS/Users.cfg") or force then
drawAll()
shell.execute("System/OS/Configurator.lua")
return true
end
end
--Аккуратно запускаем биометрию - а то мало ли ctrl alt c
local function safeBiometry()
ecs.prepareToExit()
while true do
local s, r = pcall(biometry)
if not s then ecs.error("Умный что ли?") else break end
end
end
------------------------------------------------------------------------------------------------------------------------
if not launchConfigurator(false) then safeBiometry(); drawAll() end
------------------------------------------------------------------------------------------------------------------------
while true do
local eventData = { event.pull() }
if eventData[1] == "touch" then
--ПРОСЧЕТ КЛИКА НА ИКОНОЧКИ РАБОЧЕГО СТОЛА
for key, value in pairs(obj["DesktopIcons"]) do
if ecs.clickedAtArea(eventData[3], eventData[4], obj["DesktopIcons"][key][1], obj["DesktopIcons"][key][2], obj["DesktopIcons"][key][3], obj["DesktopIcons"][key][4]) then
--ЕСЛИ ЛЕВАЯ КНОПА МЫШИ
if (eventData[5] == 0 and not keyboard.isControlDown()) or (eventData[5] == 1 and keyboard.isControlDown()) then
--ЕСЛИ НЕ ВЫБРАНА, ТО ВЫБРАТЬ СНАЧАЛА
if not obj["DesktopIcons"][key][6] then
selectIcon(key)
--А ЕСЛИ ВЫБРАНА УЖЕ, ТО ЗАПУСТИТЬ ПРОЖКУ ИЛИ ОТКРЫТЬ ПАПКУ
else
if fs.isDirectory(obj["DesktopIcons"][key][5]) and ecs.getFileFormat(obj["DesktopIcons"][key][5]) ~= ".app" then
changePath(obj["DesktopIcons"][key][5])
else
deselectAll(true)
launchIcon(obj["DesktopIcons"][key][5])
drawAll()
end
end
--ЕСЛИ ПРАВАЯ КНОПА МЫШИ
elseif eventData[5] == 1 and not keyboard.isControlDown() then
--selectIcon(key)
obj["DesktopIcons"][key][6] = true
redrawSelectedIcons()
local action
local fileFormat = ecs.getFileFormat(obj["DesktopIcons"][key][5])
local function getSelectedIcons()
local selectedIcons = {}
for key, val in pairs(obj["DesktopIcons"]) do
if obj["DesktopIcons"][key][6] then
table.insert(selectedIcons, { ["id"] = key })
end
end
return selectedIcons
end
--РАЗНЫЕ КОНТЕКСТНЫЕ МЕНЮ
if #getSelectedIcons() > 1 then
action = context.menu(eventData[3], eventData[4], {"Вырезать", false, "^X"}, {"Копировать", false, "^C"}, {"Вставить", not clipboard, "^V"}, "-", {"Добавить в архив", true}, "-", {"Удалить", false, ""})
elseif fileFormat == ".app" and fs.isDirectory(obj["DesktopIcons"][key][5]) then
action = context.menu(eventData[3], eventData[4], {"Показать содержимое"}, "-", {"Вырезать", false, "^X"}, {"Копировать", false, "^C"}, {"Вставить", not clipboard, "^V"}, "-", {"Переименовать"}, {"Создать ярлык"}, "-", {"Добавить в архив", true}, {"Загузить на Pastebin", true}, "-", {"Добавить в Dock", not (currentCountOfIconsInDock < dockCountOfIcons and workPath ~= "System/OS/Dock/")}, {"Удалить", false, ""})
elseif fileFormat ~= ".app" and fs.isDirectory(obj["DesktopIcons"][key][5]) then
action = context.menu(eventData[3], eventData[4], {"Вырезать", false, "^X"}, {"Копировать", false, "^C"}, {"Вставить", not clipboard, "^V"}, "-", {"Переименовать"}, {"Создать ярлык"}, "-", {"Добавить в архив", true}, {"Загузить на Pastebin", true}, "-", {"Добавить в Dock", not (currentCountOfIconsInDock < dockCountOfIcons and workPath ~= "System/OS/Dock/")}, {"Удалить", false, ""})
else
action = context.menu(eventData[3], eventData[4], {"Редактировать"}, "-", {"Вырезать", false, "^X"}, {"Копировать", false, "^C"}, {"Вставить", not clipboard, "^V"}, "-", {"Переименовать"}, {"Создать ярлык"}, "-", {"Добавить в архив", true}, {"Загузить на Pastebin", true}, "-", {"Добавить в Dock", not (currentCountOfIconsInDock < dockCountOfIcons and workPath ~= "System/OS/Dock/")}, {"Удалить", false, ""})
end
--ecs.error(#getSelectedIcons())
deselectAll()
--ecs.error(#getSelectedIcons())
--ecs.error("workPath = "..workPath..", obj = "..obj["DesktopIcons"][key][5])
if action == "Показать содержимое" then
changePath(obj["DesktopIcons"][key][5])
elseif action == "Редактировать" then
ecs.prepareToExit()
shell.execute("edit "..obj["DesktopIcons"][key][5])
drawAll()
elseif action == "Удалить" then
fs.remove(obj["DesktopIcons"][key][5])
drawDesktop(xPosOfIcons, yPosOfIcons)
drawDock()
elseif action == "Копировать" then
clipboard = obj["DesktopIcons"][key][5]
elseif action == "Вставить" then
if fs.exists(clipboard) then
ecs.copy(clipboard, workPath)
drawDesktop(xPosOfIcons, yPosOfIcons)
drawDock()
else
ecs.error("Файл из буфера обмена более не существует.")
end
elseif action == "Переименовать" then
local success = ecs.rename(obj["DesktopIcons"][key][5])
success = true
if success then drawDesktop(xPosOfIcons, yPosOfIcons) end
drawDesktop(xPosOfIcons, yPosOfIcons)
elseif action == "Создать ярлык" then
createShortCut(workPath .. ecs.hideFileFormat(obj["DesktopIcons"][key][5]) .. ".lnk", obj["DesktopIcons"][key][5])
drawDesktop(xPosOfIcons, yPosOfIcons)
elseif action == "Добавить в Dock" then
createShortCut("System/OS/Dock/" .. ecs.hideFileFormat(obj["DesktopIcons"][key][5]) .. ".lnk", obj["DesktopIcons"][key][5])
drawDock()
else
redrawSelectedIcons()
deselectAll(true)
end
end
break
end
end
--ПРОСЧЕТ КЛИКА НА КНОПОЧКИ ПЕРЕКЛЮЧЕНИЯ РАБОЧИХ СТОЛОВ
for key, value in pairs(obj["DesktopButtons"]) do
if ecs.clickedAtArea(eventData[3], eventData[4], obj["DesktopButtons"][key][1], obj["DesktopButtons"][key][2], obj["DesktopButtons"][key][3], obj["DesktopButtons"][key][4]) then
if key == 0 then
if #workPathHistory > 0 then
ecs.colorTextWithBack(obj["DesktopButtons"][key][1], obj["DesktopButtons"][key][2], 0xffffff, ecs.colors.green, " <")
os.sleep(0.2)
workPath = workPathHistory[#workPathHistory]
workPathHistory[#workPathHistory] = nil
currentDesktop = 1
drawDesktop(xPosOfIcons, yPosOfIcons)
end
else
currentDesktop = key
drawDesktop(xPosOfIcons, yPosOfIcons)
end
end
end
--Клик на Доковские иконки
for key, value in pairs(obj["DockIcons"]) do
if ecs.clickedAtArea(eventData[3], eventData[4], obj["DockIcons"][key][1], obj["DockIcons"][key][2], obj["DockIcons"][key][3], obj["DockIcons"][key][4]) then
ecs.square(obj["DockIcons"][key][1], obj["DockIcons"][key][2], widthOfIcon, heightOfIcon, iconsSelectionColor)
drawIcon(obj["DockIcons"][key][1] + 2, obj["DockIcons"][key][2], pathOfDockShortcuts..key)
if eventData[5] == 0 then
os.sleep(0.2)
launchIcon(pathOfDockShortcuts..key)
drawAll()
else
local content = readShortcut(pathOfDockShortcuts..key)
action = context.menu(eventData[3], eventData[4], {"Открыть папку Dock"}, {"Открыть содержащую папку", (fs.path(workPath) == fs.path(content))}, "-", {"Удалить из Dock", not (currentCountOfIconsInDock > 1)})
if action == "Открыть содержащую папку" then
drawDock()
if content then
changePath(fs.path(content))
end
elseif action == "Удалить из Dock" then
fs.remove(pathOfDockShortcuts..key)
drawDock()
elseif action == "Открыть папку Dock" then
drawDock()
changePath(pathOfDockShortcuts)
else
drawDock()
end
break
end
end
end
--Обработка верхних кнопок - ну, вид там, и проч
for key, val in pairs(obj["TopBarButtons"]) do
if ecs.clickedAtArea(eventData[3], eventData[4], obj["TopBarButtons"][key][1], obj["TopBarButtons"][key][2], obj["TopBarButtons"][key][3], obj["TopBarButtons"][key][4]) then
ecs.colorTextWithBack(obj["TopBarButtons"][key][1], obj["TopBarButtons"][key][2], 0xffffff, ecs.colors.blue, " "..key.." ")
if key == "Вид" then
local action = context.menu(obj["TopBarButtons"][key][1], obj["TopBarButtons"][key][2] + 1, {(function() if showHiddenFiles then return "Скрывать скрытые файлы" else return "Показывать скрытые файлы" end end)()}, {(function() if showSystemFiles then return "Скрывать системные файлы" else return "Показывать системные файлы" end end)()}, "-", {(function() if showFileFormat then return "Скрывать формат файлов" else return "Показывать формат файлов" end end)()})
if action == "Скрывать скрытые файлы" then
showHiddenFiles = false
elseif action == "Показывать скрытые файлы" then
showHiddenFiles = true
elseif action == "Показывать системные файлы" then
showSystemFiles = true
elseif action == "Скрывать системные файлы" then
showSystemFiles = false
elseif action == "Показывать формат файлов" then
showFileFormat = true
elseif action == "Скрывать формат файлов" then
showFileFormat = false
end
drawTopBar()
drawDesktop(xPosOfIcons, yPosOfIcons)
elseif key == "MineOS" then
local action = context.menu(obj["TopBarButtons"][key][1], obj["TopBarButtons"][key][2] + 1, {"О системе"}, {"Обновления"}, "-", {"Перезагрузить"}, {"Выключить"}, "-", {"Вернуться в Shell"})
if action == "Вернуться в Shell" then
ecs.prepareToExit()
return 0
elseif action == "Выключить" then
shell.execute("shutdown")
elseif action == "Перезагрузить" then
shell.execute("reboot")
elseif action == "Обновления" then
shell.execute("pastebin run 0nm5b1ju")
ecs.prepareToExit()
return 0
elseif action == "О системе" then
ecs.prepareToExit()
print(copyright)
print(" А теперь жмякай любую кнопку и продолжай работу с ОС.")
ecs.waitForTouchOrClick()
drawAll()
end
end
drawTopBar()
end
end
--ПРОКРУТКА РАБОЧИХ СТОЛОВ
elseif eventData[1] == "scroll" then
if eventData[5] == -1 then
if currentDesktop > 1 then currentDesktop = currentDesktop - 1; drawDesktop(xPosOfIcons, yPosOfIcons) end
else
if currentDesktop < countOfDesktops then currentDesktop = currentDesktop + 1; drawDesktop(xPosOfIcons, yPosOfIcons) end
end
elseif eventData[1] == "key_down" then
end
end