Advertisement
Guest User

draw-plus.lua

a guest
May 29th, 2016
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 80.84 KB | None | 0 0
  1. local term = require("term")
  2. local comp = require("component")
  3. local keyboard = require("keyboard")
  4. local sh = require("shell")
  5. local fs = require("filesystem")
  6. local serial = require("serialization")
  7. local gpu = comp.gpu
  8. local event = require("event")
  9. term.clear()
  10.  
  11. local file = 1
  12. white = 0xFFFFFF
  13. black = 0x000000
  14. path = "/"..string.sub(sh.getWorkingDirectory(), 2, #sh.getWorkingDirectory() - 1)
  15.  
  16. screen = {}
  17.  
  18. function screen:newPane(object, w, h)
  19.     object = object or {}
  20.     setmetatable(object, self)
  21.     self.__index = self
  22.     object.width = w
  23.     object.height = h
  24.     object.colour = black
  25.     object.renderBool = true
  26.     object.isMoveable = true
  27.     object.textInputs = {}
  28.     object.textInputCount = 0
  29.     return object
  30. end
  31.  
  32. function screen:resize(w, h)
  33.     self.oldW = self.width
  34.     self.oldH = self.height
  35.     self.width = w
  36.     self.height = h
  37.     if self.boxTab ~= nil then
  38.         for i = 1, #self.boxTab do
  39.             if self.boxTab[i]["scaleable"] then
  40.                 self.boxTab[i]["width"] = self.width - (self.oldW - self.boxTab[i]["width"])
  41.                 if self.boxTab[i]["height"] ~= 1 then
  42.                     if self.boxTab[i]["height"] == self.oldH then
  43.                         self.boxTab[i]["height"] = self.height
  44.                     elseif self.boxTab[i]["height"] == self.oldH - 3 then
  45.                         self.boxTab[i]["height"] = self.height - 3
  46.                     else
  47.                         self.boxTab[i]["height"] = self.height - (self.oldH - self.boxTab[i]["height"])
  48.                     end
  49.                 end
  50.             end
  51.         end
  52.     end
  53.     if self.textInputs ~= nil then
  54.         for i = 1, #self.textInputs do
  55.             if self.textInputs[i]["scaleable"] then
  56.                 self.textInputs[i]["width"] = self.width - (self.oldW - self.textInputs[i]["width"])
  57.                 if self.textInputs[i]["height"] ~= 1 then
  58.                     if self.textInputs[i]["height"] == self.oldH then
  59.                         self.textInputs[i]["height"] = self.height
  60.                     elseif self.textInputs[i]["height"] == self.oldH - 3 then
  61.                         self.textInputs[i]["height"] = self.height - 3
  62.                     else
  63.                         self.textInputs[i]["height"] = self.height - (self.oldH - self.textInputs[i]["height"])
  64.                     end
  65.                 end
  66.             end
  67.         end
  68.     end
  69.     if self.buttonTab ~= nil then
  70.         for i = 1, #self.buttonTab do
  71.             if self.buttonTab[i]["label"] == "X" then
  72.                 self.buttonTab[i]["xPos"]  = self.width - 1
  73.             elseif self.buttonTab[i]["label"] == "^" then
  74.                 self.buttonTab[i]["xPos"]  = self.width - 2
  75.             elseif self.buttonTab[i]["label"] == "_" then
  76.                 self.buttonTab[i]["xPos"]  = self.width - 3
  77.             end
  78.         end
  79.     end
  80. end
  81.  
  82. function screen:move(newx, newy)
  83.     if self.isMoveable then
  84.         self.xPos = newx
  85.         self.yPos = newy
  86.     end
  87. end
  88.  
  89. function screen:center()
  90.     w, h = gpu.getResolution()
  91.     xOffset = math.floor((w - self.width) / 2)
  92.     yOffset = math.floor((h - self.height) / 2)
  93.     self:move(xOffset, yOffset)
  94. end
  95.  
  96. --TEXT FUNCTIONS
  97.  
  98. function screen:text(xText, yText, bgCol, tCol, newText, cent)
  99.     if newText == nil then return end
  100.     xText = xText - 1
  101.     yText = yText - 1
  102.     if self.printTab == nil then
  103.         self.printTab = {}
  104.         self.printCount = 0
  105.     end
  106.     self.printCount = self.printCount + 1
  107.     self.printTab[self.printCount] = {
  108.         xPos = xText,
  109.         yPos = yText,
  110.         bgCol = bgCol,
  111.         tCol = tCol,
  112.         text = newText,
  113.         }
  114.     if cent ~= nil then
  115.         self.printTab[self.printCount]["centre"] = true
  116.     else
  117.         self.printTab[self.printCount]["centre"] = true
  118.     end
  119. end
  120.  
  121. function screen:centerText(xStart, yLine, xEnd, bgCol, tCol, newText)
  122.     offset = math.floor((xEnd - #newText) / 2)
  123.     self:text(xStart + offset, yLine, bgCol, tCol, newText, "centre")
  124. end
  125.  
  126. --DRAW FUNCTIONS--
  127.  
  128. function screen:box(stx, sty, w, h, col, scale)
  129.     stx = stx - 1
  130.     sty = sty - 1
  131.     if self.boxTab == nil then
  132.         self.boxTab = {}
  133.         self.boxCount = 0
  134.     end
  135.     self.boxCount = self.boxCount + 1
  136.     self.boxTab[self.boxCount] = {
  137.         xPos = stx,
  138.         yPos = sty,
  139.         width = w,
  140.         height = h,
  141.         colour = col,
  142.         scaleable = false,
  143.         }
  144.     if scale ~= nil then
  145.         self.boxTab[self.boxCount]["scaleable"] = true
  146.     end
  147. end
  148.  
  149. --DATA READOUT FUNCTIONS--
  150.  
  151. function screen:addTextBox(identifier, xPos, yPos, width, height, bgCol, tCol)
  152.     if self.textBox == nil then
  153.         self.textBox = {}
  154.         self.textBoxCount = 0
  155.     end
  156.     self.textBoxCount = self.textBoxCount + 1
  157.     self:box(xPos, yPos, width, height, bgCol, "scale")
  158.     self.textBox[self.textBoxCount] = {
  159.         label = identifier,
  160.         xPos = xPos,
  161.         yPos = yPos,
  162.         width = width,
  163.         height = height,
  164.         bgCol = bgCol,
  165.         tCol = tCol,
  166.         selected = false,
  167.         lineCount = 0
  168.         }
  169.     self.textBox[self.textBoxCount]["line"] = {}
  170. end
  171.  
  172. function screen:printText(id, newText)
  173.     for i = 1, #self.textBox do
  174.         if id == self.textBox[i]["label"] then
  175.             self.textBox[i]["lineCount"] = self.textBox[i]["lineCount"] + 1
  176.             self.textBox[i]["line"][self.textBox[i]["lineCount"]] = newText
  177.             self.needRender = true
  178.             return true
  179.         end
  180.     end
  181. end
  182.  
  183. --BUTTON FUNCTIONS--
  184.  
  185. function screen:button(label, stx, sty, w, h, col, returnVal)
  186.     stx = stx - 1
  187.     sty = sty - 1
  188.     if self.buttonTab == nil then
  189.         self.buttonTab = {}
  190.         self.buttonCount = 0
  191.     end
  192.     self.buttonCount = self.buttonCount + 1
  193.     self.buttonTab[self.buttonCount] = {
  194.         label = label,
  195.         xPos = stx,
  196.         yPos = sty,
  197.         width = w,
  198.         height = h,
  199.         colour = col,
  200.         returnVal = returnVal,
  201.         }
  202. end
  203.  
  204. --SUBMENU FUNCTIONS--
  205.  
  206. function screen:addSubMenu(label)
  207.     if self.subTab == nil then
  208.         self.subTab = {}
  209.         self.subCount = 0
  210.     end
  211.     self.subCount = self.subCount + 1
  212.     self.subTab[self.subCount] = {
  213.         label = label,
  214.         open = false,
  215.         }
  216. end
  217.  
  218. function screen:addSubMenuItem(subMenuLabel, newEntry, retVal)
  219.     for i = 1, #self.subTab do
  220.         if self.subTab[i]["label"] == subMenuLabel then
  221.             if self.subTab[i]["entries"] == nil then
  222.                 self.subTab[i]["entries"] = {}
  223.                 self.subTab[i]["entryCount"] = 0
  224.             end
  225.             self.subTab[i]["entryCount"] = self.subTab[i]["entryCount"] + 1
  226.             self.subTab[i]["entries"][self.subTab[i]["entryCount"]] = {
  227.                 label = newEntry,
  228.                 returnVal = retVal,
  229.                 }
  230.             return true
  231.         end
  232.     end
  233. end
  234.  
  235. --TEXT INPUT FUNCTIONS--
  236.  
  237. function screen:inputBox(identifier, xPos, yPos, width, height, scale)
  238.     xPos = xPos - 1
  239.     yPos = yPos - 1
  240.     self.textInputCount = self.textInputCount + 1
  241.     self:box(xPos + 1, yPos + 1, width, height, white)
  242.     self.textInputs[self.textInputCount] = {
  243.         label = identifier,
  244.         xPos = xPos,
  245.         yPos = yPos,
  246.         width = width,
  247.         height = height,
  248.         scaleable = false,
  249.         bgCol = white,
  250.         fgCol = black,
  251.         selected = false,
  252.         cursorX = 1,
  253.         cursorY = 1,
  254.         }
  255.     self.textInputs[self.textInputCount]["text"] = {}
  256.     if scale ~= nil then
  257.         self.textInputs[self.textInputCount]["scaleable"] = true
  258.         self:box(xPos + 1, yPos + 1, width, height, white, "scale")
  259.     else
  260.         self:box(xPos + 1, yPos + 1, width, height, white)
  261.     end
  262. end
  263.  
  264. function screen:addText(char)
  265.     for i = 1, #self.textInputs do
  266.         gpu.setBackground(self.textInputs[i]["bgCol"])
  267.         gpu.setForeground(self.textInputs[i]["fgCol"])
  268.         if self.textInputs[i]["selected"] then
  269.             if char == "enter" then
  270.                 if self.textInputs[i]["height"] > 1 then
  271.                     gpu.set(self.xPos + (self.textInputs[i]["xPos"] + (self.textInputs[i]["cursorX"] - 1)), self.yPos + (self.textInputs[i]["yPos"] + (self.textInputs[i]["cursorY"] - 1)), " ")
  272.                     if self.textInputs[i]["text"][self.textInputs[i]["cursorY"]] == nil then
  273.                         self.textInputs[i]["text"][self.textInputs[i]["cursorY"]] = " "
  274.                     end
  275.                     self.textInputs[i]["cursorX"] = 1
  276.                     self.textInputs[i]["cursorY"] = self.textInputs[i]["cursorY"] + 1
  277.                     gpu.set(self.xPos + (self.textInputs[i]["xPos"] + (self.textInputs[i]["cursorX"] - 1)), self.yPos + (self.textInputs[i]["yPos"] + (self.textInputs[i]["cursorY"] - 1)), "_")
  278.                 end
  279.                 if self.textInputs[i]["label"] == "address" then
  280.                     --add some code to launch folder addresses for explorer panes.
  281.                 end
  282.                 gpu.setBackground(black)
  283.                 gpu.setForeground(white)
  284.                 return true
  285.             elseif char == "back" then
  286.                 if self.textInputs[i]["cursorX"] > 1 then
  287.                     gpu.set(self.xPos + (self.textInputs[i]["xPos"] + (self.textInputs[i]["cursorX"] - 1)), self.yPos + (self.textInputs[i]["yPos"] + (self.textInputs[i]["cursorY"] - 1)), " ")
  288.                     self.textInputs[i]["cursorX"] = self.textInputs[i]["cursorX"] - 1
  289.                     gpu.set(self.xPos + (self.textInputs[i]["xPos"] + (self.textInputs[i]["cursorX"] - 1)), self.yPos + (self.textInputs[i]["yPos"] + (self.textInputs[i]["cursorY"] - 1)), "_")
  290.                     self.textInputs[i]["text"][self.textInputs[i]["cursorY"]] = string.sub(self.textInputs[i]["text"][self.textInputs[i]["cursorY"]], 1, #self.textInputs[i]["text"][self.textInputs[i]["cursorY"]] - 1)
  291.                 else
  292.                     if self.textInputs[i]["cursorY"] > 1 then
  293.                         self.textInputs[i]["text"][self.textInputs[i]["cursorY"]] = nil
  294.                         gpu.set(self.xPos + (self.textInputs[i]["xPos"] + (self.textInputs[i]["cursorX"] - 1)), self.yPos + (self.textInputs[i]["yPos"] + (self.textInputs[i]["cursorY"] - 1)), " ")
  295.                         self.textInputs[i]["cursorY"] = self.textInputs[i]["cursorY"] - 1
  296.                         if self.textInputs[i]["text"][self.textInputs[i]["cursorY"]] ~= nil then
  297.                             self.textInputs[i]["cursorX"] = #self.textInputs[i]["text"][self.textInputs[i]["cursorY"]] + 1
  298.                         else
  299.                             self.textInputs[i]["cursorX"] = 1
  300.                         end
  301.                         gpu.set(self.xPos + (self.textInputs[i]["xPos"] + (self.textInputs[i]["cursorX"] - 1)), self.yPos + (self.textInputs[i]["yPos"] + (self.textInputs[i]["cursorY"] - 1)), "_")
  302.                     end
  303.                 end
  304.                 gpu.setBackground(black)
  305.                 gpu.setForeground(white)
  306.                 return true
  307.             elseif char == "LSHIFT" or char == "RSHIFT" then
  308.                 return true
  309.             else
  310.                 if char == "space" then char = " " end
  311.                 if char == "1" and keyboard.isShiftDown() == true then char = "!" end
  312.                 if char == "2" and keyboard.isShiftDown() == true then char = "\"" end
  313.                 if char == "3" and keyboard.isShiftDown() == true then char = "#" end
  314.                 if char == "4" and keyboard.isShiftDown() == true then char = "~" end
  315.                 if char == "5" and keyboard.isShiftDown() == true then char = "%" end
  316.                 if char == "6" and keyboard.isShiftDown() == true then char = "^" end
  317.                 if char == "7" and keyboard.isShiftDown() == true then char = "&" end
  318.                 if char == "8" and keyboard.isShiftDown() == true then char = "*" end
  319.                 if char == "9" and keyboard.isShiftDown() == true then char = "(" end
  320.                 if char == "0" and keyboard.isShiftDown() == true then char = ")" end
  321.                 if char == "period" then char = "." end
  322.                 if char == "numpaddecimal" then char = "." end
  323.                 if char == "PERIOD" then char = ">" end
  324.                 if char == "comma" then char = "," end
  325.                 if char == "COMMA" then char = "<" end
  326.                 if char == "apostrophe" then char = "'" end
  327.                 if char == "AT" then char = "@" end
  328.                 if char == "semicolon" then char = ";" end
  329.                 if char == "COLON" then char = ":" end
  330.                 if char == "slash" then char = "/" end
  331.                 if char == "SLASH" then char = "?" end
  332.                 if char == "lbracket" then char = "[" end
  333.                 if char == "LBRACKET" then char = "{" end
  334.                 if char == "rbracket" then char = "]" end
  335.                 if char == "RBRACKET" then char = "}" end
  336.                 if char == "UNDERLINE" then char = "_" end
  337.                 if char == "equals" then char = "=" end
  338.                 if char == "EQUALS" then char = "+" end
  339.                 if char == "numpadadd" then char = "+" end
  340.                 if char == "minus" or char == "numpadminus" then char = "-" end
  341.                 if char == "numpadmul" then char = "*" end
  342.                 if char == "CIRCUMFLEX" then char = "^" end
  343.                 if char == nil then char = " " end
  344.                 if #char > 1 then char = string.sub(char, 1, 1) end
  345.                 if self.textInputs[i]["text"][self.textInputs[i]["cursorY"]] ~= nil then
  346.                     self.textInputs[i]["text"][self.textInputs[i]["cursorY"]] = self.textInputs[i]["text"][self.textInputs[i]["cursorY"]]..char
  347.                 else
  348.                     self.textInputs[i]["text"][self.textInputs[i]["cursorY"]] = char
  349.                 end
  350.                 if self.textInputs[i]["label"] == "password" then
  351.                     gpu.set(self.xPos + (self.textInputs[i]["xPos"] + (self.textInputs[i]["cursorX"] - 1)), self.yPos + (self.textInputs[i]["yPos"] + (self.textInputs[i]["cursorY"] - 1)), "*")
  352.                 else
  353.                     if self.textInputs[i]["cursorX"] < self.textInputs[i]["width"] - 1 then
  354.                         gpu.set(self.xPos + (self.textInputs[i]["xPos"] + (self.textInputs[i]["cursorX"] - 1)), self.yPos + (self.textInputs[i]["yPos"] + (self.textInputs[i]["cursorY"] - 1)), char)
  355.                         gpu.set(self.xPos + (self.textInputs[i]["xPos"] + self.textInputs[i]["cursorX"]), self.yPos + (self.textInputs[i]["yPos"] + (self.textInputs[i]["cursorY"] - 1)), "_")
  356.                         gpu.setBackground(black)
  357.                         gpu.setForeground(white)
  358.                     end
  359.                 end
  360.                 self.textInputs[i]["cursorX"] = self.textInputs[i]["cursorX"] + 1
  361.                 return true
  362.             end
  363.         end
  364.     end
  365.     gpu.setBackground(black)
  366.     gpu.setForeground(white)
  367.     return false
  368. end
  369.  
  370. --FILE SYSTEM FUNCTIONS--
  371.  
  372. function screen:addFileViewer(xPos, yPos, w, h, col, path)
  373.     xPos = xPos - 1
  374.     yPos = yPos - 1
  375.     if self.fileViewer == nil then
  376.         self.fileViewer = {}
  377.         self.fvCount = 0
  378.     end
  379.     self.fvCount = self.fvCount + 1
  380.     self.fileViewer[self.fvCount] = {
  381.         xPos = xPos,
  382.         yPos = yPos,
  383.         width = w,
  384.         height = h,
  385.         colour = col,
  386.         path = path,
  387.         }
  388.     self.fileViewer[self.fvCount]["list"] = {}
  389.     self.fileViewer[self.fvCount]["list"] = self:assembleFileTable(path)
  390. end
  391.    
  392. function screen:assembleFileTable(path)
  393.     local alphaString = "0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"
  394.     local pathList, error = fs.list(path)
  395.     local dataTab = {}
  396.     i = 0
  397.     for key in pathList do
  398.         i = i + 1
  399.         if string.sub(key, #key, #key) == "/" then
  400.             key = string.sub(key, 1, #key - 1)
  401.         end
  402.         dataTab[i] = key
  403.     end
  404.     local returnTab = {}
  405.     local rtCount = 0
  406.     for l = 1, #alphaString do
  407.         for i = 1, #dataTab do
  408.             if dataTab[i] ~= nil then
  409.                 if fs.isDirectory(path..dataTab[i]) then
  410.                     if string.sub(dataTab[i], 1, 1) == string.sub(alphaString, l, l) then
  411.                         rtCount = rtCount + 1
  412.                         returnTab[rtCount] = dataTab[i]
  413.                         --dataTab[i] = nil
  414.                         i = i - 1
  415.                     end
  416.                 end
  417.             end
  418.         end
  419.     end
  420.     for l = 1, #alphaString do
  421.         for i = 1, #dataTab do
  422.             if dataTab[i] ~= nil then
  423.                 if not fs.isDirectory(path..dataTab[i]) then
  424.                     if string.sub(dataTab[i], 1, 1) == string.sub(alphaString, l, l) then
  425.                         rtCount = rtCount + 1
  426.                         returnTab[rtCount] = dataTab[i]
  427.                         --dataTab[i] = nil
  428.                         i = i - 1
  429.                         break
  430.                     end
  431.                 end
  432.             end
  433.         end
  434.     end
  435.     return returnTab
  436. end
  437.  
  438. --IMAGE FUNCTIONS--
  439.  
  440. function screen:newImage(label, xPos, yPos, sizeX, sizeY, trans)
  441.     if self.imTab == nil then
  442.         self.imTab = {}
  443.         self.imCount = 0
  444.     end
  445.     self.imCount = self.imCount + 1
  446.     self.imTab[self.imCount] = {
  447.         label = label,
  448.         xPos = xPos,
  449.         yPos = yPos,
  450.         width = sizeX,
  451.         height = sizeY,
  452.         hidden = false,
  453.         trans = trans,
  454.         layers = 1,
  455.         pages = 1,
  456.     }
  457.     self.imTab[self.imCount]["layerData"] = {}
  458.     self.imTab[self.imCount]["layerData"][1] = {}
  459.     self.imTab[self.imCount]["layerData"][1]["hidden"] = false
  460.     for i = sizeY, 1, -1 do
  461.         self.imTab[self.imCount]["layerData"][1][i] = {}
  462.         for j = 1, sizeX do
  463.             self.imTab[self.imCount]["layerData"][1][i][j] = {
  464.                 fg = black,
  465.                 bg = white,
  466.                 char = " ",
  467.             }
  468.         end
  469.     end
  470. end
  471.  
  472. function screen:newImageLayer(label)
  473.     local id = 0
  474.     for i = 1, #self.imTab do
  475.         if self.imTab[i]["label"] == label then
  476.             id = i
  477.             break
  478.         end
  479.     end
  480.     if id == 0 then return false end
  481.     self.imTab[id]["layers"] = self.imTab[id]["layers"] + 1
  482.     self.imTab[id]["layerData"][self.imTab[id]["layers"]] = {}
  483.     self.imTab[id]["layerData"][self.imTab[id]["layers"]]["hidden"] = false
  484.     for y = self.imTab[id]["height"], 1, -1 do
  485.         self.imTab[id]["layerData"][self.imTab[id]["layers"]][y] = {}
  486.         for x = 1, self.imTab[id]["width"] do
  487.             self.imTab[id]["layerData"][self.imTab[id]["layers"]][y][x] = {
  488.                 bg = "trans",
  489.                 fg = 0xFFFFFF,
  490.                 char = " ",
  491.                 }
  492.         end
  493.     end
  494.     if self.imTab[id]["layers"] % 10 == 0 then
  495.         self.imTab[id]["pages"] = self.imTab[id]["pages"] + 1
  496.     end
  497. end
  498.  
  499. function screen:saveImage(label, path)
  500.     if self.imTab ~= nil then
  501.         local imId = 0
  502.         for i = 1, #self.imTab do
  503.             if self.imTab[i]["label"] == label then
  504.                 file = io.open(path, "w")
  505.                 file:write(serial.serialize(self.imTab[i]))
  506.                 file:close()
  507.                 return true
  508.             end
  509.         end
  510.     end
  511.     return false
  512. end
  513.  
  514. function screen:loadImage(label, path, x, y)
  515.     x = x - 1
  516.     y = y - 1
  517.     if fs.exists(path) then
  518.         if self.imTab == nil then
  519.             self.imTab = {}
  520.             self.imCount = 0
  521.         end
  522.         self.imCount = self.imCount + 1
  523.         file = io.open(path, "r")
  524.         self.imTab[self.imCount] = serial.unserialize(file:read("*all"))
  525.         file:close()
  526.         self.imTab[self.imCount]["xPos"] = x
  527.         self.imTab[self.imCount]["yPos"] = y
  528.         return true
  529.     end
  530.     return false
  531. end
  532.  
  533. --RENDER FUNCTIONS--
  534.  
  535. function screen:renderBoxes()
  536.     if self.boxTab ~= nil then
  537.         for i = 1, #self.boxTab do
  538.             gpu.setBackground(self.boxTab[i]["colour"])
  539.             gpu.fill(self.xPos + self.boxTab[i]["xPos"], self.yPos + self.boxTab[i]["yPos"], self.boxTab[i]["width"], self.boxTab[i]["height"], " ")
  540.         end
  541.     end
  542.     gpu.setBackground(0x000000)
  543.     gpu.setForeground(0xFFFFFF)
  544. end
  545.  
  546. function screen:renderText()
  547.     if self.printTab ~= nil then
  548.         for i = 1, #self.printTab do
  549.             gpu.setBackground(self.printTab[i]["bgCol"])
  550.             gpu.setForeground(self.printTab[i]["tCol"])
  551.             gpu.set(self.xPos + self.printTab[i]["xPos"], self.yPos + self.printTab[i]["yPos"], self.printTab[i]["text"])
  552.         end
  553.     end
  554.     gpu.setBackground(0x000000)
  555.     gpu.setForeground(0xFFFFFF)
  556. end
  557.  
  558. function screen:renderTextBoxes()
  559.     if self.textBox ~= nil then
  560.         for i = 1, #self.textBox do
  561.             gpu.setBackground(self.textBox[i]["bgCol"])
  562.             gpu.setForeground(self.textBox[i]["tCol"])
  563.             if self.textBox[i]["lineCount"] >= self.textBox[i]["height"] then
  564.                 startLine = #self.textBox[i]["line"] - (self.textBox[i]["height"] - 2)
  565.             else
  566.                 startLine = 1
  567.             end
  568.             curLine = 0
  569.             for j = startLine, #self.textBox[i]["line"] do
  570.                 printLine = self.textBox[i]["line"][j]
  571.                 if #printLine > self.textBox[i]["width"] then
  572.                     printLine = string.sub(printLine, #printLine - self.textInputs[i]["width"], #printLine)
  573.                 end
  574.                 gpu.set(self.xPos + self.textBox[i]["xPos"], self.yPos + (self.textBox[i]["yPos"] + (curLine)), printLine)
  575.                 curLine = curLine + 1
  576.             end
  577.         end
  578.     end
  579.     gpu.setBackground(0x000000)
  580.     gpu.setForeground(0xFFFFFF)
  581. end
  582.  
  583. function screen:renderButtons()
  584.     if self.buttonTab ~= nil then
  585.         gpu.setForeground(black)
  586.         for i = 1, #self.buttonTab do
  587.             gpu.setBackground(self.buttonTab[i]["colour"])
  588.             gpu.fill(self.xPos + self.buttonTab[i]["xPos"], self.yPos + self.buttonTab[i]["yPos"], self.buttonTab[i]["width"], self.buttonTab[i]["height"], " ")
  589.             midLine = math.floor(self.buttonTab[i]["height"] / 2)
  590.             printLine = self.buttonTab[i]["label"]
  591.             if #printLine > self.buttonTab[i]["width"] then
  592.                 printLine = string.sub(printLine, 1, self.buttonTab[i]["width"])
  593.             end
  594.             offset = math.floor((self.buttonTab[i]["width"] - #printLine) / 2)
  595.             gpu.set(self.xPos + (self.buttonTab[i]["xPos"] + offset), self.yPos + (self.buttonTab[i]["yPos"] + midLine), printLine)
  596.         end
  597.     end
  598.     gpu.setBackground(0x000000)
  599.     gpu.setForeground(0xFFFFFF)
  600. end
  601.  
  602. function screen:renderTextInputs()
  603.     if self.textInputs ~= nil then
  604.         for i = 1, #self.textInputs do
  605.             if self.textInputs[i]["text"] ~= nil then
  606.                 gpu.setBackground(self.textInputs[i]["bgCol"])
  607.                 gpu.setForeground(self.textInputs[i]["fgCol"])
  608.                 if self.textInputs[i]["cursorY"] > self.textInputs[i]["height"] then
  609.                     startLine = self.textInputs[i]["cursorY"] - self.textInputs[i]["height"]
  610.                 else
  611.                     startLine = 1
  612.                 end
  613.                 for j = startLine, #self.textInputs[i]["text"] do
  614.                     printLine = self.textInputs[i]["text"][j]
  615.                     if #printLine > self.textInputs[i]["width"] then
  616.                         printLine = string.sub(printLine, #printLine - (self.textInputs[i]["width"] - 2), #printLine)
  617.                     end
  618.                     if self.textInputs[i]["label"] ~= "password" then
  619.                         gpu.set(self.xPos + self.textInputs[i]["xPos"], self.yPos + (self.textInputs[i]["yPos"] + (j - 1)), printLine)
  620.                     else
  621.                         for k = 1, #printLine do
  622.                             gpu.set(self.xPos + (self.textInputs[i]["xPos"] + (k - 1)), self.yPos + self.textInputs[i]["yPos"], "*")
  623.                         end
  624.                     end
  625.                 end
  626.             end
  627.         end
  628.     end
  629.     gpu.setBackground(0x000000)
  630.     gpu.setForeground(0xFFFFFF)
  631. end
  632.  
  633. function screen:renderSubMenus()
  634.     if self.subTab ~= nil then
  635.         local w, h = gpu.getResolution()
  636.         local newOffset = 2
  637.         for i = 1, #self.subTab do
  638.             if self.subTab[i]["open"] then
  639.                 gpu.setBackground(0x666666)
  640.                 gpu.setForeground(0x000000)
  641.                 gpu.set(self.xPos + newOffset, self.yPos + 1, self.subTab[i]["label"])
  642.                 gpu.setBackground(0x999999)
  643.                 gpu.setForeground(0x000000)
  644.                 local maxLength = 0
  645.                 for j = 1, #self.subTab[i]["entries"] do
  646.                     if #self.subTab[i]["entries"][j]["label"] > maxLength then
  647.                         maxLength = #self.subTab[i]["entries"][j]["label"]
  648.                     end
  649.                 end
  650.                 gpu.fill(self.xPos + newOffset, self.yPos + 2, maxLength + 1, #self.subTab[i]["entries"], " ")
  651.                 for j = 1, #self.subTab[i]["entries"] do
  652.                     if self.yPos > h / 2 then
  653.                         gpu.set(self.xPos + newOffset, self.yPos - (j + 1), self.subTab[i]["entries"][j]["label"])
  654.                     else
  655.                         gpu.set(self.xPos + newOffset, self.yPos + (j + 1), self.subTab[i]["entries"][j]["label"])
  656.                     end
  657.                 end
  658.             else
  659.                 gpu.setBackground(0x999999)
  660.                 gpu.setForeground(0x000000)
  661.                 gpu.set(self.xPos + newOffset, self.yPos + 1, self.subTab[i]["label"])
  662.             end
  663.             newOffset = newOffset + (#self.subTab[i]["label"] + 1)
  664.         end
  665.     end
  666.     gpu.setBackground(0x000000)
  667.     gpu.setForeground(0xFFFFFF)
  668. end
  669.  
  670. function screen:renderFileLists()
  671.     if self.fileViewer ~= nil then
  672.         gpu.setForeground(white)
  673.         gpu.setForeground(black)
  674.         for i = 1, #self.fileViewer do
  675.             gpu.setBackground(white)
  676.             gpu.fill(self.xPos + self.fileViewer[i]["xPos"], self.yPos + self.fileViewer[i]["yPos"], self.fileViewer[i]["width"], self.fileViewer[i]["height"], " ")
  677.             for j = 1, #self.fileViewer[i]["list"] do
  678.                 if fs.isDirectory(self.fileViewer[i]["path"]..self.fileViewer[i]["list"][j].."/") then
  679.                     gpu.setBackground(0xFF9900)
  680.                     gpu.set(self.xPos + self.fileViewer[i]["xPos"], self.yPos + (self.fileViewer[i]["yPos"] + j), "¬")
  681.                 else
  682.                     gpu.setBackground(0xCCCCCC)
  683.                     gpu.set(self.xPos + self.fileViewer[i]["xPos"], self.yPos + (self.fileViewer[i]["yPos"] + j), "=")
  684.                 end
  685.                 gpu.setBackground(0xFFFFFF)
  686.                 gpu.set(self.xPos + (self.fileViewer[i]["xPos"] + 1), self.yPos + (self.fileViewer[i]["yPos"] + j), self.fileViewer[i]["list"][j])
  687.             end
  688.         end
  689.     end
  690.     gpu.setBackground(0x000000)
  691.     gpu.setForeground(0xFFFFFF)
  692. end
  693.  
  694. function screen:compileLineTable(id, layer, line)
  695.     local curBg = self.imTab[id]["layerData"][layer][line][1]["bg"]
  696.     local curFg = self.imTab[id]["layerData"][layer][line][1]["fg"]
  697.     local curSt = self.imTab[id]["layerData"][layer][line][1]["char"]
  698.     local stx = self.xPos + (self.imTab[id]["xPos"] - 1)
  699.     local sty = self.yPos + ((self.imTab[id]["yPos"] - 1) + (line - 1))
  700.     local colCount = 0
  701.     local pTab = {}
  702.     for i = 1, #self.imTab[id]["layerData"][layer][line] do
  703.         curBg = self.imTab[id]["layerData"][layer][line][i]["bg"]
  704.         curFg = self.imTab[id]["layerData"][layer][line][i]["fg"]
  705.         curSt = self.imTab[id]["layerData"][layer][line][i]["char"]
  706.         if curBg == "trans" then
  707.             for x = layer, 1, -1 do
  708.                 if not self.imTab[id]["layerData"][x]["hidden"] then
  709.                     if self.imTab[id]["layerData"][x][line][i]["bg"] ~= "trans" then
  710.                         curBg = self.imTab[id]["layerData"][x][line][i]["bg"]
  711.                     end
  712.                 elseif self.running then
  713.                     if x == 1 then
  714.                         curBg = self.imTab[id]["layerData"][x][line][i]["bg"]
  715.                     end
  716.                 end
  717.             end
  718.         end
  719.         if i == 1 or curBg ~= pTab[colCount]["bg"] or curFg ~= pTab[colCount]["fg"] then
  720.             colCount = colCount + 1
  721.             pTab[colCount] = {
  722.                 bg = curBg,
  723.                 fg = curFg,
  724.                 st = curSt,
  725.                 yp = sty,
  726.                 xp = stx,
  727.             }
  728.         else
  729.             pTab[colCount]["st"] = pTab[colCount]["st"]..curSt
  730.         end
  731.         stx = stx + 1
  732.     end
  733.     return(pTab)
  734. end
  735.  
  736. function screen:renderImages()
  737.     local prTab = 0
  738.     if self.imTab ~= nil then
  739.         for i = 1, #self.imTab do
  740.             for l = 1, #self.imTab[i]["layerData"] do
  741.                 if not self.imTab[i]["layerData"][l]["hidden"] then
  742.                     for r = #self.imTab[i]["layerData"][l], 1, -1 do
  743.                         prTab = self:compileLineTable(i, l, r)
  744.                         for p = 1, #prTab do
  745.                             if prTab[p]["bg"] ~= "trans" then
  746.                                 gpu.setBackground(prTab[p]["bg"])
  747.                                 gpu.setForeground(prTab[p]["fg"])
  748.                                 gpu.set(prTab[p]["xp"], prTab[p]["yp"], prTab[p]["st"])
  749.                             end
  750.                         end
  751.                     end
  752.                 end
  753.             end
  754.         end
  755.     end
  756. end
  757.  
  758. function screen:render()
  759.     if not self.renderBool then return end
  760.     self:renderBoxes()
  761.     self:renderTextBoxes()
  762.     self:renderButtons()
  763.     self:renderTextInputs()
  764.     self:renderSubMenus()
  765.     self:renderFileLists()
  766.     self:renderImages()
  767.     self:renderText()
  768. end
  769.  
  770. --PAINT PROGRAM START--
  771.  
  772. --CONSTANTS--
  773.  
  774. scrx, scry = gpu.getResolution()
  775. local buttonWidth = 20
  776. local vTab = {
  777.     [1] = "00",
  778.     [2] = "33",
  779.     [3] = "66",
  780.     [4] = "99",
  781.     [5] = "CC",
  782.     [6] = "FF",
  783.     }
  784.  
  785. --ARGUMENTS--
  786.  
  787. args = {...}
  788. filename = args[1]
  789. width = tonumber(args[2])
  790. height = tonumber(args[3])
  791. if filename == nil then filename = "Untitled" end
  792. if width == nil then width = scrx end
  793. if height == nil then height = scry end
  794.  
  795. --VARIABLES--
  796.  
  797. local fgCur = 0x000000
  798. local fgLast = 0x000000
  799. local bgCur = 0xFFFFFF
  800. local bgLast = 0xFFFFFF
  801. local charCur = " "
  802. local charLast = " "
  803. local activeLayer = 1
  804. local activePalette = 1
  805. local activePalette = 1
  806. local pEntry = 1
  807. local fgBool = false
  808. local bgBool = true
  809. local charBool = false
  810. local menuBool = true
  811. local paletteBool = false
  812. local colourBool = false
  813. local browserBool = false
  814. local toolBool = false
  815. local layerBool = false
  816. local playerBool = false
  817. local rcl = screen:newPane(rcl, 15, 14)
  818. local pTab = screen:newPane(pTab, 28, 14)
  819. local colour = screen:newPane(colour, 13, 14)
  820. local tools = screen:newPane(tools, 15, 14)
  821. local layers = screen:newPane(layers, 15, 19)
  822. local player = screen:newPane(player, 15, 6)
  823.  
  824. --OBJECT CALL FUNCTIONS--
  825.  
  826. function newImage(sizeX, sizeY)
  827.     local ob = screen:newPane(ob, sizeX, sizeY)
  828.     ob:newImage(filename, 1, 1, sizeX, sizeY)
  829.     ob:center()
  830.     return(ob)
  831. end
  832.  
  833. function newLayer() --needs writing.
  834.    
  835. end
  836.  
  837. function rClickMenuSetup()
  838.     rcl:box(1, 1, rcl.width, rcl.height, 0x999999)
  839.     rcl:box(1, 1, rcl.width, 1, 0x00CCCC)
  840.     rcl:centerText(1, 1, rcl.width, 0x00CCCC, 0x000000, "Menu")
  841.     rcl.xPos = 1
  842.     rcl.yPos = 1
  843. end
  844.  
  845. function paletteSetup()
  846.     pTab.xPos = scrx - pTab.width
  847.     pTab.yPos = 1
  848.     pTab:box(1, 1, pTab.width, pTab.height, 0x999999)
  849.     pTab:box(1, 1, pTab.width, 1, 0x00CCCC)
  850.     pTab:centerText(1, 1, pTab.width, 0x00CCCC, 0x000000, "Colour Palette")
  851.     pTab.pCount = 1
  852.     pTab.list = {}
  853.     pTab.list[1] = {}
  854.     pTab.list[1][1] = 0x000000
  855.     pTab.list[1][2] = 0xFFFFFF
  856.     pTab.list[1][3] = 0xFF0000
  857.     pTab.list[1][4] = 0x00FF00
  858.     pTab.list[1][5] = 0x0000FF
  859.     pTab.list[1][6] = 0xFF00FF
  860.     pTab.list[1][7] = 0xFFFF00
  861.     pTab.list[1][8] = 0x00FFFF
  862.     pTab.list[1][9] = 0x00CCCC
  863. end
  864.  
  865. function newPalette()
  866.     pTab.pCount = pTab.pCount + 1
  867.     pTab.list[pTab.pCount] = {}
  868.     for i = 1, 9 do
  869.         pTab.list[pTab.pCount][i] = 0xFFFFFF
  870.     end
  871. end
  872.  
  873. function colourSetup()
  874.     colour:center()
  875.     colour:box(1, 1, colour.width, colour.height, 0x999999)
  876.     colour:box(1, 1, colour.width, 1, 0x00CCCC)
  877.     colour:centerText(1, 1, colour.width, 0x00CCCC, 0x000000, "RGB Edit")
  878.     colour.rVal = 6
  879.     colour.gVal = 6
  880.     colour.bVal = 6
  881. end
  882.  
  883. function toolBox()
  884.     tools:center()
  885.     tools:box(1, 1, tools.width, tools.height, 0x999999, "scale")
  886.     tools:box(1, 1, tools.width, 1, 0x00CCCC, "scale")
  887.     tools:centerText(1, 1, tools.width, 0x00CCCC, 0x000000, "Tools")
  888.     tools.brush = {
  889.         active = true,
  890.         sizeX = 1,
  891.         sizeY = 1,
  892.     }
  893.     tools.line = {
  894.         active = false,
  895.         startx = 0,
  896.         starty = 0,
  897.         endx = 0,
  898.         endy = 0,
  899.     }
  900.     tools.boxTool = {
  901.         active = false,
  902.         startx = 0,
  903.         starty = 0,
  904.         endx = 0,
  905.         endy = 0,
  906.     }
  907.     tools.circle = {
  908.         active = false,
  909.         radius = 1,
  910.         solid = false,
  911.     }
  912. end
  913.  
  914. function fileBrowser(col, name)
  915.     local object = screen:newPane(object, 30, 15)
  916.     object.selected = false
  917.     object.priority = 9
  918.     object.label = name
  919.     object.isPane = true
  920.     object.colour = col
  921.     object:center()
  922.     object:box(1, 1, object.width, object.height, 0x999999, "scale")
  923.     object:box(1, 1, object.width, 1, col, "scale")
  924.     object:centerText(1, 1, object.width, col, 0x000000, object.label)
  925.     object:box(2, 5, object.width - 2, object.height - 5, 0xFFFFFF, "scale")
  926.     object:addFileViewer(2, 5, object.width - 2, object.height - 5, 0xFFFFFF, path.."/Images/")
  927.     object:text(2, 3, 0x999999, 0x000000, "Path:")
  928.     object:inputBox("address", 8, 3, object.width - 10, 1, "scale")
  929.     object:button("^", object.width - 2, 3, 1, 1, 0x00CCCC, "navigate_up")
  930.     object.textInputs[1]["text"][1] = object.fileViewer[1]["path"]
  931.     object.fileViewer[1]["list"] = object:assembleFileTable(object.fileViewer[1]["path"])
  932.     object.textInputs[1]["cursorX"] = #object.textInputs[1]["text"][1] + 1
  933.     return object
  934. end
  935.  
  936. function layerTool()
  937.     layers:center()
  938.     layers:box(1, 1, layers.width, layers.height, 0x999999, "scale")
  939.     layers:box(1, 1, layers.width, 1, 0x00CCCC, "scale")
  940.     layers:centerText(1, 1, layers.width, 0x00CCCC, 0x000000, "Layers")
  941.     layers.lPage = 1
  942.     layers.transBool = false
  943. end
  944.  
  945. function initPlayer()
  946.     player:center()
  947.     player:box(1, 1, player.width, player.height, 0x999999, "scale")
  948.     player:box(1, 1, player.width, 1, 0x00CCCC, "scale")
  949.     player:centerText(1, 1, player.width, 0x00CCCC, 0x000000, "Animator")
  950.     player.loop = false
  951.     player.play = false
  952. end
  953.  
  954. --DRAW FUNCTIONS--
  955.  
  956. function renderRClick()
  957.     if menuBool then
  958.         rcl.buttonTab = nil
  959.         if paletteBool then
  960.             rcl:button("Palette", 2, 3, rcl.width - 2, 1, 0x0099CC, "pSwitch")
  961.         else
  962.             rcl:button("Palette", 2, 3, rcl.width - 2, 1, 0x00CCCC, "pSwitch")
  963.         end
  964.         if toolBool then
  965.             rcl:button("Tools", 2, 5, rcl.width - 2, 1, 0x0099CC, "tSwitch")
  966.         else
  967.             rcl:button("Tools", 2, 5, rcl.width - 2, 1, 0x00CCCC, "tSwitch")
  968.         end
  969.         if layerBool then
  970.             rcl:button("Layers", 2, 7, rcl.width - 2, 1, 0x0099CC, "layers")
  971.         else
  972.             rcl:button("Layers", 2, 7, rcl.width - 2, 1, 0x00CCCC, "layers")
  973.         end
  974.         if playerBool then
  975.             rcl:button("Animate", 2, 9, rcl.width - 2, 1, 0x0099CC, "animate")
  976.         else
  977.             rcl:button("Animate", 2, 9, rcl.width - 2, 1, 0x00CCCC, "animate")
  978.         end
  979.         rcl:button("Save", 2, 11, rcl.width - 2, 1, 0x00CCCC, "save")
  980.         rcl:button("Load", 2, 13, rcl.width - 2, 1, 0x00CCCC, "load")
  981.         rcl:render()
  982.     end
  983. end
  984.  
  985. function drawPalette(active)
  986.     if paletteBool then
  987.         local pStr = active.."/"..pTab.pCount
  988.         if pTab.width < 23 then pTab.width = 23 end
  989.         local navx = math.floor((pTab.width - 21) / 2)
  990.         pTab.buttonTab = nil
  991.         pTab:button("New", navx, 3, 5, 1, 0x00CCCC, "add_palette")
  992.         pTab:button("<", navx + 6, 3, 3, 1, 0x00CCCC, "bk_palette")
  993.         pTab:button(pStr, navx + 10, 3, 8, 1, 0xFFFFFF, "never_mind_this")
  994.         pTab:button(">", navx + 19, 3, 3, 1, 0x00CCCC, "fd_palette")
  995.         navx = math.floor((pTab.width - 17) / 2)
  996.         if fgBool then
  997.             pTab:button("FG", navx, 5, 5, 1, 0x0099CC, "fg")
  998.         else
  999.             pTab:button("FG", navx, 5, 5, 1, 0x00CCCC, "fg")
  1000.         end
  1001.         if bgBool then
  1002.             pTab:button("BG", navx + 6, 5, 5, 1, 0x0099CC, "bg")
  1003.         else
  1004.             pTab:button("BG", navx + 6, 5, 5, 1, 0x00CCCC, "bg")
  1005.         end
  1006.         if charBool then
  1007.             pTab:button("Char", navx + 12, 5, 5, 1, 0x0099CC, "char")
  1008.         else
  1009.             pTab:button("Char", navx + 12, 5, 5, 1, 0x00CCCC, "char")
  1010.         end
  1011.         pTab:button(" ", navx, 7, 5, 1, fgCur, "fg")
  1012.         if bgCur ~= "trans" then
  1013.             pTab:button(" ", navx + 6, 7, 5, 1, bgCur, "bg")
  1014.             pTab:button(" ", navx + 12, 7, 5, 1, bgCur, "char")
  1015.         else
  1016.             pTab:button("TR", navx + 6, 7, 5, 1, 0xFFFFFF, "bg")
  1017.             pTab:button(" ", navx + 12, 7, 5, 1, 0xFFFFFF, "char")
  1018.         end
  1019.         local xPos = 2
  1020.         local yPos = 9
  1021.         local bWidth = math.floor((pTab.width - 4) / 3)
  1022.         local bHeight = math.floor((pTab.height - 9) / 3)
  1023.         for i = 1, #pTab.list[active] do
  1024.             if pTab.list[active][i] ~= nil then
  1025.                 col = pTab.list[active][i]
  1026.             else
  1027.                 col = 0xFFFFFF
  1028.             end
  1029.             pTab:button(charCur, xPos, yPos, bWidth, bHeight, col, i)
  1030.             if i % 3 == 0 then
  1031.                 xPos = 2
  1032.                 yPos = yPos + (bHeight + 1)
  1033.             else
  1034.                 xPos = xPos + (bWidth + 1)
  1035.             end
  1036.         end
  1037.         pTab:render()
  1038.     end
  1039. end
  1040.  
  1041. function colourChanger()
  1042.     if colourBool then
  1043.         colour.buttonTab = nil
  1044.         if colour.rVal < 6 then
  1045.             colour:button("^", 2, 3, 3, 1, 0x00CCCC, "r_plus")
  1046.         else
  1047.             colour:button("^", 2, 3, 3, 1, 0x0099CC, "r_plus")
  1048.         end
  1049.         colour:button(vTab[colour.rVal], 2, 5, 3, 1, 0xFFFFFF, "no_action")
  1050.         if colour.rVal > 1 then
  1051.             colour:button("v", 2, 7, 3, 1, 0x00CCCC, "r_minus")
  1052.         else
  1053.             colour:button("v", 2, 7, 3, 1, 0x0099CC, "r_minus")
  1054.         end
  1055.         if colour.gVal < 6 then
  1056.             colour:button("^", 6, 3, 3, 1, 0x00CCCC, "g_plus")
  1057.         else
  1058.             colour:button("^", 6, 3, 3, 1, 0x0099CC, "g_plus")
  1059.         end
  1060.         colour:button(vTab[colour.gVal], 6, 5, 3, 1, 0xFFFFFF, "no_action")
  1061.         if colour.gVal > 1 then
  1062.             colour:button("v", 6, 7, 3, 1, 0x00CCCC, "g_minus")
  1063.         else
  1064.             colour:button("v", 6, 7, 3, 1, 0x0099CC, "g_minus")
  1065.         end
  1066.         if colour.bVal < 6 then
  1067.             colour:button("^", 10, 3, 3, 1, 0x00CCCC, "b_plus")
  1068.         else
  1069.             colour:button("^", 10, 3, 3, 1, 0x0099CC, "b_plus")
  1070.         end
  1071.         colour:button(vTab[colour.bVal], 10, 5, 3, 1, 0xFFFFFF, "no_action")
  1072.         if colour.bVal > 1 then
  1073.             colour:button("v", 10, 7, 3, 1, 0x00CCCC, "b_minus")
  1074.         else
  1075.             colour:button("v", 10, 7, 3, 1, 0x0099CC, "b_minus")
  1076.         end
  1077.         colour:button("0x"..vTab[colour.rVal]..vTab[colour.gVal]..vTab[colour.bVal], 2, 9, colour.width - 2, 3, tonumber("0x"..vTab[colour.rVal]..vTab[colour.gVal]..vTab[colour.bVal]), "no_action")
  1078.         colour:button("Ok", 2, 13, 5, 1, 0x00CCCC, "set_colour")
  1079.         colour:button("Exit", 8, 13, 5, 1, 0x00CCCC, "exit")
  1080.         colour:render()
  1081.     end
  1082. end
  1083.  
  1084. function drawToolBox()
  1085.     if toolBool then
  1086.         tools.buttonTab = nil
  1087.         tools.printTab = nil
  1088.         tools:centerText(1, 1, tools.width, 0x00CCCC, 0x000000, "Tools")
  1089.         if tools.brush["active"] then
  1090.             tools:resize(15, 11)
  1091.             tools:centerText(1, 7, tools.width, 0x999999, 0x000000, "Width")
  1092.             tools:centerText(1, 9, tools.width, 0x999999, 0x000000, "Height")
  1093.             tools:button("Brush", 2, 3, 6, 1, 0x0099CC, "brSwitch")
  1094.             if tools.brush["sizeX"] > 1 then
  1095.                 tools:button("<", 2, 8, 3, 1, 0x00CCCC, "brx_minus")
  1096.                 tools:button(tostring(tools.brush["sizeX"]), 6, 8, 5, 1, 0xFFFFFF, "no_action")
  1097.                 tools:button(">", 12, 8, 3, 1, 0x00CCCC, "brx_plus")
  1098.             else
  1099.                 tools:button("<", 2, 8, 3, 1, 0x0099CC, "brx_minus")
  1100.                 tools:button(tostring(tools.brush["sizeX"]), 6, 8, 5, 1, 0xFFFFFF, "no_action")
  1101.                 tools:button(">", 12, 8, 3, 1, 0x00CCCC, "brx_plus")
  1102.             end
  1103.             if tools.brush["sizeY"] > 1 then
  1104.                 tools:button("<", 2, 10, 3, 1, 0x00CCCC, "bry_minus")
  1105.                 tools:button(tostring(tools.brush["sizeY"]), 6, 10, 5, 1, 0xFFFFFF, "no_action")
  1106.                 tools:button(">", 12, 10, 3, 1, 0x00CCCC, "bry_plus")
  1107.             else
  1108.                 tools:button("<", 2, 10, 3, 1, 0x0099CC, "bry_minus")
  1109.                 tools:button(tostring(tools.brush["sizeY"]), 6, 10, 5, 1, 0xFFFFFF, "no_action")
  1110.                 tools:button(">", 12, 10, 3, 1, 0x00CCCC, "bry_plus")
  1111.             end
  1112.         else
  1113.             tools:button("Brush", 2, 3, 6, 1, 0x00CCCC, "brSwitch")
  1114.         end
  1115.         if tools.line["active"] then
  1116.             tools:resize(15, 15)
  1117.             tools:centerText(1, 7, tools.width, 0x999999, 0x000000, "X Start")
  1118.             tools:centerText(1, 9, tools.width, 0x999999, 0x000000, "Y Start")
  1119.             tools:centerText(1, 11, tools.width, 0x999999, 0x000000, "X End")
  1120.             tools:centerText(1, 13, tools.width, 0x999999, 0x000000, "Y End")
  1121.             tools:button("Line", 9, 3, 6, 1, 0x0099CC, "lSwitch")
  1122.             tools:button(tostring(tools.line["startx"]), 2, 8, tools.width - 2, 1, 0xFFFFFF, "no_action")
  1123.             tools:button(tostring(tools.line["starty"]), 2, 10, tools.width - 2, 1, 0xFFFFFF, "no_action")
  1124.             tools:button(tostring(tools.line["endx"]), 2, 12, tools.width - 2, 1, 0xFFFFFF, "no_action")
  1125.             tools:button(tostring(tools.line["endy"]), 2, 14, tools.width - 2, 1, 0xFFFFFF, "no_action")
  1126.         else
  1127.             tools:button("Line", 9, 3, 6, 1, 0x00CCCC, "lSwitch")
  1128.         end
  1129.         if tools.boxTool["active"] then
  1130.             tools:resize(15, 15)
  1131.             tools:centerText(1, 7, tools.width, 0x999999, 0x000000, "X Start")
  1132.             tools:centerText(1, 9, tools.width, 0x999999, 0x000000, "Y Start")
  1133.             tools:centerText(1, 11, tools.width, 0x999999, 0x000000, "X End")
  1134.             tools:centerText(1, 13, tools.width, 0x999999, 0x000000, "Y End")
  1135.             tools:button("Box", 2, 5, 6, 1, 0x0099CC, "bSwitch")
  1136.             tools:button(tostring(tools.line["startx"]), 2, 8, tools.width - 2, 1, 0xFFFFFF, "no_action")
  1137.             tools:button(tostring(tools.line["starty"]), 2, 10, tools.width - 2, 1, 0xFFFFFF, "no_action")
  1138.             tools:button(tostring(tools.line["endx"]), 2, 12, tools.width - 2, 1, 0xFFFFFF, "no_action")
  1139.             tools:button(tostring(tools.line["endy"]), 2, 14, tools.width - 2, 1, 0xFFFFFF, "no_action")
  1140.         else
  1141.             tools:button("Box", 2, 5, 6, 1, 0x00CCCC, "bSwitch")
  1142.         end
  1143.         if tools.circle["active"] then
  1144.             tools:resize(15, 11)
  1145.             tools:button("Circle", 9, 5, 6, 1, 0x0099CC, "cSwitch")
  1146.             tools:centerText(1, 7, tools.width, 0x999999, 0x000000, "Radius")
  1147.             if tools.circle["radius"] > 1 then
  1148.                 tools:button("<", 2, 8, 3, 1, 0x00CCCC, "rad_minus")
  1149.                 tools:button(tostring(tools.circle["radius"]), 6, 8, 5, 1, 0xFFFFFF, "no_action")
  1150.                 tools:button(">", 12, 8, 3, 1, 0x00CCCC, "rad_plus")
  1151.             else
  1152.                 tools:button("<", 2, 8, 3, 1, 0x0099CC, "rad_minus")
  1153.                 tools:button(tostring(tools.circle["radius"]), 6, 8, 5, 1, 0xFFFFFF, "no_action")
  1154.                 tools:button(">", 12, 8, 3, 1, 0x00CCCC, "rad_plus")
  1155.             end
  1156.             if tools.circle["solid"] then
  1157.                 tools:button("Filled", 2, 10, tools.width - 2, 1, 0x0099CC, "toggle_filled")
  1158.             else
  1159.                 tools:button("Filled", 2, 10, tools.width - 2, 1, 0x00CCCC, "toggle_filled")
  1160.             end
  1161.         else
  1162.             tools:button("Circle", 9, 5, 6, 1, 0x00CCCC, "cSwitch")
  1163.         end
  1164.         tools:render()
  1165.     end
  1166. end
  1167.  
  1168. function drawLayerMenu()
  1169.     if layerBool then
  1170.         layers.buttonTab = nil
  1171.         if layers.transBool then
  1172.             layers:button("Trans", 2, 3, layers.width - 2, 1, 0x0099CC, "trans_toggle")
  1173.         else
  1174.             layers:button("Trans", 2, 3, layers.width - 2, 1, 0x00CCCC, "trans_toggle")
  1175.         end
  1176.         if layers.lPage == 1 then
  1177.             layers:button("<", 2, 5, 3, 1, 0x0099CC, "page_down")
  1178.         else
  1179.             layers:button("<", 2, 5, 3, 1, 0x00CCCC, "page_down")
  1180.         end
  1181.         layers:button(tostring(layers.lPage).."/"..tostring(image.imTab[1]["pages"]), 6, 5, 5, 1, 0xFFFFFF, "page_down")
  1182.         if layers.lPage < image.imTab[1]["pages"] then
  1183.             layers:button(">", layers.width - 3, 5, 3, 1, 0x00CCCC, "page_up")
  1184.         else
  1185.             layers:button(">", layers.width - 3, 5, 3, 1, 0x0099CC, "page_up")
  1186.         end
  1187.         layers:button("New Layer", 2, 7, layers.width - 2, 1, 0x00CCCC, "new_layer")
  1188.         local yoffset = 1
  1189.         for i = (layers.lPage * 10) - 9, layers.lPage * 10 do
  1190.             if image.imTab[1]["layerData"][i] ~= nil then
  1191.                 if i == activeLayer then
  1192.                     layers:button(tostring(i), 2, 8 + yoffset, layers.width - 6, 1, 0x6666FF, i)
  1193.                 else
  1194.                     layers:button(tostring(i), 2, 8 + yoffset, layers.width - 6, 1, 0xFFFFFF, i)
  1195.                 end
  1196.                 if image.imTab[1]["layerData"][i]["hidden"] then
  1197.                     layers:button("H", layers.width - 3, 8 + yoffset, 3, 1, 0xCC0000, "show_"..tostring(i))
  1198.                 else
  1199.                     layers:button("V", layers.width - 3, 8 + yoffset, 3, 1, 0x00CC00, "hide_"..tostring(i))
  1200.                 end
  1201.             end
  1202.             yoffset = yoffset + 1
  1203.         end
  1204.         layers:render()
  1205.     end
  1206. end
  1207.  
  1208. function drawScreen(clear)
  1209.     if clear ~= nil then
  1210.         gpu.setForeground(0xFFFFFF)
  1211.         gpu.setBackground(0x000000)
  1212.         term.clear()
  1213.     end
  1214.     image:renderImages()
  1215.     drawPalette(activePalette)
  1216.     drawToolBox()
  1217.     colourChanger()
  1218.     if browserBool then browser:render() end
  1219.     drawLayerMenu()
  1220.     drawRemote()
  1221.     renderRClick()
  1222.     gpu.setForeground(0xFFFFFF)
  1223.     gpu.setBackground(0x000000)
  1224. end
  1225.  
  1226. function drawRemote()
  1227.     if playerBool then
  1228.         player.buttonTab = nil
  1229.         if player.play then
  1230.             player:button("Play", 2, 3, 6, 3, 0x0099CC, "play")
  1231.         else
  1232.             player:button("Play", 2, 3, 6, 3, 0x00CCCC, "play")
  1233.         end
  1234.         if player.loop then
  1235.             player:button("Loop", 9, 3, 6, 3, 0x0099CC, "loop")
  1236.         else
  1237.             player:button("Loop", 9, 3, 6, 3, 0x00CCCC, "loop")
  1238.         end
  1239.         player:render()
  1240.     end
  1241. end
  1242.  
  1243. function playVideo()
  1244.     gpu.setForeground(0xFFFFFF)
  1245.     gpu.setBackground(0x000000)
  1246.     term.clear()
  1247.     image.running = true
  1248.     while image.running do
  1249.         for al = 1, #image.imTab[1]["layerData"] do
  1250.             for i = 1, #image.imTab[1]["layerData"] do
  1251.                 image.imTab[1]["layerData"][i]["hidden"] = true
  1252.             end
  1253.             image.imTab[1]["layerData"][al]["hidden"] = false
  1254.             image:render()
  1255.         end
  1256.         if not player.loop then
  1257.             image.running = false
  1258.             break
  1259.         end
  1260.         run()
  1261.     end
  1262.     for i = 1, #image.imTab[1]["layerData"] do
  1263.         image.imTab[1]["layerData"][i]["hidden"] = true
  1264.     end
  1265.     image.imTab[1]["layerData"][1]["hidden"] = false
  1266.     image.imTab[1]["layerData"][activeLayer]["hidden"] = false
  1267.     drawScreen("c")
  1268. end
  1269.  
  1270. --RUN LOOP--
  1271.  
  1272. function checkImage(ev, clx, cly, pl, btn)
  1273.     local modifier = 1.5
  1274.     if btn == 0 then
  1275.         if ev == "touch" or ev == "drag" then
  1276.             local imStx = image.xPos + (image.imTab[1]["xPos"] - 1)
  1277.             local imSty = image.yPos + (image.imTab[1]["yPos"] - 1)
  1278.             local imMax = imStx + (image.imTab[1]["width"] - 1)
  1279.             local imMay = imSty + (image.imTab[1]["height"] - 1)
  1280.             local imClx = clx - (imStx - 1)
  1281.             local imCly = cly - (imSty - 1)
  1282.             if clx >= imStx and clx <= imMax then
  1283.                 if cly >= imSty and cly <= imMay then
  1284.                     gpu.setForeground(fgCur)
  1285.                     if bgCur ~= "trans" then
  1286.                         gpu.setBackground(bgCur)
  1287.                     end
  1288.                     if tools.brush["active"] then
  1289.                         for y = 1, tools.brush["sizeY"] do
  1290.                             for x = 1, tools.brush["sizeX"] do
  1291.                                 if imCly - (y - 1) >= 1 and imCly + (y - 1) <= image.height then
  1292.                                     if imClx - (x - 1) >= 1 and imClx + (x - 1) <= image.width then
  1293.                                         if image.imTab[1]["layerData"][activeLayer][imCly - (y - 1)][imClx - (x - 1)] ~= nil then
  1294.                                             if x + y <= math.ceil((tools.brush["sizeX"] + tools.brush["sizeY"]) / modifier) then
  1295.                                                 image.imTab[1]["layerData"][activeLayer][imCly - (y - 1)][imClx - (x - 1)]["bg"] = bgCur
  1296.                                                 gpu.set(clx - (x - 1), cly - (y - 1), charCur)
  1297.                                             end
  1298.                                         end
  1299.                                         if image.imTab[1]["layerData"][activeLayer][imCly + (y - 1)][imClx + (x - 1)] ~= nil then
  1300.                                             if x + y <= math.ceil((tools.brush["sizeX"] + tools.brush["sizeY"]) / modifier) then
  1301.                                                 image.imTab[1]["layerData"][activeLayer][imCly + (y - 1)][imClx + (x - 1)]["bg"] = bgCur
  1302.                                                 gpu.set(clx + (x - 1), cly + (y - 1), charCur)
  1303.                                             end
  1304.                                         end
  1305.                                         if image.imTab[1]["layerData"][activeLayer][imCly + (y - 1)][imClx - (x - 1)] ~= nil then
  1306.                                             if x + y <= math.ceil((tools.brush["sizeX"] + tools.brush["sizeY"]) / modifier) then
  1307.                                                 image.imTab[1]["layerData"][activeLayer][imCly + (y - 1)][imClx - (x - 1)]["bg"] = bgCur
  1308.                                                 gpu.set(clx + (x - 1), cly - (y - 1), charCur)
  1309.                                             end
  1310.                                         end
  1311.                                         if image.imTab[1]["layerData"][activeLayer][imCly - (y - 1)][imClx + (x - 1)] ~= nil then
  1312.                                             if x + y <= math.ceil((tools.brush["sizeX"] + tools.brush["sizeY"]) / modifier) then
  1313.                                                 image.imTab[1]["layerData"][activeLayer][imCly - (y - 1)][imClx + (x - 1)]["bg"] = bgCur
  1314.                                                 gpu.set(clx - (x - 1), cly + (y - 1), charCur)
  1315.                                             end
  1316.                                         end
  1317.                                     end
  1318.                                 end
  1319.                             end
  1320.                         end
  1321.                     elseif tools.line["active"] then
  1322.                         if tools.line["startx"] == 0 and tools.line["starty"] == 0 then
  1323.                             tools.line["startx"] = imClx
  1324.                             tools.line["starty"] = imCly
  1325.                             drawScreen()
  1326.                             gpu.setBackground(0x00FF00)
  1327.                             gpu.set(clx, cly, " ")
  1328.                             gpu.setBackground(0x000000)
  1329.                             return true
  1330.                         elseif tools.line["endx"] == 0 and tools.line["endy"] == 0 then
  1331.                             tools.line["endx"] = imClx
  1332.                             tools.line["endy"] = imCly
  1333.                             local difx = (math.max(tools.line["startx"], tools.line["endx"]) - math.min(tools.line["startx"], tools.line["endx"])) + 1
  1334.                             local dify = (math.max(tools.line["starty"], tools.line["endy"]) - math.min(tools.line["starty"], tools.line["endy"])) + 1
  1335.                             local xPos = tools.line["startx"]
  1336.                             local yPos = tools.line["starty"]
  1337.                             local xmod = 1
  1338.                             local ymod = 1
  1339.                             local xoff = 0
  1340.                             if tools.line["startx"] > tools.line["endx"] then xmod = -1 end
  1341.                             if tools.line["starty"] > tools.line["endy"] then ymod = -1 end
  1342.                             for y = 1, dify do
  1343.                                 if difx == 1 then
  1344.                                     image.imTab[1]["layerData"][activeLayer][yPos][xPos]["bg"] = bgCur
  1345.                                 else
  1346.                                     for i = 1, math.floor(math.max(difx, dify) / math.min(difx, dify)) do
  1347.                                         image.imTab[1]["layerData"][activeLayer][yPos][xPos]["bg"] = bgCur
  1348.                                         xPos = xPos + xmod
  1349.                                     end
  1350.                                 end
  1351.                                 yPos = yPos + ymod
  1352.                             end
  1353.                             tools.line["startx"] = 0
  1354.                             tools.line["starty"] = 0
  1355.                             tools.line["endx"] = 0
  1356.                             tools.line["endy"] = 0
  1357.                             drawScreen()
  1358.                             return true
  1359.                         end
  1360.                     elseif tools.boxTool["active"] then
  1361.                         if tools.boxTool["startx"] == 0 and tools.boxTool["starty"] == 0 then
  1362.                             tools.boxTool["startx"] = imClx
  1363.                             tools.boxTool["starty"] = imCly
  1364.                             drawScreen()
  1365.                             gpu.setBackground(0xFF0000)
  1366.                             gpu.set(clx, cly, " ")
  1367.                             gpu.setBackground(0x000000)
  1368.                             return true
  1369.                         elseif tools.boxTool["endx"] == 0 and tools.boxTool["endy"] == 0 then
  1370.                             tools.boxTool["endx"] = imClx
  1371.                             tools.boxTool["endy"] = imCly
  1372.                             local minx = math.min(tools.boxTool["startx"], tools.boxTool["endx"])
  1373.                             local maxx = math.max(tools.boxTool["startx"], tools.boxTool["endx"])
  1374.                             local miny = math.min(tools.boxTool["starty"], tools.boxTool["endy"])
  1375.                             local maxy = math.max(tools.boxTool["starty"], tools.boxTool["endy"])
  1376.                             for y = miny, maxy do
  1377.                                 for x = minx, maxx do
  1378.                                     image.imTab[1]["layerData"][activeLayer][y][x]["bg"] = bgCur
  1379.                                 end
  1380.                             end
  1381.                             tools.boxTool["startx"] = 0
  1382.                             tools.boxTool["starty"] = 0
  1383.                             tools.boxTool["endx"] = 0
  1384.                             tools.boxTool["endy"] = 0
  1385.                             drawScreen()
  1386.                             return true
  1387.                         end
  1388.                     elseif tools.circle["active"] then
  1389.                         for r = 1, tools.circle["radius"] do
  1390.                             if not tools.circle["solid"] then r = tools.circle["radius"] end
  1391.                             for j = 1, 360 do
  1392.                                 local angle = (j * math.pi) / 180
  1393.                                 local ptx, pty = clx + (r * math.cos(angle)), (cly + (r * math.sin(angle)) / 2)
  1394.                                 if math.floor(pty) - imSty >= 1 and math.floor(pty) - imSty <= image.height then
  1395.                                     if math.floor(ptx) - imStx >= 1 and math.floor(ptx) - imStx <= image.width then
  1396.                                         image.imTab[1]["layerData"][activeLayer][math.floor(pty) - imSty][math.floor(ptx) - imStx]["bg"] = bgCur
  1397.                                     end
  1398.                                 end
  1399.                             end
  1400.                             if not tools.circle["solid"] then break end
  1401.                         end
  1402.                         drawScreen()
  1403.                     end
  1404.                 end
  1405.             end
  1406.         end
  1407.     end
  1408.     return false
  1409. end
  1410.  
  1411. function checkRCL(ev, clx, cly, pl, btn)
  1412.     if menuBool then
  1413.         if clx >= rcl.xPos and clx <= rcl.xPos + rcl.width then
  1414.             if cly <= rcl.yPos and cly <= rcl.yPos + rcl.height then
  1415.                 rcl.grabbed = true
  1416.             end
  1417.         end
  1418.         if ev == "touch" then
  1419.             for i = 1, #rcl.buttonTab do
  1420.                 local stx = rcl.xPos + rcl.buttonTab[i]["xPos"]
  1421.                 local sty = rcl.yPos + (rcl.buttonTab[i]["yPos"] - 1)
  1422.                 local max = stx + rcl.buttonTab[i]["width"]
  1423.                 local may = sty + rcl.buttonTab[i]["height"]
  1424.                 if clx >= stx and clx <= max then
  1425.                     if cly >= sty and cly <= may then
  1426.                         if rcl.buttonTab[i]["returnVal"] == "pSwitch" then
  1427.                             paletteBool = not paletteBool
  1428.                             colourBool = false
  1429.                             drawScreen("c")
  1430.                         elseif rcl.buttonTab[i]["returnVal"] == "tSwitch" then
  1431.                             toolBool = not toolBool
  1432.                             drawScreen("c")
  1433.                         elseif rcl.buttonTab[i]["returnVal"] == "save" then
  1434.                             if not fs.isDirectory(path.."/Images/") then fs.makeDirectory(path.."/Images/") end
  1435.                             image:saveImage(filename, path.."/Images/"..filename)
  1436.                             return true
  1437.                         elseif rcl.buttonTab[i]["returnVal"] == "load" then
  1438.                             browserBool = not browserBool
  1439.                             activeLayer = 1
  1440.                             drawScreen("c")
  1441.                         elseif rcl.buttonTab[i]["returnVal"] == "layers" then
  1442.                             layerBool = not layerBool
  1443.                             drawScreen("c")
  1444.                             return true
  1445.                         elseif rcl.buttonTab[i]["returnVal"] == "animate" then
  1446.                             playerBool = not playerBool
  1447.                             drawScreen("c")
  1448.                             return true
  1449.                         end
  1450.                         return true
  1451.                     end
  1452.                 end
  1453.             end
  1454.             return false
  1455.         elseif ev == "drag" then
  1456.             if rcl.grabbed then
  1457.                 gpu.setForeground(0xFFFFFF)
  1458.                 gpu.setBackground(0x000000)
  1459.                 gpu.fill(rcl.xPos, rcl.yPos, rcl.width, rcl.height, " ")
  1460.                 rcl:move(clx, cly)
  1461.                 drawScreen()
  1462.                 return true
  1463.             else
  1464.                 return false
  1465.             end
  1466.         elseif ev == "drop" then
  1467.             rcl.grabbed = false
  1468.         end
  1469.         return true
  1470.     end
  1471.     return false
  1472. end
  1473.  
  1474. function checkPalette(ev, clx, cly, pl, btn)
  1475.     if paletteBool then
  1476.         local tBool = false
  1477.         if ev == "touch" then
  1478.             if clx >= pTab.xPos and clx <= pTab.xPos + (pTab.width - 1) then
  1479.                 if cly >= pTab.yPos and cly <= pTab.yPos + (pTab.height - 1) then
  1480.                     pTab.grabbed = true
  1481.                     tBool = true
  1482.                 else
  1483.                     pTab.grabbed = false
  1484.                     return false
  1485.                 end
  1486.             else
  1487.                 pTab.grabbed = false
  1488.                 return false
  1489.             end
  1490.             for i = 1, #pTab.buttonTab do
  1491.                 local buttonStX = pTab.xPos + pTab.buttonTab[i]["xPos"]
  1492.                 local buttonStY = pTab.yPos + pTab.buttonTab[i]["yPos"]
  1493.                 local buttonMaX = buttonStX + pTab.buttonTab[i]["width"]
  1494.                 local buttonMaY = buttonStY + pTab.buttonTab[i]["height"]
  1495.                 if clx >= buttonStX and clx <= buttonMaX then
  1496.                     if cly >= buttonStY and cly <= buttonMaY then
  1497.                         if pTab.buttonTab[i]["returnVal"] == "add_palette" then
  1498.                             newPalette()
  1499.                             activePalette = pTab.pCount
  1500.                             drawPalette(activePalette)
  1501.                         elseif pTab.buttonTab[i]["returnVal"] == "bk_palette" then
  1502.                             if activePalette > 1 then
  1503.                                 activePalette = activePalette - 1
  1504.                             end
  1505.                             drawPalette(activePalette)
  1506.                         elseif pTab.buttonTab[i]["returnVal"] == "fd_palette" then
  1507.                             if activePalette == pTab.pCount then
  1508.                                 newPalette()
  1509.                             end
  1510.                             activePalette = activePalette + 1
  1511.                             drawPalette(activePalette)
  1512.                         elseif pTab.buttonTab[i]["returnVal"] == "fg" then
  1513.                             fgBool = not fgBool
  1514.                             bgBool = false
  1515.                             charBool = false
  1516.                             drawPalette(activePalette)
  1517.                         elseif pTab.buttonTab[i]["returnVal"] == "bg" then
  1518.                             fgBool = false
  1519.                             bgBool = not bgBool
  1520.                             charBool = false
  1521.                             drawPalette(activePalette)
  1522.                         elseif pTab.buttonTab[i]["returnVal"] == "char" then
  1523.                             fgBool = false
  1524.                             bgBool = false
  1525.                             charBool = not charBool
  1526.                             drawPalette(activePalette)
  1527.                         elseif pTab.buttonTab[i]["returnVal"] == "never_mind_this" then
  1528.                         else
  1529.                             if btn == 0 then
  1530.                                 if fgBool then
  1531.                                     fgLast = fgCur
  1532.                                     fgCur = pTab.buttonTab[i]["colour"]
  1533.                                     layers.transBool = false
  1534.                                     drawScreen()
  1535.                                 elseif bgBool then
  1536.                                     bgLast = bgCur
  1537.                                     bgCur = pTab.buttonTab[i]["colour"]
  1538.                                     layers.transBool = false
  1539.                                     drawScreen()
  1540.                                 end
  1541.                             else
  1542.                                 colourBool = not colourBool
  1543.                                 pEntry = pTab.buttonTab[i]["returnVal"]
  1544.                                 layers.transBool = false
  1545.                                 drawScreen("c")
  1546.                             end
  1547.                         end
  1548.                     end
  1549.                 end
  1550.             end
  1551.             if tBool then return true end
  1552.         elseif ev == "drag" then
  1553.             if pTab.grabbed then
  1554.                 gpu.setForeground(0xFFFFFF)
  1555.                 gpu.setBackground(0x000000)
  1556.                 gpu.fill(pTab.xPos, pTab.yPos, pTab.width, pTab.height, " ")
  1557.                 pTab:move(clx, cly)
  1558.                 drawScreen()
  1559.                 return true
  1560.             else
  1561.                 return false
  1562.             end
  1563.         elseif ev == "drop" then
  1564.             drawPalette(activePalette)
  1565.             pTab.grabbed = false
  1566.             return true
  1567.         end
  1568.     end
  1569.     return false
  1570. end
  1571.  
  1572. function checkRGB(ev, clx, cly, pl, btn)
  1573.     if colourBool then
  1574.         if clx >= colour.xPos and clx <= colour.xPos + colour.width then
  1575.             if cly <= colour.yPos and cly <= colour.yPos + colour.height then
  1576.                 colour.grabbed = true
  1577.             end
  1578.         end
  1579.         if ev == "touch" then
  1580.             for i = 1, #colour.buttonTab do
  1581.                 local stx = colour.xPos + colour.buttonTab[i]["xPos"]
  1582.                 local sty = colour.yPos + (colour.buttonTab[i]["yPos"] - 1)
  1583.                 local max = stx + colour.buttonTab[i]["width"]
  1584.                 local may = sty + colour.buttonTab[i]["height"]
  1585.                 if clx >= stx and clx <= max then
  1586.                     if cly >= sty and cly <= may then
  1587.                         if colour.buttonTab[i]["returnVal"] == "r_plus" then
  1588.                             if colour.rVal < 6 then
  1589.                                 colour.rVal = colour.rVal + 1
  1590.                             end
  1591.                         elseif colour.buttonTab[i]["returnVal"] == "r_minus" then
  1592.                             if colour.rVal > 1 then
  1593.                                 colour.rVal = colour.rVal - 1
  1594.                             end
  1595.                         elseif colour.buttonTab[i]["returnVal"] == "g_plus" then
  1596.                             if colour.gVal < 6 then
  1597.                                 colour.gVal = colour.gVal + 1
  1598.                             end
  1599.                         elseif colour.buttonTab[i]["returnVal"] == "g_minus" then
  1600.                             if colour.gVal > 1 then
  1601.                                 colour.gVal = colour.gVal - 1
  1602.                             end
  1603.                         elseif colour.buttonTab[i]["returnVal"] == "b_plus" then
  1604.                             if colour.bVal < 6 then
  1605.                                 colour.bVal = colour.bVal + 1
  1606.                             end
  1607.                         elseif colour.buttonTab[i]["returnVal"] == "b_minus" then
  1608.                             if colour.bVal > 1 then
  1609.                                 colour.bVal = colour.bVal - 1
  1610.                             end
  1611.                         elseif colour.buttonTab[i]["returnVal"] == "set_colour" then
  1612.                             pTab.list[activePalette][pEntry] = tonumber("0x"..vTab[colour.rVal]..vTab[colour.gVal]..vTab[colour.bVal])
  1613.                             colourBool = false
  1614.                             drawScreen("c")
  1615.                         elseif colour.buttonTab[i]["returnVal"] == "exit" then
  1616.                             colourBool = false
  1617.                             drawScreen("c")
  1618.                         end
  1619.                         colourChanger()
  1620.                         return true
  1621.                     end
  1622.                 end
  1623.             end
  1624.             return false
  1625.         elseif ev == "drag" then
  1626.             if colour.grabbed then
  1627.                 gpu.setForeground(0xFFFFFF)
  1628.                 gpu.setBackground(0x000000)
  1629.                 gpu.fill(colour.xPos, colour.yPos, colour.width, colour.height, " ")
  1630.                 colour:move(clx, cly)
  1631.                 drawScreen()
  1632.                 return true
  1633.             else
  1634.                 return false
  1635.             end
  1636.         elseif ev == "drop" then
  1637.             colour.grabbed = false
  1638.         end
  1639.         return true
  1640.     end
  1641.     return false
  1642. end
  1643.  
  1644. function checkToolBox(ev, clx, cly, pl, btn)
  1645.     if toolBool then
  1646.         if ev == "touch" then
  1647.             for i = 1, #tools.buttonTab do
  1648.                 local stx = tools.xPos + tools.buttonTab[i]["xPos"]
  1649.                 local sty = tools.yPos + (tools.buttonTab[i]["yPos"] - 1)
  1650.                 local max = stx + tools.buttonTab[i]["width"]
  1651.                 local may = sty + tools.buttonTab[i]["height"]
  1652.                 if clx >= stx and clx <= max then
  1653.                     if cly >= sty and cly <= may then
  1654.                         if tools.buttonTab[i]["returnVal"] == "brSwitch" then
  1655.                             tools.brush["active"] = true
  1656.                             tools.line["active"] = false
  1657.                             tools.boxTool["active"] = false
  1658.                             tools.circle["active"] = false
  1659.                         elseif tools.buttonTab[i]["returnVal"] == "lSwitch" then
  1660.                             tools.brush["active"] = false
  1661.                             tools.line["active"] = true
  1662.                             tools.boxTool["active"] = false
  1663.                             tools.circle["active"] = false
  1664.                         elseif tools.buttonTab[i]["returnVal"] == "bSwitch" then
  1665.                             tools.brush["active"] = false
  1666.                             tools.line["active"] = false
  1667.                             tools.boxTool["active"] = true
  1668.                             tools.circle["active"] = false
  1669.                         elseif tools.buttonTab[i]["returnVal"] == "cSwitch" then
  1670.                             tools.brush["active"] = false
  1671.                             tools.line["active"] = false
  1672.                             tools.boxTool["active"] = false
  1673.                             tools.circle["active"] = true
  1674.                         elseif tools.buttonTab[i]["returnVal"] == "brx_minus" then
  1675.                             if tools.brush["sizeX"] > 1 then
  1676.                                 tools.brush["sizeX"] = tools.brush["sizeX"] - 1
  1677.                             end
  1678.                         elseif tools.buttonTab[i]["returnVal"] == "brx_plus" then
  1679.                             tools.brush["sizeX"] = tools.brush["sizeX"] + 1
  1680.                         elseif tools.buttonTab[i]["returnVal"] == "bry_minus" then
  1681.                             if tools.brush["sizeY"] > 1 then
  1682.                                 tools.brush["sizeY"] = tools.brush["sizeY"] - 1
  1683.                             end
  1684.                         elseif tools.buttonTab[i]["returnVal"] == "bry_plus" then
  1685.                             tools.brush["sizeY"] = tools.brush["sizeY"] + 1
  1686.                         elseif tools.buttonTab[i]["returnVal"] == "rad_minus" then
  1687.                             if tools.circle["radius"] > 1 then
  1688.                                 tools.circle["radius"] = tools.circle["radius"] - 1
  1689.                             end
  1690.                         elseif tools.buttonTab[i]["returnVal"] == "rad_plus" then
  1691.                             tools.circle["radius"] = tools.circle["radius"] + 1
  1692.                         elseif tools.buttonTab[i]["returnVal"] == "toggle_filled" then
  1693.                             tools.circle["solid"] = not tools.circle["solid"]
  1694.                         end
  1695.                         tools.grabbed = false
  1696.                         drawScreen()
  1697.                         return true
  1698.                     end
  1699.                 end
  1700.             end
  1701.             if clx >= tools.xPos and clx <= tools.xPos + (tools.width - 1) then
  1702.                 if cly >= tools.yPos and cly <= tools.yPos + (tools.height - 1) then
  1703.                     tools.grabbed = true
  1704.                     return true
  1705.                 end
  1706.             end
  1707.             return false
  1708.         elseif ev == "drag" then
  1709.             if tools.grabbed then
  1710.                 gpu.setForeground(0xFFFFFF)
  1711.                 gpu.setBackground(0x000000)
  1712.                 gpu.fill(tools.xPos, tools.yPos, tools.width, tools.height, " ")
  1713.                 tools:move(clx, cly)
  1714.                 drawScreen()
  1715.                 return true
  1716.             end
  1717.         elseif ev == "drop" then
  1718.             tools.grabbed = false
  1719.             return true
  1720.         end
  1721.     end
  1722.     tools.grabbed = false
  1723.     return false
  1724. end
  1725.  
  1726. function checkFileViewer(ev, clx, cly, pl, btn)
  1727.     if browserBool then
  1728.         if clx >= browser.xPos and clx <= browser.xPos + browser.width then
  1729.             if cly <= browser.yPos and cly <= browser.yPos + browser.height then
  1730.                 browser.grabbed = true
  1731.             end
  1732.         end
  1733.         if browser.fileViewer ~= nil then
  1734.             if ev == "touch" then
  1735.                 for j = 1, #browser.fileViewer do
  1736.                     for k = 1, #browser.fileViewer[j]["list"] do
  1737.                         if clx >= browser.xPos + browser.fileViewer[j]["xPos"] and clx <= browser.xPos + #browser.fileViewer[j]["list"][k] then
  1738.                             if cly == browser.yPos + (browser.fileViewer[j]["yPos"] + k) then
  1739.                                 if fs.isDirectory(browser.fileViewer[j]["path"]) then
  1740.                                     if string.sub(browser.fileViewer[j]["path"], #browser.fileViewer[j]["path"], #browser.fileViewer[j]["path"]) == "/" then
  1741.                                         browser.fileViewer[j]["path"] = string.sub(browser.fileViewer[j]["path"], 1, #browser.fileViewer[j]["path"] - 1)
  1742.                                     end
  1743.                                 end
  1744.                                 if fs.isDirectory(browser.fileViewer[j]["path"].."/"..browser.fileViewer[j]["list"][k].."/") then
  1745.                                     browser.fileViewer[j]["path"] = browser.fileViewer[j]["path"].."/"..browser.fileViewer[j]["list"][k].."/"
  1746.                                     browser.fileViewer[j]["list"] = browser:assembleFileTable(browser.fileViewer[j]["path"])
  1747.                                     browser.textInputs[1]["text"][1] = browser.fileViewer[j]["path"]
  1748.                                     browser.textInputs[1]["cursorX"] = #browser.textInputs[1]["text"][1] + 1
  1749.                                     browser:render()
  1750.                                     return true
  1751.                                 else
  1752.                                     if btn == 0 then
  1753.                                         image = nil
  1754.                                         image = screen:newPane(image, width, height)
  1755.                                         image:loadImage(filename, browser.fileViewer[j]["path"].."/"..browser.fileViewer[j]["list"][k], 1, 1)
  1756.                                         --image:resize(image.imTab[1]["width"], image.imTab[1]["height"])
  1757.                                         image:center()
  1758.                                         filename = browser.fileViewer[j]["list"][k]
  1759.                                         browserBool = false
  1760.                                         drawScreen("c")
  1761.                                         return true
  1762.                                     else
  1763.                                         browserBool = false
  1764.                                         drawScreen("c")
  1765.                                         return false
  1766.                                     end
  1767.                                 end
  1768.                             end
  1769.                         end
  1770.                     end
  1771.                 end
  1772.                 for i = 1, #browser.buttonTab do
  1773.                     local stx = browser.xPos + browser.buttonTab[i]["xPos"]
  1774.                     local sty = browser.yPos + (browser.buttonTab[i]["yPos"] - 1)
  1775.                     local max = stx + browser.buttonTab[i]["width"]
  1776.                     local may = sty + browser.buttonTab[i]["height"]
  1777.                     if clx >= stx and clx <= max then
  1778.                         if cly >= sty and cly <= may then
  1779.                             if browser.buttonTab[i]["returnVal"] == "navigate_up" then
  1780.                                 browser.fileViewer[1]["path"] = fs.path(browser.fileViewer[1]["path"])
  1781.                                 browser.fileViewer[1]["list"] = browser:assembleFileTable(browser.fileViewer[1]["path"])
  1782.                                 browser.textInputs[1]["text"][1] = browser.fileViewer[1]["path"]
  1783.                                 browser.textInputs[1]["cursorX"] = #browser.textInputs[1]["text"][1] + 1
  1784.                                 browser:render()
  1785.                             end
  1786.                         end
  1787.                     end
  1788.                 end
  1789.             elseif ev == "drag" then
  1790.                 if browser.grabbed then
  1791.                     gpu.setForeground(0xFFFFFF)
  1792.                     gpu.setBackground(0x000000)
  1793.                     gpu.fill(browser.xPos, browser.yPos, browser.width, browser.height, " ")
  1794.                     browser:move(clx, cly)
  1795.                     drawScreen()
  1796.                     return true
  1797.                 end
  1798.             elseif ev == "drop" then
  1799.                 browser.grabbed = false
  1800.                 return true
  1801.             end
  1802.         end
  1803.     end
  1804.     browser.grabbed = false
  1805.     return false
  1806. end
  1807.  
  1808. function checkLayers(ev, clx, cly, pl, btn)
  1809.     if layerBool then
  1810.         if ev == "touch" then
  1811.             for i = 1, #layers.buttonTab do
  1812.                 local stx = layers.xPos + layers.buttonTab[i]["xPos"]
  1813.                 local sty = layers.yPos + (layers.buttonTab[i]["yPos"] - 1)
  1814.                 local max = stx + layers.buttonTab[i]["width"]
  1815.                 local may = sty + layers.buttonTab[i]["height"]
  1816.                 if clx >= stx and clx <= max then
  1817.                     if cly >= sty and cly <= may then
  1818.                         if layers.buttonTab[i]["returnVal"] == "trans_toggle" then
  1819.                             layers.transBool = not layers.transBool
  1820.                             if layers.transBool then
  1821.                                 bgLast = bgCur
  1822.                                 bgCur = "trans"
  1823.                             else
  1824.                                 bgCur = bgLast
  1825.                             end
  1826.                         elseif layers.buttonTab[i]["returnVal"] == "page_up" then
  1827.                             if layers.lPage < image.imTab[1]["pages"] then
  1828.                                 layers.lPage = layers.lPage + 1
  1829.                             end
  1830.                         elseif layers.buttonTab[i]["returnVal"] == "page_down" then
  1831.                             if layers.lPage > 1 then
  1832.                                 layers.lPage = layers.lPage - 1
  1833.                             end
  1834.                         elseif layers.buttonTab[i]["returnVal"] == "new_layer" then
  1835.                             image:newImageLayer(filename)
  1836.                         elseif string.sub(layers.buttonTab[i]["returnVal"], 1, 5) == "hide_" then
  1837.                             image.imTab[1]["layerData"][tonumber(string.sub(layers.buttonTab[i]["returnVal"], 6, #layers.buttonTab[i]["returnVal"]))]["hidden"] = true
  1838.                         elseif string.sub(layers.buttonTab[i]["returnVal"], 1, 5) == "show_" then
  1839.                             image.imTab[1]["layerData"][tonumber(string.sub(layers.buttonTab[i]["returnVal"], 6, #layers.buttonTab[i]["returnVal"]))]["hidden"] = false
  1840.                         elseif layers.buttonTab[i]["returnVal"] == "no_action" then
  1841.                         else
  1842.                             activeLayer = layers.buttonTab[i]["returnVal"]
  1843.                         end
  1844.                         layers.grabbed = false
  1845.                         drawScreen("c")
  1846.                         return true
  1847.                     end
  1848.                 end
  1849.             end
  1850.             if clx >= layers.xPos and clx <= layers.xPos + (layers.width - 1) then
  1851.                 if cly >= layers.yPos and cly <= layers.yPos + (layers.height - 1) then
  1852.                     layers.grabbed = true
  1853.                     return true
  1854.                 end
  1855.             end
  1856.             return false
  1857.         elseif ev == "drag" then
  1858.             if layers.grabbed then
  1859.                 gpu.setForeground(0xFFFFFF)
  1860.                 gpu.setBackground(0x000000)
  1861.                 gpu.fill(layers.xPos, layers.yPos, layers.width, layers.height, " ")
  1862.                 layers:move(clx, cly)
  1863.                 drawScreen()
  1864.                 return true
  1865.             end
  1866.         elseif ev == "drop" then
  1867.             layers.grabbed = false
  1868.             return true
  1869.         end
  1870.     end
  1871.     layers.grabbed = false
  1872.     return false
  1873. end
  1874.  
  1875. function checkPlayer(ev, clx, cly, pl, btn)
  1876.     if playerBool then
  1877.         if ev == "touch" then
  1878.             for i = 1, #player.buttonTab do
  1879.                 local stx = player.xPos + player.buttonTab[i]["xPos"]
  1880.                 local sty = player.yPos + (player.buttonTab[i]["yPos"] - 1)
  1881.                 local max = stx + player.buttonTab[i]["width"]
  1882.                 local may = sty + player.buttonTab[i]["height"]
  1883.                 if clx >= stx and clx <= max then
  1884.                     if cly >= sty and cly <= may then
  1885.                         if player.buttonTab[i]["returnVal"] == "play" then
  1886.                             playVideo()
  1887.                         elseif player.buttonTab[i]["returnVal"] == "loop" then
  1888.                             player.loop = not player.loop
  1889.                         end
  1890.                         player.grabbed = false
  1891.                         drawScreen("c")
  1892.                         return true
  1893.                     end
  1894.                 end
  1895.             end
  1896.             if clx >= player.xPos and clx <= player.xPos + (player.width - 1) then
  1897.                 if cly >= player.yPos and cly <= player.yPos + (player.height - 1) then
  1898.                     player.grabbed = true
  1899.                     return true
  1900.                 end
  1901.             end
  1902.             return false
  1903.         elseif ev == "drag" then
  1904.             if player.grabbed then
  1905.                 gpu.setForeground(0xFFFFFF)
  1906.                 gpu.setBackground(0x000000)
  1907.                 gpu.fill(player.xPos, player.yPos, player.width, player.height, " ")
  1908.                 player:move(clx, cly)
  1909.                 drawScreen()
  1910.                 return true
  1911.             end
  1912.         elseif ev == "drop" then
  1913.             player.grabbed = false
  1914.             return true
  1915.         end
  1916.     end
  1917.     player.grabbed = false
  1918.     return false
  1919. end
  1920.  
  1921. function run()
  1922.     ev, p1, p2, p3, p4, p5 = event.pull(.1, _, ev, p1, p2, p3, p4, p5)
  1923.     if ev == "key_up" then
  1924.         return true
  1925.     elseif ev == "key_down" then
  1926.         running = false
  1927.         return false
  1928.     elseif ev ~= nil then
  1929.         if checkRCL(ev, p2, p3, p5, p4) then return end
  1930.         rcl.grabbed = false
  1931.         if checkRGB(ev, p2, p3, p5, p4) then return end
  1932.         colour.grabbed = false
  1933.         if checkPalette(ev, p2, p3, p5, p4) then return end
  1934.         pTab.grabbed = false
  1935.         if checkFileViewer(ev, p2, p3, p5, p4) then return end
  1936.         browser.grabbed = false
  1937.         if checkToolBox(ev, p2, p3, p5, p4) then return end
  1938.         tools.grabbed = false
  1939.         if checkLayers(ev, p2, p3, p5, p4) then return end
  1940.         layers.grabbed = false
  1941.         if checkPlayer(ev, p2, p3, p5, p4) then return end
  1942.         player.grabbed = false
  1943.         if checkImage(ev, p2, p3, p5, p4) then return end
  1944.         image.running = false
  1945.         if p4 == 1 then
  1946.             menuBool = not menuBool
  1947.             drawScreen("c")
  1948.         end
  1949.     end
  1950. end
  1951.  
  1952. --PROGRAM START--
  1953.  
  1954. rClickMenuSetup()
  1955. paletteSetup()
  1956. colourSetup()
  1957. browser = fileBrowser(0x00CCCC, "Load File")
  1958. toolBox()
  1959. layerTool()
  1960. initPlayer()
  1961. if fs.exists(path.."/Images/"..filename) then
  1962.     image = screen:newPane(image, width, height)
  1963.     image:loadImage(filename, path.."/Images/"..filename, 1, 1)
  1964.     image:center()
  1965. else
  1966.     image = newImage(width, height)
  1967. end
  1968. drawScreen("c")
  1969. running = true
  1970. while running do
  1971.     run()
  1972. end
  1973. gpu.setForeground(0xFFFFFF)
  1974. gpu.setBackground(0x000000)api_paste_expirate_date=10M
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement