vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
assert( oRA, "oRA not found!")

------------------------------
--      Are you local?      --
------------------------------

local L = AceLibrary("AceLocale-2.2"):new("oRAOCoolDown")

local roster = AceLibrary("RosterLib-2.0")

----------------------------
--      Localization      --
----------------------------

L:RegisterTranslations("enUS", function() return {
        ["CoolDown Monitor"] = true,
        ["cooldown"] = true,
        ["cooldownoptional"] = true,
        ["Optional/CoolDown"] = true,
        ["Options for CoolDown."] = true,
        ["Toggle"] = true,
        ["toggle"] = true,
        ["Toggle the CoolDown Monitor."] = true,
} end )

L:RegisterTranslations("koKR", function() return {
        ["CoolDown Monitor"] = "재사용대기시간 모니터",
        ["Optional/CoolDown"] = "부가/재사용대기시간",
        ["Options for CoolDown."] = "재사용대기시간에 관한 설정.",
        ["Toggle"] = "토글",
        ["Toggle the CoolDown Monitor."] = "재사용대기시간 모니터 토글",
} end )

L:RegisterTranslations("zhCN", function() return {
        ["CoolDown Monitor"] = "冷却监视器",
        ["cooldown"] = "冷却",
        ["cooldownoptional"] = "cooldownoptional",
        ["Optional/CoolDown"] = "Optional/CoolDown",
        ["Options for CoolDown."] = "冷却监视器的选项",
        ["Toggle"] = "显示",
        ["toggle"] = "显示",
        ["Toggle the CoolDown Monitor."] = "显示冷却监视器",
} end )

L:RegisterTranslations("zhTW", function() return {
        ["CoolDown Monitor"] = "冷卻監視器",
        ["cooldown"] = "冷卻",
        ["cooldownoptional"] = "cooldownoptional",
        ["Optional/CoolDown"] = "可選/冷卻",
        ["Options for CoolDown."] = "冷卻監視器的選項",
        ["Toggle"] = "顯示",
        ["toggle"] = "顯示",
        ["Toggle the CoolDown Monitor."] = "顯示冷卻監視器",
} end )

L:RegisterTranslations("frFR", function() return {
        ["CoolDown Monitor"] = "Surveillance des \"cooldowns\"",
        --["cooldown"] = true,
        --["cooldownoptional"] = true,
        ["Optional/CoolDown"] = "Optionnel/Temps de recharge",
        ["Options for CoolDown."] = "Options concernant les temps de recharge.",
        ["Toggle"] = "Afficher",
        --["toggle"] = true,
        ["Toggle the CoolDown Monitor."] = "Affiche ou non la surveillance des temps de recharge.",
} end )

----------------------------------
--      Module Declaration      --
----------------------------------

oRAOCoolDown = oRA:NewModule(L["cooldownoptional"], "CandyBar-2.0")
oRAOCoolDown.defaults = {
        hidden = false,
        cooldowns = {},
}
oRAOCoolDown.optional = true
oRAOCoolDown.name = L["Optional/CoolDown"]
oRAOCoolDown.consoleCmd = L["cooldown"]
oRAOCoolDown.consoleOptions = {
        type = "group",
        desc = L["Options for CoolDown."],
        name = L["CoolDown Monitor"],
        args = {
                [L["toggle"]] = {
                        type = "toggle", name = L["Toggle"],
                        desc = L["Toggle the CoolDown Monitor."],
                        get = function() return not oRAOCoolDown.db.profile.hidden end,
                        set = function(v)
                                        oRAOCoolDown:ToggleView()
                        end,
                },
        }
}

------------------------------
--      Initialization      --
------------------------------

function oRAOCoolDown:OnEnable()
        roster:Enable()
        if not self.db.profile.cooldowns then self.db.profile.cooldowns = {} end
        self.enabled = nil

        self:RegisterEvent("oRA_LeftRaid")      
        self:RegisterEvent("oRA_JoinedRaid")
        self:RegisterEvent("oRA_BarTexture")
end

function oRAOCoolDown:OnDisable()
        self:UnregisterAllEvents()
        self:DisableMonitor()
end


------------------------
--   Event Handlers   --
------------------------

function oRAOCoolDown:oRA_JoinedRaid()
        if not self.enabled then
                self.enabled = true
                if not self.db.profile.hidden then
                        self:SetupFrames()
                        self.cdframe:Show()
                        self:StartAllCoolDowns()
                end
                self:RegisterCheck("CD", "oRA_CoolDown")
        end
end

function oRAOCoolDown:oRA_LeftRaid()
        self:DisableMonitor()
end

function oRAOCoolDown:oRA_CoolDown(msg, author)
        msg = self:CleanMessage(msg)
        local _,_,what,length = string.find( msg, "^CD (%d+) (%d+)")
        if author and what and time then
                if not self.db.profile.cooldowns then self.db.profile.cooldowns = {} end
                self.db.profile.cooldowns[author] = time() + tonumber(length)*60
                self:StartCoolDown( author, tonumber(length)*60)
        end
end

function oRAOCoolDown:oRA_BarTexture( texture )
        for key, val in pairs( self.db.profile.cooldowns) do
                self:SetCandyBarTexture( "oRAOCoolDown "..key, self.core.bartextures[texture] )
        end
