2025-10-21 00:40:14 +02:00

3685 lines
87 KiB
Lua
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local assets = {
[ "bgwindow.lua" ] = {
id = 8,
content = "local sl = shapescape.getSlides()\
local win = sl[1].win\
\
local function draw()\
local w,h = term.getSize()\
for y=1,h do\
term.setCursorPos(1,y)\
term.blit(win.getLine(y))\
end\
end\
\
draw()\
\
while true do\
local e = {os.pullEvent()}\
draw()\
end",
name = "bgwindow.lua",
},
[ "cancel.lua" ] = {
id = 16,
content = "shapescape.exit()",
name = "cancel.lua",
},
[ "viewlist.lua" ] = {
id = 21,
content = "local e = {shapescape.getEvent()}\
local sl = shapescape.getSlides()\
local scolor = colors.lightGray\
if e[1] == \"mouse_click\" and lUtils.isInside(e[3],e[4],self) then\
self.ocolor = self.txtcolor\
self.txtcolor = scolor\
elseif e[1] == \"mouse_up\" then\
if self.txtcolor == scolor and lUtils.isInside(e[3],e[4],self) then\
sl.rMode = 1\
sl.config.modes[sl.folder] = nil\
sl.saveConfig()\
os.queueEvent(\"explorer_reload\")\
end\
if self.ocolor then\
self.txtcolor = self.ocolor\
self.ocolor = nil\
end\
end\
if sl.rMode == 1 then\
self.color = colors.lightGray\
else\
self.color = 0\
end",
name = "viewlist.lua",
},
[ "sidedragthingy.lua" ] = {
id = 4,
content = "local drag = false\
local s = shapescape.getSlide()\
local sl = shapescape.getSlides()\
while not sl.config do os.pullEvent() end\
s.sidebar.x2 = sl.config.sidebar.width\
self.x1 = s.sidebar.x2-1\
self.x2 = self.x1+2\
s.main.x1 = self.x2+1\
while true do\
local e = {os.pullEvent()}\
if e[1] == \"mouse_click\" and lUtils.isInside(e[3],e[4],self) then\
drag = true\
elseif e[1] == \"mouse_drag\" and drag then\
self.x1,self.x2 = e[3]-2,e[3]\
s.sidebar.x2 = self.x2-1\
s.main.x1 = self.x2+1\
elseif e[1] == \"mouse_up\" and drag then\
sl.config.sidebar.width = s.sidebar.x2\
sl.saveConfig()\
drag = false\
end\
end",
name = "sidedragthingy.lua",
},
[ "bottombar.lua" ] = {
id = 11,
content = "local sl = shapescape.getSlides()\
local str = {}\
if sl.files then\
if #sl.files == 1 then\
table.insert(str,\"1 item | \")\
else\
table.insert(str,#sl.files)\
table.insert(str,\" items | \")\
end\
end\
if sl.selected then\
local size = 0\
local count = 0\
for k,v in pairs(sl.selected) do\
if size and not v.isDir then\
size = size+v.size\
else\
size = nil\
end\
count = count+1\
end\
if count > 0 then\
if count == 1 then\
table.insert(str,\"1 item selected\")\
else\
table.insert(str,count)\
table.insert(str,\" items selected\")\
end\
if size then\
table.insert(str,string.format(\" %.1f kB\",math.floor(size/100+0.5)/10))\
end\
table.insert(str,\" | \")\
end\
end\
self.txt = table.concat(str)",
name = "bottombar.lua",
},
[ "hPrevious.lua" ] = {
id = 5,
content = "local sl = shapescape.getSlides()\
local e = {shapescape.getEvent()}\
if not sl.history then return end\
if e[1] == \"mouse_click\" and lUtils.isInside(e[3],e[4],self) and #sl.history > 1 then\
self.txtcolor = colors.blue\
elseif e[1] == \"mouse_up\" and #sl.history > 1 then\
self.txtcolor = colors.white\
if lUtils.isInside(e[3],e[4],self) then\
sl.folder = sl.history[#sl.history-1]\
table.insert(sl.rhistory,sl.history[#sl.history])\
sl.history[#sl.history] = nil\
sl.ofolder = sl.folder\
end\
elseif e[1] == \"mouse_move\" and #sl.history > 1 then\
if e[3] and e[4] and lUtils.isInside(e[3],e[4],self) then\
self.txtcolor = colors.lightBlue\
else\
self.txtcolor = colors.white\
end\
end\
if self.txtcolor ~= colors.blue and self.txtcolor ~= colors.lightBlue then\
if #sl.history <= 1 then\
self.txtcolor = colors.gray\
else\
self.txtcolor = colors.white\
end\
end",
name = "hPrevious.lua",
},
[ "searchrender.lua" ] = {
id = 3,
content = "local x,y = term.getCursorPos()\
term.setBackgroundColor(colors.black)\
term.setTextColor(colors.gray)\
lUtils.border(self.x1-1,self.y1-1,self.x2+1,self.y2+1,nil,2)\
if self.txt == \"\" then\
term.setCursorPos(self.x1,self.y1)\
term.setTextColor(colors.gray)\
term.write(\"Search...\")\
end\
term.setCursorPos(x,y)\
term.setTextColor(colors.white)",
name = "searchrender.lua",
},
[ "hList.lua" ] = {
id = 12,
content = "local sl = shapescape.getSlides()\
local s = shapescape.getSlide()\
local e = {shapescape.getEvent()}\
if not sl.history then return end\
if e[1] == \"mouse_click\" and lUtils.isInside(e[3],e[4],self) and (#sl.history > 1 or #sl.rhistory > 0) then\
self.txtcolor = colors.blue\
elseif e[1] == \"mouse_up\" and (#sl.history > 1 or #sl.rhistory > 0) then\
self.txtcolor = colors.white\
if lUtils.isInside(e[3],e[4],self) then\
--[[sl.folder = sl.history[#sl.history-1]\
table.insert(sl.rhistory,sl.history[#sl.history])\
sl.history[#sl.history] = nil\
sl.ofolder = sl.folder]]\
local opt = {}\
local function jump(obj)\
local to = obj.id\
sl.rhistory = {}\
sl.history = {}\
for t=1,#opt do\
if t < to then\
table.insert(sl.rhistory,opt[t].file)\
elseif t >= to then\
table.insert(sl.history,1,opt[t].file)\
end\
end\
sl.folder = obj.file\
sl.ofolder = obj.file\
end\
for i=1,#sl.rhistory do\
table.insert(opt,{txt=\" \"..sl.getName(sl.rhistory[i]),file=sl.rhistory[i],action=jump})\
end\
table.insert(opt,{txt=\"\\7 \"..sl.getName(sl.history[#sl.history]),file=sl.history[#sl.history],action=jump})\
for i=#sl.history-1,1,-1 do\
table.insert(opt,{txt=\" \"..sl.getName(sl.history[i]),file=sl.history[i],action=jump})\
end\
for i=1,#opt do\
opt[i].id = i\
end\
lOS.contextmenu(2,self.y2+2,0,opt,{fg=colors.white,bg=colors.gray,txt=colors.white,divider=colors.gray,selected=colors.lightGray},true)\
end\
elseif e[1] == \"mouse_move\" and (#sl.history > 1 or #sl.rhistory > 0) then\
if e[3] and e[4] and lUtils.isInside(e[3],e[4],self) then\
self.txtcolor = colors.lightBlue\
else\
self.txtcolor = colors.white\
end\
end\
if self.txtcolor ~= colors.blue and self.txtcolor ~= colors.lightBlue then\
if #sl.history <= 1 and #sl.rhistory <= 0 then\
self.txtcolor = colors.gray\
else\
self.txtcolor = colors.white\
end\
end",
name = "hList.lua",
},
[ "owtxt.lua" ] = {
id = 10,
content = "local sl = shapescape.getSlides()\
local file = sl.OWfile\
if file and file.type then\
self.txt = \"Always use this app for .\"..file.type..\" files\"\
end",
name = "owtxt.lua",
},
[ "viewicons.lua" ] = {
id = 22,
content = "local e = {shapescape.getEvent()}\
local sl = shapescape.getSlides()\
local scolor = colors.lightGray\
if e[1] == \"mouse_click\" and lUtils.isInside(e[3],e[4],self) then\
self.ocolor = self.txtcolor\
self.txtcolor = scolor\
elseif e[1] == \"mouse_up\" then\
if self.txtcolor == scolor and lUtils.isInside(e[3],e[4],self) then\
sl.rMode = 2\
sl.config.modes[sl.folder] = 2\
sl.saveConfig()\
os.queueEvent(\"explorer_reload\")\
end\
if self.ocolor then\
self.txtcolor = self.ocolor\
self.ocolor = nil\
end\
end\
if sl.rMode == 2 then\
self.color = colors.lightGray\
else\
self.color = 0\
end",
name = "viewicons.lua",
},
[ "select.lua" ] = {
id = 15,
content = "local sl = shapescape.getSlides()\
sl.fpathbox.state = true\
os.queueEvent(\"key\",keys.enter)",
name = "select.lua",
},
[ "dropdown.lua" ] = {
id = 13,
content = "self.txt = \"\"\
local sl = shapescape.getSlides()\
if sl.dropdown then\
lOS.contextmenu(unpack(sl.dropdown))\
sl.dropdown = nil\
end",
name = "dropdown.lua",
},
[ "owok.lua" ] = {
id = 19,
content = "local s = shapescape.getSlide()\
local sl = shapescape.getSlides()\
local e = {shapescape.getEvent()}\
if s.selected then\
if e[1] == \"mouse_click\" and lUtils.isInside(e[3],e[4],self) then\
self.isSel = true\
elseif e[1] == \"mouse_up\" then\
if lUtils.isInside(e[3],e[4],self) and self.isSel then\
self.isSel = false\
-- run the thang\
sl.OWprogram = s.selected\
fTypes = lUtils.asset.load(\"LevelOS/data/formats.lconf\")\
local t = sl.OWfile.type\
local p = sl.OWprogram.path\
if s.checkbox.isOn then\
local deskIcons = lUtils.asset.load(\"LevelOS/assets/Desktop_Icons.limg\")\
if not fTypes[t] then\
fTypes[t] = {name=t:upper()..\"-File\",program=p,contextMenu={{\"Open\"},{p}},openWith={p},icon=deskIcons[4]}\
else\
fTypes[t].program = p\
if fTypes[t].openWith and not sl.locateEntry(fTypes[t].openWith,p) then\
table.insert(fTypes[t].openWith,1,p)\
end\
end\
lUtils.asset.save(fTypes,\"LevelOS/data/formats.lconf\",false)\
sl.fullReload = true\
else\
if fTypes[t] and fTypes[t].openWith and not sl.locateEntry(fTypes[t].openWith,p) then\
table.insert(fTypes[t].openWith,p)\
lUtils.asset.save(fTypes,\"LevelOS/data/formats.lconf\",false)\
sl.fullReload = true\
end\
end\
s.reset = true\
sl.OWfile = nil\
shapescape.setSlide(1)\
end\
self.isSel = false\
end\
if self.isSel then\
self.color = colors.black\
else\
self.color = colors.gray\
end\
self.txtcolor = colors.white\
else\
self.color = colors.lightGray\
self.txtcolor = colors.gray\
end",
name = "owok.lua",
},
[ "folderUp.lua" ] = {
id = 7,
content = "local sl = shapescape.getSlides()\
local e = {shapescape.getEvent()}\
if not sl.folder then return end\
local cPath = sl.split_path(sl.folder)\
if e[1] == \"mouse_click\" and lUtils.isInside(e[3],e[4],self) and #cPath > 0 then\
self.txtcolor = colors.blue\
elseif e[1] == \"mouse_up\" and #cPath > 0 then\
self.txtcolor = colors.white\
if lUtils.isInside(e[3],e[4],self) then\
sl.folder = fs.getDir(sl.folder)\
end\
elseif e[1] == \"mouse_move\" and #cPath > 0 then\
if e[3] and e[4] and lUtils.isInside(e[3],e[4],self) then\
self.txtcolor = colors.lightBlue\
else\
self.txtcolor = colors.white\
end\
end\
if self.txtcolor ~= colors.blue and self.txtcolor ~= colors.lightBlue then\
if #cPath <= 0 then\
self.txtcolor = colors.gray\
else\
self.txtcolor = colors.white\
end\
end",
name = "folderUp.lua",
},
[ "filepathbox.lua" ] = {
id = 14,
content = "local sl = shapescape.getSlides()\
sl.fpathbox = self\
while true do\
local e = {os.pullEvent()}\
if e[1] == \"key\" and e[2] == keys.enter and self.state then\
local rtbl = {}\
if self.changed then\
if not self.txt:find('\"') then\
table.insert(rtbl,fs.combine(sl.folder,self.txt))\
else\
for pth in str:gmatch('\"([^\"]*)\"') do\
table.insert(rtbl,fs.combine(sl.folder,pth))\
end\
end\
else\
for k,v in pairs(sl.ret) do\
table.insert(rtbl,(k))\
end\
end\
shapescape.exit(rtbl)\
end\
end",
name = "filepathbox.lua",
},
[ "owlist.lua" ] = {
id = 17,
content = "local sl = shapescape.getSlides()\
local s = shapescape.getSlide()\
local programs = {}\
local porder = {}\
local dIcons = lUtils.asset.load(\"LevelOS/assets/Desktop_Icons.limg\")\
local function findPrograms(pth)\
local list = fs.list(pth)\
local foundProgram = false\
local folders = {}\
if pth ~= \"Program_Files\" and fs.exists(fs.combine(pth,\"main.lua\")) then\
foundProgram = true\
else\
for f=1,#list do\
local pr = fs.combine(pth,list[f])\
if fs.isDir(pr) then\
table.insert(folders,pr)\
elseif lUtils.getFileType(pr) == \".lua\" or lUtils.getFileType(pr) == \"\" then\
if pth ~= \"Program_Files\" then\
foundProgram = true\
break\
else\
local p = {path=pr,name=sl.getName(pr)}\
local ext = lUtils.getFileType(pr)\
p.name = p.name:sub(1,#p.name-#ext)\
p.icon = dIcons[3]\
programs[p.path] = p\
end\
end\
end\
end\
if foundProgram then\
local p = {path=pth,name=sl.getName(pth)}\
if fs.exists(fs.combine(pth,\"icon.limg\")) then\
p.icon = lUtils.asset.load(fs.combine(pth,\"icon.limg\"))[1]\
end\
programs[p.path] = p\
else\
for t=1,#folders do\
findPrograms(folders[t])\
end\
end\
end\
local scrollY\
local mSelect\
local selected\
local function generate()\
programs = {} -- add lua option with lua icon and stuff\
programs[\"Lua\"] = {name=\"Lua\",path=\"Lua\"}\
programs[\"rom/programs/edit.lua\"] = {name=\"Edit\",path=\"rom/programs/edit.lua\"} -- add icon here too wait i dont even have one so make one ig\
local p = {name=\"Paint\",path=\"rom/programs/fun/advanced/paint.lua\"}\
programs[p.path] = p\
programs[\"LevelOS/notepad.lua\"] = {name=\"Notepad\",path=\"LevelOS/notepad.lua\",icon={{\"\\159\\159 \",\" \",\"77 \"},{\"\\157\\141\\149\",\"888\",\"77 \"},{\"\\136\\140\\149\",\"778\",\"88 \"}}}\
findPrograms(\"Program_Files\")\
porder = {}\
for k,v in pairs(programs) do\
table.insert(porder,k)\
end\
table.sort(porder,function(a,b) return programs[a].name:lower() < programs[b].name:lower() end)\
scrollY = 0\
mSelect = nil\
selected = nil\
end\
local function render()\
-- idk\
term.setBackgroundColor(colors.white)\
term.clear()\
local y = 1-scrollY\
local w,h = term.getSize()\
for k,v in ipairs(porder) do\
local p = programs[v]\
if selected == p then\
term.setBackgroundColor(colors.gray)\
term.setTextColor(colors.white)\
elseif mSelect == p then\
term.setBackgroundColor(colors.lightGray)\
term.setTextColor(colors.black)\
else\
term.setBackgroundColor(colors.white)\
term.setTextColor(colors.black)\
end\
lOS.boxClear(1,y,w,y+2)\
if p.icon then\
lUtils.renderImg(p.icon,2,y)\
else\
lUtils.renderImg(dIcons[3],2,y)\
end\
term.setCursorPos(6,y+1)\
term.write(p.name)\
y = y+3\
end\
end\
generate()\
render()\
while true do\
local e = {os.pullEvent()}\
if s.reset and sl.OWfile then\
s.reset = false\
generate()\
end\
local w,h = term.getSize()\
if e[1] == \"mouse_move\" or e[1] == \"mouse_click\" then\
mSelect = nil\
end\
if e[1]:find(\"mouse\") and e[3] and e[4] and lUtils.isInside(e[3],e[4],{x1=1,y1=1,x2=w,y2=h}) then\
if e[1] == \"mouse_up\" then\
selected = nil\
end\
if e[1] == \"mouse_scroll\" then\
-- stuff\
if (e[2] == -1 and scrollY > 0) or (e[2] == 1 and scrollY < (#porder*3-h)) then\
scrollY = scrollY+e[2]\
end\
render()\
elseif e[1] == \"mouse_click\" or e[1] == \"mouse_move\" or e[1] == \"mouse_up\" then\
local y = math.ceil((e[4]+scrollY)/3)\
if porder[y] then\
local p = programs[porder[y]]\
if e[1] == \"mouse_up\" and mSelect == p then\
selected = p\
elseif e[1] == \"mouse_click\" or e[1] == \"mouse_move\" then\
mSelect = p\
end\
render()\
end\
end\
end\
if e[1] == \"mouse_up\" then\
mSelect = nil\
end\
s.selected = selected\
end",
name = "owlist.lua",
},
[ "owcheckbox.lua" ] = {
id = 18,
content = "local e = {shapescape.getEvent()}\
local s = shapescape.getSlide()\
s.checkbox = self\
if e[1] == \"mouse_click\" and lUtils.isInside(e[3],e[4],self) then\
self.isSel = true\
elseif e[1] == \"mouse_up\" then\
if lUtils.isInside(e[3],e[4],self) and self.isSel then\
self.isOn = not self.isOn\
end\
self.isSel = false\
end\
if self.isSel then\
self.color = colors.black\
elseif self.isOn then\
self.color = colors.green\
self.border.color = colors.gray\
else\
self.color = colors.white\
self.border.color = colors.lightGray\
end",
name = "owcheckbox.lua",
},
[ "openwithwhite.lua" ] = {
id = 9,
content = "local clickoutside = false\
local sl = shapescape.getSlides()\
local s = shapescape.getSlide()\
while true do\
local e = {os.pullEvent()}\
if e[1] == \"mouse_click\" then\
if lUtils.isInside(e[3],e[4],self) then\
clickoutside = false\
else\
clickoutside = true\
end\
elseif e[1] == \"mouse_up\" then\
if clickoutside and not lUtils.isInside(e[3],e[4],self) then\
clickoutside = false\
s.reset = true\
sl.OWfile = nil\
shapescape.setSlide(1)\
end\
end\
end",
name = "openwithwhite.lua",
},
[ "hNext.lua" ] = {
id = 6,
content = "local sl = shapescape.getSlides()\
local e = {shapescape.getEvent()}\
if not sl.history then return end\
if e[1] == \"mouse_click\" and lUtils.isInside(e[3],e[4],self) and #sl.rhistory > 0 then\
self.txtcolor = colors.blue\
elseif e[1] == \"mouse_up\" and #sl.rhistory > 0 then\
self.txtcolor = colors.white\
if lUtils.isInside(e[3],e[4],self) then\
sl.folder = sl.rhistory[#sl.rhistory]\
sl.rhistory[#sl.rhistory] = nil\
sl.ofolder = sl.folder\
table.insert(sl.history,sl.folder)\
end\
elseif e[1] == \"mouse_move\" and #sl.rhistory > 0 then\
if e[3] and e[4] and lUtils.isInside(e[3],e[4],self) then\
self.txtcolor = colors.lightBlue\
else\
self.txtcolor = colors.white\
end\
end\
if self.txtcolor ~= colors.blue and self.txtcolor ~= colors.lightBlue then\
if #sl.rhistory <= 0 then\
self.txtcolor = colors.gray\
else\
self.txtcolor = colors.white\
end\
end",
name = "hNext.lua",
},
[ "tree.lua" ] = {
id = 1,
content = "local sl = shapescape.getSlides()\
local s = shapescape.getSlide()\
s.sidebar = self\
local objs = {}\
local tree = {\"Quick access\",\"LevelCloud\",\"This PC\",\"Local disk\",path=\"\"}\
local function genTree(tEntry)\
local list = fs.list(tEntry.path)\
for i,f in ipairs(tEntry) do\
tEntry[i] = nil\
end\
for f=1,#list do\
if fs.isDir(fs.combine(tEntry.path,list[f])) then\
tEntry[#tEntry+1] = list[f]\
end\
end\
end\
tree[\"Quick access\"] = {\
path=\"Quick access\",\
nopath=true,\
open=true,\
}\
local function reloadQuickAccess()\
if not sl.config.quickaccess then sl.config.quickaccess = {} return end\
local l = sl.config.quickaccess\
for t=#tree[\"Quick access\"],1,-1 do\
tree[\"Quick access\"][\"Quick access/\"..tree[\"Quick access\"][t]] = nil\
table.remove(tree[\"Quick access\"],t)\
end\
for t=1,#l do\
local n = sl.getName(l[t])\
tree[\"Quick access\"][#tree[\"Quick access\"]+1] = n\
tree[\"Quick access\"][\"Quick access/\"..n] = {\
path = l[t],\
open = false,\
}\
end\
end\
reloadQuickAccess()\
sl.reloadQuickAccess = reloadQuickAccess\
--[[tree[\"Quick access\"][\"Quick access/LevelOS\"] = {\
path=\"User/Cloud/Public/LevelOS\",\
open=false,\
}]]\
if fs.exists(\"User/Cloud\") then\
tree[\"LevelCloud\"] = {\
path=\"User/Cloud\",\
open=false,\
auto=true,\
}\
end\
tree[\"This PC\"] = {\
path=\"User\",\
open=true,\
\"Desktop\",\
\"Documents\",\
\"Downloads\",\
\"Games\",\
\"Images\",\
\"Music\",\
\"Scripts\",\
}\
--[[for t=#tree[\"This PC\"]-2,1,-1 do\
if not fs.exists(fs.combine(tree[\"This PC\"].path,tree[\"This PC\"][t])) then\
table.remove(tree[\"This PC\"],t)\
end\
end]]\
tree[\"Local disk\"] = {\
path=\"\",\
open=false,\
auto=true,\
}\
for k=#sl.disks,1,-1 do\
local v = sl.disks[k]\
local dPath = v.getMountPath()\
local dName = sl.getName(dPath)\
tree[\"This PC\"][#tree[\"This PC\"]+1] = dName\
tree[\"This PC\"][\"User/\"..dName] = {path=dPath,open=false,auto=true}\
genTree(tree[\"This PC\"][\"User/\"..dName])\
end\
table.insert(tree,\"rom\")\
tree[\"rom\"] = {\
path=\"rom\",\
open=false,\
}\
if tree[\"LevelCloud\"] then\
genTree(tree[\"LevelCloud\"])\
end\
genTree(tree[\"Local disk\"])\
genTree(tree[\"rom\"])\
--local cList = fs.list(dir)\
local x,y = 0,1\
local symbols = {\
[\"Quick access\"] = {symbol=\"*\",color=colors.blue},\
[\"User/Cloud\"] = {symbol=\"\",color=colors.blue},\
[\"\"] = {symbol=\"\",color=colors.lightGray},\
[\"rom\"] = {symbol=\"\",color=colors.red},\
[\"User\"] = {symbol=\"\",color=colors.lightBlue},\
[\"User/Desktop\"] = {symbol=\"\",color=colors.lightBlue},\
[\"User/Documents\"] = {symbol=\"\",color=colors.lightGray},\
[\"User/Downloads\"] = {symbol=\"\",color=colors.blue},\
[\"User/Images\"] = {symbol=\"\",color=colors.lightBlue},\
[\"User/Scripts\"] = {symbol=\"\",color=colors.cyan},\
[\"User/Games\"] = {symbol=\"\",color=colors.lightGray},\
[\"User/Music\"] = {symbol=\"\",color=colors.blue},\
}\
sl.symbols = symbols\
local selected1\
local selected2\
local scrollY = 0\
local hadselected = false\
local function updateTree(tree)\
for i=#tree,1,-1 do\
local f = tree[i]\
local file = fs.combine(tree.path,f)\
if not fs.exists(file) then\
tree[file] = nil\
end\
tree[i] = nil\
end\
local ls = fs.list(tree.path)\
for f=1,#ls do\
local file = fs.combine(tree.path,ls[f])\
if fs.isDir(file) then\
tree[#tree+1] = ls[f]\
if tree[file] and tree.auto then\
updateTree(tree[file])\
end\
end\
end\
end\
local function updateFullTree()\
for k,v in ipairs(tree) do\
if tree[v] and tree[v].auto then\
updateTree(tree[v])\
end\
end\
end\
sl.updateFullTree = updateFullTree\
local function renderTree(tree)\
x = x+1\
for i,f in ipairs(tree) do\
local file = fs.combine(tree.path,f)\
if not tree[file] then\
if not fs.exists(file) then\
--error(\"No tree[\"..file..\"]!\")\
else\
tree[file] = {path=file,open=false,auto=true}\
genTree(tree[file])\
end\
end\
local t = tree[file]\
if t and (fs.exists(t.path) or t.nopath) then\
t.x,t.y = x,y\
objs[#objs+1] = t\
term.setCursorPos(x,y)\
local selected\
if sl.folder and not hadselected then\
selected = ((t.open and t.path == sl.folder) or (not t.open and string.find(sl.folder..\"/\",t.path..\"/\",nil,true) == 1))\
end\
if selected then\
term.setBackgroundColor(colors.gray)\
hadselected = true\
else\
term.setBackgroundColor(colors.black)\
end\
term.clearLine()\
term.setCursorPos(x,y)\
y = y+1\
if t.open then\
if selected2 == t then\
term.setTextColor(colors.blue)\
elseif selected then\
term.setTextColor(colors.white)\
else\
term.setTextColor(colors.lightGray)\
end\
term.write(\" \")\
elseif #t > 0 then\
if selected2 == t then\
term.setTextColor(colors.blue)\
elseif selected then\
term.setTextColor(colors.lightGray)\
else\
term.setTextColor(colors.gray)\
end\
term.write(\" \")\
else\
term.write(\" \")\
end\
if symbols[t.path] then\
term.setTextColor(symbols[t.path].color)\
term.write(symbols[t.path].symbol..\" \")\
elseif sl.disks[t.path] then\
term.setTextColor(colors.blue)\
term.write(\" \")\
else\
term.setTextColor(colors.yellow)\
term.write(\" \")\
end\
if selected1 == t then\
term.setTextColor(colors.lightGray)\
elseif fs.isReadOnly(t.path) then\
term.setTextColor(colors.lightGray)\
else\
term.setTextColor(colors.white)\
end\
term.write(sl.getName(t.path))\
if t.open then\
renderTree(t)\
end\
if x == 1 then\
y = y+1\
end\
end\
end\
x = x-1\
end\
local function render()\
objs = {}\
hadselected = false\
term.setBackgroundColor(colors.black)\
term.clear()\
x,y = 0,1+scrollY\
renderTree(tree)\
end\
render()\
local ofolder\
while true do\
local e = {os.pullEvent()}\
local w,h = term.getSize()\
if e[1] == \"mouse_scroll\" and lUtils.isInside(e[3]+self.x1-1,e[4]+self.y1-1,self) then\
if (e[2] == -1 and scrollY < 0) or (e[2] == 1 and y > h) then\
scrollY = scrollY-e[2]\
render()\
end\
elseif e[1]:find(\"mouse\") then\
if e[1] == \"mouse_move\" or e[1] == \"mouse_click\" or e[1] == \"mouse_up\" then selected1 = nil selected2 = nil end\
if e[3] and e[4] and lUtils.isInside(e[3]+self.x1-1,e[4]+self.y1-1,self) then\
for k,v in pairs(objs) do\
if e[4] == v.y then\
if e[3] == v.x and #v > 0 then\
if e[1] == \"mouse_move\" or e[1] == \"mouse_click\" then\
selected2 = v\
elseif e[1] == \"mouse_up\" then\
v.open = not v.open\
end\
else\
if e[1] == \"mouse_move\" or e[1] == \"mouse_click\" then\
selected1 = v\
elseif e[1] == \"mouse_up\" and not v.nopath then\
if e[2] == 1 then\
sl.folder = v.path\
os.queueEvent(\"explorer_change_folder\")\
elseif e[2] == 2 then\
sl.cMenu(v.path,e[3],e[4])\
end\
end\
end\
break\
end\
end\
end\
render()\
elseif ofolder ~= sl.folder then\
ofolder = sl.folder\
render()\
end\
end",
name = "tree.lua",
},
[ "mainscreen.lua" ] = {
id = 0,
content = "if not blittle then\
os.loadAPI(\"blittle\")\
end\
local sl = shapescape.getSlides()\
local s = shapescape.getSlide()\
local imgcache\
local nimgcache\
local shortcache\
s.main = self\
if not lOS.fCut then\
lOS.fCut = {}\
end\
if not lOS.fClipboard then\
lOS.fClipboard = {}\
end\
local tW,tH = lOS.wAll.getSize()\
if tW > 85+12 and tH > 33+12 and LevelOS and LevelOS.self and LevelOS.self.window then\
LevelOS.setWin(85,33)\
os.queueEvent(\"term_resize\")\
os.queueEvent(\"term_resize\")\
end\
local tArgs = {...}\
local cSlide = sl.cSlide\
if tArgs[2] then\
if tArgs[2] == \"SelFile\" and cSlide ~= 3 then\
sl.ret = {}\
shapescape.setSlide(3)\
elseif tArgs[2] == \"SelFolder\" and cSlide ~= 4 then\
sl.ret = {}\
shapescape.setSlide(4)\
elseif tArgs[2] == \"SelSave\" and cSlide ~= 5 then\
sl.ret = {}\
shapescape.setSlide(5)\
end\
end\
local deskIcons = lUtils.asset.load(\"LevelOS/assets/Desktop_Icons.limg\")\
\
local config\
if fs.exists(\"LevelOS/data/explorer.lconf\") then\
config = lUtils.asset.load(\"LevelOS/data/explorer.lconf\")\
end\
local function saveConfig()\
lUtils.asset.save(config,\"LevelOS/data/explorer.lconf\")\
end\
\
local fTypes = lUtils.asset.load(\"LevelOS/data/formats.lconf\")\
sl.saveConfig = saveConfig\
if not config then\
config = {\
_VERSION=\"1.0\",\
tabs = {\
{\"Name\",w=18,on=true},\
{\"Status\",w=8,on=false},\
{\"Type\",w=10,on=true},\
{\"Size\",w=9,on=true},\
{\"Date Modified\",w=16,on=true},\
{\"Date Created\",w=16,on=false},\
},\
modes = {[\"User/Cloud/Images\"]=2,[\"User/Images\"]=2},\
sidebar = {width=13}\
}\
saveConfig()\
end\
\
sl.config = config\
\
if tArgs[1] and fs.exists(tArgs[1]) then\
sl.folder = tArgs[1]\
else\
sl.folder = \"\"\
end\
\
local function uFP(filepath2) -- unique filepath\
if fs.exists(filepath2) == true then\
t = 1\
while fs.exists(string.sub(filepath2,1,string.len(filepath2)-string.len(lUtils.getFileType(filepath2)))..\"_(\"..t..\")\"..lUtils.getFileType(filepath2)) == true do\
t = t+1\
end\
filepath2 = string.sub(filepath2,1,string.len(filepath2)-string.len(lUtils.getFileType(filepath2)))..\"_(\"..t..\")\"..lUtils.getFileType(filepath2)\
end\
return filepath2\
end\
sl.uFP = uFP\
\
local disks = {peripheral.find(\"drive\",function(name,object) return object.hasData() end)}\
for t=1,#disks do\
disks[disks[t].getMountPath()] = disks[t]\
end\
sl.disks = disks\
\
local function getName(path)\
local isDisk = false\
if sl.disks[path] and sl.disks[path].getDiskLabel() then\
str = sl.disks[path].getDiskLabel()..\" (\"..string.gsub(path,\"_\",\" \")..\")\"\
isDisk = true\
elseif path == \"\" then\
str = \"Local disk\"\
else\
str = string.gsub(fs.getName(path),\"_\",\" \")\
if lUtils.getFileType(str) == \".llnk\" then\
str = str:sub(1,#str-5)\
end\
end\
return str,isDisk\
end\
sl.getName = getName\
\
local files -- includes all entries from fs.attributes\
local scrollY = 0\
\
function locateEntry(tTable,tEntry)\
if type(tTable) ~= \"table\" then\
error(\"Invalid input #1\",2)\
end\
for t=1,#tTable do\
if tTable[t] == tEntry then\
return true,t\
end\
end\
return false,0\
end\
sl.locateEntry = locateEntry\
\
local function openWith(file)\
-- open with GUI\
--[[term.setBackgroundColor(colors.white)\
local w,h = term.getSize()\
lOS.boxClear(]]\
sl.OWfile = file\
shapescape.setSlide(2)\
coroutine.yield()\
return sl.OWprogram\
end\
sl.openWith = openWith\
\
local function getIcon(path)\
if sl.symbols and sl.symbols[path] then\
--term.setTextColor(sl.symbols[file.path].color)\
--term.write(sl.symbols[file.path].symbol)\
return {sl.symbols[path].symbol,lUtils.toBlit(sl.symbols[path].color)}\
else\
if fs.isDir(path) then\
if sl.disks[path] then\
return {\"\",lUtils.toBlit(colors.blue)}\
else\
return {\"\",lUtils.toBlit(colors.yellow)}\
end\
else\
return {\"\",lUtils.toBlit(colors.white)}\
end\
--term.write(\"\")\
end\
end\
sl.getIcon = getIcon\
\
local NAME = {name=\"Name\",width=18}\
sl.NAME = NAME\
function NAME.render(file)\
local path = file.path\
if shortcache[file.path] then\
path = shortcache[file.path][1]\
end\
local isCut = locateEntry(lOS.fCut,file.path)\
if not isCut then\
if sl.symbols and sl.symbols[path] then\
term.setTextColor(sl.symbols[path].color)\
term.write(sl.symbols[path].symbol)\
else\
if fs.isDir(path) then\
if disks[path] then\
term.setTextColor(colors.blue)\
term.write(\"\")\
else\
term.setTextColor(colors.yellow)\
term.write(\"\")\
end\
else\
term.setTextColor(colors.white)\
term.write(\"\")\
end\
end\
if fs.isReadOnly(file.path) then\
term.setTextColor(colors.lightGray)\
else\
term.setTextColor(colors.white)\
end\
else\
term.setTextColor(colors.lightGray)\
term.write(\" \")\
end\
local str = \" \"..sl.getName(file.path)\
if #str >= NAME.width-1 then\
str = str:sub(1,NAME.width-4)..\"..\"\
end\
local x,y = term.getCursorPos()\
term.write(str)\
if sl.search then\
local b,e = sl.getName(file.path):lower():find(sl.search:lower(),nil,true)\
if b < NAME.width-2 then\
if e >= NAME.width-2 then\
e = NAME.width-3\
end\
local nx,ny = term.getCursorPos()\
local bg = term.getBackgroundColor()\
term.setCursorPos(x+b,y)\
term.setBackgroundColor(colors.orange)\
term.write(str:sub(b+1,e+1))\
term.setBackgroundColor(bg)\
term.setCursorPos(nx,ny)\
end\
end\
term.setTextColor(colors.white)\
end\
\
local TYPE = {name=\"Type\",width=10}\
function TYPE.func(file)\
if fs.isDir(file.path) then\
if disks[file.path] then\
return \"Disk\"\
else\
return \"Folder\"\
end\
elseif fTypes[file.type] then\
return fTypes[file.type].name\
else\
return file.type:upper()..\"-file\"\
end\
end\
\
local SIZE = {name=\"Size\",width=9}\
function SIZE.func(file)\
if not fs.isDir(file.path) then\
return string.format(\"%.1f kB\",math.floor(file.size/100+0.5)/10)\
else\
return \"\"\
end\
end\
\
local MODIFIED = {name=\"Date Modified\",width=16}\
function MODIFIED.func(file)\
if not file.modification then return \"\" end\
local t = file.modification\
return os.date(\"%d-%m-%y %H:%M\",t/1000)\
end\
\
local CREATED = {name=\"Date Created\",width=16}\
function CREATED.func(file)\
if not file.created then return \"\" end\
local t = file.created\
return os.date(\"%d-%m-%y %H:%M\",t/1000)\
end\
\
local STATUS = {name=\"Status\",width=8}\
function STATUS.render(file)\
-- nothing yet, cloud doesn't support this yet\
-- IF timestamp of file is HIGHER than cloud reported timestamp, file is NOT SYNCED YET\
-- IF timestamp of file is LOWER than cloud reported timestamp or file only exists in CLOUD TABLE, file is AVAILABLE ONLINE\
-- IF timestamp of file is EQUAL to cloud reported timestamp, file is AVAILABLE COMPLETELY\
if lOS.cloud.lastSync and lOS.cloud.files[file.path] then\
if lOS.cloud.conflicts[file.path] then\
term.setTextColor(colors.red)\
term.write(\"×\")\
elseif file.modification > lOS.cloud.lastSync then\
term.setTextColor(colors.blue)\
term.write(\"\\24\")\
else\
term.setTextColor(colors.lime)\
term.write(\"\\7\")\
end\
end\
term.setTextColor(colors.white)\
end\
local tabRef = {}\
local aTabs = {NAME,TYPE,SIZE,MODIFIED,CREATED,STATUS}\
for k,v in ipairs(config.tabs) do\
for i,t in pairs(aTabs) do\
if v[1] == t.name then\
t.id = k\
t.width = v.w\
tabRef[k] = t\
table.remove(aTabs,i)\
break\
end\
end\
end\
aTabs = nil\
local tabs = {NAME,TYPE,SIZE,MODIFIED}\
sl.rMode = 1\
local selected = {}\
sl.selected = selected\
local mSelected = nil\
local renamebox\
local function render()\
shortcache = lOS.explorer.shortcache\
imgcache = lOS.explorer.imgcache\
nimgcache = lOS.explorer.nimgcache\
local oterm = term.current()\
if oterm ~= self.window then\
term.redirect(self.window)\
end\
if not files then return end\
local w,h = term.getSize()\
if sl.rMode == 1 then\
while #files+scrollY <= h-3 and scrollY < 0 do\
scrollY = scrollY+1\
end\
term.setBackgroundColor(colors.black)\
term.clear()\
tabs[1].x = 2\
term.setBackgroundColor(colors.black)\
term.setTextColor(colors.lightGray)\
for i=1,#tabs do\
term.setCursorPos(tabs[i].x,1)\
term.write(tabs[i].name..string.rep(\" \",tabs[i].width-#tabs[i].name-1)..\"\\149\")\
if tabs[i+1] then\
tabs[i+1].x = tabs[i].x+tabs[i].width\
end\
end\
term.setTextColor(colors.white)\
for i=1,math.min(#files+scrollY,h-2) do\
local file = files[i-scrollY]\
file.x1 = tabs[1].x\
file.y1 = i+1+1\
file.y2 = file.y1\
file.x2 = tabs[#tabs].x+tabs[#tabs].width-1\
local fc = fs.combine\
local rPath = file.path\
local isShort = false\
if shortcache[file.path] then\
isShort = true\
rPath = shortcache[file.path][1]\
elseif file.type == \"llnk\" then\
local info = lUtils.asset.load(file.path)\
if info and type(info[1]) == \"string\" then\
isShort = true\
rPath = info[1] -- if linked to folder, assume user wants to go to folder, if linked to main.lua it links to program (do context menu shizz)\
imgcache[file.path] = info.icon\
shortcache[file.path] = info\
end\
end\
if selected[file.path] then\
term.setBackgroundColor(colors.gray)\
term.setCursorPos(file.x1,file.y1)\
term.write(string.rep(\" \",file.x2-(file.x1-1)))\
elseif mSelected and lUtils.isInside(mSelected[1],mSelected[2],file) then\
term.setBackgroundColor(colors.pink)\
term.setCursorPos(file.x1,file.y1)\
term.write(string.rep(\" \",file.x2-(file.x1-1)))\
end\
for t=1,#tabs do\
term.setCursorPos(tabs[t].x,i+1+1)\
if tabs[t].render then\
tabs[t].render(file)\
elseif tabs[t].func then\
local str = tabs[t].func(file)\
if str and #str >= tabs[t].width then\
str = str:sub(1,tabs[t].width-3)..\"..\"\
end\
term.write(tostring(str))\
end\
end\
if renamebox and sl.renaming == file.path then\
renamebox.render()\
end\
term.setBackgroundColor(colors.black)\
end\
elseif sl.rMode == 2 then\
term.setBackgroundColor(colors.black)\
term.clear()\
local fx,fy = 2,1+scrollY\
local fw,fh = 7,5\
for i=1,#files do\
local file = files[i]\
if selected[file.path] then\
term.setBackgroundColor(colors.gray)\
elseif mSelected and file.x1 and lUtils.isInside(mSelected[1],mSelected[2],file) then\
term.setBackgroundColor(colors.pink)\
else\
term.setBackgroundColor(colors.black)\
end\
lineH = lOS.explorer.drawIcon(file.path,fx,fy,false,false,4,{\"\\24\",\"3\",\"0\"})-4\
fh = math.max(lineH+4,fh)\
file.x1,file.y1 = fx,fy\
file.x2,file.y2 = fx+7-1,fy+5-1+lineH-1\
fx = fx+fw+1\
if fx+fw > w then\
fx = 2\
fy = fy+fh\
fh = 5\
end\
end\
end\
if oterm ~= self.window then\
term.redirect(oterm)\
end\
end\
\
local function genFile(f)\
local file = {path=f,name=fs.getName(f),type=lUtils.getFileType(f):sub(2),readOnly=fs.isReadOnly(f),isDir=fs.isDir(f)}\
if not ((file.isDir and file.readOnly) or sl.disks[file.path]) then\
local a = fs.attributes(f)\
for k,v in pairs(a) do\
file[k] = v\
end\
end\
return file\
end\
sl.genFile = genFile\
\
local function updateFiles()\
while not fs.exists(sl.folder) do\
sl.folder = fs.getDir(sl.folder)\
end\
local inCloud = sl.folder:find(\"User/Cloud\",nil,true) == 1\
tabs = {}\
for t=1,#tabRef do\
if (tabRef[t] == STATUS and inCloud) or config.tabs[tabRef[t].id].on then\
table.insert(tabs,tabRef[t])\
end\
end\
if config.modes[sl.folder] then\
sl.rMode = config.modes[sl.folder]\
else\
sl.rMode = 1\
end\
if LevelOS.self and LevelOS.self.window then\
if sl.search then\
LevelOS.setTitle(sl.search..\" - Search Results in \"..sl.getName(sl.folder))\
LevelOS.self.window.icon = {\"\",lUtils.toBlit(colors.lightBlue)}\
else\
LevelOS.setTitle(sl.getName(sl.folder))\
LevelOS.self.window.icon = sl.getIcon(sl.folder)\
end\
end\
local fi = fs.list(sl.folder)\
table.sort(fi,function(a,b) return a:lower() < b:lower() end)\
local folders = {}\
local nonfolders = {}\
for t=1,#fi do\
local f = fs.combine(sl.folder,fi[t])\
local file = genFile(f)\
if not (sl.search and not file.name:lower():find(sl.search:lower(),nil,true)) then\
if file.isDir then\
table.insert(folders,file)\
else\
table.insert(nonfolders,file)\
end\
end\
end\
files = folders\
for k,v in ipairs(nonfolders) do\
table.insert(files,v)\
end\
sl.files = files\
sl.updateFullTree()\
end\
while not sl.symbols do\
os.sleep(0.1)\
end\
updateFiles()\
render()\
sl.ofolder = sl.folder\
local ofolder = sl.folder\
sl.history = {sl.folder}\
sl.rhistory = {}\
local mousemove = false\
local tID = os.startTimer(10)\
local timerTimeout = os.epoch(\"utc\")+15000\
local function count(tbl)\
local c = 0\
for k,v in pairs(tbl) do\
c = c+1\
end\
return c\
end\
local contextcache = {}\
--[[if not fs.isDir(file) and b[2] == 1 and fTypes[f.type] and fTypes[f.type].c then\
local found,num = locateEntry(fTypes[f.type].c[1],b[3])\
local p = fTypes[f.type].c[2][num]\
if p == \"Lua\" then\
lOS.execute(f.path)\
else\
lOS.execute(p..\" \"..f.path)\
end\
elseif b[3] == \"Open\" and fs.isDir(file) then\
selected = {}\
sl.folder = f.path\
updateFiles()\
scrollY = 0\
elseif b[3] == \"Delete\" then\
for k,v in pairs(selected) do\
fs.delete(k)\
end\
selected = {}\
updateFiles()\
scrollY = 0\
end]]\
local function cMenu(f, x, y)\
local options = lOS.explorer.genContextMenu(f,s,sl,selected,updateFiles,render,LevelOS,false)\
local output = {lOS.contextmenu(x,y,30,options,nil,true)}\
renamebox = sl.renamebox\
return unpack(output)\
end\
sl.cMenu = cMenu\
local function updateReturn()\
local tbl = {}\
for k,v in pairs(sl.ret) do\
if not selected[k] then\
sl.ret[k] = nil\
else\
table.insert(tbl,k)\
end\
end\
if #tbl > 1 then\
sl.fpathbox.txt = \"\"\
for t=1,#tbl do\
sl.fpathbox.txt = sl.fpathbox.txt..'\"'..fs.getName(tbl[t])..'\" '\
end\
sl.fpathbox.changed = false\
elseif #tbl == 1 then\
sl.fpathbox.txt = fs.getName(tbl[1])\
sl.fpathbox.changed = false\
else\
sl.fpathbox.changed = true\
end\
end\
\
local function fPaste(obj)\
local tFolder = sl.folder\
for c=1,#lOS.fClipboard do\
if fs.exists(lOS.fClipboard[c]) == true then\
fs.copy(lOS.fClipboard[c],uFP(fs.combine(tFolder,fs.getName(lOS.fClipboard[c]))))\
end\
if locateEntry(lOS.fCut,lOS.fClipboard[c]) == true then\
fs.delete(lOS.fClipboard[c])\
table.remove(lOS.fCut,({locateEntry(lOS.fCut,lOS.fClipboard[c])})[2])\
end\
end\
lOS.fClipboard = {}\
lOS.fCut = {}\
updateFiles()\
end\
\
local function fRename(obj)\
lOS.explorer.fRename(obj,s,sl,render,LevelOS)\
renamebox = sl.renamebox\
end\
\
local function fOpenWith(obj)\
if LevelOS and LevelOS.self and LevelOS.self.window then\
LevelOS.self.window.events = nil\
end\
LevelOS.overlay = nil\
lOS.noEvents = false\
local p = sl.openWith(obj.file)\
if p then\
p = p.path\
local f = obj.file\
if p == \"Lua\" then\
lOS.execute(f.path)\
else\
lOS.execute(p..\" \"..f.path)\
end\
end\
end\
\
local function fNew(obj)\
local pth = uFP(fs.combine(sl.folder,\"New_\"..obj.txt:gsub(\" \",\"_\")..\".\"..obj.format))\
lUtils.fwrite(pth,obj.preset)\
term.redirect(self.window)\
updateFiles()\
render()\
fRename(pth)\
-- rename\
end\
\
local function fNewFolder(obj)\
local pth = uFP(fs.combine(sl.folder,\"New_Folder\"))\
fs.makeDir(pth)\
term.redirect(self.window)\
updateFiles()\
render()\
fRename(pth)\
-- rename\
end\
\
local dragmenu\
while true do\
local w,h = term.getSize()\
local sObj = {x1=1,y1=1,x2=w,y2=h}\
local e = {os.pullEvent()}\
if sl.fullReload then\
os.queueEvent(\"explorer_full_reload\")\
sl.fullReload = false\
elseif sl.reload then\
os.queueEvent(\"explorer_reload\")\
sl.reload = false\
end\
if e[1] == \"explorer_full_reload\" then\
term.setBackgroundColor(colors.black)\
term.clear()\
fTypes = lUtils.asset.load(\"LevelOS/data/formats.lconf\")\
contextcache = {}\
imgcache = {}\
nimgcache = {}\
shortcache = {}\
updateFiles()\
os.sleep(0.2)\
render()\
end\
if dragmenu and (e[1] == \"mouse_drag\" or e[1] == \"mouse_up\") then\
--dragmenu.x = e[3]-dragmenu.width+1\
dragmenu.width = e[3]-dragmenu.x+1\
if e[1] == \"mouse_up\" then\
config.tabs[dragmenu.id].w = dragmenu.width\
saveConfig()\
dragmenu = nil\
end\
render()\
elseif renamebox then\
if e[1] == \"char\" and e[2] == \" \" then\
e[2] = \"_\"\
end\
if e[1] == \"key\" and e[2] == keys.enter then\
renamebox.state = false\
--sl.renaming = nil\
else\
renamebox.update(unpack(e))\
if sl.rMode == 1 then\
renamebox.x2 = math.min(math.max(NAME.width,#renamebox.txt+5),w)\
end\
render()\
renamebox.render()\
end\
if not renamebox.state then\
local pth = fs.combine(sl.ofolder,renamebox.txt)\
if renamebox.isShortcut then\
pth = pth..\".llnk\"\
end\
if pth == sl.renaming or fs.combine(pth,\"\") == sl.ofolder then\
-- nothing\
elseif fs.exists(pth) then\
local newPth = uFP(pth)\
local r = {lUtils.popup(\"Rename File\",\"Do you want to rename \\\"\"..fs.getName(sl.renaming):gsub(\"_\",\" \")..\"\\\" to \\\"\"..fs.getName(newPth):gsub(\"_\",\" \")..\"\\\"?\\n\\nThere is already a file with the same name in this location.\",41,11,{\"Yes\",\"No\"})}\
if r[1] and r[3] == \"Yes\" then\
fs.move(sl.renaming,newPth)\
end\
else\
fs.move(sl.renaming,pth)\
end\
renamebox = nil\
sl.renamebox = nil\
sl.renaming = nil\
term.setCursorBlink(false)\
s.win.setPaletteColor(colors.pink,unpack(sl.opink))\
updateFiles()\
render()\
end\
else\
if e[1] == \"mouse_move\" or e[1] == \"mouse_up\" or e[1] == \"mouse_click\" then\
mSelected = nil\
end\
if sl.ofolder ~= sl.folder then\
scrollY = 0\
sl.ofolder = sl.folder\
ofolder = sl.folder\
table.insert(sl.history,sl.folder)\
sl.rhistory = {}\
sl.search = nil\
updateFiles()\
render()\
elseif ofolder ~= sl.folder then\
ofolder = sl.folder\
sl.search = nil\
updateFiles()\
render()\
elseif (e[1] == \"timer\" and tID == e[2]) or os.epoch(\"utc\") > timerTimeout then\
if not (e[1] == \"timer\" and tID == e[2]) then\
_G.expLog = \"Timer timed out at \"..os.date()\
end\
updateFiles()\
render()\
tID = os.startTimer(4)\
timerTimeout = os.epoch(\"utc\")+15000\
end\
if e[1] == \"mouse_scroll\" and lUtils.isInside(e[3],e[4],sObj) then\
if sl.rMode == 1 and ((e[2] > 0 and #files+scrollY > h-2) or (e[2] < 0 and scrollY < 0)) then\
scrollY = scrollY-e[2]\
elseif sl.rMode == 2 and ((e[2] > 0 and files[#files].y2+1 > h) or (e[2] < 0 and scrollY < 0)) then\
scrollY = scrollY-e[2]\
end\
render()\
elseif (e[1] == \"mouse_click\" or e[1] == \"mouse_up\" or e[1] == \"mouse_move\" or e[1] == \"mouse_drag\") and e[3] and e[4] and lUtils.isInside(e[3],e[4],sObj) then\
if e[1] == \"mouse_move\" then\
if not mousemove then\
shapescape.getSlide().win.setPaletteColor(colors.pink,0.15,0.15,0.15)\
mousemove = true\
end\
mSelected = {e[3],e[4]}\
render()\
elseif not (sl.rMode == 1 and e[4] <= 1) then\
local clickedfile = false\
if not (sl.rMode == 1 and e[4] == 2) then\
for i,f in ipairs(files) do\
if f.x1 and lUtils.isInside(e[3],e[4],f) then\
clickedfile = true\
if e[1] == \"mouse_drag\" and e[2] == 2 then\
selected[f.path] = f\
if sl.ret then\
if (f.isDir and tArgs[2] == \"SelFolder\") or (tArgs[2] == \"SelFile\" and not f.isDir) then\
sl.ret[f.path] = f\
updateReturn()\
end\
end\
elseif e[1] == \"mouse_click\" then\
if e[2] == 1 then\
if lUtils.isHolding(keys.leftShift) then\
local startSel = math.huge\
local endSel = -1\
for i1,f1 in ipairs(files) do\
if selected[f1.path] then\
if i1 < startSel then\
startSel = i1\
end\
if i1 > endSel then\
endSel = i1\
end\
end\
end\
if i > startSel and i > endSel then\
if startSel < 0 then\
startSel = i\
end\
endSel = i\
elseif i >= startSel and i < endSel then\
if startSel < 0 then\
startSel = i\
end\
endSel = i\
elseif i < startSel then\
startSel,endSel = i,startSel\
end\
selected = {}\
for i1=startSel,endSel do\
selected[files[i1].path] = files[i1]\
if (files[i1].isDir and tArgs[2] == \"SelFolder\") or (tArgs[2] == \"SelFile\" and not files[i1].isDir) then\
sl.ret[files[i1].path] = files[i1]\
updateReturn()\
end\
end\
elseif lUtils.isHolding(keys.leftCtrl) then\
if selected[f.path] then\
selected[f.path] = nil\
if sl.ret then\
if count(sl.ret) > 1 then\
sl.ret[f.path] = nil\
updateReturn()\
end\
end\
else\
selected[f.path] = f\
if (f.isDir and tArgs[2] == \"SelFolder\") or (tArgs[2] == \"SelFile\" and not f.isDir) then\
sl.ret[f.path] = f\
updateReturn()\
end\
end\
elseif selected[f.path] and count(selected) == 1 and selected[f.path].lastClick and selected[f.path].lastClick > os.epoch(\"utc\")-1000 then\
local nf = f\
local cmd = nf.path\
local invalidShort = false\
if shortcache[f.path] then\
local rPath = shortcache[f.path][1]\
f.sPath = rPath\
f.sName = fs.getName(rPath)\
if not fs.exists(rPath) then\
invalidShort = true\
else\
nf = genFile(shortcache[f.path][1])\
end\
local args = shortcache[f.path].args\
if args and #args > 0 then\
cmd = cmd..\" \"..table.concat(args, \" \")\
end\
end\
if invalidShort then\
lOS.explorer.fInvShort({file=f},updateFiles,render)\
else\
if nf.isDir then\
selected = {}\
sl.folder = nf.path\
updateFiles()\
scrollY = 0\
break\
elseif (tArgs[2] == \"SelFile\") then\
sl.ret = {[f.path]=f}\
updateReturn()\
shapescape.exit({f.path})\
elseif shortcache[f.path] and shortcache[f.path].program then -- if needs to be executed with special program\
local p = shortcache[f.path].program\
if p == \"Lua\" then\
lOS.execute(cmd)\
else\
lOS.execute(p..\" \"..cmd)\
end\
elseif fTypes[nf.type] and fTypes[nf.type].program then\
local p = fTypes[nf.type].program\
if p == \"Lua\" then\
lOS.execute(f.path)\
else\
lOS.execute(p..\" \"..nf.path)\
end\
elseif nf.type == \"\" then\
lOS.execute(f.path)\
else\
fOpenWith({file=nf})\
-- open with prompt\
end\
end\
else\
selected = {[f.path]=f}\
if (f.isDir and tArgs[2] == \"SelFolder\") or (tArgs[2] == \"SelFile\" and not f.isDir) then\
sl.ret = {[f.path] = f}\
updateReturn()\
end\
f.lastClick = os.epoch(\"utc\")\
end\
elseif e[2] == 2 then\
if count(selected) > 0 and not selected[f.path] then\
selected = {[f.path]=f}\
if (f.isDir and tArgs[2] == \"SelFolder\") or (tArgs[2] == \"SelFile\" and not f.isDir) then\
sl.ret = {[f.path] = f}\
updateReturn()\
end\
end\
end\
elseif e[1] == \"mouse_up\" then\
if e[2] == 2 then\
if count(selected) > 0 then\
cMenu(f,e[3],e[4])\
else\
clickedfile = false\
end\
end\
end\
break\
end\
end\
end\
if not clickedfile then\
selected = {}\
if e[1] == \"mouse_up\" and e[2] == 2 then\
cMenu(nil, e[3], e[4])\
end\
end\
render()\
elseif sl.rMode == 1 and e[4] == 1 then\
if e[1] == \"mouse_click\" and e[2] == 1 then\
for k,v in ipairs(tabs) do\
if e[3] == v.x+v.width-1 then\
dragmenu = v\
end\
end\
elseif e[1] == \"mouse_up\" and e[2] == 2 then\
local opt = {}\
for t=1,#config.tabs do\
local o = {}\
if config.tabs[t].on then\
o.txt = {\" \\7 \"..config.tabs[t][1],\"\",\"888\"}\
else\
o.txt = \" \"..config.tabs[t][1]\
end\
o.action = function() config.tabs[t].on = not config.tabs[t].on saveConfig() sl.reload = true os.queueEvent(\"explorer_reload\") os.queueEvent(\"explorer_reload\") end\
table.insert(opt,o)\
end\
lOS.contextmenu(e[3],e[4],20,opt)\
end\
end\
elseif e[1] == \"term_resize\" or e[1] == \"explorer_reload\" then\
updateFiles()\
render()\
saveConfig()\
end\
end\
sl.selected = selected\
end",
name = "mainscreen.lua",
},
[ "topbar.lua" ] = {
id = 2,
content = "local sl = shapescape.getSlides()\
local function split(str, pat)\
local t = {} -- NOTE: use {n = 0} in Lua-5.0\
local fpat = \"(.-)\" .. pat\
local last_end = 1\
local s, e, cap = str:find(fpat, 1)\
while s do\
if s ~= 1 or cap ~= \"\" then\
table.insert(t,cap)\
end\
last_end = e+1\
s, e, cap = str:find(fpat, last_end)\
end\
if last_end <= #str then\
cap = str:sub(last_end)\
table.insert(t, cap)\
end\
return t\
end\
local function split_path(str)\
return split(str,'[\\\\/]+')\
end\
sl.split_path = split_path\
local robjs = {}\
local function render()\
local w,h = term.getSize()\
term.setBackgroundColor(colors.black)\
term.setTextColor(colors.gray)\
lUtils.border(1,1,w,h,\"fill\",2)\
robjs = {w=1}\
local olist = {}\
local cPath = split_path(sl.folder)\
table.insert(cPath,1,\"\")\
local isDisk\
local isRom\
local ico = sl.getIcon(sl.folder)\
if sl.search then\
local str = \"Search Results in \"..sl.getName(sl.folder)\
if robjs.w+#str+3 > w-2 then\
robjs[1] = {\" \\171 \"}\
else\
table.insert(robjs,{\" > \"})\
table.insert(robjs,{str})\
robjs.w = robjs.w+#str+3\
ico = {\"\",lUtils.toBlit(colors.lightBlue)}\
end\
else\
for i=#cPath,1,-1 do\
local str\
if i == 2 and sl.disks[cPath[2]] and sl.disks[cPath[i]].getDiskLabel() then\
str = string.gsub(cPath[2],\"_\",\" \")..\" (\"..sl.disks[cPath[2]].getDiskLabel()..\")\"\
isDisk = true\
elseif i == 1 then\
str = \"Local disk\"\
else\
str = string.gsub(cPath[i],\"_\",\" \")\
end\
if i == 2 and str == \"rom\" then\
isRom = true\
end\
if robjs.w+#str+3 > w-2 then\
for t=1,i do\
olist[t] = cPath[t]\
end\
if olist[2] and (sl.disks[olist[2]] or olist[2] == \"rom\") then\
table.remove(olist,1)\
end\
robjs[1] = {\" \\171 \",list=olist}\
break\
else\
table.insert(robjs,1,{str,path=fs.combine(table.unpack(cPath,1,i))})\
table.insert(robjs,1,{\" > \"})\
robjs.w = robjs.w+#str+3\
end\
if isDisk or isRom then\
break\
end\
end\
end\
term.setCursorPos(2,2)\
term.blit(ico[1],ico[2],lUtils.toBlit(term.getBackgroundColor()))\
robjs[1].x = 3\
term.setTextColor(colors.lightGray)\
term.write(robjs[1][1])\
\
for i=2,#robjs do\
robjs[i].x = robjs[i-1].x+#robjs[i-1][1]\
if robjs[i][1] == \" > \" then\
term.setTextColor(colors.lightGray)\
else\
term.setTextColor(colors.white)\
end\
term.write(robjs[i][1])\
end\
end\
\
render()\
os.sleep(0.5)\
render()\
local ofolder = sl.folder\
local function gotofolder(obj)\
sl.folder = obj.path\
os.queueEvent(\"explorer_update\")\
os.queueEvent(\"explorer_update\")\
end\
local getIcon = sl.getIcon\
local ow,oh = term.getSize()\
local osearch = sl.search\
while true do\
local e = {os.pullEvent()}\
local w,h = term.getSize()\
if e[1] == \"term_resize\" or ofolder ~= sl.folder or ow ~= w or oh ~= h or osearch ~= sl.search then\
ow,oh = w,h\
ofolder = sl.folder\
osearch = sl.search\
render()\
elseif e[1]:find(\"mouse\") and e[3] and e[4] and e[4] == 2 and e[3] > 1 and e[3] < w then\
render()\
local cObj = false\
for k,v in ipairs(robjs) do\
if e[3] >= v.x and e[3] <= v.x+(#v[1]-1) then\
cObj = true\
local int = 1\
local a = v\
if a[1] == \" > \" and k > 1 then\
int = 2\
a = robjs[k-1]\
k = k-1\
end\
if e[1] == \"mouse_click\" then\
term.setBackgroundColor(colors.gray)\
term.setCursorPos(a.x,2)\
term.setTextColor(colors.white)\
term.write(a[1])\
if robjs[k+1] and k > 1 then\
term.setTextColor(colors.lightGray)\
term.write(\" > \")\
end\
elseif e[1] == \"mouse_up\" then\
if k == 1 and a.list then\
-- idk\
if a.list then\
--sl.dropdown = {self.x1+a.x-3,self.y2,0,a.list}\
local opt = {}\
for f=#a.list,1,-1 do\
local pth = fs.combine(unpack(a.list,1,f))\
local ico = getIcon(pth)\
table.insert(opt,{txt={ico[1]..\" \"..sl.getName(a.list[f]),ico[2]},path=pth,action=gotofolder})\
end\
sl.dropdown = {self.x1+a.x-3,self.y2,0,opt,{bg=colors.white,fg=colors.lightGray,txt=colors.black}}\
end\
elseif int == 1 and a.path then\
sl.folder = a.path\
os.queueEvent(\"explorer_change_folder\")\
elseif a.path then\
term.setCursorPos(a.x,2)\
term.setBackgroundColor(colors.gray)\
term.setTextColor(colors.white)\
term.write(a[1])\
term.setTextColor(colors.lightGray)\
term.write(\" \\31 \")\
os.sleep(0)\
local opt = {}\
local ls = fs.list(a.path)\
for f=1,#ls do\
local pth = fs.combine(a.path,ls[f])\
if fs.isDir(pth) then\
local ico = getIcon(pth)\
table.insert(opt,{txt={ico[1]..\" \"..ls[f],ico[2]},path=pth,action=gotofolder})\
if robjs[k+2] and robjs[k+2][1] == ls[f] then\
opt[#opt].color = colors.black\
--table.insert(opt,{txt=\"\\7 \"..ls[f],path=fs.combine(a.path,ls[f]),color=colors.black,action=gotofolder})\
--else\
--table.insert(opt,{txt=\" \"..ls[f],path=fs.combine(a.path,ls[f]),action=gotofolder})\
end\
end\
end\
sl.dropdown = {self.x1+a.x+#a[1]-3,self.y2,0,opt,{bg=colors.white,fg=colors.lightGray,txt=colors.gray}}\
render()\
--os.pullEvent()\
-- dropdown menu\
end\
end\
end\
end\
if not cObj then\
if e[1] == \"mouse_up\" then\
local w,h = term.getSize()\
term.setBackgroundColor(colors.black)\
term.setTextColor(colors.gray)\
lUtils.border(1,1,w,h,\"fill\",2)\
local ico = sl.getIcon(sl.folder)\
term.setCursorPos(2,2)\
term.blit(ico[1],ico[2],lUtils.toBlit(term.getBackgroundColor()))\
term.setTextColor(colors.white)\
local ibox = lUtils.input(4,2,w-1,2,{text=sl.folder,overflowY=\"none\",overflowX=\"scroll\",selectColor=colors.blue})\
ibox.state = true\
--ibox.txt = sl.folder\
ibox.select = {1,#ibox.txt}\
ibox.cursor.a = #ibox.txt+1\
ibox.cursor.x = #ibox.txt+1\
ibox.update(\"timer\")\
ibox.render()\
while ibox.state do\
local e = {os.pullEvent()}\
if e[1] == \"char\" and e[2] == \" \" then\
e[2] = \"_\"\
end\
if e[1] == \"key\" and e[2] == keys.enter then\
break\
else\
ibox.update(unpack(e))\
ibox.render()\
end\
end\
term.setCursorBlink(false)\
if fs.exists(ibox.txt) then\
sl.folder = fs.combine(ibox.txt,\"\")\
end\
render()\
end\
end\
end\
end",
name = "topbar.lua",
},
[ "searchupdate.lua" ] = {
id = 20,
content = "local sl = shapescape.getSlides()\
while true do\
local e = {os.pullEvent()}\
if self.state and e[1] == \"key\" and e[2] == keys.enter then\
self.state = false\
if #self.txt >= 1 then\
sl.search = self.txt\
os.queueEvent(\"explorer_reload\")\
end\
end\
end",
name = "searchupdate.lua",
},
}
local nAssets = {}
for key,value in pairs(assets) do nAssets[key] = value nAssets[assets[key].id] = assets[key] end
assets = nAssets
nAssets = nil
local slides = {
{
y = 22,
x = 65,
h = 19,
w = 51,
objs = {
{
type = "rect",
x2 = 14,
y2 = 19,
y1 = 3,
x1 = 12,
color = 32768,
oy2 = 0,
event = {
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
render = {
[ 2 ] = -1,
},
update = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = 4,
},
},
snap = {
Top = "Snap top",
Right = "Snap left",
Left = "Snap left",
Bottom = "Snap bottom",
},
border = {
color = 128,
type = 1,
},
},
{
type = "rect",
color = 32768,
y2 = 3,
event = {
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
render = {
[ 2 ] = -1,
},
update = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = -1,
},
},
ox2 = 0,
x2 = 51,
border = {
color = 0,
type = 1,
},
x1 = 1,
snap = {
Top = "Snap top",
Right = "Snap right",
Left = "Snap left",
Bottom = "Snap top",
},
y1 = 1,
},
{
txt = " ",
type = "text",
color = 0,
y2 = 2,
y1 = 2,
txtcolor = 128,
x2 = 2,
input = false,
event = {
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
render = {
[ 2 ] = -1,
},
update = {
[ 2 ] = 5,
},
Coroutine = {
[ 2 ] = -1,
},
},
x1 = 1,
border = {
color = 0,
type = 1,
},
},
{
txt = "",
type = "text",
x2 = 5,
y2 = 2,
y1 = 2,
txtcolor = 128,
color = 0,
input = false,
event = {
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = -1,
},
update = {
[ 2 ] = 6,
},
render = {
[ 2 ] = -1,
},
},
x1 = 4,
border = {
color = 0,
type = 1,
},
},
{
txt = "",
type = "text",
color = 0,
y2 = 2,
y1 = 2,
txtcolor = 128,
x2 = 6,
input = false,
event = {
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
render = {
[ 2 ] = -1,
},
update = {
[ 2 ] = 12,
},
Coroutine = {
[ 2 ] = -1,
},
},
x1 = 6,
border = {
color = 0,
type = 1,
},
},
{
txt = "",
type = "text",
color = 0,
y2 = 2,
y1 = 2,
txtcolor = 128,
x2 = 8,
input = false,
event = {
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
render = {
[ 2 ] = -1,
},
update = {
[ 2 ] = 7,
},
Coroutine = {
[ 2 ] = -1,
},
},
x1 = 8,
border = {
color = 0,
type = 1,
},
},
{
x2 = 51,
y2 = 19,
border = {
color = 0,
type = 1,
},
x1 = 1,
oy1 = 0,
txt = " ?? items |",
type = "text",
oy2 = 0,
txtcolor = 1,
ox2 = 0,
color = 128,
y1 = 19,
input = false,
snap = {
Top = "Snap bottom",
Right = "Snap right",
Left = "Snap left",
Bottom = "Snap bottom",
},
event = {
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
render = {
[ 2 ] = -1,
},
update = {
[ 2 ] = 11,
},
Coroutine = {
[ 2 ] = -1,
},
},
},
{
lines = {
"",
},
color = 32768,
y2 = 2,
border = {
color = 0,
type = 1,
},
x1 = 34,
scr = 0,
history = {},
ox1 = 17,
changed = false,
x2 = 49,
txt = "",
type = "input",
blit = {},
txtcolor = 1,
event = {
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
render = {
[ 2 ] = 3,
},
update = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = 20,
},
},
rhistory = {},
ox2 = 2,
state = false,
dLines = {
"",
},
opt = {
overflowX = "scroll",
overflowY = "none",
cursorColor = 256,
indentChar = " ",
tabSize = 4,
minWidth = 16,
overflow = "scroll",
minHeight = 1,
},
cursor = {
y = 1,
x = 1,
a = 1,
},
scrollX = 0,
ref = {
1,
1,
},
snap = {
Top = "Snap top",
Right = "Snap right",
Left = "Snap right",
Bottom = "Snap top",
},
y1 = 2,
},
{
type = "window",
color = 32768,
y2 = 18,
event = {
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = 0,
},
update = {
[ 2 ] = -1,
},
render = {
[ 2 ] = -1,
},
},
ox2 = 0,
oy2 = 1,
x2 = 51,
border = {
color = 0,
type = 1,
},
input = false,
x1 = 15,
snap = {
Top = "Snap top",
Right = "Snap right",
Left = "Snap left",
Bottom = "Snap bottom",
},
y1 = 4,
},
{
type = "window",
color = 128,
y2 = 18,
oy2 = 1,
x1 = 1,
x2 = 13,
event = {
render = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
mouse_up = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = 1,
},
update = {
[ 2 ] = -1,
},
},
input = false,
y1 = 4,
snap = {
Top = "Snap top",
Right = "Snap left",
Left = "Snap left",
Bottom = "Snap bottom",
},
border = {
color = 0,
type = 1,
},
},
{
type = "window",
color = 256,
y2 = 3,
y1 = 1,
ox2 = 20,
x2 = 31,
x1 = 10,
input = false,
event = {
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = 2,
},
update = {
[ 2 ] = -1,
},
render = {
[ 2 ] = -1,
},
},
snap = {
Top = "Snap top",
Right = "Snap right",
Left = "Snap left",
Bottom = "Snap top",
},
border = {
color = 0,
type = 1,
},
},
{
txt = "dropdown",
type = "text",
color = 0,
y2 = 1,
border = {
color = 0,
type = 1,
},
txtcolor = 1,
x2 = 8,
input = false,
event = {
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
render = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = -1,
},
update = {
[ 2 ] = 13,
},
},
x1 = 1,
y1 = 1,
},
{
x2 = 48,
y2 = 19,
x1 = 48,
ox1 = 3,
oy1 = 0,
txt = "=",
type = "text",
event = {
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
render = {
[ 2 ] = -1,
},
update = {
[ 2 ] = 21,
},
Coroutine = {
[ 2 ] = -1,
},
},
ox2 = 3,
y1 = 19,
border = {
color = 0,
type = 1,
},
color = 0,
input = false,
txtcolor = 1,
snap = {
Top = "Snap bottom",
Right = "Snap right",
Left = "Snap right",
Bottom = "Snap bottom",
},
oy2 = 0,
},
{
x2 = 50,
y2 = 19,
x1 = 50,
ox1 = 1,
oy1 = 0,
txt = "",
type = "text",
event = {
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
render = {
[ 2 ] = -1,
},
update = {
[ 2 ] = 22,
},
Coroutine = {
[ 2 ] = -1,
},
},
ox2 = 1,
y1 = 19,
border = {
color = 0,
type = 1,
},
color = 0,
input = false,
txtcolor = 8,
snap = {
Top = "Snap bottom",
Right = "Snap right",
Left = "Snap right",
Bottom = "Snap bottom",
},
oy2 = 0,
},
},
c = 1,
},
{
y = 22,
x = 65,
h = 19,
w = 51,
objs = {
{
type = "window",
color = 32768,
y2 = 19,
event = {
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
render = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = 8,
},
update = {
[ 2 ] = -1,
},
},
x1 = 1,
x2 = 51,
ox2 = 0,
oy2 = 0,
border = {
color = 0,
type = 1,
},
snap = {
Top = "Snap top",
Right = "Snap right",
Left = "Snap left",
Bottom = "Snap bottom",
},
y1 = 1,
},
{
type = "rect",
oy2 = -9,
color = 1,
y2 = 19,
border = {
color = 0,
type = 1,
},
ox2 = -12,
x2 = 38,
event = {
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
render = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = 9,
},
update = {
[ 2 ] = -1,
},
},
x1 = 14,
ox1 = 12,
oy1 = 9,
snap = {
Top = "Snap center",
Right = "Snap center",
Left = "Snap center",
Bottom = "Snap center",
},
y1 = 1,
},
{
x2 = 37,
y2 = 3,
x1 = 15,
ox1 = 11,
oy1 = 8,
txt = "How do you want to open this file?",
type = "text",
oy2 = 7,
txtcolor = 32768,
event = {
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
render = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = -1,
},
update = {
[ 2 ] = -1,
},
},
border = {
color = 0,
type = 1,
},
color = 0,
input = false,
y1 = 2,
snap = {
Top = "Snap center",
Right = "Snap center",
Left = "Snap center",
Bottom = "Snap center",
},
ox2 = -11,
},
{
type = "window",
oy2 = -2,
color = 1,
y2 = 12,
y1 = 4,
ox2 = -12,
x2 = 38,
event = {
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
render = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = 17,
},
update = {
[ 2 ] = -1,
},
},
x1 = 14,
ox1 = 12,
oy1 = 6,
snap = {
Top = "Snap center",
Right = "Snap center",
Left = "Snap center",
Bottom = "Snap center",
},
border = {
color = 256,
type = 1,
},
},
{
color = 0,
y2 = 16,
x1 = 19,
ox1 = 7,
oy1 = -4,
txt = "Always use this app for ??? files",
type = "text",
event = {
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
render = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = -1,
},
update = {
[ 2 ] = 10,
},
},
txtcolor = 32768,
oy2 = -6,
y1 = 14,
x2 = 37,
input = false,
ox2 = -11,
snap = {
Top = "Snap center",
Right = "Snap center",
Left = "Snap center",
Bottom = "Snap center",
},
border = {
color = 0,
type = 1,
},
},
{
color = 256,
y2 = 18,
x1 = 28,
ox1 = -2,
oy1 = -6,
txt = " OK",
type = "text",
event = {
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
render = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = -1,
},
update = {
[ 2 ] = 19,
},
},
ox2 = -11,
txtcolor = 32768,
y1 = 16,
x2 = 37,
input = false,
oy2 = -8,
snap = {
Top = "Snap center",
Right = "Snap center",
Left = "Snap center",
Bottom = "Snap center",
},
border = {
color = 1,
type = 1,
},
},
{
type = "rect",
event = {
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
render = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = -1,
},
update = {
[ 2 ] = 18,
},
},
x2 = 17,
y2 = 15,
y1 = 14,
ox2 = 9,
color = 0,
oy2 = -5,
x1 = 15,
ox1 = 11,
oy1 = -4,
snap = {
Top = "Snap center",
Right = "Snap center",
Left = "Snap center",
Bottom = "Snap center",
},
border = {
color = 256,
type = 1,
},
},
},
c = 2,
},
{
y = 21,
x = 65,
h = 19,
w = 51,
objs = {
{
type = "rect",
x2 = 14,
y2 = 15,
border = {
color = 128,
type = 1,
},
x1 = 12,
color = 32768,
oy2 = 4,
y1 = 3,
snap = {
Top = "Snap top",
Right = "Snap left",
Left = "Snap left",
Bottom = "Snap bottom",
},
event = {
render = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = 4,
},
update = {
[ 2 ] = -1,
},
mouse_up = {
[ 2 ] = -1,
},
},
},
{
type = "rect",
color = 32768,
y2 = 3,
y1 = 1,
x1 = 1,
x2 = 51,
event = {
render = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = -1,
},
update = {
[ 2 ] = -1,
},
mouse_up = {
[ 2 ] = -1,
},
},
ox2 = 0,
snap = {
Top = "Snap top",
Right = "Snap right",
Left = "Snap left",
Bottom = "Snap top",
},
border = {
color = 0,
type = 1,
},
},
{
txt = " ",
type = "text",
color = 0,
y2 = 2,
y1 = 2,
txtcolor = 128,
x2 = 2,
input = false,
event = {
render = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = -1,
},
update = {
[ 2 ] = 5,
},
mouse_up = {
[ 2 ] = -1,
},
},
x1 = 1,
border = {
color = 0,
type = 1,
},
},
{
txt = "",
type = "text",
x2 = 5,
y2 = 2,
y1 = 2,
txtcolor = 128,
color = 0,
input = false,
event = {
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
render = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = -1,
},
update = {
[ 2 ] = 6,
},
},
x1 = 4,
border = {
color = 0,
type = 1,
},
},
{
txt = "",
type = "text",
color = 0,
y2 = 2,
y1 = 2,
txtcolor = 128,
x2 = 6,
input = false,
event = {
render = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = -1,
},
update = {
[ 2 ] = 12,
},
mouse_up = {
[ 2 ] = -1,
},
},
x1 = 6,
border = {
color = 0,
type = 1,
},
},
{
txt = "",
type = "text",
color = 0,
y2 = 2,
y1 = 2,
txtcolor = 128,
x2 = 8,
input = false,
event = {
render = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = -1,
},
update = {
[ 2 ] = 7,
},
mouse_up = {
[ 2 ] = -1,
},
},
x1 = 8,
border = {
color = 0,
type = 1,
},
},
{
lines = {
"",
},
color = 32768,
y2 = 2,
y1 = 2,
x1 = 34,
scrollX = 0,
cursor = {
y = 1,
x = 1,
a = 1,
},
ox1 = 17,
x2 = 49,
txt = "",
opt = {
overflowX = "scroll",
overflowY = "none",
cursorColor = 256,
indentChar = " ",
tabSize = 4,
minWidth = 16,
overflow = "scroll",
minHeight = 1,
},
ox2 = 2,
state = false,
history = {},
event = {
render = {
[ 2 ] = 3,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = -1,
},
update = {
[ 2 ] = -1,
},
mouse_up = {
[ 2 ] = -1,
},
},
rhistory = {},
txtcolor = 1,
blit = {},
dLines = {
"",
},
type = "input",
scr = 0,
changed = false,
ref = {
1,
1,
},
snap = {
Top = "Snap top",
Right = "Snap right",
Left = "Snap right",
Bottom = "Snap top",
},
border = {
color = 0,
type = 1,
},
},
{
type = "window",
color = 32768,
y2 = 14,
oy2 = 5,
x1 = 15,
border = {
color = 0,
type = 1,
},
x2 = 51,
ox2 = 0,
input = false,
event = {
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
render = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = 0,
},
update = {
[ 2 ] = -1,
},
},
snap = {
Top = "Snap top",
Right = "Snap right",
Left = "Snap left",
Bottom = "Snap bottom",
},
y1 = 4,
},
{
type = "window",
x2 = 13,
y2 = 14,
y1 = 4,
x1 = 1,
color = 128,
event = {
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
update = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = 1,
},
render = {
[ 2 ] = -1,
},
},
input = false,
oy2 = 5,
snap = {
Top = "Snap top",
Right = "Snap left",
Left = "Snap left",
Bottom = "Snap bottom",
},
border = {
color = 0,
type = 1,
},
},
{
type = "window",
x2 = 31,
y2 = 3,
y1 = 1,
x1 = 10,
color = 256,
event = {
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
render = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = 2,
},
update = {
[ 2 ] = -1,
},
},
input = false,
ox2 = 20,
snap = {
Top = "Snap top",
Right = "Snap right",
Left = "Snap left",
Bottom = "Snap top",
},
border = {
color = 0,
type = 1,
},
},
{
txt = "dropdown",
type = "text",
color = 0,
y2 = 1,
border = {
color = 0,
type = 1,
},
txtcolor = 1,
x2 = 8,
input = false,
event = {
render = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
update = {
[ 2 ] = 13,
},
Coroutine = {
[ 2 ] = -1,
},
mouse_up = {
[ 2 ] = -1,
},
},
x1 = 1,
y1 = 1,
},
{
type = "rect",
color = 128,
y2 = 19,
border = {
color = 0,
type = 1,
},
x1 = 1,
y1 = 15,
x2 = 51,
event = {
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
render = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = -1,
},
update = {
[ 2 ] = -1,
},
},
ox2 = 0,
oy1 = 4,
snap = {
Top = "Snap bottom",
Right = "Snap right",
Left = "Snap left",
Bottom = "Snap bottom",
},
oy2 = 0,
},
{
color = 32768,
y2 = 18,
x1 = 43,
ox1 = 8,
oy1 = 1,
txt = " Cancel",
type = "text",
event = {
mouse_up = {
[ 2 ] = 16,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
render = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = -1,
},
update = {
[ 2 ] = -1,
},
},
ox2 = 1,
txtcolor = 1,
border = {
color = 0,
type = 1,
},
x2 = 50,
input = false,
y1 = 18,
snap = {
Top = "Snap bottom",
Right = "Snap right",
Left = "Snap right",
Bottom = "Snap bottom",
},
oy2 = 1,
},
{
x2 = 41,
y2 = 18,
x1 = 34,
ox1 = 17,
oy1 = 1,
txt = " Select",
type = "text",
event = {
render = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
update = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = -1,
},
mouse_up = {
[ 2 ] = 15,
},
},
txtcolor = 1,
y1 = 18,
border = {
color = 0,
type = 1,
},
color = 32768,
input = false,
ox2 = 10,
snap = {
Top = "Snap bottom",
Right = "Snap right",
Left = "Snap right",
Bottom = "Snap bottom",
},
oy2 = 1,
},
{
color = 0,
y2 = 16,
x1 = 4,
oy1 = 3,
txt = "File Name:",
type = "text",
event = {
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
render = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = -1,
},
update = {
[ 2 ] = -1,
},
},
txtcolor = 1,
oy2 = 3,
border = {
color = 0,
type = 1,
},
input = false,
x2 = 13,
snap = {
Top = "Snap bottom",
Right = "Snap left",
Left = "Snap left",
Bottom = "Snap bottom",
},
y1 = 16,
},
{
lines = {
"",
},
x2 = 32,
y2 = 16,
cursor = {
y = 1,
x = 1,
a = 1,
},
x1 = 15,
state = false,
scr = 0,
changed = false,
oy1 = 3,
txtcolor = 1,
txt = "",
opt = {
overflowX = "scroll",
overflowY = "none",
cursorColor = 1,
indentChar = " ",
tabSize = 4,
minWidth = 9,
overflow = "scroll",
minHeight = 1,
},
oy2 = 3,
history = {},
scrollX = 0,
event = {
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
render = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = 14,
},
update = {
[ 2 ] = -1,
},
},
rhistory = {},
ox2 = 19,
blit = {},
dLines = {
"",
},
border = {
color = 0,
type = 1,
},
type = "input",
color = 32768,
ref = {
1,
1,
},
snap = {
Top = "Snap bottom",
Right = "Snap right",
Left = "Snap left",
Bottom = "Snap bottom",
},
y1 = 16,
},
{
color = 32768,
y2 = 16,
x1 = 34,
ox1 = 17,
oy1 = 3,
txt = "All files (*.*) ",
type = "text",
event = {
mouse_up = {
[ 2 ] = -1,
},
mouse_click = {
[ 2 ] = -1,
},
focus = {
[ 2 ] = -1,
},
render = {
[ 2 ] = -1,
},
Coroutine = {
[ 2 ] = -1,
},
update = {
[ 2 ] = -1,
},
},
ox2 = 1,
txtcolor = 1,
border = {
color = 0,
type = 1,
},
x2 = 50,
input = false,
y1 = 16,
snap = {
Top = "Snap bottom",
Right = "Snap right",
Left = "Snap right",
Bottom = "Snap bottom",
},
oy2 = 3,
},
},
c = 3,
},
}
for s=1,#slides do
local slide = slides[s]
for o=1,#slide.objs do
local obj = slide.objs[o]
for key,value in pairs(obj.event) do
if assets[ value[2] ] then
lUtils.shapescape.addScript(obj,value[2],key,assets,LevelOS,slides)
else
obj.event[key] = {function() end,-1}
end
end
end
end
local tArgs = {...}
if tArgs[1] and tArgs[1] == "load" then
return {assets=assets,slides=slides}
end
return lUtils.shapescape.run(slides,...)