Mercurial > wow > turok
view Turok/Modules/Timer/Import.lua @ 9:9400a0ff8540
Ugh
Timer:
- container update directionality
- talent update iterates over a non-volatile table to carry out updates
- index management steps organized
- talentRow status implemented, returns the spell associated with the talent chosen from that row
CombatLog:
- sort out font controls and unbork arguments
author | Nenue |
---|---|
date | Sun, 21 Feb 2016 13:08:30 -0500 |
parents | a9b8b0866ece |
children |
line wrap: on
line source
--- Turok - Import.lua -- @file-author@ -- @project-revision@ @project-hash@ -- @file-revision@ @file-hash@ -- Created: 1/4/2016 11:07 AM -- Dialog interfaces and framework debugging tools; see the Google Doc local tconcat, unpack, pairs, ipairs, tostring, string = table.concat, unpack, pairs, ipairs, tostring, string local BOOKTYPE_SPELL, GetSpellBookItemName, GetSpellBookItemInfo = BOOKTYPE_SPELL, GetSpellBookItemName, GetSpellBookItemInfo local GetSpellTabInfo, GetNumSpellTabs, GetSpellInfo, GetFlyoutInfo, GetSpellDescription = GetSpellTabInfo, GetNumSpellTabs, GetSpellInfo, GetFlyoutInfo, GetSpellDescription local GetFlyoutSlotInfo, GetSpellBaseCooldown, FindSpellBookSlotBySpellID, IsTalentSpell = GetFlyoutSlotInfo, GetSpellBaseCooldown, FindSpellBookSlotBySpellID, IsTalentSpell local GetNumClasses, GetClassInfo, GetNumSpecializationsForClassID, GetSpecializationInfoForClassID = GetNumClasses, GetClassInfo, GetNumSpecializationsForClassID, GetSpecializationInfoForClassID local _G, setmetatable, type, T = _G, setmetatable, type, Turok local mod = Turok.modules.TimerControl mod.EditDialog = TkTimerConfig mod.SelectDialog = {} local print = function(...) if Devian and DevianDB.workspace ~= 1 then print('Dialog', ...) end end local strpad = function(str, num) return tostring(str) .. string.rep(' ', num - #tostring(str)) end --- Handles mouse click on spellbook row frame mod.SpellBook_Click = function(self, btn) print('mouse', btn, self.spellID) mod.Dialog_Select(mod.EditDialog, self.spellID) end --- Creates the spell book import frame -- local cmd function mod.Import_Open() local self = mod print('Spirit', 'SpecSpells') local book_list = {} local tab = {} local list_info = {} local book_max = 0 for k = 1, GetNumSpellTabs() do local name, texture, offset, numSpells = GetSpellTabInfo(k) tab[offset] = {k, name, texture, numSpells} print('Spirit', name, offset, numSpells) book_max = offset + numSpells end local tabID, tabName, tabTexture local flyout, spellflyout = {}, {} for i = 1, book_max do if tab[i] then tabID, tabName, tabTexture = unpack(tab[i]) end if book_list[i] == nil then local skillType, spellID = GetSpellBookItemInfo(i, BOOKTYPE_SPELL) local spellNameUpper, spellSubText = GetSpellBookItemName(i, BOOKTYPE_SPELL) local spellName, spellRank, spellTexture, castTime, minRange, maxRange = GetSpellInfo(spellID) _G.print('Spirit', i, spellID, spellName) _G.print('Spirit', ' ', skillType, spellSubText) local spellDesc if skillType == 'FLYOUT' then local numSlots spellName, spellDesc, numSlots = GetFlyoutInfo(spellID) print('flyout #'..spellID..':', spellName) flyout[spellID] = {} for i=1, numSlots do local fspellID, _, isKnown, fSpellName, fSpellValue = GetFlyoutSlotInfo(spellID, i) print(' spell #', fspellID, fSpellName, isKnown) if isKnown then flyout[spellID][i] = fspellID spellflyout[fspellID] = spellID end end else spellDesc = GetSpellDescription(spellID) end book_list[i] = { skillType = skillType, spellIndex = i, spellID = spellID, spellName = spellName, spellDesc = spellDesc, spellNameUpper = spellNameUpper, spellSubText = spellSubText, spellTexture = spellTexture, spellCooldown = GetSpellBaseCooldown(spellID), castTime = castTime, minRange = minRange, maxRange = maxRange, tabID = tabID, tabName = tabName, tabTexture = tabTexture } end end local selector = CreateFrame('Frame', 'TkSpellSelector', UIParent, 'TurokListFrame') self.frames.selector = selector selector.name:SetText("Spells") selector:SetPoint('TOP') selector.page = 1 selector.GetRow = function(row, info, id, item_num) print(' ', row:GetName(), info, id, item_num) if not row.opts then row.opts = { CreateFrame('CheckButton', 'TkCheck_'..item_num, row, 'TurokCheckButtonInline'), row:CreateFontString('TextItem_'..item_num, 'OVERLAY', 'TurokFontDetail'), row:CreateTexture(nil, 'OVERLAY'), row:CreateTexture(nil, 'OVERLAY'), row:CreateFontString('TextItem_'..item_num..'ID', 'OVERLAY', 'TurokFontDetail'), } end local page = book_list[id] if page.skillType == 'FLYOUT' then row.background:SetTexture(1,.2,.3,.4) elseif rawget(mod.frames.spellID, page.spellID) then print('has timer frame under spell #', page.spellID, mod.frames.spellID[page.spellID]) row.background:SetTexture(1,1,0,1) local timer = mod.frames.spellID[page.spellID] row:SetScript('OnMouseDown', function(self) self.clicked = true end) row:SetScript('OnMouseUp', function(self) if self.clicked then self.clicked = nil mod.Dialog_Select(mod.Editor, timer.timerName) end end) elseif page.spellCooldown and page.spellCooldown > 0 then row.background:SetTexture(.3,.6,1,1) else row.background:SetTexture(0,0,0,0.3) end row:SetScript('OnMouseDown', mod.SpellBook_Click) row.desc = page.spellDesc row.spellID = page.spellID row.opts[1].desc = page.skillType row.opts[1]:SetSize(20,20) row.opts[1].description:SetText(nil) row.opts[1]:SetChecked(page.checked) row.opts[2]:SetText(page.spellName) row.opts[2]:SetWidth(200) row.opts[2]:SetJustifyH('LEFT') row.opts[3]:SetSize(20,20) row.opts[3]:SetTexture(page.spellTexture) row.opts[3]:SetPoint('CENTER') row.opts[4]:SetSize(20,20) row.opts[4]:SetTexture(page.tabTexture) row.opts[4]:SetPoint('CENTER') row.opts[5]:SetWidth(60) row.opts[5]:SetJustifyH('LEFT') row.opts[5]:SetText(page.spellID) end selector.Click = function(button, list) local b = button:GetName():match("_(%a+)$") if b == 'Prev' then --print(b, list.offset, list.num_rows) if list.page > 1 then list.page = list.page - 1 TkList_SetView(list, list.num_rows * (list.page-1) + 1) end list.pagenum:SetText(list.page) elseif b == 'Next' then --print(' ',list.page, list.num_rows, list.max_row) if (list.page) * list.num_rows < list.max_row then list.page = list.page + 1 TkList_SetView(list, list.offset + list.num_rows) end list.pagenum:SetText(list.page) elseif b == 'Add' then mod.CommitBook(book_list, tab, list_info) end --print(list.page, list.offset, list.num_rows) end selector.Wheel = function(self, delta) local offset = self.offset - delta if offset > 0 and offset <= (self.max_row - self.num_rows) then TkList_SetView(self, offset) end end selector.Check = function(checkbutton, row, list) local index = checkbutton:GetParent().actual_row book_list[index].checked = (not book_list[index].checked) and true or false checkbutton:SetChecked(book_list[index].checked) if book_list[index].skillType == 'FLYOUT' then for slot, spellID in pairs(flyout[book_list[index].spellID]) do local spIndex = FindSpellBookSlotBySpellID(spellID) print(' also toggling', slot, spellID, ' book slot', spIndex, book_list[spIndex].spellName) book_list[spIndex].checked = book_list[index].checked end TkList_SetView(list, list.offset) end end TkList_Init(selector, book_list, 1, 12) selector:Show() mod.SelectDialog = selector end --@end-debug@ function mod.CommitBook(bookInfo, tabInfo, uiInfo) print('committing') print(' book data: ', #bookInfo, 'entries') print(' tab data: ', #tabInfo, 'entries') for index, e in ipairs(bookInfo) do if e.checked then local spellPretext = '' if IsTalentSpell(index) then spellPretext = 'Talent' end print(' ', strpad(spellPretext .. e.spellName, 20)) print(' ', strpad(e.spellSubText, 10), strpad(e.spellCooldown,5), strpad(e.skillType,6)) end end end --- /tki command -- Constructs an index that associates global spec ID's with a list of the timers that would display under it. -- List entries are stored as [name] = true to prevent duplication of values in SavedVariables. function mod:CreateIndex() --@debug@ Revert config to defaults _G.TurokData = T.defaults --@end-debug@ mod.db.timerindex = {} setmetatable(mod.db.timerindex, {__mode = "v"}) -- ensure that dead leafs fall off local index = mod.index local timers = mod.timersByName -- build class info hash and create subtables local classID = {} local className = {} local specIDPage = {} local specPageID = {} local classSpecs = {} print('|cFF0088FFCreateIndex|r') --- use the internal class/specialization list for i = 1, GetNumClasses() do local _, tag, id = GetClassInfo(i) classID[tag] = id className[id] = tag index[id] = {} specPageID[tag] = {} index[tag] = index[id] classSpecs[tag] = GetNumSpecializationsForClassID(id) for j = 1, classSpecs[tag] do local specID, specName = GetSpecializationInfoForClassID(id, j) print('|cFFFF0088map:|r', tag, j, specID, specName) specIDPage[specID] = j specPageID[tag][j] = specID index[specID] = {} index[id][j] = {} end end index.global = {} for name,timer in pairs(timers) do -- class is set if type(timer) == 'table' then print(name) if timer.playerClass then index[timer.playerClass][name] = true -- spec restricted if timer.specPage then if type(timer.specPage) ~= 'table' then -- fix it up timer.specPage = {timer.specPage } end print(' |cFFFFFF00class:|r', timer.playerClass .. ', |cFF99FF00spec:|r '.. tconcat(timer.specPage,', ')) for _, specPage in ipairs(timer.specPage) do index[timer.playerClass][specPage][name] = true index[specPageID[timer.playerClass][specPage]][name] = true end -- no spec restriction, copy it out elseif not timer.specID then print(' |cFFFFFF00class:|r', timer.playerClass .. ', |cFF99FF00spec:|r ALL') for i = 1, classSpecs[timer.playerClass] do local specID = specPageID[timer.playerClass][i] index[timer.playerClass][i][name] = true -- store for local ID index[specID][name] = true -- store for global ID end end end if timer.specID then index[timer.specID][name] = true end if not (timer.playerClass or timer.specID or timer.specPage) then for tag, id in pairs(classID) do index[tag][name] = true for specPage, specID in pairs(specPageID[tag]) do index[tag][specPage][name] = true index[specID][name] = true end end print(' |cFFFFFF00class:|r ALL, |cFF99FF00spec:|r ALL') end end end _G.TurokData.timerindex = index T:Print('Hive data updated. /rl to commit.') end