Advertisement
Programist135

InstallRecycleBin

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