aboutsummaryrefslogtreecommitdiff
path: root/programs/mousebrowser.lua
diff options
context:
space:
mode:
authorAndrew Lee <alee14498@gmail.com>2019-03-05 19:26:59 -0500
committerAndrew Lee <alee14498@gmail.com>2019-03-05 19:26:59 -0500
commita18407bdb9c87ac970418cd625abe38f550ab45c (patch)
treecb40abeaef3b81dcd1cbf23304e80acf0445aed2 /programs/mousebrowser.lua
parent84a82712e4e3bd6826e572e63accc0800992eb4b (diff)
downloadbits-UI-a18407bdb9c87ac970418cd625abe38f550ab45c.tar.gz
bits-UI-a18407bdb9c87ac970418cd625abe38f550ab45c.tar.bz2
bits-UI-a18407bdb9c87ac970418cd625abe38f550ab45c.zip
Added a bunch of stuff
Diffstat (limited to 'programs/mousebrowser.lua')
-rw-r--r--programs/mousebrowser.lua1298
1 files changed, 1298 insertions, 0 deletions
diff --git a/programs/mousebrowser.lua b/programs/mousebrowser.lua
new file mode 100644
index 0000000..6757273
--- /dev/null
+++ b/programs/mousebrowser.lua
@@ -0,0 +1,1298 @@
+--[[
+ Mouse File Browser
+ by:
+ Stiepen irc(Kilobyte)
+ Cruor
+ BigSHinyToys
+
+ note: send link to nightin9ale on CC forums
+--]]
+
+local tArgs = {...}
+local ver = "1.4"
+local sTitle = "File Browser"
+local bugTest, norun, dir, showAll
+local _tArgs = {}
+local config = "mouse.cfg"
+
+local temp
+if shell and shell.getRunningProgram then
+ temp = shell.getRunningProgram()
+end
+
+temp = temp or "/bla"
+local localPath = string.sub(temp,1,#temp-string.len(fs.getName(temp)))
+temp = nil -- just because not needed
+
+-- load config file
+
+local configSet = {}
+local cnf = {}
+
+if fs.exists(localPath.."/"..config) then
+ local file = fs.open(localPath.."/"..config,"r")
+ if file then
+ local item = file.readLine()
+ while item do
+ table.insert(cnf,item)
+ item = file.readLine()
+ end
+ file.close()
+ end
+end
+
+for i = 1,10 do
+ local test,data = pcall(textutils.unserialize,cnf[i])
+ if test then
+ configSet[i] = data
+ else
+ configSet[i] = nil
+ end
+end
+cnf = nil
+
+-- color configuration work in progress
+local titleBar = configSet[1] or {txt = colors.black,back = colors.blue}
+local addressBar = configSet[2] or {txt = colors.black,back = colors.lightGray}
+local itemWindo = configSet[3] or {txt = colors.black,back = colors.cyan}
+local rcmList = configSet[4] or {txt = colors.black,back = colors.lightGray} -- rcm = Right Click Menu List
+local rcmTitle = configSet[5] or {txt = colors.black,back = colors.blue}
+local dialogTitle = configSet[6] or {txt = colors.black,back = colors.blue}
+local dialogWindo = configSet[7] or {txt = colors.black,back = colors.white}
+local scrollCol = configSet[8] or {off = colors.gray, button = colors.gray,back = colors.lightGray}
+
+local tIcons = configSet[9] or {
+ back = {tCol = "lightGray",bCol = "blue",txt = " < "},
+ disk = {tCol = "lime",bCol = "green",txt = "[*]"},
+ audio = {tCol = "yellow",bCol = "red",txt = "(o)"},
+ folder = {tCol = "lightGray",bCol = "blue",txt = "[=]"},
+ file = {tCol = nil ,bCol = nil ,txt = nil}
+}
+
+local customLaunch = configSet[10] or {
+ ["Edit"] = "rom/programs/edit",
+ ["Paint"] = "rom/programs/color/paint"
+}
+
+local function saveCFG(overWrite)
+ if not fs.exists(localPath.."/"..config) or overWrite then
+ local cnf = {}
+ local file = fs.open(localPath.."/"..config,"w")
+ if file then
+ file.write(textutils.serialize(titleBar).."\n")
+ file.write(textutils.serialize(addressBar).."\n")
+ file.write(textutils.serialize(itemWindo).."\n")
+ file.write(textutils.serialize(rcmList).."\n")
+ file.write(textutils.serialize(rcmTitle).."\n")
+ file.write(textutils.serialize(dialogTitle).."\n")
+ file.write(textutils.serialize(dialogWindo).."\n")
+ file.write(textutils.serialize(scrollCol).."\n")
+ file.write(textutils.serialize(tIcons).."\n")
+ file.write(textutils.serialize(customLaunch).."\n")
+ file.close()
+ elseif overWrite then
+ end
+ end
+end
+
+saveCFG()
+
+-- end configuration
+
+local function help()
+ print([[Usage: browser [-d] [-h] [-a] [-u] [--debug] [--help] [--dir <dir>] [--all] [--update]
+--debug or -d: enable debug mode
+--help or -h: display this screen
+--dir: define initial directory
+--all or -a: show hidden files
+--update -u: update]])
+end
+
+local function inBouwndry(clickX,clickY,boxX,boxY,width,hight)
+ return ( clickX >= boxX and clickX < boxX + width and clickY >= boxY and clickY < boxY + hight )
+end
+
+local function update()
+ print("Checking for Updates")
+ local isHTTP = false
+ local response
+ if http then
+ isHTTP = true
+ print("http on")
+ response = http.get("http://pastebin.com/raw.php?i=rLbnyM1U")
+ end
+ local flag = false
+ local isNewFlag = false
+ local newVerID
+ if response and isHTTP then
+ print("recived")
+ local sInfo = response.readLine()
+ print(sInfo)
+ while sInfo do
+ print(sInfo)
+ if flag then
+ if sInfo == ver then
+ print("Mouse File Browser is up to date")
+ break
+ else
+ newVerID = sInfo
+ flag = false
+ isNewFlag = true
+ end
+ elseif sInfo == sTitle then
+ flag = true
+ elseif isNewFlag then
+ isNewFlag = sInfo
+ response.close()
+ break
+ end
+ sInfo = response.readLine()
+ end
+ if isNewFlag then
+ print("New vershion avalible "..newVerID)
+ print('downloading to \Browser')
+ if fs.exists("Browser") then
+ write("Browser exists OverWrite Browser Y/N : ")
+ local input = string.lower(read())
+ while input ~= "y" and input ~= "n" do
+ print("y or n required")
+ input = string.lower(read())
+ end
+ if input == "y" then
+ print("Over Writeing Browser")
+ print("Downloading new File")
+ local response = http.get("http://pastebin.com/raw.php?i="..isNewFlag)
+ if response then
+ print("file downloaded")
+ print("installing")
+ fs.delete("Browser")
+ local handel = fs.open("Browser","w")
+ if handel then
+ handel.write(response.readAll())
+ handel.close()
+ print("Update Complete")
+ end
+ response.close()
+ end
+ else
+ print("Update aborted")
+ end
+ else
+ print("Downloading new File")
+ local response = http.get("http://pastebin.com/raw.php?i="..isNewFlag)
+ if response then
+ print("file downloaded")
+ print("installing")
+ local handel = fs.open("Browser","w")
+ if handel then
+ handel.write(response.readAll())
+ handel.close()
+ print("Update Complete")
+ end
+ response.close()
+ end
+ end
+ end
+ elseif isHTTP then
+ print("Error downloading update file Please contact BigSHinyToys on the CC forums")
+ print("http://www.computercraft.info/forums2/index.php?/topic/5509-advanced-computer-mouse-file-browser/")
+ elseif not isHTTP then
+ print("HTTP API is turned off")
+ print("Access Computer Craft Configer and change line")
+ print([[enableapi_http {
+# Enable the "http" API on Computers
+general=false
+}
+TO THIS :
+enableapi_http {
+# Enable the "http" API on Computers
+general=true
+}]])
+ end
+ notCMD = false
+ norun = true
+end
+
+for a = 1, #tArgs do
+ if tArgs[a]:sub(1,2) == "--" then
+ local cmd = tArgs[a]:sub(3):lower()
+ if cmd == "debug" then
+ bugTest = true
+ elseif cmd == "help" then
+ help()
+ norun = true
+ elseif cmd == "dir" then
+ dir = tArgs[a+1]
+ a = a + 1
+ elseif cmd == "all" then
+ showAll = true
+ elseif cmd == "update" then
+ update()
+ end
+ elseif tArgs[a]:sub(1,1) == "-" then
+ for b = 2, #tArgs[a] do
+ cmd = tArgs[a]:sub(b, b)
+ if cmd == "d" then
+ bugTest = true
+ elseif cmd == "h" then
+ help()
+ norun = true
+ elseif cmd == "p" then
+ dir = tArgs[a+1]
+ a = a + 1
+ elseif cmd == "a" then
+ showAll = true
+ elseif cmd == "u" then
+ update()
+ end
+ end
+ else
+ table.insert(_tArgs, tArgs[a])
+ end
+end
+
+if (not dir) and shell and shell.dir then
+ dir = shell.dir()
+end
+
+if dir and shell and shell.resolve then
+ dir = shell.resolve(dir)
+end
+
+dir = dir or "/"
+
+if bugTest then -- this is that the var is for testing
+ print("Dir: "..dir)
+ os.startTimer(4)
+ os.pullEvent()
+end
+
+local function clear()
+ term.setBackgroundColor(colors.black)
+ term.setTextColor(colors.white)
+ term.clear()
+ term.setCursorBlink(false)
+ term.setCursorPos(1,1)
+end
+
+--[[
+ Code thanks to Cruor
+ http://www.computercraft.info/forums2/index.php?/topic/5802-support-for-shell/
+]]--
+
+local function fixArgs(...)
+ local tReturn={}
+ local str=table.concat({...}," ")
+ local sMatch
+ while str and #str>0 do
+ if string.sub(str,1,1)=="\"" then
+ sMatch, str=string.match(str, "\"(.-)\"%s*(.*)")
+ else
+ sMatch, str=string.match(str, "(%S+)%s*(.*)")
+ end
+ table.insert(tReturn,sMatch)
+ end
+ return tReturn
+end
+
+--[[ end Cruor function ]]--
+
+
+-- modified read made to play nice with coroutines
+
+local function readMOD( _sReplaceChar, _tHistory,_wdth)
+ local sLine = ""
+ term.setCursorBlink( true )
+
+ local nHistoryPos = nil
+ local nPos = 0
+ if _sReplaceChar then
+ _sReplaceChar = string.sub( _sReplaceChar, 1, 1 )
+ end
+
+ local sx, sy = term.getCursorPos()
+
+ local w, h = term.getSize()
+ if _wdth and type(_wdth) == "number" then
+ w = sx + _wdth - 1
+ end
+
+ local function redraw( _sCustomReplaceChar )
+ local nScroll = 0
+ if sx + nPos >= w then
+ nScroll = (sx + nPos) - w
+ end
+
+ term.setCursorPos( sx + _wdth - 1, sy )
+ term.write(" ")
+ term.setCursorPos( sx, sy )
+ local sReplace = _sCustomReplaceChar or _sReplaceChar
+ if sReplace then
+ term.write( string.rep(sReplace,_wdth) )
+ else
+ term.write( string.sub( sLine, nScroll + 1 ,nScroll + _wdth) )
+ end
+ term.setCursorPos( sx + nPos - nScroll, sy )
+ end
+
+ while true do
+ local sEvent, param = os.pullEvent()
+ if sEvent == "char" then
+ sLine = string.sub( sLine, 1, nPos ) .. param .. string.sub( sLine, nPos + 1 )
+ nPos = nPos + 1
+ redraw()
+
+ elseif sEvent == "key" then
+
+ if param == keys.left then
+ -- Left
+ if nPos > 0 then
+ nPos = nPos - 1
+ redraw()
+ end
+
+ elseif param == keys.right then
+ -- Right
+ if nPos < string.len(sLine) then
+ nPos = nPos + 1
+ redraw()
+ end
+
+ elseif param == keys.up or param == keys.down then
+ -- Up or down
+ if _tHistory then
+ redraw(" ");
+ if param == keys.up then
+ -- Up
+ if nHistoryPos == nil then
+ if #_tHistory > 0 then
+ nHistoryPos = #_tHistory
+ end
+ elseif nHistoryPos > 1 then
+ nHistoryPos = nHistoryPos - 1
+ end
+ else
+ -- Down
+ if nHistoryPos == #_tHistory then
+ nHistoryPos = nil
+ elseif nHistoryPos ~= nil then
+ nHistoryPos = nHistoryPos + 1
+ end
+ end
+
+ if nHistoryPos then
+ sLine = _tHistory[nHistoryPos]
+ nPos = string.len( sLine )
+ else
+ sLine = ""
+ nPos = 0
+ end
+ redraw()
+ end
+ elseif param == keys.backspace then
+ -- Backspace
+ if nPos > 0 then
+ redraw(" ");
+ sLine = string.sub( sLine, 1, nPos - 1 ) .. string.sub( sLine, nPos + 1 )
+ nPos = nPos - 1
+ redraw()
+ end
+ elseif param == keys.home then
+ -- Home
+ nPos = 0
+ redraw()
+ elseif param == keys.delete then
+ if nPos < string.len(sLine) then
+ redraw(" ");
+ sLine = string.sub( sLine, 1, nPos ) .. string.sub( sLine, nPos + 2 )
+ redraw()
+ end
+ elseif param == keys["end"] then
+ -- End
+ nPos = string.len(sLine)
+ redraw()
+ end
+ elseif sEvent == "redraw" then
+ redraw()
+ elseif sEvent == "return" then
+ term.setCursorBlink( false )
+ return sLine
+ end
+ end
+
+ term.setCursorBlink( false )
+
+ return sLine
+end
+
+-- end modified read
+
+local function printC(posX,posY,textCol,backCol,text)
+ term.setCursorPos(posX,posY)
+ term.setTextColor(colors[textCol] or textCol)
+ term.setBackgroundColor(colors[backCol] or backCol)
+ term.write(text)
+end
+
+local function InputBox(title)
+ local boxW,boxH = 26,3
+ local termX,termY = term.getSize()
+ local ofsX,ofsY = math.ceil((termX/2) - (boxW/2)) , math.ceil((termY/2) - (boxH/2)) -- offset from top left
+ local options = {"ok","cancel"}
+
+ local selected = 1
+ local space = 0
+ local range = {}
+ for i = 1,#options do
+ range[i] = {s = space,f = space + string.len(options[i])}
+ space = space + string.len(options[i])+3
+ end
+ local ofC = (boxW/2) - (space/2)
+
+ local function drawBox()
+ printC(ofsX,ofsY,colors.black,colors.blue,string.rep(" ",boxW))
+ printC(ofsX+1,ofsY,colors.black,colors.blue,(title or "User Input"))
+ printC(ofsX,ofsY+1,colors.black,colors.white,string.rep(" ",boxW))
+ printC(ofsX,ofsY+2,colors.black,colors.white,string.rep(" ",boxW))
+ printC(ofsX,ofsY+3,colors.black,colors.white,string.rep(" ",boxW))
+
+ for i = 1,#options do
+ if i == selected then
+ term.setBackgroundColor(colors.lightGray)
+ term.setCursorPos(range[i].s + ofC + ofsX - 1,ofsY + 3)
+ term.write("["..options[i].."]")
+ term.setBackgroundColor(colors.white)
+ term.write(" ")
+ else
+ term.setCursorPos(range[i].s + ofC + ofsX - 1,ofsY + 3)
+ term.write(" "..options[i].." ")
+ end
+ end
+
+ printC(ofsX+2,ofsY+2,colors.black,colors.lightGray,string.rep(" ",boxW-4))
+ end
+ drawBox()
+ term.setCursorPos(ofsX+2,ofsY+2)
+ local co = coroutine.create(function() return readMOD(nil,nil,boxW - 4) end)
+ while true do
+ local event = {os.pullEvent()}
+ if event[1] == "key" or event[1] == "char" then
+ if event[2] == 28 then
+ local test,data = coroutine.resume(co,"return")
+ return data
+ else
+ coroutine.resume(co,unpack(event))
+ end
+ elseif event[1] == "mouse_click" then
+ if event[4] == ofsY + 3 then
+ for i = 1,#options do
+ if event[3] >= range[i].s + ofC + ofsX - 1 and event[3] <= range[i].f + ofC + ofsX then
+ if options[i] == "ok" then
+ local test,data = coroutine.resume(co,"return")
+ return data
+ elseif options[i] == "cancel" then
+ return false
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+local function dialogBox(title,message,options, h, w)
+ term.setCursorBlink(false)
+ local selected = 1
+ title = title or ""
+ message = message or ""
+ options = options or {}
+ local boxW,boxH = (w or 26), (h or 3)
+ local termX,termY = term.getSize()
+ local ofsX,ofsY = math.ceil((termX/2) - (boxW/2)) , math.ceil((termY/2) - (boxH/2)) -- offset from top left
+
+ local space = 0
+ local range = {}
+ for i = 1,#options do
+ range[i] = {s = space,f = space + string.len(options[i])}
+ space = space + string.len(options[i])+3
+ end
+ local ofC = math.ceil((boxW/2)) - math.ceil((space/2))
+
+ local function drawBox()
+ printC(ofsX,ofsY,dialogTitle.txt,dialogTitle.back," "..title..string.rep(" ",boxW-#title-5).."_[]")
+ term.setBackgroundColor(colors.red)
+ term.setTextColor(colors.white)
+ term.write("X")
+ printC(ofsX,ofsY+1,dialogWindo.txt,dialogWindo.back,string.sub(" "..message..string.rep(" ",boxW),1,boxW))
+ term.setCursorPos(ofsX,ofsY+2)
+ term.write(string.rep(" ",boxW))
+ term.setCursorPos(ofsX,ofsY+3)
+ term.write(string.rep(" ",boxW))
+ for i = 1,#options do
+ if i == selected then
+ printC(range[i].s + ofC + ofsX - 1,ofsY + 3,"black","lightGray","["..options[i].."]")
+ term.setBackgroundColor(dialogWindo.back)
+ term.setTextColor(dialogWindo.txt)
+ term.write(" ")
+ else
+ term.setCursorPos(range[i].s + ofC + ofsX - 1,ofsY + 3)
+ term.write(" "..options[i].." ")
+ end
+ end
+ term.setCursorPos(ofsX + ofC + space,ofsY + 3)
+ term.write(string.rep(" ",boxW - (ofC + space)))
+ term.setBackgroundColor(colors.black)
+ term.setTextColor(colors.white)
+ end
+ while true do
+ drawBox()
+ event = {os.pullEvent()}
+ if event[1] == "key" then
+ if event[2] == 203 then -- left
+ selected = selected - 1
+ if selected < 1 then
+ selected = #options
+ end
+ elseif event[2] == 205 then -- right
+ selected = selected + 1
+ if selected > #options then
+ selected = 1
+ end
+ elseif event[2] == 28 then -- enter
+ return selected , options[selected]
+ end
+ elseif event[1] == "mouse_click" then
+
+ if bugTest then term.write("M "..event[2].." X "..event[3].." Y "..event[4].." ") end
+
+ if event[2] == 1 then
+ if event[4] == ofsY + 3 then
+ for i = 1,#options do
+ if event[3] >= range[i].s + ofC + ofsX - 1 and event[3] <= range[i].f + ofC + ofsX then
+ return i , options[i]
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+local flag = true
+local fSlash = "/"
+local path = {dir:match("[^/]+")}
+local function stringPath() -- compacted this a lot
+ return fSlash..table.concat(path,fSlash)
+end
+
+local function osRunSpaces(sFileLocation,...) -- getRunningProgram() ["shell"] = shell
+ clear()
+ if os.newThread then
+ os.newThread(false,...)
+ else
+ local fProg,probblem = loadfile(sFileLocation)
+ if fProg then
+ local tEnv = {["shell"] = {}}
+ setmetatable(tEnv.shell,{ __index = shell})
+ tEnv.shell.getRunningProgram = function()
+ return sFileLocation
+ end
+ setmetatable(tEnv,{ __index = _G})
+ setfenv(fProg,tEnv)
+ local test,probblem = pcall(fProg,...)
+ if not test then
+ print(probblem)
+ dialogBox("ERROR",tostring(probblem),{"ok"},3,30)
+ else
+ return true
+ end
+ else
+ print(probblem)
+ dialogBox("ERROR",tostring(probblem),{"ok"},3,30)
+ end
+ end
+end
+
+local function rClickMenu(title,tList,tItem,posX,posY)
+
+ term.setCursorBlink(false)
+ local BoxTitle = title
+ local choices = {}
+ local termX,termY = term.getSize()
+ local offX,offY
+
+ local width = #BoxTitle + 2
+ local hight
+
+ for k,v in pairs(tList) do
+ if v ~= nil then
+ table.insert(choices,k)
+ end
+ if width < #k + 2 then
+ width = #k + 2
+ end
+ end
+
+ if #choices == 0 then
+ return
+ end
+
+ hight = #choices + 1
+ table.sort(choices)
+
+ offX,offY = math.ceil((termX/2) - (width/2)),math.ceil((termY/2) - (hight/2))
+
+ if posX and posY then -- offX,offY = posX,posY
+ if posX >= termX - width - 1 then
+ offX = termX - width - 1
+ else
+ offX = posX
+ end
+ if posY >= termY - hight then
+ offY = termY - hight
+ else
+ offY = posY
+ end
+ end
+
+ local function reDrawer()
+ printC(offX,offY,rcmTitle.txt,rcmTitle.back," "..BoxTitle..string.rep(" ",width - #BoxTitle - 1))
+ for i = 1,#choices do
+ printC(offX,offY + i,rcmList.txt,rcmList.back," "..choices[i]..string.rep(" ",width - #choices[i] - 1))
+ end
+ end
+
+ while true do
+ reDrawer()
+ local event = {os.pullEvent()}
+ if event[1] == "mouse_click" then
+ if event[2] == 1 then -- event[3] = x event[4] = y
+ if event[4] > offY and event[4] < hight + offY and event[3] >= offX and event[3] < width + offX then
+ --dialogBox("ERROR:",type(tList[choices[event[4] - offY]]),{"ok"})
+ if type(tList[choices[event[4] - offY]]) == "function" then
+ return tList[choices[event[4] - offY]](tItem)
+ elseif type(tList[choices[event[4] - offY]]) == "table" then
+ return rClickMenu("Options",tList[choices[event[4] - offY]],tItem,event[3],event[4])
+ elseif type(tList[choices[event[4] - offY]]) == "string" then
+ return osRunSpaces(
+ unpack(
+ fixArgs(
+ tList[choices[event[4] - offY]].." \""..stringPath()..fSlash..tItem.n.."\""
+ )
+ )
+ )
+ else
+ dialogBox("ERROR:","somthing up with new rMenu",{"ok"})
+ end
+ else
+ return
+ end
+ elseif event[2] == 2 then
+ return
+ end
+ end
+ end
+
+end
+
+local function preferences()
+ local tItem = {
+ {txt = "Title Bar",it = titleBar},
+ {txt = "Address Bar",it = addressBar},
+ {txt = "Item Windo", it = itemWindo},
+ {txt = "Title Right Click Title",it = rcmTitle},
+ {txt = "Right Click Menu",it = rcmList},
+ {txt = "Title Dialog Box",it = dialogTitle},
+ {txt = "Dialog Box",it = dialogWindo},
+ {txt = "Scroll Bar",it = scrollCol}
+ }
+ local topL,topR = 13,5
+ local width,hight = 23,6
+ local bottomL,bottomR = topL + width,topR + hight
+
+ local listOffset = 0
+ local sel = 1
+ local otherSel = 1
+ local otherItems = {}
+
+ if tItem[sel] then
+ for k,v in pairs(tItem[sel].it) do
+ table.insert(otherItems,{txt = k,it = v})
+ end
+ end
+
+ local function draw()
+ printC(topL,topR,titleBar.txt,titleBar.back,string.sub(" Preferences "..string.rep(" ",width),1,width))
+ for i = 0,12,4 do
+ for a = 1,4 do
+ --printC(topL + (a*12)-12 ,topR + ((i+4)/4),4,2^(a+i-1)," "..tostring(2^(a+i-1)))
+ printC(topL + a-1 ,topR + ((i+4)/4),4,2^(a+i-1)," ")
+ end
+ end
+ local sSel = " "
+ for i = 1,hight - 2 do
+ if i == sel - listOffset then
+ sSel = ">"
+ end
+ if tItem[i+listOffset] then
+ printC(topL + 4 ,topR + i,colors.black,colors.white,string.sub(sSel..tItem[i+listOffset].txt..string.rep(" ",width),1,width - 4))
+ else
+ printC(topL + 4 ,topR + i,colors.black,colors.white,sSel..string.rep(" ",width-5))
+ end
+ if i == sel - listOffset then
+ sSel = " "
+ end
+ end
+ term.setCursorPos(topL,topR + hight - 1)
+ local loop = 1
+ local length = 0
+ for i = 1,#otherItems do
+ if otherSel == i then
+ sSel = ">"
+ end
+ if colors.black == otherItems[i].it or colors.gray == otherItems[i].it then
+ term.setTextColor(colors.white)
+ else
+ term.setTextColor(colors.black)
+ end
+ term.setBackgroundColor(otherItems[i].it)
+ term.write(sSel..tostring(otherItems[i].txt).." ")
+ length = length + #otherItems[i].txt + 2
+ if otherSel == i then
+ sSel = " "
+ end
+ loop = loop+1
+ end
+ term.setBackgroundColor(colors.white)
+ term.write(string.rep(" ",width - length))
+ end
+ while true do
+ draw()
+ local event = {os.pullEvent()}
+ if event[1] == "mouse_click" and event[2] == 1 then
+ if inBouwndry(event[3],event[4],topL,topR,width,hight) then
+ local inSideX,inSideY = event[3] - topL,event[4] - topR
+ if inBouwndry(inSideX+1,inSideY,1,1,4,4) and tItem[sel] then
+ --[[
+ term.setCursorPos(1,1)
+ term.setBackgroundColor(2^(inSideX + ((inSideY*4)-4)))
+ print(2^(inSideX + ((inSideY*4)-4))," ",inSideX + ((inSideY*4)-4)," ")
+ ]]--
+ tItem[sel]["it"][otherItems[otherSel].txt] = (2^(inSideX + ((inSideY*4)-4)))
+ end
+ end
+ elseif event[1] == "key" then
+ if event[2] == 200 then
+ sel = sel - 1
+ elseif event[2] == 208 then
+ sel = sel + 1
+ elseif event[2] == 203 then
+ otherSel = otherSel - 1
+ elseif event[2] == 205 then
+ otherSel = otherSel + 1
+ elseif event[2] == 28 then
+ if dialogBox("Confirm","Save prefrences?",{"Yes","No"}) == 1 then
+ saveCFG(true)
+ end
+ return
+ end
+ end
+ if sel < 1 then
+ sel = 1
+ elseif sel > #tItem then
+ sel = #tItem
+ end
+ if sel > listOffset + hight - 2 then
+ listOffset = listOffset + 1
+ elseif sel - listOffset < 1 then
+ listOffset = listOffset - 1
+ end
+
+ otherItems = {}
+ if tItem[sel] then
+ for k,v in pairs(tItem[sel].it) do
+ table.insert(otherItems,{txt = k,it = v})
+ end
+ end
+
+ if otherSel < 1 then
+ otherSel = 1
+ elseif otherSel > #otherItems then
+ otherSel = #otherItems
+ end
+
+ if bugTest then
+ term.setBackgroundColor(colors.black)
+ term.setTextColor(colors.white)
+ term.setCursorPos(1,1)
+ term.clearLine()
+ term.write("sel "..sel.." offset "..listOffset)
+ end
+ end
+end
+
+local function fileSelect(mode) -- save_file open_file browse < not yet implemented
+
+ local title = sTitle.." "..ver
+ local bRun = true
+ local clipboard = nil
+ local cut = false
+
+ local termX,termY = term.getSize()
+ local offsetX,offsetY = 1,1
+ local hight,width = math.ceil(termY-2),math.ceil(termX-2)
+ local oldHight,oldWidth
+
+ -- offsets
+ local boxOffX,boxOffY = offsetX,offsetY + 2
+ local boxH,boxW = hight - 2 ,width - 2
+
+ local barX,barY = offsetX + 1,offsetY + 2
+ local barH,barW = 1,width - 1
+
+ local tbarX,tbarY = offsetX + 1,offsetY + 1
+ local tbarH,tbarW = 1,width - 1
+
+ local exitX,exitY = offsetX + width - 1 ,offsetY + 1
+
+ local pading = string.rep(" ",boxW)
+ local list
+
+ local listOff = 0
+
+ local sPath
+ local tItemList = {}
+
+ local function newList()
+ listOff = 0
+ flag = true
+ tItemList = {{n = "..", id = "back"}} -- adds a back item at top of list
+ sPath = stringPath()
+ local folders = {}
+ local files = {}
+ local disks = {}
+ if not fs.exists(sPath) then
+ path = {}
+ sPath = stringPath()
+ dialogBox("ERROR:","Path no longer exists",{"ok"})
+ end
+ local test,list = pcall(fs.list,sPath) -- stopes fs.list crash
+ if list == nil then
+ list = {}
+ dialogBox("ERROR : ","fs.list crashed",{"ok"})
+ end
+ if #path == 0 then
+ for i,v in pairs(rs.getSides()) do
+ if disk.isPresent(v) then
+ if disk.hasData(v) then
+ table.insert(tItemList,{n = disk.getMountPath(v), id = "disk",s = v})
+ disks[disk.getMountPath(v)] = true
+ elseif disk.hasAudio(v) then
+ table.insert(tItemList,{n = disk.getAudioTitle(v), id = "audio",s = v})
+ end
+ end
+ end
+ end
+ for i,v in pairs(list) do
+ if fs.isDir(sPath..fSlash..v) then
+ table.insert(folders,v)
+ else
+ table.insert(files,v)
+ end
+ end
+ table.sort(folders)
+ table.sort(files)
+ for i,v in pairs(folders) do
+ if disks[v] == nil then
+ table.insert(tItemList,{n = v, id = "folder"})
+ end
+ end
+ for i,v in pairs(files) do
+ table.insert(tItemList,{n = v, id = "file"})
+ end
+ end
+
+ local function paste()
+ if cut then
+ local s, m = pcall(
+ function()
+ fs.move(clipboard[1]..fSlash..clipboard[2], stringPath()..fSlash..clipboard[2])
+ cut = false
+ clipboard = nil
+ end)
+ if not s then
+ dialogBox("Error", (m or "Couldn't move"), {"ok"}, 4, 30)
+ end
+ if bugTest then
+ local x, y = term.getCursorPos()
+ term.setCursorPos(1, ({term.getSize()})[2])
+ write("from "..clipboard[1]..fSlash..clipboard[2].." to "..stringPath()..fSlash..clipboard[2])
+ end
+ else
+ local s, m = pcall(function()
+ if fs.exists(stringPath()..fSlash..clipboard[2]) then
+ fs.copy(clipboard[1]..fSlash..clipboard[2], stringPath()..fSlash.."copy-"..clipboard[2])
+ else
+ fs.copy(clipboard[1]..fSlash..clipboard[2], stringPath()..fSlash..clipboard[2])
+ end
+ end)
+ if not s then
+ dialogBox("Error", (m or "Couldn't copy"), {"ok"}, 4, 30)
+ end
+ if bugTest then
+ local x, y = term.getCursorPos()
+ term.setCursorPos(1, ({term.getSize()})[2])
+ write("from "..clipboard[1]..fSlash..clipboard[2].." to "..stringPath()..fSlash..clipboard[2])
+ end
+ end
+ newList()
+ end
+
+ -- this section bellow handles the right click menu
+
+ local tmenu = {
+ disk = {
+ ["Open"] = function(tItem)
+ table.insert(path,tItem.n)
+ newList()
+ end,
+ ["Copy"] = function(tItem)
+ clipboard = {stringPath(), tItem.n}
+ cut = false
+ end,
+ ["Eject"] = function(tItem)
+ if dialogBox("Confirm","Eject "..fSlash..tItem.n.." "..tItem.s,{"yes","no"}) == 1 then
+ disk.eject(tItem.s)
+ newList()
+ end
+ end,
+ ["ID label"] = function(tItem)
+ dialogBox("ID label",disk.getDiskID(tItem.s).." "..tostring(disk.getLabel(tItem.s)),{"ok"})
+ end,
+ ["Set label"] = function(tItem)
+ local name = InputBox("Label?")
+ if name then
+ disk.setLabel(tItem.s,name)
+ end
+ end,
+ ["Clear label"] = function(tItem)
+ if dialogBox("Confirm","Cleal Label from "..tItem.s,{"yes","no"}) == 1 then
+ disk.setLabel(tItem.s)
+ end
+ end
+ },
+ folder = {
+ ["Open"] = function(temp)
+ table.insert(path,temp.n)
+ newList()
+ end,
+ ["Copy"] = function(tItem)
+ clipboard = {stringPath(), tItem.n}
+ cut = false
+ end,
+ ["Cut"] = function(tItem)
+ clipboard = {stringPath(), tItem.n}
+ cut = true
+ end,
+ ["Delete"] = function(tItem)
+ if dialogBox("Confirm","Delete "..tItem.id.." "..tItem.n,{"yes","no"}) == 1 then
+ if fs.isReadOnly(stringPath()..fSlash..tItem.n) then
+ dialogBox("ERROR",tItem.id.." Is read Only",{"ok"})
+ else
+ fs.delete(stringPath()..fSlash..tItem.n)
+ newList()
+ end
+ end
+ end,
+ ["Rename"] = function(tItem)
+ local sName = InputBox("New Name")
+ if type(sName) == "string" and sName ~= "" then
+ local s, m = pcall(function()
+ fs.move(stringPath()..fSlash..tItem.n,stringPath()..fSlash..sName)
+ end)
+ if not s then
+ dialogBox("Error", (m or "Rename failed"), {"ok"})
+ end
+ end
+ newList()
+ end
+ },
+ file = {
+ ["Run"] = {
+ ["Run"] = function(tItem)
+ osRunSpaces(stringPath()..fSlash..tItem.n)
+ end,
+ ["Run CMD"] = function(tItem)
+ local cmd = InputBox("Commands")
+ if cmd then
+ osRunSpaces(stringPath()..fSlash..tItem.n,unpack(fixArgs(cmd)))
+ end
+ end,
+ },
+ ["Open With"] = customLaunch,
+ ["Rename"] = function(tItem)
+ local sName = InputBox("New Name")
+ if type(sName) == "string" and sName ~= "" then
+ local s, m = pcall(function()
+ fs.move(stringPath()..fSlash..tItem.n,stringPath()..fSlash..sName)
+ end)
+ if not s then
+ dialogBox("Error", (m or "Rename failed"), {"ok"})
+ end
+ end
+ newList()
+ end,
+ ["Delete"] = function(tItem)
+ if dialogBox("Confirm","Delete "..tItem.id.." "..tItem.n,{"yes","no"}) == 1 then
+ if fs.isReadOnly(stringPath()..fSlash..tItem.n) then
+ dialogBox("ERROR",tItem.id.." Is read Only",{"ok"})
+ else
+ fs.delete(stringPath()..fSlash..tItem.n)
+ newList()
+ end
+ end
+ end,
+ ["Cut"] = function(tItem)
+ clipboard = {stringPath(), tItem.n}
+ cut = true
+ end,
+ ["Copy"] = function(tItem)
+ clipboard = {stringPath(), tItem.n}
+ cut = false
+ end
+ },
+ audio = {
+ ["Play"] = 1,
+ ["Eject"] = 1
+ },
+ back = {
+ },
+ blank = { -- tmenu.blank.Paste =
+ ["Paste"] = nil,
+ ["New File"] = function()
+ local name = InputBox()
+ if name then
+ if fs.exists(stringPath()..fSlash..name) then
+ dialogBox("ERROR","Name exists",{"ok"})
+ else
+ local file = fs.open(stringPath()..fSlash..name,"w")
+ if file then
+ file.write("")
+ file.close()
+ newList()
+ else
+ dialogBox("ERROR","File not created",{"ok"})
+ end
+ end
+ end
+ end,
+ ["New Folder"] = function()
+ local name = InputBox()
+ if name then
+ if fs.exists(stringPath()..fSlash..name) then
+ dialogBox("ERROR","Name exists",{"ok"})
+ else
+ if pcall(fs.makeDir,stringPath()..fSlash..name) then
+ newList()
+ else
+ dialogBox("ERROR","Access Denied",{"ok"})
+ end
+ end
+ end
+ end,
+ ["Preferences"] = preferences
+ },
+ }
+
+ -- end right click menu
+
+ local function scrollBar(posX,posY)
+ if posX == boxOffX+boxW+1 and posY > boxOffY and posY <= boxOffY+boxH then
+ if #tItemList > boxH then
+ if posY == boxOffY + 1 then
+ listOff = 0
+ elseif posY == boxOffY+boxH then
+ listOff = #tItemList + 1 - boxH
+ else
+ listOff = math.ceil((posY - boxOffY - 1 )*(((#tItemList - boxH+2)/boxH)))
+ end
+ flag = true
+ end
+ end
+ end
+
+ newList()
+
+ while bRun do
+ if flag then
+ flag = false
+ -- clear
+ if oldHight ~= hight and oldWidth ~= width then
+ term.setBackgroundColor(colors.black)
+ term.clear()
+ oldHight,oldWidth = hight,width
+ end
+ -- draw top title bar
+ local b = tbarW - #title -2
+ if b < 0 then
+ b = 0
+ end
+ printC(tbarX,tbarY,titleBar.txt,titleBar.back,string.sub(" "..title,1,tbarW)..string.rep(" ",b))
+ term.setTextColor(colors.white)
+ term.setBackgroundColor(colors.red)
+ term.write("X")
+
+ -- draw location bar
+ local a = barW - #sPath - 1
+ if a < 0 then
+ a = 0
+ end
+ local tmppath = sPath
+ if shell and shell.getDisplayName then
+ tmppath = shell.getDisplayName(sPath)
+ --dialogBox("yay")
+ else
+ --dialogBox("moop")
+ end
+ tmppath = tmppath or sPath
+ local a = barW - #tmppath - 1
+ if a < 0 then
+ a = 0
+ end
+ printC(barX,barY,addressBar.txt,addressBar.back,string.sub(" "..tmppath,1,barW)..string.rep(" ",a))
+
+ -- draw scroll bar
+ if #tItemList > boxH then
+ term.setBackgroundColor(scrollCol.back)
+ for i = 1,boxH do
+ term.setCursorPos(boxOffX+boxW+1,i + boxOffY)
+ local scroll = math.floor( boxH* (listOff/(#tItemList-boxH+2)) )+1
+ if i == scroll then
+ term.setBackgroundColor(scrollCol.button)
+ term.write(" ")
+ term.setBackgroundColor(scrollCol.back)
+ else
+ term.write(" ")
+ end
+ end
+ else
+ term.setBackgroundColor(scrollCol.off)
+ for i = 1,boxH do
+ term.setCursorPos(boxOffX+boxW+1,i + boxOffY)
+ term.write(" ")
+ end
+ end
+
+ -- draw main section
+
+ for i = 1,boxH do -- listOff
+ local sel = i+listOff
+ if tItemList[sel] then
+ printC(1+boxOffX,i+boxOffY,(tIcons[tItemList[sel].id].tCol or itemWindo.txt),(tIcons[tItemList[sel].id].bCol or itemWindo.back),( tIcons[tItemList[sel].id].txt or " "))
+ printC(4+boxOffX,i+boxOffY,itemWindo.txt,itemWindo.back,string.sub(" "..tItemList[sel].n..pading,1,boxW-3))
+ else
+ printC(1+boxOffX,i+boxOffY,itemWindo.txt,itemWindo.back,pading)
+ end
+ end
+
+ if bugTest then
+ printC(1,1,"black","white",listOff.." "..boxOffY.." "..boxH)
+ end
+
+ end
+
+ -- react to events
+ local event = {os.pullEvent()}
+
+ if event[1] == "mouse_click" then
+ if inBouwndry(event[3],event[4],boxOffX+1,boxOffY+1,boxW,boxH) then
+ local selected = tItemList[event[4]+listOff-boxOffY]
+ if selected and inBouwndry(event[3],event[4],boxOffX+1,event[4],#selected.n + 4,1) then
+ if event[2] == 1 then -- left mouse
+ if selected.id == "back" then
+ table.remove(path,#path)
+ newList()
+ elseif selected.id == "folder" or selected.id == "disk" then
+ table.insert(path,selected.n)
+ newList()
+ elseif selected.id == "file" then
+ if dialogBox("Run file ?",selected.n,{"yes","no"}) == 1 then
+ osRunSpaces(stringPath()..fSlash..selected.n)
+ end
+ flag = true
+ end
+ elseif event[2] == 2 then -- right mouse
+ rClickMenu("Options",tmenu[selected.id],selected,event[3],event[4])
+ flag = true
+ end
+ elseif event[2] == 2 then -- right clicking not on object
+ if clipboard then
+ tmenu.blank.Paste = paste
+ else
+ tmenu.blank.Paste = nil
+ end
+ rClickMenu("Options",tmenu["blank"],selected,event[3],event[4])
+ flag = true
+ end
+ elseif event[2] == 1 and event[3] == exitX and event[4] == exitY then
+ if dialogBox("Confirm","Exit application",{"yes","no"}) == 1 then
+ bRun = false
+ end
+ flag = true
+ elseif event[2] == 1 then
+ scrollBar(event[3],event[4])
+ end
+ elseif event[1] == "mouse_scroll" then -- flag this needs new math
+ local old = listOff
+ listOff = listOff + event[2]
+ if listOff < 0 then
+ listOff = 0
+ end
+ if #tItemList + 1 - boxH > 0 and listOff > #tItemList + 1 - boxH then
+ listOff = #tItemList + 1 - boxH
+ elseif listOff > 0 and #tItemList + 1 - boxH < 0 then
+ listOff = 0
+ end
+ if listOff ~= old then
+ flag = true
+ end
+
+ elseif event[1] == "mouse_drag" then -- scroll bar
+ scrollBar(event[3],event[4])
+ elseif event[1] == "disk" or event[1] == "disk_eject" then
+ newList()
+ elseif event[1] == "window_resize" then
+ termX,termY = term.getSize()
+ offsetX,offsetY = 1,1
+ hight,width = math.ceil(termY-2),math.ceil(termX-2)
+
+ boxOffX,boxOffY = offsetX,offsetY + 2
+ boxH,boxW = hight - 2 ,width - 2
+
+ barX,barY = offsetX + 1,offsetY + 2
+ barH,barW = 1,width - 1
+
+ tbarX,tbarY = offsetX + 1,offsetY + 1
+ tbarH,tbarW = 1,width - 1
+
+ exitX,exitY = offsetX + width - 1 ,offsetY + 1
+ pading = string.rep(" ",boxW)
+
+ flag = true
+ elseif event[1] == "redraw" then
+ flag = true
+ end
+ end
+end
+
+local function main()
+ if term.isColor() then
+ clear()
+ fileSelect()
+ clear()
+ else
+ error("Not an Advanced Computer (gold) ")
+ end
+end
+
+local trash = (norun or main()) \ No newline at end of file