Advertisement
Pinkishu

screens-API

Aug 13th, 2012
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.16 KB | None | 0 0
  1. local screens = {}
  2. local screenFuncs = {}
  3.  
  4. local activeScreen = nil
  5. local displayScreen = nil
  6.  
  7. local termHooks = {}
  8. local hookFuncs = {}
  9. local screenSizeX,screenSizeY = term.getSize()
  10.  
  11.  
  12. local function unhookTerm()
  13.     for k,v in pairs(termHooks) do
  14.         term[k] = v
  15.     end
  16. end
  17.  
  18. function getScreenByName(screenID)
  19.     return screens[screenID]
  20. end
  21.  
  22. function getActiveScreen()
  23.     return getScreenByName(activeScreen)
  24. end
  25.  
  26. function getDisplayScreen()
  27.     return getScreenByName(displayScreen)
  28. end
  29.  
  30. function setActiveScreen(screenID)
  31.  
  32.     activeScreen = screenID
  33.     log("Changed active screen to "..screenID)
  34. end
  35.  
  36. function setDisplayScreen(screenID)
  37.     displayScreen = screenID
  38.     log("Changed display screen to "..screenID)
  39.     --setActiveScreen(screenID)
  40.     local screen = getDisplayScreen()
  41.     screen:redrawAll()
  42.     log("Display Screen CPOS:" .. screen.cursorPosX.."/"..screen.cursorPosY.." // Blink: " ..tostring(screen.cursorBlink))
  43.     termHooks.setCursorBlink(screen.cursorBlink)
  44.     termHooks.setCursorPos(screen.cursorPosX,screen.cursorPosY)
  45.     termHooks.setCursorBlink(screen.cursorBlink)
  46. end
  47.  
  48. function setActiveAndDisplayScreen(screenID)
  49.     setActiveScreen(screenID)
  50.     setDisplayScreen(screenID)
  51. end
  52.  
  53. function addScreen(screen)
  54.     screens[screen.screenName] = screen
  55.     log("Screen added: "..screen.screenName)
  56. end
  57.  
  58. function screenFuncs:redraw(sX,sY,w,h)
  59.     log("Redrawing screen "..self.screenName.." Area: "..sX.."/"..sY.."/"..w.."/"..h)
  60.     for y=1,h,1 do
  61.        
  62.         termHooks.setCursorPos(sX,sY+y-1)
  63.         termHooks.write(string.sub(self.screenData[sY+y-1],sX,sX+w-1))
  64.     end
  65.     log("Redraw done")
  66. end
  67.  
  68. function screenFuncs:redrawAll()
  69.     log("Full redraw of screen "..self.screenName)
  70.     self:redraw(1,1,screenSizeX,screenSizeY)
  71. end
  72.  
  73. function initBlankScreenData()
  74.     local data = {}
  75.     local dataLine = string.rep(" ",screenSizeX)
  76.     for y=1,screenSizeY,1 do
  77.         table.insert(data,dataLine)
  78.     end
  79.     return data
  80. end
  81.  
  82. function newScreen(screenName,autoAdd)
  83.     autoAdd = autoAdd or true
  84.     local t = {}
  85.  
  86.     t.screenName = screenName
  87.     t.screenData = initBlankScreenData()
  88.     t.cursorBlink = true
  89.     t.cursorPosX,t.cursorPosY = 1,1
  90.     setmetatable(t,{__index=screenFuncs})
  91.     log("Screen created: " .. screenName)
  92.     if autoAdd then addScreen(t) end
  93.     return t
  94. end
  95.  
  96. function removeScreen(screenName)
  97.     local screen = getActiveScreen()
  98.     local screenD = getDisplayScreen()
  99.     screens[screenName] = nil
  100.     if screen.screenName == screenName then
  101.         setActiveScreen("shell")
  102.     end
  103.     if screenD.screenName == screenName then
  104.         setDisplayScreen("shell")
  105.     end
  106.  
  107. end
  108.  
  109. hookFuncs.write = function(str)
  110.  
  111.     local screen = getActiveScreen()
  112.     log("Writeing /"..str.."/ on /"..screen.screenName.."/")
  113.     local wLine = screen.screenData[screen.cursorPosY]
  114.     local sX = screen.cursorPosX
  115.     local pre = ""
  116.     if sX > 1 then
  117.         pre = string.sub(wLine,1,sX-1)
  118.     end
  119.     local post = ""
  120.     sX = screen.cursorPosX + string.len(str)
  121.     if sX <= screenSizeX then
  122.         post = string.sub(wLine,sX)
  123.     end
  124.     local newLine = string.sub(pre..str..post,1,screenSizeX)
  125.     screen.screenData[screen.cursorPosY] = newLine
  126.     if getDisplayScreen().screenName == screen.screenName then
  127.         screen:redraw(screen.cursorPosX,screen.cursorPosY,string.len(str),1)
  128.     end
  129.     screen.cursorPosX = math.min(screen.cursorPosX + string.len(str),screenSizeX)
  130. end
  131.  
  132. hookFuncs.getCursorPos = function()
  133.  
  134.     local screen = getActiveScreen()
  135.     --log("Cursor pos of "..screen.screenName)
  136.     return screen.cursorPosX,screen.cursorPosY
  137. end
  138.  
  139. hookFuncs.setCursorPos = function(x,y)
  140.     local screen = getActiveScreen()
  141.     x = math.min(screenSizeX,x)
  142.     x = math.max(x,1)
  143.     y= math.min(screenSizeY,y)
  144.     y = math.max(y,1)
  145.     screen.cursorPosX,screen.cursorPosY = x,y
  146.     if getDisplayScreen().screenName == screen.screenName then
  147.         termHooks.setCursorPos(x,y)
  148.     end
  149. end
  150.  
  151. hookFuncs.clearLine = function()
  152.     local screen = getActiveScreen()
  153.     screen.screenData[screen.cursorPosY] = string.rep(" ",screenSizeX)
  154.     if getDisplayScreen().screenName == screen.screenName then
  155.         screen:redraw(1,screen.cursorPosY,screenSizeX,1)
  156.     end
  157. end
  158.  
  159. hookFuncs.setCursorBlink = function(b)
  160.     local screen = getActiveScreen()
  161.     screen.cursorBlink = b
  162.     log("Change Cursor Blink on " .. screen.screenName .. " to "..tostring(b))
  163.     if getDisplayScreen().screenName == screen.screenName then termHooks.setCursorBlink(b) end
  164. end
  165.  
  166. hookFuncs.clear = function()
  167.     local screen = getActiveScreen()
  168.     log("Clearing: "..screen.screenName)
  169.     screen.screenData = initBlankScreenData()
  170.     if getDisplayScreen().screenName == screen.screenName then screen:redrawAll() end
  171. end
  172.  
  173. hookFuncs.scroll = function(n)
  174.     if n <= screenSizeY then
  175.         term.clear()
  176.     else
  177.         local screen = getActiveScreen()
  178.         for y=1,screenSizeY-n,1 do
  179.             screen.screenData[y] = screen.screenData[y+n]
  180.         end
  181.         for y=screenSizeY-n+1,screenSizeY,1 do
  182.             screen.screenData[y] = string.rep(" ",screenSizeX)
  183.         end
  184.         if screen.screenName == getDisplayScreen().screenName then
  185.             screen:redrawAll()
  186.         end
  187.     end
  188. end
  189.  
  190. local function hookTerm()
  191.     log("Hooking term funcs")
  192.     for k,v in pairs(hookFuncs) do
  193.         log("Hooking "..k)
  194.         --print("Hooking: "..k)
  195.         termHooks[k]=term[k]
  196.         term[k]=v
  197.     end
  198. end
  199. hookTerm()
  200. log("Creating shell screen")
  201. newScreen("shell")
  202. setActiveAndDisplayScreen("shell")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement