local Details = _G.Details local DF = _G.DetailsFramework local raidStatusLib = LibStub:GetLibrary("LibRaidStatus-1.0") local width = 170 local height = 300 local bar_height = 20 --namespace Details.CooldownTracking = {} function Details:InitializeCDTrackerWindow() local DetailsCDTrackerWindow = DF:CreateSimplePanel(UIParent, 700, 480, "Details! Online CD Tracker", "DetailsCDTrackerWindow") DetailsCDTrackerWindow.Frame = DetailsCDTrackerWindow DetailsCDTrackerWindow.__name = "OCD Tracker" DetailsCDTrackerWindow.real_name = "DETAILS_CDTRACKERWINDOW" DetailsCDTrackerWindow.__icon = [[Interface\TUTORIALFRAME\UI-TUTORIALFRAME-SPIRITREZ]] DetailsCDTrackerWindow.__iconcoords = {130/512, 256/512, 0, 1} DetailsCDTrackerWindow.__iconcolor = "white" _G.DetailsPluginContainerWindow.EmbedPlugin(DetailsCDTrackerWindow, DetailsCDTrackerWindow, true) function DetailsCDTrackerWindow.RefreshWindow() Details.OpenCDTrackerWindow() end --check if is enabled at startup if (Details.CooldownTracking.IsEnabled()) then Details.CooldownTracking.EnableTracker() end DetailsCDTrackerWindow:Hide() end function Details.CooldownTracking.IsEnabled() return Details.ocd_tracker.enabled end function Details.CooldownTracking.EnableTracker() Details.ocd_tracker.enabled = true --register callbacks raidStatusLib.RegisterCallback(Details.CooldownTracking, "CooldownListUpdate", "CooldownListUpdateFunc") raidStatusLib.RegisterCallback(Details.CooldownTracking, "CooldownListWiped", "CooldownListWipedFunc") raidStatusLib.RegisterCallback(Details.CooldownTracking, "CooldownUpdate", "CooldownUpdateFunc") Details.CooldownTracking.RefreshScreenPanel() end function Details.CooldownTracking.DisableTracker() Details.ocd_tracker.enabled = false --hide the panel if (DetailsOnlineCDTrackerScreenPanel) then DetailsOnlineCDTrackerScreenPanel:Hide() end --unregister callbacks raidStatusLib.UnregisterCallback(Details.CooldownTracking, "CooldownListUpdate", "CooldownListUpdateFunc") raidStatusLib.UnregisterCallback(Details.CooldownTracking, "CooldownListWiped", "CooldownListWipedFunc") raidStatusLib.UnregisterCallback(Details.CooldownTracking, "CooldownUpdate", "CooldownUpdateFunc") end function Details.CooldownTracking.CooldownListUpdateFunc() Details.CooldownTracking.RefreshScreenPanel() end function Details.CooldownTracking.CooldownListWipedFunc() Details.CooldownTracking.RefreshScreenPanel() end function Details.CooldownTracking.CooldownUpdateFunc() print("cooldown update...") Details.CooldownTracking.RefreshScreenPanel() end function Details.CooldownTracking.RefreshScreenPanel() if (not DetailsOnlineCDTrackerScreenPanel) then --screen panel (goes into the UIParent and show cooldowns there) local screenPanel = CreateFrame("frame", "DetailsOnlineCDTrackerScreenPanel", UIParent, "BackdropTemplate") screenPanel:Hide() screenPanel:SetSize(width, height) screenPanel:SetPoint("center", 0, 0) screenPanel:SetBackdrop({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true}) screenPanel:SetBackdropColor(0, 0, 0, .55) screenPanel:SetBackdropBorderColor(0, 0, 0, .3) screenPanel:EnableMouse(true) --register on libwindow local libWindow = LibStub("LibWindow-1.1") libWindow.RegisterConfig(screenPanel, _detalhes.ocd_tracker.pos) libWindow.MakeDraggable(screenPanel) libWindow.RestorePosition(screenPanel) end local screenPanel = _G.DetailsOnlineCDTrackerScreenPanel screenPanel.bars = {} function screenPanel.HideAllBars() for _, bar in ipairs (screenPanel.bars) do bar:Hide() end end if (Details.ocd_tracker.show_conditions.only_in_group) then if (not IsInGroup()) then screenPanel:Hide() return end end if (Details.ocd_tracker.show_conditions.only_inside_instance) then local isInInstanceType = select(2, GetInstanceInfo()) if (isInInstanceType ~= "party" and isInInstanceType ~= "raid" and isInInstanceType ~= "scenario" and isInInstanceType ~= "arena") then screenPanel:Hide() return end end local cooldownsAvailable = raidStatusLib.cooldownManager.GetCooldownTable() local cooldownsEnabled = Details.ocd_tracker.cooldowns local cooldownsOrganized = {} for classId = 1, 12 do --12 classes cooldownsOrganized[classId] = {} end for playerName, allPlayerCooldowns in pairs(cooldownsAvailable) do local _, _, classId = UnitClass(playerName) if (classId) then for spellId, cooldownInfo in pairs(allPlayerCooldowns) do if (cooldownsEnabled[spellId]) then cooldownsOrganized[classId][#cooldownsOrganized[classId]+1] = {playerName, cooldownInfo[1], cooldownInfo[2], classId, spellId} --playerName, spellId, timeLeft, chargesLeft --local spellName = GetSpellInfo(spellId) --debug --print("Cooldown Added", playerName, spellName) --debug end end end end for classId = 1, 12 do --12 classes local t = cooldownsOrganized[classId] table.sort(t, function(t1, t2) return t1[5] < t2[5] end) --sort by spellId end screenPanel.HideAllBars() local cooldownIndex = 1 for classId = 1, 12 do --12 classes local t = cooldownsOrganized[classId] for i = 1, #t do local bar = screenPanel.bars[cooldownIndex] if (not bar) then bar = DF:CreateBar(screenPanel, [[Interface\AddOns\Details\images\bar_serenity]], width-2, bar_height-1, 100) bar:SetPoint("topleft", screenPanel, "topleft", 1, (cooldownIndex-1)*bar_height) tinsert(screenPanel.bars, bar) bar:SetHook("OnTimerEnd", function() bar:Show() bar:SetValue(100) bar.timer_texture:Hide() bar.timer_textureR:Hide() bar.div_timer:Hide() bar.timer = false return true end) end local cooldownTable = t[i] local spellName, _, spellIcon = GetSpellInfo(cooldownTable[5]) bar:SetLeftText(cooldownTable[1]) bar:SetIcon(spellIcon, {.1, .9, .1, .9}) bar:CancelTimerBar(true) local timeLeft = cooldownTable[2] if (timeLeft > 0) then bar:SetTimer(timeLeft) else bar:SetValue(100) end bar:Show() --print("Shown Bar", cooldownIndex) --debug cooldownIndex = cooldownIndex + 1 end end DetailsOnlineCDTrackerScreenPanel:Show() end function Details.OpenCDTrackerWindow() --check if the window exists, if not create it if (not _G.DetailsCDTrackerWindow or not _G.DetailsCDTrackerWindow.Initialized) then _G.DetailsCDTrackerWindow.Initialized = true local f = _G.DetailsCDTrackerWindow or DF:CreateSimplePanel(UIParent, 700, 480, "Details! Online CD Tracker", "DetailsCDTrackerWindow") --enabled with a toggle button --execute to reset position --misc configs local options_text_template = DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE") local options_dropdown_template = DF:GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE") local options_switch_template = DF:GetTemplate ("switch", "OPTIONS_CHECKBOX_TEMPLATE") local options_slider_template = DF:GetTemplate ("slider", "OPTIONS_SLIDER_TEMPLATE") local options_button_template = DF:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE") local generalOptions = { {--enable ocd type = "toggle", get = function() return Details.ocd_tracker.enabled end, set = function (self, fixedparam, value) if (value) then Details.CooldownTracking.EnableTracker() else Details.CooldownTracking.DisableTracker() end end, name = "Enable Online Cooldown Tracker", desc = "Enable Online Cooldown Tracker", }, {--show only in group type = "toggle", get = function() return Details.ocd_tracker.show_conditions.only_in_group end, set = function (self, fixedparam, value) Details.ocd_tracker.show_conditions.only_in_group = value Details.CooldownTracking.RefreshScreenPanel() end, name = "Only in Group", desc = "Only in Group", }, {--show only inside instances type = "toggle", get = function() return Details.ocd_tracker.show_conditions.only_inside_instance end, set = function (self, fixedparam, value) Details.ocd_tracker.show_conditions.only_inside_instance = value Details.CooldownTracking.RefreshScreenPanel() end, name = "Only Inside Instances", desc = "Only Inside Instances", }, } DF:BuildMenu(f, generalOptions, 5, -35, 150, true, options_text_template, options_dropdown_template, options_switch_template, true, options_slider_template, options_button_template) --cooldown selection local cooldownProfile = Details.ocd_tracker.cooldowns local cooldownSelectionFrame = CreateFrame("frame", "$parentCooldownSelectionFrame", f, "BackdropTemplate") cooldownSelectionFrame:SetPoint("topleft", f, "topleft", 0, -150) cooldownSelectionFrame:SetPoint("bottomright", f, "bottomright", 0, 10) DF:ApplyStandardBackdrop(cooldownSelectionFrame) --list of cooldowns to show, each one with a toggle button local cooldownList = {} local alreadyAdded = {} if (LIB_RAID_STATUS_COOLDOWNS_BY_SPEC) then for specId, cooldownTable in pairs(LIB_RAID_STATUS_COOLDOWNS_BY_SPEC) do local currentIndex = #cooldownList+1 local cooldownAdded = false for spellId, cooldownType in pairs(cooldownTable) do if (not alreadyAdded[spellId]) then if (cooldownType == 3 or cooldownType == 4) then local spellName, _, spellIcon = GetSpellInfo(spellId) if (spellName) then cooldownList[#cooldownList+1] = { type = "toggle", get = function() if (cooldownProfile[spellId] == nil) then if (cooldownType == 3 or cooldownType == 4) then cooldownProfile[spellId] = true end end return cooldownProfile[spellId] end, set = function (self, fixedparam, value) if (value) then cooldownProfile[spellId] = value else cooldownProfile[spellId] = nil end end, name = "|T" .. spellIcon .. ":" .. (16) .. ":" .. (16) .. ":0:0:64:64:" .. 0.1*64 .. ":" .. 0.9*64 .. ":" .. 0.1*64 .. ":" .. 0.9*64 .. "|t" .. spellName, desc = spellName, boxfirst = true, } alreadyAdded[spellId] = true cooldownAdded = true end end end end if (cooldownAdded) then local _, spenName, _, specIcon = GetSpecializationInfoByID(specId) local iconString = "|T" .. specIcon .. ":" .. (16) .. ":" .. (16) .. ":0:0:64:64:" .. 0.1*64 .. ":" .. 0.9*64 .. ":" .. 0.1*64 .. ":" .. 0.9*64 .. "|t" tinsert(cooldownList, currentIndex, {type = "label", get = function() return iconString .. " " .. spenName end}) if (currentIndex > 1) then tinsert(cooldownList, currentIndex, {type = "blank"}) end end end end DF:BuildMenu(cooldownSelectionFrame, cooldownList, 5, -5, cooldownSelectionFrame:GetHeight() - 40, false, options_text_template, options_dropdown_template, options_switch_template, true, options_slider_template, options_button_template) end _G.DetailsPluginContainerWindow.OpenPlugin(_G.DetailsCDTrackerWindow) _G.DetailsCDTrackerWindow:Show() end