diff --git a/Changelog and Notes.txt b/Changelog and Notes.txt index a6c6eb2..18880bd 100644 --- a/Changelog and Notes.txt +++ b/Changelog and Notes.txt @@ -39,6 +39,8 @@ Auto-Ress in BG - With option "Exclude Alterac" will it not auto-res in Alter Accept Ress - Will it ever accept ressurection if ressurecter in combat ? +QueueTimer - Need to test if timer .After 0.1 is fine in SetupBar func (was 1 second before) + -------------------------------------------------------------------------------- -- Stuff to-do: diff --git a/Leatrix_Plus.lua b/Leatrix_Plus.lua index 59803a1..a3285e3 100644 --- a/Leatrix_Plus.lua +++ b/Leatrix_Plus.lua @@ -5807,7 +5807,7 @@ function LeaPlusLC:FriendCheck(name) local function SetupBar() - LibCompat.After(1, function() + LibCompat.After(0.1, function() if not StaticPopup1:IsShown() and not MiniMapBattlefieldFrame:IsShown() then -- print("resetting") started = false @@ -6163,7 +6163,7 @@ function LeaPlusLC:FriendCheck(name) local timeBuffer = 15 -- Create editbox - local editFrame = CreateFrame("ScrollFrame", nil, UIParent, "InputScrollFrameTemplate") + local editFrame = CreateFrame("ScrollFrame", nil, UIParent, "Leatrix_InputScrollFrameTemplate") -- Set frame parameters editFrame:ClearAllPoints() @@ -6172,7 +6172,7 @@ function LeaPlusLC:FriendCheck(name) editFrame:SetFrameStrata("MEDIUM") editFrame:SetToplevel(true) editFrame:Hide() - editFrame.CharCount:Hide() + -- editFrame.CharCount:Hide() -- Add background color editFrame.t = editFrame:CreateTexture(nil, "BACKGROUND") @@ -6180,29 +6180,29 @@ function LeaPlusLC:FriendCheck(name) editFrame.t:SetVertexColor(0.00, 0.00, 0.0, 0.6) -- Set textures - editFrame.LeftTex:SetTexture(editFrame.RightTex:GetTexture()); editFrame.LeftTex:SetTexCoord(1, 0, 0, 1) - editFrame.BottomTex:SetTexture(editFrame.TopTex:GetTexture()); editFrame.BottomTex:SetTexCoord(0, 1, 1, 0) - editFrame.BottomRightTex:SetTexture(editFrame.TopRightTex:GetTexture()); editFrame.BottomRightTex:SetTexCoord(0, 1, 1, 0) - editFrame.BottomLeftTex:SetTexture(editFrame.TopRightTex:GetTexture()); editFrame.BottomLeftTex:SetTexCoord(1, 0, 1, 0) - editFrame.TopLeftTex:SetTexture(editFrame.TopRightTex:GetTexture()); editFrame.TopLeftTex:SetTexCoord(1, 0, 0, 1) + -- editFrame.LeftTex:SetTexture(editFrame.RightTex:GetTexture()); editFrame.LeftTex:SetTexCoord(1, 0, 0, 1) + -- editFrame.BottomTex:SetTexture(editFrame.TopTex:GetTexture()); editFrame.BottomTex:SetTexCoord(0, 1, 1, 0) + -- editFrame.BottomRightTex:SetTexture(editFrame.TopRightTex:GetTexture()); editFrame.BottomRightTex:SetTexCoord(0, 1, 1, 0) + -- editFrame.BottomLeftTex:SetTexture(editFrame.TopRightTex:GetTexture()); editFrame.BottomLeftTex:SetTexCoord(1, 0, 1, 0) + -- editFrame.TopLeftTex:SetTexture(editFrame.TopRightTex:GetTexture()); editFrame.TopLeftTex:SetTexCoord(1, 0, 0, 1) -- Create title bar - local titleFrame = CreateFrame("ScrollFrame", nil, editFrame, "InputScrollFrameTemplate") + local titleFrame = CreateFrame("ScrollFrame", nil, editFrame, "Leatrix_InputScrollFrameTemplate") titleFrame:ClearAllPoints() titleFrame:SetPoint("TOP", 0, 32) titleFrame:SetSize(600, 24) titleFrame:SetFrameStrata("MEDIUM") titleFrame:SetToplevel(true) titleFrame:SetHitRectInsets(-6, -6, -6, -6) - titleFrame.CharCount:Hide() + -- titleFrame.CharCount:Hide() titleFrame.t = titleFrame:CreateTexture(nil, "BACKGROUND") titleFrame.t:SetAllPoints() titleFrame.t:SetVertexColor(0.00, 0.00, 0.0, 0.6) - titleFrame.LeftTex:SetTexture(titleFrame.RightTex:GetTexture()); titleFrame.LeftTex:SetTexCoord(1, 0, 0, 1) - titleFrame.BottomTex:SetTexture(titleFrame.TopTex:GetTexture()); titleFrame.BottomTex:SetTexCoord(0, 1, 1, 0) - titleFrame.BottomRightTex:SetTexture(titleFrame.TopRightTex:GetTexture()); titleFrame.BottomRightTex:SetTexCoord(0, 1, 1, 0) - titleFrame.BottomLeftTex:SetTexture(titleFrame.TopRightTex:GetTexture()); titleFrame.BottomLeftTex:SetTexCoord(1, 0, 1, 0) - titleFrame.TopLeftTex:SetTexture(titleFrame.TopRightTex:GetTexture()); titleFrame.TopLeftTex:SetTexCoord(1, 0, 0, 1) + -- titleFrame.LeftTex:SetTexture(titleFrame.RightTex:GetTexture()); titleFrame.LeftTex:SetTexCoord(1, 0, 0, 1) + -- titleFrame.BottomTex:SetTexture(titleFrame.TopTex:GetTexture()); titleFrame.BottomTex:SetTexCoord(0, 1, 1, 0) + -- titleFrame.BottomRightTex:SetTexture(titleFrame.TopRightTex:GetTexture()); titleFrame.BottomRightTex:SetTexCoord(0, 1, 1, 0) + -- titleFrame.BottomLeftTex:SetTexture(titleFrame.TopRightTex:GetTexture()); titleFrame.BottomLeftTex:SetTexCoord(1, 0, 1, 0) + -- titleFrame.TopLeftTex:SetTexture(titleFrame.TopRightTex:GetTexture()); titleFrame.TopLeftTex:SetTexCoord(1, 0, 0, 1) -- Add title titleFrame.m = titleFrame:CreateFontString(nil, "ARTWORK", "GameFontNormalLarge") @@ -6219,17 +6219,17 @@ function LeaPlusLC:FriendCheck(name) titleFrame.x:SetWordWrap(false) titleFrame.x:SetJustifyH("RIGHT") - local titleBox = titleFrame.EditBox - titleBox:Hide() - titleBox:SetEnabled(false) - titleBox:SetMaxLetters(0) + -- local titleBox = titleFrame.EditBox + -- titleBox:Hide() + -- titleBox:SetEnabled(false) + -- titleBox:SetMaxLetters(0) -- Create editbox local editBox = editFrame.EditBox editBox:SetAltArrowKeyMode(false) editBox:SetTextInsets(4, 4, 4, 4) editBox:SetWidth(editFrame:GetWidth() - 30) - editBox:SetSecurityDisablePaste() + -- editBox:SetSecurityDisablePaste() editBox:SetFont(_G["ChatFrame1"]:GetFont()) editBox:SetMaxLetters(0) @@ -6306,7 +6306,7 @@ function LeaPlusLC:FriendCheck(name) if nodeType == "CURRENT" then -- Get current node - local continent = getContinent() + local continent = true local startX, startY = TaxiNodePosition(i) local currentNode = string.format("%0.2f", startX) .. ":" .. string.format("%0.2f", startY) @@ -6323,9 +6323,9 @@ function LeaPlusLC:FriendCheck(name) local debugString = '["' .. currentNode local routeString = currentNode for i = 2, numHops + 1 do - local hopPosX, hopPosY = TaxiNodePosition(TaxiGetNodeSlot(node, i, true)) - local hopPos = string.format("%0.2f", hopPosX) .. ":" .. string.format("%0.2f", hopPosY) - local fpName = string.split(", ", TaxiNodeName(TaxiGetNodeSlot(node, i, true))) + local hopPosX, hopPosY = "TaxiNodePosition(TaxiGetNodeSlot(node, i, true))" + local hopPos = string.format("%0.2f", "hopPosX") .. ":" .. string.format("%0.2f", "hopPosY") + local fpName = string.split(", ", "TaxiNodeName(TaxiGetNodeSlot(node, i, true))") debugString = debugString .. ":" .. hopPos routeString = routeString .. ":" .. hopPos end @@ -6339,7 +6339,7 @@ function LeaPlusLC:FriendCheck(name) debugString = debugString .. '"] = TimeTakenPlaceHolder,' debugString = debugString .. " -- " .. nodeName for i = 2, numHops + 1 do - local fpName = string.split(",", TaxiNodeName(TaxiGetNodeSlot(node, i, true))) + local fpName = string.split(",", "TaxiNodeName(TaxiGetNodeSlot(node, i, true))") debugString = debugString .. ", " .. fpName end @@ -6519,7 +6519,7 @@ function LeaPlusLC:FriendCheck(name) end -- Stop the progress bar under various circumstances - hooksecurefunc("TaxiRequestEarlyLanding", CeaseProgress) + -- hooksecurefunc("TaxiRequestEarlyLanding", CeaseProgress) hooksecurefunc("AcceptBattlefieldPort", CeaseProgress) hooksecurefunc("ConfirmSummon", CeaseProgress) @@ -6532,7 +6532,7 @@ function LeaPlusLC:FriendCheck(name) if nodeType == "CURRENT" then -- Get current node - local continent = getContinent() + local continent = GetCurrentMapContinent() local startX, startY = TaxiNodePosition(i) local currentNode = string.format("%0.2f", startX) .. ":" .. string.format("%0.2f", startY) @@ -6546,15 +6546,30 @@ function LeaPlusLC:FriendCheck(name) local debugString = '["' .. currentNode local routeString = currentNode for i = 2, numEnterHops + 1 do - local hopPosX, hopPosY = TaxiNodePosition(TaxiGetNodeSlot(index, i, true)) -- TaxiNodeName - local hopPos = string.format("%0.2f", hopPosX) .. ":" .. string.format("%0.2f", hopPosY) - local fpName = string.split(", ", TaxiNodeName(TaxiGetNodeSlot(index, i, true))) + local nextHopX = string.format("%0.2f", TaxiGetDestX(index, i)) + local nextHopY = string.format("%0.2f", TaxiGetDestY(index, i)) + local hopPos = nextHopX .. ":" .. nextHopY + + + local fpName = TaxiNodeName(i) + + -- Find comma index + local commaIndex = fpName:find(", ") + + -- Get first word + local firstWord = fpName:sub(1, commaIndex - 1) + fpName = firstWord + + -- print(fpName) + + debugString = debugString .. ":" .. hopPos routeString = routeString .. ":" .. hopPos end - + -- print(routeString .. destination) -- If route string does not contain destination, add it to the end (such as Altar of Sha'tar) if not string.find(routeString, destination) then + -- print(routeString .. "and" .. destination) debugString = debugString .. ":" .. destination routeString = routeString .. ":" .. destination end @@ -6576,7 +6591,14 @@ function LeaPlusLC:FriendCheck(name) -- Add node names to debug string debugString = debugString .. " -- " .. nodeName for i = 2, numEnterHops + 1 do - local fpName = string.split(",", TaxiNodeName(TaxiGetNodeSlot(index, i, true))) + local fpName = TaxiNodeName(i) + + -- Find comma index + local commaIndex = fpName:find(", ") + + -- Get first word + local firstWord = fpName:sub(1, commaIndex - 1) + fpName = firstWord debugString = debugString .. ", " .. fpName end @@ -6586,7 +6608,7 @@ function LeaPlusLC:FriendCheck(name) end -- Print debug string (used for showing full routes for nodes) - -- print(debugString) + print(debugString) end end @@ -6598,7 +6620,7 @@ function LeaPlusLC:FriendCheck(name) end hooksecurefunc("TaxiNodeOnButtonEnter", StopLandingEvent) - hooksecurefunc("TaxiRequestEarlyLanding", StopLandingEvent) + -- hooksecurefunc("TaxiRequestEarlyLanding", StopLandingEvent) hooksecurefunc("AcceptBattlefieldPort", StopLandingEvent) hooksecurefunc("ConfirmSummon", StopLandingEvent) diff --git a/Leatrix_Plus_Flight_Alliance.lua b/Leatrix_Plus_Flight_Alliance.lua index 77e25f2..12bb35a 100644 --- a/Leatrix_Plus_Flight_Alliance.lua +++ b/Leatrix_Plus_Flight_Alliance.lua @@ -15,7 +15,7 @@ ---------------------------------------------------------------------- -- Alliance: Eastern Kingdoms - [1415] = { + [2] = { -- Alliance: Acherus (Eastern Plaguelands) ["0.62:0.34:0.61:0.35:0.58:0.06"] = 385, -- Acherus: The Ebon Hold, Light's Hope Chapel, Shattered Sun Staging Area @@ -714,7 +714,7 @@ }, -- Alliance: Kalimdor - [1414] = { + [1] = { -- Alliance: Blood Watch (Bloodmyst Isle) ["0.22:0.18:0.21:0.26"] = 77, -- Blood Watch, The Exodar (Nick Bijl reported 110) @@ -1411,7 +1411,7 @@ }, -- Alliance: Outland - [1945] = { + [3] = { -- Alliance: Allerian Stronghold (Terokkar Forest) ["0.55:0.77:0.27:0.74"] = 149, -- Allerian Stronghold, Telaar @@ -1870,7 +1870,7 @@ }, -- Alliance: Northrend - [113] = { + [4] = { ---------------------------------------------------------------------- -- Alliance: Borean Tundra diff --git a/Leatrix_Plus_Flight_Horde.lua b/Leatrix_Plus_Flight_Horde.lua index 79062ff..a4e32e6 100644 --- a/Leatrix_Plus_Flight_Horde.lua +++ b/Leatrix_Plus_Flight_Horde.lua @@ -15,7 +15,7 @@ ---------------------------------------------------------------------- -- Horde: Eastern Kingdoms - [1415] = { + [2] = { -- Horde: Acherus (Eastern Plaguelands) ["0.62:0.34:0.61:0.35:0.61:0.28:0.58:0.06"] = 392, -- Acherus: The Ebon Hold, Light's Hope Chapel, Zul'Aman, Shattered Sun Staging Area @@ -560,7 +560,7 @@ }, -- Horde: Kalimdor - [1414] = { + [1] = { -- Horde: Bloodvenom Post (Felwood) ["0.46:0.30:0.56:0.53:0.55:0.73:0.61:0.80"] = 518, -- Bloodvenom Post, Crossroads, Freewind Post, Gadgetzan @@ -961,14 +961,14 @@ ["0.63:0.44:0.45:0.56"] = 224, -- Orgrimmar, Thunder Bluff (David Galindo suggested 233) ["0.63:0.44:0.56:0.53"] = 110, -- Orgrimmar, Crossroads ["0.63:0.44:0.61:0.55"] = 108, -- Orgrimmar, Ratchet - ["0.63:0.44:0.63:0.36"] = 95, -- Orgrimmar, Valormok - ["0.63:0.44:0.55:0.42"] = 90, -- Orgrimmar, Splintertree Post + ["0.63:0.56:0.00:0.00:0.63:0.64"] = 95, -- Orgrimmar, Valormok + ["0.63:0.56:0.00:0.000.63:0.64"] = 90, -- Orgrimmar, Splintertree Post ["0.63:0.44:0.56:0.53:0.41:0.47"] = 258, -- Orgrimmar, Crossroads, Sun Rock Retreat ["0.63:0.44:0.55:0.42:0.41:0.37"] = 249, -- Orgrimmar, Splintertree Post, Zoram'gar Outpost ["0.63:0.44:0.55:0.42:0.50:0.35"] = 168, -- Orgrimmar, Splintertree Post, Emerald Sanctuary ["0.63:0.44:0.46:0.30"] = 252, -- Orgrimmar, Bloodvenom Post - ["0.63:0.44:0.63:0.36:0.64:0.23:0.54:0.21"] = 358, -- Orgrimmar, Valormok, Everlook, Moonglade - ["0.63:0.44:0.64:0.23"] = 240, -- Orgrimmar, Everlook + ["0.63:0.56:0.64:0.77:0.54:0.79:0.00:0.00"] = 358, -- Orgrimmar, Valormok, Everlook, Moonglade + ["0.63:0.56:0.00:0.00:0.64:0.77"] = 240, -- Orgrimmar, Everlook ["0.63:0.44:0.55:0.42:0.50:0.35:0.46:0.30:0.54:0.21"] = 371, -- Orgrimmar, Splintertree Post, Emerald Sanctuary, Bloodvenom Post, Moonglade ["0.63:0.44:0.56:0.53:0.41:0.37"] = 339, -- Orgrimmar, Crossroads, Zoram'gar Outpost ["0.63:0.44:0.64:0.23:0.54:0.21"] = 374, -- Orgrimmar, Everlook, Moonglade @@ -1201,7 +1201,7 @@ }, -- Horde: Outland - [1945] = { + [3] = { -- Horde: Altar of Sha'tar (Shadowmoon Valley) ["0.81:0.77:0.66:0.77"] = 67, -- Altar of Sha'tar, Shadowmoon Village @@ -1694,7 +1694,7 @@ }, -- Horde: Northrend - [113] = { + [4] = { ---------------------------------------------------------------------- -- Horde: Borean Tundra diff --git a/Leatrix_Plus_Library.lua b/Leatrix_Plus_Library.lua index 3d2671a..246238b 100644 --- a/Leatrix_Plus_Library.lua +++ b/Leatrix_Plus_Library.lua @@ -13,7 +13,7 @@ -- -- LibCandyBar 10.0.1: -- -- 16: LibCandyBar: (?s)-- LibCandyBarStart\R?\K.*?(?=-- LibCandyBarEnd) --- local void, Leatrix_Plus = ... +local void, Leatrix_Plus = ... -- ---------------------------------------------------------------------- -- -- L11: LibDBIcon: LibStub @@ -1152,526 +1152,527 @@ -- -- L16: LibDBIcon: LibCandyBar -- ---------------------------------------------------------------------- --- function Leatrix_Plus:LeaPlusCandyBar() +function Leatrix_Plus:LeaPlusCandyBar() --- -- LibCandyBarStart --- --@curseforge-project-slug: libcandybar-3-0@ --- --- **LibCandyBar-3.0** provides elegant timerbars with icons for use in addons. --- -- It is based of the original ideas of the CandyBar and CandyBar-2.0 library. --- -- In contrary to the earlier libraries LibCandyBar-3.0 provides you with a timerbar object with a simple API. --- -- --- -- Creating a new timerbar using the ':New' function will return a new timerbar object. This timerbar object inherits all of the barPrototype functions listed here. \\ --- -- --- -- @usage --- -- local candy = LibStub("LibCandyBar-3.0") --- -- local texture = "Interface\\AddOns\\MyAddOn\\statusbar" --- -- local mybar = candy:New(texture, 100, 16) --- -- mybar:SetLabel("Yay!") --- -- mybar:SetDuration(60) --- -- mybar:Start() --- -- @class file --- -- @name LibCandyBar-3.0 +-- LibCandyBarStart +--@curseforge-project-slug: libcandybar-3-0@ +--- **LibCandyBar-3.0** provides elegant timerbars with icons for use in addons. +-- It is based of the original ideas of the CandyBar and CandyBar-2.0 library. +-- In contrary to the earlier libraries LibCandyBar-3.0 provides you with a timerbar object with a simple API. +-- +-- Creating a new timerbar using the ':New' function will return a new timerbar object. This timerbar object inherits all of the barPrototype functions listed here. \\ +-- +-- @usage +-- local candy = LibStub("LibCandyBar-3.0") +-- local texture = "Interface\\AddOns\\MyAddOn\\statusbar" +-- local mybar = candy:New(texture, 100, 16) +-- mybar:SetLabel("Yay!") +-- mybar:SetDuration(60) +-- mybar:Start() +-- @class file +-- @name LibCandyBar-3.0 --- local GetTime, floor, next = GetTime, floor, next --- local CreateFrame, error, setmetatable, UIParent = CreateFrame, error, setmetatable, UIParent +local GetTime, floor, next = GetTime, floor, next +local CreateFrame, error, setmetatable, UIParent = CreateFrame, error, setmetatable, UIParent --- if not LibStub then error("LibCandyBar-3.0 requires LibStub.") end --- local cbh = LibStub:GetLibrary("CallbackHandler-1.0") --- if not cbh then error("LibCandyBar-3.0 requires CallbackHandler-1.0") end --- local lib = LibStub:NewLibrary("LibCandyBar-3.0", 100) -- Bump minor on changes --- if not lib then return end --- lib.callbacks = lib.callbacks or cbh:New(lib) --- local cb = lib.callbacks --- lib.dummyFrame = lib.dummyFrame or CreateFrame("Frame") --- lib.barFrameMT = lib.barFrameMT or {__index = lib.dummyFrame} --- lib.barPrototype = lib.barPrototype or setmetatable({}, lib.barFrameMT) --- lib.barPrototype_mt = lib.barPrototype_mt or {__index = lib.barPrototype} --- lib.barCache = lib.barCache or {} +if not LibStub then error("LibCandyBar-3.0 requires LibStub.") end +local cbh = LibStub:GetLibrary("CallbackHandler-1.0") +if not cbh then error("LibCandyBar-3.0 requires CallbackHandler-1.0") end +local lib = LibStub:NewLibrary("LibCandyBar-3.0", 100) -- Bump minor on changes +if not lib then return end +lib.callbacks = lib.callbacks or cbh:New(lib) +local cb = lib.callbacks +lib.dummyFrame = lib.dummyFrame or CreateFrame("Frame") +lib.barFrameMT = lib.barFrameMT or {__index = lib.dummyFrame} +lib.barPrototype = lib.barPrototype or setmetatable({}, lib.barFrameMT) +lib.barPrototype_mt = lib.barPrototype_mt or {__index = lib.barPrototype} +lib.barCache = lib.barCache or {} --- local barPrototype = lib.barPrototype --- local barPrototype_meta = lib.barPrototype_mt --- local barCache = lib.barCache +local barPrototype = lib.barPrototype +local barPrototype_meta = lib.barPrototype_mt +local barCache = lib.barCache --- local scripts = { --- "OnUpdate", "OnDragStart", "OnDragStop", --- "OnEnter", "OnLeave", "OnHide", --- "OnShow", "OnMouseDown", "OnMouseUp", --- "OnMouseWheel", "OnSizeChanged", "OnEvent" --- } --- local numScripts = #scripts --- local GameFontHighlightSmallOutline = GameFontHighlightSmallOutline --- local _fontName, _fontSize = GameFontHighlightSmallOutline:GetFont() --- local _fontShadowX, _fontShadowY = GameFontHighlightSmallOutline:GetShadowOffset() +local scripts = { + "OnUpdate", "OnDragStart", "OnDragStop", + "OnEnter", "OnLeave", "OnHide", + "OnShow", "OnMouseDown", "OnMouseUp", + "OnMouseWheel", "OnSizeChanged", "OnEvent" +} +local numScripts = #scripts +local GameFontHighlightSmallOutline = GameFontHighlightSmallOutline +local _fontName, _fontSize = GameFontHighlightSmallOutline:GetFont() +local _fontShadowX, _fontShadowY = GameFontHighlightSmallOutline:GetShadowOffset() -- local _fontShadowR, _fontShadowG, _fontShadowB, _fontShadowA = GameFontHighlightSmallOutline:GetShadowColor() --- local SetWidth, SetHeight, SetSize = lib.dummyFrame.SetWidth, lib.dummyFrame.SetHeight, lib.dummyFrame.SetSize +local _fontShadowR, _fontShadowG, _fontShadowB, _fontShadowA = nil +local SetWidth, SetHeight, SetSize = lib.dummyFrame.SetWidth, lib.dummyFrame.SetHeight, lib.dummyFrame.SetSize --- local function stopBar(bar) --- bar.updater:Stop() --- bar.data = nil --- bar.funcs = nil --- bar.running = nil --- bar.paused = nil --- bar:Hide() --- bar:SetParent(UIParent) +local function stopBar(bar) + bar.updater:Stop() + bar.data = nil + bar.funcs = nil + bar.running = nil + bar.paused = nil + bar:Hide() + bar:SetParent(UIParent) +end + +local tformat1 = "%d:%02d:%02d" +local tformat2 = "%d:%02d" +local tformat3 = "%.1f" +local tformat4 = "%.0f" +local function barUpdate(updater) + local bar = updater.parent + local t = GetTime() + if t >= bar.exp then + bar:Stop() + else + local time = bar.exp - t + bar.remaining = time + + bar.candyBarBar:SetValue(bar.fill and (t-bar.start)+bar.gap or time) + + if time > 3599.9 then -- > 1 hour + local h = floor(time/3600) + local m = floor((time - (h*3600))/60) + local s = (time - (m*60)) - (h*3600) + bar.candyBarDuration:SetFormattedText(tformat1, h, m, s) + elseif time > 59.9 then -- 1 minute to 1 hour + local m = floor(time/60) + local s = time - (m*60) + bar.candyBarDuration:SetFormattedText(tformat2, m, s) + elseif time < 10 then -- 0 to 10 seconds + bar.candyBarDuration:SetFormattedText(tformat3, time) + else -- 10 seconds to one minute + bar.candyBarDuration:SetFormattedText(tformat4, time) + end + + if bar.funcs then + for i = 1, #bar.funcs do + bar.funcs[i](bar) + end + end + end +end + +local atformat1 = "~%d:%02d:%02d" +local atformat2 = "~%d:%02d" +local atformat3 = "~%.1f" +local atformat4 = "~%.0f" +local function barUpdateApprox(updater) + local bar = updater.parent + local t = GetTime() + if t >= bar.exp then + bar:Stop() + else + local time = bar.exp - t + bar.remaining = time + + bar.candyBarBar:SetValue(bar.fill and (t-bar.start)+bar.gap or time) + + if time > 3599.9 then -- > 1 hour + local h = floor(time/3600) + local m = floor((time - (h*3600))/60) + local s = (time - (m*60)) - (h*3600) + bar.candyBarDuration:SetFormattedText(atformat1, h, m, s) + elseif time > 59.9 then -- 1 minute to 1 hour + local m = floor(time/60) + local s = time - (m*60) + bar.candyBarDuration:SetFormattedText(atformat2, m, s) + elseif time < 10 then -- 0 to 10 seconds + bar.candyBarDuration:SetFormattedText(atformat3, time) + else -- 10 seconds to one minute + bar.candyBarDuration:SetFormattedText(atformat4, time) + end + + if bar.funcs then + for i = 1, #bar.funcs do + bar.funcs[i](bar) + end + end + end +end + +-- ------------------------------------------------------------------------------ +-- Bar functions +-- + +local function restyleBar(self) + if not self.running then return end + self.candyBarIconFrame:ClearAllPoints() + self.candyBarBar:ClearAllPoints() + -- In the past we used a :GetTexture check here, but as of WoW v5 it randomly returns nil, so use our own trustworthy variable. + if self.candyBarIconFrame.icon then + self.candyBarIconFrame:SetWidth(self.height) + if self.iconPosition == "RIGHT" then + self.candyBarIconFrame:SetPoint("TOPRIGHT", self) + self.candyBarIconFrame:SetPoint("BOTTOMRIGHT", self) + self.candyBarBar:SetPoint("TOPRIGHT", self.candyBarIconFrame, "TOPLEFT") + self.candyBarBar:SetPoint("BOTTOMRIGHT", self.candyBarIconFrame, "BOTTOMLEFT") + self.candyBarBar:SetPoint("TOPLEFT", self) + self.candyBarBar:SetPoint("BOTTOMLEFT", self) + else + self.candyBarIconFrame:SetPoint("TOPLEFT") + self.candyBarIconFrame:SetPoint("BOTTOMLEFT") + self.candyBarBar:SetPoint("TOPLEFT", self.candyBarIconFrame, "TOPRIGHT") + self.candyBarBar:SetPoint("BOTTOMLEFT", self.candyBarIconFrame, "BOTTOMRIGHT") + self.candyBarBar:SetPoint("TOPRIGHT", self) + self.candyBarBar:SetPoint("BOTTOMRIGHT", self) + end + self.candyBarIconFrame:Show() + else + self.candyBarBar:SetPoint("TOPLEFT", self) + self.candyBarBar:SetPoint("BOTTOMRIGHT", self) + self.candyBarIconFrame:Hide() + end + if self.showLabel and self.candyBarLabel.text then + self.candyBarLabel:Show() + else + self.candyBarLabel:Hide() + end + if self.showTime then + self.candyBarDuration:Show() + else + self.candyBarDuration:Hide() + end +end + +--- Set whether the bar should drain (default) or fill up. +-- @param fill Boolean true/false +function barPrototype:SetFill(fill) + self.fill = fill +end +--- Adds a function to the timerbar. The function will run every update and will receive the bar as a parameter. +-- @param func Function to run every update. +-- @usage +-- -- The example below will print the time remaining to the chatframe every update. Yes, that's a whole lot of spam +-- mybar:AddUpdateFunction( function(bar) print(bar.remaining) end ) +function barPrototype:AddUpdateFunction(func) if not self.funcs then self.funcs = {} end; self.funcs[#self.funcs+1] = func end +--- Sets user data in the timerbar object. +-- @param key Key to use for the data storage. +-- @param data Data to store. +function barPrototype:Set(key, data) if not self.data then self.data = {} end; self.data[key] = data end +--- Retrieves user data from the timerbar object. +-- @param key Key to retrieve +function barPrototype:Get(key) return self.data and self.data[key] end +--- Sets the color of the bar. +-- This is basically a wrapper to SetStatusBarColor. +-- @paramsig r, g, b, a +-- @param r Red component (0-1) +-- @param g Green component (0-1) +-- @param b Blue component (0-1) +-- @param a Alpha (0-1) +function barPrototype:SetColor(...) self.candyBarBar:SetStatusBarColor(...) end +--- Sets the color of the bar label and bar duration text. +-- @paramsig r, g, b, a +-- @param r Red component (0-1) +-- @param g Green component (0-1) +-- @param b Blue component (0-1) +-- @param a Alpha (0-1) +function barPrototype:SetTextColor(...) + self.candyBarLabel:SetTextColor(...) + self.candyBarDuration:SetTextColor(...) +end +--- Sets the shadow color of the bar label and bar duration text. +-- @paramsig r, g, b, a +-- @param r Red component (0-1) +-- @param g Green component (0-1) +-- @param b Blue component (0-1) +-- @param a Alpha (0-1) +function barPrototype:SetShadowColor(...) + self.candyBarLabel:SetShadowColor(...) + self.candyBarDuration:SetShadowColor(...) +end +--- Sets the texture of the bar. +-- This should only be needed on running bars that get changed on the fly. +-- @param texture Path to the bar texture. +function barPrototype:SetTexture(texture) + self.candyBarBar:SetStatusBarTexture(texture) + self.candyBarBackground:SetTexture(texture) +end +--- Sets the width of the bar. +-- This should only be needed on running bars that get changed on the fly. +-- @param width Width of the bar. +function barPrototype:SetWidth(width) + self.width = width + SetWidth(self, width) +end +--- Sets the height of the bar. +-- This should only be needed on running bars that get changed on the fly. +-- @param height Height of the bar. +function barPrototype:SetHeight(height) + self.height = height + SetHeight(self, height) + restyleBar(self) +end +--- Sets the size of the bar. +-- This should only be needed on running bars that get changed on the fly. +-- @param width Width of the bar. +-- @param height Height of the bar. +function barPrototype:SetSize(width, height) + self.width = width + self.height = height + SetSize(self, width, height) + restyleBar(self) +end +--- Returns the label (text) currently set on the bar. +function barPrototype:GetLabel() + return self.candyBarLabel.text +end +--- Sets the label on the bar. +-- @param text Label text. +function barPrototype:SetLabel(text) + self.candyBarLabel.text = text + self.candyBarLabel:SetText(text) + if text then + self.candyBarLabel:Show() + else + self.candyBarLabel:Hide() + end +end +--- Returns the icon texture path currently set on the bar, if it has an icon set. +function barPrototype:GetIcon() + return self.candyBarIconFrame.icon +end +--- Sets the icon next to the bar. +-- @param icon Path to the icon texture or nil to not display an icon. +-- @param ... Optional icon coordinates for texture trimming. +function barPrototype:SetIcon(icon, ...) + self.candyBarIconFrame.icon = icon + self.candyBarIconFrame:SetTexture(icon) + if ... then + self.candyBarIconFrame:SetTexCoord(...) + else + self.candyBarIconFrame:SetTexCoord(0.07, 0.93, 0.07, 0.93) + end + restyleBar(self) +end +--- Sets which side of the bar the icon should appear. +-- @param position Position of the icon according to the bar, either "LEFT" or "RIGHT" as a string. Set to "LEFT" by default. +function barPrototype:SetIconPosition(position) + self.iconPosition = position + restyleBar(self) +end +--- Sets wether or not the time indicator on the right of the bar should be shown. +-- Time is shown by default. +-- @param bool true to show the time, false/nil to hide the time. +function barPrototype:SetTimeVisibility(bool) + self.showTime = bool + if bool then + self.candyBarDuration:Show() + else + self.candyBarDuration:Hide() + end +end +--- Sets wether or not the label on the left of the bar should be shown. +-- label is shown by default. +-- @param bool true to show the label, false/nil to hide the label. +function barPrototype:SetLabelVisibility(bool) + self.showLabel = bool + if bool then + self.candyBarLabel:Show() + else + self.candyBarLabel:Hide() + end +end +--- Sets the duration of the bar. +-- This can also be used while the bar is running to adjust the time remaining, within the bounds of the original duration. +-- @param duration Duration of the bar in seconds. +-- @param isApprox Boolean. True if you wish the time display to be an approximate "~5" instead of "5" +function barPrototype:SetDuration(duration, isApprox) self.remaining = duration; self.isApproximate = isApprox end +--- Shows the bar and starts it. +-- @param maxValue Number. If you don't wish your bar to start full, you can set a max value. A maxValue of 10 on a bar with a duration of 5 would start it at 50%. +function barPrototype:Start(maxValue) + self.running = true + local time = self.remaining + self.gap = maxValue and maxValue-time or 0 + restyleBar(self) + self.start = GetTime() + self.exp = self.start + time + + self.candyBarBar:SetMinMaxValues(0, maxValue or time) + self.candyBarBar:SetValue(self.fill and 0 or time) + + if self.isApproximate then + if time > 3599.9 then -- > 1 hour + local h = floor(time/3600) + local m = floor((time - (h*3600))/60) + local s = (time - (m*60)) - (h*3600) + self.candyBarDuration:SetFormattedText(atformat1, h, m, s) + elseif time > 59.9 then -- 1 minute to 1 hour + local m = floor(time/60) + local s = time - (m*60) + self.candyBarDuration:SetFormattedText(atformat2, m, s) + elseif time < 10 then -- 0 to 10 seconds + self.candyBarDuration:SetFormattedText(atformat3, time) + else -- 10 seconds to one minute + self.candyBarDuration:SetFormattedText(atformat4, time) + end + self.updater:SetScript("OnLoop", barUpdateApprox) + else + if time > 3599.9 then -- > 1 hour + local h = floor(time/3600) + local m = floor((time - (h*3600))/60) + local s = (time - (m*60)) - (h*3600) + self.candyBarDuration:SetFormattedText(tformat1, h, m, s) + elseif time > 59.9 then -- 1 minute to 1 hour + local m = floor(time/60) + local s = time - (m*60) + self.candyBarDuration:SetFormattedText(tformat2, m, s) + elseif time < 10 then -- 0 to 10 seconds + self.candyBarDuration:SetFormattedText(tformat3, time) + else -- 10 seconds to one minute + self.candyBarDuration:SetFormattedText(tformat4, time) + end + self.updater:SetScript("OnLoop", barUpdate) + end + self.updater:Play() + self:Show() +end +--- Pauses a running bar +function barPrototype:Pause() + if not self.paused then + self.updater:Pause() + self.paused = GetTime() + end +end +--- Resumes a paused bar +function barPrototype:Resume() + if self.paused then + local t = GetTime() + self.exp = t + self.remaining + self.start = self.start + (t-self.paused) + self.updater:Play() + self.paused = nil + end +end +--- Stops the bar. +-- This will stop the bar, fire the LibCandyBar_Stop callback, and recycle the bar into the candybar pool. +-- Note: make sure you remove all references to the bar in your addon upon receiving the LibCandyBar_Stop callback. +-- @usage +-- -- The example below shows the use of the LibCandyBar_Stop callback by printing the contents of the label in the chatframe +-- local function barstopped( callback, bar ) +-- print( bar:GetLabel(), "stopped") -- end +-- LibStub("LibCandyBar-3.0"):RegisterCallback(myaddonobject, "LibCandyBar_Stop", barstopped) +-- @param ... Optional args to pass across in the LibCandyBar_Stop callback. +function barPrototype:Stop(...) + cb:Fire("LibCandyBar_Stop", self, ...) + stopBar(self) + barCache[self] = true +end --- local tformat1 = "%d:%02d:%02d" --- local tformat2 = "%d:%02d" --- local tformat3 = "%.1f" --- local tformat4 = "%.0f" --- local function barUpdate(updater) --- local bar = updater.parent --- local t = GetTime() --- if t >= bar.exp then --- bar:Stop() --- else --- local time = bar.exp - t --- bar.remaining = time +-- ------------------------------------------------------------------------------ +-- Library functions +-- --- bar.candyBarBar:SetValue(bar.fill and (t-bar.start)+bar.gap or time) +--- Creates a new timerbar object and returns it. Don't forget to set the duration, label and :Start the timer bar after you get a hold of it! +-- @paramsig texture, width, height +-- @param texture Path to the texture used for the bar. +-- @param width Width of the bar. +-- @param height Height of the bar. +-- @usage +-- mybar = LibStub("LibCandyBar-3.0"):New("Interface\\AddOns\\MyAddOn\\media\\statusbar", 100, 16) +function lib:New(texture, width, height) + local bar = next(barCache) + if not bar then + local frame = CreateFrame("Frame", nil, UIParent) + bar = setmetatable(frame, barPrototype_meta) --- if time > 3599.9 then -- > 1 hour --- local h = floor(time/3600) --- local m = floor((time - (h*3600))/60) --- local s = (time - (m*60)) - (h*3600) --- bar.candyBarDuration:SetFormattedText(tformat1, h, m, s) --- elseif time > 59.9 then -- 1 minute to 1 hour --- local m = floor(time/60) --- local s = time - (m*60) --- bar.candyBarDuration:SetFormattedText(tformat2, m, s) --- elseif time < 10 then -- 0 to 10 seconds --- bar.candyBarDuration:SetFormattedText(tformat3, time) --- else -- 10 seconds to one minute --- bar.candyBarDuration:SetFormattedText(tformat4, time) --- end + local icon = bar:CreateTexture() + icon:SetPoint("TOPLEFT") + icon:SetPoint("BOTTOMLEFT") + icon:Show() + bar.candyBarIconFrame = icon --- if bar.funcs then --- for i = 1, #bar.funcs do --- bar.funcs[i](bar) --- end --- end --- end --- end + local statusbar = CreateFrame("StatusBar", nil, bar) + statusbar:SetPoint("TOPRIGHT") + statusbar:SetPoint("BOTTOMRIGHT") + bar.candyBarBar = statusbar --- local atformat1 = "~%d:%02d:%02d" --- local atformat2 = "~%d:%02d" --- local atformat3 = "~%.1f" --- local atformat4 = "~%.0f" --- local function barUpdateApprox(updater) --- local bar = updater.parent --- local t = GetTime() --- if t >= bar.exp then --- bar:Stop() --- else --- local time = bar.exp - t --- bar.remaining = time + local bg = statusbar:CreateTexture(nil, "BACKGROUND") + bg:SetAllPoints() + bar.candyBarBackground = bg --- bar.candyBarBar:SetValue(bar.fill and (t-bar.start)+bar.gap or time) + local backdrop = CreateFrame("Frame", nil, bar, "BackdropTemplate") -- Used by bar stylers for backdrops + backdrop:SetFrameLevel(0) + bar.candyBarBackdrop = backdrop --- if time > 3599.9 then -- > 1 hour --- local h = floor(time/3600) --- local m = floor((time - (h*3600))/60) --- local s = (time - (m*60)) - (h*3600) --- bar.candyBarDuration:SetFormattedText(atformat1, h, m, s) --- elseif time > 59.9 then -- 1 minute to 1 hour --- local m = floor(time/60) --- local s = time - (m*60) --- bar.candyBarDuration:SetFormattedText(atformat2, m, s) --- elseif time < 10 then -- 0 to 10 seconds --- bar.candyBarDuration:SetFormattedText(atformat3, time) --- else -- 10 seconds to one minute --- bar.candyBarDuration:SetFormattedText(atformat4, time) --- end + local iconBackdrop = CreateFrame("Frame", nil, bar, "BackdropTemplate") -- Used by bar stylers for backdrops + iconBackdrop:SetFrameLevel(0) + bar.candyBarIconFrameBackdrop = iconBackdrop --- if bar.funcs then --- for i = 1, #bar.funcs do --- bar.funcs[i](bar) --- end --- end --- end --- end + local duration = statusbar:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmallOutline") + duration:SetPoint("TOPLEFT", statusbar, "TOPLEFT", 2, 0) + duration:SetPoint("BOTTOMRIGHT", statusbar, "BOTTOMRIGHT", -2, 0) + bar.candyBarDuration = duration --- -- ------------------------------------------------------------------------------ --- -- Bar functions --- -- + local label = statusbar:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmallOutline") + label:SetPoint("TOPLEFT", statusbar, "TOPLEFT", 2, 0) + label:SetPoint("BOTTOMRIGHT", statusbar, "BOTTOMRIGHT", -2, 0) + bar.candyBarLabel = label --- local function restyleBar(self) --- if not self.running then return end --- self.candyBarIconFrame:ClearAllPoints() --- self.candyBarBar:ClearAllPoints() --- -- In the past we used a :GetTexture check here, but as of WoW v5 it randomly returns nil, so use our own trustworthy variable. --- if self.candyBarIconFrame.icon then --- self.candyBarIconFrame:SetWidth(self.height) --- if self.iconPosition == "RIGHT" then --- self.candyBarIconFrame:SetPoint("TOPRIGHT", self) --- self.candyBarIconFrame:SetPoint("BOTTOMRIGHT", self) --- self.candyBarBar:SetPoint("TOPRIGHT", self.candyBarIconFrame, "TOPLEFT") --- self.candyBarBar:SetPoint("BOTTOMRIGHT", self.candyBarIconFrame, "BOTTOMLEFT") --- self.candyBarBar:SetPoint("TOPLEFT", self) --- self.candyBarBar:SetPoint("BOTTOMLEFT", self) --- else --- self.candyBarIconFrame:SetPoint("TOPLEFT") --- self.candyBarIconFrame:SetPoint("BOTTOMLEFT") --- self.candyBarBar:SetPoint("TOPLEFT", self.candyBarIconFrame, "TOPRIGHT") --- self.candyBarBar:SetPoint("BOTTOMLEFT", self.candyBarIconFrame, "BOTTOMRIGHT") --- self.candyBarBar:SetPoint("TOPRIGHT", self) --- self.candyBarBar:SetPoint("BOTTOMRIGHT", self) --- end --- self.candyBarIconFrame:Show() --- else --- self.candyBarBar:SetPoint("TOPLEFT", self) --- self.candyBarBar:SetPoint("BOTTOMRIGHT", self) --- self.candyBarIconFrame:Hide() --- end --- if self.showLabel and self.candyBarLabel.text then --- self.candyBarLabel:Show() --- else --- self.candyBarLabel:Hide() --- end --- if self.showTime then --- self.candyBarDuration:Show() --- else --- self.candyBarDuration:Hide() --- end --- end + local updater = bar:CreateAnimationGroup() + updater:SetLooping("REPEAT") + updater.parent = bar + local anim = updater:CreateAnimation() + anim:SetDuration(0.04) + bar.updater = updater + bar.repeater = anim + else + barCache[bar] = nil + end --- --- Set whether the bar should drain (default) or fill up. --- -- @param fill Boolean true/false --- function barPrototype:SetFill(fill) --- self.fill = fill --- end --- --- Adds a function to the timerbar. The function will run every update and will receive the bar as a parameter. --- -- @param func Function to run every update. --- -- @usage --- -- -- The example below will print the time remaining to the chatframe every update. Yes, that's a whole lot of spam --- -- mybar:AddUpdateFunction( function(bar) print(bar.remaining) end ) --- function barPrototype:AddUpdateFunction(func) if not self.funcs then self.funcs = {} end; self.funcs[#self.funcs+1] = func end --- --- Sets user data in the timerbar object. --- -- @param key Key to use for the data storage. --- -- @param data Data to store. --- function barPrototype:Set(key, data) if not self.data then self.data = {} end; self.data[key] = data end --- --- Retrieves user data from the timerbar object. --- -- @param key Key to retrieve --- function barPrototype:Get(key) return self.data and self.data[key] end --- --- Sets the color of the bar. --- -- This is basically a wrapper to SetStatusBarColor. --- -- @paramsig r, g, b, a --- -- @param r Red component (0-1) --- -- @param g Green component (0-1) --- -- @param b Blue component (0-1) --- -- @param a Alpha (0-1) --- function barPrototype:SetColor(...) self.candyBarBar:SetStatusBarColor(...) end --- --- Sets the color of the bar label and bar duration text. --- -- @paramsig r, g, b, a --- -- @param r Red component (0-1) --- -- @param g Green component (0-1) --- -- @param b Blue component (0-1) --- -- @param a Alpha (0-1) --- function barPrototype:SetTextColor(...) --- self.candyBarLabel:SetTextColor(...) --- self.candyBarDuration:SetTextColor(...) --- end --- --- Sets the shadow color of the bar label and bar duration text. --- -- @paramsig r, g, b, a --- -- @param r Red component (0-1) --- -- @param g Green component (0-1) --- -- @param b Blue component (0-1) --- -- @param a Alpha (0-1) --- function barPrototype:SetShadowColor(...) --- self.candyBarLabel:SetShadowColor(...) --- self.candyBarDuration:SetShadowColor(...) --- end --- --- Sets the texture of the bar. --- -- This should only be needed on running bars that get changed on the fly. --- -- @param texture Path to the bar texture. --- function barPrototype:SetTexture(texture) --- self.candyBarBar:SetStatusBarTexture(texture) --- self.candyBarBackground:SetTexture(texture) --- end --- --- Sets the width of the bar. --- -- This should only be needed on running bars that get changed on the fly. --- -- @param width Width of the bar. --- function barPrototype:SetWidth(width) --- self.width = width --- SetWidth(self, width) --- end --- --- Sets the height of the bar. --- -- This should only be needed on running bars that get changed on the fly. --- -- @param height Height of the bar. --- function barPrototype:SetHeight(height) --- self.height = height --- SetHeight(self, height) --- restyleBar(self) --- end --- --- Sets the size of the bar. --- -- This should only be needed on running bars that get changed on the fly. --- -- @param width Width of the bar. --- -- @param height Height of the bar. --- function barPrototype:SetSize(width, height) --- self.width = width --- self.height = height --- SetSize(self, width, height) --- restyleBar(self) --- end --- --- Returns the label (text) currently set on the bar. --- function barPrototype:GetLabel() --- return self.candyBarLabel.text --- end --- --- Sets the label on the bar. --- -- @param text Label text. --- function barPrototype:SetLabel(text) --- self.candyBarLabel.text = text --- self.candyBarLabel:SetText(text) --- if text then --- self.candyBarLabel:Show() --- else --- self.candyBarLabel:Hide() --- end --- end --- --- Returns the icon texture path currently set on the bar, if it has an icon set. --- function barPrototype:GetIcon() --- return self.candyBarIconFrame.icon --- end --- --- Sets the icon next to the bar. --- -- @param icon Path to the icon texture or nil to not display an icon. --- -- @param ... Optional icon coordinates for texture trimming. --- function barPrototype:SetIcon(icon, ...) --- self.candyBarIconFrame.icon = icon --- self.candyBarIconFrame:SetTexture(icon) --- if ... then --- self.candyBarIconFrame:SetTexCoord(...) --- else --- self.candyBarIconFrame:SetTexCoord(0.07, 0.93, 0.07, 0.93) --- end --- restyleBar(self) --- end --- --- Sets which side of the bar the icon should appear. --- -- @param position Position of the icon according to the bar, either "LEFT" or "RIGHT" as a string. Set to "LEFT" by default. --- function barPrototype:SetIconPosition(position) --- self.iconPosition = position --- restyleBar(self) --- end --- --- Sets wether or not the time indicator on the right of the bar should be shown. --- -- Time is shown by default. --- -- @param bool true to show the time, false/nil to hide the time. --- function barPrototype:SetTimeVisibility(bool) --- self.showTime = bool --- if bool then --- self.candyBarDuration:Show() --- else --- self.candyBarDuration:Hide() --- end --- end --- --- Sets wether or not the label on the left of the bar should be shown. --- -- label is shown by default. --- -- @param bool true to show the label, false/nil to hide the label. --- function barPrototype:SetLabelVisibility(bool) --- self.showLabel = bool --- if bool then --- self.candyBarLabel:Show() --- else --- self.candyBarLabel:Hide() --- end --- end --- --- Sets the duration of the bar. --- -- This can also be used while the bar is running to adjust the time remaining, within the bounds of the original duration. --- -- @param duration Duration of the bar in seconds. --- -- @param isApprox Boolean. True if you wish the time display to be an approximate "~5" instead of "5" --- function barPrototype:SetDuration(duration, isApprox) self.remaining = duration; self.isApproximate = isApprox end --- --- Shows the bar and starts it. --- -- @param maxValue Number. If you don't wish your bar to start full, you can set a max value. A maxValue of 10 on a bar with a duration of 5 would start it at 50%. --- function barPrototype:Start(maxValue) --- self.running = true --- local time = self.remaining --- self.gap = maxValue and maxValue-time or 0 --- restyleBar(self) --- self.start = GetTime() --- self.exp = self.start + time + bar:SetFrameStrata("MEDIUM") + bar:SetFrameLevel(100) -- Lots of room to create above or below this level + bar.candyBarBar:SetStatusBarTexture(texture) + bar.candyBarBackground:SetTexture(texture) + bar.width = width + bar.height = height --- self.candyBarBar:SetMinMaxValues(0, maxValue or time) --- self.candyBarBar:SetValue(self.fill and 0 or time) + -- RESET ALL THE THINGS! + bar.fill = nil + bar.showTime = true + bar.showLabel = true + bar.iconPosition = nil + for i = 1, numScripts do -- Update if scripts table is changed, faster than doing #scripts + bar:SetScript(scripts[i], nil) + end --- if self.isApproximate then --- if time > 3599.9 then -- > 1 hour --- local h = floor(time/3600) --- local m = floor((time - (h*3600))/60) --- local s = (time - (m*60)) - (h*3600) --- self.candyBarDuration:SetFormattedText(atformat1, h, m, s) --- elseif time > 59.9 then -- 1 minute to 1 hour --- local m = floor(time/60) --- local s = time - (m*60) --- self.candyBarDuration:SetFormattedText(atformat2, m, s) --- elseif time < 10 then -- 0 to 10 seconds --- self.candyBarDuration:SetFormattedText(atformat3, time) --- else -- 10 seconds to one minute --- self.candyBarDuration:SetFormattedText(atformat4, time) --- end --- self.updater:SetScript("OnLoop", barUpdateApprox) --- else --- if time > 3599.9 then -- > 1 hour --- local h = floor(time/3600) --- local m = floor((time - (h*3600))/60) --- local s = (time - (m*60)) - (h*3600) --- self.candyBarDuration:SetFormattedText(tformat1, h, m, s) --- elseif time > 59.9 then -- 1 minute to 1 hour --- local m = floor(time/60) --- local s = time - (m*60) --- self.candyBarDuration:SetFormattedText(tformat2, m, s) --- elseif time < 10 then -- 0 to 10 seconds --- self.candyBarDuration:SetFormattedText(tformat3, time) --- else -- 10 seconds to one minute --- self.candyBarDuration:SetFormattedText(tformat4, time) --- end --- self.updater:SetScript("OnLoop", barUpdate) --- end --- self.updater:Play() --- self:Show() --- end --- --- Pauses a running bar --- function barPrototype:Pause() --- if not self.paused then --- self.updater:Pause() --- self.paused = GetTime() --- end --- end --- --- Resumes a paused bar --- function barPrototype:Resume() --- if self.paused then --- local t = GetTime() --- self.exp = t + self.remaining --- self.start = self.start + (t-self.paused) --- self.updater:Play() --- self.paused = nil --- end --- end --- --- Stops the bar. --- -- This will stop the bar, fire the LibCandyBar_Stop callback, and recycle the bar into the candybar pool. --- -- Note: make sure you remove all references to the bar in your addon upon receiving the LibCandyBar_Stop callback. --- -- @usage --- -- -- The example below shows the use of the LibCandyBar_Stop callback by printing the contents of the label in the chatframe --- -- local function barstopped( callback, bar ) --- -- print( bar:GetLabel(), "stopped") --- -- end --- -- LibStub("LibCandyBar-3.0"):RegisterCallback(myaddonobject, "LibCandyBar_Stop", barstopped) --- -- @param ... Optional args to pass across in the LibCandyBar_Stop callback. --- function barPrototype:Stop(...) --- cb:Fire("LibCandyBar_Stop", self, ...) --- stopBar(self) --- barCache[self] = true --- end + bar.candyBarBackground:SetVertexColor(0.5, 0.5, 0.5, 0.3) + bar.candyBarBar:SetStatusBarColor(0.5, 0.5, 0.5, 1) + bar:ClearAllPoints() + SetWidth(bar, width) + SetHeight(bar, height) + bar:SetMovable(1) + bar:SetScale(1) + bar:SetAlpha(1) + bar:SetClampedToScreen(false) + bar:EnableMouse(false) --- -- ------------------------------------------------------------------------------ --- -- Library functions --- -- + bar.candyBarLabel:SetTextColor(1,1,1,1) + bar.candyBarLabel:SetJustifyH("LEFT") + bar.candyBarLabel:SetJustifyV("MIDDLE") + bar.candyBarLabel:SetFont(_fontName, _fontSize) + bar.candyBarLabel:SetShadowOffset(_fontShadowX, _fontShadowY) + bar.candyBarLabel:SetShadowColor(_fontShadowR, _fontShadowG, _fontShadowB, _fontShadowA) --- --- Creates a new timerbar object and returns it. Don't forget to set the duration, label and :Start the timer bar after you get a hold of it! --- -- @paramsig texture, width, height --- -- @param texture Path to the texture used for the bar. --- -- @param width Width of the bar. --- -- @param height Height of the bar. --- -- @usage --- -- mybar = LibStub("LibCandyBar-3.0"):New("Interface\\AddOns\\MyAddOn\\media\\statusbar", 100, 16) --- function lib:New(texture, width, height) --- local bar = next(barCache) --- if not bar then --- local frame = CreateFrame("Frame", nil, UIParent) --- bar = setmetatable(frame, barPrototype_meta) - --- local icon = bar:CreateTexture() --- icon:SetPoint("TOPLEFT") --- icon:SetPoint("BOTTOMLEFT") --- icon:Show() --- bar.candyBarIconFrame = icon - --- local statusbar = CreateFrame("StatusBar", nil, bar) --- statusbar:SetPoint("TOPRIGHT") --- statusbar:SetPoint("BOTTOMRIGHT") --- bar.candyBarBar = statusbar - --- local bg = statusbar:CreateTexture(nil, "BACKGROUND") --- bg:SetAllPoints() --- bar.candyBarBackground = bg - --- local backdrop = CreateFrame("Frame", nil, bar, "BackdropTemplate") -- Used by bar stylers for backdrops --- backdrop:SetFrameLevel(0) --- bar.candyBarBackdrop = backdrop - --- local iconBackdrop = CreateFrame("Frame", nil, bar, "BackdropTemplate") -- Used by bar stylers for backdrops --- iconBackdrop:SetFrameLevel(0) --- bar.candyBarIconFrameBackdrop = iconBackdrop - --- local duration = statusbar:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmallOutline") --- duration:SetPoint("TOPLEFT", statusbar, "TOPLEFT", 2, 0) --- duration:SetPoint("BOTTOMRIGHT", statusbar, "BOTTOMRIGHT", -2, 0) --- bar.candyBarDuration = duration - --- local label = statusbar:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmallOutline") --- label:SetPoint("TOPLEFT", statusbar, "TOPLEFT", 2, 0) --- label:SetPoint("BOTTOMRIGHT", statusbar, "BOTTOMRIGHT", -2, 0) --- bar.candyBarLabel = label - --- local updater = bar:CreateAnimationGroup() --- updater:SetLooping("REPEAT") --- updater.parent = bar --- local anim = updater:CreateAnimation() --- anim:SetDuration(0.04) --- bar.updater = updater --- bar.repeater = anim --- else --- barCache[bar] = nil --- end - --- bar:SetFrameStrata("MEDIUM") --- bar:SetFrameLevel(100) -- Lots of room to create above or below this level --- bar.candyBarBar:SetStatusBarTexture(texture) --- bar.candyBarBackground:SetTexture(texture) --- bar.width = width --- bar.height = height - --- -- RESET ALL THE THINGS! --- bar.fill = nil --- bar.showTime = true --- bar.showLabel = true --- bar.iconPosition = nil --- for i = 1, numScripts do -- Update if scripts table is changed, faster than doing #scripts --- bar:SetScript(scripts[i], nil) --- end - --- bar.candyBarBackground:SetVertexColor(0.5, 0.5, 0.5, 0.3) --- bar.candyBarBar:SetStatusBarColor(0.5, 0.5, 0.5, 1) --- bar:ClearAllPoints() --- SetWidth(bar, width) --- SetHeight(bar, height) --- bar:SetMovable(1) --- bar:SetScale(1) --- bar:SetAlpha(1) --- bar:SetClampedToScreen(false) --- bar:EnableMouse(false) - --- bar.candyBarLabel:SetTextColor(1,1,1,1) --- bar.candyBarLabel:SetJustifyH("LEFT") --- bar.candyBarLabel:SetJustifyV("MIDDLE") --- bar.candyBarLabel:SetFont(_fontName, _fontSize) --- bar.candyBarLabel:SetShadowOffset(_fontShadowX, _fontShadowY) --- bar.candyBarLabel:SetShadowColor(_fontShadowR, _fontShadowG, _fontShadowB, _fontShadowA) - --- bar.candyBarDuration:SetTextColor(1,1,1,1) --- bar.candyBarDuration:SetJustifyH("RIGHT") --- bar.candyBarDuration:SetJustifyV("MIDDLE") --- bar.candyBarDuration:SetFont(_fontName, _fontSize) --- bar.candyBarDuration:SetShadowOffset(_fontShadowX, _fontShadowY) --- bar.candyBarDuration:SetShadowColor(_fontShadowR, _fontShadowG, _fontShadowB, _fontShadowA) + bar.candyBarDuration:SetTextColor(1,1,1,1) + bar.candyBarDuration:SetJustifyH("RIGHT") + bar.candyBarDuration:SetJustifyV("MIDDLE") + bar.candyBarDuration:SetFont(_fontName, _fontSize) + bar.candyBarDuration:SetShadowOffset(_fontShadowX, _fontShadowY) + bar.candyBarDuration:SetShadowColor(_fontShadowR, _fontShadowG, _fontShadowB, _fontShadowA) --- bar:SetLabel() --- bar:SetIcon() --- bar:SetDuration() + bar:SetLabel() + bar:SetIcon() + bar:SetDuration() --- return bar --- end + return bar +end --- -- LibCandyBarEnd +-- LibCandyBarEnd --- end +end --- -- L17: End +-- L17: End