pedrosgali

DrawPlus

Jul 10th, 2014
1,734
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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.                         break
  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.                         break
  429.                     end
  430.                 end
  431.             end
  432.         end
  433.     end
  434.     return returnTab
  435. end
  436.    
  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)
  515.     if fs.exists(path) then
  516.         if self.imTab == nil then
  517.             self.imTab = {}
  518.             self.imCount = 0
  519.         end
  520.         self.imCount = self.imCount + 1
  521.         file = io.open(path, "r")
  522.         self.imTab[self.imCount] = serial.unserialize(file:read("*all"))
  523.         file:close()
  524.         for i = 1, #self.imTab[self.imCount]["layerData"] do
  525.             if self.imTab[self.imCount]["layerData"][i]["hidden"] == nil then
  526.                 self.imTab[self.imCount]["layerData"][i]["hidden"] = false
  527.             end
  528.         end
  529.         return true
  530.     end
  531.     return false
  532. end
  533.  
  534. --RENDER FUNCTIONS--
  535.  
  536. function screen:renderBoxes()
  537.     if self.boxTab ~= nil then
  538.         for i = 1, #self.boxTab do
  539.             gpu.setBackground(self.boxTab[i]["colour"])
  540.             gpu.fill(self.xPos + self.boxTab[i]["xPos"], self.yPos + self.boxTab[i]["yPos"], self.boxTab[i]["width"], self.boxTab[i]["height"], " ")
  541.         end
  542.     end
  543.     gpu.setBackground(0x000000)
  544.     gpu.setForeground(0xFFFFFF)
  545. end
  546.  
  547. function screen:renderText()
  548.     if self.printTab ~= nil then
  549.         for i = 1, #self.printTab do
  550.             gpu.setBackground(self.printTab[i]["bgCol"])
  551.             gpu.setForeground(self.printTab[i]["tCol"])
  552.             gpu.set(self.xPos + self.printTab[i]["xPos"], self.yPos + self.printTab[i]["yPos"], self.printTab[i]["text"])
  553.         end
  554.     end
  555.     gpu.setBackground(0x000000)
  556.     gpu.setForeground(0xFFFFFF)
  557. end
  558.  
  559. function screen:renderTextBoxes()
  560.     if self.textBox ~= nil then
  561.         for i = 1, #self.textBox do
  562.             gpu.setBackground(self.textBox[i]["bgCol"])
  563.             gpu.setForeground(self.textBox[i]["tCol"])
  564.             if self.textBox[i]["lineCount"] >= self.textBox[i]["height"] then
  565.                 startLine = #self.textBox[i]["line"] - (self.textBox[i]["height"] - 2)
  566.             else
  567.                 startLine = 1
  568.             end
  569.             curLine = 0
  570.             for j = startLine, #self.textBox[i]["line"] do
  571.                 printLine = self.textBox[i]["line"][j]
  572.                 if #printLine > self.textBox[i]["width"] then
  573.                     printLine = string.sub(printLine, #printLine - self.textInputs[i]["width"], #printLine)
  574.                 end
  575.                 gpu.set(self.xPos + self.textBox[i]["xPos"], self.yPos + (self.textBox[i]["yPos"] + (curLine)), printLine)
  576.                 curLine = curLine + 1
  577.             end
  578.         end
  579.     end
  580.     gpu.setBackground(0x000000)
  581.     gpu.setForeground(0xFFFFFF)
  582. end
  583.  
  584. function screen:renderButtons()
  585.     if self.buttonTab ~= nil then
  586.         gpu.setForeground(black)
  587.         for i = 1, #self.buttonTab do
  588.             gpu.setBackground(self.buttonTab[i]["colour"])
  589.             gpu.fill(self.xPos + self.buttonTab[i]["xPos"], self.yPos + self.buttonTab[i]["yPos"], self.buttonTab[i]["width"], self.buttonTab[i]["height"], " ")
  590.             midLine = math.floor(self.buttonTab[i]["height"] / 2)
  591.             printLine = self.buttonTab[i]["label"]
  592.             if #printLine > self.buttonTab[i]["width"] then
  593.                 printLine = string.sub(printLine, 1, self.buttonTab[i]["width"])
  594.             end
  595.             offset = math.floor((self.buttonTab[i]["width"] - #printLine) / 2)
  596.             gpu.set(self.xPos + (self.buttonTab[i]["xPos"] + offset), self.yPos + (self.buttonTab[i]["yPos"] + midLine), printLine)
  597.         end
  598.     end
  599.     gpu.setBackground(0x000000)
  600.     gpu.setForeground(0xFFFFFF)
  601. end
  602.  
  603. function screen:renderTextInputs()
  604.     if self.textInputs ~= nil then
  605.         for i = 1, #self.textInputs do
  606.             if self.textInputs[i]["text"] ~= nil then
  607.                 gpu.setBackground(self.textInputs[i]["bgCol"])
  608.                 gpu.setForeground(self.textInputs[i]["fgCol"])
  609.                 if self.textInputs[i]["cursorY"] > self.textInputs[i]["height"] then
  610.                     startLine = self.textInputs[i]["cursorY"] - self.textInputs[i]["height"]
  611.                 else
  612.                     startLine = 1
  613.                 end
  614.                 for j = startLine, #self.textInputs[i]["text"] do
  615.                     printLine = self.textInputs[i]["text"][j]
  616.                     if #printLine > self.textInputs[i]["width"] then
  617.                         printLine = string.sub(printLine, #printLine - (self.textInputs[i]["width"] - 2), #printLine)
  618.                     end
  619.                     if self.textInputs[i]["label"] ~= "password" then
  620.                         gpu.set(self.xPos + self.textInputs[i]["xPos"], self.yPos + (self.textInputs[i]["yPos"] + (j - 1)), printLine)
  621.                     else
  622.                         for k = 1, #printLine do
  623.                             gpu.set(self.xPos + (self.textInputs[i]["xPos"] + (k - 1)), self.yPos + self.textInputs[i]["yPos"], "*")
  624.                         end
  625.                     end
  626.                 end
  627.             end
  628.         end
  629.     end
  630.     gpu.setBackground(0x000000)
  631.     gpu.setForeground(0xFFFFFF)
  632. end
  633.  
  634. function screen:renderSubMenus()
  635.     if self.subTab ~= nil then
  636.         local w, h = gpu.getResolution()
  637.         local newOffset = 2
  638.         for i = 1, #self.subTab do
  639.             if self.subTab[i]["open"] then
  640.                 gpu.setBackground(0x666666)
  641.                 gpu.setForeground(0x000000)
  642.                 gpu.set(self.xPos + newOffset, self.yPos + 1, self.subTab[i]["label"])
  643.                 gpu.setBackground(0x999999)
  644.                 gpu.setForeground(0x000000)
  645.                 local maxLength = 0
  646.                 for j = 1, #self.subTab[i]["entries"] do
  647.                     if #self.subTab[i]["entries"][j]["label"] > maxLength then
  648.                         maxLength = #self.subTab[i]["entries"][j]["label"]
  649.                     end
  650.                 end
  651.                 gpu.fill(self.xPos + newOffset, self.yPos + 2, maxLength + 1, #self.subTab[i]["entries"], " ")
  652.                 for j = 1, #self.subTab[i]["entries"] do
  653.                     if self.yPos > h / 2 then
  654.                         gpu.set(self.xPos + newOffset, self.yPos - (j + 1), self.subTab[i]["entries"][j]["label"])
  655.                     else
  656.                         gpu.set(self.xPos + newOffset, self.yPos + (j + 1), self.subTab[i]["entries"][j]["label"])
  657.                     end
  658.                 end
  659.             else
  660.                 gpu.setBackground(0x999999)
  661.                 gpu.setForeground(0x000000)
  662.                 gpu.set(self.xPos + newOffset, self.yPos + 1, self.subTab[i]["label"])
  663.             end
  664.             newOffset = newOffset + (#self.subTab[i]["label"] + 1)
  665.         end
  666.     end
  667.     gpu.setBackground(0x000000)
  668.     gpu.setForeground(0xFFFFFF)
  669. end
  670.  
  671. function screen:renderFileLists()
  672.     if self.fileViewer ~= nil then
  673.         gpu.setForeground(white)
  674.         gpu.setForeground(black)
  675.         for i = 1, #self.fileViewer do
  676.             gpu.setBackground(white)
  677.             gpu.fill(self.xPos + self.fileViewer[i]["xPos"], self.yPos + self.fileViewer[i]["yPos"], self.fileViewer[i]["width"], self.fileViewer[i]["height"], " ")
  678.             for j = 1, #self.fileViewer[i]["list"] do
  679.                 if fs.isDirectory(self.fileViewer[i]["path"]..self.fileViewer[i]["list"][j]) then
  680.                     gpu.setBackground(0xFF9900)
  681.                     gpu.set(self.xPos + self.fileViewer[i]["xPos"], self.yPos + (self.fileViewer[i]["yPos"] + j), "¬")
  682.                 else
  683.                     gpu.setBackground(0xCCCCCC)
  684.                     gpu.set(self.xPos + self.fileViewer[i]["xPos"], self.yPos + (self.fileViewer[i]["yPos"] + j), "=")
  685.                 end
  686.                 gpu.setBackground(0xFFFFFF)
  687.                 gpu.set(self.xPos + (self.fileViewer[i]["xPos"] + 1), self.yPos + (self.fileViewer[i]["yPos"] + j), self.fileViewer[i]["list"][j])
  688.             end
  689.         end
  690.     end
  691.     gpu.setBackground(0x000000)
  692.     gpu.setForeground(0xFFFFFF)
  693. end
  694.  
  695. function screen:renderImages()
  696.     local curBg = 0x000000
  697.     local curFg = 0xFFFFFF
  698.     local curChar = " "
  699.     local lC = 1
  700.     local colCount = 1
  701.     if self.imTab ~= nil then
  702.         for i = 1, #self.imTab do --For every image in the table
  703.             for j = 1, #self.imTab[i]["layerData"] do --Check every layer
  704.                 if not self.imTab[i]["layerData"][j]["hidden"] then --If it's not hidden then compile a print table
  705.                     self.lPrint = {}
  706.                     for y = #self.imTab[i]["layerData"][j], 1, -1 do --For every line of the image layer (bottom to top)
  707.                         for x = 1, #self.imTab[i]["layerData"][j][y] do --For every column of the image layer
  708.                             if x == 1 then
  709.                                 colCount = 1
  710.                                 curBg = self.imTab[i]["layerData"][j][y][x]["bg"]
  711.                                 curFg = self.imTab[i]["layerData"][j][y][x]["fg"]
  712.                                 curChar = self.imTab[i]["layerData"][j][y][x]["char"]
  713.                                 self.lPrint[colCount] = {
  714.                                     str = self.imTab[i]["layerData"][j][y][x]["char"],
  715.                                     bg = self.imTab[i]["layerData"][j][y][x]["bg"],
  716.                                     fg = self.imTab[i]["layerData"][j][y][x]["fg"],
  717.                                     stx = self.xPos + (self.imTab[i]["xPos"] - 1),
  718.                                     sty = (self.yPos + (self.imTab[i]["yPos"] - 1)) + (y - 1),
  719.                                 }
  720.                                 if self.imTab[i]["layerData"][j][y][x]["bg"] == "trans" then
  721.                                     self.lPrint[colCount]["bg"] = self.imTab[i]["layerData"][1][y][x]["bg"]
  722.                                 end
  723.                             else
  724.                                 if self.imTab[i]["layerData"][j][y][x]["bg"] == curBg then
  725.                                     self.lPrint[colCount]["str"] = self.lPrint[colCount]["str"]..self.imTab[i]["layerData"][j][y][x]["char"]
  726.                                 else
  727.                                     colCount = colCount + 1
  728.                                     curBg = self.imTab[i]["layerData"][j][y][x]["bg"]
  729.                                     curFg = self.imTab[i]["layerData"][j][y][x]["fg"]
  730.                                     curChar = self.imTab[i]["layerData"][j][y][x]["char"]
  731.                                     self.lPrint[colCount] = {
  732.                                        str = self.imTab[i]["layerData"][j][y][x]["char"],
  733.                                        bg = self.imTab[i]["layerData"][j][y][x]["bg"],
  734.                                        fg = self.imTab[i]["layerData"][j][y][x]["fg"],
  735.                                        stx = (self.xPos + (self.imTab[i]["xPos"] - 1)) + (x - 1),
  736.                                        sty = (self.yPos + (self.imTab[i]["yPos"] - 1)) + (y - 1),
  737.                                    }
  738.                                    if j > 1 then
  739.                                        if self.imTab[i]["layerData"][j][y][x]["bg"] == "trans" then
  740.                                            self.lPrint[colCount]["bg"] = self.imTab[i]["layerData"][1][y][x]["bg"]
  741.                                        end
  742.                                        gpu.setBackground(self.lPrint[colCount - 1]["bg"])
  743.                                        gpu.setForeground(self.lPrint[colCount - 1]["fg"])
  744.                                        gpu.set(self.lPrint[colCount - 1]["stx"], self.lPrint[colCount - 1]["sty"], self.lPrint[colCount - 1]["str"])
  745.                                    else
  746.                                        if self.imTab[i]["layerData"][j][y][x]["bg"] ~= "trans" then
  747.                                            gpu.setBackground(self.lPrint[colCount - 1]["bg"])
  748.                                            gpu.setForeground(self.lPrint[colCount - 1]["fg"])
  749.                                            gpu.set(self.lPrint[colCount - 1]["stx"], self.lPrint[colCount - 1]["sty"], self.lPrint[colCount - 1]["str"])
  750.                                        else
  751.                                            gpu.setBackground(0x000000)
  752.                                            gpu.setForeground(0xFFFFFF)
  753.                                            gpu.set(self.lPrint[colCount - 1]["stx"], self.lPrint[colCount - 1]["sty"], self.lPrint[colCount - 1]["str"])
  754.                                        end
  755.                                    end
  756.                                 end
  757.                             end
  758.                         end
  759.                         gpu.setBackground(self.lPrint[colCount]["bg"])
  760.                         gpu.setForeground(self.lPrint[colCount]["fg"])
  761.                         gpu.set(self.lPrint[colCount]["stx"], self.lPrint[colCount]["sty"], self.lPrint[colCount]["str"])
  762.                     end
  763.                 end
  764.             end
  765.         end
  766.     end
  767. end
  768.  
  769. function screen:render()
  770.     if not self.renderBool then return end
  771.     self:renderBoxes()
  772.     self:renderTextBoxes()
  773.     self:renderButtons()
  774.     self:renderTextInputs()
  775.     self:renderSubMenus()
  776.     self:renderFileLists()
  777.     self:renderImages()
  778.     self:renderText()
  779. end
  780.  
  781. --PAINT PROGRAM START--
  782.  
  783. --CONSTANTS--
  784.  
  785. scrx, scry = gpu.getResolution()
  786. local buttonWidth = 20
  787. local vTab = {
  788.     [1] = "00",
  789.     [2] = "33",
  790.     [3] = "66",
  791.     [4] = "99",
  792.     [5] = "CC",
  793.     [6] = "FF",
  794.     }
  795.  
  796. --ARGUMENTS--
  797.  
  798. args = {...}
  799. filename = args[1]
  800. width = tonumber(args[2])
  801. height = tonumber(args[3])
  802. if filename == nil then filename = "Untitled" end
  803. if width == nil then width = scrx end
  804. if height == nil then height = scry end
  805.  
  806. --VARIABLES--
  807.  
  808. local fgCur = 0x000000
  809. local fgLast = 0x000000
  810. local bgCur = 0xFFFFFF
  811. local bgLast = 0xFFFFFF
  812. local charCur = " "
  813. local charLast = " "
  814. local activeLayer = 1
  815. local activePalette = 1
  816. local activePalette = 1
  817. local pEntry = 1
  818. local fgBool = false
  819. local bgBool = true
  820. local charBool = false
  821. local menuBool = true
  822. local paletteBool = false
  823. local colourBool = false
  824. local browserBool = false
  825. local toolBool = false
  826. local layerBool = false
  827. local playerBool = false
  828. local rcl = screen:newPane(rcl, 15, 14)
  829. local pTab = screen:newPane(pTab, 28, 14)
  830. local colour = screen:newPane(colour, 13, 14)
  831. local tools = screen:newPane(tools, 15, 14)
  832. local layers = screen:newPane(layers, 15, 19)
  833. local player = screen:newPane(player, 15, 6)
  834.  
  835. --OBJECT CALL FUNCTIONS--
  836.  
  837. function newImage(sizeX, sizeY)
  838.     local ob = screen:newPane(ob, sizeX, sizeY)
  839.     ob:newImage(filename, 1, 1, sizeX, sizeY)
  840.     ob:center()
  841.     return(ob)
  842. end
  843.  
  844. function newLayer() --needs writing.
  845.    
  846. end
  847.  
  848. function rClickMenuSetup()
  849.     rcl:box(1, 1, rcl.width, rcl.height, 0x999999)
  850.     rcl:box(1, 1, rcl.width, 1, 0x00CCCC)
  851.     rcl:centerText(1, 1, rcl.width, 0x00CCCC, 0x000000, "Menu")
  852.     rcl.xPos = 1
  853.     rcl.yPos = 1
  854. end
  855.  
  856. function paletteSetup()
  857.     pTab.xPos = scrx - pTab.width
  858.     pTab.yPos = 1
  859.     pTab:box(1, 1, pTab.width, pTab.height, 0x999999)
  860.     pTab:box(1, 1, pTab.width, 1, 0x00CCCC)
  861.     pTab:centerText(1, 1, pTab.width, 0x00CCCC, 0x000000, "Colour Palette")
  862.     pTab.pCount = 1
  863.     pTab.list = {}
  864.     pTab.list[1] = {}
  865.     pTab.list[1][1] = 0x000000
  866.     pTab.list[1][2] = 0xFFFFFF
  867.     pTab.list[1][3] = 0xFF0000
  868.     pTab.list[1][4] = 0x00FF00
  869.     pTab.list[1][5] = 0x0000FF
  870.     pTab.list[1][6] = 0xFF00FF
  871.     pTab.list[1][7] = 0xFFFF00
  872.     pTab.list[1][8] = 0x00FFFF
  873.     pTab.list[1][9] = 0x00CCCC
  874. end
  875.  
  876. function newPalette()
  877.     pTab.pCount = pTab.pCount + 1
  878.     pTab.list[pTab.pCount] = {}
  879.     for i = 1, 9 do
  880.         pTab.list[pTab.pCount][i] = 0xFFFFFF
  881.     end
  882. end
  883.  
  884. function colourSetup()
  885.     colour:center()
  886.     colour:box(1, 1, colour.width, colour.height, 0x999999)
  887.     colour:box(1, 1, colour.width, 1, 0x00CCCC)
  888.     colour:centerText(1, 1, colour.width, 0x00CCCC, 0x000000, "RGB Edit")
  889.     colour.rVal = 6
  890.     colour.gVal = 6
  891.     colour.bVal = 6
  892. end
  893.  
  894. function toolBox()
  895.     tools:center()
  896.     tools:box(1, 1, tools.width, tools.height, 0x999999, "scale")
  897.     tools:box(1, 1, tools.width, 1, 0x00CCCC, "scale")
  898.     tools:centerText(1, 1, tools.width, 0x00CCCC, 0x000000, "Tools")
  899.     tools.brush = {
  900.         active = true,
  901.         sizeX = 1,
  902.         sizeY = 1,
  903.     }
  904.     tools.line = {
  905.         active = false,
  906.         startx = 0,
  907.         starty = 0,
  908.         endx = 0,
  909.         endy = 0,
  910.     }
  911.     tools.boxTool = {
  912.         active = false,
  913.         startx = 0,
  914.         starty = 0,
  915.         endx = 0,
  916.         endy = 0,
  917.     }
  918.     tools.circle = {
  919.         active = false,
  920.         radius = 1,
  921.         solid = false,
  922.     }
  923. end
  924.  
  925. function fileBrowser(col, name)
  926.     local object = screen:newPane(object, 30, 15)
  927.     object.selected = false
  928.     object.priority = 9
  929.     object.label = name
  930.     object.isPane = true
  931.     object.colour = col
  932.     object:center()
  933.     object:box(1, 1, object.width, object.height, 0x999999, "scale")
  934.     object:box(1, 1, object.width, 1, col, "scale")
  935.     object:centerText(1, 1, object.width, col, 0x000000, object.label)
  936.     object:box(2, 5, object.width - 2, object.height - 5, 0xFFFFFF, "scale")
  937.     object:addFileViewer(2, 5, object.width - 2, object.height - 5, 0xFFFFFF, path.."/Images")
  938.     object:text(2, 3, 0x999999, 0x000000, "Path:")
  939.     object:inputBox("address", 8, 3, object.width - 10, 1, "scale")
  940.     object:button("^", object.width - 2, 3, 1, 1, 0x00CCCC, "navigate_up")
  941.     object.textInputs[1]["text"][1] = path.."/Images"
  942.     object.textInputs[1]["cursorX"] = #object.textInputs[1]["text"][1] + 1
  943.     return object
  944. end
  945.  
  946. function layerTool()
  947.     layers:center()
  948.     layers:box(1, 1, layers.width, layers.height, 0x999999, "scale")
  949.     layers:box(1, 1, layers.width, 1, 0x00CCCC, "scale")
  950.     layers:centerText(1, 1, layers.width, 0x00CCCC, 0x000000, "Layers")
  951.     layers.lPage = 1
  952.     layers.transBool = false
  953. end
  954.  
  955. function initPlayer()
  956.     player:center()
  957.     player:box(1, 1, player.width, player.height, 0x999999, "scale")
  958.     player:box(1, 1, player.width, 1, 0x00CCCC, "scale")
  959.     player:centerText(1, 1, player.width, 0x00CCCC, 0x000000, "Animator")
  960.     player.loop = false
  961.     player.play = false
  962. end
  963.  
  964. --DRAW FUNCTIONS--
  965.  
  966. function renderRClick()
  967.     if menuBool then
  968.         rcl.buttonTab = nil
  969.         if paletteBool then
  970.             rcl:button("Palette", 2, 3, rcl.width - 2, 1, 0x0099CC, "pSwitch")
  971.         else
  972.             rcl:button("Palette", 2, 3, rcl.width - 2, 1, 0x00CCCC, "pSwitch")
  973.         end
  974.         if toolBool then
  975.             rcl:button("Tools", 2, 5, rcl.width - 2, 1, 0x0099CC, "tSwitch")
  976.         else
  977.             rcl:button("Tools", 2, 5, rcl.width - 2, 1, 0x00CCCC, "tSwitch")
  978.         end
  979.         if layerBool then
  980.             rcl:button("Layers", 2, 7, rcl.width - 2, 1, 0x0099CC, "layers")
  981.         else
  982.             rcl:button("Layers", 2, 7, rcl.width - 2, 1, 0x00CCCC, "layers")
  983.         end
  984.         if playerBool then
  985.             rcl:button("Animate", 2, 9, rcl.width - 2, 1, 0x0099CC, "animate")
  986.         else
  987.             rcl:button("Animate", 2, 9, rcl.width - 2, 1, 0x00CCCC, "animate")
  988.         end
  989.         rcl:button("Save", 2, 11, rcl.width - 2, 1, 0x00CCCC, "save")
  990.         rcl:button("Load", 2, 13, rcl.width - 2, 1, 0x00CCCC, "load")
  991.         rcl:render()
  992.     end
  993. end
  994.  
  995. function drawPalette(active)
  996.     if paletteBool then
  997.         local pStr = active.."/"..pTab.pCount
  998.         if pTab.width < 23 then pTab.width = 23 end
  999.         local navx = math.floor((pTab.width - 21) / 2)
  1000.         pTab.buttonTab = nil
  1001.         pTab:button("New", navx, 3, 5, 1, 0x00CCCC, "add_palette")
  1002.         pTab:button("<", navx + 6, 3, 3, 1, 0x00CCCC, "bk_palette")
  1003.         pTab:button(pStr, navx + 10, 3, 8, 1, 0xFFFFFF, "never_mind_this")
  1004.         pTab:button(">", navx + 19, 3, 3, 1, 0x00CCCC, "fd_palette")
  1005.         navx = math.floor((pTab.width - 17) / 2)
  1006.         if fgBool then
  1007.             pTab:button("FG", navx, 5, 5, 1, 0x0099CC, "fg")
  1008.         else
  1009.             pTab:button("FG", navx, 5, 5, 1, 0x00CCCC, "fg")
  1010.         end
  1011.         if bgBool then
  1012.             pTab:button("BG", navx + 6, 5, 5, 1, 0x0099CC, "bg")
  1013.         else
  1014.             pTab:button("BG", navx + 6, 5, 5, 1, 0x00CCCC, "bg")
  1015.         end
  1016.         if charBool then
  1017.             pTab:button("Char", navx + 12, 5, 5, 1, 0x0099CC, "char")
  1018.         else
  1019.             pTab:button("Char", navx + 12, 5, 5, 1, 0x00CCCC, "char")
  1020.         end
  1021.         pTab:button(" ", navx, 7, 5, 1, fgCur, "fg")
  1022.         if bgCur ~= "trans" then
  1023.             pTab:button(" ", navx + 6, 7, 5, 1, bgCur, "bg")
  1024.             pTab:button(" ", navx + 12, 7, 5, 1, bgCur, "char")
  1025.         else
  1026.             pTab:button("TR", navx + 6, 7, 5, 1, 0xFFFFFF, "bg")
  1027.             pTab:button(" ", navx + 12, 7, 5, 1, 0xFFFFFF, "char")
  1028.         end
  1029.         local xPos = 2
  1030.         local yPos = 9
  1031.         local bWidth = math.floor((pTab.width - 4) / 3)
  1032.         local bHeight = math.floor((pTab.height - 9) / 3)
  1033.         for i = 1, #pTab.list[active] do
  1034.             if pTab.list[active][i] ~= nil then
  1035.                 col = pTab.list[active][i]
  1036.             else
  1037.                 col = 0xFFFFFF
  1038.             end
  1039.             pTab:button(charCur, xPos, yPos, bWidth, bHeight, col, i)
  1040.             if i % 3 == 0 then
  1041.                 xPos = 2
  1042.                 yPos = yPos + (bHeight + 1)
  1043.             else
  1044.                 xPos = xPos + (bWidth + 1)
  1045.             end
  1046.         end
  1047.         pTab:render()
  1048.     end
  1049. end
  1050.  
  1051. function colourChanger()
  1052.     if colourBool then
  1053.         colour.buttonTab = nil
  1054.         if colour.rVal < 6 then
  1055.             colour:button("^", 2, 3, 3, 1, 0x00CCCC, "r_plus")
  1056.         else
  1057.             colour:button("^", 2, 3, 3, 1, 0x0099CC, "r_plus")
  1058.         end
  1059.         colour:button(vTab[colour.rVal], 2, 5, 3, 1, 0xFFFFFF, "no_action")
  1060.         if colour.rVal > 1 then
  1061.             colour:button("v", 2, 7, 3, 1, 0x00CCCC, "r_minus")
  1062.         else
  1063.             colour:button("v", 2, 7, 3, 1, 0x0099CC, "r_minus")
  1064.         end
  1065.         if colour.gVal < 6 then
  1066.             colour:button("^", 6, 3, 3, 1, 0x00CCCC, "g_plus")
  1067.         else
  1068.             colour:button("^", 6, 3, 3, 1, 0x0099CC, "g_plus")
  1069.         end
  1070.         colour:button(vTab[colour.gVal], 6, 5, 3, 1, 0xFFFFFF, "no_action")
  1071.         if colour.gVal > 1 then
  1072.             colour:button("v", 6, 7, 3, 1, 0x00CCCC, "g_minus")
  1073.         else
  1074.             colour:button("v", 6, 7, 3, 1, 0x0099CC, "g_minus")
  1075.         end
  1076.         if colour.bVal < 6 then
  1077.             colour:button("^", 10, 3, 3, 1, 0x00CCCC, "b_plus")
  1078.         else
  1079.             colour:button("^", 10, 3, 3, 1, 0x0099CC, "b_plus")
  1080.         end
  1081.         colour:button(vTab[colour.bVal], 10, 5, 3, 1, 0xFFFFFF, "no_action")
  1082.         if colour.bVal > 1 then
  1083.             colour:button("v", 10, 7, 3, 1, 0x00CCCC, "b_minus")
  1084.         else
  1085.             colour:button("v", 10, 7, 3, 1, 0x0099CC, "b_minus")
  1086.         end
  1087.         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")
  1088.         colour:button("Ok", 2, 13, 5, 1, 0x00CCCC, "set_colour")
  1089.         colour:button("Exit", 8, 13, 5, 1, 0x00CCCC, "exit")
  1090.         colour:render()
  1091.     end
  1092. end
  1093.  
  1094. function drawToolBox()
  1095.     if toolBool then
  1096.         tools.buttonTab = nil
  1097.         tools.printTab = nil
  1098.         tools:centerText(1, 1, tools.width, 0x00CCCC, 0x000000, "Tools")
  1099.         if tools.brush["active"] then
  1100.             tools:resize(15, 11)
  1101.             tools:centerText(1, 7, tools.width, 0x999999, 0x000000, "Width")
  1102.             tools:centerText(1, 9, tools.width, 0x999999, 0x000000, "Height")
  1103.             tools:button("Brush", 2, 3, 6, 1, 0x0099CC, "brSwitch")
  1104.             if tools.brush["sizeX"] > 1 then
  1105.                 tools:button("<", 2, 8, 3, 1, 0x00CCCC, "brx_minus")
  1106.                 tools:button(tostring(tools.brush["sizeX"]), 6, 8, 5, 1, 0xFFFFFF, "no_action")
  1107.                 tools:button(">", 12, 8, 3, 1, 0x00CCCC, "brx_plus")
  1108.             else
  1109.                 tools:button("<", 2, 8, 3, 1, 0x0099CC, "brx_minus")
  1110.                 tools:button(tostring(tools.brush["sizeX"]), 6, 8, 5, 1, 0xFFFFFF, "no_action")
  1111.                 tools:button(">", 12, 8, 3, 1, 0x00CCCC, "brx_plus")
  1112.             end
  1113.             if tools.brush["sizeY"] > 1 then
  1114.                 tools:button("<", 2, 10, 3, 1, 0x00CCCC, "bry_minus")
  1115.                 tools:button(tostring(tools.brush["sizeY"]), 6, 10, 5, 1, 0xFFFFFF, "no_action")
  1116.                 tools:button(">", 12, 10, 3, 1, 0x00CCCC, "bry_plus")
  1117.             else
  1118.                 tools:button("<", 2, 10, 3, 1, 0x0099CC, "bry_minus")
  1119.                 tools:button(tostring(tools.brush["sizeY"]), 6, 10, 5, 1, 0xFFFFFF, "no_action")
  1120.                 tools:button(">", 12, 10, 3, 1, 0x00CCCC, "bry_plus")
  1121.             end
  1122.         else
  1123.             tools:button("Brush", 2, 3, 6, 1, 0x00CCCC, "brSwitch")
  1124.         end
  1125.         if tools.line["active"] then
  1126.             tools:resize(15, 15)
  1127.             tools:centerText(1, 7, tools.width, 0x999999, 0x000000, "X Start")
  1128.             tools:centerText(1, 9, tools.width, 0x999999, 0x000000, "Y Start")
  1129.             tools:centerText(1, 11, tools.width, 0x999999, 0x000000, "X End")
  1130.             tools:centerText(1, 13, tools.width, 0x999999, 0x000000, "Y End")
  1131.             tools:button("Line", 9, 3, 6, 1, 0x0099CC, "lSwitch")
  1132.             tools:button(tostring(tools.line["startx"]), 2, 8, tools.width - 2, 1, 0xFFFFFF, "no_action")
  1133.             tools:button(tostring(tools.line["starty"]), 2, 10, tools.width - 2, 1, 0xFFFFFF, "no_action")
  1134.             tools:button(tostring(tools.line["endx"]), 2, 12, tools.width - 2, 1, 0xFFFFFF, "no_action")
  1135.             tools:button(tostring(tools.line["endy"]), 2, 14, tools.width - 2, 1, 0xFFFFFF, "no_action")
  1136.         else
  1137.             tools:button("Line", 9, 3, 6, 1, 0x00CCCC, "lSwitch")
  1138.         end
  1139.         if tools.boxTool["active"] then
  1140.             tools:resize(15, 15)
  1141.             tools:centerText(1, 7, tools.width, 0x999999, 0x000000, "X Start")
  1142.             tools:centerText(1, 9, tools.width, 0x999999, 0x000000, "Y Start")
  1143.             tools:centerText(1, 11, tools.width, 0x999999, 0x000000, "X End")
  1144.             tools:centerText(1, 13, tools.width, 0x999999, 0x000000, "Y End")
  1145.             tools:button("Box", 2, 5, 6, 1, 0x0099CC, "bSwitch")
  1146.             tools:button(tostring(tools.line["startx"]), 2, 8, tools.width - 2, 1, 0xFFFFFF, "no_action")
  1147.             tools:button(tostring(tools.line["starty"]), 2, 10, tools.width - 2, 1, 0xFFFFFF, "no_action")
  1148.             tools:button(tostring(tools.line["endx"]), 2, 12, tools.width - 2, 1, 0xFFFFFF, "no_action")
  1149.             tools:button(tostring(tools.line["endy"]), 2, 14, tools.width - 2, 1, 0xFFFFFF, "no_action")
  1150.         else
  1151.             tools:button("Box", 2, 5, 6, 1, 0x00CCCC, "bSwitch")
  1152.         end
  1153.         if tools.circle["active"] then
  1154.             tools:resize(15, 11)
  1155.             tools:button("Circle", 9, 5, 6, 1, 0x0099CC, "cSwitch")
  1156.             tools:centerText(1, 7, tools.width, 0x999999, 0x000000, "Radius")
  1157.             if tools.circle["radius"] > 1 then
  1158.                 tools:button("<", 2, 8, 3, 1, 0x00CCCC, "rad_minus")
  1159.                 tools:button(tostring(tools.circle["radius"]), 6, 8, 5, 1, 0xFFFFFF, "no_action")
  1160.                 tools:button(">", 12, 8, 3, 1, 0x00CCCC, "rad_plus")
  1161.             else
  1162.                 tools:button("<", 2, 8, 3, 1, 0x0099CC, "rad_minus")
  1163.                 tools:button(tostring(tools.circle["radius"]), 6, 8, 5, 1, 0xFFFFFF, "no_action")
  1164.                 tools:button(">", 12, 8, 3, 1, 0x00CCCC, "rad_plus")
  1165.             end
  1166.             if tools.circle["solid"] then
  1167.                 tools:button("Filled", 2, 10, tools.width - 2, 1, 0x0099CC, "toggle_filled")
  1168.             else
  1169.                 tools:button("Filled", 2, 10, tools.width - 2, 1, 0x00CCCC, "toggle_filled")
  1170.             end
  1171.         else
  1172.             tools:button("Circle", 9, 5, 6, 1, 0x00CCCC, "cSwitch")
  1173.         end
  1174.         tools:render()
  1175.     end
  1176. end
  1177.  
  1178. function drawLayerMenu()
  1179.     if layerBool then
  1180.         layers.buttonTab = nil
  1181.         if layers.transBool then
  1182.             layers:button("Trans", 2, 3, layers.width - 2, 1, 0x0099CC, "trans_toggle")
  1183.         else
  1184.             layers:button("Trans", 2, 3, layers.width - 2, 1, 0x00CCCC, "trans_toggle")
  1185.         end
  1186.         if layers.lPage == 1 then
  1187.             layers:button("<", 2, 5, 3, 1, 0x0099CC, "page_down")
  1188.         else
  1189.             layers:button("<", 2, 5, 3, 1, 0x00CCCC, "page_down")
  1190.         end
  1191.         layers:button(tostring(layers.lPage).."/"..tostring(image.imTab[1]["pages"]), 6, 5, 5, 1, 0xFFFFFF, "page_down")
  1192.         if layers.lPage < image.imTab[1]["pages"] then
  1193.             layers:button(">", layers.width - 3, 5, 3, 1, 0x00CCCC, "page_up")
  1194.         else
  1195.             layers:button(">", layers.width - 3, 5, 3, 1, 0x0099CC, "page_up")
  1196.         end
  1197.         layers:button("New Layer", 2, 7, layers.width - 2, 1, 0x00CCCC, "new_layer")
  1198.         local yoffset = 1
  1199.         for i = (layers.lPage * 10) - 9, layers.lPage * 10 do
  1200.             if image.imTab[1]["layerData"][i] ~= nil then
  1201.                 if i == activeLayer then
  1202.                     layers:button(tostring(i), 2, 8 + yoffset, layers.width - 6, 1, 0x6666FF, i)
  1203.                 else
  1204.                     layers:button(tostring(i), 2, 8 + yoffset, layers.width - 6, 1, 0xFFFFFF, i)
  1205.                 end
  1206.                 if image.imTab[1]["layerData"][i]["hidden"] then
  1207.                     layers:button("H", layers.width - 3, 8 + yoffset, 3, 1, 0xCC0000, "show_"..tostring(i))
  1208.                 else
  1209.                     layers:button("V", layers.width - 3, 8 + yoffset, 3, 1, 0x00CC00, "hide_"..tostring(i))
  1210.                 end
  1211.             end
  1212.             yoffset = yoffset + 1
  1213.         end
  1214.         layers:render()
  1215.     end
  1216. end
  1217.  
  1218. function drawScreen(clear)
  1219.     if clear ~= nil then
  1220.         gpu.setForeground(0xFFFFFF)
  1221.         gpu.setBackground(0x000000)
  1222.         term.clear()
  1223.     end
  1224.     image:renderImages()
  1225.     drawPalette(activePalette)
  1226.     drawToolBox()
  1227.     colourChanger()
  1228.     if browserBool then browser:render() end
  1229.     drawLayerMenu()
  1230.     drawRemote()
  1231.     renderRClick()
  1232.     gpu.setForeground(0xFFFFFF)
  1233.     gpu.setBackground(0x000000)
  1234. end
  1235.  
  1236. function drawRemote()
  1237.     if playerBool then
  1238.         player.buttonTab = nil
  1239.         if player.play then
  1240.             player:button("Play", 2, 3, 6, 3, 0x0099CC, "play")
  1241.         else
  1242.             player:button("Play", 2, 3, 6, 3, 0x00CCCC, "play")
  1243.         end
  1244.         if player.loop then
  1245.             player:button("Loop", 9, 3, 6, 3, 0x0099CC, "loop")
  1246.         else
  1247.             player:button("Loop", 9, 3, 6, 3, 0x00CCCC, "loop")
  1248.         end
  1249.         player:render()
  1250.     end
  1251. end
  1252.  
  1253. function playVideo()
  1254.     gpu.setForeground(0xFFFFFF)
  1255.     gpu.setBackground(0x000000)
  1256.     term.clear()
  1257.     playerRunning = true
  1258.     while playerRunning do
  1259.         for al = 1, #image.imTab[1]["layerData"] do
  1260.             for i = 1, #image.imTab[1]["layerData"] do
  1261.                 image.imTab[1]["layerData"][i]["hidden"] = true
  1262.             end
  1263.             image.imTab[1]["layerData"][al]["hidden"] = false
  1264.             image:render()
  1265.         end
  1266.         if not player.loop then
  1267.             break
  1268.         end
  1269.         run()
  1270.     end
  1271.     for i = 1, #image.imTab[1]["layerData"] do
  1272.         image.imTab[1]["layerData"][i]["hidden"] = true
  1273.     end
  1274.     image.imTab[1]["layerData"][1]["hidden"] = false
  1275.     image.imTab[1]["layerData"][activeLayer]["hidden"] = false
  1276.     drawScreen("c")
  1277. end
  1278.  
  1279. --RUN LOOP--
  1280.  
  1281. function checkImage(ev, clx, cly, pl, btn)
  1282.     local modifier = 1.5
  1283.     if btn == 0 then
  1284.         if ev == "touch" or ev == "drag" then
  1285.             local imStx = image.xPos + (image.imTab[1]["xPos"] - 1)
  1286.             local imSty = image.yPos + (image.imTab[1]["yPos"] - 1)
  1287.             local imMax = imStx + (image.imTab[1]["width"] - 1)
  1288.             local imMay = imSty + (image.imTab[1]["height"] - 1)
  1289.             local imClx = clx - (imStx - 1)
  1290.             local imCly = cly - (imSty - 1)
  1291.             if clx >= imStx and clx <= imMax then
  1292.                 if cly >= imSty and cly <= imMay then
  1293.                     gpu.setForeground(fgCur)
  1294.                     if bgCur ~= "trans" then
  1295.                         gpu.setBackground(bgCur)
  1296.                     end
  1297.                     if tools.brush["active"] then
  1298.                         for y = 1, tools.brush["sizeY"] do
  1299.                             for x = 1, tools.brush["sizeX"] do
  1300.                                 if imCly - (y - 1) >= 1 and imCly + (y - 1) <= image.height then
  1301.                                     if imClx - (x - 1) >= 1 and imClx + (x - 1) <= image.width then
  1302.                                         if image.imTab[1]["layerData"][activeLayer][imCly - (y - 1)][imClx - (x - 1)] ~= nil then
  1303.                                             if x + y <= math.ceil((tools.brush["sizeX"] + tools.brush["sizeY"]) / modifier) then
  1304.                                                 image.imTab[1]["layerData"][activeLayer][imCly - (y - 1)][imClx - (x - 1)]["bg"] = bgCur
  1305.                                                 gpu.set(clx - (x - 1), cly - (y - 1), charCur)
  1306.                                             end
  1307.                                         end
  1308.                                         if image.imTab[1]["layerData"][activeLayer][imCly + (y - 1)][imClx + (x - 1)] ~= nil then
  1309.                                             if x + y <= math.ceil((tools.brush["sizeX"] + tools.brush["sizeY"]) / modifier) then
  1310.                                                 image.imTab[1]["layerData"][activeLayer][imCly + (y - 1)][imClx + (x - 1)]["bg"] = bgCur
  1311.                                                 gpu.set(clx + (x - 1), cly + (y - 1), charCur)
  1312.                                             end
  1313.                                         end
  1314.                                         if image.imTab[1]["layerData"][activeLayer][imCly + (y - 1)][imClx - (x - 1)] ~= nil then
  1315.                                             if x + y <= math.ceil((tools.brush["sizeX"] + tools.brush["sizeY"]) / modifier) then
  1316.                                                 image.imTab[1]["layerData"][activeLayer][imCly + (y - 1)][imClx - (x - 1)]["bg"] = bgCur
  1317.                                                 gpu.set(clx + (x - 1), cly - (y - 1), charCur)
  1318.                                             end
  1319.                                         end
  1320.                                         if image.imTab[1]["layerData"][activeLayer][imCly - (y - 1)][imClx + (x - 1)] ~= nil then
  1321.                                             if x + y <= math.ceil((tools.brush["sizeX"] + tools.brush["sizeY"]) / modifier) then
  1322.                                                 image.imTab[1]["layerData"][activeLayer][imCly - (y - 1)][imClx + (x - 1)]["bg"] = bgCur
  1323.                                                 gpu.set(clx - (x - 1), cly + (y - 1), charCur)
  1324.                                             end
  1325.                                         end
  1326.                                     end
  1327.                                 end
  1328.                             end
  1329.                         end
  1330.                     elseif tools.line["active"] then
  1331.                         if tools.line["startx"] == 0 and tools.line["starty"] == 0 then
  1332.                             tools.line["startx"] = imClx
  1333.                             tools.line["starty"] = imCly
  1334.                             drawScreen()
  1335.                             gpu.setBackground(0x00FF00)
  1336.                             gpu.set(clx, cly, " ")
  1337.                             gpu.setBackground(0x000000)
  1338.                             return true
  1339.                         elseif tools.line["endx"] == 0 and tools.line["endy"] == 0 then
  1340.                             tools.line["endx"] = imClx
  1341.                             tools.line["endy"] = imCly
  1342.                             local difx = (math.max(tools.line["startx"], tools.line["endx"]) - math.min(tools.line["startx"], tools.line["endx"])) + 1
  1343.                             local dify = (math.max(tools.line["starty"], tools.line["endy"]) - math.min(tools.line["starty"], tools.line["endy"])) + 1
  1344.                             local xPos = tools.line["startx"]
  1345.                             local yPos = tools.line["starty"]
  1346.                             local xmod = 1
  1347.                             local ymod = 1
  1348.                             local xoff = 0
  1349.                             if tools.line["startx"] > tools.line["endx"] then xmod = -1 end
  1350.                             if tools.line["starty"] > tools.line["endy"] then ymod = -1 end
  1351.                             for y = 1, dify do
  1352.                                 if difx == 1 then
  1353.                                     image.imTab[1]["layerData"][activeLayer][yPos][xPos]["bg"] = bgCur
  1354.                                 else
  1355.                                     for i = 1, math.floor(math.max(difx, dify) / math.min(difx, dify)) do
  1356.                                         image.imTab[1]["layerData"][activeLayer][yPos][xPos]["bg"] = bgCur
  1357.                                         xPos = xPos + xmod
  1358.                                     end
  1359.                                 end
  1360.                                 yPos = yPos + ymod
  1361.                             end
  1362.                             tools.line["startx"] = 0
  1363.                             tools.line["starty"] = 0
  1364.                             tools.line["endx"] = 0
  1365.                             tools.line["endy"] = 0
  1366.                             drawScreen()
  1367.                             return true
  1368.                         end
  1369.                     elseif tools.boxTool["active"] then
  1370.                         if tools.boxTool["startx"] == 0 and tools.boxTool["starty"] == 0 then
  1371.                             tools.boxTool["startx"] = imClx
  1372.                             tools.boxTool["starty"] = imCly
  1373.                             drawScreen()
  1374.                             gpu.setBackground(0xFF0000)
  1375.                             gpu.set(clx, cly, " ")
  1376.                             gpu.setBackground(0x000000)
  1377.                             return true
  1378.                         elseif tools.boxTool["endx"] == 0 and tools.boxTool["endy"] == 0 then
  1379.                             tools.boxTool["endx"] = imClx
  1380.                             tools.boxTool["endy"] = imCly
  1381.                             local minx = math.min(tools.boxTool["startx"], tools.boxTool["endx"])
  1382.                             local maxx = math.max(tools.boxTool["startx"], tools.boxTool["endx"])
  1383.                             local miny = math.min(tools.boxTool["starty"], tools.boxTool["endy"])
  1384.                             local maxy = math.max(tools.boxTool["starty"], tools.boxTool["endy"])
  1385.                             for y = miny, maxy do
  1386.                                 for x = minx, maxx do
  1387.                                     image.imTab[1]["layerData"][activeLayer][y][x]["bg"] = bgCur
  1388.                                 end
  1389.                             end
  1390.                             tools.boxTool["startx"] = 0
  1391.                             tools.boxTool["starty"] = 0
  1392.                             tools.boxTool["endx"] = 0
  1393.                             tools.boxTool["endy"] = 0
  1394.                             drawScreen()
  1395.                             return true
  1396.                         end
  1397.                     elseif tools.circle["active"] then
  1398.                         for r = 1, tools.circle["radius"] do
  1399.                             if not tools.circle["solid"] then r = tools.circle["radius"] end
  1400.                             for j = 1, 360 do
  1401.                                 local angle = (j * math.pi) / 180
  1402.                                 local ptx, pty = clx + (r * math.cos(angle)), (cly + (r * math.sin(angle)) / 2)
  1403.                                 if math.floor(pty) - imSty >= 1 and math.floor(pty) - imSty <= image.height then
  1404.                                     if math.floor(ptx) - imStx >= 1 and math.floor(ptx) - imStx <= image.width then
  1405.                                         image.imTab[1]["layerData"][activeLayer][math.floor(pty) - imSty][math.floor(ptx) - imStx]["bg"] = bgCur
  1406.                                     end
  1407.                                 end
  1408.                             end
  1409.                             if not tools.circle["solid"] then break end
  1410.                         end
  1411.                         drawScreen()
  1412.                     end
  1413.                 end
  1414.             end
  1415.         end
  1416.     end
  1417.     return false
  1418. end
  1419.  
  1420. function checkRCL(ev, clx, cly, pl, btn)
  1421.     if menuBool then
  1422.         if clx >= rcl.xPos and clx <= rcl.xPos + rcl.width then
  1423.             if cly <= rcl.yPos and cly <= rcl.yPos + rcl.height then
  1424.                 rcl.grabbed = true
  1425.             end
  1426.         end
  1427.         if ev == "touch" then
  1428.             for i = 1, #rcl.buttonTab do
  1429.                 local stx = rcl.xPos + rcl.buttonTab[i]["xPos"]
  1430.                 local sty = rcl.yPos + (rcl.buttonTab[i]["yPos"] - 1)
  1431.                 local max = stx + rcl.buttonTab[i]["width"]
  1432.                 local may = sty + rcl.buttonTab[i]["height"]
  1433.                 if clx >= stx and clx <= max then
  1434.                     if cly >= sty and cly <= may then
  1435.                         if rcl.buttonTab[i]["returnVal"] == "pSwitch" then
  1436.                             paletteBool = not paletteBool
  1437.                             colourBool = false
  1438.                             drawScreen("c")
  1439.                         elseif rcl.buttonTab[i]["returnVal"] == "tSwitch" then
  1440.                             toolBool = not toolBool
  1441.                             drawScreen("c")
  1442.                         elseif rcl.buttonTab[i]["returnVal"] == "save" then
  1443.                             if not fs.isDirectory(path.."/Images/") then fs.makeDirectory(path.."/Images/") end
  1444.                             image:saveImage(filename, path.."/Images/"..filename)
  1445.                             return true
  1446.                         elseif rcl.buttonTab[i]["returnVal"] == "load" then
  1447.                             browserBool = not browserBool
  1448.                             activeLayer = 1
  1449.                             drawScreen("c")
  1450.                         elseif rcl.buttonTab[i]["returnVal"] == "layers" then
  1451.                             layerBool = not layerBool
  1452.                             drawScreen("c")
  1453.                             return true
  1454.                         elseif rcl.buttonTab[i]["returnVal"] == "animate" then
  1455.                             playerBool = not playerBool
  1456.                             drawScreen("c")
  1457.                             return true
  1458.                         end
  1459.                         return true
  1460.                     end
  1461.                 end
  1462.             end
  1463.             return false
  1464.         elseif ev == "drag" then
  1465.             if rcl.grabbed then
  1466.                 gpu.setForeground(0xFFFFFF)
  1467.                 gpu.setBackground(0x000000)
  1468.                 gpu.fill(rcl.xPos, rcl.yPos, rcl.width, rcl.height, " ")
  1469.                 rcl:move(clx, cly)
  1470.                 drawScreen()
  1471.                 return true
  1472.             else
  1473.                 return false
  1474.             end
  1475.         elseif ev == "drop" then
  1476.             rcl.grabbed = false
  1477.         end
  1478.         return true
  1479.     end
  1480.     return false
  1481. end
  1482.  
  1483. function checkPalette(ev, clx, cly, pl, btn)
  1484.     if paletteBool then
  1485.         local tBool = false
  1486.         if ev == "touch" then
  1487.             if clx >= pTab.xPos and clx <= pTab.xPos + (pTab.width - 1) then
  1488.                 if cly >= pTab.yPos and cly <= pTab.yPos + (pTab.height - 1) then
  1489.                     pTab.grabbed = true
  1490.                     tBool = true
  1491.                 else
  1492.                     pTab.grabbed = false
  1493.                     return false
  1494.                 end
  1495.             else
  1496.                 pTab.grabbed = false
  1497.                 return false
  1498.             end
  1499.             for i = 1, #pTab.buttonTab do
  1500.                 local buttonStX = pTab.xPos + pTab.buttonTab[i]["xPos"]
  1501.                 local buttonStY = pTab.yPos + pTab.buttonTab[i]["yPos"]
  1502.                 local buttonMaX = buttonStX + pTab.buttonTab[i]["width"]
  1503.                 local buttonMaY = buttonStY + pTab.buttonTab[i]["height"]
  1504.                 if clx >= buttonStX and clx <= buttonMaX then
  1505.                     if cly >= buttonStY and cly <= buttonMaY then
  1506.                         if pTab.buttonTab[i]["returnVal"] == "add_palette" then
  1507.                             newPalette()
  1508.                             activePalette = pTab.pCount
  1509.                             drawPalette(activePalette)
  1510.                         elseif pTab.buttonTab[i]["returnVal"] == "bk_palette" then
  1511.                             if activePalette > 1 then
  1512.                                 activePalette = activePalette - 1
  1513.                             end
  1514.                             drawPalette(activePalette)
  1515.                         elseif pTab.buttonTab[i]["returnVal"] == "fd_palette" then
  1516.                             if activePalette == pTab.pCount then
  1517.                                 newPalette()
  1518.                             end
  1519.                             activePalette = activePalette + 1
  1520.                             drawPalette(activePalette)
  1521.                         elseif pTab.buttonTab[i]["returnVal"] == "fg" then
  1522.                             fgBool = not fgBool
  1523.                             bgBool = false
  1524.                             charBool = false
  1525.                             drawPalette(activePalette)
  1526.                         elseif pTab.buttonTab[i]["returnVal"] == "bg" then
  1527.                             fgBool = false
  1528.                             bgBool = not bgBool
  1529.                             charBool = false
  1530.                             drawPalette(activePalette)
  1531.                         elseif pTab.buttonTab[i]["returnVal"] == "char" then
  1532.                             fgBool = false
  1533.                             bgBool = false
  1534.                             charBool = not charBool
  1535.                             drawPalette(activePalette)
  1536.                         elseif pTab.buttonTab[i]["returnVal"] == "never_mind_this" then
  1537.                         else
  1538.                             if btn == 0 then
  1539.                                 if fgBool then
  1540.                                     fgLast = fgCur
  1541.                                     fgCur = pTab.buttonTab[i]["colour"]
  1542.                                     layers.transBool = false
  1543.                                     drawScreen()
  1544.                                 elseif bgBool then
  1545.                                     bgLast = bgCur
  1546.                                     bgCur = pTab.buttonTab[i]["colour"]
  1547.                                     layers.transBool = false
  1548.                                     drawScreen()
  1549.                                 end
  1550.                             else
  1551.                                 colourBool = not colourBool
  1552.                                 pEntry = pTab.buttonTab[i]["returnVal"]
  1553.                                 layers.transBool = false
  1554.                                 drawScreen("c")
  1555.                             end
  1556.                         end
  1557.                     end
  1558.                 end
  1559.             end
  1560.             if tBool then return true end
  1561.         elseif ev == "drag" then
  1562.             if pTab.grabbed then
  1563.                 gpu.setForeground(0xFFFFFF)
  1564.                 gpu.setBackground(0x000000)
  1565.                 gpu.fill(pTab.xPos, pTab.yPos, pTab.width, pTab.height, " ")
  1566.                 pTab:move(clx, cly)
  1567.                 drawScreen()
  1568.                 return true
  1569.             else
  1570.                 return false
  1571.             end
  1572.         elseif ev == "drop" then
  1573.             drawPalette(activePalette)
  1574.             pTab.grabbed = false
  1575.             return true
  1576.         end
  1577.     end
  1578.     return false
  1579. end
  1580.  
  1581. function checkRGB(ev, clx, cly, pl, btn)
  1582.     if colourBool then
  1583.         if clx >= colour.xPos and clx <= colour.xPos + colour.width then
  1584.             if cly <= colour.yPos and cly <= colour.yPos + colour.height then
  1585.                 colour.grabbed = true
  1586.             end
  1587.         end
  1588.         if ev == "touch" then
  1589.             for i = 1, #colour.buttonTab do
  1590.                 local stx = colour.xPos + colour.buttonTab[i]["xPos"]
  1591.                 local sty = colour.yPos + (colour.buttonTab[i]["yPos"] - 1)
  1592.                 local max = stx + colour.buttonTab[i]["width"]
  1593.                 local may = sty + colour.buttonTab[i]["height"]
  1594.                 if clx >= stx and clx <= max then
  1595.                     if cly >= sty and cly <= may then
  1596.                         if colour.buttonTab[i]["returnVal"] == "r_plus" then
  1597.                             if colour.rVal < 6 then
  1598.                                 colour.rVal = colour.rVal + 1
  1599.                             end
  1600.                         elseif colour.buttonTab[i]["returnVal"] == "r_minus" then
  1601.                             if colour.rVal > 1 then
  1602.                                 colour.rVal = colour.rVal - 1
  1603.                             end
  1604.                         elseif colour.buttonTab[i]["returnVal"] == "g_plus" then
  1605.                             if colour.gVal < 6 then
  1606.                                 colour.gVal = colour.gVal + 1
  1607.                             end
  1608.                         elseif colour.buttonTab[i]["returnVal"] == "g_minus" then
  1609.                             if colour.gVal > 1 then
  1610.                                 colour.gVal = colour.gVal - 1
  1611.                             end
  1612.                         elseif colour.buttonTab[i]["returnVal"] == "b_plus" then
  1613.                             if colour.bVal < 6 then
  1614.                                 colour.bVal = colour.bVal + 1
  1615.                             end
  1616.                         elseif colour.buttonTab[i]["returnVal"] == "b_minus" then
  1617.                             if colour.bVal > 1 then
  1618.                                 colour.bVal = colour.bVal - 1
  1619.                             end
  1620.                         elseif colour.buttonTab[i]["returnVal"] == "set_colour" then
  1621.                             pTab.list[activePalette][pEntry] = tonumber("0x"..vTab[colour.rVal]..vTab[colour.gVal]..vTab[colour.bVal])
  1622.                             colourBool = false
  1623.                             drawScreen("c")
  1624.                         elseif colour.buttonTab[i]["returnVal"] == "exit" then
  1625.                             colourBool = false
  1626.                             drawScreen("c")
  1627.                         end
  1628.                         colourChanger()
  1629.                         return true
  1630.                     end
  1631.                 end
  1632.             end
  1633.             return false
  1634.         elseif ev == "drag" then
  1635.             if colour.grabbed then
  1636.                 gpu.setForeground(0xFFFFFF)
  1637.                 gpu.setBackground(0x000000)
  1638.                 gpu.fill(colour.xPos, colour.yPos, colour.width, colour.height, " ")
  1639.                 colour:move(clx, cly)
  1640.                 drawScreen()
  1641.                 return true
  1642.             else
  1643.                 return false
  1644.             end
  1645.         elseif ev == "drop" then
  1646.             colour.grabbed = false
  1647.         end
  1648.         return true
  1649.     end
  1650.     return false
  1651. end
  1652.  
  1653. function checkToolBox(ev, clx, cly, pl, btn)
  1654.     if toolBool then
  1655.         if ev == "touch" then
  1656.             for i = 1, #tools.buttonTab do
  1657.                 local stx = tools.xPos + tools.buttonTab[i]["xPos"]
  1658.                 local sty = tools.yPos + (tools.buttonTab[i]["yPos"] - 1)
  1659.                 local max = stx + tools.buttonTab[i]["width"]
  1660.                 local may = sty + tools.buttonTab[i]["height"]
  1661.                 if clx >= stx and clx <= max then
  1662.                     if cly >= sty and cly <= may then
  1663.                         if tools.buttonTab[i]["returnVal"] == "brSwitch" then
  1664.                             tools.brush["active"] = true
  1665.                             tools.line["active"] = false
  1666.                             tools.boxTool["active"] = false
  1667.                             tools.circle["active"] = false
  1668.                         elseif tools.buttonTab[i]["returnVal"] == "lSwitch" then
  1669.                             tools.brush["active"] = false
  1670.                             tools.line["active"] = true
  1671.                             tools.boxTool["active"] = false
  1672.                             tools.circle["active"] = false
  1673.                         elseif tools.buttonTab[i]["returnVal"] == "bSwitch" then
  1674.                             tools.brush["active"] = false
  1675.                             tools.line["active"] = false
  1676.                             tools.boxTool["active"] = true
  1677.                             tools.circle["active"] = false
  1678.                         elseif tools.buttonTab[i]["returnVal"] == "cSwitch" then
  1679.                             tools.brush["active"] = false
  1680.                             tools.line["active"] = false
  1681.                             tools.boxTool["active"] = false
  1682.                             tools.circle["active"] = true
  1683.                         elseif tools.buttonTab[i]["returnVal"] == "brx_minus" then
  1684.                             if tools.brush["sizeX"] > 1 then
  1685.                                 tools.brush["sizeX"] = tools.brush["sizeX"] - 1
  1686.                             end
  1687.                         elseif tools.buttonTab[i]["returnVal"] == "brx_plus" then
  1688.                             tools.brush["sizeX"] = tools.brush["sizeX"] + 1
  1689.                         elseif tools.buttonTab[i]["returnVal"] == "bry_minus" then
  1690.                             if tools.brush["sizeY"] > 1 then
  1691.                                 tools.brush["sizeY"] = tools.brush["sizeY"] - 1
  1692.                             end
  1693.                         elseif tools.buttonTab[i]["returnVal"] == "bry_plus" then
  1694.                             tools.brush["sizeY"] = tools.brush["sizeY"] + 1
  1695.                         elseif tools.buttonTab[i]["returnVal"] == "rad_minus" then
  1696.                             if tools.circle["radius"] > 1 then
  1697.                                 tools.circle["radius"] = tools.circle["radius"] - 1
  1698.                             end
  1699.                         elseif tools.buttonTab[i]["returnVal"] == "rad_plus" then
  1700.                             tools.circle["radius"] = tools.circle["radius"] + 1
  1701.                         elseif tools.buttonTab[i]["returnVal"] == "toggle_filled" then
  1702.                             tools.circle["solid"] = not tools.circle["solid"]
  1703.                         end
  1704.                         tools.grabbed = false
  1705.                         drawScreen()
  1706.                         return true
  1707.                     end
  1708.                 end
  1709.             end
  1710.             if clx >= tools.xPos and clx <= tools.xPos + (tools.width - 1) then
  1711.                 if cly >= tools.yPos and cly <= tools.yPos + (tools.height - 1) then
  1712.                     tools.grabbed = true
  1713.                     return true
  1714.                 end
  1715.             end
  1716.             return false
  1717.         elseif ev == "drag" then
  1718.             if tools.grabbed then
  1719.                 gpu.setForeground(0xFFFFFF)
  1720.                 gpu.setBackground(0x000000)
  1721.                 gpu.fill(tools.xPos, tools.yPos, tools.width, tools.height, " ")
  1722.                 tools:move(clx, cly)
  1723.                 drawScreen()
  1724.                 return true
  1725.             end
  1726.         elseif ev == "drop" then
  1727.             tools.grabbed = false
  1728.             return true
  1729.         end
  1730.     end
  1731.     tools.grabbed = false
  1732.     return false
  1733. end
  1734.  
  1735. function checkFileViewer(ev, clx, cly, pl, btn)
  1736.     if browserBool then
  1737.         if clx >= browser.xPos and clx <= browser.xPos + browser.width then
  1738.             if cly <= browser.yPos and cly <= browser.yPos + browser.height then
  1739.                 browser.grabbed = true
  1740.             end
  1741.         end
  1742.         if browser.fileViewer ~= nil then
  1743.             if ev == "touch" then
  1744.                 for j = 1, #browser.fileViewer do
  1745.                     for k = 1, #browser.fileViewer[j]["list"] do
  1746.                         if clx >= browser.xPos + browser.fileViewer[j]["xPos"] and clx <= browser.xPos + #browser.fileViewer[j]["list"][k] then
  1747.                             if cly == browser.yPos + (browser.fileViewer[j]["yPos"] + k) then
  1748.                                 if fs.isDirectory(browser.fileViewer[j]["path"]) then
  1749.                                     if string.sub(browser.fileViewer[j]["path"], #browser.fileViewer[j]["path"], #browser.fileViewer[j]["path"]) == "/" then
  1750.                                         browser.fileViewer[j]["path"] = string.sub(browser.fileViewer[j]["path"], 1, #browser.fileViewer[j]["path"] - 1)
  1751.                                     end
  1752.                                 end
  1753.                                 if fs.isDirectory(browser.fileViewer[j]["path"].."/"..browser.fileViewer[j]["list"][k]) then
  1754.                                     browser.fileViewer[j]["path"] = browser.fileViewer[j]["path"].."/"..browser.fileViewer[j]["list"][k]
  1755.                                     browser.fileViewer[j]["list"] = browser:assembleFileTable(browser.fileViewer[j]["path"])
  1756.                                     browser.textInputs[1]["text"][1] = browser.fileViewer[j]["path"]
  1757.                                     browser.textInputs[1]["cursorX"] = #browser.textInputs[1]["text"][1] + 1
  1758.                                     browser:render()
  1759.                                     return true
  1760.                                 else
  1761.                                     if btn == 0 then
  1762.                                         image = nil
  1763.                                         image = screen:newPane(image, width, height)
  1764.                                         image:center()
  1765.                                         image:loadImage(filename, path.."/Images/"..browser.fileViewer[j]["list"][k])
  1766.                                         filename = browser.fileViewer[j]["list"][k]
  1767.                                         browserBool = false
  1768.                                         drawScreen("c")
  1769.                                         return true
  1770.                                     else
  1771.                                         browserBool = false
  1772.                                         drawScreen("c")
  1773.                                         return false
  1774.                                     end
  1775.                                 end
  1776.                             end
  1777.                         end
  1778.                     end
  1779.                 end
  1780.                 for i = 1, #browser.buttonTab do
  1781.                     local stx = browser.xPos + browser.buttonTab[i]["xPos"]
  1782.                     local sty = browser.yPos + (browser.buttonTab[i]["yPos"] - 1)
  1783.                     local max = stx + browser.buttonTab[i]["width"]
  1784.                     local may = sty + browser.buttonTab[i]["height"]
  1785.                     if clx >= stx and clx <= max then
  1786.                         if cly >= sty and cly <= may then
  1787.                             if browser.buttonTab[i]["returnVal"] == "navigate_up" then
  1788.                                 browser.fileViewer[1]["path"] = fs.path(browser.fileViewer[1]["path"])
  1789.                                 browser.fileViewer[1]["list"] = browser:assembleFileTable(browser.fileViewer[1]["path"])
  1790.                                 browser.textInputs[1]["text"][1] = browser.fileViewer[1]["path"]
  1791.                                 browser.textInputs[1]["cursorX"] = #browser.textInputs[1]["text"][1] + 1
  1792.                                 browser:render()
  1793.                             end
  1794.                         end
  1795.                     end
  1796.                 end
  1797.             elseif ev == "drag" then
  1798.                 if browser.grabbed then
  1799.                     gpu.setForeground(0xFFFFFF)
  1800.                     gpu.setBackground(0x000000)
  1801.                     gpu.fill(browser.xPos, browser.yPos, browser.width, browser.height, " ")
  1802.                     browser:move(clx, cly)
  1803.                     drawScreen()
  1804.                     return true
  1805.                 end
  1806.             elseif ev == "drop" then
  1807.                 browser.grabbed = false
  1808.                 return true
  1809.             end
  1810.         end
  1811.     end
  1812.     browser.grabbed = false
  1813.     return false
  1814. end
  1815.  
  1816. function checkLayers(ev, clx, cly, pl, btn)
  1817.     if layerBool then
  1818.         if ev == "touch" then
  1819.             for i = 1, #layers.buttonTab do
  1820.                 local stx = layers.xPos + layers.buttonTab[i]["xPos"]
  1821.                 local sty = layers.yPos + (layers.buttonTab[i]["yPos"] - 1)
  1822.                 local max = stx + layers.buttonTab[i]["width"]
  1823.                 local may = sty + layers.buttonTab[i]["height"]
  1824.                 if clx >= stx and clx <= max then
  1825.                     if cly >= sty and cly <= may then
  1826.                         if layers.buttonTab[i]["returnVal"] == "trans_toggle" then
  1827.                             layers.transBool = not layers.transBool
  1828.                             if layers.transBool then
  1829.                                 bgLast = bgCur
  1830.                                 bgCur = "trans"
  1831.                             else
  1832.                                 bgCur = bgLast
  1833.                             end
  1834.                         elseif layers.buttonTab[i]["returnVal"] == "page_up" then
  1835.                             if layers.lPage < image.imTab[1]["pages"] then
  1836.                                 layers.lPage = layers.lPage + 1
  1837.                             end
  1838.                         elseif layers.buttonTab[i]["returnVal"] == "page_down" then
  1839.                             if layers.lPage > 1 then
  1840.                                 layers.lPage = layers.lPage - 1
  1841.                             end
  1842.                         elseif layers.buttonTab[i]["returnVal"] == "new_layer" then
  1843.                             image:newImageLayer(filename)
  1844.                         elseif string.sub(layers.buttonTab[i]["returnVal"], 1, 5) == "hide_" then
  1845.                             image.imTab[1]["layerData"][tonumber(string.sub(layers.buttonTab[i]["returnVal"], 6, #layers.buttonTab[i]["returnVal"]))]["hidden"] = true
  1846.                         elseif string.sub(layers.buttonTab[i]["returnVal"], 1, 5) == "show_" then
  1847.                             image.imTab[1]["layerData"][tonumber(string.sub(layers.buttonTab[i]["returnVal"], 6, #layers.buttonTab[i]["returnVal"]))]["hidden"] = false
  1848.                         elseif layers.buttonTab[i]["returnVal"] == "no_action" then
  1849.                         else
  1850.                             activeLayer = layers.buttonTab[i]["returnVal"]
  1851.                         end
  1852.                         layers.grabbed = false
  1853.                         drawScreen("c")
  1854.                         return true
  1855.                     end
  1856.                 end
  1857.             end
  1858.             if clx >= layers.xPos and clx <= layers.xPos + (layers.width - 1) then
  1859.                 if cly >= layers.yPos and cly <= layers.yPos + (layers.height - 1) then
  1860.                     layers.grabbed = true
  1861.                     return true
  1862.                 end
  1863.             end
  1864.             return false
  1865.         elseif ev == "drag" then
  1866.             if layers.grabbed then
  1867.                 gpu.setForeground(0xFFFFFF)
  1868.                 gpu.setBackground(0x000000)
  1869.                 gpu.fill(layers.xPos, layers.yPos, layers.width, layers.height, " ")
  1870.                 layers:move(clx, cly)
  1871.                 drawScreen()
  1872.                 return true
  1873.             end
  1874.         elseif ev == "drop" then
  1875.             layers.grabbed = false
  1876.             return true
  1877.         end
  1878.     end
  1879.     layers.grabbed = false
  1880.     return false
  1881. end
  1882.  
  1883. function checkPlayer(ev, clx, cly, pl, btn)
  1884.     if playerBool then
  1885.         if ev == "touch" then
  1886.             for i = 1, #player.buttonTab do
  1887.                 local stx = player.xPos + player.buttonTab[i]["xPos"]
  1888.                 local sty = player.yPos + (player.buttonTab[i]["yPos"] - 1)
  1889.                 local max = stx + player.buttonTab[i]["width"]
  1890.                 local may = sty + player.buttonTab[i]["height"]
  1891.                 if clx >= stx and clx <= max then
  1892.                     if cly >= sty and cly <= may then
  1893.                         if player.buttonTab[i]["returnVal"] == "play" then
  1894.                             playVideo()
  1895.                         elseif player.buttonTab[i]["returnVal"] == "loop" then
  1896.                             player.loop = not player.loop
  1897.                         end
  1898.                         player.grabbed = false
  1899.                         drawScreen("c")
  1900.                         return true
  1901.                     end
  1902.                 end
  1903.             end
  1904.             if clx >= player.xPos and clx <= player.xPos + (player.width - 1) then
  1905.                 if cly >= player.yPos and cly <= player.yPos + (player.height - 1) then
  1906.                     player.grabbed = true
  1907.                     return true
  1908.                 end
  1909.             end
  1910.             return false
  1911.         elseif ev == "drag" then
  1912.             if player.grabbed then
  1913.                 gpu.setForeground(0xFFFFFF)
  1914.                 gpu.setBackground(0x000000)
  1915.                 gpu.fill(player.xPos, player.yPos, player.width, player.height, " ")
  1916.                 player:move(clx, cly)
  1917.                 drawScreen()
  1918.                 return true
  1919.             end
  1920.         elseif ev == "drop" then
  1921.             player.grabbed = false
  1922.             return true
  1923.         end
  1924.     end
  1925.     player.grabbed = false
  1926.     return false
  1927. end
  1928.  
  1929. function run()
  1930.     ev, p1, p2, p3, p4, p5 = event.pull(.1, _, ev, p1, p2, p3, p4, p5)
  1931.     if ev == "key_up" then
  1932.         return true
  1933.     elseif ev == "key_down" then
  1934.         running = false
  1935.         return false
  1936.     elseif ev ~= nil then
  1937.         if checkRCL(ev, p2, p3, p5, p4) then return end
  1938.         rcl.grabbed = false
  1939.         if checkRGB(ev, p2, p3, p5, p4) then return end
  1940.         colour.grabbed = false
  1941.         if checkPalette(ev, p2, p3, p5, p4) then return end
  1942.         pTab.grabbed = false
  1943.         if checkFileViewer(ev, p2, p3, p5, p4) then return end
  1944.         browser.grabbed = false
  1945.         if checkToolBox(ev, p2, p3, p5, p4) then return end
  1946.         tools.grabbed = false
  1947.         if checkLayers(ev, p2, p3, p5, p4) then return end
  1948.         layers.grabbed = false
  1949.         if checkPlayer(ev, p2, p3, p5, p4) then return end
  1950.         player.grabbed = false
  1951.         if checkImage(ev, p2, p3, p5, p4) then return end
  1952.         playerRunning = false
  1953.         if p4 == 1 then
  1954.             menuBool = not menuBool
  1955.             drawScreen("c")
  1956.         end
  1957.     end
  1958. end
  1959.  
  1960. --PROGRAM START--
  1961.  
  1962. rClickMenuSetup()
  1963. paletteSetup()
  1964. colourSetup()
  1965. browser = fileBrowser(0x00CCCC, "Load File")
  1966. toolBox()
  1967. layerTool()
  1968. initPlayer()
  1969. if fs.exists(path.."/Images/"..filename) then
  1970.     image = screen:newPane(image, width, height)
  1971.     image:center()
  1972.     image:loadImage(filename, path.."/Images/"..filename)
  1973. else
  1974.     image = newImage(width, height)
  1975. end
  1976. drawScreen("c")
  1977. running = true
  1978. while running do
  1979.     run()
  1980. end
  1981. gpu.setForeground(0xFFFFFF)
  1982. gpu.setBackground(0x000000)
RAW Paste Data