-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlayer.lua
More file actions
130 lines (107 loc) · 2.83 KB
/
layer.lua
File metadata and controls
130 lines (107 loc) · 2.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
local currentPath = (...):match('(.-)[^%./]+$')
--- @class IUILib
local iui = require(currentPath .. "iui")
--- @class IUILayer
--- @field name string
--- @field focusID? number
--- @field lastID? number
local layer = {}
--- @class (exact) IUILayerRootContext
--- @field layers IUILayer[]
--- @field newLayers IUILayer[]
--- @field layerIndex number
--- @field isUnwinding boolean
--- @field isDrawing boolean
local ctx --- @type IUILayerRootContext
local function isInputActive()
return (#ctx.newLayers == #ctx.layers) and (not ctx.isUnwinding)
end
local function setInputActive()
iui.input.setActive(isInputActive())
end
--- @return IUILayer
function layer.getCurrentLayer()
return ctx.newLayers[ctx.layerIndex]
end
--- @return IUILayerRootContext
function layer.newRootContext()
--- @type IUILayerRootContext
return {
layers = {},
newLayers = {},
layerIndex = 0,
isUnwinding = false,
isDrawing = false
}
end
--- @param rootContext IUIRootContext
function layer.setRootContext(rootContext)
ctx = rootContext.layer
end
function layer.beginFrame()
ctx.isDrawing = false
ctx.layerIndex = 0
ctx.newLayers = {}
iui.beginLayer("__root")
setInputActive()
end
function layer.endFrame()
iui.endLayer()
ctx.layers = ctx.newLayers
ctx.isUnwinding = false
end
--- @return number? id
function layer.getFocusID()
if (not ctx.isDrawing) or (ctx.layerIndex == #ctx.newLayers) then
return layer.getCurrentLayer().focusID
end
end
--- @param id? number
function layer.setFocusID(id)
layer.getCurrentLayer().focusID = id
end
--- @return number? id
function layer.getLastID()
return layer.getCurrentLayer().lastID
end
--- @param id? number
function layer.setLastID(id)
layer.getCurrentLayer().lastID = id
end
function layer.willDrawLayer(index)
ctx.isDrawing = true
ctx.layerIndex = index
end
function iui.beginLayer(name)
if ctx.isUnwinding then
error("Attempt to begin layer after having ended layers")
end
ctx.layerIndex = ctx.layerIndex + 1
if #ctx.newLayers < #ctx.layers then
local existing = ctx.layers[#ctx.newLayers + 1]
if existing.name == name then
table.insert(ctx.newLayers, existing)
else
ctx.layers = ctx.newLayers
--- @type IUILayer
local newLayer = { name = name }
table.insert(ctx.newLayers, newLayer)
end
else
--- @type IUILayer
local newLayer = { name = name }
table.insert(ctx.newLayers, newLayer)
end
setInputActive()
iui.draw.beginContext()
end
function iui.endLayer()
ctx.isUnwinding = true
ctx.layerIndex = ctx.layerIndex - 1
if ctx.layerIndex < 0 then
error("Layer index underflow")
end
setInputActive()
iui.draw.endContext()
end
iui.layer = layer