Advertisement
CrazedProgrammer

File Dialog API

Apr 28th, 2015
697
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.70 KB | None | 0 0
  1. -- File Dialog API by CrazedProgrammer
  2. -- You can find info and documentation on these pages:
  3. --
  4. -- You may use this in your ComputerCraft programs and modify it without asking.
  5. -- However, you may not publish this API under your name without asking me.
  6. -- If you have any suggestions, bug reports or questions then please send an email to:
  7. -- crazedprogrammer@gmail.com
  8.  
  9. local function list(dir)
  10.     local fullList = fs.list(dir)
  11.     table.sort(fullList, function (a, b) return string.lower(a) < string.lower(b) end)
  12.     local displayList = { }
  13.     for i = 1, #fullList do if fs.isDir(dir.."/"..fullList[i]) then displayList[#displayList + 1] = fullList[i] end end
  14.     for i = 1, #fullList do if not fs.isDir(dir.."/"..fullList[i]) then displayList[#displayList + 1] = fullList[i] end end
  15.     return displayList
  16. end
  17.  
  18. local function draw(dir, offset)
  19.     local width, height = term.getSize()
  20.     term.setBackgroundColor(colors.white)
  21.     term.clear()
  22.     term.setCursorPos(1, 2 - offset)
  23.     term.setBackgroundColor(colors.yellow)
  24.     term.setTextColor(colors.black)
  25.     term.write(".."..string.rep(" ", width - 2))
  26.     for k,v in pairs(list(dir)) do
  27.         term.setCursorPos(1, k + 2 - offset)
  28.         if fs.isDir(dir.."/"..v) then
  29.             term.setBackgroundColor(colors.yellow)
  30.             term.write(v..string.rep(" ", width - #v))
  31.         else
  32.             term.setBackgroundColor(colors.white)
  33.             term.write(v)
  34.         end
  35.     end
  36.     term.setCursorPos(1, 1)
  37.     term.setBackgroundColor(colors.gray)
  38.     term.setTextColor(colors.white)
  39.     if dir ~= "" then
  40.         term.write("/"..dir..string.rep(" ", width - #dir - 2))
  41.     else
  42.         term.write("/"..string.rep(" ", width - 2))
  43.     end
  44.     term.setBackgroundColor(colors.red)
  45.     term.write("X")
  46.     term.setBackgroundColor(colors.gray)
  47.     term.setCursorPos(width, 2)
  48.     term.write("^")
  49.     term.setCursorPos(width, height - 1)
  50.     term.write("v")
  51.     term.setCursorPos(1, height)
  52.     term.setBackgroundColor(colors.lightGray)
  53.     term.setTextColor(colors.black)
  54.     term.write(string.rep(" ", width))
  55. end
  56.  
  57. local function reset()
  58.     term.setCursorPos(1, 1)
  59.     term.setBackgroundColor(colors.black)
  60.     term.setTextColor(colors.white)
  61.     term.clear()
  62. end
  63.  
  64. function open(dir)
  65.     dir = dir or ""
  66.     local offset, width, height = 0, term.getSize()
  67.     draw(dir, offset)
  68.     while true do
  69.         local e = {os.pullEvent()}
  70.         if e[1] == "mouse_click" then
  71.             local x, y = e[3], e[4]
  72.             if x == width and y == 1 then
  73.                 reset()
  74.                 return
  75.             elseif x == width and y == 2 then
  76.                 offset = offset - math.floor(height / 3) + 1
  77.                 if offset < 0 then
  78.                     offset = 0
  79.                 end
  80.             elseif x == width and y == height - 1 then
  81.                 offset = offset + math.floor(height / 3) - 1
  82.             elseif y > 1 and y < height then
  83.                 if y + offset == 2 and dir ~= "" then
  84.                     dir = fs.getDir(dir)
  85.                 else
  86.                     for k,v in pairs(list(dir)) do
  87.                         if k == y + offset - 2 then
  88.                             if fs.isDir(dir.."/"..v) then
  89.                                 dir = fs.getDir(dir.."/"..v.."/_")
  90.                             else
  91.                                 reset()
  92.                                 return fs.getDir(dir.."/"..v.."/_")
  93.                             end
  94.                         end
  95.                     end
  96.                 end
  97.             elseif y == height then
  98.                 term.setCursorPos(1, height)
  99.                 local file = read()
  100.                 if file == "" then
  101.                 elseif file == ".." and dir ~= "" then
  102.                     dir = fs.getDir(dir)
  103.                 elseif file:sub(1, 1) == "/" then
  104.                     if fs.isDir(file) then
  105.                         dir = file:sub(2, #file)
  106.                     else
  107.                         reset()
  108.                         return file:sub(2, #file)
  109.                     end
  110.                 elseif fs.isDir(dir.."/"..file) then
  111.                     dir = fs.getDir(dir.."/"..file.."/_")
  112.                 else
  113.                     reset()
  114.                     return fs.getDir(dir.."/"..file.."/_")
  115.                 end
  116.             end
  117.         elseif e[1] == "mouse_scroll" then
  118.             offset = offset + e[2] * (math.floor(height / 3) - 1)
  119.             if offset < 0 then
  120.                 offset = 0
  121.             end
  122.         elseif e[1] == "term_resize" then
  123.             width, height = term.getSize()
  124.         end
  125.         draw(dir, offset)
  126.     end
  127. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement