Nenue@6
|
1 --- Turok - Import.lua
|
Nenue@6
|
2 -- @file-author@
|
Nenue@6
|
3 -- @project-revision@ @project-hash@
|
Nenue@6
|
4 -- @file-revision@ @file-hash@
|
Nenue@6
|
5 -- Created: 1/4/2016 11:07 AM
|
Nenue@6
|
6 -- Dialog interfaces and framework debugging tools; see the Google Doc
|
Nenue@6
|
7
|
Nenue@6
|
8 local tconcat, unpack, pairs, ipairs, tostring, string = table.concat, unpack, pairs, ipairs, tostring, string
|
Nenue@6
|
9 local BOOKTYPE_SPELL, GetSpellBookItemName, GetSpellBookItemInfo = BOOKTYPE_SPELL, GetSpellBookItemName, GetSpellBookItemInfo
|
Nenue@6
|
10 local GetSpellTabInfo, GetNumSpellTabs, GetSpellInfo, GetFlyoutInfo, GetSpellDescription = GetSpellTabInfo, GetNumSpellTabs, GetSpellInfo, GetFlyoutInfo, GetSpellDescription
|
Nenue@6
|
11 local GetFlyoutSlotInfo, GetSpellBaseCooldown, FindSpellBookSlotBySpellID, IsTalentSpell = GetFlyoutSlotInfo, GetSpellBaseCooldown, FindSpellBookSlotBySpellID, IsTalentSpell
|
Nenue@6
|
12 local GetNumClasses, GetClassInfo, GetNumSpecializationsForClassID, GetSpecializationInfoForClassID
|
Nenue@6
|
13 = GetNumClasses, GetClassInfo, GetNumSpecializationsForClassID, GetSpecializationInfoForClassID
|
Nenue@6
|
14 local _G, setmetatable, type, T = _G, setmetatable, type, Turok
|
Nenue@6
|
15 local mod = Turok.modules.TimerControl
|
Nenue@6
|
16 mod.EditDialog = TkTimerConfig
|
Nenue@6
|
17 mod.SelectDialog = {}
|
Nenue@6
|
18
|
Nenue@6
|
19 local print = function(...)
|
Nenue@6
|
20 if Devian and DevianDB.workspace ~= 1 then
|
Nenue@6
|
21 print('Dialog', ...)
|
Nenue@6
|
22 end
|
Nenue@6
|
23 end
|
Nenue@6
|
24 local strpad = function(str, num)
|
Nenue@6
|
25 return tostring(str) .. string.rep(' ', num - #tostring(str))
|
Nenue@6
|
26 end
|
Nenue@6
|
27
|
Nenue@6
|
28 --- Handles mouse click on spellbook row frame
|
Nenue@6
|
29 mod.SpellBook_Click = function(self, btn)
|
Nenue@6
|
30 print('mouse', btn, self.spellID)
|
Nenue@6
|
31 mod.Dialog_Select(mod.EditDialog, self.spellID)
|
Nenue@6
|
32 end
|
Nenue@6
|
33
|
Nenue@6
|
34 --- Creates the spell book import frame
|
Nenue@6
|
35 --
|
Nenue@6
|
36 local cmd
|
Nenue@6
|
37 function mod.Import_Open()
|
Nenue@6
|
38 local self = mod
|
Nenue@6
|
39 print('Spirit', 'SpecSpells')
|
Nenue@6
|
40 local book_list = {}
|
Nenue@6
|
41 local tab = {}
|
Nenue@6
|
42 local list_info = {}
|
Nenue@6
|
43 local book_max = 0
|
Nenue@6
|
44 for k = 1, GetNumSpellTabs() do
|
Nenue@6
|
45 local name, texture, offset, numSpells = GetSpellTabInfo(k)
|
Nenue@6
|
46 tab[offset] = {k, name, texture, numSpells}
|
Nenue@6
|
47 print('Spirit', name, offset, numSpells)
|
Nenue@6
|
48 book_max = offset + numSpells
|
Nenue@6
|
49 end
|
Nenue@6
|
50 local tabID, tabName, tabTexture
|
Nenue@6
|
51 local flyout, spellflyout = {}, {}
|
Nenue@6
|
52 for i = 1, book_max do
|
Nenue@6
|
53 if tab[i] then
|
Nenue@6
|
54 tabID, tabName, tabTexture = unpack(tab[i])
|
Nenue@6
|
55 end
|
Nenue@6
|
56
|
Nenue@6
|
57 if book_list[i] == nil then
|
Nenue@6
|
58 local skillType, spellID = GetSpellBookItemInfo(i, BOOKTYPE_SPELL)
|
Nenue@6
|
59 local spellNameUpper, spellSubText = GetSpellBookItemName(i, BOOKTYPE_SPELL)
|
Nenue@6
|
60 local spellName, spellRank, spellTexture, castTime, minRange, maxRange = GetSpellInfo(spellID)
|
Nenue@6
|
61 _G.print('Spirit', i, spellID, spellName)
|
Nenue@6
|
62 _G.print('Spirit', ' ', skillType, spellSubText)
|
Nenue@6
|
63
|
Nenue@6
|
64 local spellDesc
|
Nenue@6
|
65 if skillType == 'FLYOUT' then
|
Nenue@6
|
66 local numSlots
|
Nenue@6
|
67 spellName, spellDesc, numSlots = GetFlyoutInfo(spellID)
|
Nenue@6
|
68 print('flyout #'..spellID..':', spellName)
|
Nenue@6
|
69 flyout[spellID] = {}
|
Nenue@6
|
70 for i=1, numSlots do
|
Nenue@6
|
71 local fspellID, _, isKnown, fSpellName, fSpellValue = GetFlyoutSlotInfo(spellID, i)
|
Nenue@6
|
72 print(' spell #', fspellID, fSpellName, isKnown)
|
Nenue@6
|
73 if isKnown then
|
Nenue@6
|
74 flyout[spellID][i] = fspellID
|
Nenue@6
|
75 spellflyout[fspellID] = spellID
|
Nenue@6
|
76 end
|
Nenue@6
|
77 end
|
Nenue@6
|
78
|
Nenue@6
|
79 else
|
Nenue@6
|
80 spellDesc = GetSpellDescription(spellID)
|
Nenue@6
|
81 end
|
Nenue@6
|
82
|
Nenue@6
|
83 book_list[i] = {
|
Nenue@6
|
84 skillType = skillType,
|
Nenue@6
|
85 spellIndex = i,
|
Nenue@6
|
86 spellID = spellID,
|
Nenue@6
|
87 spellName = spellName,
|
Nenue@6
|
88 spellDesc = spellDesc,
|
Nenue@6
|
89 spellNameUpper = spellNameUpper,
|
Nenue@6
|
90 spellSubText = spellSubText,
|
Nenue@6
|
91 spellTexture = spellTexture,
|
Nenue@6
|
92 spellCooldown = GetSpellBaseCooldown(spellID),
|
Nenue@6
|
93 castTime = castTime,
|
Nenue@6
|
94 minRange = minRange,
|
Nenue@6
|
95 maxRange = maxRange,
|
Nenue@6
|
96 tabID = tabID,
|
Nenue@6
|
97 tabName = tabName,
|
Nenue@6
|
98 tabTexture = tabTexture
|
Nenue@6
|
99 }
|
Nenue@6
|
100
|
Nenue@6
|
101
|
Nenue@6
|
102
|
Nenue@6
|
103 end
|
Nenue@6
|
104 end
|
Nenue@6
|
105
|
Nenue@6
|
106 local selector = CreateFrame('Frame', 'TkSpellSelector', UIParent, 'TurokListFrame')
|
Nenue@6
|
107 self.frames.selector = selector
|
Nenue@6
|
108 selector.name:SetText("Spells")
|
Nenue@6
|
109 selector:SetPoint('TOP')
|
Nenue@6
|
110 selector.page = 1
|
Nenue@6
|
111
|
Nenue@6
|
112 selector.GetRow = function(row, info, id, item_num)
|
Nenue@6
|
113 print(' ', row:GetName(), info, id, item_num)
|
Nenue@6
|
114 if not row.opts then
|
Nenue@6
|
115 row.opts = {
|
Nenue@6
|
116 CreateFrame('CheckButton', 'TkCheck_'..item_num, row, 'TurokCheckButtonInline'),
|
Nenue@6
|
117 row:CreateFontString('TextItem_'..item_num, 'OVERLAY', 'TurokFontDetail'),
|
Nenue@6
|
118 row:CreateTexture(nil, 'OVERLAY'),
|
Nenue@6
|
119 row:CreateTexture(nil, 'OVERLAY'),
|
Nenue@6
|
120 row:CreateFontString('TextItem_'..item_num..'ID', 'OVERLAY', 'TurokFontDetail'),
|
Nenue@6
|
121 }
|
Nenue@6
|
122 end
|
Nenue@6
|
123 local page = book_list[id]
|
Nenue@6
|
124 if page.skillType == 'FLYOUT' then
|
Nenue@6
|
125 row.background:SetTexture(1,.2,.3,.4)
|
Nenue@6
|
126
|
Nenue@6
|
127 elseif rawget(mod.frames.spellID, page.spellID) then
|
Nenue@6
|
128 print('has timer frame under spell #', page.spellID, mod.frames.spellID[page.spellID])
|
Nenue@6
|
129 row.background:SetTexture(1,1,0,1)
|
Nenue@6
|
130 local timer = mod.frames.spellID[page.spellID]
|
Nenue@6
|
131 row:SetScript('OnMouseDown', function(self) self.clicked = true end)
|
Nenue@6
|
132 row:SetScript('OnMouseUp', function(self) if self.clicked then self.clicked = nil mod.Dialog_Select(mod.Editor, timer.timerName) end end)
|
Nenue@6
|
133 elseif page.spellCooldown and page.spellCooldown > 0 then
|
Nenue@6
|
134 row.background:SetTexture(.3,.6,1,1)
|
Nenue@6
|
135 else
|
Nenue@6
|
136 row.background:SetTexture(0,0,0,0.3)
|
Nenue@6
|
137 end
|
Nenue@6
|
138
|
Nenue@6
|
139 row:SetScript('OnMouseDown', mod.SpellBook_Click)
|
Nenue@6
|
140
|
Nenue@6
|
141 row.desc = page.spellDesc
|
Nenue@6
|
142 row.spellID = page.spellID
|
Nenue@6
|
143 row.opts[1].desc = page.skillType
|
Nenue@6
|
144 row.opts[1]:SetSize(20,20)
|
Nenue@6
|
145 row.opts[1].description:SetText(nil)
|
Nenue@6
|
146 row.opts[1]:SetChecked(page.checked)
|
Nenue@6
|
147 row.opts[2]:SetText(page.spellName)
|
Nenue@6
|
148 row.opts[2]:SetWidth(200)
|
Nenue@6
|
149 row.opts[2]:SetJustifyH('LEFT')
|
Nenue@6
|
150 row.opts[3]:SetSize(20,20)
|
Nenue@6
|
151 row.opts[3]:SetTexture(page.spellTexture)
|
Nenue@6
|
152 row.opts[3]:SetPoint('CENTER')
|
Nenue@6
|
153 row.opts[4]:SetSize(20,20)
|
Nenue@6
|
154 row.opts[4]:SetTexture(page.tabTexture)
|
Nenue@6
|
155 row.opts[4]:SetPoint('CENTER')
|
Nenue@6
|
156 row.opts[5]:SetWidth(60)
|
Nenue@6
|
157 row.opts[5]:SetJustifyH('LEFT')
|
Nenue@6
|
158 row.opts[5]:SetText(page.spellID)
|
Nenue@6
|
159 end
|
Nenue@6
|
160
|
Nenue@6
|
161 selector.Click = function(button, list)
|
Nenue@6
|
162 local b = button:GetName():match("_(%a+)$")
|
Nenue@6
|
163 if b == 'Prev' then
|
Nenue@6
|
164 --print(b, list.offset, list.num_rows)
|
Nenue@6
|
165 if list.page > 1 then
|
Nenue@6
|
166 list.page = list.page - 1
|
Nenue@6
|
167 TkList_SetView(list, list.num_rows * (list.page-1) + 1)
|
Nenue@6
|
168 end
|
Nenue@6
|
169 list.pagenum:SetText(list.page)
|
Nenue@6
|
170 elseif b == 'Next' then
|
Nenue@6
|
171 --print(' ',list.page, list.num_rows, list.max_row)
|
Nenue@6
|
172 if (list.page) * list.num_rows < list.max_row then
|
Nenue@6
|
173 list.page = list.page + 1
|
Nenue@6
|
174 TkList_SetView(list, list.offset + list.num_rows)
|
Nenue@6
|
175 end
|
Nenue@6
|
176 list.pagenum:SetText(list.page)
|
Nenue@6
|
177
|
Nenue@6
|
178 elseif b == 'Add' then
|
Nenue@6
|
179 mod.CommitBook(book_list, tab, list_info)
|
Nenue@6
|
180 end
|
Nenue@6
|
181 --print(list.page, list.offset, list.num_rows)
|
Nenue@6
|
182 end
|
Nenue@6
|
183
|
Nenue@6
|
184 selector.Wheel = function(self, delta)
|
Nenue@6
|
185 local offset = self.offset - delta
|
Nenue@6
|
186 if offset > 0 and offset <= (self.max_row - self.num_rows) then
|
Nenue@6
|
187 TkList_SetView(self, offset)
|
Nenue@6
|
188 end
|
Nenue@6
|
189 end
|
Nenue@6
|
190
|
Nenue@6
|
191 selector.Check = function(checkbutton, row, list)
|
Nenue@6
|
192 local index = checkbutton:GetParent().actual_row
|
Nenue@6
|
193 book_list[index].checked = (not book_list[index].checked) and true or false
|
Nenue@6
|
194 checkbutton:SetChecked(book_list[index].checked)
|
Nenue@6
|
195
|
Nenue@6
|
196 if book_list[index].skillType == 'FLYOUT' then
|
Nenue@6
|
197 for slot, spellID in pairs(flyout[book_list[index].spellID]) do
|
Nenue@6
|
198
|
Nenue@6
|
199 local spIndex = FindSpellBookSlotBySpellID(spellID)
|
Nenue@6
|
200 print(' also toggling', slot, spellID, ' book slot', spIndex, book_list[spIndex].spellName)
|
Nenue@6
|
201 book_list[spIndex].checked = book_list[index].checked
|
Nenue@6
|
202 end
|
Nenue@6
|
203 TkList_SetView(list, list.offset)
|
Nenue@6
|
204 end
|
Nenue@6
|
205 end
|
Nenue@6
|
206 TkList_Init(selector, book_list, 1, 12)
|
Nenue@6
|
207 selector:Show()
|
Nenue@6
|
208 mod.SelectDialog = selector
|
Nenue@6
|
209 end
|
Nenue@6
|
210 --@end-debug@
|
Nenue@6
|
211
|
Nenue@6
|
212
|
Nenue@6
|
213 function mod.CommitBook(bookInfo, tabInfo, uiInfo)
|
Nenue@6
|
214 print('committing')
|
Nenue@6
|
215 print(' book data: ', #bookInfo, 'entries')
|
Nenue@6
|
216 print(' tab data: ', #tabInfo, 'entries')
|
Nenue@6
|
217
|
Nenue@6
|
218 for index, e in ipairs(bookInfo) do
|
Nenue@6
|
219 if e.checked then
|
Nenue@6
|
220 local spellPretext = ''
|
Nenue@6
|
221 if IsTalentSpell(index) then
|
Nenue@6
|
222 spellPretext = 'Talent'
|
Nenue@6
|
223 end
|
Nenue@6
|
224 print(' ', strpad(spellPretext .. e.spellName, 20))
|
Nenue@6
|
225 print(' ', strpad(e.spellSubText, 10), strpad(e.spellCooldown,5), strpad(e.skillType,6))
|
Nenue@6
|
226
|
Nenue@6
|
227 end
|
Nenue@6
|
228 end
|
Nenue@6
|
229 end
|
Nenue@6
|
230
|
Nenue@6
|
231
|
Nenue@6
|
232
|
Nenue@6
|
233
|
Nenue@6
|
234 --- /tki command
|
Nenue@6
|
235 -- Constructs an index that associates global spec ID's with a list of the timers that would display under it.
|
Nenue@6
|
236 -- List entries are stored as [name] = true to prevent duplication of values in SavedVariables.
|
Nenue@6
|
237
|
Nenue@6
|
238 function mod:CreateIndex()
|
Nenue@6
|
239
|
Nenue@6
|
240 --@debug@ Revert config to defaults
|
Nenue@6
|
241 _G.TurokData = T.defaults
|
Nenue@6
|
242 --@end-debug@
|
Nenue@6
|
243
|
Nenue@6
|
244 mod.db.timerindex = {}
|
Nenue@6
|
245 setmetatable(mod.db.timerindex, {__mode = "v"}) -- ensure that dead leafs fall off
|
Nenue@6
|
246 local index = mod.index
|
Nenue@6
|
247 local timers = mod.timersByName
|
Nenue@6
|
248
|
Nenue@6
|
249 -- build class info hash and create subtables
|
Nenue@6
|
250 local classID = {}
|
Nenue@6
|
251 local className = {}
|
Nenue@6
|
252 local specIDPage = {}
|
Nenue@6
|
253 local specPageID = {}
|
Nenue@6
|
254 local classSpecs = {}
|
Nenue@6
|
255 print('|cFF0088FFCreateIndex|r')
|
Nenue@6
|
256
|
Nenue@6
|
257 --- use the internal class/specialization list
|
Nenue@6
|
258 for i = 1, GetNumClasses() do
|
Nenue@6
|
259 local _, tag, id = GetClassInfo(i)
|
Nenue@6
|
260 classID[tag] = id
|
Nenue@6
|
261 className[id] = tag
|
Nenue@6
|
262 index[id] = {}
|
Nenue@6
|
263 specPageID[tag] = {}
|
Nenue@6
|
264 index[tag] = index[id]
|
Nenue@6
|
265
|
Nenue@6
|
266 classSpecs[tag] = GetNumSpecializationsForClassID(id)
|
Nenue@6
|
267 for j = 1, classSpecs[tag] do
|
Nenue@6
|
268 local specID, specName = GetSpecializationInfoForClassID(id, j)
|
Nenue@6
|
269 print('|cFFFF0088map:|r', tag, j, specID, specName)
|
Nenue@6
|
270 specIDPage[specID] = j
|
Nenue@6
|
271 specPageID[tag][j] = specID
|
Nenue@6
|
272 index[specID] = {}
|
Nenue@6
|
273 index[id][j] = {}
|
Nenue@6
|
274 end
|
Nenue@6
|
275 end
|
Nenue@6
|
276 index.global = {}
|
Nenue@6
|
277
|
Nenue@6
|
278 for name,timer in pairs(timers) do
|
Nenue@6
|
279 -- class is set
|
Nenue@6
|
280 if type(timer) == 'table' then
|
Nenue@6
|
281 print(name)
|
Nenue@6
|
282 if timer.playerClass then
|
Nenue@6
|
283
|
Nenue@6
|
284 index[timer.playerClass][name] = true
|
Nenue@6
|
285
|
Nenue@6
|
286 -- spec restricted
|
Nenue@6
|
287 if timer.specPage then
|
Nenue@6
|
288 if type(timer.specPage) ~= 'table' then
|
Nenue@6
|
289 -- fix it up
|
Nenue@6
|
290 timer.specPage = {timer.specPage }
|
Nenue@6
|
291 end
|
Nenue@6
|
292
|
Nenue@6
|
293 print(' |cFFFFFF00class:|r', timer.playerClass .. ', |cFF99FF00spec:|r '.. tconcat(timer.specPage,', '))
|
Nenue@6
|
294 for _, specPage in ipairs(timer.specPage) do
|
Nenue@6
|
295 index[timer.playerClass][specPage][name] = true
|
Nenue@6
|
296 index[specPageID[timer.playerClass][specPage]][name] = true
|
Nenue@6
|
297 end
|
Nenue@6
|
298
|
Nenue@6
|
299 -- no spec restriction, copy it out
|
Nenue@6
|
300 elseif not timer.specID then
|
Nenue@6
|
301 print(' |cFFFFFF00class:|r', timer.playerClass .. ', |cFF99FF00spec:|r ALL')
|
Nenue@6
|
302 for i = 1, classSpecs[timer.playerClass] do
|
Nenue@6
|
303 local specID = specPageID[timer.playerClass][i]
|
Nenue@6
|
304
|
Nenue@6
|
305 index[timer.playerClass][i][name] = true -- store for local ID
|
Nenue@6
|
306 index[specID][name] = true -- store for global ID
|
Nenue@6
|
307 end
|
Nenue@6
|
308 end
|
Nenue@6
|
309 end
|
Nenue@6
|
310
|
Nenue@6
|
311 if timer.specID then
|
Nenue@6
|
312 index[timer.specID][name] = true
|
Nenue@6
|
313 end
|
Nenue@6
|
314
|
Nenue@6
|
315 if not (timer.playerClass or timer.specID or timer.specPage) then
|
Nenue@6
|
316 for tag, id in pairs(classID) do
|
Nenue@6
|
317 index[tag][name] = true
|
Nenue@6
|
318 for specPage, specID in pairs(specPageID[tag]) do
|
Nenue@6
|
319 index[tag][specPage][name] = true
|
Nenue@6
|
320 index[specID][name] = true
|
Nenue@6
|
321 end
|
Nenue@6
|
322 end
|
Nenue@6
|
323 print(' |cFFFFFF00class:|r ALL, |cFF99FF00spec:|r ALL')
|
Nenue@6
|
324 end
|
Nenue@6
|
325 end
|
Nenue@6
|
326 end
|
Nenue@6
|
327
|
Nenue@6
|
328 _G.TurokData.timerindex = index
|
Nenue@6
|
329 T:Print('Hive data updated. /rl to commit.')
|
Nenue@6
|
330 end
|