jale/multiline.nim

108 lines
1.9 KiB
Nim

# multiline.nim
import line
type
Multiline* = ref object
lines: seq[Line]
x,y: int
# getters/setters
proc X*(ml: Multiline): int =
ml.x
proc Y*(ml: Multiline): int =
ml.y
# constructor
proc newMultiline*: Multiline =
new(result)
result.lines = @[]
result.lines.add(newLine())
result.x = 0
result.y = 0
# methods
proc lineLen*(ml: Multiline): int =
ml.lines[ml.y].content.len()
proc lineHigh*(ml: Multiline): int =
ml.lineLen() - 1
proc len*(ml: Multiline): int =
ml.lines.len()
proc high*(ml: Multiline): int =
ml.lines.high()
proc left*(ml: Multiline) =
if ml.x > 0:
dec ml.x
proc right*(ml: Multiline) =
if ml.x < ml.lineLen():
inc ml.x
proc up*(ml: Multiline) =
if ml.y > 0:
dec ml.y
if ml.x > ml.lineLen():
ml.x = ml.lineLen()
proc down*(ml: Multiline) =
if ml.y < ml.lines.high():
inc ml.y
if ml.x > ml.lineLen():
ml.x = ml.lineLen()
proc insert*(ml: Multiline, str: string) =
ml.lines[ml.y].insert(str, ml.x)
ml.x += str.len()
proc delete*(ml: Multiline) =
if ml.x < ml.lineLen():
ml.lines[ml.y].delete(ml.x, ml.x)
proc backspace*(ml: Multiline) =
if ml.x > 0:
ml.lines[ml.y].delete(ml.x - 1, ml.x - 1)
dec ml.x
proc insertline*(ml: Multiline) =
# TODO split line support
if ml.y == ml.lines.high():
ml.lines.add(newLine())
else:
ml.lines.insert(newLine(), ml.y + 1)
inc ml.y
ml.x = 0
proc clearline*(ml: Multiline) =
ml.lines[ml.y].content = ""
proc removeline*(ml: Multiline) =
ml.lines.delete(ml.y)
if ml.lines.len() == 0:
ml.lines.add(newLine())
if ml.y > ml.lines.high():
dec ml.y
proc getLine*(ml: Multiline, line: int = -1): string =
if line == -1:
ml.lines[ml.y].content
else:
if line >= 0 and line <= ml.lines.high():
ml.lines[line].content
else:
""
proc getContent*(ml: Multiline): string =
for line in ml.lines:
result &= line.content & "\n"
result[0..result.high()-1] # cut finishing newline