masterdisasterHD

menu v6

Dec 13th, 2014
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. os.loadAPI("/rom/apis/colors")
  2.  
  3. --[[ Variables ]]--
  4. local offset = 0
  5. local sel = 1
  6. local printThanks = false
  7. local buffer = {}
  8.  
  9. local bgColour, textColour, selectedBgColour, selectedTextColour
  10.  
  11. if term.isColour() then
  12.  bgColour = colors.white
  13.  textColour = colors.gray
  14.  selectedBgColour = colors.lightBlue
  15.  selectedTextColour = colors.white
  16. else
  17.  bgColour = colors.white
  18.  textColour = colors.black
  19.  selectedBgColour = colors.black
  20.  selectedTextColour = colors.white
  21. end
  22.  
  23. local maxX, maxY = term.getSize()
  24. local running
  25.  
  26. --[[ Functions ]]--
  27.  
  28. clear = function()
  29.  term.clear()
  30.  term.setCursorPos(1,1)
  31. end
  32.  
  33. local function centerWrite(txt)
  34.  local x, y = term.getCursorPos()
  35.  term.setCursorPos(math.floor(maxX/2-#tostring(txt)/2),y)
  36.  write(txt)
  37. end
  38.  
  39. local function redraw(tbl, sel, offset)
  40.  term.setBackgroundColour(bgColour)
  41.  clear()
  42.  for i=1, maxY do
  43.   if tbl[i] ~= nil then
  44.    term.setCursorPos(1, i)
  45.    if (i+offset) == sel then
  46.     term.setBackgroundColour(selectedBgColour)
  47.     term.clearLine()
  48.     term.setTextColour(selectedTextColour)
  49.     centerWrite("[ "..tbl[i + offset].text.." ]")
  50.    else
  51.     term.setBackgroundColour(bgColour)
  52.     term.clearLine()
  53.     term.setTextColour(textColour)
  54.     centerWrite(tbl[i + offset].text)
  55.    end
  56.   end
  57.  end
  58. end
  59.  
  60. local function checkTable(tbl)
  61.  for i,v in ipairs(tbl) do
  62.   if v.handler == nil or type(v.handler) ~= "function" then
  63.    if term.isColour() then
  64.     term.setTextColour(colors.red)
  65.    end
  66.    print("Menu item \""..i.."\" has no valid handler!")
  67.    local txt = textutils.serialize(tostring(v.handler))
  68.    error("handler = "..txt, 0)
  69.   elseif v.text == nil then
  70.    if term.isColour() then
  71.     term.setTextColour(colors.red)
  72.    end
  73.    print("Menu item \""..i.."\" has no text!")
  74.    local txt = textutils.serialize(tostring(v.text))
  75.    error("text = "..txt, 0)
  76.   end
  77.  end
  78. end
  79.  
  80. runMenu = function(tbl)
  81.  if type(tbl) ~= "table" then
  82.   error("Invalid arguments!\nUsage: menuApi.runMenu(menu_table)", 0)
  83.  elseif #tbl < 2 then
  84.   error("Not enough items in menu!\nAt least 2 items are required!", 0)
  85.  end
  86.  
  87.  checkTable(tbl)
  88.  
  89.  offset = 0
  90.  running = true
  91.  while running do
  92.   if sel > #tbl then sel = #tbl end
  93.   term.setCursorBlink(false)
  94.   os.queueEvent("")
  95.   os.pullEvent()
  96.   redraw(tbl, sel, offset)
  97.   local ev = {os.pullEvent()}
  98.   if ev[1] == "key" then
  99.    if ev[2] == keys.up then
  100.     if sel > 1 then sel = sel - 1 end
  101.     if offset > 0 then offset = offset - 1 end
  102.    elseif ev[2] == keys.down then
  103.     if sel < #tbl then sel = sel + 1 end
  104.     if offset < math.max(#tbl - maxY, 0) then offset = offset + 1 end
  105.    elseif ev[2] == keys.enter then
  106.     term.setBackgroundColour(colors.black)
  107.     term.setTextColour(colors.white)
  108.     clear()
  109.     tbl[sel].handler()  
  110.    end
  111.   elseif ev[1] == "mouse_scroll" then
  112.    if ev[2] == -1 then
  113.     if sel > 1 then sel = sel - 1 end
  114.     if offset > 0 then offset = offset - 1 end
  115.    elseif ev[2] == 1 then
  116.     if sel < #tbl then sel = sel + 1 end
  117.     if offset < math.max(#tbl - maxY, 0) then offset = offset + 1 end
  118.    end
  119.   elseif ev[1] == "mouse_click" then
  120.    if tbl[(ev[4] + offset)] ~= nil then
  121.     sel = ev[4] + offset
  122.     redraw(tbl, sel, offset)
  123.     sleep(.1)
  124.     term.setBackgroundColour(colors.black)
  125.     term.setTextColour(colors.white)
  126.     clear()
  127.     tbl[(ev[4] + offset)].handler()
  128.    end
  129.   end
  130.  end
  131. end
  132.  
  133. stopMenu = function()
  134.  running = false
  135.  term.setBackgroundColour(colors.black)
  136.  if printThanks == true then
  137.   if term.isColour() == true then
  138.    term.setTextColour(colors.yellow)
  139.   end
  140.   clear()
  141.   centerWrite("Thank you for using HD's menu api.")
  142.   print("")
  143.  else
  144.   clear()
  145.  end
  146. end
  147.  
  148. listMethods = function()
  149.  local tmp = {}
  150.  for i,v in pairs(menu) do
  151.   table.insert(tmp, i.."()")
  152.  end
  153.  textutils.pagedTabulate(tmp)
  154.  local tmp = nil
  155. end
  156.  
  157. local function isColour(color)
  158.  if term.isColour() then
  159.   if type(color) == "string" then
  160.    if colors[color] ~= nil then
  161.     return {true, colors[color]}
  162.    else
  163.     return false
  164.    end
  165.   elseif type(color) == "number" then
  166.    if color >= 1 and color <= colors.black then
  167.     return {true, color}
  168.    else
  169.     return false
  170.    end
  171.   else
  172.    return false
  173.   end
  174.  else
  175.   return false
  176.  end
  177. end
  178.  
  179. setBackgroundColour = function(color)
  180.  local tmp = isColour(color)
  181.  if tmp[1] then
  182.   bgColour = tmp[2]
  183.  end
  184. end
  185.  
  186. setBarColour = function(color)
  187.  local tmp = isColour(color)
  188.  if tmp[1] then
  189.   selectedBgColour = tmp[2]
  190.  end
  191. end
  192.  
  193. setTextColour = function(color)
  194.  local tmp = isColour(color)
  195.  if tmp[1] then
  196.   textColour = tmp[2]
  197.  end
  198. end
  199.  
  200. setBarTextColour = function(color)
  201.  local tmp = isColour(color)
  202.  if tmp[1] then
  203.   selectedTextColour = tmp[2]
  204.  end
  205. end
  206.  
  207. setBarTextColor = setBarTextColour
  208. setTextColor = setTextColour
  209. setBarColor = setBarColour
  210. setBackgroundColor = setBackgroundColour
  211.  
  212. saveMenu = function(tbl, name)
  213.  if tbl == nil or type(tbl) ~= "table" then
  214.   error("Argument 1 must be table!", 0)
  215.  elseif name == nil or type(name) ~= "string" then
  216.   error("Argument 2 must be string!")
  217.  end
  218.  
  219.  buffer[name] = tbl
  220. end
  221.  
  222. loadMenu = function(name)
  223.  if name == nil or type(name) ~= "string" then
  224.   error("Argument invalid!\nname is not a string or nil!")
  225.  end
  226.  
  227.  if buffer[name] == nil then
  228.   error("Menu '" .. name .. "' does not exist!", 0)
  229.  else
  230.   runMenu(buffer[name])
  231.  end
  232. end
Add Comment
Please, Sign In to add comment