6 | 6 |
|
7 | 7 |
type
|
8 | 8 |
LayoutTag* {.pure.} = enum
|
9 | |
center, left, right
|
|
9 |
center, left, right,
|
|
10 |
floatCenter
|
10 | 11 |
|
11 | 12 |
Layer* = ref object
|
12 | 13 |
blit*: Blit
|
|
18 | 19 |
size: Size
|
19 | 20 |
tb: illwill.TerminalBuffer
|
20 | 21 |
layers: seq[Layer]
|
|
22 |
focus: int
|
21 | 23 |
|
22 | 24 |
proc size*(l: Layer): Size = l.dst.size()
|
23 | 25 |
proc size*(c: Comp): Size = c.size
|
|
47 | 49 |
tb: newTerminalBuffer(size.w, size.h),
|
48 | 50 |
layers: newSeq[Layer]())
|
49 | 51 |
|
50 | |
proc layout(c: var Comp) =
|
|
52 |
proc lrc(c: Comp): (Layer, Layer, Layer) =
|
51 | 53 |
var
|
52 | 54 |
lcenter: Layer = nil
|
53 | 55 |
lleft: Layer = nil
|
|
63 | 65 |
of left:
|
64 | 66 |
if lleft == nil:
|
65 | 67 |
lleft = layer
|
|
68 |
else:
|
|
69 |
discard
|
|
70 |
return (lleft, lcenter, lright)
|
|
71 |
|
|
72 |
proc layout(c: var Comp) =
|
|
73 |
let (lleft, lcenter, lright) = lrc(c)
|
66 | 74 |
|
67 | 75 |
var present = 0
|
68 | 76 |
let full = rectFromSize(c.size)
|
|
102 | 110 |
proc paint*(c: var Comp) =
|
103 | 111 |
c.layout()
|
104 | 112 |
c.tb.clear()
|
105 | |
for layer in c.layers:
|
|
113 |
for index, layer in c.layers:
|
106 | 114 |
for point in pointsInside(@[layer.dst]):
|
107 | |
c.tb.write(point.x, point.y, layer.get(point)[0].toUTF8)
|
|
115 |
let ch = layer.get(point)
|
|
116 |
c.tb[point.x, point.y] = TerminalChar(
|
|
117 |
ch: ch[0],
|
|
118 |
fg: fgNone,
|
|
119 |
bg: if index == c.focus: bgBlack else: bgWhite,
|
|
120 |
style: {})
|
108 | 121 |
c.tb.display()
|
109 | 122 |
|
110 | 123 |
proc pushlayer*(c: var Comp, l: Layer) =
|
111 | |
c.layers.add(l)
|
|
124 |
c.layers.insert(l, 0)
|
|
125 |
c.focus = c.layers.len - 1
|
112 | 126 |
|
113 | 127 |
proc poplayer*(c: var Comp) =
|
114 | |
c.layers.delete(c.layers.len - 1)
|
|
128 |
let i = c.layers.len - 1
|
|
129 |
c.layers.delete(i)
|
|
130 |
c.focus = 0
|
|
131 |
|
|
132 |
proc focused*(c: Comp): Layer =
|
|
133 |
return c.layers[c.focus]
|
|
134 |
|
|
135 |
proc refocus*(c: var Comp, l: Layer) =
|
|
136 |
for i, layer in c.layers:
|
|
137 |
if l == layer:
|
|
138 |
c.focus = i
|
|
139 |
return
|
115 | 140 |
|
116 | 141 |
proc `size=`*(c: var Comp, s: Size) =
|
117 | 142 |
c.tb = newTerminalBuffer(s.w, s.h)
|