VT *is* interpreter + screen buffer as one
parent
fd16702938
commit
d6a0211cb9
@ -1,223 +0,0 @@
|
|||||||
class AsciiIo.ScreenBuffer
|
|
||||||
|
|
||||||
constructor: (@cols, @lines) ->
|
|
||||||
@cursorX = 0
|
|
||||||
@cursorY = 0
|
|
||||||
@normalBuffer = []
|
|
||||||
@alternateBuffer = []
|
|
||||||
@lineData = @normalBuffer
|
|
||||||
@dirtyLines = {}
|
|
||||||
@brush = AsciiIo.Brush.create({})
|
|
||||||
|
|
||||||
setBrush: (brush) ->
|
|
||||||
@brush = brush
|
|
||||||
|
|
||||||
clear: ->
|
|
||||||
@lineData.length = 0
|
|
||||||
|
|
||||||
getLine: (n) ->
|
|
||||||
n = (if typeof n isnt "undefined" then n else @cursorY)
|
|
||||||
|
|
||||||
throw "cant getLine " + n if n >= @lines
|
|
||||||
|
|
||||||
line = @lineData[n]
|
|
||||||
|
|
||||||
if typeof line is "undefined"
|
|
||||||
line = @lineData[n] = []
|
|
||||||
@fill n, 0, @cols, " "
|
|
||||||
|
|
||||||
line
|
|
||||||
|
|
||||||
switchToNormalBuffer: ->
|
|
||||||
@lineData = @normalBuffer
|
|
||||||
@updateScreen()
|
|
||||||
|
|
||||||
switchToAlternateBuffer: ->
|
|
||||||
@lineData = @alternateBuffer
|
|
||||||
@updateScreen()
|
|
||||||
|
|
||||||
updateLine: (n) ->
|
|
||||||
n = (if typeof n isnt "undefined" then n else @cursorY)
|
|
||||||
@dirtyLines[n] = n
|
|
||||||
|
|
||||||
updateScreen: ->
|
|
||||||
@dirtyLines[n] = n for n in [0...@lines]
|
|
||||||
|
|
||||||
setCursorLine: (line) ->
|
|
||||||
oldLine = @cursorY
|
|
||||||
@cursorY = line - 1
|
|
||||||
@updateLine oldLine
|
|
||||||
@updateLine()
|
|
||||||
|
|
||||||
setCursorColumn: (col) ->
|
|
||||||
@cursorX = col - 1
|
|
||||||
@updateLine()
|
|
||||||
|
|
||||||
setCursorPos: (line, col) ->
|
|
||||||
@setCursorLine(line)
|
|
||||||
@setCursorColumn(col)
|
|
||||||
|
|
||||||
saveCursor: ->
|
|
||||||
@savedCol = @cursorX
|
|
||||||
@savedLine = @cursorY
|
|
||||||
|
|
||||||
restoreCursor: ->
|
|
||||||
oldLine = @cursorY
|
|
||||||
|
|
||||||
@cursorY = @savedLine
|
|
||||||
@cursorX = @savedCol
|
|
||||||
|
|
||||||
@updateLine oldLine
|
|
||||||
@updateLine()
|
|
||||||
|
|
||||||
cursorLeft: ->
|
|
||||||
if @cursorX > 0
|
|
||||||
@cursorX -= 1
|
|
||||||
@updateLine()
|
|
||||||
|
|
||||||
cursorRight: ->
|
|
||||||
if @cursorX < @cols
|
|
||||||
@cursorX += 1
|
|
||||||
@updateLine()
|
|
||||||
|
|
||||||
cursorUp: (n) ->
|
|
||||||
for i in [0...n]
|
|
||||||
if @cursorY > 0
|
|
||||||
@cursorY -= 1
|
|
||||||
@updateLine @cursorY
|
|
||||||
@updateLine @cursorY + 1
|
|
||||||
|
|
||||||
cursorDown: (n) ->
|
|
||||||
for i in [0...n]
|
|
||||||
if @cursorY + 1 < @lines
|
|
||||||
@cursorY += 1
|
|
||||||
@updateLine @cursorY - 1
|
|
||||||
@updateLine @cursorY
|
|
||||||
else
|
|
||||||
@lineData.splice 0, 1
|
|
||||||
@updateScreen()
|
|
||||||
|
|
||||||
cursorForward: (n) ->
|
|
||||||
@cursorRight() for i in [0...n]
|
|
||||||
|
|
||||||
cursorBack: (n) ->
|
|
||||||
@cursorLeft() for i in [0...n]
|
|
||||||
|
|
||||||
cr: ->
|
|
||||||
@cursorX = 0
|
|
||||||
@updateLine()
|
|
||||||
|
|
||||||
backspace: ->
|
|
||||||
if @cursorX > 0
|
|
||||||
@cursorLeft()
|
|
||||||
@updateLine()
|
|
||||||
|
|
||||||
print: (text) ->
|
|
||||||
text = Utf8.decode(text)
|
|
||||||
|
|
||||||
i = 0
|
|
||||||
while i < text.length
|
|
||||||
if @cursorX >= @cols
|
|
||||||
@cursorY += 1
|
|
||||||
@cursorX = 0
|
|
||||||
|
|
||||||
@fill @cursorY, @cursorX, 1, text[i]
|
|
||||||
@cursorX += 1
|
|
||||||
i++
|
|
||||||
|
|
||||||
@updateLine()
|
|
||||||
|
|
||||||
eraseData: (n) ->
|
|
||||||
if n is 0
|
|
||||||
@eraseInLine 0
|
|
||||||
|
|
||||||
l = @cursorY + 1
|
|
||||||
while l < @lines
|
|
||||||
@clearLineData l
|
|
||||||
@updateLine l
|
|
||||||
l++
|
|
||||||
|
|
||||||
else if n is 1
|
|
||||||
l = 0
|
|
||||||
while l < @cursorY
|
|
||||||
@clearLineData l
|
|
||||||
@updateLine l
|
|
||||||
l++
|
|
||||||
|
|
||||||
@eraseInLine n
|
|
||||||
|
|
||||||
else if n is 2
|
|
||||||
l = 0
|
|
||||||
while l < @lines
|
|
||||||
@clearLineData l
|
|
||||||
@updateLine l
|
|
||||||
l++
|
|
||||||
|
|
||||||
eraseInLine: (n) ->
|
|
||||||
if n is 0
|
|
||||||
@fill @cursorY, @cursorX, @cols - @cursorX, " "
|
|
||||||
else if n is 1
|
|
||||||
@fill @cursorY, 0, @cursorX, " "
|
|
||||||
else if n is 2
|
|
||||||
@fill @cursorY, 0, @cols, " "
|
|
||||||
|
|
||||||
@updateLine()
|
|
||||||
|
|
||||||
clearLineData: (n) ->
|
|
||||||
@fill n, 0, @cols, " "
|
|
||||||
|
|
||||||
deleteCharacter: (n) ->
|
|
||||||
@getLine().splice(@cursorX, n)
|
|
||||||
@updateLine()
|
|
||||||
|
|
||||||
reserveCharacters: (n) ->
|
|
||||||
line = @getLine()
|
|
||||||
@lineData[@cursorY] = line.slice(0, @cursorX).concat(" ".times(n).split(""), line.slice(@cursorX, @cols - n))
|
|
||||||
@updateLine()
|
|
||||||
|
|
||||||
ri: (n=1) ->
|
|
||||||
i = 0
|
|
||||||
while i < n
|
|
||||||
if @cursorY is 0
|
|
||||||
@insertLines n, 0
|
|
||||||
else
|
|
||||||
@cursorUp()
|
|
||||||
i++
|
|
||||||
|
|
||||||
insertLines: (n, l = @cursorY) ->
|
|
||||||
i = 0
|
|
||||||
while i < n
|
|
||||||
@lineData.splice l, 0, []
|
|
||||||
@clearLineData l
|
|
||||||
i++
|
|
||||||
|
|
||||||
# trim lineData to max size
|
|
||||||
@lineData.length = @lines
|
|
||||||
|
|
||||||
@updateScreen()
|
|
||||||
|
|
||||||
deleteLines: (n, l = @cursorY) ->
|
|
||||||
@lineData.splice l, n
|
|
||||||
|
|
||||||
# expand lineData to max size
|
|
||||||
@lineData.length = @lines
|
|
||||||
|
|
||||||
@updateScreen()
|
|
||||||
|
|
||||||
fill: (line, col, n, char) ->
|
|
||||||
lineArr = @getLine(line)
|
|
||||||
|
|
||||||
i = 0
|
|
||||||
while i < n
|
|
||||||
lineArr[col + i] = [char, @brush]
|
|
||||||
i++
|
|
||||||
|
|
||||||
changes: ->
|
|
||||||
c = {}
|
|
||||||
for _, n of @dirtyLines
|
|
||||||
c[n] = @lineData[n]
|
|
||||||
|
|
||||||
c
|
|
||||||
|
|
||||||
clearChanges: ->
|
|
||||||
@dirtyLines = {}
|
|
Loading…
Reference in New Issue