Advertisement
Ewgeniy

pnginstaller

Oct 28th, 2024 (edited)
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.88 KB | None | 0 0
  1. ------------------------------------------- Библиотеки -------------------------------------------
  2.  
  3. local shell = require("shell")
  4. local component = require("component")
  5. local unicode = require("unicode")
  6. local gpu = component.gpu
  7.  
  8. ------------------------------------------- Переменные -------------------------------------------
  9.  
  10. --Массив с программами, которые необходимо загрузить. Первый элемент - ссылка на файл, второй - путь для сохранения файла.
  11. local applications = {
  12. { "https://raw.githubusercontent.com/ChenThread/octagon/refs/heads/master/crc32.lua", "/home/crc32.lua" },
  13. { "https://raw.githubusercontent.com/ChenThread/octagon/refs/heads/master/inflate.lua", "/home/inflate.lua" },
  14. { "https://raw.githubusercontent.com/ChenThread/octagon/refs/heads/master/oczip.lua", "/home/oczip.lua" },
  15. { "https://raw.githubusercontent.com/ChenThread/octagon/refs/heads/master/png.lua", "/home/png.lua" },
  16. { "https://raw.githubusercontent.com/ChenThread/octagon/refs/heads/master/pngview.lua", "/home/pngview.lua" },
  17.  
  18. }
  19.  
  20. --Получаем размеры монитора
  21. local xSize, ySize = gpu.getResolution()
  22.  
  23. ------------------------------------------- Функции -------------------------------------------
  24.  
  25. --Отрисовка квадрата указанного цвета
  26. local function square(x, y, width, height, background)
  27.     gpu.setBackground(background)
  28.     gpu.fill(x, y, width, height, " ")
  29. end
  30.  
  31. --Запомнить область пикселей и возвратить ее в виде массива
  32. local function rememberOldPixels(x, y, x2, y2)
  33.     local newPNGMassiv = { ["backgrounds"] = {} }
  34.     newPNGMassiv.x, newPNGMassiv.y = x, y
  35.     --Перебираем весь массив стандартного PNG-вида по высоте
  36.     local xCounter, yCounter = 1, 1
  37.     for j = y, y2 do
  38.         xCounter = 1
  39.         for i = x, x2 do
  40.             if (i > xSize or i < 0) or (j > ySize or j < 0) then
  41.                 error("Can't remember pixel, because it's located behind the screen: x("..i.."), y("..j..") out of xSize("..xSize.."), ySize("..ySize..")\n")
  42.             end
  43.             local symbol, fore, back = gpu.get(i, j)
  44.             newPNGMassiv["backgrounds"][back] = newPNGMassiv["backgrounds"][back] or {}
  45.             newPNGMassiv["backgrounds"][back][fore] = newPNGMassiv["backgrounds"][back][fore] or {}
  46.             table.insert(newPNGMassiv["backgrounds"][back][fore], {xCounter, yCounter, symbol} )
  47.  
  48.             xCounter = xCounter + 1
  49.             back, fore, symbol = nil, nil, nil
  50.         end
  51.         yCounter = yCounter + 1
  52.     end
  53.     return newPNGMassiv
  54. end
  55.  
  56. --Нарисовать запомненные ранее пиксели из массива
  57. local function drawOldPixels(massivSudaPihay)
  58.     --Перебираем массив с фонами
  59.     for back, backValue in pairs(massivSudaPihay["backgrounds"]) do
  60.         gpu.setBackground(back)
  61.         for fore, foreValue in pairs(massivSudaPihay["backgrounds"][back]) do
  62.             gpu.setForeground(fore)
  63.             for pixel = 1, #massivSudaPihay["backgrounds"][back][fore] do
  64.                 if massivSudaPihay["backgrounds"][back][fore][pixel][3] ~= transparentSymbol then
  65.                     gpu.set(massivSudaPihay.x + massivSudaPihay["backgrounds"][back][fore][pixel][1] - 1, massivSudaPihay.y + massivSudaPihay["backgrounds"][back][fore][pixel][2] - 1, massivSudaPihay["backgrounds"][back][fore][pixel][3])
  66.                 end
  67.             end
  68.         end
  69.     end
  70. end
  71.  
  72. --Ограничение длины строки
  73. local function stringLimit(mode, text, size, noDots)
  74.     if unicode.len(text) <= size then return text end
  75.     local length = unicode.len(text)
  76.     if mode == "start" then
  77.         if noDots then
  78.             return unicode.sub(text, length - size + 1, -1)
  79.         else
  80.             return "…" .. unicode.sub(text, length - size + 2, -1)
  81.         end
  82.     else
  83.         if noDots then
  84.             return unicode.sub(text, 1, size)
  85.         else
  86.             return unicode.sub(text, 1, size - 1) .. "…"
  87.         end
  88.     end
  89. end
  90.  
  91. --Шкала прогресса
  92. local function progressBar(x, y, width, height, background, foreground, percent)
  93.     local activeWidth = math.ceil(width * percent / 100)
  94.     square(x, y, width, height, background)
  95.     square(x, y, activeWidth, height, foreground)
  96. end
  97.  
  98. --Окно загрузки
  99. local function downloadWindow()
  100.     --Задаем стартовые координаты
  101.     local width, height = 60, 7
  102.     local progressBarWidth = math.floor(width * 3 / 4)
  103.     local x, y = math.floor(xSize / 2 - width / 2), math.floor(ySize / 2 - height / 2) + 1
  104.     --Запоминаем старые пиксели
  105.     local oldPixels = rememberOldPixels(x, y, x + width - 1, y + height - 1)
  106.     --Рисуем верхний тулбар
  107.     square(x, y, width, 1, 0xcccccc)
  108.     local text = "Загрузка"
  109.     local xPos, yPos = math.floor(xSize / 2 - unicode.len(text) / 2), y
  110.     gpu.setForeground( 0x000000 )
  111.     gpu.set(xPos, yPos, text)
  112.     --Рисуем само окно
  113.     square(x, y + 1, width, height - 1, 0xeeeeee)
  114.     --Загружаем файлы и рисуем шкалу прогресса
  115.     xPos, yPos = math.floor(xSize / 2 - progressBarWidth / 2), math.floor(ySize / 2)
  116.     local percent = 0
  117.     progressBar(xPos, yPos, progressBarWidth, 1, 0xcccccc, 0x3366CC, percent)
  118.     for i = 1, #applications do
  119.         progressBar(xPos, yPos, progressBarWidth, 1, 0xcccccc, 0x3366CC, percent)
  120.         square(xPos, yPos + 1, progressBarWidth, 1, 0xeeeeee)
  121.         gpu.setForeground(0x262626)
  122.         gpu.set(xPos, yPos + 1, stringLimit("end", "Устанавливаю " .. applications[i][2], progressBarWidth))
  123.         shell.execute("wget " .. applications[i][1] .. " " .. applications[i][2] .. " -fQ")
  124.         percent = math.floor(100 * i / #applications)
  125.     end
  126.     progressBar(xPos, yPos, progressBarWidth, 1, 0xcccccc, 0x3366CC, percent)
  127.     os.sleep(0.3)
  128.     --Выпиливаем нарисованное окно
  129.     drawOldPixels(oldPixels)
  130. end
  131.  
  132. ------------------------------------------- Программа -------------------------------------------
  133.  
  134. downloadWindow()
  135.  
  136.  
  137.  
  138.  
  139.  
  140.  
  141.  
  142.  
  143.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement