2016-11-17 15:57:42 +01:00
|
|
|
--
|
|
|
|
-- sPhone Application Package
|
|
|
|
-- Built with SPK builder 1.2
|
|
|
|
--
|
|
|
|
{
|
|
|
|
files = "{\
|
|
|
|
[ \"paint.lua\" ] = \"-- Paint created by nitrogenfingers (edited by dan200)\\\
|
|
|
|
-- http://www.youtube.com/user/NitrogenFingers\\\
|
|
|
|
\\\
|
|
|
|
------------\\\
|
|
|
|
-- Fields --\\\
|
|
|
|
------------\\\
|
|
|
|
\\\
|
|
|
|
-- The width and height of the terminal\\\
|
|
|
|
local w,h = term.getSize()\\\
|
|
|
|
\\\
|
|
|
|
-- The selected colours on the left and right mouse button, and the colour of the canvas\\\
|
|
|
|
local leftColour, rightColour = colours.white, nil\\\
|
|
|
|
local canvasColour = colours.black\\\
|
|
|
|
\\\
|
|
|
|
-- The values stored in the canvas\\\
|
|
|
|
local canvas = {}\\\
|
|
|
|
\\\
|
|
|
|
-- The menu options\\\
|
|
|
|
local mChoices = { \\\"Save\\\",\\\"Exit\\\" }\\\
|
|
|
|
\\\
|
|
|
|
-- The message displayed in the footer bar\\\
|
|
|
|
local fMessage = \\\"Press Ctrl to access menu\\\"\\\
|
|
|
|
\\\
|
|
|
|
-------------------------\\\
|
|
|
|
-- Initialisation --\\\
|
|
|
|
-------------------------\\\
|
|
|
|
\\\
|
|
|
|
-- Determine if we can even run this\\\
|
|
|
|
if not term.isColour() then\\\
|
|
|
|
print(\\\"Requires an Advanced Computer\\\")\\\
|
|
|
|
return\\\
|
|
|
|
end\\\
|
|
|
|
\\\
|
|
|
|
-- Determines if the file exists, and can be edited on this computer\\\
|
|
|
|
local tArgs = {...}\\\
|
|
|
|
if #tArgs == 0 then\\\
|
|
|
|
print(\\\"Usage: paint <path>\\\")\\\
|
|
|
|
return\\\
|
|
|
|
end\\\
|
|
|
|
local sPath = shell.resolve(tArgs[1])\\\
|
|
|
|
local bReadOnly = fs.isReadOnly(sPath)\\\
|
|
|
|
if fs.exists(sPath) and fs.isDir(sPath) then\\\
|
|
|
|
print(\\\"Cannot edit a directory.\\\")\\\
|
|
|
|
return\\\
|
|
|
|
end\\\
|
|
|
|
\\\
|
|
|
|
term.setBackgroundColor(colors.black)\\\
|
|
|
|
term.clear()\\\
|
|
|
|
\\\
|
|
|
|
---------------\\\
|
|
|
|
-- Functions --\\\
|
|
|
|
---------------\\\
|
|
|
|
\\\
|
|
|
|
local function getCanvasPixel( x, y )\\\
|
|
|
|
if canvas[y] then\\\
|
|
|
|
return canvas[y][x]\\\
|
|
|
|
end\\\
|
|
|
|
return nil\\\
|
|
|
|
end\\\
|
|
|
|
\\\
|
|
|
|
--[[\\\
|
|
|
|
Converts a colour value to a text character\\\
|
|
|
|
params: colour = the number to convert to a hex value\\\
|
|
|
|
returns: a string representing the chosen colour\\\
|
|
|
|
]]\\\
|
|
|
|
local function getCharOf( colour )\\\
|
|
|
|
-- Incorrect values always convert to nil\\\
|
|
|
|
if type(colour) == \\\"number\\\" then\\\
|
|
|
|
local value = math.floor( math.log(colour) / math.log(2) ) + 1\\\
|
|
|
|
if value >= 1 and value <= 16 then\\\
|
|
|
|
return string.sub( \\\"0123456789abcdef\\\", value, value )\\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
return \\\" \\\"\\\
|
|
|
|
end \\\
|
|
|
|
\\\
|
|
|
|
--[[\\\
|
|
|
|
Converts a text character to colour value\\\
|
|
|
|
params: char = the char (from string.byte) to convert to number\\\
|
|
|
|
returns: the colour number of the hex value\\\
|
|
|
|
]]\\\
|
|
|
|
local tColourLookup = {}\\\
|
|
|
|
for n=1,16 do\\\
|
|
|
|
tColourLookup[ string.byte( \\\"0123456789abcdef\\\",n,n ) ] = 2^(n-1)\\\
|
|
|
|
end\\\
|
|
|
|
local function getColourOf( char )\\\
|
|
|
|
-- Values not in the hex table are transparent (canvas coloured)\\\
|
|
|
|
return tColourLookup[char]\\\
|
|
|
|
end\\\
|
|
|
|
\\\
|
|
|
|
--[[ \\\
|
|
|
|
Loads the file into the canvas\\\
|
|
|
|
params: path = the path of the file to open\\\
|
|
|
|
returns: nil\\\
|
|
|
|
]]\\\
|
|
|
|
local function load(path)\\\
|
|
|
|
-- Load the file\\\
|
|
|
|
if fs.exists(path) then\\\
|
|
|
|
local file = fs.open(sPath, \\\"r\\\")\\\
|
|
|
|
local sLine = file.readLine()\\\
|
|
|
|
while sLine do\\\
|
|
|
|
local line = {}\\\
|
|
|
|
for x=1,w-2 do\\\
|
|
|
|
line[x] = getColourOf( string.byte(sLine,x,x) )\\\
|
|
|
|
end\\\
|
|
|
|
table.insert( canvas, line )\\\
|
|
|
|
sLine = file.readLine()\\\
|
|
|
|
end\\\
|
|
|
|
file.close()\\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
\\\
|
|
|
|
--[[ \\\
|
|
|
|
Saves the current canvas to file \\\
|
|
|
|
params: path = the path of the file to save\\\
|
|
|
|
returns: true if save was successful, false otherwise\\\
|
|
|
|
]]\\\
|
|
|
|
local function save(path)\\\
|
|
|
|
-- Open file\\\
|
|
|
|
local sDir = string.sub(sPath, 1, #sPath - #fs.getName(sPath))\\\
|
|
|
|
if not fs.exists(sDir) then\\\
|
|
|
|
fs.makeDir(sDir)\\\
|
|
|
|
end\\\
|
|
|
|
\\\
|
|
|
|
local file = fs.open( path, \\\"w\\\" )\\\
|
|
|
|
if not file then\\\
|
|
|
|
return false\\\
|
|
|
|
end\\\
|
|
|
|
\\\
|
|
|
|
-- Encode (and trim)\\\
|
|
|
|
local tLines = {}\\\
|
|
|
|
local nLastLine = 0\\\
|
|
|
|
for y=1,h-1 do\\\
|
|
|
|
local sLine = \\\"\\\"\\\
|
|
|
|
local nLastChar = 0\\\
|
|
|
|
for x=1,w-2 do\\\
|
|
|
|
local c = getCharOf( getCanvasPixel( x, y ) )\\\
|
|
|
|
sLine = sLine .. c\\\
|
|
|
|
if c ~= \\\" \\\" then\\\
|
|
|
|
nLastChar = x\\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
sLine = string.sub( sLine, 1, nLastChar )\\\
|
|
|
|
tLines[y] = sLine\\\
|
|
|
|
if string.len( sLine ) > 0 then\\\
|
|
|
|
nLastLine = y\\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
\\\
|
|
|
|
-- Save out\\\
|
|
|
|
for n=1,nLastLine do\\\
|
|
|
|
file.writeLine( tLines[ n ] )\\\
|
|
|
|
end\\\
|
|
|
|
file.close()\\\
|
|
|
|
return true\\\
|
|
|
|
end\\\
|
|
|
|
\\\
|
|
|
|
--[[ \\\
|
|
|
|
Draws colour picker sidebar, the pallette and the footer\\\
|
|
|
|
returns: nil\\\
|
|
|
|
]]\\\
|
|
|
|
local function drawInterface()\\\
|
|
|
|
-- Footer\\\
|
|
|
|
term.setCursorPos(1, h)\\\
|
|
|
|
term.setBackgroundColour(colours.black)\\\
|
|
|
|
term.setTextColour(colours.yellow)\\\
|
|
|
|
term.clearLine()\\\
|
|
|
|
term.write(fMessage)\\\
|
|
|
|
\\\
|
|
|
|
-- Colour Picker\\\
|
|
|
|
for i=1,16 do\\\
|
|
|
|
term.setCursorPos(w-1, i)\\\
|
|
|
|
term.setBackgroundColour( 2^(i-1) )\\\
|
|
|
|
term.write(\\\" \\\")\\\
|
|
|
|
end\\\
|
|
|
|
\\\
|
|
|
|
term.setCursorPos(w-1, 17)\\\
|
|
|
|
term.setBackgroundColour( canvasColour )\\\
|
|
|
|
term.setTextColour( colours.grey )\\\
|
|
|
|
term.write(\\\"\\\\127\\\\127\\\")\\\
|
|
|
|
\\\
|
|
|
|
-- Left and Right Selected Colours\\\
|
|
|
|
for i=18,18 do\\\
|
|
|
|
term.setCursorPos(w-1, i)\\\
|
|
|
|
if leftColour ~= nil then\\\
|
|
|
|
term.setBackgroundColour( leftColour )\\\
|
|
|
|
term.write(\\\" \\\")\\\
|
|
|
|
else\\\
|
|
|
|
term.setBackgroundColour( canvasColour )\\\
|
|
|
|
term.setTextColour( colours.grey )\\\
|
|
|
|
term.write(\\\"\\\\127\\\")\\\
|
|
|
|
end\\\
|
|
|
|
if rightColour ~= nil then\\\
|
|
|
|
term.setBackgroundColour( rightColour )\\\
|
|
|
|
term.write(\\\" \\\")\\\
|
|
|
|
else\\\
|
|
|
|
term.setBackgroundColour( canvasColour )\\\
|
|
|
|
term.setTextColour( colours.grey )\\\
|
|
|
|
term.write(\\\"\\\\127\\\")\\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
\\\
|
|
|
|
-- Padding\\\
|
|
|
|
term.setBackgroundColour( canvasColour )\\\
|
|
|
|
for i=20,h-1 do\\\
|
|
|
|
term.setCursorPos(w-1, i)\\\
|
|
|
|
term.write(\\\" \\\")\\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
\\\
|
|
|
|
--[[ \\\
|
|
|
|
Converts a single pixel of a single line of the canvas and draws it\\\
|
|
|
|
returns: nil\\\
|
|
|
|
]]\\\
|
|
|
|
local function drawCanvasPixel( x, y )\\\
|
|
|
|
local pixel = getCanvasPixel( x, y )\\\
|
|
|
|
if pixel then\\\
|
|
|
|
term.setBackgroundColour( pixel or canvasColour )\\\
|
|
|
|
term.setCursorPos(x, y)\\\
|
|
|
|
term.write(\\\" \\\")\\\
|
|
|
|
else\\\
|
|
|
|
term.setBackgroundColour( canvasColour )\\\
|
|
|
|
term.setTextColour( colours.grey )\\\
|
|
|
|
term.setCursorPos(x, y)\\\
|
|
|
|
term.write(\\\"\\\\127\\\")\\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
\\\
|
|
|
|
--[[ \\\
|
|
|
|
Converts each colour in a single line of the canvas and draws it\\\
|
|
|
|
returns: nil\\\
|
|
|
|
]]\\\
|
|
|
|
local function drawCanvasLine( y )\\\
|
|
|
|
for x = 1, 4 do\\\
|
|
|
|
drawCanvasPixel( x, y )\\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
\\\
|
|
|
|
--[[ \\\
|
|
|
|
Converts each colour in the canvas and draws it\\\
|
|
|
|
returns: nil\\\
|
|
|
|
]]\\\
|
|
|
|
local function drawCanvas()\\\
|
|
|
|
for y = 1, 3 do\\\
|
|
|
|
drawCanvasLine( y )\\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
\\\
|
|
|
|
--[[\\\
|
|
|
|
Draws menu options and handles input from within the menu.\\\
|
|
|
|
returns: true if the program is to be exited; false otherwise\\\
|
|
|
|
]]\\\
|
|
|
|
local function accessMenu()\\\
|
|
|
|
-- Selected menu option\\\
|
|
|
|
local selection = 1\\\
|
|
|
|
\\\
|
|
|
|
term.setBackgroundColour(colours.black)\\\
|
|
|
|
while true do\\\
|
|
|
|
-- Draw the menu\\\
|
|
|
|
term.setCursorPos(1,h)\\\
|
|
|
|
term.clearLine()\\\
|
|
|
|
term.setTextColour(colours.white)\\\
|
|
|
|
for k,v in pairs(mChoices) do\\\
|
|
|
|
if selection==k then \\\
|
|
|
|
term.setTextColour(colours.yellow)\\\
|
|
|
|
local ox,_ = term.getCursorPos()\\\
|
|
|
|
term.write(\\\"[\\\"..string.rep(\\\" \\\",#v)..\\\"]\\\")\\\
|
|
|
|
term.setCursorPos(ox+1,h)\\\
|
|
|
|
term.setTextColour(colours.white)\\\
|
|
|
|
term.write(v)\\\
|
|
|
|
term.setCursorPos(term.getCursorPos()+1,h)\\\
|
|
|
|
else\\\
|
|
|
|
term.write(\\\" \\\"..v..\\\" \\\")\\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
\\\
|
|
|
|
-- Handle input in the menu\\\
|
|
|
|
local id,key = os.pullEvent(\\\"key\\\")\\\
|
|
|
|
if id == \\\"key\\\" then\\\
|
|
|
|
-- S and E are shortcuts\\\
|
|
|
|
if key == keys.s then\\\
|
|
|
|
selection = 1\\\
|
|
|
|
key = keys.enter\\\
|
|
|
|
elseif key == keys.e then\\\
|
|
|
|
selection = 2\\\
|
|
|
|
key = keys.enter\\\
|
|
|
|
end\\\
|
|
|
|
\\\
|
|
|
|
if key == keys.right then\\\
|
|
|
|
-- Move right\\\
|
|
|
|
selection = selection + 1\\\
|
|
|
|
if selection > #mChoices then\\\
|
|
|
|
selection = 1\\\
|
|
|
|
end\\\
|
|
|
|
\\\
|
|
|
|
elseif key == keys.left and selection > 1 then\\\
|
|
|
|
-- Move left\\\
|
|
|
|
selection = selection - 1\\\
|
|
|
|
if selection < 1 then\\\
|
|
|
|
selection = #mChoices\\\
|
|
|
|
end\\\
|
|
|
|
\\\
|
|
|
|
elseif key == keys.enter then\\\
|
|
|
|
-- Select an option\\\
|
|
|
|
if mChoices[selection]==\\\"Save\\\" then \\\
|
|
|
|
if bReadOnly then \\\
|
|
|
|
fMessage = \\\"Access Denied\\\"\\\
|
|
|
|
return false\\\
|
|
|
|
end\\\
|
|
|
|
local success = save(sPath)\\\
|
|
|
|
if success then\\\
|
|
|
|
fMessage = \\\"Saved to \\\"..sPath\\\
|
|
|
|
else\\\
|
|
|
|
fMessage = \\\"Error saving to \\\"..sPath\\\
|
|
|
|
end\\\
|
|
|
|
return false\\\
|
|
|
|
elseif mChoices[selection]==\\\"Exit\\\" then \\\
|
|
|
|
return true\\\
|
|
|
|
end\\\
|
|
|
|
elseif key == keys.leftCtrl or keys == keys.rightCtrl then\\\
|
|
|
|
-- Cancel the menu\\\
|
|
|
|
return false \\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
\\\
|
|
|
|
--[[ \\\
|
|
|
|
Runs the main thread of execution. Draws the canvas and interface, and handles\\\
|
|
|
|
mouse and key events.\\\
|
|
|
|
returns: nil\\\
|
|
|
|
]]\\\
|
|
|
|
local function handleEvents()\\\
|
|
|
|
local programActive = true\\\
|
|
|
|
while programActive do\\\
|
|
|
|
local id,p1,p2,p3 = os.pullEvent()\\\
|
|
|
|
if id==\\\"mouse_click\\\" or id==\\\"mouse_drag\\\" then\\\
|
|
|
|
if p2 >= w-1 and p3 >= 1 and p3 <= 17 then\\\
|
|
|
|
if id ~= \\\"mouse_drag\\\" then\\\
|
|
|
|
-- Selecting an items in the colour picker\\\
|
|
|
|
if p3 <= 16 then\\\
|
|
|
|
if p1==1 then\\\
|
|
|
|
leftColour = 2^(p3-1)\\\
|
|
|
|
else\\\
|
|
|
|
rightColour = 2^(p3-1)\\\
|
|
|
|
end\\\
|
|
|
|
else\\\
|
|
|
|
if p1==1 then\\\
|
|
|
|
leftColour = nil\\\
|
|
|
|
else\\\
|
|
|
|
rightColour = nil\\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
--drawCanvas()\\\
|
|
|
|
drawInterface()\\\
|
|
|
|
end\\\
|
|
|
|
elseif p2 <= 4 and p3 <= 3 then\\\
|
|
|
|
-- Clicking on the canvas\\\
|
|
|
|
local paintColour = nil\\\
|
|
|
|
if p1==1 then\\\
|
|
|
|
paintColour = leftColour\\\
|
|
|
|
elseif p1==2 then\\\
|
|
|
|
paintColour = rightColour\\\
|
|
|
|
end\\\
|
|
|
|
if not canvas[p3] then\\\
|
|
|
|
canvas[p3] = {}\\\
|
|
|
|
end\\\
|
|
|
|
canvas[p3][p2] = paintColour\\\
|
|
|
|
\\\
|
|
|
|
drawCanvasPixel( p2, p3 )\\\
|
|
|
|
end\\\
|
|
|
|
elseif id==\\\"key\\\" then\\\
|
|
|
|
if p1==keys.leftCtrl or p1==keys.rightCtrl then\\\
|
|
|
|
programActive = not accessMenu()\\\
|
|
|
|
drawInterface()\\\
|
|
|
|
end\\\
|
|
|
|
elseif id==\\\"term_resize\\\" then\\\
|
|
|
|
w,h = term.getSize()\\\
|
|
|
|
drawCanvas()\\\
|
|
|
|
drawInterface()\\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
\\\
|
|
|
|
-- Init\\\
|
|
|
|
load(sPath)\\\
|
|
|
|
drawCanvas()\\\
|
|
|
|
drawInterface()\\\
|
|
|
|
\\\
|
|
|
|
-- Main loop\\\
|
|
|
|
handleEvents()\\\
|
|
|
|
\\\
|
|
|
|
-- Shutdown\\\
|
|
|
|
term.setBackgroundColour(colours.black)\\\
|
|
|
|
term.setTextColour(colours.white)\\\
|
|
|
|
term.clear()\\\
|
|
|
|
term.setCursorPos(1,1)\\\
|
|
|
|
\",\
|
|
|
|
[ \"homeplus.lua\" ] = \"\\\
|
|
|
|
--setup\\\
|
2016-11-20 17:09:16 +01:00
|
|
|
if not fs.exists(spk.getDataPath()..\\\"/icons/sphone.shell\\\") then\\\
|
|
|
|
local f = spk.open(\\\"icons/sphone.shell\\\",\\\"w\\\")\\\
|
2016-11-17 15:57:42 +01:00
|
|
|
f.write(\\\"4fff\\\\nf4ff\\\\n4f44\\\")\\\
|
|
|
|
f.close()\\\
|
|
|
|
end\\\
|
|
|
|
\\\
|
|
|
|
if not fs.exists(spk.getDataPath()..\\\"/config\\\") then\\\
|
|
|
|
local f = spk.open(\\\"config\\\",\\\"w\\\")\\\
|
2016-11-20 17:09:16 +01:00
|
|
|
f.write(\\\"{[1] = {\\\\\\\"Shell\\\\\\\", \\\\\\\"sphone.launch\\\\\\\"},}\\\")\\\
|
2016-11-17 15:57:42 +01:00
|
|
|
f.close()\\\
|
|
|
|
end\\\
|
|
|
|
\\\
|
|
|
|
local iconPos = { --Because i hate math (to rewrite), anyway this is for the standard pocket computer size\\\
|
|
|
|
[1] = {3,2,6,4},\\\
|
|
|
|
[2] = {9,2,12,4},\\\
|
|
|
|
[3] = {15,2,18,4},\\\
|
|
|
|
[4] = {21,2,24,4},\\\
|
|
|
|
[5] = {3,8,6,10},\\\
|
|
|
|
[6] = {9,8,12,10},\\\
|
|
|
|
[7] = {15,8,18,10},\\\
|
|
|
|
[8] = {21,8,24,10},\\\
|
|
|
|
[9] = {3,14,6,16},\\\
|
|
|
|
[10] = {9,14,12,16},\\\
|
|
|
|
[11] = {15,14,18,16},\\\
|
|
|
|
[12] = {21,14,24,16},\\\
|
|
|
|
}\\\
|
|
|
|
\\\
|
|
|
|
local objectsDesktop = {}\\\
|
|
|
|
local objCoords = {}\\\
|
|
|
|
\\\
|
|
|
|
local f = spk.open(\\\"config\\\",\\\"r\\\")\\\
|
|
|
|
local objectsDesktop = textutils.unserialise(f.readAll())\\\
|
|
|
|
f.close()\\\
|
|
|
|
\\\
|
|
|
|
local function getCoords(iconNumber)\\\
|
|
|
|
if iconPos[iconNumber] then\\\
|
|
|
|
local x, y, maxx, maxy\\\
|
|
|
|
x = iconPos[iconNumber][1]\\\
|
|
|
|
y = iconPos[iconNumber][2]\\\
|
|
|
|
maxx = iconPos[iconNumber][3]\\\
|
|
|
|
maxy = iconPos[iconNumber][4]\\\
|
|
|
|
return x,y,maxx,maxy\\\
|
|
|
|
end\\\
|
|
|
|
return false\\\
|
|
|
|
end\\\
|
|
|
|
\\\
|
|
|
|
function getProgram(x,y)\\\
|
|
|
|
for k,v in pairs(objCoords) do\\\
|
|
|
|
local px, py, pex, pey = v[1],v[2],v[3],v[4]\\\
|
|
|
|
if x >= px and y >= py and x <= pex and y <= pey then\\\
|
|
|
|
return objectsDesktop[k][1], objectsDesktop[k][2]\\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
\\\
|
|
|
|
local function homeSettings()\\\
|
|
|
|
local menu = {\\\
|
|
|
|
\\\"Add app\\\",\\\
|
|
|
|
\\\"Remove app\\\",\\\
|
|
|
|
}\\\
|
|
|
|
while true do\\\
|
|
|
|
local _, id = sPhone.menu(menu,\\\"Home+\\\",\\\"X\\\")\\\
|
|
|
|
if id == 0 then\\\
|
|
|
|
break\\\
|
|
|
|
elseif id == 1 then\\\
|
|
|
|
local function redraw()\\\
|
|
|
|
term.setBackgroundColor(sPhone.theme[\\\"backgroundColor\\\"])\\\
|
|
|
|
term.setTextColor(sPhone.theme[\\\"text\\\"])\\\
|
|
|
|
term.clear()\\\
|
|
|
|
sPhone.header(\\\"Home+: Add\\\",\\\"X\\\")\\\
|
|
|
|
for k,v in pairs(iconPos) do\\\
|
|
|
|
paintutils.drawFilledBox(v[1],v[2]+1,v[3],v[4]+1,colors.red)\\\
|
|
|
|
end\\\
|
|
|
|
for k, v in pairs(objCoords) do\\\
|
|
|
|
paintutils.drawFilledBox(v[1],v[2]+1,v[3],v[4]+1,colors.lime)\\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
\\\
|
|
|
|
redraw()\\\
|
|
|
|
local w, h = term.getSize()\\\
|
|
|
|
while true do\\\
|
|
|
|
redraw()\\\
|
|
|
|
local _,_,x,y = os.pullEvent(\\\"mouse_click\\\")\\\
|
|
|
|
if y == 1 and x == w then\\\
|
|
|
|
break\\\
|
|
|
|
else\\\
|
|
|
|
local a = getProgram(x-1,y-1)\\\
|
|
|
|
if not a then\\\
|
|
|
|
for k, v in pairs(iconPos) do\\\
|
|
|
|
if (x >= v[1] and y >= v[2]) and (x <= v[3] and y <= v[4]) then\\\
|
|
|
|
local iconPoss = k\\\
|
2016-11-20 17:09:16 +01:00
|
|
|
local ll = config.list(\\\"/.sPhone/config/spklist\\\")\\\
|
|
|
|
-- for k,v in pairs(ll) do\\\
|
|
|
|
-- if config.read\\\
|
|
|
|
-- end\\\
|
|
|
|
local spkID,name = sPhone.list(nil,{\\\
|
|
|
|
list = ll,\\\
|
|
|
|
pairs = true,\\\
|
|
|
|
title = \\\" Add App\\\"\\\
|
|
|
|
})\\\
|
|
|
|
if not spkID then\\\
|
|
|
|
return\\\
|
|
|
|
else\\\
|
|
|
|
local f = spk.open(\\\"config\\\",\\\"r\\\")\\\
|
|
|
|
local ics = textutils.unserialise(f.readAll())\\\
|
|
|
|
f.close()\\\
|
|
|
|
ics[iconPoss] = {name,spkID}\\\
|
|
|
|
objectsDesktop[iconPoss] = {name,spkID}\\\
|
|
|
|
local f = spk.open(\\\"config\\\",\\\"w\\\")\\\
|
|
|
|
f.write(textutils.serialize(ics))\\\
|
|
|
|
f.close()\\\
|
|
|
|
shell.run(spk.getPath()..\\\"/files/paint.lua\\\",spk.getDataPath()..\\\"/icons/\\\"..spkID)\\\
|
|
|
|
sPhone.winOk(\\\"Done!\\\")\\\
|
2016-11-17 15:57:42 +01:00
|
|
|
end\\\
|
|
|
|
break\\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
break\\\
|
|
|
|
elseif id == 2 then\\\
|
|
|
|
local function redraw()\\\
|
|
|
|
term.setBackgroundColor(sPhone.theme[\\\"backgroundColor\\\"])\\\
|
|
|
|
term.setTextColor(sPhone.theme[\\\"text\\\"])\\\
|
|
|
|
term.clear()\\\
|
|
|
|
sPhone.header(\\\"Home+: Remove\\\",\\\"X\\\")\\\
|
|
|
|
for k,v in pairs(iconPos) do\\\
|
|
|
|
paintutils.drawFilledBox(v[1],v[2]+1,v[3],v[4]+1,colors.red)\\\
|
|
|
|
end\\\
|
|
|
|
for k, v in pairs(objCoords) do\\\
|
|
|
|
paintutils.drawFilledBox(v[1],v[2]+1,v[3],v[4]+1,colors.lime)\\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
\\\
|
|
|
|
redraw()\\\
|
|
|
|
local w, h = term.getSize()\\\
|
|
|
|
while true do\\\
|
|
|
|
redraw()\\\
|
|
|
|
local _,_,x,y = os.pullEvent(\\\"mouse_click\\\")\\\
|
|
|
|
if y == 1 and x == w then\\\
|
|
|
|
break\\\
|
|
|
|
else\\\
|
|
|
|
local a = getProgram(x-1,y-1)\\\
|
|
|
|
if a then\\\
|
|
|
|
for k, v in pairs(iconPos) do\\\
|
|
|
|
if (x >= v[1] and y >= v[2]) and (x <= v[3] and y <= v[4]) then\\\
|
|
|
|
local iconPoss = k\\\
|
|
|
|
term.setBackgroundColor(sPhone.theme[\\\"backgroundColor\\\"])\\\
|
|
|
|
term.setTextColor(sPhone.theme[\\\"text\\\"])\\\
|
|
|
|
term.clear()\\\
|
|
|
|
local f = spk.open(\\\"config\\\",\\\"r\\\")\\\
|
|
|
|
local ics = textutils.unserialise(f.readAll())\\\
|
|
|
|
f.close()\\\
|
|
|
|
ics[iconPoss] = nil\\\
|
|
|
|
objectsDesktop[iconPoss] = nil\\\
|
|
|
|
local f = spk.open(\\\"config\\\",\\\"w\\\")\\\
|
|
|
|
f.write(textutils.serialize(ics))\\\
|
|
|
|
f.close()\\\
|
|
|
|
sPhone.winOk(\\\"Done!\\\")\\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
break\\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
\\\
|
|
|
|
local function footer()\\\
|
|
|
|
local menu = {\\\
|
|
|
|
\\\"Settings\\\",\\\
|
|
|
|
\\\"Home+ Settings\\\",\\\
|
|
|
|
\\\"Lock\\\",\\\
|
|
|
|
\\\"Info\\\",\\\
|
|
|
|
\\\"Shutdown\\\",\\\
|
|
|
|
\\\"Reboot\\\",\\\
|
|
|
|
}\\\
|
|
|
|
\\\
|
|
|
|
while true do\\\
|
2016-11-20 17:09:16 +01:00
|
|
|
local name, id = sPhone.menu(menu,\\\"Home+\\\",\\\"V\\\")\\\
|
2016-11-17 15:57:42 +01:00
|
|
|
if id == 0 then\\\
|
|
|
|
break\\\
|
|
|
|
elseif id == 1 then\\\
|
2016-11-20 17:09:16 +01:00
|
|
|
sPhone.launch(\\\"sphone.settings\\\")\\\
|
2016-11-17 15:57:42 +01:00
|
|
|
break\\\
|
|
|
|
elseif id == 2 then\\\
|
|
|
|
homeSettings()\\\
|
|
|
|
elseif id == 3 then\\\
|
|
|
|
sPhone.login()\\\
|
|
|
|
break\\\
|
|
|
|
elseif id == 4 then\\\
|
2016-11-20 17:09:16 +01:00
|
|
|
sPhone.launch(\\\"sphone.info\\\")\\\
|
2016-11-17 15:57:42 +01:00
|
|
|
break\\\
|
|
|
|
elseif id == 5 then\\\
|
|
|
|
os.shutdown()\\\
|
|
|
|
elseif id == 6 then\\\
|
|
|
|
os.reboot()\\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
\\\
|
|
|
|
local function redraw()\\\
|
|
|
|
term.setBackgroundColor(sPhone.getTheme(\\\"backgroundColor\\\"))\\\
|
|
|
|
term.setTextColor(sPhone.getTheme(\\\"text\\\"))\\\
|
|
|
|
term.clear()\\\
|
|
|
|
term.setCursorPos(1,1)\\\
|
|
|
|
for k, v in pairs(objectsDesktop) do\\\
|
|
|
|
local x, y,endx,endy = getCoords(k)\\\
|
|
|
|
objCoords[k] = {x,y,endx,endy}\\\
|
2016-11-20 17:09:16 +01:00
|
|
|
local loI\\\
|
|
|
|
if not fs.exists(spk.getDataPath()..\\\"/icons/\\\"..v[2]) then\\\
|
|
|
|
loI = spk.getDataPath()..\\\"/icons/sphone.shell\\\"\\\
|
|
|
|
else\\\
|
|
|
|
loI = spk.getDataPath()..\\\"/icons/\\\"..v[2]\\\
|
|
|
|
end\\\
|
|
|
|
local icon = paintutils.loadImage(loI)\\\
|
2016-11-17 15:57:42 +01:00
|
|
|
paintutils.drawImage(icon,x,y)\\\
|
|
|
|
local name, sndName\\\
|
|
|
|
if #v[1] > 5 then\\\
|
|
|
|
term.setCursorPos(endx-3,endy+1)\\\
|
|
|
|
name = string.sub(objectsDesktop[k][1],1,5)\\\
|
|
|
|
sndName = string.sub(objectsDesktop[k][1],6,(10 or #v[1]))\\\
|
|
|
|
else\\\
|
|
|
|
name = objectsDesktop[k][1]\\\
|
|
|
|
term.setCursorPos(endx-3,endy+1)\\\
|
|
|
|
end\\\
|
|
|
|
term.setBackgroundColour(sPhone.getTheme(\\\"backgroundColor\\\"))\\\
|
|
|
|
write(name)\\\
|
|
|
|
if sndName then\\\
|
|
|
|
term.setCursorPos(endx-3,endy+2)\\\
|
|
|
|
write(sndName)\\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
local w,h = term.getSize()\\\
|
|
|
|
paintutils.drawLine(1,h,w,h,sPhone.getTheme(\\\"header\\\"))\\\
|
|
|
|
term.setTextColor(sPhone.getTheme(\\\"headerText\\\"))\\\
|
|
|
|
term.setCursorPos(12,h)\\\
|
|
|
|
write(\\\"====\\\")\\\
|
|
|
|
term.setCursorPos(w-3,h)\\\
|
|
|
|
write(\\\"^^^\\\")\\\
|
|
|
|
term.setCursorPos(w-6,h)\\\
|
|
|
|
write(\\\"S\\\")\\\
|
|
|
|
end\\\
|
|
|
|
\\\
|
|
|
|
local function main()\\\
|
|
|
|
while true do\\\
|
|
|
|
redraw()\\\
|
|
|
|
local ev = {os.pullEvent()}\\\
|
|
|
|
if ev[1] == \\\"key\\\" and ev[2] == keys.leftAlt then\\\
|
|
|
|
sPhone.inHome = false\\\
|
|
|
|
term.setBackgroundColor(colors.black)\\\
|
|
|
|
term.setTextColor(colors.white)\\\
|
|
|
|
term.clear()\\\
|
|
|
|
term.setCursorPos(1,1)\\\
|
|
|
|
sleep(0.1)\\\
|
2016-11-20 17:09:16 +01:00
|
|
|
sPhone.launch(\\\"sphone.shell\\\")\\\
|
2016-11-17 15:57:42 +01:00
|
|
|
sPhone.inHome = true\\\
|
|
|
|
elseif ev[1] == \\\"mouse_click\\\" then\\\
|
|
|
|
local x, y = ev[3], ev[4]\\\
|
|
|
|
local w,h = term.getSize()\\\
|
|
|
|
if y == h then\\\
|
|
|
|
if x >= 12 and x <= 15 then\\\
|
|
|
|
sPhone.inHome = false\\\
|
|
|
|
sleep(0.1)\\\
|
2016-11-20 17:09:16 +01:00
|
|
|
sPhone.launch(\\\"sphone.appList\\\")\\\
|
2016-11-17 15:57:42 +01:00
|
|
|
sPhone.inHome = true\\\
|
|
|
|
elseif x == w-6 then\\\
|
|
|
|
sPhone.inHome = false\\\
|
|
|
|
term.setBackgroundColor(colors.black)\\\
|
|
|
|
term.setTextColor(colors.white)\\\
|
|
|
|
term.clear()\\\
|
|
|
|
term.setCursorPos(1,1)\\\
|
|
|
|
sleep(0.1)\\\
|
2016-11-20 17:09:16 +01:00
|
|
|
sPhone.launch(\\\"sphone.store\\\")\\\
|
2016-11-17 15:57:42 +01:00
|
|
|
sPhone.inHome = true\\\
|
|
|
|
elseif x <= w-1 and x >= w-3 then\\\
|
|
|
|
sPhone.inHome = false\\\
|
|
|
|
footer()\\\
|
|
|
|
sPhone.inHome = true\\\
|
|
|
|
end\\\
|
|
|
|
else\\\
|
|
|
|
local appName, appPath = getProgram(x,y)\\\
|
|
|
|
if appName then\\\
|
2016-11-20 17:09:16 +01:00
|
|
|
sPhone.inHome = false\\\
|
|
|
|
sPhone.launch(appPath)\\\
|
|
|
|
sPhone.inHome = true\\\
|
2016-11-17 15:57:42 +01:00
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
\\\
|
|
|
|
local function clockUpdate()\\\
|
|
|
|
local w,h = term.getSize()\\\
|
|
|
|
while true do\\\
|
|
|
|
if sPhone.inHome then\\\
|
|
|
|
term.setCursorBlink(false)\\\
|
|
|
|
term.setBackgroundColor(sPhone.theme[\\\"header\\\"])\\\
|
|
|
|
term.setTextColor(sPhone.theme[\\\"headerText\\\"])\\\
|
|
|
|
term.setCursorPos(1,h)\\\
|
|
|
|
write(\\\" \\\")\\\
|
|
|
|
term.setCursorPos(1,h)\\\
|
|
|
|
write(\\\" \\\"..textutils.formatTime(os.time(),true))\\\
|
|
|
|
end\\\
|
|
|
|
sleep(0)\\\
|
|
|
|
end\\\
|
|
|
|
end\\\
|
|
|
|
\\\
|
|
|
|
parallel.waitForAll(main,clockUpdate)\\\
|
|
|
|
\",\
|
|
|
|
}",
|
|
|
|
config = "{\
|
|
|
|
type = \"home\",\
|
|
|
|
name = \"Home+\",\
|
2016-11-20 17:09:16 +01:00
|
|
|
version = 2,\
|
2016-11-17 15:57:42 +01:00
|
|
|
main = \"homeplus.lua\",\
|
|
|
|
id = \"ale32bit.homeplus\",\
|
|
|
|
author = \"Ale32bit\",\
|
|
|
|
hidden = true,\
|
|
|
|
}",
|
|
|
|
}
|