From 1eb7d161d3428d89be84eb1f940e0fd180eddc30 Mon Sep 17 00:00:00 2001 From: Sattva Date: Tue, 13 Jun 2023 16:09:49 +0300 Subject: [PATCH] FlightPoints - first messy version For now i only figured and partilly fixed tooltip on the destination node. However data seems to be different from the WoTLK Classic. And would need to be completely rewritten. Also i have problem with debug string as it is currently unable to get hops FPs in between start and end nodes correctly... And it seems that my routestring is bad too. As it is for some reason adds un-needed zeroes between nodes For example: FP from Orgrimmar to Valormok, no hop in between them, Orgrimmar added twice and a lot of un-necessary zeroes in between. ["0.63:0.56:0.00:0.00:0.63:0.64"] = -- Orgrimmar, Orgrimmar, Valormok --- Changelog and Notes.txt | 2 + Leatrix_Plus.lua | 90 +-- Leatrix_Plus_Flight_Alliance.lua | 8 +- Leatrix_Plus_Flight_Horde.lua | 16 +- Leatrix_Plus_Library.lua | 991 ++++++++++++++++--------------- 5 files changed, 566 insertions(+), 541 deletions(-) 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