Ewgeniy

Untitled

Aug 30th, 2021 (edited)
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 28.85 KB | None | 0 0
  1. local copyright = [[
  2.    
  3.     Тут можно было бы написать кучу текста, мол,
  4.     вы не имеете прав на использование этой хуйни в
  5.     коммерческих целях и прочую чушь, навеянную нам
  6.     западной культурой. Но я же не пидор какой-то, верно?
  7.      
  8.     Просто помни, сука, что эту ОСь накодил Тимофеев Игорь,
  9.     ссылка на ВК: vk.com/id7799889
  10.  
  11. ]]
  12.  
  13. local component = require("component")
  14. local event = require("event")
  15. local term = require("term")
  16. local unicode = require("unicode")
  17. local ecs = require("ECSAPI")
  18. local fs = require("filesystem")
  19. local shell = require("shell")
  20. local context = require("context")
  21. local computer = require("computer")
  22. local keyboard = require("keyboard")
  23. local image = require("image")
  24. local config = require("config")
  25.  
  26. local gpu = component.gpu
  27.  
  28. ------------------------------------------------------------------------------------------------------------------------
  29.  
  30. local xSize, ySize = gpu.getResolution()
  31.  
  32. local icons = {}
  33. local workPath = ""
  34. local workPathHistory = {}
  35. local clipboard
  36. local currentFileList
  37. local currentDesktop = 1
  38. local countOfDesktops
  39.  
  40. --ЗАГРУЗКА ИКОНОК
  41. icons["folder"] = image.load("System/OS/Icons/Folder.pic")
  42. icons["script"] = image.load("System/OS/Icons/Script.pic")
  43. icons["text"] = image.load("System/OS/Icons/Text.pic")
  44. icons["config"] = image.load("System/OS/Icons/Config.pic")
  45. icons["lua"] = image.load("System/OS/Icons/Lua.pic")
  46. icons["image"] = image.load("System/OS/Icons/Image.pic")
  47.  
  48. --ПЕРЕМЕННЫЕ ДЛЯ ДОКА
  49. local dockColor = 0xcccccc
  50. local heightOfDock = 4
  51. local background = 0x262626
  52. local currentCountOfIconsInDock = 4
  53. local pathOfDockShortcuts = "System/OS/Dock/"
  54.  
  55. --ПЕРЕМЕННЫЕ, КАСАЮЩИЕСЯ ИКОНОК
  56. local widthOfIcon = 12
  57. local heightOfIcon = 6
  58. local xSpaceBetweenIcons = 2
  59. local ySpaceBetweenIcons = 1
  60. local xCountOfIcons = math.floor(xSize / (widthOfIcon + xSpaceBetweenIcons))
  61. local yCountOfIcons = math.floor((ySize - (heightOfDock + 6)) / (heightOfIcon + ySpaceBetweenIcons))
  62. local totalCountOfIcons = xCountOfIcons * yCountOfIcons
  63. local iconsSelectionColor = ecs.colors.lightBlue
  64. --local yPosOfIcons = math.floor((ySize - heightOfDock - 2) / 2 - (yCountOfIcons * (heightOfIcon + ySpaceBetweenIcons) - ySpaceBetweenIcons * 2) / 2)
  65. local yPosOfIcons = 3
  66. local xPosOfIcons = math.floor(xSize / 2 - (xCountOfIcons * (widthOfIcon + xSpaceBetweenIcons) - xSpaceBetweenIcons*4) / 2)
  67.  
  68. local dockCountOfIcons = xCountOfIcons - 1
  69.  
  70. --ПЕРЕМЕННЫЕ ДЛЯ ТОП БАРА
  71. local topBarColor = 0xdddddd
  72. local showHiddenFiles = false
  73. local showSystemFiles = false
  74. local showFileFormat = false
  75.  
  76. ------------------------------------------------------------------------------------------------------------------------
  77.  
  78. --СОЗДАНИЕ ОБЪЕКТОВ
  79. local obj = {}
  80. local function newObj(class, name, ...)
  81.     obj[class] = obj[class] or {}
  82.     obj[class][name] = {...}
  83. end
  84.  
  85. --Создать ярлык для конкретной проги
  86. local function createShortCut(path, pathToProgram)
  87.     fs.remove(path)
  88.     fs.makeDirectory(fs.path(path))
  89.     local file = io.open(path, "w")
  90.     file:write("return ", "\"", pathToProgram, "\"")
  91.     file:close()
  92. end
  93.  
  94. --ПОЛУЧИТЬ ДАННЫЕ О ФАЙЛЕ ИЗ ЯРЛЫКА
  95. local function readShortcut(path)
  96.     local success, filename = pcall(loadfile(path))
  97.     if success then
  98.         return filename
  99.     else
  100.         error("Ошибка чтения файла ярлыка. Вероятно, он создан криво, либо не существует в папке " .. path)
  101.     end
  102. end
  103.  
  104. --ОТРИСОВКА ТЕКСТА ПОД ИКОНКОЙ
  105. local function drawIconText(xIcons, yIcons, path)
  106.  
  107.     local text = fs.name(path)
  108.  
  109.     if not showFileFormat then
  110.         local fileFormat = ecs.getFileFormat(text)
  111.         if fileFormat then
  112.             text = unicode.sub(text, 1, -(unicode.len(fileFormat) + 1))
  113.         end
  114.     end
  115.  
  116.     text = ecs.stringLimit("end", text, widthOfIcon)
  117.     local textPos = xIcons + math.floor(widthOfIcon / 2 - unicode.len(text) / 2) - 2
  118.  
  119.     ecs.adaptiveText(textPos, yIcons + heightOfIcon - 1, text, 0xffffff)
  120. end
  121.  
  122. --ОТРИСОВКА КОНКРЕТНОЙ ОДНОЙ ИКОНКИ
  123. local function drawIcon(xIcons, yIcons, path)
  124.     --НАЗНАЧЕНИЕ ВЕРНОЙ ИКОНКИ
  125.     local icon
  126.  
  127.     local fileFormat = ecs.getFileFormat(path)
  128.  
  129.     if fs.isDirectory(path) then
  130.         if fileFormat == ".app" then
  131.             icon = path .. "/Resources/Icon.png"
  132.             icons[icon] = image.load(icon)
  133.         else
  134.             icon = "folder"
  135.         end
  136.     else
  137.         if fileFormat == ".lnk" then
  138.             local shortcutLink = readShortcut(path)
  139.             drawIcon(xIcons, yIcons, shortcutLink)
  140.             ecs.colorTextWithBack(xIcons + widthOfIcon - 6, yIcons + heightOfIcon - 3, 0x000000, 0xffffff, "⤶")
  141.             drawIconText(xIcons, yIcons, path)
  142.             return 0
  143.         elseif fileFormat == ".cfg" or fileFormat == ".config" then
  144.             icon = "config"
  145.         elseif fileFormat == ".txt" or fileFormat == ".rtf" then
  146.             icon = "text"
  147.         elseif fileFormat == ".lua" then
  148.             icon = "lua"
  149.         elseif fileFormat == ".png" then
  150.             icon = "image"
  151.         else
  152.             icon = "script"
  153.         end
  154.     end
  155.  
  156.     --ОТРИСОВКА ИКОНКИ
  157.     image.draw(xIcons, yIcons, icons[icon] or icons["script"])
  158.  
  159.     --ОТРИСОВКА ТЕКСТА
  160.     drawIconText(xIcons, yIcons, path)
  161.  
  162. end
  163.  
  164. --НАРИСОВАТЬ ВЫДЕЛЕНИЕ ИКОНКИ
  165. local function drawIconSelection(x, y, nomer)
  166.     if obj["DesktopIcons"][nomer][6] == true then
  167.         ecs.square(x - 2, y, widthOfIcon, heightOfIcon, iconsSelectionColor)
  168.     elseif obj["DesktopIcons"][nomer][6] == false then
  169.         ecs.square(x - 2, y, widthOfIcon, heightOfIcon, background)
  170.     end
  171. end
  172.  
  173. local function deselectAll(mode)
  174.     for key, val in pairs(obj["DesktopIcons"]) do
  175.         if not mode then
  176.             if obj["DesktopIcons"][key][6] == true then
  177.                 obj["DesktopIcons"][key][6] = false
  178.             end
  179.         else
  180.             if obj["DesktopIcons"][key][6] == false then
  181.                 obj["DesktopIcons"][key][6] = nil
  182.             end
  183.         end
  184.     end
  185. end
  186.  
  187. ------------------------------------------------------------------------------------------------
  188.  
  189. local systemFiles = {
  190.     "bin/",
  191.     "lib/",
  192.     "OS.lua",
  193.     "autorun.lua",
  194.     "init.lua",
  195.     "tmp/",
  196.     "usr/",
  197.     "mnt/",
  198.     "etc/",
  199.     "boot/",
  200.     --"System/",
  201. }
  202.  
  203. local function reorganizeFilesAndFolders(massivSudaPihay, showHiddenFiles, showSystemFiles)
  204.  
  205.     local massiv = {}
  206.  
  207.     for i = 1, #massivSudaPihay do
  208.         if ecs.isFileHidden(massivSudaPihay[i]) and showHiddenFiles then
  209.             table.insert(massiv, massivSudaPihay[i])
  210.         end
  211.     end
  212.  
  213.     for i = 1, #massivSudaPihay do
  214.         local cyka = massivSudaPihay[i]
  215.         if fs.isDirectory(cyka) and not ecs.isFileHidden(cyka) and ecs.getFileFormat(cyka) ~= ".app" then
  216.             table.insert(massiv, cyka)
  217.         end
  218.         cyka = nil
  219.     end
  220.  
  221.     for i = 1, #massivSudaPihay do
  222.         local cyka = massivSudaPihay[i]
  223.         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
  224.             table.insert(massiv, cyka)
  225.         end
  226.         cyka = nil
  227.     end
  228.  
  229.  
  230.     if not showSystemFiles then
  231.         if workPath == "" or workPath == "/" then
  232.             --ecs.error("Сработало!")
  233.             local i = 1
  234.             while i <= #massiv do
  235.                 for j = 1, #systemFiles do
  236.                     --ecs.error("massiv[i] = " .. massiv[i] .. ", systemFiles[j] = "..systemFiles[j])
  237.                     if massiv[i] == systemFiles[j] then
  238.                         --ecs.error("Удалено! massiv[i] = " .. massiv[i] .. ", systemFiles[j] = "..systemFiles[j])
  239.                         table.remove(massiv, i)
  240.                         i = i - 1
  241.                         break
  242.                     end
  243.  
  244.                 end
  245.  
  246.                 i = i + 1
  247.             end
  248.         end
  249.     end
  250.  
  251.     return massiv
  252. end
  253.  
  254. ------------------------------------------------------------------------------------------------
  255.  
  256. --ОТРИСОВКА ИКОНОК НА РАБОЧЕМ СТОЛЕ ПО ТЕКУЩЕЙ ПАПКЕ
  257. local function drawDesktop(x, y)
  258.  
  259.     currentFileList = ecs.getFileList(workPath)
  260.     currentFileList = reorganizeFilesAndFolders(currentFileList, showHiddenFiles, showSystemFiles)
  261.  
  262.     --ОЧИСТКА СТОЛА
  263.     ecs.square(1, y, xSize, yCountOfIcons * (heightOfIcon + ySpaceBetweenIcons) - ySpaceBetweenIcons, background)
  264.  
  265.     --ОЧИСТКА ОБЪЕКТОВ ИКОНОК
  266.     obj["DesktopIcons"] = {}
  267.  
  268.     --ОТРИСОВКА КНОПОЧЕК ПЕРЕМЕЩЕНИЯ
  269.     countOfDesktops = math.ceil(#currentFileList / totalCountOfIcons)
  270.     local xButtons, yButtons = math.floor(xSize / 2 - ((countOfDesktops + 1) * 3 - 3) / 2), ySize - heightOfDock - 3
  271.     ecs.square(1, yButtons, xSize, 1, background)
  272.     for i = 1, countOfDesktops do
  273.         local color = 0xffffff
  274.         if i == 1 then
  275.             if #workPathHistory == 0 then color = color - 0x444444 end
  276.             ecs.colorTextWithBack(xButtons, yButtons, 0x262626, color, " <")
  277.             newObj("DesktopButtons", 0, xButtons, yButtons, xButtons + 1, yButtons)
  278.             xButtons = xButtons + 3
  279.         end
  280.  
  281.         if i == currentDesktop then
  282.             color = ecs.colors.green
  283.         else
  284.             color = 0xffffff
  285.         end
  286.  
  287.         ecs.colorTextWithBack(xButtons, yButtons, 0x000000, color, "  ")
  288.         newObj("DesktopButtons", i, xButtons, yButtons, xButtons + 1, yButtons)
  289.  
  290.         xButtons = xButtons + 3
  291.     end
  292.  
  293.     --ОТРИСОВКА ИКОНОК ПО ФАЙЛ ЛИСТУ
  294.     local counter = currentDesktop * totalCountOfIcons - totalCountOfIcons + 1
  295.     local xIcons, yIcons = x, y
  296.     for i = 1, yCountOfIcons do
  297.         for j = 1, xCountOfIcons do
  298.             if not currentFileList[counter] then break end
  299.  
  300.             --ОТРИСОВКА КОНКРЕТНОЙ ИКОНКИ
  301.             local path = workPath .. currentFileList[counter]
  302.             --drawIconSelection(xIcons, yIcons, counter)
  303.             drawIcon(xIcons, yIcons, path)
  304.  
  305.             --СОЗДАНИЕ ОБЪЕКТА ИКОНКИ
  306.             newObj("DesktopIcons", counter, xIcons, yIcons, xIcons + widthOfIcon - 1, yIcons + heightOfIcon - 1, path, nil)
  307.  
  308.             xIcons = xIcons + widthOfIcon + xSpaceBetweenIcons
  309.             counter = counter + 1
  310.         end
  311.  
  312.         xIcons = x
  313.         yIcons = yIcons + heightOfIcon + ySpaceBetweenIcons
  314.     end
  315. end
  316.  
  317. --ОТРИСОВКА ДОКА
  318. local function drawDock()
  319.  
  320.     --Очистка объектов дока
  321.     obj["DockIcons"] = {}
  322.  
  323.     --ПОЛУЧИТЬ СПИСОК ЯРЛЫКОВ НА ДОКЕ
  324.     local dockShortcuts = ecs.getFileList(pathOfDockShortcuts)
  325.     currentCountOfIconsInDock = #dockShortcuts
  326.  
  327.     --ПОДСЧИТАТЬ РАЗМЕР ДОКА И ПРОЧЕЕ
  328.     local widthOfDock = (currentCountOfIconsInDock * (widthOfIcon + xSpaceBetweenIcons) - xSpaceBetweenIcons) + heightOfDock * 2 + 2
  329.     local xDock, yDock = math.floor(xSize / 2 - widthOfDock / 2) + 1, ySize - heightOfDock
  330.  
  331.     --Закрасить все фоном
  332.     ecs.square(1, yDock - 1, xSize, heightOfDock + 2, background)
  333.  
  334.     --НАРИСОВАТЬ ПОДЛОЖКУ
  335.     local color = dockColor
  336.     for i = 1, heightOfDock do
  337.         ecs.square(xDock + i, ySize - i + 1, widthOfDock - i * 2, 1, color)
  338.         color = color - 0x181818
  339.     end
  340.  
  341.     --НАРИСОВАТЬ ЯРЛЫКИ НА ДОКЕ
  342.     if currentCountOfIconsInDock > 0 then
  343.         local xIcons = math.floor(xSize / 2 - ((widthOfIcon + xSpaceBetweenIcons) * currentCountOfIconsInDock - xSpaceBetweenIcons * 4) / 2 )
  344.         local yIcons = ySize - heightOfDock - 1
  345.  
  346.         for i = 1, currentCountOfIconsInDock do
  347.             drawIcon(xIcons, yIcons, pathOfDockShortcuts..dockShortcuts[i])
  348.             newObj("DockIcons", dockShortcuts[i], xIcons - 2, yIcons, xIcons + widthOfIcon - 1, yIcons + heightOfIcon - 1)
  349.             xIcons = xIcons + xSpaceBetweenIcons + widthOfIcon
  350.         end
  351.     end
  352. end
  353.  
  354. --РИСОВАТЬ ВРЕМЯ СПРАВА
  355. local function drawTime()
  356.     local time = " " .. unicode.sub(os.date("%T"), 1, -4) .. " "
  357.     local sTime = unicode.len(time)
  358.     ecs.colorTextWithBack(xSize - sTime, 1, 0x000000, topBarColor, time)
  359. end
  360.  
  361. --РИСОВАТЬ ВЕСЬ ТОПБАР
  362. local function drawTopBar()
  363.  
  364.     --Элементы топбара
  365.     local topBarElements = { "MineOS", "Вид" }
  366.  
  367.     --Белая горизонтальная линия
  368.     ecs.square(1, 1, xSize, 1, topBarColor)
  369.  
  370.     --Рисуем элементы и создаем объекты
  371.     local xPos = 2
  372.     gpu.setForeground(0x000000)
  373.     for i = 1, #topBarElements do
  374.  
  375.         if i > 1 then gpu.setForeground(0x666666) end
  376.  
  377.         local length = unicode.len(topBarElements[i])
  378.         gpu.set(xPos + 1, 1, topBarElements[i])
  379.  
  380.         newObj("TopBarButtons", topBarElements[i], xPos, 1, xPos + length + 1, 1)
  381.  
  382.         xPos = xPos + length + 2
  383.     end
  384.  
  385.     --Рисуем время
  386.     drawTime()
  387. end
  388.  
  389. --РИСОВАТЬ ВАЩЕ ВСЕ СРАЗУ
  390. local function drawAll()
  391.     ecs.clearScreen(background)
  392.     drawTopBar()
  393.     drawDock()
  394.     drawDesktop(xPosOfIcons, yPosOfIcons)
  395. end
  396.  
  397. --ПЕРЕРИСОВАТЬ ВЫДЕЛЕННЫЕ ИКОНКИ
  398. local function redrawSelectedIcons()
  399.  
  400.     for key, value in pairs(obj["DesktopIcons"]) do
  401.  
  402.         if obj["DesktopIcons"][key][6] ~= nil then
  403.  
  404.             local path = currentFileList[key]
  405.             local x = obj["DesktopIcons"][key][1]
  406.             local y = obj["DesktopIcons"][key][2]
  407.  
  408.             drawIconSelection(x, y, key)
  409.             drawIcon(x, y, obj["DesktopIcons"][key][5])
  410.  
  411.         end
  412.     end
  413. end
  414.  
  415. --ВЫБРАТЬ ИКОНКУ И ВЫДЕЛИТЬ ЕЕ
  416. local function selectIcon(nomer)
  417.     if keyboard.isControlDown() and not obj["DesktopIcons"][nomer][6] then
  418.         obj["DesktopIcons"][nomer][6] = true
  419.         redrawSelectedIcons()
  420.     elseif keyboard.isControlDown() and obj["DesktopIcons"][nomer][6] then
  421.         obj["DesktopIcons"][nomer][6] = false
  422.         redrawSelectedIcons()
  423.     elseif not keyboard.isControlDown() then
  424.         deselectAll()
  425.         obj["DesktopIcons"][nomer][6] = true
  426.         redrawSelectedIcons()
  427.         deselectAll(true)
  428.     end
  429. end
  430.  
  431. --ЗАПУСТИТЬ ПРОГУ
  432. local function launchIcon(path, arguments)
  433.  
  434.     --Запоминаем, какое разрешение было
  435.     local oldWidth, oldHeight = gpu.getResolution()
  436.  
  437.     --Создаем нормальные аргументы для Шелла
  438.     if arguments then arguments = " " .. arguments else arguments = "" end
  439.  
  440.     --Получаем файл формат заранее
  441.     local fileFormat = ecs.getFileFormat(path)
  442.  
  443.     --Если это приложение
  444.     if fileFormat == ".app" then
  445.         ecs.prepareToExit()
  446.         local cyka = path .. "/" .. ecs.hideFileFormat(fs.name(path)) .. ".lua"
  447.         local success, reason = shell.execute(cyka)
  448.         ecs.prepareToExit()
  449.         if not success then ecs.displayCompileMessage(1, reason, true) end
  450.        
  451.     --Если это обычный луа файл - т.е. скрипт
  452.     elseif fileFormat == ".lua" or fileFormat == nil then
  453.         ecs.prepareToExit()
  454.         local success, reason = shell.execute(path .. arguments)
  455.         ecs.prepareToExit()
  456.         if success then
  457.             print("Программа выполнена успешно! Нажмите любую клавишу, чтобы продолжить.")
  458.         else
  459.             ecs.displayCompileMessage(1, reason, true)
  460.         end
  461.  
  462.     --Если это фоточка
  463.     elseif fileFormat == ".png" then
  464.         shell.execute("Photoshop.app/Photoshop.lua open "..path)
  465.    
  466.     --Если это текст или конфиг или языковой
  467.     elseif fileFormat == ".txt" or fileFormat == ".cfg" or fileFormat == ".lang" then
  468.         ecs.prepareToExit()
  469.         shell.execute("edit "..path)
  470.  
  471.     --Если это ярлык
  472.     elseif fileFormat == ".lnk" then
  473.         local shortcutLink = readShortcut(path)
  474.         if fs.exists(shortcutLink) then
  475.             launchIcon(shortcutLink)
  476.         else
  477.             ecs.error("Ярлык ссылается на несуществующий файл.")
  478.         end
  479.     end
  480.  
  481.     --Ставим старое разрешение
  482.     gpu.setResolution(oldWidth, oldHeight)
  483. end
  484.  
  485. --Перейти в какую-то папку
  486. local function changePath(path)
  487.     table.insert(workPathHistory, workPath)
  488.     workPath = path
  489.     currentDesktop = 1
  490.     drawDesktop(xPosOfIcons, yPosOfIcons)
  491. end
  492.  
  493. --Биометрический сканер
  494. local function biometry()
  495.     local users
  496.     local path = "System/OS/Users.cfg"
  497.  
  498.     if fs.exists(path) then
  499.         users = config.readFile(path)
  500.  
  501.         local width = 80
  502.         local height = 25
  503.  
  504.         local x, y = math.floor(xSize / 2 - width / 2), math.floor(ySize / 2 - height / 2)
  505.  
  506.         local Finger = image.load("System/OS/Icons/Finger.png")
  507.         local OK = image.load("System/OS/Installer/OK.png")
  508.         local OC
  509.  
  510.         local function okno(color, textColor, text, images)
  511.             ecs.square(x, y, width, height, color)
  512.             ecs.windowShadow(x, y, width, height)
  513.  
  514.             image.draw(math.floor(xSize / 2 - 15), y + 2, images)
  515.  
  516.             gpu.setBackground(color)
  517.             gpu.setForeground(textColor)
  518.             ecs.centerText("x", y + height - 5, text)
  519.         end
  520.  
  521.         okno(ecs.windowColors.background, ecs.windowColors.usualText, "Прислоните палец для идентификации", Finger)
  522.  
  523.         local exit
  524.         while true do
  525.             if exit then break end
  526.  
  527.             local e = {event.pull()}
  528.             if e[1] == "touch" then
  529.                 for _, val in pairs(users) do
  530.                     if e[6] == val then
  531.                         okno(ecs.windowColors.background, ecs.windowColors.usualText, "С возвращением, "..e[6], OK)
  532.                         os.sleep(1.5)
  533.                         exit = true
  534.                         break
  535.                     end
  536.                 end
  537.  
  538.                 if not exit then
  539.                     okno(0xaa0000, 0xffffff, "Доступ запрещен!", Finger)
  540.                     os.sleep(1.5)
  541.                     okno(ecs.windowColors.background, ecs.windowColors.usualText, "Прислоните палец для идентификации", Finger)
  542.                 end
  543.             end
  544.         end
  545.  
  546.         Finger = nil
  547.         users = nil
  548.     end
  549. end
  550.  
  551. --Запустить конфигуратор ОС, если еще не запускался
  552. local function launchConfigurator(force)
  553.     if not fs.exists("System/OS/Users.cfg") or force then
  554.         --drawAll()
  555.         ecs.prepareToExit()
  556.         shell.execute("System/OS/Configurator.lua")
  557.         drawAll()
  558.         --ecs.prepareToExit()
  559.         return true
  560.     end
  561. end
  562.  
  563. --Аккуратно запускаем биометрию - а то мало ли ctrl alt c
  564. local function safeBiometry()
  565.     ecs.prepareToExit()
  566.     while true do
  567.         local s, r = pcall(biometry)
  568.         if not s then ecs.error("Умный что ли?") else break end
  569.     end
  570. end
  571.  
  572.  
  573. ------------------------------------------------------------------------------------------------------------------------
  574.  
  575. if not launchConfigurator(false) then safeBiometry(); drawAll() end
  576.  
  577. ------------------------------------------------------------------------------------------------------------------------
  578.  
  579. while true do
  580.     local eventData = { event.pull() }
  581.     if eventData[1] == "touch" then
  582.  
  583.         --ПРОСЧЕТ КЛИКА НА ИКОНОЧКИ РАБОЧЕГО СТОЛА
  584.         for key, value in pairs(obj["DesktopIcons"]) do
  585.             if ecs.clickedAtArea(eventData[3], eventData[4], obj["DesktopIcons"][key][1], obj["DesktopIcons"][key][2], obj["DesktopIcons"][key][3], obj["DesktopIcons"][key][4]) then
  586.                
  587.                 --ЕСЛИ ЛЕВАЯ КНОПА МЫШИ
  588.                 if (eventData[5] == 0 and not keyboard.isControlDown()) or (eventData[5] == 1 and keyboard.isControlDown()) then
  589.                    
  590.                     --ЕСЛИ НЕ ВЫБРАНА, ТО ВЫБРАТЬ СНАЧАЛА
  591.                     if not obj["DesktopIcons"][key][6] then
  592.                         selectIcon(key)
  593.                    
  594.                     --А ЕСЛИ ВЫБРАНА УЖЕ, ТО ЗАПУСТИТЬ ПРОЖКУ ИЛИ ОТКРЫТЬ ПАПКУ
  595.                     else
  596.                         if fs.isDirectory(obj["DesktopIcons"][key][5]) and ecs.getFileFormat(obj["DesktopIcons"][key][5]) ~= ".app" then
  597.                             changePath(obj["DesktopIcons"][key][5])
  598.                         else
  599.                             deselectAll(true)
  600.                             launchIcon(obj["DesktopIcons"][key][5])
  601.                             drawAll()
  602.                         end
  603.                     end
  604.  
  605.                 --ЕСЛИ ПРАВАЯ КНОПА МЫШИ
  606.                 elseif eventData[5] == 1 and not keyboard.isControlDown() then
  607.                     --selectIcon(key)
  608.                     obj["DesktopIcons"][key][6] = true
  609.                     redrawSelectedIcons()
  610.  
  611.                     local action
  612.                     local fileFormat = ecs.getFileFormat(obj["DesktopIcons"][key][5])
  613.  
  614.                     local function getSelectedIcons()
  615.                         local selectedIcons = {}
  616.                         for key, val in pairs(obj["DesktopIcons"]) do
  617.                             if obj["DesktopIcons"][key][6] then
  618.                                 table.insert(selectedIcons, { ["id"] = key })
  619.                             end
  620.                         end
  621.                         return selectedIcons
  622.                     end
  623.  
  624.  
  625.                     --РАЗНЫЕ КОНТЕКСТНЫЕ МЕНЮ
  626.                     if #getSelectedIcons() > 1 then
  627.                         action = context.menu(eventData[3], eventData[4], {"Вырезать", false, "^X"}, {"Копировать", false, "^C"}, {"Вставить", not clipboard, "^V"}, "-", {"Добавить в архив", true}, "-", {"Удалить", false, "⌫"})
  628.                     elseif fileFormat == ".app" and fs.isDirectory(obj["DesktopIcons"][key][5]) then
  629.                         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, "⌫"})
  630.                     elseif fileFormat ~= ".app" and fs.isDirectory(obj["DesktopIcons"][key][5]) then
  631.                         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, "⌫"})
  632.                     else
  633.                         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, "⌫"})
  634.                     end
  635.  
  636.                     --ecs.error(#getSelectedIcons())
  637.                     deselectAll()
  638.                     --ecs.error(#getSelectedIcons())
  639.  
  640.                     --ecs.error("workPath = "..workPath..", obj = "..obj["DesktopIcons"][key][5])
  641.  
  642.                     if action == "Показать содержимое" then
  643.                         changePath(obj["DesktopIcons"][key][5])
  644.                     elseif action == "Редактировать" then
  645.                         ecs.prepareToExit()
  646.                         shell.execute("edit "..obj["DesktopIcons"][key][5])
  647.                         drawAll()
  648.                     elseif action == "Удалить" then
  649.                         fs.remove(obj["DesktopIcons"][key][5])
  650.                         drawDesktop(xPosOfIcons, yPosOfIcons)
  651.                         drawDock()
  652.                     elseif action == "Копировать" then
  653.                         clipboard = obj["DesktopIcons"][key][5]
  654.                     elseif action == "Вставить" then
  655.                         if fs.exists(clipboard) then
  656.                             ecs.copy(clipboard, workPath)
  657.                             drawDesktop(xPosOfIcons, yPosOfIcons)
  658.                             drawDock()
  659.                         else
  660.                             ecs.error("Файл из буфера обмена более не существует.")
  661.                         end
  662.                     elseif action == "Переименовать" then
  663.                         local success = ecs.rename(obj["DesktopIcons"][key][5])
  664.                         success = true
  665.                         if success then drawDesktop(xPosOfIcons, yPosOfIcons) end
  666.                         drawDesktop(xPosOfIcons, yPosOfIcons)
  667.                     elseif action == "Создать ярлык" then
  668.                         createShortCut(workPath .. ecs.hideFileFormat(obj["DesktopIcons"][key][5]) .. ".lnk", obj["DesktopIcons"][key][5])
  669.                         drawDesktop(xPosOfIcons, yPosOfIcons)
  670.                     elseif action == "Добавить в Dock" then
  671.                         createShortCut("System/OS/Dock/" .. ecs.hideFileFormat(obj["DesktopIcons"][key][5]) .. ".lnk", obj["DesktopIcons"][key][5])
  672.                         drawDock()
  673.                     else
  674.                         redrawSelectedIcons()
  675.                         deselectAll(true)
  676.                     end
  677.                    
  678.                 end
  679.                
  680.                 break
  681.             end
  682.         end
  683.  
  684.         --ПРОСЧЕТ КЛИКА НА КНОПОЧКИ ПЕРЕКЛЮЧЕНИЯ РАБОЧИХ СТОЛОВ
  685.         for key, value in pairs(obj["DesktopButtons"]) do
  686.             if ecs.clickedAtArea(eventData[3], eventData[4], obj["DesktopButtons"][key][1], obj["DesktopButtons"][key][2], obj["DesktopButtons"][key][3], obj["DesktopButtons"][key][4]) then
  687.                 if key == 0 then
  688.                     if #workPathHistory > 0 then
  689.                         ecs.colorTextWithBack(obj["DesktopButtons"][key][1], obj["DesktopButtons"][key][2], 0xffffff, ecs.colors.green, " <")
  690.                         os.sleep(0.2)
  691.                         workPath = workPathHistory[#workPathHistory]
  692.                         workPathHistory[#workPathHistory] = nil
  693.                         currentDesktop = 1
  694.  
  695.                         drawDesktop(xPosOfIcons, yPosOfIcons)
  696.                     end
  697.                 else
  698.                     currentDesktop = key
  699.                     drawDesktop(xPosOfIcons, yPosOfIcons)
  700.                 end
  701.             end
  702.         end
  703.  
  704.         --Клик на Доковские иконки
  705.         for key, value in pairs(obj["DockIcons"]) do
  706.             if ecs.clickedAtArea(eventData[3], eventData[4], obj["DockIcons"][key][1], obj["DockIcons"][key][2], obj["DockIcons"][key][3], obj["DockIcons"][key][4]) then
  707.                 ecs.square(obj["DockIcons"][key][1], obj["DockIcons"][key][2], widthOfIcon, heightOfIcon, iconsSelectionColor)
  708.                 drawIcon(obj["DockIcons"][key][1] + 2, obj["DockIcons"][key][2], pathOfDockShortcuts..key)
  709.                
  710.                 if eventData[5] == 0 then
  711.                     os.sleep(0.2)
  712.                     launchIcon(pathOfDockShortcuts..key)
  713.                     drawAll()
  714.                 else
  715.                     local content = readShortcut(pathOfDockShortcuts..key)
  716.                    
  717.                     action = context.menu(eventData[3], eventData[4], {"Открыть папку Dock"}, {"Открыть содержащую папку", (fs.path(workPath) == fs.path(content))}, "-", {"Удалить из Dock", not (currentCountOfIconsInDock > 1)})
  718.  
  719.                     if action == "Открыть содержащую папку" then
  720.                         drawDock() 
  721.                         if content then
  722.                             changePath(fs.path(content))
  723.                         end
  724.                     elseif action == "Удалить из Dock" then
  725.                         fs.remove(pathOfDockShortcuts..key)
  726.                         drawDock()
  727.                     elseif action == "Открыть папку Dock" then
  728.                         drawDock()
  729.                         changePath(pathOfDockShortcuts)
  730.                     else
  731.                         drawDock()
  732.                     end
  733.  
  734.                     break
  735.  
  736.                 end
  737.             end
  738.         end
  739.  
  740.         --Обработка верхних кнопок - ну, вид там, и проч
  741.         for key, val in pairs(obj["TopBarButtons"]) do
  742.             if ecs.clickedAtArea(eventData[3], eventData[4], obj["TopBarButtons"][key][1], obj["TopBarButtons"][key][2], obj["TopBarButtons"][key][3], obj["TopBarButtons"][key][4]) then
  743.                 ecs.colorTextWithBack(obj["TopBarButtons"][key][1], obj["TopBarButtons"][key][2], 0xffffff, ecs.colors.blue, " "..key.." ")
  744.  
  745.                 if key == "Вид" then
  746.  
  747.                     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)()})
  748.                    
  749.                     if action == "Скрывать скрытые файлы" then
  750.                         showHiddenFiles = false
  751.                     elseif action == "Показывать скрытые файлы" then
  752.                         showHiddenFiles = true
  753.                     elseif action == "Показывать системные файлы" then
  754.                         showSystemFiles = true
  755.                     elseif action == "Скрывать системные файлы" then
  756.                         showSystemFiles = false
  757.                     elseif action == "Показывать формат файлов" then
  758.                         showFileFormat = true
  759.                     elseif action == "Скрывать формат файлов" then
  760.                         showFileFormat = false
  761.                     end
  762.  
  763.                     drawTopBar()
  764.                     drawDesktop(xPosOfIcons, yPosOfIcons)
  765.  
  766.                 elseif key == "MineOS" then
  767.                     local action = context.menu(obj["TopBarButtons"][key][1], obj["TopBarButtons"][key][2] + 1, {"О системе"}, {"Обновления"}, "-", {"Перезагрузить"}, {"Выключить"}, "-", {"Вернуться в Shell"})
  768.                
  769.                     if action == "Вернуться в Shell" then
  770.                         ecs.prepareToExit()
  771.                         return 0
  772.                     elseif action == "Выключить" then
  773.                         shell.execute("shutdown")
  774.                     elseif action == "Перезагрузить" then
  775.                         shell.execute("reboot")
  776.                     elseif action == "Обновления" then
  777.                         shell.execute("pastebin run 0nm5b1ju")
  778.                         ecs.prepareToExit()
  779.                         return 0
  780.                     elseif action == "О системе" then
  781.                         ecs.prepareToExit()
  782.                         print(copyright)
  783.                         print(" А теперь жмякай любую кнопку и продолжай работу с ОС.")
  784.                         ecs.waitForTouchOrClick()
  785.                         drawAll()
  786.                     end
  787.                 end
  788.  
  789.                 drawTopBar()
  790.  
  791.             end
  792.         end
  793.  
  794.     --ПРОКРУТКА РАБОЧИХ СТОЛОВ
  795.     elseif eventData[1] == "scroll" then
  796.         if eventData[5] == -1 then
  797.             if currentDesktop > 1 then currentDesktop = currentDesktop - 1; drawDesktop(xPosOfIcons, yPosOfIcons) end
  798.         else
  799.             if currentDesktop < countOfDesktops then currentDesktop = currentDesktop + 1; drawDesktop(xPosOfIcons, yPosOfIcons) end
  800.         end
  801.  
  802.     elseif eventData[1] == "key_down" then
  803.  
  804.     end
  805. end
Add Comment
Please, Sign In to add comment