View difference between Paste ID: 82r5SFxm and nAKMpBym
SHOW: | | - or go back to the newest paste.
1
------------------------------------------- Библиотеки -------------------------------------------
2
3
local shell = require("shell")
4
local component = require("component")
5
local unicode = require("unicode")
6
local fs = require("filesystem")
7
local gpu = component.gpu
8
9
------------------------------------------- Переменные -------------------------------------------
10
11
--Массив с программами, которые необходимо загрузить. Первый элемент - ссылка на файл, второй - путь для сохранения файла.
12
local applications = {
13
	{ "https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/colorlib.lua", "lib/colorlib.lua" },
14
	{ "https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/doubleBuffering.lua", "lib/doubleBuffering.lua" },
15
	{ "https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/context.lua", "lib/context.lua" },
16
	{ "https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/palette.lua", "lib/palette.lua" },
17
	{ "https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/ECSAPI.lua", "lib/ECSAPI.lua" },
18
	{ "https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/bigLetters.lua", "lib/bigLetters.lua" },
19
	{ "https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/image.lua", "lib/image.lua" },
20
	{ "https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/colorlib.lua", "lib/colorlib.lua" },
21
22
	{ "https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/3DPrint/3DPrint.lua", "3DPrint.lua" },
23
}
24
25
--Получаем размеры монитора
26
local xSize, ySize = gpu.getResolution()
27
28
------------------------------------------- Функции -------------------------------------------
29
30
--Отрисовка квадрата указанного цвета
31
local function square(x, y, width, height, background)
32
	gpu.setBackground(background)
33
	gpu.fill(x, y, width, height, " ")
34
end
35
36
--Запомнить область пикселей и возвратить ее в виде массива
37
local function rememberOldPixels(x, y, x2, y2)
38
	local newPNGMassiv = { ["backgrounds"] = {} }
39
	newPNGMassiv.x, newPNGMassiv.y = x, y
40
	--Перебираем весь массив стандартного PNG-вида по высоте
41
	local xCounter, yCounter = 1, 1
42
	for j = y, y2 do
43
		xCounter = 1
44
		for i = x, x2 do
45
			if (i > xSize or i < 0) or (j > ySize or j < 0) then
46
				error("Can't remember pixel, because it's located behind the screen: x("..i.."), y("..j..") out of xSize("..xSize.."), ySize("..ySize..")\n")
47
			end
48
			local symbol, fore, back = gpu.get(i, j)
49
			newPNGMassiv["backgrounds"][back] = newPNGMassiv["backgrounds"][back] or {}
50
			newPNGMassiv["backgrounds"][back][fore] = newPNGMassiv["backgrounds"][back][fore] or {}
51
			table.insert(newPNGMassiv["backgrounds"][back][fore], {xCounter, yCounter, symbol} )
52
53
			xCounter = xCounter + 1
54
			back, fore, symbol = nil, nil, nil
55
		end
56
		yCounter = yCounter + 1
57
	end
58
	return newPNGMassiv
59
end
60
61
--Нарисовать запомненные ранее пиксели из массива
62
local function drawOldPixels(massivSudaPihay)
63
	--Перебираем массив с фонами
64
	for back, backValue in pairs(massivSudaPihay["backgrounds"]) do
65
		gpu.setBackground(back)
66
		for fore, foreValue in pairs(massivSudaPihay["backgrounds"][back]) do
67
			gpu.setForeground(fore)
68
			for pixel = 1, #massivSudaPihay["backgrounds"][back][fore] do
69
				if massivSudaPihay["backgrounds"][back][fore][pixel][3] ~= transparentSymbol then
70
					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])
71
				end
72
			end
73
		end
74
	end
75
end
76
77
--Шкала прогресса
78
local function progressBar(x, y, width, height, background, foreground, percent)
79
	local activeWidth = math.ceil(width * percent / 100)
80
	square(x, y, width, height, background)
81
	square(x, y, activeWidth, height, foreground)
82
end
83
84
--Окно загрузки
85
local function downloadWindow()
86
	--Задаем стартовые координаты
87
	local width, height = 60, 7
88
	local progressBarWidth = math.floor(width * 3 / 4)
89
	local x, y = math.floor(xSize / 2 - width / 2), math.floor(ySize / 2 - height / 2) + 1
90
	--Запоминаем старые пиксели
91
	local oldPixels = rememberOldPixels(x, y, x + width - 1, y + height - 1)
92
	--Рисуем верхний тулбар
93
	square(x, y, width, 1, 0xcccccc)
94
	local text = "Загрузка"
95
	local xPos, yPos = math.floor(xSize / 2 - unicode.len(text) / 2), y
96
	gpu.setForeground( 0x000000 )
97
	gpu.set(xPos, yPos, text)
98
	--Рисуем само окно
99
	square(x, y + 1, width, height - 1, 0xeeeeee)
100
	--Загружаем файлы и рисуем шкалу прогресса
101
	xPos, yPos = math.floor(xSize / 2 - progressBarWidth / 2), math.floor(ySize / 2)
102
	local percent = 0
103
	for i = 1, #applications do
104
		percent = math.floor(100 * i / #applications)
105
		progressBar(xPos, yPos, progressBarWidth, 1, 0xcccccc, 0x3366CC, percent)
106
		square(xPos, yPos + 1, progressBarWidth, 1, 0xeeeeee)
107
		gpu.setForeground(0x262626)
108
		gpu.set(xPos, yPos + 1, "Устанавливаю " .. applications[i][2])
109
		fs.makeDirectory(fs.path(applications[i][2]) or "")		
110
		shell.execute("wget " .. applications[i][1] .. " " .. applications[i][2] .. " -fQ")
111
	end
112
	os.sleep(0.3)
113
	--Выпиливаем нарисованное окно
114
	drawOldPixels(oldPixels)
115
end
116
117
------------------------------------------- Программа -------------------------------------------
118
119
downloadWindow()