-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlayer.lua
More file actions
125 lines (102 loc) · 2.68 KB
/
layer.lua
File metadata and controls
125 lines (102 loc) · 2.68 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
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
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
}
end
--- @param windowManager IUIWindowManager
function layer.setWindowManager(windowManager)
ctx = windowManager.layer
end
function layer.beginFrame()
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()
return layer.getCurrentLayer().focusID
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
--- @return boolean
function layer.isTop()
return ctx.layerIndex == #ctx.layers
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