Advertisement
daelvn

Logical

Oct 15th, 2017
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 4.99 KB | None | 0 0
  1. -- Main script for Logical: Logic simulator for ComputerCraft
  2. -- By daelvn
  3.  
  4. -- Linter stuff
  5. local term, keys, os, fs, paintutils, io = term, keys, os, fs, paintutils, io
  6. local ipairs, print, pairs               = ipairs, print, pairs
  7.  
  8. local Logical = {
  9.   Palette = {
  10.     UI = {
  11.       Canvas  = colors.white,
  12.       Toolbar = colors.lightGray,
  13.       Other   = colors.gray
  14.     },
  15.     Wire = {
  16.       Off   = colors.green,
  17.       On    = colors.lime,
  18.       Cross = colors.yellow,
  19.       Error = colors.red,
  20.     }
  21.   }
  22. }
  23.  
  24. --- Create UI ---
  25. term.setBackgroundColor(Logical.Palette.UI.Canvas)
  26. term.setTextColor(colors.black)
  27. term.clear()
  28.  
  29. -- Let's make it responsive, start by getting the screen size
  30. local ScreenX, ScreenY = term.getSize()
  31. -- Create the main points
  32. local ToolbarAX, ToolbarAY = 1, 1
  33. local ToolbarBX, ToolbarBY = ScreenY, 2
  34.  
  35. local SidebarAX, SidebarAY = 1, 3
  36. local SidebarBX, SidebarBY = 20, ScreenY
  37.  
  38. local CanvasAX, CanvasAY   = 21, 3
  39. local CanvasBX, CanvasBY   = ScreenX, ScreenY
  40.  
  41. -- Draw those points
  42. local function drawToolbar()
  43.   paintutils.drawFilledBox(ToolbarAX, ToolbarAY, ToolbarBX, ToolbarBY, Logical.Palette.UI.Toolbar)
  44. end
  45.  
  46. local function drawSidebar()
  47.   paintutils.drawFilledBox(SidebarAX, SidebarAY, SidebarBX, SidebarBY, Logical.Palette.UI.Toolbar)
  48. end
  49.  
  50. local function drawCanvas()
  51.   paintutils.drawFilledBox(CanvasAX, CanvasAY, CanvasBX, CanvasBY, Logical.Palette.UI.Canvas)
  52. end
  53. drawToolbar()
  54. drawSidebar()
  55.  
  56. --- Initialize functions ---
  57. Logical.Project   = {_name="", _path="", _structure={}}
  58. Logical.Functions = {}
  59. Logical.LHDL      = {}
  60.  
  61. -- Project
  62.  
  63. function Logical.Functions.NewProject()
  64.   -- Create a new project
  65.   local at, name = "", ""
  66.   drawCanvas()
  67.   term.setCursorPos(CanvasAX, CanvasAY)
  68.   print("Enter the base path for your project:")
  69.   at = io.read()
  70.   print("Enter the name for your project:")
  71.   name = io.read()
  72.  
  73.   if fs.isDir(at) then
  74.     fs.makeDir(fs.combine(at, name))
  75.     Logical.Project._name = name
  76.     Logical.Project._path = fs.combine(at, name)
  77.   else return false end
  78.  
  79.   drawSidebar()
  80.   drawCanvas()
  81.   term.setCursorPos(1,3)
  82.   print(name.." >")
  83. end
  84.  
  85. function Logical.Functions.OpenProject()
  86.   -- Open a project
  87.   local at, name = "", ""
  88.   drawCanvas()
  89.   term.setCursorPos(CanvasAX, CanvasAY)
  90.   print("Enter the path of the project:")
  91.   at   = io.read()
  92.   if not fs.isDir(at) then return false end
  93.   name = fs.getName(at)
  94.   drawSidebar()
  95.   drawCanvas()
  96.   term.setCursorPos(1,3)
  97.   print(name..">")  
  98. end
  99.  
  100. function Logical.Functions.SaveProject()
  101.   -- Save a project
  102. end
  103.  
  104. function Logical.Functions.NewFolder()
  105.   -- Create folder under project
  106. end
  107.  
  108. function Logical.Functions.RemoveFolder()
  109.   -- Remove folder under project
  110. end
  111.  
  112. -- Circuits
  113.  
  114. function Logical.Functions.NewCircuit()
  115.   -- Create a new circuit
  116. end
  117.  
  118. function Logical.Functions.OpenCircuit()
  119.   -- Open a circuit (Import)
  120. end
  121.  
  122. function Logical.Functions.SaveCircuit()
  123.   -- Save a circuit
  124. end
  125.  
  126. function Logical.LHDL.CircuitToLHDL()
  127.   -- Convert a circuit into LHDL
  128. end
  129.  
  130. --- Initialize colors ---
  131. term.setPaletteColor(Logical.Palette.UI.Canvas, 0xFFFFFF)
  132. term.setPaletteColor(Logical.Palette.UI.Toolbar, 0xE2E2E2)
  133. term.setPaletteColor(Logical.Palette.UI.Other, 0xD8D8D8)
  134.  
  135. term.setPaletteColor(Logical.Palette.Wire.Off, 0x073D13)
  136. term.setPaletteColor(Logical.Palette.Wire.On, 0x128E2D)
  137. term.setPaletteColor(Logical.Palette.Wire.Cross, 0x2EC952)
  138. term.setPaletteColor(Logical.Palette.Wire.Error, 0xC92E36)
  139.  
  140. -- Now create the toolbar
  141. term.setCursorPos(1,1)
  142. io.write("Logical: ")
  143.  
  144. Logical.Toolbar = {
  145.   Project = {
  146.     New  = Logical.Functions.NewProject,
  147.     Open = Logical.Functions.OpenProject,
  148.     Save = Logical.Functions.SaveProject,
  149.     FolderNew = Logical.Functions.NewFolder,
  150.     DelFolder = Logical.Functions.RemoveFolder,
  151.   },
  152.   Circuit = {
  153.     New    = Logical.Functions.NewCircuit,
  154.     Open   = Logical.Functions.OpenCircuit,
  155.     Save   = Logical.Functions.SaveCircuit,
  156.     ToLHDL = Logical.LHDL.CircuitToLHDL,
  157.   }
  158. }
  159. Logical.Triggers = {}
  160.  
  161. for menu, content in pairs(Logical.Toolbar) do
  162.   Logical.Triggers[menu] = {key=keys[menu:sub(1,1):lower()],submenu=content}
  163.   io.write(menu.." | ")
  164. end
  165.  
  166. -- Trigger function
  167. function Logical.Trigger (submenu)
  168.   term.setCursorPos(1,2)
  169.   local triggerKeys = {
  170.     [keys.space] = function()end
  171.   }
  172.   for name, tfn in pairs(submenu) do
  173.     triggerKeys[keys[name:sub(1,1):lower()]] = tfn
  174.   end
  175.   while true do
  176.     local doBreak = false
  177.     local event, key = os.pullEvent("key")
  178.     for tkey, tfn in ipairs(triggerKeys) do
  179.       if tkey == key then tfn()
  180.         doBreak = true
  181.         break
  182.       end
  183.     end
  184.     if doBreak then break end
  185.   end
  186. end
  187.  
  188. --- Main event loop ---
  189. while true do
  190.   local event, key = os.pullEvent("key")
  191.   for tname, t in pairs(Logical.Triggers) do
  192.     term.setCursorPos(1,3)
  193.     io.write(type(t.key))
  194.     io.write(" / ")
  195.     io.write(string.char(t.key))
  196.     if t.key == key then
  197.       Logical.Trigger(t.submenu)
  198.     end
  199.   end
  200. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement