SaveText.Ru

Без имени
  1. local component = require("component")
  2. local term = require("term")
  3. local unicode = require("unicode")
  4. local event = require("event")
  5. --local fs = require("filesystem")
  6. --local shell = require("shell")
  7. local keyboard = require("keyboard")
  8. local computer = require("computer")
  9. --local serialization = require("serialization")
  10. --local internet = require("internet")
  11. local gpu = component.gpu
  12.  
  13. local ECSAPI = {}
  14.  
  15. ----------------------------------------------------------------------------------------------------
  16.  
  17. ECSAPI.windowColors = {
  18.         background = 0xeeeeee,
  19.         usualText = 0x444444,
  20.         subText = 0x888888,
  21.         tab = 0xaaaaaa,
  22.         title = 0xffffff,
  23.         shadow = 0x444444,
  24. }
  25.  
  26. ECSAPI.colors = {
  27.         white = 0xffffff,
  28.         orange = 0xF2B233,
  29.         magenta = 0xE57FD8,
  30.         lightBlue = 0x99B2F2,
  31.         yellow = 0xDEDE6C,
  32.         lime = 0x7FCC19,
  33.         pink = 0xF2B2CC,
  34.         gray = 0x4C4C4C,
  35.         lightGray = 0x999999,
  36.         cyan = 0x4C99B2,
  37.         purple = 0xB266E5,
  38.         blue = 0x3366CC,
  39.         brown = 0x7F664C,
  40.         green = 0x57A64E,
  41.         red = 0xCC4C4C,
  42.     black = 0x000000,
  43.         ["0"] = 0xffffff,
  44.         ["1"] = 0xF2B233,
  45.         ["2"] = 0xE57FD8,
  46.         ["3"] = 0x99B2F2,
  47.         ["4"] = 0xDEDE6C,
  48.         ["5"] = 0x7FCC19,
  49.         ["6"] = 0xF2B2CC,
  50.         ["7"] = 0x4C4C4C,
  51.         ["8"] = 0x999999,
  52.         ["9"] = 0x4C99B2,
  53.         ["a"] = 0xB266E5,
  54.         ["b"] = 0x3366CC,
  55.         ["c"] = 0x7F664C,
  56.         ["d"] = 0x57A64E,
  57.         ["e"] = 0xCC4C4C,
  58.         ["f"] = 0x000000
  59. }
  60.  
  61. ----------------------------------------------------------------------------------------------------
  62.  
  63.  
  64. --КЛИКНУЛИ ЛИ В ЗОНУ
  65. function ECSAPI.clickedAtArea(x,y,sx,sy,ex,ey)
  66.   if (x >= sx) and (x <= ex) and (y >= sy) and (y <= ey) then return true end    
  67.   return false
  68. end
  69.  
  70. --Заливка всего экрана указанным цветом
  71. function ECSAPI.clearScreen(color)
  72.   if color then gpu.setBackground(color) end
  73.   term.clear()
  74. end
  75.  
  76. --Установка пикселя нужного цвета
  77. function ECSAPI.setPixel(x,y,color)
  78.   gpu.setBackground(color)
  79.   gpu.set(x,y," ")
  80. end
  81.  
  82. --Простая установка цветов в одну строку, ибо я ленивый
  83. function ECSAPI.setColor(background, foreground)
  84.         gpu.setBackground(background)
  85.         gpu.setForeground(foreground)
  86. end
  87.  
  88. --Цветной текст
  89. function ECSAPI.colorText(x,y,textColor,text)
  90.   gpu.setForeground(textColor)
  91.   gpu.set(x,y,text)
  92. end
  93.  
  94. --Цветной текст с жопкой!
  95. function ECSAPI.colorTextWithBack(x,y,textColor,backColor,text)
  96.   gpu.setForeground(textColor)
  97.   gpu.setBackground(backColor)
  98.   gpu.set(x,y,text)
  99. end
  100.  
  101. --Инверсия цвета
  102. function ECSAPI.invertColor(color)
  103.   return 0xffffff - color
  104. end
  105.  
  106. --Округление до опред. кол-ва знаков после запятой
  107. function ECSAPI.round(num, idp)
  108.         local mult = 10^(idp or 0)
  109.         return math.floor(num * mult + 0.5) / mult
  110. end
  111.  
  112. --Обычный квадрат указанного цвета
  113. function ECSAPI.square(x,y,width,height,color)
  114.   gpu.setBackground(color)
  115.   gpu.fill(x,y,width,height," ")
  116. end
  117.  
  118. --Юникодовская рамка
  119. function ECSAPI.border(x, y, width, height, back, fore)
  120.         local stringUp = "┌"..string.rep("─", width - 2).."┐"
  121.         local stringDown = "└"..string.rep("─", width - 2).."┘"
  122.         gpu.setForeground(fore)
  123.         gpu.setBackground(back)
  124.         gpu.set(x, y, stringUp)
  125.         gpu.set(x, y + height - 1, stringDown)
  126.  
  127.         local yPos = 1
  128.         for i = 1, (height - 2) do
  129.                 gpu.set(x, y + yPos, "│")
  130.                 gpu.set(x + width - 1, y + yPos, "│")
  131.                 yPos = yPos + 1
  132.         end
  133. end
  134.  
  135. --Юникодовский разделитель
  136. function ECSAPI.separator(x, y, width, back, fore)
  137.         ECSAPI.colorTextWithBack(x, y, fore, back, string.rep("─", width))
  138. end
  139.  
  140. --Корректировка стартовых координат. Core-функция для всех моих программ
  141. function ECSAPI.correctStartCoords(xStart,yStart,xWindowSize,yWindowSize)
  142.         local xSize,ySize = gpu.getResolution()
  143.         if xStart == "auto" then
  144.                 xStart = math.floor(xSize/2 - xWindowSize/2)
  145.         end
  146.         if yStart == "auto" then
  147.                 yStart = math.ceil(ySize/2 - yWindowSize/2)
  148.         end
  149.         return xStart,yStart
  150. end
  151.  
  152. --Запомнить область пикселей и возвратить ее в виде массива
  153. function ECSAPI.rememberOldPixels(x, y, x2, y2)
  154.         local newPNGMassiv = { ["backgrounds"] = {} }
  155.         newPNGMassiv.x, newPNGMassiv.y = x, y
  156.  
  157.         --Перебираем весь массив стандартного PNG-вида по высоте
  158.         local xCounter, yCounter = 1, 1
  159.         for j = y, y2 do
  160.                 xCounter = 1
  161.                 for i = x, x2 do
  162.                         local symbol, fore, back = gpu.get(i, j)
  163.  
  164.                         newPNGMassiv["backgrounds"][back] = newPNGMassiv["backgrounds"][back] or {}
  165.                         newPNGMassiv["backgrounds"][back][fore] = newPNGMassiv["backgrounds"][back][fore] or {}
  166.  
  167.                         table.insert(newPNGMassiv["backgrounds"][back][fore], {xCounter, yCounter, symbol} )
  168.  
  169.                         xCounter = xCounter + 1
  170.                         back, fore, symbol = nil, nil, nil
  171.                 end
  172.  
  173.                 yCounter = yCounter + 1
  174.         end
  175.  
  176.         return newPNGMassiv
  177. end
  178.  
  179. --Нарисовать запомненные ранее пиксели из массива
  180. function ECSAPI.drawOldPixels(massivSudaPihay)
  181.         --Перебираем массив с фонами
  182.         for back, backValue in pairs(massivSudaPihay["backgrounds"]) do
  183.                 gpu.setBackground(back)
  184.                 for fore, foreValue in pairs(massivSudaPihay["backgrounds"][back]) do
  185.                         gpu.setForeground(fore)
  186.                         for pixel = 1, #massivSudaPihay["backgrounds"][back][fore] do
  187.                                 if massivSudaPihay["backgrounds"][back][fore][pixel][3] ~= transparentSymbol then
  188.                                         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])
  189.                                 end
  190.                         end
  191.                 end
  192.         end
  193. end
  194.  
  195. --Ограничение длины строки. Маст-хев функция.
  196. function ECSAPI.stringLimit(mode, text, size, noDots)
  197.         if unicode.len(text) <= size then return text end
  198.         local length = unicode.len(text)
  199.         if mode == "start" then
  200.                 if noDots then
  201.                         return unicode.sub(text, length - size + 1, -1)
  202.                 else
  203.                         return "…" .. unicode.sub(text, length - size + 2, -1)
  204.                 end
  205.         else
  206.                 if noDots then
  207.                         return unicode.sub(text, 1, size)
  208.                 else
  209.                         return unicode.sub(text, 1, size - 1) .. "…"
  210.                 end
  211.         end
  212. end
  213.  
  214. --Ожидание клика либо нажатия какой-либо клавиши
  215. function ECSAPI.waitForTouchOrClick()
  216.         while true do
  217.                 local e = {event.pull()}
  218.                 if e[1] == "key_down" or e[1] == "touch" then break end
  219.         end
  220. end
  221.  
  222. --Функция отрисовки кнопки указанной ширины
  223. function ECSAPI.drawButton(x,y,width,height,text,backColor,textColor)
  224.         x,y = ECSAPI.correctStartCoords(x,y,width,height)
  225.  
  226.         local textPosX = math.floor(x + width / 2 - unicode.len(text) / 2)
  227.         local textPosY = math.floor(y + height / 2)
  228.         ECSAPI.square(x,y,width,height,backColor)
  229.         ECSAPI.colorText(textPosX,textPosY,textColor,text)
  230.  
  231.         return x, y, (x + width - 1), (y + height - 1)
  232. end
  233.  
  234. --Отрисовка кнопки с указанными отступами от текста
  235. function ECSAPI.drawAdaptiveButton(x,y,offsetX,offsetY,text,backColor,textColor)
  236.         local length = unicode.len(text)
  237.         local width = offsetX*2 + length
  238.         local height = offsetY*2 + 1
  239.  
  240.         x,y = ECSAPI.correctStartCoords(x,y,width,height)
  241.  
  242.         ECSAPI.square(x,y,width,height,backColor)
  243.         ECSAPI.colorText(x+offsetX,y+offsetY,textColor,text)
  244.  
  245.         return x,y,(x+width-1),(y+height-1)
  246. end
  247.  
  248. --Функция по переносу слов на новую строку в зависимости от ограничения по ширине
  249. function ECSAPI.stringWrap(text, limit)
  250.         --Получаем длину текста
  251.         local sText = unicode.len(text)
  252.         --Считаем количество строк, которое будет после парсинга
  253.         local repeats = math.ceil(sText / limit)
  254.         --Создаем массив этих строк
  255.         local massiv = {}
  256.         local counter
  257.         --Парсим строки
  258.         for i = 1, repeats do
  259.                 counter = i * limit - limit + 1
  260.                 table.insert(massiv, unicode.sub(text, counter, counter + limit - 1))
  261.         end
  262.         --Возвращаем массив строк
  263.         return massiv
  264. end
  265.  
  266. --Моя любимая функция ошибки C:
  267. function ECSAPI.error(text)
  268.         ECSAPI.universalWindow("auto", "auto", math.ceil(gpu.getResolution() * 0.45), ECSAPI.windowColors.background, true, {"EmptyLine"}, {"CenterText", 0x880000, "Ошибка!"}, {"EmptyLine"}, {"WrappedText", 0x262626, text}, {"EmptyLine"}, {"Button", {0x880000, 0xffffff, "OK!"}})
  269. end
  270.  
  271. --Очистить экран, установить комфортные цвета и поставить курсок на 1, 1
  272. function ECSAPI.prepareToExit(color1, color2)
  273.         ECSAPI.clearScreen(color1 or 0x333333)
  274.         gpu.setForeground(color2 or 0xffffff)
  275.         gpu.set(1, 1, "")
  276. end
  277.  
  278. --Конвертация из юникода в символ. Вроде норм, а вроде и не норм. Но полезно.
  279. function ECSAPI.convertCodeToSymbol(code)
  280.         local symbol
  281.         if code ~= 0 and code ~= 13 and code ~= 8 and code ~= 9 and code ~= 200 and code ~= 208 and code ~= 203 and code ~= 205 and not keyboard.isControlDown() then
  282.                 symbol = unicode.char(code)
  283.                 if keyboard.isShiftPressed then symbol = unicode.upper(symbol) end
  284.         end
  285.         return symbol
  286. end
  287.  
  288. --Функция для ввода текста в мини-поле.
  289. function ECSAPI.inputText(x, y, limit, cheBiloVvedeno, background, foreground, justDrawNotEvent, maskTextWith)
  290.         limit = limit or 10
  291.         cheBiloVvedeno = cheBiloVvedeno or ""
  292.         background = background or 0xffffff
  293.         foreground = foreground or 0x000000
  294.  
  295.         gpu.setBackground(background)
  296.         gpu.setForeground(foreground)
  297.         gpu.fill(x, y, limit, 1, " ")
  298.  
  299.         local text = cheBiloVvedeno
  300.  
  301.         local function draw()
  302.                 term.setCursorBlink(false)
  303.  
  304.                 local dlina = unicode.len(text)
  305.                 local xCursor = x + dlina
  306.                 if xCursor > (x + limit - 1) then xCursor = (x + limit - 1) end
  307.  
  308.                 if maskTextWith then
  309.                         gpu.set(x, y, ECSAPI.stringLimit("start", string.rep("●", dlina), limit))
  310.                 else
  311.                         gpu.set(x, y, ECSAPI.stringLimit("start", text, limit))
  312.                 end
  313.  
  314.                 term.setCursor(xCursor, y)
  315.  
  316.                 term.setCursorBlink(true)
  317.         end
  318.  
  319.         draw()
  320.  
  321.         if justDrawNotEvent then term.setCursorBlink(false); return cheBiloVvedeno end
  322.  
  323.         while true do
  324.                 local e = {event.pull()}
  325.                 if e[1] == "key_down" then
  326.                         if e[4] == 14 then
  327.                                 term.setCursorBlink(false)
  328.                                 text = unicode.sub(text, 1, -2)
  329.                                 if unicode.len(text) < limit then gpu.set(x + unicode.len(text), y, " ") end
  330.                                 draw()
  331.                         elseif e[4] == 28 then
  332.                                 term.setCursorBlink(false)
  333.                                 return text
  334.                         else
  335.                                 local symbol = ECSAPI.convertCodeToSymbol(e[3])
  336.                                 if symbol then
  337.                                         text = text..symbol
  338.                                         draw()
  339.                                 end
  340.                         end
  341.                 elseif e[1] == "touch" then
  342.                         term.setCursorBlink(false)
  343.                         return text
  344.                 elseif e[1] == "clipboard" then
  345.                         if e[3] then
  346.                                 text = text..e[3]
  347.                                 draw()
  348.                         end
  349.                 end
  350.         end
  351. end
  352.  
  353. --Спросить, заменять ли файл (если таковой уже имеется)
  354. function ECSAPI.askForReplaceFile(path)
  355.         if fs.exists(path) then
  356.                 local action = ECSAPI.universalWindow("auto", "auto", 46, ECSAPI.windowColors.background, true, {"EmptyLine"}, {"CenterText", 0x262626, "Файл "".. fs.name(path) .. "" уже имеется в этом месте."}, {"CenterText", 0x262626, "Заменить его перемещаемым объектом?"}, {"EmptyLine"}, {"Button", {0xdddddd, 0x262626, "Оставить оба"}, {0xffffff, 0x262626, "Отмена"}, {ECSAPI.colors.lightBlue, 0xffffff, "Заменить"}})
  357.                 if action[1] == "Оставить оба" then
  358.                         return "keepBoth"
  359.                 elseif action[2] == "Отмена" then
  360.                         return "cancel"
  361.                 else
  362.                         return "replace"
  363.                 end
  364.         end
  365. end
  366.  
  367. --Вертикальный скроллбар. Маст-хев!
  368. function ECSAPI.srollBar(x, y, width, height, countOfAllElements, currentElement, backColor, frontColor)
  369.         local sizeOfScrollBar = math.ceil(1 / countOfAllElements * height)
  370.         local displayBarFrom = math.floor(y + height * ((currentElement - 1) / countOfAllElements))
  371.  
  372.         ECSAPI.square(x, y, width, height, backColor)
  373.         ECSAPI.square(x, displayBarFrom, width, sizeOfScrollBar, frontColor)
  374.  
  375.         sizeOfScrollBar, displayBarFrom = nil, nil
  376. end
  377.  
  378. --Отрисовка поля с текстом. Сюда пихать массив вида {"строка1", "строка2", "строка3", ...}
  379. function ECSAPI.textField(x, y, width, height, lines, displayFrom, background, foreground, scrollbarBackground, scrollbarForeground)
  380.         x, y = ECSAPI.correctStartCoords(x, y, width, height)
  381.  
  382.         background = background or 0xffffff
  383.         foreground = foreground or ECSAPI.windowColors.usualText
  384.  
  385.         local sLines = #lines
  386.         local lineLimit = width - 3
  387.  
  388.         --Парсим строки
  389.         local line = 1
  390.         while lines[line] do
  391.                 local sLine = unicode.len(lines[line])
  392.                 if sLine > lineLimit then
  393.                         local part1, part2 = unicode.sub(lines[line], 1, lineLimit), unicode.sub(lines[line], lineLimit + 1, -1)
  394.                         lines[line] = part1
  395.                         table.insert(lines, line + 1, part2)
  396.                         part1, part2 = nil, nil
  397.                 end
  398.                 line = line + 1
  399.                 sLine = nil
  400.         end
  401.         line = nil
  402.  
  403.         ECSAPI.square(x, y, width - 1, height, background)
  404.         ECSAPI.srollBar(x + width - 1, y, 1, height, sLines, displayFrom, scrollbarBackground, scrollbarForeground)
  405.  
  406.         gpu.setBackground(background)
  407.         gpu.setForeground(foreground)
  408.         local yPos = y
  409.         for i = displayFrom, (displayFrom + height - 1) do
  410.                 if lines[i] then
  411.                         gpu.set(x + 1, yPos, lines[i])
  412.                         yPos = yPos + 1
  413.                 else
  414.                         break
  415.                 end
  416.         end
  417.  
  418.         return sLines
  419. end
  420.  
  421. ---------------------------------------------ОКОШЕЧКИ------------------------------------------------------------
  422.  
  423.  
  424. --Описание ниже, ебана. Ниже - это значит в самой жопе кода!
  425. function ECSAPI.universalWindow(x, y, width, background, closeWindowAfter, ...)
  426.         local objects = {...}
  427.         local countOfObjects = #objects
  428.  
  429.         local pressedButton
  430.         local pressedMultiButton
  431.  
  432.         --Задаем высотные константы для объектов
  433.         local objectsHeights = {
  434.                 ["button"] = 3,
  435.                 ["centertext"] = 1,
  436.                 ["emptyline"] = 1,
  437.                 ["input"] = 3,
  438.                 ["slider"] = 3,
  439.                 ["select"] = 3,
  440.                 ["selector"] = 3,
  441.                 ["separator"] = 1,
  442.                 ["switch"] = 1,
  443.         }
  444.  
  445.         --Скорректировать ширину, если нужно
  446.         local function correctWidth(newWidthForAnalyse)
  447.                 width = math.max(width, newWidthForAnalyse)
  448.         end
  449.  
  450.         --Корректируем ширину
  451.         for i = 1, countOfObjects do
  452.                 local objectType = string.lower(objects[i][1])
  453.                
  454.                 if objectType == "centertext" then
  455.                         correctWidth(unicode.len(objects[i][3]) + 2)
  456.                 elseif objectType == "slider" then --!!!!!!!!!!!!!!!!!! ВОТ ТУТ НЕ ЗАБУДЬ ФИКСАНУТЬ
  457.                         correctWidth(unicode.len(objects[i][7]..tostring(objects[i][5].." ")) + 2)
  458.                 elseif objectType == "select" then
  459.                         for j = 4, #objects[i] do
  460.                                 correctWidth(unicode.len(objects[i][j]) + 2)
  461.                         end
  462.                 --elseif objectType == "selector" then
  463.                        
  464.                 --elseif objectType == "separator" then
  465.                        
  466.                 elseif objectType == "textfield" then
  467.                         correctWidth(7)
  468.                 elseif objectType == "wrappedtext" then
  469.                         correctWidth(6)
  470.                 elseif objectType == "button" then
  471.                         --Корректируем ширину
  472.                         local widthOfButtons = 0
  473.                         local maxButton = 0
  474.                         for j = 2, #objects[i] do
  475.                                 maxButton = math.max(maxButton, unicode.len(objects[i][j][3]) + 2)
  476.                         end
  477.                         widthOfButtons = maxButton * #objects[i]
  478.                         correctWidth(widthOfButtons)
  479.                 elseif objectType == "switch" then
  480.                         local dlina = unicode.len(objects[i][5]) + 2 + 10 + 4
  481.                         correctWidth(dlina)
  482.                 end
  483.         end
  484.  
  485.         --Считаем высоту этой хуйни
  486.         local height = 0
  487.         for i = 1, countOfObjects do
  488.                 local objectType = string.lower(objects[i][1])
  489.                 if objectType == "select" then
  490.                         height = height + (objectsHeights[objectType] * (#objects[i] - 3))
  491.                 elseif objectType == "textfield" then
  492.                         height = height + objects[i][2]
  493.                 elseif objectType == "wrappedtext" then
  494.                         --Заранее парсим текст перенесенный
  495.                         objects[i].wrapped = ECSAPI.stringWrap(objects[i][3], width - 4)
  496.                         objects[i].height = #objects[i].wrapped
  497.                         height = height + objects[i].height
  498.                 else
  499.                         height = height + objectsHeights[objectType]
  500.                 end
  501.         end
  502.  
  503.         --Коорректируем стартовые координаты
  504.         x, y = ECSAPI.correctStartCoords(x, y, width, height)
  505.         --Запоминаем инфу о том, что было нарисовано, если это необходимо
  506.         local oldPixels, oldBackground, oldForeground
  507.         if closeWindowAfter then
  508.                 oldBackground = gpu.getBackground()
  509.                 oldForeground = gpu.getForeground()
  510.                 oldPixels = ECSAPI.rememberOldPixels(x, y, x + width - 1, y + height - 1)
  511.         end
  512.         --Считаем все координаты объектов
  513.         objects[1].y = y
  514.         if countOfObjects > 1 then
  515.                 for i = 2, countOfObjects do
  516.                         local objectType = string.lower(objects[i - 1][1])
  517.                         if objectType == "select" then
  518.                                 objects[i].y = objects[i - 1].y + (objectsHeights[objectType] * (#objects[i - 1] - 3))
  519.                         elseif objectType == "textfield" then
  520.                                 objects[i].y = objects[i - 1].y + objects[i - 1][2]
  521.                         elseif objectType == "wrappedtext" then
  522.                                 objects[i].y = objects[i - 1].y + objects[i - 1].height
  523.                         else
  524.                                 objects[i].y = objects[i - 1].y + objectsHeights[objectType]
  525.                         end
  526.                 end
  527.         end
  528.  
  529.         --Объекты для тача
  530.         local obj = {}
  531.         local function newObj(class, name, ...)
  532.                 obj[class] = obj[class] or {}
  533.                 obj[class][name] = {...}
  534.         end
  535.  
  536.         --Отображение объекта по номеру
  537.         local function displayObject(number, active)
  538.                 local objectType = string.lower(objects[number][1])
  539.                                
  540.                 if objectType == "centertext" then
  541.                         local xPos = x + math.floor(width / 2 - unicode.len(objects[number][3]) / 2)
  542.                         gpu.setForeground(objects[number][2])
  543.                         gpu.set(xPos, objects[number].y, objects[number][3])
  544.                
  545.                 elseif objectType == "input" then
  546.  
  547.                         if active then
  548.                                 --Рамочка
  549.                                 ECSAPI.border(x + 1, objects[number].y, width - 2, objectsHeights.input, background, objects[number][3])
  550.                                 --Тестик
  551.                                 objects[number][4] = ECSAPI.inputText(x + 3, objects[number].y + 1, width - 6, "", background, objects[number][3], false, objects[number][5])
  552.                         else
  553.                                 --Рамочка
  554.                                 ECSAPI.border(x + 1, objects[number].y, width - 2, objectsHeights.input, background, objects[number][2])
  555.                                 --Текстик
  556.                                 gpu.set(x + 3, objects[number].y + 1, ECSAPI.stringLimit("start", objects[number][4], width - 6))
  557.                                 ECSAPI.inputText(x + 3, objects[number].y + 1, width - 6, objects[number][4], background, objects[number][2], true, objects[number][5])
  558.                         end
  559.  
  560.                         newObj("Inputs", number, x + 1, objects[number].y, x + width - 2, objects[number].y + 2)
  561.  
  562.                 elseif objectType == "slider" then
  563.                         local widthOfSlider = width - 2
  564.                         local xOfSlider = x + 1
  565.                         local yOfSlider = objects[number].y + 1
  566.                         local countOfSliderThings = objects[number][5] - objects[number][4]
  567.                         local showSliderValue= objects[number][7]
  568.  
  569.                         local dolya = widthOfSlider / countOfSliderThings
  570.                         local position = math.floor(dolya * objects[number][6])
  571.                         --Костыль
  572.                         if (xOfSlider + position) > (xOfSlider + widthOfSlider - 1)     then position = widthOfSlider - 2 end
  573.  
  574.                         --Две линии
  575.                         ECSAPI.separator(xOfSlider, yOfSlider, position, background, objects[number][3])
  576.                         ECSAPI.separator(xOfSlider + position, yOfSlider, widthOfSlider - position, background, objects[number][2])
  577.                         --Слудир
  578.                         ECSAPI.square(xOfSlider + position, yOfSlider, 2, 1, objects[number][3])
  579.  
  580.                         --Текстик под слудиром
  581.                         if showSliderValue then
  582.                                 local text = showSliderValue .. tostring(objects[number][6]) .. (objects[number][8] or "")
  583.                                 local textPos = (xOfSlider + widthOfSlider / 2 - unicode.len(text) / 2)
  584.                                 ECSAPI.square(x, yOfSlider + 1, width, 1, background)
  585.                                 ECSAPI.colorText(textPos, yOfSlider + 1, objects[number][2], text)
  586.                         end
  587.  
  588.                         newObj("Sliders", number, xOfSlider, yOfSlider, x + widthOfSlider, yOfSlider, dolya)
  589.  
  590.                 elseif objectType == "select" then
  591.                         local usualColor = objects[number][2]
  592.                         local selectionColor = objects[number][3]
  593.  
  594.                         objects[number].selectedData = objects[number].selectedData or 1
  595.  
  596.                         local symbol = "✔"
  597.                         local yPos = objects[number].y
  598.                         for i = 4, #objects[number] do
  599.                                 --Коробка для галочки
  600.                                 ECSAPI.border(x + 1, yPos, 5, 3, background, usualColor)
  601.                                 --Текст
  602.                                 gpu.set(x + 7, yPos + 1, objects[number][i])
  603.                                 --Галочка
  604.                                 if objects[number].selectedData == (i - 3) then
  605.                                         ECSAPI.colorText(x + 3, yPos + 1, selectionColor, symbol)
  606.                                 else
  607.                                         gpu.set(x + 3, yPos + 1, "  ")
  608.                                 end
  609.  
  610.                                 obj["Selects"] = obj["Selects"] or {}
  611.                                 obj["Selects"][number] = obj["Selects"][number] or {}
  612.                                 obj["Selects"][number][i - 3] = { x + 1, yPos, x + width - 2, yPos + 2 }
  613.  
  614.                                 yPos = yPos + objectsHeights.select
  615.                         end
  616.  
  617.                 elseif objectType == "selector" then
  618.                         local borderColor = objects[number][2]
  619.                         local arrowColor = objects[number][3]
  620.                         local selectorWidth = width - 2
  621.                         objects[number].selectedElement = objects[number].selectedElement or objects[number][4]
  622.  
  623.                         local topLine = "┌" .. string.rep("─", selectorWidth - 6) .. "┬───┐"
  624.                         local midLine = "│" .. string.rep(" ", selectorWidth - 6) .. "│   │"
  625.                         local botLine = "└" .. string.rep("─", selectorWidth - 6) .. "┴───┘"
  626.  
  627.                         local yPos = objects[number].y
  628.  
  629.                         local function bordak(borderColor)
  630.                                 gpu.setBackground(background)
  631.                                 gpu.setForeground(borderColor)
  632.                                 gpu.set(x + 1, objects[number].y, topLine)
  633.                                 gpu.set(x + 1, objects[number].y + 1, midLine)
  634.                                 gpu.set(x + 1, objects[number].y + 2, botLine)
  635.                                 gpu.set(x + 3, objects[number].y + 1, ECSAPI.stringLimit("start", objects[number].selectedElement, width - 6))
  636.                                 ECSAPI.colorText(x + width - 4, objects[number].y + 1, arrowColor, "▼")
  637.                         end
  638.  
  639.                         bordak(borderColor)
  640.                
  641.                         --Выпадающий список, самый гемор, блядь
  642.                         if active then
  643.                                 local xPos, yPos = x + 1, objects[number].y + 3
  644.                                 local spisokWidth = width - 2
  645.                                 local countOfElements = #objects[number] - 3
  646.                                 local spisokHeight = countOfElements + 1
  647.                                 local oldPixels = ECSAPI.rememberOldPixels( xPos, yPos, xPos + spisokWidth - 1, yPos + spisokHeight - 1)
  648.  
  649.                                 local coords = {}
  650.  
  651.                                 bordak(arrowColor)
  652.  
  653.                                 --Рамку рисуем поверх фоника
  654.                                 local topLine = "├"..string.rep("─", spisokWidth - 6).."┴───┤"
  655.                                 local midLine = "│"..string.rep(" ", spisokWidth - 2).."│"
  656.                                 local botLine = "└"..string.rep("─", selectorWidth - 2) .. "┘"
  657.                                 ECSAPI.colorTextWithBack(xPos, yPos - 1, arrowColor, background, topLine)
  658.                                 for i = 1, spisokHeight - 1 do
  659.                                         gpu.set(xPos, yPos + i - 1, midLine)
  660.                                 end
  661.                                 gpu.set(xPos, yPos + spisokHeight - 1, botLine)
  662.  
  663.                                 --Элементы рисуем
  664.                                 xPos = xPos + 2
  665.                                 for i = 1, countOfElements do
  666.                                         ECSAPI.colorText(xPos, yPos, 0x000000, ECSAPI.stringLimit("start", objects[number][i + 3], spisokWidth - 4))
  667.                                         coords[i] = {xPos - 1, yPos, xPos + spisokWidth - 4, yPos}
  668.                                         yPos = yPos + 1
  669.                                 end
  670.  
  671.                                 --Обработка
  672.                                 local exit
  673.                                 while true do
  674.                                         if exit then break end
  675.                                         local e = {event.pull()}
  676.                                         if e[1] == "touch" then
  677.                                                 for i = 1, #coords do
  678.                                                         if ECSAPI.clickedAtArea(e[3], e[4], coords[i][1], coords[i][2], coords[i][3], coords[i][4]) then
  679.                                                                 ECSAPI.square(coords[i][1], coords[i][2], spisokWidth - 2, 1, ECSAPI.colors.blue)
  680.                                                                 ECSAPI.colorText(coords[i][1] + 1, coords[i][2], 0xffffff, objects[number][i + 3])
  681.                                                                 os.sleep(0.3)
  682.                                                                 objects[number].selectedElement = objects[number][i + 3]
  683.                                                                 exit = true
  684.                                                                 break
  685.                                                         end
  686.                                                 end
  687.                                         end
  688.                                 end
  689.  
  690.                                 ECSAPI.drawOldPixels(oldPixels)
  691.                         end
  692.  
  693.                         newObj("Selectors", number, x + 1, objects[number].y, x + width - 2, objects[number].y + 2)
  694.  
  695.                 elseif objectType == "separator" then
  696.                         ECSAPI.separator(x, objects[number].y, width, background, objects[number][2])
  697.                
  698.                 elseif objectType == "textfield" then
  699.                         newObj("TextFields", number, x + 1, objects[number].y, x + width - 2, objects[number].y + objects[number][2] - 1)
  700.                         if not objects[number].strings then objects[number].strings = ECSAPI.stringWrap(objects[number][7], width - 5) end
  701.                         objects[number].displayFrom = objects[number].displayFrom or 1
  702.                         ECSAPI.textField(x + 1, objects[number].y, width - 2, objects[number][2], objects[number].strings, objects[number].displayFrom, objects[number][3], objects[number][4], objects[number][5], objects[number][6])
  703.                
  704.                 elseif objectType == "wrappedtext" then
  705.                         gpu.setBackground(background)
  706.                         gpu.setForeground(objects[number][2])
  707.                         for i = 1, #objects[number].wrapped do
  708.                                 gpu.set(x + 2, objects[number].y + i - 1, objects[number].wrapped[i])
  709.                         end
  710.  
  711.                 elseif objectType == "button" then
  712.  
  713.                         obj["MultiButtons"] = obj["MultiButtons"] or {}
  714.                         obj["MultiButtons"][number] = {}
  715.  
  716.                         local widthOfButton = math.floor(width / (#objects[number] - 1))
  717.  
  718.                         local xPos, yPos = x, objects[number].y
  719.                         for i = 1, #objects[number] do
  720.                                 if type(objects[number][i]) == "table" then
  721.                                         local x1, y1, x2, y2 = ECSAPI.drawButton(xPos, yPos, widthOfButton, 3, objects[number][i][3], objects[number][i][1], objects[number][i][2])
  722.                                         table.insert(obj["MultiButtons"][number], {x1, y1, x2, y2, widthOfButton})
  723.                                         xPos = x2 + 1
  724.  
  725.                                         if i == #objects[number] then
  726.                                                 ECSAPI.square(xPos, yPos, x + width - xPos, 3, objects[number][i][1])
  727.                                                 obj["MultiButtons"][number][i - 1][5] = obj["MultiButtons"][number][i - 1][5] + x + width - xPos
  728.                                         end
  729.  
  730.                                         x1, y1, x2, y2 = nil, nil, nil, nil
  731.                                 end
  732.                         end
  733.  
  734.                 elseif objectType == "switch" then
  735.  
  736.                         local xPos, yPos = x + 2, objects[number].y
  737.                         local activeColor, passiveColor, textColor, text, state = objects[number][2], objects[number][3], objects[number][4], objects[number][5], objects[number][6]
  738.                         local switchWidth = 10
  739.                         ECSAPI.colorTextWithBack(xPos, yPos, textColor, background, text)
  740.  
  741.                         xPos = x + width - switchWidth - 2
  742.                         if state then
  743.                                 ECSAPI.square(xPos, yPos, switchWidth, 1, activeColor)
  744.                                 ECSAPI.square(xPos + switchWidth - 2, yPos, 2, 1, passiveColor)
  745.                                 ECSAPI.colorTextWithBack(xPos + 4, yPos, passiveColor, activeColor, "ON")
  746.                         else
  747.                                 ECSAPI.square(xPos, yPos, switchWidth, 1, passiveColor - 0x444444)
  748.                                 ECSAPI.square(xPos, yPos, 2, 1, passiveColor)
  749.                                 ECSAPI.colorTextWithBack(xPos + 4, yPos, passiveColor, passiveColor - 0x444444, "OFF")
  750.                         end
  751.                         newObj("Switches", number, xPos, yPos, xPos + switchWidth - 1, yPos)
  752.                 end
  753.         end
  754.  
  755.         --Отображение всех объектов
  756.         local function displayAllObjects()
  757.                 for i = 1, countOfObjects do
  758.                         displayObject(i)
  759.                 end
  760.         end
  761.  
  762.         --Подготовить массив возвращаемый
  763.         local function getReturn()
  764.                 local massiv = {}
  765.  
  766.                 for i = 1, countOfObjects do
  767.                         local type = string.lower(objects[i][1])
  768.  
  769.                         if type == "button" then
  770.                                 table.insert(massiv, pressedButton)
  771.                         elseif type == "input" then
  772.                                 table.insert(massiv, objects[i][4])
  773.                         elseif type == "select" then
  774.                                 table.insert(massiv, objects[i][objects[i].selectedData + 3])
  775.                         elseif type == "selector" then
  776.                                 table.insert(massiv, objects[i].selectedElement)
  777.                         elseif type == "slider" then
  778.                                 table.insert(massiv, objects[i][6])
  779.                         elseif type == "switch" then
  780.                                 table.insert(massiv, objects[i][6])
  781.                         else
  782.                                 table.insert(massiv, nil)
  783.                         end
  784.                 end
  785.  
  786.                 return massiv
  787.         end
  788.  
  789.         local function redrawBeforeClose()
  790.                 if closeWindowAfter then
  791.                         ECSAPI.drawOldPixels(oldPixels)
  792.                         gpu.setBackground(oldBackground)
  793.                         gpu.setForeground(oldForeground)
  794.                 end
  795.         end
  796.  
  797.         --Рисуем окно
  798.         ECSAPI.square(x, y, width, height, background)
  799.         displayAllObjects()
  800.  
  801.         while true do
  802.                 local e = {event.pull()}
  803.                 if e[1] == "touch" or e[1] == "drag" then
  804.  
  805.                         --Анализируем клик на кнопки
  806.                         if obj["MultiButtons"] then
  807.                                 for key in pairs(obj["MultiButtons"]) do
  808.                                         for i = 1, #obj["MultiButtons"][key] do
  809.                                                 if ECSAPI.clickedAtArea(e[3], e[4], obj["MultiButtons"][key][i][1], obj["MultiButtons"][key][i][2], obj["MultiButtons"][key][i][3], obj["MultiButtons"][key][i][4]) then
  810.                                                         ECSAPI.drawButton(obj["MultiButtons"][key][i][1], obj["MultiButtons"][key][i][2], obj["MultiButtons"][key][i][5], 3, objects[key][i + 1][3], objects[key][i + 1][2], objects[key][i + 1][1])
  811.                                                         os.sleep(0.3)
  812.                                                         pressedButton = objects[key][i + 1][3]
  813.                                                         redrawBeforeClose()
  814.                                                         return getReturn()
  815.                                                 end
  816.                                         end
  817.                                 end
  818.                         end
  819.  
  820.                         --А теперь клик на инпуты!
  821.                         if obj["Inputs"] then
  822.                                 for key in pairs(obj["Inputs"]) do
  823.                                         if ECSAPI.clickedAtArea(e[3], e[4], obj["Inputs"][key][1], obj["Inputs"][key][2], obj["Inputs"][key][3], obj["Inputs"][key][4]) then
  824.                                                 displayObject(key, true)
  825.                                                 displayObject(key)
  826.                                                 break
  827.                                         end
  828.                                 end
  829.                         end
  830.  
  831.                         --А теперь галочковыбор!
  832.                         if obj["Selects"] then
  833.                                 for key in pairs(obj["Selects"]) do
  834.                                         for i in pairs(obj["Selects"][key]) do
  835.                                                 if ECSAPI.clickedAtArea(e[3], e[4], obj["Selects"][key][i][1], obj["Selects"][key][i][2], obj["Selects"][key][i][3], obj["Selects"][key][i][4]) then
  836.                                                         objects[key].selectedData = i
  837.                                                         displayObject(key)
  838.                                                         break
  839.                                                 end
  840.                                         end
  841.                                 end
  842.                         end
  843.  
  844.                         --Хм, а вот и селектор подъехал!
  845.                         if obj["Selectors"] then
  846.                                 for key in pairs(obj["Selectors"]) do
  847.                                         if ECSAPI.clickedAtArea(e[3], e[4], obj["Selectors"][key][1], obj["Selectors"][key][2], obj["Selectors"][key][3], obj["Selectors"][key][4]) then
  848.                                                 displayObject(key, true)
  849.                                                 displayObject(key)
  850.                                                 break
  851.                                         end
  852.                                 end
  853.                         end
  854.  
  855.                         --Слайдеры, епта! "Потный матан", все делы
  856.                         if obj["Sliders"] then
  857.                                 for key in pairs(obj["Sliders"]) do
  858.                                         if ECSAPI.clickedAtArea(e[3], e[4], obj["Sliders"][key][1], obj["Sliders"][key][2], obj["Sliders"][key][3], obj["Sliders"][key][4]) then
  859.                                                 local xOfSlider, dolya = obj["Sliders"][key][1], obj["Sliders"][key][5]
  860.                                                 local currentPixels = e[3] - xOfSlider
  861.                                                 local currentValue = math.floor(currentPixels / dolya)
  862.                                                 --Костыль
  863.                                                 if e[3] == obj["Sliders"][key][3] then currentValue = objects[key][5] end
  864.                                                 objects[key][6] = currentValue
  865.                                                 displayObject(key)
  866.                                                 break
  867.                                         end
  868.                                 end
  869.                         end
  870.  
  871.                         if obj["Switches"] then
  872.                                 for key in pairs(obj["Switches"]) do
  873.                                         if ECSAPI.clickedAtArea(e[3], e[4], obj["Switches"][key][1], obj["Switches"][key][2], obj["Switches"][key][3], obj["Switches"][key][4]) then
  874.                                                 objects[key][6] = not objects[key][6]
  875.                                                 displayObject(key)
  876.                                                 break
  877.                                         end
  878.                                 end
  879.                         end
  880.  
  881.                 elseif e[1] == "scroll" then
  882.                         if obj["TextFields"] then
  883.                                 for key in pairs(obj["TextFields"]) do
  884.                                         if ECSAPI.clickedAtArea(e[3], e[4], obj["TextFields"][key][1], obj["TextFields"][key][2], obj["TextFields"][key][3], obj["TextFields"][key][4]) then
  885.                                                 if e[5] == 1 then
  886.                                                         if objects[key].displayFrom > 1 then objects[key].displayFrom = objects[key].displayFrom - 1; displayObject(key) end
  887.                                                 else
  888.                                                         if objects[key].displayFrom < #objects[key].strings then objects[key].displayFrom = objects[key].displayFrom + 1; displayObject(key) end
  889.                                                 end
  890.                                         end
  891.                                 end
  892.                         end
  893.                 elseif e[1] == "key_down" then
  894.                         if e[4] == 28 then
  895.                                 redrawBeforeClose()
  896.                                 return getReturn()
  897.                         end
  898.                 end
  899.         end
  900. end
  901.  
  902. --Демонстрационное окно, показывающее всю мощь universalWindow
  903. function ECSAPI.demoWindow()
  904.         --Очищаем экран перед юзанием окна и ставим курсор на 1, 1
  905.         ECSAPI.prepareToExit()
  906.         --Рисуем окно и получаем данные после взаимодействия с ним
  907.         local data = ECSAPI.universalWindow("auto", "auto", 36, 0xeeeeee, true, {"EmptyLine"}, {"CenterText", 0x880000, "Здорово, ебана!"}, {"EmptyLine"}, {"Input", 0x262626, 0x880000, "Сюда вводить можно"}, {"Selector", 0x262626, 0x880000, "Выбор формата", "PNG", "JPG", "GIF", "PSD"}, {"EmptyLine"}, {"WrappedText", 0x262626, "Тест автоматического переноса букв в зависимости от ширины данного окна. Пока что тупо режет на куски, не особо красиво."}, {"EmptyLine"}, {"Select", 0x262626, 0x880000, "Я пидор", "Я не пидор"}, {"Slider", 0x262626, 0x880000, 1, 100, 50, "Убито ", " младенцев"}, {"EmptyLine"}, {"Separator", 0xaaaaaa}, {"Switch", 0xF2B233, 0xffffff, 0x262626, "✈ Авиарежим", false}, {"EmptyLine"}, {"Switch", 0x3366CC, 0xffffff, 0x262626, "☾  Не беспокоить", true}, {"Separator", 0xaaaaaa},  {"EmptyLine"}, {"TextField", 5, 0xffffff, 0x262626, 0xcccccc, 0x3366CC, "Тест текстового информационного поля. По сути это тот же самый WrappedText, разве что эта хрень ограничена по высоте, и ее можно скроллить. Ну же, поскролль меня! Скролль меня полностью! Моя жадная пизда жаждет твой хуй!"}, {"EmptyLine"}, {"Button", {0x57A64E, 0xffffff, "Да"}, {0xF2B233, 0xffffff, "Нет"}, {0xCC4C4C, 0xffffff, "Отмена"}})
  908.         --Еще разок
  909.         ECSAPI.prepareToExit()
  910.         --Выводим данные
  911.         print(" ")
  912.         print("Вывод данных из окна:")
  913.         for i = 1, #data do print("["..i.."] = "..tostring(data[i])) end
  914.         print(" ")
  915. end
  916.  
  917. --[[
  918. Функция universalWindow(x, y, width, background, closeWindowAfter, ...)
  919.  
  920.         Это универсальная модульная функция для максимально удобного и быстрого отображения
  921.         необходимой вам информации. С ее помощью вводить данные с клавиатуры, осуществлять выбор
  922.         из предложенных вариантов, рисовать красивые кнопки, отрисовывать обычный текст,
  923.         отрисовывать текстовые поля с возможностью прокрутки, рисовать разделители и прочее.
  924.         Любой объект выделяется с помощью клика мыши, после чего функция приступает к работе
  925.         с этим объектом.
  926.  
  927. Аргументы функции:
  928.  
  929.         x и y: это числа, обозначающие стартовые координаты левого верхнего угла данного окна.
  930.         Вместо цифр вы также можете написать "auto" - и программа автоматически разместит окно
  931.         по центру экрана по выбранной координате. Или по обеим координатам, если вам угодно.
  932.          
  933.         width: это ширина окна, которую вы можете задать по собственному желанию. Если некторые
  934.         объекты требуют расширения окна, то окно будет автоматически расширено до нужной ширины.
  935.         Да, вот такая вот тавтология ;)
  936.  
  937.         background: базовый цвет окна (цвет фона, кому как понятнее).
  938.  
  939.         closeWindowAfter: eсли true, то окно по завершению функции будет выгружено, а на его месте
  940.         отрисуются пиксели, которые имелись на экране до выполнения функции. Удобно, если не хочешь
  941.         париться с перерисовкой интерфейса.
  942.  
  943.         ... : многоточием тут является перечень объектов, указанных через запятую. Каждый объект
  944.         является массивом и имеет собственный формат. Ниже перечислены все возможные типы объектов.
  945.                
  946.                 {"Button", {Цвет кнопки1, Цвет текста на кнопке1, Сам текст1}, {Цвет кнопки2, Цвет текста на кнопке2, Сам текст2}, ...}
  947.  
  948.                         Это объект для рисования кнопок. Каждая кнопка - это массив, состоящий из трех элементов:
  949.                         цвета кнопки, цвета текста на кнопке и самого текста. Кнопок может быть неограниченное количество,
  950.                         однако чем их больше, тем большее требуется разрешение экрана по ширине.
  951.  
  952.                         Интерактивный объект.
  953.  
  954.                 {"Input", Цвет рамки и текста, Цвет при выделении, Стартовый текст [, Маскировать символом]}
  955.  
  956.                         Объект для рисования полей ввода текстовой информации. Удобно для открытия или сохранения файлов,
  957.                         Опциональный аргумент "Маскировать символом" полезен, если вы делаете поле для ввода пароля.
  958.                         Никто не увидит ваш текст. В качестве данного аргумента передается символ, например "*".
  959.  
  960.                         Интерактивный объект.
  961.  
  962.                 {"Selector", Цвет рамки, Цвет при выделении, Выбор 1, Выбор 2, Выбор 3 ...}
  963.  
  964.                         Внешне схож с объектом "Input", однако в этом случае вы будете выбирать один из предложенных
  965.                         вариантов из выпадающего списка. По умолчанию выбран первый вариант.
  966.  
  967.                         Интерактивный объект.
  968.  
  969.                 {"Select", Цвет рамки, Цвет галочки, Выбор 1, Выбор 2, Выбор 3 ...}
  970.  
  971.                         Объект выбора. Отличается от "Selector" тем, что здесь вы выбираете один из вариантов, отмечая
  972.                         его галочкой. По умолчанию выбран первый вариант.
  973.  
  974.                         Интерактивный объект.
  975.  
  976.                 {"Slider", Цвет линии слайдера, Цвет пимпочки слайдера, Значения слайдера ОТ, Значения слайдера ДО, Текущее значение [, Текст-подсказка ДО] [, Текст-подсказка ПОСЛЕ]}
  977.  
  978.                         Ползунок, позволяющий задавать определенное количество чего-либо в указанном интервале. Имеются два
  979.                         опциональных аргумента, позволяющих четко понимать, с чем именно мы имеем дело.
  980.  
  981.                         К примеру, если аргумент "Текст-подсказка ДО" будет равен "Съедено ", а аргумент "Текст-подсказка ПОСЛЕ"
  982.                         будет равен " яблок", а значение слайдера будет равно 50, то на экране будет написано "Съедено 50 яблок".
  983.  
  984.                         Интерактивный объект.
  985.  
  986.                 {"Switch", Активный цвет, Пассивный цвет, Цвет текста, Текст, Состояние}
  987.  
  988.                          Переключатель, принимающий два состояния: true или false. Текст - это всего лишь информация, некое
  989.                          название данного переключателя.
  990.  
  991.                          Интерактивный объект.  
  992.  
  993.                 {"CenterText", Цвет текста, Сам текст}
  994.  
  995.                         Отображение текста указанного цвета по центру окна. Чисто для информативных целей.
  996.  
  997.                 {"WrappedText", Цвет текста, Текст}
  998.  
  999.                         Отображение большого количества текста с автоматическим переносом. Прото режет слова на кусочки,
  1000.                         перенос символический. Чисто для информативных целей.
  1001.  
  1002.         {"TextField", Высота, Цвет фона, Цвет текста, Цвет скроллбара, Цвет пимпочки скроллбара, Сам текст}
  1003.  
  1004.                 Текстовое поле с возможностью прокрутки. Отличается от "WrappedText"
  1005.                 фиксированной высотой. Чисто для информативных целей.
  1006.    
  1007.         {"Separator", Цвет разделителя}
  1008.  
  1009.                 Линия-разделитель, помогающая лучше отделять объекты друг от друга. Декоративный объект.
  1010.  
  1011.                 {"EmptyLine"}
  1012.  
  1013.                 Пустое пространство, помогающая лучше отделять объекты друг от друга. Декоративный объект.
  1014.  
  1015.                 Каждый из объектов рисуется по порядку сверху вниз. Каждый объект автоматически
  1016.                 увеличивает высоту окна до необходимого значения. Если объектов будет указано слишком много -
  1017.                 т.е. если окно вылезет за пределы экрана, то программа завершится с ошибкой.
  1018.  
  1019.         Что возвращает функция:
  1020.                
  1021.                 Возвратом является массив, пронумерованный от 1 до <количества объектов>.
  1022.                 К примеру, 1 индекс данного массива соответствует 1 указанному объекту.
  1023.                 Каждый индекс данного массива несет в себе какие-то данные, которые вы
  1024.                 внесли в объект во время работы функции.
  1025.                 Например, если в 1-ый объект типа "Input" вы ввели фразу "Hello world",
  1026.                 то первый индекс в возвращенном массиве будет равен "Hello world".
  1027.                 Конкретнее это будет вот так: massiv[1] = "Hello world".
  1028.  
  1029.                 Если взаимодействие с объектом невозможно - например, как в случае
  1030.                 с EmptyLine, CenterText, TextField или Separator, то в возвращенном
  1031.                 массиве этот объект указываться не будет.
  1032.  
  1033.                 Готовые примеры использования функции указаны ниже и закомментированы.
  1034.                 Выбирайте нужный и раскомментируйте.
  1035. ]]
  1036.  
  1037. --Функция-демонстратор, показывающая все возможные объекты в одном окне. Код окна находится выше.
  1038. --ECSAPI.demoWindow()
  1039.  
  1040. --Функция-отладчик, выдающая окно с указанным сообщением об ошибке. Полезна при дебаге.
  1041. --ECSAPI.error("Это сообщение об ошибке! Hello world!")
  1042.  
  1043. --Функция, спрашивающая, стоит ли заменять указанный файл, если он уже имеется
  1044. --ECSAPI.askForReplaceFile("OS.lua")
  1045.  
  1046. --Функция, предлагающая сохранить файл в нужном месте в нужном формате.
  1047. --ECSAPI.universalWindow("auto", "auto", 30, ECSAPI.windowColors.background, true, {"EmptyLine"}, {"CenterText", 0x262626, "Сохранить как"}, {"EmptyLine"}, {"Input", 0x262626, 0x880000, "Путь"}, {"Selector", 0x262626, 0x880000, "PNG", "JPG", "PSD"}, {"EmptyLine"}, {"Button", {0xbbbbbb, 0xffffff, "OK!"}})
  1048.  
  1049.  
  1050. ----------------------------------------------------------------------------------------------------
  1051.  
  1052.  
  1053. return ECSAPI

Share with your friends:

Print