This repository was archived by the owner on Jan 21, 2024. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 23
Expand file tree
/
Copy pathEditMode.lua
More file actions
166 lines (139 loc) · 3.85 KB
/
EditMode.lua
File metadata and controls
166 lines (139 loc) · 3.85 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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
-- Neuron is a World of Warcraft® user interface addon.
-- Copyright (c) 2017-2021 Britt W. Yazel
-- Copyright (c) 2006-2014 Connor H. Chenoweth
-- This code is licensed under the MIT license (see LICENSE for details)
local _, addonTable = ...
addonTable.controller = addonTable.controller or {}
---@type BarEditor
local BarEditor = addonTable.overlay.BarEditor
local ButtonBinder = addonTable.overlay.ButtonBinder
local ButtonEditor = addonTable.overlay.ButtonEditor
local Array = addonTable.utilities.Array
---@class EditModeFrames
---@field binderOverlays BinderOverlay[]
---@field barOverlays BarOverlay[]
---@field buttonOverlays ButtonOverlay[]
---@class EditModeState
---@field guiState GuiBarState|GuiButtonState|GuiOffState
---@class GuiBarState
---@field kind "bar"
---@field bar Bar|false
---@field microadjust boolean
---@class GuiBindState
---@field kind "bind"
---@class GuiButtonState
---@field kind "button"
---@field button Button|false
---@class GuiStatusButtonState
---@field kind "status"
---@field button StatusButton|false
---@class GuiOffState
---@field kind "off"
---@type EditModeFrames
local views = {
barOverlays = {},
binderOverlays = {},
buttonOverlays = {},
}
---@class EditMode
local EditMode = {}
local function cleanOverlays()
for _,overlay in pairs(views.barOverlays) do
BarEditor.free(overlay)
overlay.bar:UpdateObjectVisibility()
overlay.bar:UpdateBarStatus()
overlay.bar:UpdateObjectStatus()
end
for _,overlay in pairs(views.buttonOverlays) do
ButtonEditor.free(overlay)
end
for _,overlay in pairs(views.binderOverlays) do
ButtonBinder.free(overlay)
end
views = {
barOverlays = {},
binderOverlays = {},
buttonOverlays = {},
}
end
---@param state GuiBarState
local function renderBarOverlays(state)
views.barOverlays = Array.map(
function(bar)
local overlay = BarEditor.allocate(
bar,
function(overlay, button, down)
if down then
return
end
if IsShiftKeyDown() then
addonTable.Neuron.state = EditMode.enterBarMode(state, bar, true)
else
addonTable.Neuron.state = EditMode.enterBarMode(state, bar, false)
end
--TODO: this should hit the controller, not the bar
--[[
elseif click == "RightButton" and not down then
if not addonTable.NeuronEditor then
Neuron.NeuronGUI:CreateEditor()
end
end
if addonTable.NeuronEditor then
Neuron.NeuronGUI:RefreshEditor()
end
--]]
end,
function(_)
addonTable.Neuron.state = EditMode.exit(addonTable.Neuron.state)
end
)
if state.bar == bar then
BarEditor.activate(overlay)
end
if state.bar == bar and state.microadjust then
BarEditor.microadjust(overlay)
end
bar:UpdateObjectVisibility(true)
bar:UpdateBarStatus(true)
bar:UpdateObjectStatus()
return overlay
end,
Neuron.bars
)
end
---@param state EditModeState
local function renderOverlays(state)
cleanOverlays()
if state.guiState.kind == "bar" then
renderBarOverlays(state.guiState --[[ @as GuiBarState]])
end
end
---@param state EditModeState
---@param bar Bar|false
---@param microadjust boolean
---@return EditModeState
EditMode.enterBarMode = function (state, bar, microadjust)
local newState = CopyTable(state, true)
MergeTable(newState, {
guiState={
kind="bar",
microadjust=microadjust,
bar=bar,
}
})
renderOverlays(newState)
return newState
end
---@param state EditModeState
---@return EditModeState
EditMode.exit = function (state)
local newState = CopyTable(state, true)
MergeTable(newState, {
guiState={
kind="off",
}
})
renderOverlays(newState)
return newState
end
addonTable.controller.EditMode = EditMode