5bitesofcookies

Calculator by soccer16x for Sapphari

May 16th, 2014
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. --[[ Variables ]]--
  2. calc = ""
  3. screenX, screenY = term.getSize()
  4.  
  5. if fs.exists("calcColor") == true then
  6.  h = fs.open("calcColor", "r")
  7.  borderColour = loadstring("return "..h.readLine())()
  8.  h.close()
  9. else
  10.  h = fs.open("calcColor", "w")
  11.  h.write("colors.white")
  12.  h.close()
  13.  borderColour = colors.white
  14. end --if true then read file and set color to what was set before, if not then set to default of white
  15.  
  16.  
  17. -- Tables
  18. buttonsMain = {}
  19. buttonsExtra = {}
  20. buttonsColors = {}
  21. input = {nil, nil, nil}
  22. --[[ End of variables ]]--
  23.  
  24. --[[ Functions ]]--
  25.  
  26. function printVerticalLine(lineX, startingY, endingY)
  27.         term.setBackgroundColor(borderColour)
  28.         for lineY = startingY, endingY do
  29.                 term.setCursorPos(lineX, lineY)
  30.                 term.write(" ")
  31.         end
  32. end
  33.  
  34. function printHorizontalLine(yLine, startingX, endingX)
  35.         term.setBackgroundColor(borderColour)
  36.         term.setCursorPos(startingX, yLine)
  37.         write(string.rep(" ", endingX - startingX + 1))
  38. end
  39.  
  40. function drawMain()
  41.         -- Left part (for numbers)
  42.                 printVerticalLine(2,2,18)
  43.                 --Left Border
  44.                 printVerticalLine(20,2,18)
  45.                 --Right Border
  46.                 printVerticalLine(8,6,18)
  47.                 --Left Seperator
  48.                 printVerticalLine(14,6,18)
  49.                 --Right Seperator
  50.                 printHorizontalLine(2,2,20)
  51.                 --Top
  52.                 printHorizontalLine(6,2, 20)
  53.                 --Upper Before Keys
  54.                 printHorizontalLine(18,2,20)
  55.                 --Bottom
  56.                 printHorizontalLine(10,2,20)
  57.                 --Upper Seperator
  58.                 printHorizontalLine(14,2,20)
  59.                 --Lower Seperator
  60.                 term.setBackgroundColor(colors.black)
  61.                
  62.         -- Middle area (F, H, c)
  63.                 printVerticalLine(23,6,18)
  64.                 --Left Border
  65.                 printVerticalLine(29,6,18)
  66.                 --Right Border
  67.                 printHorizontalLine(6,23,29)
  68.                 --Top
  69.                 printHorizontalLine(10,23,29)
  70.                 printHorizontalLine(14,23,29)
  71.                 printHorizontalLine(18,23,29)
  72.                
  73.         -- Right side (0, math synbols)
  74.                 printHorizontalLine(6,32,50)
  75.                 --Top
  76.                 printHorizontalLine(10,32,50)
  77.                 printHorizontalLine(14,32,50)
  78.                 printHorizontalLine(18,32,50)
  79.                 --Bottom
  80.                 printVerticalLine(32,6,18)
  81.                 --Left Border
  82.                 printVerticalLine(38,6,14)
  83.                 printVerticalLine(44,6,18)
  84.                 printVerticalLine(50,6,18)
  85.        
  86.         term.setBackgroundColor(colors.black)
  87. end
  88.  
  89. function drawColorsTable()
  90.         printVerticalLine(2,2,18)
  91.         printVerticalLine(14,2,18)
  92.         printVerticalLine(26,2,18)
  93.         printVerticalLine(40,2,18)
  94.         printVerticalLine(50,2,18)
  95.        
  96.         printHorizontalLine(2, 3, screenX-2)
  97.         printHorizontalLine(6, 3, screenX-2)
  98.         printHorizontalLine(10, 3, screenX-2)
  99.         printHorizontalLine(14, 3, screenX-2)
  100.         printHorizontalLine(18, 3, screenX-2)
  101.        
  102.         term.setBackgroundColor(colors.black)
  103. end
  104.  
  105. function setTable(_table, name, xMin, xMax, yMin, yMax, customX, col)
  106.         table.insert(_table, {
  107.                 numb = name,
  108.                 xmin = xMin,
  109.                 xmax = xMax,
  110.                 ymin = yMin,
  111.                 ymax = yMax,
  112.                 cX = customX or nil,
  113.                 txtCol = col or colours.white
  114.         })
  115. end
  116.  
  117. function fillTable()
  118.         setTable(buttonsMain, "1", 3, 7, 15, 17)
  119.         setTable(buttonsMain, "2", 9, 13, 15, 17)
  120.         setTable(buttonsMain, "3", 15, 19, 15, 17)
  121.         setTable(buttonsMain, "4", 3, 7, 11, 13)
  122.         setTable(buttonsMain, "5", 9, 13, 11, 13)
  123.         setTable(buttonsMain, "6", 15, 19, 11, 13)
  124.         setTable(buttonsMain, "7", 3, 7, 7, 9)
  125.         setTable(buttonsMain, "8", 9, 13, 7, 9)
  126.         setTable(buttonsMain, "9", 15, 19, 7, 9)
  127.         setTable(buttonsExtra, "1", 3, 7, 15, 17)
  128.         setTable(buttonsExtra, "2", 9, 13, 15, 17)
  129.         setTable(buttonsExtra, "3", 15, 19, 15, 17)
  130.         setTable(buttonsExtra, "4", 3, 7, 11, 13)
  131.         setTable(buttonsExtra, "5", 9, 13, 11, 13)
  132.         setTable(buttonsExtra, "6", 15, 19, 11, 13)
  133.         setTable(buttonsExtra, "7", 3, 7, 7, 9)
  134.         setTable(buttonsExtra, "8", 9, 13, 7, 9)
  135.         setTable(buttonsExtra, "9", 15, 19, 7, 9)
  136. end
  137.  
  138. function fillFunctionsTable()
  139.         setTable(buttonsMain, "C", 33,37,7,9)
  140.         setTable(buttonsMain, ".", 39,43,7,9)
  141.         setTable(buttonsMain, "/", 45,49,7,9)
  142.         setTable(buttonsMain, "+", 33,37,11,13)
  143.         setTable(buttonsMain, "-", 39,43,11,13)
  144.         setTable(buttonsMain, "*", 45,49,11,13)
  145.         setTable(buttonsMain, "0", 33,43,15,17)
  146.         setTable(buttonsMain, "=", 45,49,15,17)
  147. end
  148.  
  149. function fillExtraFunctions()
  150.         setTable(buttonsExtra, "^", 33,37,7,9)
  151.         setTable(buttonsExtra, "rt", 39,43,7,9)
  152.         setTable(buttonsExtra, "/", 45,49,7,9)
  153.         setTable(buttonsExtra, "+", 33,37,11,13)
  154.         setTable(buttonsExtra, "-", 39,43,11,13)
  155.         setTable(buttonsExtra, "*", 45,49,11,13)
  156.         setTable(buttonsExtra, "0", 33,43,15,17)
  157.         setTable(buttonsExtra, "=", 45,49,15,17)
  158. end
  159.  
  160. function fillExtraButtonsTable()
  161.         setTable(buttonsExtra, "F",24,28,7,9)
  162.         setTable(buttonsExtra, "H",24,28,11,13)
  163.         setTable(buttonsExtra, "c",24,28,15,17)
  164.         setTable(buttonsMain, "F",24,28,7,9)
  165.         setTable(buttonsMain, "H",24,28,11,13)
  166.         setTable(buttonsMain, "c",24,28,15,17)
  167. end
  168.  
  169. function fillColorOptions()
  170.         setTable(buttonsColors,"White",3,13,3,5, 6, colours.white)
  171.         setTable(buttonsColors,"Orange",3,13,7,9, 6, colours.orange)
  172.         setTable(buttonsColors,"Magenta",3,13,11,13, 5, colours.magenta)
  173.         setTable(buttonsColors,"Light Blue",3,13,15,17, 4, colours.lightBlue)
  174.         setTable(buttonsColors,"Yellow",15,25,3,5, 17, colours.yellow)
  175.         setTable(buttonsColors,"Lime",15,25,7,9, 18, colours.lime)
  176.         setTable(buttonsColors,"Pink",15,25,11,13, 18, colours.pink)
  177.         setTable(buttonsColors,"Gray",15,25,15,17, 18, colours.grey)
  178.         setTable(buttonsColors,"Light Gray",27,37,3,5, 28, colours.lightGrey)
  179.         setTable(buttonsColors,"Cyan",27,37,7,9, 32, colours.cyan)
  180.         setTable(buttonsColors,"Purple",27,37,11,13, 30, colours.purple)
  181.         setTable(buttonsColors,"Blue",27,37,15,17, 31, colours.blue)
  182.         setTable(buttonsColors,"Brown",39,49,3,5, 43, colours.brown)
  183.         setTable(buttonsColors,"Green",39,49,7,9, 43, colours.green)
  184.         setTable(buttonsColors,"Red",39,49,11,13, 44, colours.red)
  185.         setTable(buttonsColors,"Black",39,49,15,17, 43, colours.white)
  186. end
  187.  
  188. function checkClick(tab, mx, my)
  189.         for i, v in pairs(tab) do
  190.                 if mx >= v.xmin and mx <= v.xmax and my >= v.ymin and my <= v.ymax then
  191.                         return true, v.numb
  192.                 end
  193.         end
  194.         return false, nil
  195. end
  196.  
  197. function screen(tab)
  198.         term.setBackgroundColour(colours.black)
  199.         for i, data in pairs(tab) do
  200.                 local yspot = (data.ymin + data.ymax) / 2
  201.                 local xspot = data.cX or (data.xmin + data.xmax) / 2
  202.                 term.setCursorPos(xspot, yspot)
  203.                 term.setTextColour(data.txtCol)
  204.                 write(data.numb)
  205.         end
  206. end
  207.  
  208. function writeColor()
  209.  h = fs.open("calcColor", "w")
  210.  h.write(borderColour)
  211.  h.close()
  212. end
  213.  
  214. function redraw(t)
  215.         term.setCursorPos(4, 4)
  216.         write(string.rep(" ", 15))
  217.         term.setCursorPos(4, 4)
  218.         write(t or "")
  219. end
  220.  
  221. function doSum()
  222.         input[1] = tonumber(calc) or input[1]
  223.         input[2] = numb
  224.         redraw()
  225.         calc = ""
  226.         numb = ""
  227. end
  228.  
  229. function enterPress()
  230.         input[3] = tonumber(calc)
  231.         if input[2] == "+" then
  232.                 Output = input[1] + input[3]
  233.         elseif input[2] == "-" then
  234.                 Output = input[1] - input[3]
  235.         elseif input[2] == "*" then
  236.                 Output = input[1] * input[3]
  237.         elseif input[2] == "/" then
  238.                 Output = input[1] / input[3]
  239.         elseif input[2] == "^" then
  240.                 Output = input[1] ^ input[3]
  241.         elseif input[2] == "rt" then
  242.                 Output = math.sqrt(input[1])
  243.         end
  244.         redraw(Output)
  245.         calc = tostring(Output)
  246.         input[1] = Output  
  247. end
  248.  
  249. --[[ Functions for the middle section: Choosing a new border colour
  250.           and to display help.
  251. --]]
  252. function chooseColour()
  253.         term.setBackgroundColour(colours.black)
  254.         term.setCursorPos(1, 1)
  255.         term.clear()
  256.        
  257.         term.setBackgroundColour(colours.grey)
  258.         write(string.rep(" ", screenX))
  259.        
  260.         term.setBackgroundColour(colours.red)
  261.         term.setCursorPos(screenX, 1)
  262.         write("X")
  263.        
  264.         while true do
  265.                 screen(buttonsColors)
  266.                 drawColorsTable()
  267.                 local e, but, x, y = os.pullEvent("mouse_click")
  268.                 if but == 1 then
  269.                         if x == screenX and y == 1 then
  270.                                 term.clear()
  271.                                 screen(buttonsMain)
  272.                                 drawMain()
  273.                                 redraw(calc)
  274.                                 break
  275.                         else
  276.                                 bValid, colChoice = checkClick(buttonsColors, x, y)
  277.                                 if bValid then
  278.                                         if colChoice == "White" then
  279.                                                 borderColour = colours.white
  280.                                                 writeColor()
  281.                                         elseif colChoice == "Orange" then
  282.                                                 borderColour = colours.orange
  283.                                                 writeColor()
  284.                                         elseif colChoice == "Magenta" then
  285.                                                 borderColour = colours.magenta
  286.                                                 writeColor()
  287.                                         elseif colChoice == "Light Blue" then
  288.                                                 borderColour = colours.lightBlue
  289.                                                 writeColor()
  290.                                         elseif colChoice == "Yellow" then
  291.                                                 borderColour = colours.yellow
  292.                                                 writeColor()
  293.                                         elseif colChoice == "Lime" then
  294.                                                 borderColour = colours.lime
  295.                                                 writeColor()
  296.                                         elseif colChoice == "Pink" then
  297.                                                 borderColour = colours.pink
  298.                                                 writeColor()
  299.                                         elseif colChoice == "Gray" then
  300.                                                 borderColour = colours.grey
  301.                                                 writeColor()
  302.                                         elseif colChoice == "Light Gray" then
  303.                                                 borderColour = colours.lightGrey
  304.                                                 writeColor()
  305.                                         elseif colChoice == "Cyan" then
  306.                                                 borderColour = colours.cyan
  307.                                                 writeColor()
  308.                                         elseif colChoice == "Purple" then
  309.                                                 borderColour = colours.purple
  310.                                                 writeColor()
  311.                                         elseif colChoice == "Blue" then
  312.                                                 borderColour = colours.blue
  313.                                                 writeColor()
  314.                                         elseif colChoice == "Brown" then
  315.                                                 borderColour = colours.brown
  316.                                                 writeColor()
  317.                                         elseif colChoice == "Green" then
  318.                                                 borderColour = colours.green
  319.                                                 writeColor()
  320.                                         elseif colChoice == "Red" then
  321.                                                 borderColour = colours.red
  322.                                                 writeColor()
  323.                                         elseif colChoice == "Black" then
  324.                                                 borderColour = colours.black
  325.                                                 writeColor()
  326.                                         end
  327.                                 end
  328.                         end
  329.                 end
  330.         end
  331. end
  332.  
  333. function displayHelp()
  334.         term.setBackgroundColour(colours.white)
  335.         term.setCursorPos(1, 1)
  336.         term.clear()
  337.        
  338.         term.setBackgroundColour(colours.grey)
  339.         write(string.rep(" ", screenX))
  340.        
  341.         term.setBackgroundColour(colours.red)
  342.         term.setCursorPos(screenX, 1)
  343.         write("X")
  344.        
  345.         term.setBackgroundColour(colours.white)
  346.         term.setTextColour(colours.black)
  347.         term.setCursorPos(1, 2)
  348.         print("There will be help here once I decide to not be lazy and fill it out, for now check the forums!")
  349.        
  350.         repeat local _, but, x, y = os.pullEvent("mouse_click") until but == 1 and x == screenX and y == 1
  351.        
  352.         term.setBackgroundColour(colours.black)
  353.         term.clear()
  354.        
  355.         drawMain()
  356.         screen(buttonsMain)
  357. end
  358. --[[ End of functions ]]--
  359.  
  360. --[[ Main ]]--
  361.  
  362. -- Run the functions to fill the table with math functions
  363. fillExtraFunctions()
  364. fillTable()
  365. fillFunctionsTable()
  366. fillExtraButtonsTable()
  367. fillColorOptions()
  368.  
  369. -- Run the functions to draw the tables
  370. term.clear()
  371. drawMain()
  372.  
  373. screen(buttonsMain)
  374. state = "main"
  375.  
  376. while true do
  377.         local e, but, x, y = sapphUtils.pullEvent("mouse_click")
  378.         term.setBackgroundColor(colors.black)
  379.         term.setTextColor(colors.white)
  380.         if but == 1 then
  381.                 bValid, numb = checkClick(state == "main" and buttonsMain or state == "extra" and buttonsExtra, x, y)
  382.                 if bValid then
  383.                         if numb == "+" or numb == "-" or numb == "*" or numb == "/" or
  384.                         numb == "^" or numb == "rt" then
  385.                                 doSum()
  386.                         elseif numb == "H" then
  387.                                 displayHelp()
  388.                         elseif numb == "F" then
  389.                                 term.clear()
  390.                                 redraw(calc)
  391.                                 drawMain()
  392.                                 if state == "main" then
  393.                                         state = "extra"
  394.                                         screen(buttonsExtra)
  395.                                 elseif state == "extra" then
  396.                                         state = "main"
  397.                                         screen(buttonsMain)
  398.                                 end
  399.                         elseif numb == "=" then
  400.                         enterPress()
  401.                         elseif numb == "c" then
  402.                                 chooseColour()
  403.                         elseif numb == "C" then
  404.                                 for i = 1,3 do
  405.                                         input[i] = nil
  406.                                 end
  407.                                 calc = ""
  408.                                 Output = ""
  409.                                 redraw()
  410.                         elseif numb == "." then
  411.                             calc = calc .. numb
  412.                             term.setCursorPos(4,4)
  413.                             if #calc < 14 then
  414.                                 write(calc)
  415.                             else
  416.                     write(calc:sub(#calc-14))
  417.                 end
  418.                         elseif tonumber(numb) then -- if it is a number
  419.                                 calc = calc .. numb
  420.                                 term.setCursorPos(4, 4)
  421.                                 if #calc < 14 then
  422.                                         write(calc)
  423.                                 else
  424.                                         write(calc:sub(#calc-14))
  425.                                 end
  426.                         end
  427.                 end
  428.         end
  429. end
Advertisement
Add Comment
Please, Sign In to add comment