WoWInterface SVN SoopUI

[/] [trunk/] [3.0.0rc1/] [SoopUI/] [Core/] [Mirror.lua] - Rev 7

Compare with Previous | Blame | View Log

--      ___         ___         ___         ___      ___               
--     /  /\       /  /\       /  /\       /  /\    /__/\      ___     
--    /  /:/_     /  /::\     /  /::\     /  /::\   \  \:\    /  /\    
--   /  /:/ /\   /  /:/\:\   /  /:/\:\   /  /:/\:\   \  \:\  /  /:/    
--  /  /:/ /::\ /  /:/  \:\ /  /:/  \:\ /  /:/~/:___  \  \:\/__/::\    
-- /__/:/ /:/\:/__/:/ \__\:/__/:/ \__\:/__/:/ /:/__/\  \__\:\__\/\:\__ 
-- \  \:\/:/~/:\  \:\ /  /:\  \:\ /  /:\  \:\/:/\  \:\ /  /:/  \  \:\/\
--  \  \::/ /:/ \  \:\  /:/ \  \:\  /:/ \  \::/  \  \:\  /:/    \__\::/
--   \__\/ /:/   \  \:\/:/   \  \:\/:/   \  \:\   \  \:\/:/     /__/:/ 
--     /__/:/     \  \::/     \  \::/     \  \:\   \  \::/      \__\/  
--     \__\/       \__\/       \__\/       \__\/    \__\/              
--                       v * e * r * s * i * o * n * 3
----------------------------------------------------------------------------
-- Mirror
----------------------------------------------------------------------------


local _, settings = ...

local _DEFAULTS = {
        width = 220,
        height = 18,
        texture = Soop["media"].texture,

        position = {
                ["BREATH"] = 'TOP#UIParent#TOP#0#-96';
                ["EXHAUSTION"] = 'TOP#UIParent#TOP#0#-119';
                ["FEIGNDEATH"] = 'TOP#UIParent#TOP#0#-142';
        };

        colors = {
                EXHAUSTION = {1, .9, 0};
                BREATH = {0.31, 0.45, 0.63};
                DEATH = {1, .7, 0};
                FEIGNDEATH = {1, .7, 0};
        };
}

do
        settings = setmetatable(settings, {__index = _DEFAULTS})
        for k,v in next, settings do
                if(type(v) == 'table') then
                        settings[k] = setmetatable(settings[k], {__index = _DEFAULTS[k]})
                end
        end
end

local Spawn, PauseAll
do
        local barPool = {}

        local loadPosition = function(self)
                local pos = settings.position[self.type]
                local p1, frame, p2, x, y = strsplit("#", pos)

                return self:SetPoint(p1, frame, p2, x, y)
        end

        local OnUpdate = function(self, elapsed)
                if(self.paused) then return end

                self:SetValue(GetMirrorTimerProgress(self.type) / 1e3)
        end

        local Start = function(self, value, maxvalue, scale, paused, text)
                if(paused > 0) then
                        self.paused = 1
                elseif(self.paused) then
                        self.paused = nil
                end

                self.text:SetText(text)

                self:SetMinMaxValues(0, maxvalue / 1e3)
                self:SetValue(value / 1e3)

                if(not self:IsShown()) then self:Show() end
        end

        function Spawn(type)
                if(barPool[type]) then return barPool[type] end
                local frame = CreateFrame('StatusBar', nil, UIParent)

                frame:SetScript("OnUpdate", OnUpdate)

                local r, g, b = unpack(settings.colors[type])

                local bg = frame:CreateTexture(nil, 'BACKGROUND')
                bg:SetAllPoints(frame)
                bg:SetTexture(Soop["media"].blank)
                bg:SetVertexColor(r * .5, g * .5, b * .5)
                
                local border = CreateFrame("Frame", nil, frame)
                border:SetPoint("TOPLEFT", frame, -2, 2)
                border:SetPoint("BOTTOMRIGHT", frame, 2, -2)
                CreateShadow(border)
                border:SetFrameLevel(0)

                local text = frame:CreateFontString(nil, 'OVERLAY')
                text:SetFont(Soop["media"].font, Soop["media"].fontsize, "THINOUTLINE")
                text:SetShadowOffset(1, -1)
                text:SetShadowColor(0, 0, 0, 1)

                text:SetJustifyH'CENTER'
                text:SetTextColor(1, 1, 1)

                text:SetPoint('LEFT', frame)
                text:SetPoint('RIGHT', frame)
                text:SetPoint('TOP', frame, 0, 2)
                text:SetPoint('BOTTOM', frame)

                frame:SetSize(settings.width, settings.height)

                frame:SetStatusBarTexture(settings.texture)
                frame:SetStatusBarColor(r, g, b)

                frame.type = type
                frame.text = text

                frame.Start = Start
                frame.Stop = Stop

                loadPosition(frame)

                barPool[type] = frame
                return frame
        end

        function PauseAll(val)
                for _, bar in next, barPool do
                        bar.paused = val
                end
        end
end

local frame = CreateFrame'Frame'
frame:SetScript('OnEvent', function(self, event, ...)
        return self[event](self, ...)
end)

function frame:ADDON_LOADED(addon)

                UIParent:UnregisterEvent'MIRROR_TIMER_START'

                self:UnregisterEvent'ADDON_LOADED'
                self.ADDON_LOADED = nil
        
end
frame:RegisterEvent'ADDON_LOADED'

function frame:PLAYER_ENTERING_WORLD()
        for i=1, MIRRORTIMER_NUMTIMERS do
                local type, value, maxvalue, scale, paused, text = GetMirrorTimerInfo(i)
                if(type ~= 'UNKNOWN') then
                        Spawn(type):Start(value, maxvalue, scale, paused, text)
                end
        end
end
frame:RegisterEvent'PLAYER_ENTERING_WORLD'

function frame:MIRROR_TIMER_START(type, value, maxvalue, scale, paused, text)
        return Spawn(type):Start(value, maxvalue, scale, paused, text)
end
frame:RegisterEvent'MIRROR_TIMER_START'

function frame:MIRROR_TIMER_STOP(type)
        return Spawn(type):Hide()
end
frame:RegisterEvent'MIRROR_TIMER_STOP'

function frame:MIRROR_TIMER_PAUSE(duration)
        return PauseAll((duration > 0 and duration) or nil)
end
frame:RegisterEvent'MIRROR_TIMER_PAUSE'

Compare with Previous | Blame