diff --git a/Libs/DF/fw.lua b/Libs/DF/fw.lua
index 7bd6f4b5..f44023c4 100644
--- a/Libs/DF/fw.lua
+++ b/Libs/DF/fw.lua
@@ -1,6 +1,6 @@
-local dversion = 221
+local dversion = 222
local major, minor = "DetailsFramework-1.0", dversion
local DF, oldminor = LibStub:NewLibrary (major, minor)
@@ -2374,6 +2374,7 @@ DF.GlobalWidgetControlNames = {
split_bar = "DF_SplitBarMetaFunctions",
aura_tracker = "DF_AuraTracker",
healthBar = "DF_healthBarMetaFunctions",
+ timebar = "DF_TimeBarMetaFunctions",
}
function DF:AddMemberForWidget (widgetName, memberType, memberName, func)
diff --git a/Libs/DF/load.xml b/Libs/DF/load.xml
index f3cb53be..0097e76d 100644
--- a/Libs/DF/load.xml
+++ b/Libs/DF/load.xml
@@ -12,6 +12,7 @@
+
diff --git a/Libs/DF/timebar.lua b/Libs/DF/timebar.lua
new file mode 100644
index 00000000..88e298f5
--- /dev/null
+++ b/Libs/DF/timebar.lua
@@ -0,0 +1,350 @@
+
+
+local DF = _G ["DetailsFramework"]
+if (not DF or not DetailsFrameworkCanLoad) then
+ return
+end
+
+local _
+local rawset = rawset
+local rawget = rawget
+local setmetatable = setmetatable
+local unpack = unpack
+local type = type
+local floor = math.floor
+local GetTime = GetTime
+
+local SharedMedia = LibStub:GetLibrary ("LibSharedMedia-3.0")
+
+local cleanfunction = function() end
+local APITimeBarFunctions
+
+do
+ local metaPrototype = {
+ WidgetType = "timebar",
+ SetHook = DF.SetHook,
+ RunHooksForWidget = DF.RunHooksForWidget,
+ dversion = DF.dversion,
+ }
+
+ --check if there's a metaPrototype already existing
+ if (_G[DF.GlobalWidgetControlNames["timebar"]]) then
+ --get the already existing metaPrototype
+ local oldMetaPrototype = _G[DF.GlobalWidgetControlNames ["timebar"]]
+ --check if is older
+ if ( (not oldMetaPrototype.dversion) or (oldMetaPrototype.dversion < DF.dversion) ) then
+ --the version is older them the currently loading one
+ --copy the new values into the old metatable
+ for funcName, _ in pairs(metaPrototype) do
+ oldMetaPrototype[funcName] = metaPrototype[funcName]
+ end
+ end
+ else
+ --first time loading the framework
+ _G[DF.GlobalWidgetControlNames ["timebar"]] = metaPrototype
+ end
+end
+
+local TimeBarMetaFunctions = _G[DF.GlobalWidgetControlNames["timebar"]]
+
+
+--methods
+TimeBarMetaFunctions.SetMembers = TimeBarMetaFunctions.SetMembers or {}
+TimeBarMetaFunctions.GetMembers = TimeBarMetaFunctions.GetMembers or {}
+
+TimeBarMetaFunctions.__index = function (table, key)
+ local func = TimeBarMetaFunctions.GetMembers[key]
+ if (func) then
+ return func(table, key)
+ end
+
+ local fromMe = rawget(table, key)
+ if (fromMe) then
+ return fromMe
+ end
+ return TimeBarMetaFunctions [key]
+end
+
+TimeBarMetaFunctions.__newindex = function(table, key, value)
+ local func = TimeBarMetaFunctions.SetMembers[key]
+ if (func) then
+ return func(table, value)
+ else
+ return rawset(table, key, value)
+ end
+end
+
+--scripts
+local OnEnterFunc = function(statusBar)
+ local kill = statusBar.MyObject:RunHooksForWidget("OnEnter", statusBar, statusBar.MyObject)
+ if (kill) then
+ return
+ end
+
+ if (statusBar.MyObject.tooltip) then
+ GameCooltip2:Reset()
+ GameCooltip2:AddLine(statusBar.MyObject.tooltip)
+ GameCooltip2:ShowCooltip(statusBar, "tooltip")
+ end
+end
+
+local OnLeaveFunc = function(statusBar)
+ local kill = statusBar.MyObject:RunHooksForWidget("OnLeave", statusBar, statusBar.MyObject)
+ if (kill) then
+ return
+ end
+
+ if (statusBar.MyObject.tooltip) then
+ GameCooltip2:Hide()
+ end
+end
+
+local OnHideFunc = function(statusBar)
+ local kill = statusBar.MyObject:RunHooksForWidget("OnHide", statusBar, statusBar.MyObject)
+ if (kill) then
+ return
+ end
+end
+
+local OnShowFunc = function(statusBar)
+ local kill = statusBar.MyObject:RunHooksForWidget("OnShow", statusBar, statusBar.MyObject)
+ if (kill) then
+ return
+ end
+end
+
+local OnMouseDownFunc = function(statusBar, mouseButton)
+ local kill = statusBar.MyObject:RunHooksForWidget("OnMouseDown", statusBar, statusBar.MyObject)
+ if (kill) then
+ return
+ end
+end
+
+local OnMouseUpFunc = function(statusBar, mouseButton)
+ local kill = statusBar.MyObject:RunHooksForWidget("OnMouseUp", statusBar, statusBar.MyObject)
+ if (kill) then
+ return
+ end
+end
+
+--timer functions
+function TimeBarMetaFunctions:SetIcon(texture, L, R, T, B)
+ if (texture) then
+ self.statusBar.icon:Show()
+ self.statusBar.icon:SetPoint("left", self.statusBar, "left", 2, 0)
+ self.statusBar.icon:SetSize(self.statusBar:GetHeight()-2, self.statusBar:GetHeight()-2)
+ self.statusBar.leftText:SetPoint("left", self.statusBar.icon, "right", 2, 0)
+ self.statusBar.icon:SetTexture(texture)
+ if (L) then
+ self.statusBar.icon:SetTexCoord(L, R, T, B)
+ end
+
+ else
+ self.statusBar.icon:Hide()
+ self.statusBar.leftText:SetPoint("left", self.statusBar, "left", 2, 0)
+ end
+end
+
+function TimeBarMetaFunctions:SetLeftText(text)
+ self.statusBar.leftText:SetText(text)
+end
+function TimeBarMetaFunctions:SetRightText(text)
+ self.statusBar.rightText:SetText(text)
+end
+
+function TimeBarMetaFunctions:SetDirection(direction)
+ direction = direction or "right"
+ self.direction = direction
+end
+
+function TimeBarMetaFunctions:StopTimer()
+ if (self.statusBar.hasTimer) then
+ local kill = self:RunHooksForWidget("OnTimerEnd", self.statusBar, self)
+ if (kill) then
+ return
+ end
+
+ local statusBar = self.statusBar
+ statusBar:SetScript("OnUpdate", nil)
+
+ statusBar:SetMinMaxValues(0, 100)
+ statusBar:SetValue(100)
+ statusBar.rightText:SetText("")
+
+ statusBar.spark:Hide()
+ statusBar.hasTimer = nil
+ end
+end
+
+local OnUpdateFunc = function(self, deltaTime)
+ self.throttle = self.throttle + deltaTime
+ if (self.throttle < 0.1) then
+ return
+ end
+ self.throttle = 0
+
+ local timeNow = GetTime()
+ self:SetValue(timeNow)
+
+ --adjust the spark
+ local spark = self.spark
+ local startTime, endTime = self:GetMinMaxValues()
+
+ if (self.direction == "right") then
+ local pct = abs((timeNow - endTime) / (endTime - startTime))
+ pct = abs(1 - pct)
+ spark:SetPoint("left", self, "left", (self:GetWidth() * pct) - 16, 0)
+ spark:Show()
+ else
+ spark:SetPoint("right", self, "right", self:GetWidth() * (timeNow/self.endTime), 0)
+ end
+
+ local timeLeft = floor(endTime - timeNow)
+ self.rightText:SetText(timeLeft)
+
+ --check if finished
+ if (timeNow >= self.endTime) then
+ self.MyObject:StopTimer()
+ end
+end
+
+function TimeBarMetaFunctions:SetTimer(currentTime, startTime, endTime)
+ if (startTime and endTime) then
+ if (self.statusBar.hasTimer and currentTime == self.statusBar.timeLeft1) then
+ --it is the same timer called again
+ return
+ end
+ self.statusBar.startTime = startTime
+ self.statusBar.endTime = endTime
+ else
+ if (self.statusBar.hasTimer and currentTime == self.statusBar.timeLeft2) then
+ --it is the same timer called again
+ return
+ end
+ self.statusBar.starTime = GetTime()
+ self.statusBar.endTime = GetTime() + currentTime
+ self.statusBar.timeLeft2 = currentTime
+ end
+
+ self.statusBar:SetMinMaxValues(self.statusBar.starTime, self.statusBar.endTime)
+
+ if (self.direction == "right") then
+ self.statusBar:SetReverseFill(false)
+ else
+ self.statusBar:SetReverseFill(true)
+ end
+
+ self.statusBar.spark:Show()
+ self.statusBar.hasTimer = true
+ self.statusBar.direction = self.direction
+ self.statusBar.throttle = 0
+
+ self.statusBar:SetScript("OnUpdate", OnUpdateFunc)
+end
+
+
+function DF:CreateTimeBar(parent, texture, width, height, value, member, name)
+
+ if (not name) then
+ name = "DetailsFrameworkBarNumber" .. DF.BarNameCounter
+ DF.BarNameCounter = DF.BarNameCounter + 1
+
+ elseif (not parent) then
+ return error ("Details! FrameWork: parent not found.", 2)
+ end
+
+ if (name:find ("$parent")) then
+ local parentName = DF.GetParentName(parent)
+ name = name:gsub("$parent", parentName)
+ end
+
+ local timeBar = {
+ type = "timebar",
+ dframework = true
+ }
+
+ if (member) then
+ parent[member] = timeBar
+ end
+ if (parent.dframework) then
+ parent = parent.widget
+ end
+
+ value = value or 0
+ width = width or 150
+ height = height or 14
+ timeBar.locked = false
+
+ timeBar.statusBar = CreateFrame("statusbar", name, parent, "BackdropTemplate")
+ timeBar.widget = timeBar.statusBar
+ DF:Mixin(timeBar.statusBar, DF.WidgetFunctions)
+ timeBar.statusBar.MyObject = timeBar
+ timeBar.direction = "right"
+
+ if (not APITimeBarFunctions) then
+ APITimeBarFunctions = true
+ local idx = getmetatable(timeBar.statusBar).__index
+ for funcName, funcAddress in pairs(idx) do
+ if (not TimeBarMetaFunctions[funcName]) then
+ TimeBarMetaFunctions[funcName] = function(object, ...)
+ local x = loadstring("return _G['"..object.statusBar:GetName().."']:"..funcName.."(...)")
+ return x(...)
+ end
+ end
+ end
+ end
+
+ --> create widgets
+ timeBar.statusBar:SetWidth(width)
+ timeBar.statusBar:SetHeight(height)
+ timeBar.statusBar:SetFrameLevel(parent:GetFrameLevel()+1)
+ timeBar.statusBar:SetMinMaxValues(0, 100)
+ timeBar.statusBar:SetValue(value or 100)
+ timeBar.statusBar:EnableMouse(false)
+
+ timeBar.statusBar.backgroundTexture = timeBar.statusBar:CreateTexture(nil, "border")
+ timeBar.statusBar.backgroundTexture:SetColorTexture(.1, .1, .1, .6)
+ timeBar.statusBar.backgroundTexture:SetAllPoints()
+
+ timeBar.statusBar.barTexture = timeBar.statusBar:CreateTexture(nil, "artwork")
+ timeBar.statusBar.barTexture:SetTexture(texture or [[Interface\WorldStateFrame\WORLDSTATEFINALSCORE-HIGHLIGHT]])
+ timeBar.statusBar:SetStatusBarTexture(timeBar.statusBar.barTexture)
+
+ timeBar.statusBar.spark = timeBar.statusBar:CreateTexture(nil, "overlay")
+ timeBar.statusBar.spark:SetTexture([[Interface\CastingBar\UI-CastingBar-Spark]])
+ timeBar.statusBar.spark:SetBlendMode("ADD")
+ timeBar.statusBar.spark:Hide()
+
+ timeBar.statusBar.icon = timeBar.statusBar:CreateTexture(nil, "artwork", nil, 7)
+ timeBar.statusBar.icon:SetPoint("left", timeBar.statusBar, "left", 2, 0)
+
+ timeBar.statusBar.leftText = timeBar.statusBar:CreateFontString(nil, "artwork", "GameFontNormal", 7)
+ timeBar.statusBar.leftText:SetPoint("left", timeBar.statusBar.icon, "right", 2, 0)
+
+ timeBar.statusBar.rightText = timeBar.statusBar:CreateFontString(nil, "artwork", "GameFontNormal", 7)
+ timeBar.statusBar.rightText:SetPoint("right", timeBar.statusBar, "right", -2, 0)
+
+ --> hooks
+ timeBar.HookList = {
+ OnEnter = {},
+ OnLeave = {},
+ OnHide = {},
+ OnShow = {},
+ OnMouseDown = {},
+ OnMouseUp = {},
+ OnTimerStart = {},
+ OnTimerEnd = {},
+ }
+
+ timeBar.statusBar:SetScript("OnEnter", OnEnterFunc)
+ timeBar.statusBar:SetScript("OnLeave", OnLeaveFunc)
+ timeBar.statusBar:SetScript("OnHide", OnHideFunc)
+ timeBar.statusBar:SetScript("OnShow", OnShowFunc)
+ timeBar.statusBar:SetScript("OnMouseDown", OnMouseDownFunc)
+ timeBar.statusBar:SetScript("OnMouseUp", OnMouseUpFunc)
+
+ --set class
+ setmetatable(timeBar, TimeBarMetaFunctions)
+
+ return timeBar
+end
diff --git a/Libs/LibRaidStatus/LibRaidStatus.lua b/Libs/LibRaidStatus/LibRaidStatus.lua
index a37bc2e2..1e0f9098 100644
--- a/Libs/LibRaidStatus/LibRaidStatus.lua
+++ b/Libs/LibRaidStatus/LibRaidStatus.lua
@@ -217,8 +217,11 @@ LIB_RAID_STATUS_CAN_LOAD = false
local callbackTable = raidStatusLib.commHandler.commCallback[dataTypePrefix]
--convert to table
local dataAsTable = {strsplit(",", data)}
+
--remove the first index (prefix)
tremove(dataAsTable, 1)
+ --Details:Dump(dataAsTable)
+
--trigger callbacks
for i = 1, #callbackTable do
callbackTable[i](dataAsTable, sender)
@@ -676,7 +679,7 @@ LIB_RAID_STATUS_CAN_LOAD = false
--is a ticker already exists, might be the cooldown of a charge
--if the ticker isn't about to expire, just keep the timer
--when the ticker finishes it'll check again for charges
- if (existingTicker.startTime + existingTicker.cooldownTime - GetTime() > 2) then
+ if (existingTicker.startTime + existingTicker.cooldownTimeLeft - GetTime() > 2) then
return
end
@@ -763,9 +766,9 @@ LIB_RAID_STATUS_CAN_LOAD = false
raidStatusLib.commHandler.RegisterComm(CONST_COMM_COOLDOWNUPDATE_PREFIX, function(data, sourceName)
--get data
local dataAsArray = data
- local spellId = tonumber(dataAsArray[2])
- local cooldownTimer = tonumber(dataAsArray[3])
- local charges = tonumber(dataAsArray[4])
+ local spellId = tonumber(dataAsArray[1])
+ local cooldownTimer = tonumber(dataAsArray[2])
+ local charges = tonumber(dataAsArray[3])
--check integraty
if (not spellId or spellId == 0) then
@@ -823,25 +826,29 @@ LIB_RAID_STATUS_CAN_LOAD = false
function raidStatusLib.cooldownManager.GetCooldownStatus(spellId)
--check if is a charge spell
local cooldownInfo = LIB_RAID_STATUS_COOLDOWNS_INFO[spellId]
- if (cooldownInfo.charges and cooldownInfo.charges > 1) then
- local chargesAvailable, chargesTotal, start, duration = GetSpellCharges(spellId)
+ if (cooldownInfo) then
+ if (cooldownInfo.charges and cooldownInfo.charges > 1) then
+ local chargesAvailable, chargesTotal, start, duration = GetSpellCharges(spellId)
+
+ if (chargesAvailable == chargesTotal) then
+ return 0, chargesTotal --all charges are ready to use
+ else
+ --return the time to the next charge
+ local timeLeft = start + duration - GetTime()
+ return ceil(timeLeft), chargesAvailable
+ end
- if (chargesAvailable == chargesTotal) then
- return 0, chargesTotal --all charges are ready to use
else
- --return the time to the next charge
- local timeLeft = start + duration - GetTime()
- return ceil(timeLeft), chargesAvailable
+ local start, duration = GetSpellCooldown(spellId)
+ if (start == 0) then --cooldown is ready
+ return 0, 1
+ else
+ local timeLeft = start + duration - GetTime()
+ return ceil(timeLeft), 0
+ end
end
-
else
- local start, duration = GetSpellCooldown(spellId)
- if (start == 0) then --cooldown is ready
- return 0, 1
- else
- local timeLeft = start + duration - GetTime()
- return ceil(timeLeft), 0
- end
+ return diagnosticError("cooldownManager|GetCooldownStatus()|cooldownInfo not found|", spellId)
end
end
diff --git a/frames/window_cdtracker.lua b/frames/window_cdtracker.lua
index 712aa635..1c623694 100644
--- a/frames/window_cdtracker.lua
+++ b/frames/window_cdtracker.lua
@@ -71,7 +71,6 @@ function Details.CooldownTracking.CooldownListWipedFunc()
end
function Details.CooldownTracking.CooldownUpdateFunc()
- print("cooldown update...")
Details.CooldownTracking.RefreshScreenPanel()
end
@@ -92,10 +91,11 @@ function Details.CooldownTracking.RefreshScreenPanel()
libWindow.RegisterConfig(screenPanel, _detalhes.ocd_tracker.pos)
libWindow.MakeDraggable(screenPanel)
libWindow.RestorePosition(screenPanel)
+
+ screenPanel.bars = {}
end
local screenPanel = _G.DetailsOnlineCDTrackerScreenPanel
- screenPanel.bars = {}
function screenPanel.HideAllBars()
for _, bar in ipairs (screenPanel.bars) do
@@ -127,11 +127,11 @@ function Details.CooldownTracking.RefreshScreenPanel()
end
for playerName, allPlayerCooldowns in pairs(cooldownsAvailable) do
- local _, _, classId = UnitClass(playerName)
+ local _, classEngName, 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
+ cooldownsOrganized[classId][#cooldownsOrganized[classId]+1] = {playerName, cooldownInfo[1], cooldownInfo[2], classId, spellId, classEngName}
--local spellName = GetSpellInfo(spellId) --debug
--print("Cooldown Added", playerName, spellName) --debug
end
@@ -147,47 +147,50 @@ function Details.CooldownTracking.RefreshScreenPanel()
screenPanel.HideAllBars()
local cooldownIndex = 1
+ local xAnchor = 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)
+ if (cooldownIndex % 11 == 0) then
+ xAnchor = xAnchor + width + 2
+ end
- 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)
+ local newBar = DF:CreateTimeBar(screenPanel, [[Interface\AddOns\Details\images\bar_serenity]], width-2, bar_height-2, 100, nil, "DetailsOCDBar" .. cooldownIndex)
+ newBar:SetPoint("topleft", screenPanel, "topleft", xAnchor, (cooldownIndex-1) * bar_height * -1)
+
+ tinsert(screenPanel.bars, newBar)
+ bar = newBar
end
- local cooldownTable = t[i]
- local spellName, _, spellIcon = GetSpellInfo(cooldownTable[5])
- bar:SetLeftText(cooldownTable[1])
- bar:SetIcon(spellIcon, {.1, .9, .1, .9})
+ cooldownIndex = cooldownIndex + 1
- bar:CancelTimerBar(true)
+ bar:Show()
+
+ local cooldownTable = t[i]
+ local _, _, spellIcon = GetSpellInfo(cooldownTable[5])
+ bar:SetLeftText(cooldownTable[1])
+ bar:SetIcon(spellIcon, .1, .9, .1, .9)
+
+ local classColor = C_ClassColor.GetClassColor(cooldownTable[6])
+ bar:SetStatusBarColor(classColor.r, classColor.g, classColor.b)
local timeLeft = cooldownTable[2]
if (timeLeft > 0) then
+ bar.spellId = cooldownTable[5]
bar:SetTimer(timeLeft)
else
+ bar:SetMinMaxValues(0, 100)
bar:SetValue(100)
end
-
- bar:Show()
- --print("Shown Bar", cooldownIndex) --debug
- cooldownIndex = cooldownIndex + 1
end
end
- DetailsOnlineCDTrackerScreenPanel:Show()
+ cooldownIndex = cooldownIndex - 1
+ screenPanel:SetSize(width + xAnchor, cooldownIndex * (bar_height))
+ screenPanel:Show()
end
function Details.OpenCDTrackerWindow()
@@ -265,14 +268,14 @@ function Details.OpenCDTrackerWindow()
for spellId, cooldownType in pairs(cooldownTable) do
if (not alreadyAdded[spellId]) then
- if (cooldownType == 3 or cooldownType == 4) then
+ if (cooldownType == 3 or cooldownType == 4 or cooldownType == 1 or cooldownType == 2) 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
+ if (cooldownType == 3 or cooldownType == 4 or cooldownType == 1 or cooldownType == 2) then
cooldownProfile[spellId] = true
end
end