end

-------------------------
--  Utility Functions  --
-------------------------

function oRAOCoolDown:DisableMonitor()
        self.enabled = nil
        if self.cdframe and self.cdframe:IsVisible() then self.cdframe:Hide() end
        self:StopAllCoolDowns()
        self:UnregisterCheck("CD")
end

function oRAOCoolDown:SavePosition()
        local f = self.cdframe
        local x,y = f:GetLeft(), f:GetTop()
        local s = f:GetEffectiveScale()
                
        x,y = x*s,y*s

        self.db.profile.posx = x
        self.db.profile.posy = y                
end

function oRAOCoolDown:RestorePosition()
        local x = self.db.profile.posx
        local y = self.db.profile.posy
                
        if not x or not y then return end
                                
        local f = self.cdframe
        local s = f:GetEffectiveScale()

        x,y = x/s,y/s

        f:ClearAllPoints()
        f:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", x, y)
end

function oRAOCoolDown:SetupFrames()
        if not self.cdframe then
                local cdframe = CreateFrame("Frame", "oRACoolDownFrame", UIParent)
                cdframe:EnableMouse(true)
                cdframe:SetMovable(true)
                cdframe:RegisterForDrag("LeftButton")
                cdframe:SetScript("OnDragStart", function() if IsAltKeyDown() then self["cdframe"]:StartMoving() end end)
                cdframe:SetScript("OnDragStop", function() self["cdframe"]:StopMovingOrSizing() self:SavePosition() end)
                cdframe:SetWidth(175)
                cdframe:SetHeight(50)
                --cdframe:SetBackdrop({
                --      bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background", tile = true, tileSize = 16,
                --      edgeFile = "Interface\Tooltips\UI-Tooltip-Border", edgeSize = 16,
                --      insets = {left = 0, right = 0, top = 0, bottom = 0},
                --})
                --cdframe:SetBackdropColor(0,0,0,0.5)
                --cdframe:SetBackdropBorderColor(1,1,1,.5)
                cdframe:Hide()
                cdframe:SetPoint("CENTER", UIParent, "CENTER", 0, 100)

                local title = cdframe:CreateFontString(nil, "ARTWORK")
                title:SetFontObject(GameFontNormalSmall)
                title:SetText(L["CoolDown Monitor"])
                title:SetJustifyH("CENTER")
                title:SetWidth(160)
                title:SetHeight(12)
                title:Show()
                title:ClearAllPoints()
                title:SetPoint("TOP", cdframe, "TOP", 0, -5)

                local text = cdframe:CreateFontString(nil, "ARTWORK")
                text:SetFontObject(GameFontHighlightSmall)
                text:SetJustifyH("CENTER")
                text:SetJustifyV("TOP")
                text:SetWidth(160)
                --text:SetHeight(25)
                text:Show()
                text:ClearAllPoints()
                text:SetPoint("TOPLEFT", title, "BOTTOMLEFT", 0, -5)

                self.cdframe = cdframe
                self.title = title
                self.text = text
                
                self:RestorePosition()
        end
end


function oRAOCoolDown:StartAllCoolDowns()
        local t = time()
        for key, val in pairs(self.db.profile.cooldowns) do
                if t >= val then
                        self.db.profile.cooldowns[key] = nil
                        self:StopCoolDown( key )
                else
                        self:StartCoolDown( key, val - t )
                end
        end
end

function oRAOCoolDown:StopAllCoolDowns()
        local t = time()
        for key, val in pairs(self.db.profile.cooldowns) do
                if t >= val then self.db.profile.cooldowns[key] = nil end
                self:StopCoolDown( key )
        end
end

function oRAOCoolDown:StartCoolDown( player, time )
        if not self.enabled or self.db.profile.hidden then return end
        local unit = roster:GetUnitObjectFromName( player )
        if not unit then return end
        self:RegisterCandyBarGroup("oRAOCoolDownGroup")
        self:SetCandyBarGroupPoint("oRAOCoolDownGroup", "TOP", self.text, "BOTTOM", 0, -5 )
        self:RegisterCandyBar( "oRAOCoolDown "..player, time, player, nil, unit.class)
        self:RegisterCandyBarWithGroup( "oRAOCoolDown "..player, "oRAOCoolDownGroup")
        self:SetCandyBarWidth( "oRAOCoolDown "..player, 150)
        self:SetCandyBarTexture( "oRAOCoolDown "..player, self.core.bartextures[self.core.db.profile.bartexture] )
        self:StartCandyBar( "oRAOCoolDown "..player, true)
end

function oRAOCoolDown:StopCoolDown( player )
        self:UnregisterCandyBar( "oRAOCoolDown "..player )
end


-------------------------
--  Command Handlers   --
-------------------------

function oRAOCoolDown:ToggleView()
        self.db.profile.hidden = not self.db.profile.hidden
        if self.cdframe and self.cdframe:IsVisible() then
                self:StopAllCoolDowns()
                self.cdframe:Hide()
        end
        if self.enabled and not self.db.profile.hidden then
                if not self.cdframe then self:SetupFrames() end
                self.cdframe:Show()
                self:StartAllCoolDowns()
        end
end